package com.uas.eis.service.Impl; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import com.uas.eis.core.config.SpObserver; import com.uas.eis.core.support.TokenProperties; import com.uas.eis.dao.*; import com.uas.eis.service.CommonService; import com.uas.eis.service.ERPService; import com.uas.eis.utils.HttpUtil; import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.digest.DigestUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.*; import static com.uas.eis.utils.PSHttpUtils.doPost; @Service public class ERPServiceImpl implements ERPService { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private static Map tokenConfig = TokenProperties.getAllProperty(); @Autowired private BaseDao baseDao; @Autowired private CommonService commonService; private static final String API_URL = "https://ecsb.crcloud.com/ecsb/gw/sys/rf/"; private static final String APP_SUB_ID = "001900060002"; private static final String APP_TOKEN = "791ced0c04fb43eb898db171286092c6"; private static final String API_ID = "crmic.crmicpdbgbpm.PDBGBPM.AgentService"; private static final String API_VERSION = "1.0"; private static final String PARTNER_ID = "00190000"; private static final String SYS_ID = "00190006"; private static final String SIGN_KEY = "8c77ccf46f0f4fcfad8e0639138a735b"; // 签名密钥 private static final String USER_TOKEN = ""; private static final String sapno="0000111563"; @Override public Map sendProdIO(String master, int id,String action) throws Exception { Map modelMap = new HashMap(); SpObserver.putSp(master); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS"); sdf.setTimeZone(TimeZone.getTimeZone("GMT+8")); String time_Stamp= sdf.format(new Date()); // 1. 构造业务数据 JSONArray businessData = buildBusinessData(id,action); String reqData = com.alibaba.fastjson.JSONArray.toJSONString(businessData); System.out.println("reqData:"+reqData); // 2. 构造公共参数 TreeMap publicParams = buildPublicParams(time_Stamp); // 3. 生成签名 String sign = generateSign(publicParams, reqData); publicParams.put("Sign", sign); // 4. 生成SSDP参数(Base64) String ssdp = buildSsdp(publicParams); System.out.println("ssdp:"+ssdp); String url=API_URL+"?ssdp="+ssdp; HttpUtil.Response response = HttpUtil.doPost(url, reqData, false, null); String res=response.getResponseText(); System.out.println("res:"+res); //{"returnCode":0,"returnMsg":"SECCUSS"} String logSql="insert into dockProdIOLog(id_,date_,keyvalue,action_,time_Stamp,sign,ssdp,reqData,res) " + " values(DOCKPRODIOLOG_SEQ.nextval,sysdate,"+id+",'"+action+"','"+time_Stamp+"','"+sign+"','"+ssdp+"','"+reqData+"','"+res+"')"; baseDao.execute(logSql); return Collections.emptyMap(); } /** * 生成SSDP字符串并Base64编码 */ private static String buildSsdp(TreeMap publicParams) { StringBuilder sb = new StringBuilder(); for (Map.Entry entry : publicParams.entrySet()) { sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } // 去掉最后一个& if (sb.length() > 0) { sb.setLength(sb.length() - 1); } System.out.println("buildSsdp:"+sb.toString()); String ssdp=Base64.encodeBase64String(sb.toString().getBytes(StandardCharsets.UTF_8)); //System.out.println("ssdp:"+ssdp); return ssdp; } /** * 生成签名(MD5 32位大写) */ private String generateSign(Map publicParams, String reqData) { Map signMap = new TreeMap<>(publicParams); signMap.put("REQUEST_DATA", reqData); // 拼接公共参数 StringBuilder sb = new StringBuilder(); for (Map.Entry entry : signMap.entrySet()) { sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } // 拼接密钥 sb.append(SIGN_KEY); System.out.println("generateSign:"+sb.toString()); // MD5 32位大写 return DigestUtils.md5Hex(sb.toString()).toUpperCase(); } private TreeMap buildPublicParams(String time_Stamp) { TreeMap params = new TreeMap<>(); params.put("Api_ID", API_ID); params.put("Api_Version", API_VERSION); params.put("App_Sub_ID", APP_SUB_ID); params.put("App_Token", APP_TOKEN); params.put("Partner_ID", PARTNER_ID); params.put("Sys_ID", SYS_ID); params.put("Time_Stamp", time_Stamp); params.put("User_Token", ""); return params; } private JSONArray buildBusinessData(int id,String action) { JSONArray array = new JSONArray(); SqlRowList rs = baseDao.queryForRowSet("select * from prodio_dock_view where pi_id="+id); while (rs.next()) { JSONObject item = new JSONObject(); item.put("year", rs.getGeneralInt("year_")); item.put("month", rs.getGeneralInt("MONTH_")); item.put("serialno", rs.getGeneralString("serialno")); if("post".equals(action)){ item.put("shipmenttype", rs.getGeneralInt("shipmenttype")); // 1-销售出库 2-退货 }else{ if(rs.getGeneralInt("shipmenttype")==1){ item.put("shipmenttype", 2); // 1-销售出库 2-退货 }else{ item.put("shipmenttype", 1); // 1-销售出库 2-退货 } } item.put("sapno", sapno); item.put("terminalaccount", rs.getGeneralString("TERMINALACCOUNT")); item.put("productmodel",rs.getGeneralString("PRODUCTMODEL")); item.put("outorderno", rs.getGeneralString("OUTORDERNO")); item.put("saleprice", rs.getGeneralDouble("SALEPRICE")); item.put("qty", rs.getGeneralInt("QTY")); array.add(item); } return array; } }