package com.uas.eis.service.Impl; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.uas.eis.config.VwmsConfig; import com.uas.eis.dao.*; import com.uas.eis.entity.vwms.entity.*; import com.uas.eis.entity.vwms.req.*; import com.uas.eis.entity.vwms.resp.BaseVastResp; import com.uas.eis.service.DocCommonService; import com.uas.eis.service.ERPService; import com.uas.eis.utils.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * @author wuyx * @email wuyx@usoftchina.com * @date 2025-03-04 */ @Service public class ERPServiceImpl implements ERPService { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private BaseDao baseDao; @Autowired private VwmsConfig vwmsConfig; @Autowired private ObjectMapper objectMapper; // 注入Jackson的ObjectMapper @Autowired private DocCommonService docCommonService; @Override public Map sendProd(String master, String ids,String emCode,String caller) { Map retMap = new HashMap<>(); retMap.put("success",true); logger.info("sendProd-Begin:master {} ids {}",master,ids); // SpObserver.putSp(master);//没有用 // 执行查询 SqlRowList docMsg = baseDao.queryForRowSet(" select pr_id,pr_code,pr_ycxh,pr_ycxhin,pr_detail,pr_orispeccode,pr_brand,pr_unit,pr_zxbzs,nvl(pr_sendwmsflag,0) pr_sendwmsflag " + " from DATACENTER_P.product left join DATACENTER_P.productbrand on pb_name = pr_brand where pr_id in ("+ids+") and pb_sendwms = -1 "); if(!docMsg.hasNext()){ baseDao.execute("update DATACENTER_P.product set pr_sendwmsstatus='同步失败',pr_sendwmserr='没有需要同步的商品(品牌需设置对接MWS)。' where pr_id IN ("+ids+")"); retMap.put("success",false); retMap.put("message","没有需要同步的商品(品牌需设置对接MWS)。"); return retMap; } List> docMsgResultList = docMsg.getResultList(); // 按 pr_sendwmsflag 分组 Map>> groupedByFlag = docMsgResultList.stream() .collect(Collectors.groupingBy(map -> map.get("pr_sendwmsflag"))); StringBuffer errMsg = new StringBuffer(); List> errorList = new ArrayList<>(); // 处理分组后的数据 groupedByFlag.forEach((sendflag, list) -> { logger.info("sendProd Flag: {}, Count: {}", sendflag, list.size()); // 其他处理逻辑 String actionType = "update"; String actionTypeName = "更新"; if("0".equals(String.valueOf(sendflag))){ actionType = "add"; actionTypeName = "创建"; } Map sendProdRes = sendProdSigle(master,actionType,list); if(!sendProdRes.get("success").equals(true)){ if(errMsg.length()>0){ errMsg.append("
"); } errMsg.append("执行:"+actionTypeName+"操作失败:"+sendProdRes.get("message")); if(sendProdRes.get("errList")!=null){ try { errorList.addAll((List>) sendProdRes.get("errList")); }catch (Exception e){ e.printStackTrace(); } } } }); if(errMsg.length()>0){ retMap.put("success",false); retMap.put("message",errMsg.toString()); if(!CollectionUtil.isEmpty(errorList)){ retMap.put("errList",errorList); } return retMap; } logger.info("sendProd-End:master {} ids {}",master,ids); retMap.put("message","同步成功。"); return retMap; } private Map sendProdSigle(String master,String actionType,List> list){ List prodList = new ArrayList<>(); List docCodes = new ArrayList<>(); String prCodes = ""; StringBuffer errMsg = new StringBuffer(); String eMsg = ""; Map retMap = new HashMap<>(); if(CollectionUtil.isEmpty(list)){ retMap.put("success",false); retMap.put("message","没有需要同步的商品(品牌需设置对接MWS)。"); return retMap; } vwmsConfig.setEv(docCommonService.getMasterEv(master)); String outBizCode = "sendProd-"+System.currentTimeMillis(); for (Map map : list) { // 创建ProductReq对象 docCodes.add(map.get("pr_code")); // logger.info("sendProd-test: id {} code {}",map.get("pr_id"),map.get("pr_code")); // 创建ProductReq对象 String ycxh = StringUtil.nvl(map.get("pr_ycxh"),""); ycxh = (StringUtil.hasText(ycxh)?ycxh+";":"")+StringUtil.nvl(map.get("pr_ycxhin"),""); ProductReq productReq = new ProductReq.Builder() .itemId(map.get("pr_code").toString()) .itemCode(map.get("pr_code").toString()) .barCode(ycxh) .itemName(StringUtil.nvl(map.get("pr_detail")," ")) .goodsCode(StringUtil.nvl(map.get("pr_orispeccode")," ")) .brandName(StringUtil.nvl(map.get("pr_brand")," ")) .categoryName(StringUtil.nvl(map.get("pr_brand")," ")) .stockUnit(StringUtil.nvl(map.get("pr_unit")," ")) .ExtendProps(new ProductReq.ExtendProps() {{ setKey1(StringUtil.nvl(map.get("pr_zxbzs"),"0.0")); }}) .build(); prodList.add(productReq); } prCodes = "'"+docCodes.stream() .map(String::valueOf) .collect(Collectors.joining("','"))+"'"; // 创建BaseReq对象 BaseItemsReq prodBaseItemsReq = new BaseItemsReq(); prodBaseItemsReq.setActionType(actionType); prodBaseItemsReq.setWarehouseCode(vwmsConfig.getWarehouseCode()); prodBaseItemsReq.setOwnerCode(vwmsConfig.getOwnerCode()); prodBaseItemsReq.setOutBizCode(outBizCode); // 创建BaseVastItem对象 BaseItemsReq.BaseItems prodBaseItems = new BaseItemsReq().new BaseItems(); // 设置BaseVastItem的item属性 prodBaseItems.setItem(prodList); prodBaseItemsReq.setItems(prodBaseItems); // 创建RequestWrapper对象 BaseReq> prodBaseReq = new BaseReq(); prodBaseReq.setRequest(prodBaseItemsReq); try { // 将wrapper对象转换为JSON字符串 String json = objectMapper.writeValueAsString(prodBaseReq); // logger.info("Request JSON: {}", json); HttpUtil.Response response = HttpUtil.doPostToVWMS("openapi.items.synchronize", json,vwmsConfig); // logger.info("response code: {} text: {}", response.getStatusCode(),response.getResponseText()); if(!String.valueOf(response.getStatusCode()).startsWith("2")){ eMsg = StringUtil.nvl(response.getResponseText(),"未知"); retMap.put("success", false); retMap.put("message", "["+outBizCode+"]请求失败:"+response.getStatusCode()+":"+eMsg); // baseDao.execute("update DATACENTER_P.product set pr_sendwmsstatus='同步失败',pr_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') " + // " where pr_code IN ("+prCodes+")"); }else { retMap.put("success",true); List> errorList = new ArrayList<>(); // List sqls = new ArrayList<>(); BaseVastResp baseVastResp = new ObjectMapper().readValue(response.getResponseText(), BaseVastResp.class); BaseVastResp.Response baseVastRespResponse= baseVastResp.getResponse(); if(baseVastRespResponse!=null){ //默认成功 // baseDao.execute("update DATACENTER_P.product set pr_sendwmsstatus='同步成功' ,pr_sendwmserr=null where pr_code in ("+prCodes+")"); if("success".equals(baseVastRespResponse.getFlag())){ logger.info("response-{}-success code: {} message: {}",outBizCode, baseVastRespResponse.getCode(),baseVastRespResponse.getMessage()); }else { retMap.put("success",false); logger.info("response-{}-failure code: {} message: {}",outBizCode, baseVastRespResponse.getCode(),baseVastRespResponse.getMessage()); //不一定全部失败,此处只会返回失败提示 BaseVastResp.Items items = baseVastRespResponse.getItems(); if(items!=null&&!CollectionUtil.isEmpty(items.getItem())){ for (BaseVastResp.Item item : items.getItem()) { eMsg = item.getMessage(); if(!eMsg.equals("The goods don't exists, you can't update it.")){//提示异常但是实际会自动创建 可以认定为请求成功 logger.info("response-{}-failure-item code: {} message: {}",outBizCode, item.getItemCode(),item.getMessage()); // sqls.add("update DATACENTER_P.product set pr_sendwmsstatus='同步失败',pr_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') where pr_code ='"+item.getItemCode()+"'"); Map errorProd = new HashMap<>(); errorProd.put("code",item.getItemCode()); errorProd.put("eMsg",eMsg); errorList.add(errorProd); if(errMsg.length()>0){ errMsg.append("
"); } errMsg.append("物料编号:"+item.getItemCode()+",失败原因:"+eMsg); } } if(!CollectionUtil.isEmpty(errorList)){ // baseDao.execute(sqls); retMap.put("message", errMsg.toString()); retMap.put("errList",errorList); }else { logger.info("response-{}-failure-item all message: {}",outBizCode, "The goods don't exists, you can't update it."); retMap.put("success",true);//全部提示失败但实际创建成功 } }else { eMsg = StringUtil.nvl(baseVastRespResponse.getMessage(),"无"); // baseDao.execute("update DATACENTER_P.product set pr_sendwmsstatus='同步失败',pr_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') " + // " where pr_code IN ("+prCodes+")"); retMap.put("message", eMsg); } } // baseDao.execute("update DATACENTER_P.product set pr_sendwmsflag=-1 where pr_code in ("+prCodes+") AND NVL(pr_sendwmsflag,0) = 0 AND pr_sendwmsstatus='同步成功'"); }else { retMap.put("success", false); retMap.put("message", "转换失败:"+response.getStatusCode()+":"+response.getResponseText()); } } //TODO 考虑记录日志 return retMap; } catch (JsonProcessingException e) { e.printStackTrace(); logger.info("sendProd-Error:JSON转换失败 outBizCode {} codes {} ",outBizCode,prCodes); retMap.put("success", false); retMap.put("message", "JSON转换失败"); return retMap; } catch (Exception e) { logger.info("sendProd-Error:报错 outBizCode {} codes {} ",outBizCode,prCodes); e.printStackTrace(); eMsg = StringUtil.nvl(e.getMessage(),"无"); retMap.put("success", false); retMap.put("message", eMsg); return retMap; // baseDao.execute("update DATACENTER_P.product set pr_sendwmsstatus='同步失败' ,pr_sendwmserr='操作:"+actionType+":"+eMsg+"' where pr_code in ("+prCodes+")"); // throw new RuntimeException(e); } } @Override public Map sendVend(String master, String ids,String emCode,String caller) { Map retMap = new HashMap<>(); retMap.put("success",true); logger.info("sendVend-Begin:master {} ids {}",master,ids); // 执行查询 SqlRowList docMsg = baseDao.queryForRowSet(" select nvl(ve_sendwmsflag,0) sendwmsflag,ve_id,ve_code,ve_name,ve_shortname,ve_add1," + "vc_id,(case when nvl(vc_isvendor,0) = 0 then 0 else 1 end ) vc_isvendor,vc_name,vc_officeemail,vc_mobile " + "from "+master+".vendor left join "+master+".VendorContact on ve_id = vc_veid " + "where ve_id in ("+ids+") order by ve_id,vc_id"); if(!docMsg.hasNext()){ retMap.put("success",false); retMap.put("message","供应商资料不存在。"); return retMap; } List> docMsgResultList = docMsg.getResultList(); // 按 sendwmsflag 分组 Map>> groupedByFlag = docMsgResultList.stream() .collect(Collectors.groupingBy(map -> map.get("sendwmsflag"))); StringBuffer errMsg = new StringBuffer(); List> errorList = new ArrayList<>(); // 处理分组后的数据 groupedByFlag.forEach((sendflag, list) -> { logger.info("Flag: {}, Count: {}", sendflag, list.size()); // 其他处理逻辑 String actionType = "update"; String actionTypeName = "更新"; if("0".equals(String.valueOf(sendflag))){ actionType = "add"; actionTypeName = "创建"; } // // 按ve_id和vc_id升序排序 // list.sort(Comparator // .comparing(m -> (Long) m.get("ve_id")) // .thenComparing(m -> (Long) m.get("vc_id"))); // 拆分主从表 按ve_id分组 // 按ve_id分组 Map vendorMap = new HashMap<>(); for (Map map : list) { Long veId = ((BigDecimal) map.get("ve_id")).longValue(); // 获取或创建主表对象 Vendor main = vendorMap.computeIfAbsent(veId, k -> { Vendor v = new Vendor(); v.setVeId(veId); v.setVeCode((String) map.get("ve_code")); v.setVeName((String) map.get("ve_name")); v.setVeShortname((String) map.get("ve_shortname")); v.setVeAdd1((String) map.get("ve_add1")); return v; }); // 创建从表对象 if(map.get("vc_id") != null){ VendorContact contact = new VendorContact(); contact.setVcId(((BigDecimal) map.get("vc_id")).longValue()); contact.setVcIsvendor(((BigDecimal) map.get("vc_isvendor")).intValue()); contact.setVcName((String) map.get("vc_name")); contact.setVcOfficeemail((String) map.get("vc_officeemail")); contact.setVcMobile((String) map.get("vc_mobile")); // 将联系人添加到主表 main.getVendorContacts().add(contact); } } // 返回按ve_id分组的VendorMain列表 List vList = new ArrayList<>(vendorMap.values()); Map res = sendVendSigle(master,actionType,vList); if(!res.get("success").equals(true)){ if(errMsg.length()>0){ errMsg.append("
"); } errMsg.append("执行:"+actionTypeName+"操作失败:"+res.get("message")); if(res.get("errList")!=null){ try { errorList.addAll((List>) res.get("errList")); }catch (Exception e){ e.printStackTrace(); } } } }); if(errMsg.length()>0){ retMap.put("success",false); retMap.put("message",errMsg.toString()); if(!CollectionUtil.isEmpty(errorList)){ retMap.put("errList",errorList); } return retMap; } logger.info("sendVend-End:master {} ids {}",master,ids); retMap.put("message","同步成功。"); return retMap; } private Map sendVendSigle(String master,String actionType,List list){ List regList = new ArrayList<>(); List docCodes = new ArrayList<>(); String codes = ""; StringBuffer errMsg = new StringBuffer(); String eMsg = ""; Map retMap = new HashMap<>(); if(CollectionUtil.isEmpty(list)){ retMap.put("success",false); retMap.put("message","没有需要同步的商品(品牌需设置对接MWS)。"); return retMap; } vwmsConfig.setEv(docCommonService.getMasterEv(master)); String outBizCode = "sendVend-"+System.currentTimeMillis(); for (Vendor vend : list) { // 创建Req对象 docCodes.add(vend.getVeCode()); // logger.info("sendVend-test: id {} code {}",vend.getVeId(),vend.getVeCode()); // 创建ProductReq对象 PartnersReq req = PartnersReq.builder() .partnerCode(vend.getVeCode()) .name(vend.getVeName()) .cnShortName(vend.getVeShortname()) .enCompanyType("supplier") /* .customField1("自定义2") .customField2("自定义2") .customField3("自定义3") .customField4("自定义4") .customField5("自定义5") .remark("备注注")*/ .contactsInfos(PartnersReq.ContactsInfos.builder() .contactsInfo(Optional.ofNullable(vend.getVendorContacts()) .orElse(Collections.emptyList()) .stream() .map(contact -> PartnersReq.ContactsInfo.builder() .isDefault(contact.getVcIsvendor()) .name(contact.getVcName()) .email(contact.getVcOfficeemail()) .mobile(contact.getVcMobile()) .address(vend.getVeAdd1()) .build()) .collect(Collectors.toList())) .build()) .build(); regList.add(req); } codes = "'"+docCodes.stream() .map(String::valueOf) .collect(Collectors.joining("','"))+"'"; // 创建BaseReq对象 BaseItemsReq vendBaseItemsReq = new BaseItemsReq(); vendBaseItemsReq.setActionType(actionType); vendBaseItemsReq.setWarehouseCode(vwmsConfig.getWarehouseCode()); vendBaseItemsReq.setOwnerCode(vwmsConfig.getOwnerCode()); vendBaseItemsReq.setOutBizCode(outBizCode); // 创建BaseVastItem对象 BaseItemsReq.BaseItems vendBaseItems = new BaseItemsReq().new BaseItems(); // 设置BaseVastItem的item属性 vendBaseItems.setItem(regList); vendBaseItemsReq.setItems(vendBaseItems); // 创建BaseReq对象 BaseReq> vendBaseReq = new BaseReq(); vendBaseReq.setRequest(vendBaseItemsReq); try { // 将wrapper对象转换为JSON字符串 String json = objectMapper.writeValueAsString(vendBaseReq); // logger.info("Request JSON: {}", json); HttpUtil.Response response = HttpUtil.doPostToVWMS("openapi.partners.batchcreate", json,vwmsConfig); if(!String.valueOf(response.getStatusCode()).startsWith("2")){ eMsg = StringUtil.nvl(response.getResponseText(),"未知"); retMap.put("success", false); retMap.put("message", "["+outBizCode+"]请求失败:"+response.getStatusCode()+":"+eMsg); // baseDao.execute("update "+master+".vendor set ve_sendwmsstatus='同步失败',ve_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') " + // " where ve_code IN ("+codes+")"); }else { retMap.put("success",true); List> errorList = new ArrayList<>(); // List sqls = new ArrayList<>(); BaseVastResp baseVastResp = new ObjectMapper().readValue(response.getResponseText(), BaseVastResp.class); BaseVastResp.Response baseVastRespResponse= baseVastResp.getResponse(); if(baseVastRespResponse!=null){ //默认成功 // baseDao.execute("update "+master+".vendor set ve_sendwmsstatus='同步成功' ,ve_sendwmserr=null where ve_code in ("+codes+")"); if("success".equals(baseVastRespResponse.getFlag())){ logger.info("response-{}-success code: {} message: {}",outBizCode, baseVastRespResponse.getCode(),baseVastRespResponse.getMessage()); }else { retMap.put("success",false); logger.info("response-{}-failure code: {} message: {}",outBizCode, baseVastRespResponse.getCode(),baseVastRespResponse.getMessage()); //不一定全部失败,此处只会返回失败提示 BaseVastResp.Items items = baseVastRespResponse.getItems(); if(items!=null&&!CollectionUtil.isEmpty(items.getItem())){ for (BaseVastResp.Item item : items.getItem()) { eMsg = item.getMessage(); logger.info("response-{}-failure-item code: {} message: {}",outBizCode, item.getPartnerCode(),item.getMessage()); // sqls.add("update "+master+".vendor set ve_sendwmsstatus='同步失败',ve_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') where ve_code ='"+item.getItemCode()+"'"); Map errorVe = new HashMap<>(); errorVe.put("code",item.getPartnerCode()); errorVe.put("eMsg",eMsg); errorList.add(errorVe); if(errMsg.length()>0){ errMsg.append("
"); } errMsg.append("供应商编号:"+item.getPartnerCode()+",失败原因:"+eMsg); } if(!CollectionUtil.isEmpty(errorList)){ // baseDao.execute(sqls); retMap.put("message", errMsg.toString()); retMap.put("errList",errorList); }else { logger.info("response-{}-failure-item all ok",outBizCode); retMap.put("success",true);//全部提示失败但实际创建成功 } }else { eMsg = StringUtil.nvl(baseVastRespResponse.getMessage(),"无"); // baseDao.execute("update "+master+".vendor set ve_sendwmsstatus='同步失败',ve_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') " + // " where ve_code IN ("+codes+")"); retMap.put("message", eMsg); } } // baseDao.execute("update "+master+".vendor set ve_sendwmsflag=-1 where ve_code in ("+codes+") AND NVL(ve_sendwmsflag,0) = 0 AND ve_sendwmsstatus='同步成功'"); }else { retMap.put("success", false); retMap.put("message", "转换失败:"+response.getStatusCode()+":"+response.getResponseText()); } } //TODO 考虑记录日志 return retMap; } catch (JsonProcessingException e) { logger.info("sendVend-Error:JSON转换失败 outBizCode{} codes {} ",outBizCode,codes); e.printStackTrace(); retMap.put("success", false); retMap.put("message", "JSON转换失败"); return retMap; } catch (Exception e) { logger.info("sendVend-Error:报错 outBizCode {} codes {} ",outBizCode,codes); e.printStackTrace(); eMsg = StringUtil.nvl(e.getMessage(),"无"); retMap.put("success", false); retMap.put("message", eMsg); return retMap; // baseDao.execute("update "+master+".vendor set ve_sendwmsstatus='同步失败' ,ve_sendwmserr='操作:"+actionType+":"+eMsg+"' where ve_code in ("+codes+")"); // throw new RuntimeException(e); } } @Override public Map sendCust(String master, String ids, String emCode,String caller) { Map retMap = new HashMap<>(); retMap.put("success",true); logger.info("sendCust-Begin:master {} ids {}",master,ids); // 执行查询 SqlRowList docMsg = baseDao.queryForRowSet(" select nvl(cu_sendwmsflag,0) sendwmsflag,cu_id,cu_code,cu_name,cu_shortname," + "ca_id,(case when nvl(ca_remark,' ') = '是' then 1 else 0 end ) isDefault,ca_person,ca_phone,ca_address " + "from "+master+".customer left join "+master+".CustomerAddress on cu_id = ca_cuid " + "where cu_id in ("+ids+") order by cu_id,ca_detno,ca_id"); if(!docMsg.hasNext()){ retMap.put("success",false); retMap.put("message","客户资料不存在。"); return retMap; } List> docMsgResultList = docMsg.getResultList(); // 按 sendwmsflag 分组 Map>> groupedByFlag = docMsgResultList.stream() .collect(Collectors.groupingBy(map -> map.get("sendwmsflag"))); StringBuffer errMsg = new StringBuffer(); List> errorList = new ArrayList<>(); // 处理分组后的数据 groupedByFlag.forEach((sendflag, list) -> { logger.info("Flag: {}, Count: {}", sendflag, list.size()); // 其他处理逻辑 String actionType = "update"; String actionTypeName = "更新"; if("0".equals(String.valueOf(sendflag))){ actionType = "add"; actionTypeName = "创建"; } // 按cu_id和vc_id升序排序 // 按cu_id分组 Map custMap = new HashMap<>(); for (Map map : list) { Long cuId = ((BigDecimal) map.get("cu_id")).longValue(); // 获取或创建主表对象 Customer main = custMap.computeIfAbsent(cuId, k -> { Customer v = new Customer(); v.setCuId(cuId); v.setCuCode((String) map.get("cu_code")); v.setCuName((String) map.get("cu_name")); v.setCuShortname((String) map.get("cu_shortname")); return v; }); // 创建从表对象 if(map.get("ca_id") != null){ CustomerAddress customerAddress = new CustomerAddress(); customerAddress.setCaId(((BigDecimal) map.get("ca_id")).longValue()); customerAddress.setIsDefault(((BigDecimal) map.get("isDefault")).intValue()); customerAddress.setCaPhone((String) map.get("ca_person")); customerAddress.setCaPhone((String) map.get("ca_phone")); customerAddress.setCaAddress((String) map.get("ca_address")); // 将联系人添加到主表 main.getCustomerAddresses().add(customerAddress); } } // 返回按ve_id分组的VendorMain列表 List vList = new ArrayList<>(custMap.values()); Map res = sendCustSigle(master,actionType,vList); if(!res.get("success").equals(true)){ if(errMsg.length()>0){ errMsg.append("
"); } errMsg.append("执行:"+actionTypeName+"操作失败:"+res.get("message")); if(res.get("errList")!=null){ try { errorList.addAll((List>) res.get("errList")); }catch (Exception e){ e.printStackTrace(); } } } }); if(errMsg.length()>0){ retMap.put("success",false); retMap.put("message",errMsg.toString()); if(!CollectionUtil.isEmpty(errorList)){ retMap.put("errList",errorList); } return retMap; } logger.info("sendCust-End:master {} ids {}",master,ids); retMap.put("message","同步成功。"); return retMap; } private Map sendCustSigle(String master,String actionType,List list){ List custList = new ArrayList<>(); List docCodes = new ArrayList<>(); String codes = ""; StringBuffer errMsg = new StringBuffer(); String eMsg = ""; Map retMap = new HashMap<>(); if(CollectionUtil.isEmpty(list)){ retMap.put("success",false); retMap.put("message","没有需要同步的客户。"); return retMap; } vwmsConfig.setEv(docCommonService.getMasterEv(master)); String outBizCode = "sendCust-"+System.currentTimeMillis(); for (Customer cust : list) { // 创建Req对象 docCodes.add(cust.getCuCode()); // logger.info("sendCust-test: id {} code {}",cust.getCuId(),cust.getCuCode()); // 创建ProductReq对象 PartnersReq req = PartnersReq.builder() .partnerCode(cust.getCuCode()) .name(cust.getCuName()) .cnShortName(cust.getCuShortname()) .enCompanyType("customer") /* .customField1("自定义2") .customField2("自定义2") .customField3("自定义3") .customField4("自定义4") .customField5("自定义5") .remark("备注注")*/ .contactsInfos(PartnersReq.ContactsInfos.builder() .contactsInfo(Optional.ofNullable(cust.getCustomerAddresses()) .orElse(Collections.emptyList()) .stream() .map(customerAddress -> PartnersReq.ContactsInfo.builder() .isDefault(customerAddress.getIsDefault()) .name(customerAddress.getCaPerson()) .mobile(customerAddress.getCaPhone() ) .address(customerAddress.getCaAddress()) .build()) .collect(Collectors.toList())) .build()) .build(); custList.add(req); } codes = "'"+docCodes.stream() .map(String::valueOf) .collect(Collectors.joining("','"))+"'"; // 创建BaseReq对象 BaseItemsReq custBaseItemsReq = new BaseItemsReq(); custBaseItemsReq.setActionType(actionType); custBaseItemsReq.setWarehouseCode(vwmsConfig.getWarehouseCode()); custBaseItemsReq.setOwnerCode(vwmsConfig.getOwnerCode()); custBaseItemsReq.setOutBizCode(outBizCode); // 创建BaseVastItem对象 BaseItemsReq.BaseItems custBaseItems = new BaseItemsReq().new BaseItems(); // 设置BaseVastItem的item属性 custBaseItems.setItem(custList); custBaseItemsReq.setItems(custBaseItems); // 创建BaseReq对象 BaseReq> custBaseReq = new BaseReq(); custBaseReq.setRequest(custBaseItemsReq); try { // 将wrapper对象转换为JSON字符串 String json = objectMapper.writeValueAsString(custBaseReq); // logger.info("Request JSON: {}", json); HttpUtil.Response response = HttpUtil.doPostToVWMS("openapi.partners.batchcreate", json,vwmsConfig); if(!String.valueOf(response.getStatusCode()).startsWith("2")){ eMsg = StringUtil.nvl(response.getResponseText(),"未知"); retMap.put("success", false); retMap.put("message", "["+outBizCode+"]请求失败:"+response.getStatusCode()+":"+eMsg); // baseDao.execute("update "+master+".customer set cu_sendwmsstatus='同步失败',cu_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') " + // " where cu_code IN ("+codes+")"); }else { retMap.put("success",true); // List sqls = new ArrayList<>(); List> errorList = new ArrayList<>(); BaseVastResp baseVastResp = new ObjectMapper().readValue(response.getResponseText(), BaseVastResp.class); BaseVastResp.Response baseVastRespResponse= baseVastResp.getResponse(); if(baseVastRespResponse!=null){ //默认成功 // baseDao.execute("update "+master+".customer set cu_sendwmsstatus='同步成功' ,cu_sendwmserr=null where cu_code in ("+codes+")"); if("success".equals(baseVastRespResponse.getFlag())){ logger.info("response-{}-success code: {} message: {}",outBizCode, baseVastRespResponse.getCode(),baseVastRespResponse.getMessage()); }else { retMap.put("success",false); logger.info("response-{}-failure code: {} message: {}",outBizCode, baseVastRespResponse.getCode(),baseVastRespResponse.getMessage()); //不一定全部失败,此处只会返回失败提示 BaseVastResp.Items items = baseVastRespResponse.getItems(); if(items!=null&&!CollectionUtil.isEmpty(items.getItem())){ for (BaseVastResp.Item item : items.getItem()) { eMsg = item.getMessage(); // if(!eMsg.equals("The goods don't exists, you can't update it.")){ logger.info("response-{}-failure-item code: {} message: {}",outBizCode, item.getPartnerCode(),item.getMessage()); // sqls.add("update "+master+".customer set cu_sendwmsstatus='同步失败',cu_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') where cu_code ='"+item.getPartnerCode()+"'"); Map errorCu = new HashMap<>(); errorCu.put("code",item.getPartnerCode()); errorCu.put("eMsg",eMsg); errorList.add(errorCu); if(errMsg.length()>0){ errMsg.append("
"); } errMsg.append("客户编号:"+item.getPartnerCode()+",失败原因:"+eMsg); // } } if(!CollectionUtil.isEmpty(errorList)){ // baseDao.execute(sqls); retMap.put("message", errMsg.toString()); retMap.put("errList",errorList); }else { logger.info("response-{}-failure-item all message: {}",outBizCode, "The goods don't exists, you can't update it."); retMap.put("success",true); } }else { eMsg = StringUtil.nvl(baseVastRespResponse.getMessage(),"无"); // baseDao.execute("update "+master+".customer set cu_sendwmsstatus='同步失败',cu_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') " + // " where cu_code IN ("+codes+")"); retMap.put("message", eMsg); } } // baseDao.execute("update "+master+".customer set cu_sendwmsflag=-1 where cu_code in ("+codes+") AND NVL(cu_sendwmsflag,0) = 0 AND cu_sendwmsstatus='同步成功'"); }else { retMap.put("success", false); retMap.put("message", "转换失败:"+response.getStatusCode()+":"+response.getResponseText()); } } return retMap; } catch (JsonProcessingException e) { e.printStackTrace(); logger.info("sendCust-Error:JSON转换失败 outBizCode {} codes {} ",outBizCode,codes); retMap.put("success", false); retMap.put("message", "JSON转换失败"); return retMap; } catch (Exception e) { logger.info("sendCust-Error:报错 outBizCode {} codes {} ",outBizCode,codes); e.printStackTrace(); eMsg = StringUtil.nvl(e.getMessage(),"无"); // baseDao.execute("update "+master+".customer set cu_sendwmsstatus='同步失败' ,cu_sendwmserr='操作:"+actionType+":"+eMsg+"' where cu_code in ("+codes+")"); retMap.put("success", false); retMap.put("message",eMsg); return retMap; } } @Override public Map sendIO(String master, String id, String emCode, String caller) { Map retMap = new HashMap<>(); retMap.put("success",true); logger.info("sendIO-Begin:master {} id {}",master,id); // 执行查询 if(!baseDao.checkIf(master+".prodiodetail left join DATACENTER_P.product on pr_code = pd_prodcode left join DATACENTER_P.productbrand on pb_name = pr_brand " ,"pd_piid = "+id+" and pb_sendwms = -1" )){ logger.info("sendIO-End:master {} id {} res {}",master,id,"没有需要对接的明细。"); retMap.put("success",false); retMap.put("message","没有需要对接的明细。"); return retMap; } ProdInout prodInOut = docCommonService.getIO(master,id,false); if(CollectionUtil.isEmpty(prodInOut.getDetails())){ retMap.put("success",false); retMap.put("message","没有需要同步的明细。"); return retMap; } if(prodInOut.getPiWmsstatus().equals("已确认")){ retMap.put("success",false); retMap.put("message","单据已确认采集,不允许重复同步。"); return retMap; } if (!StringUtil.hasText(prodInOut.getPiWmsInType()) || (StringUtil.hasText(prodInOut.getPiWmsInType()) && !prodInOut.getPiWmsInType().equals("in") && !prodInOut.getPiWmsInType().equals("out") && !prodInOut.getPiWmsInType().equals("transfer") )) { retMap.put("success",false); retMap.put("message","WMS单据类型为空或异常,不允许同步。"); return retMap; } vwmsConfig.setEv(docCommonService.getMasterEv(master)); //构建请求主体 String masterName = prodInOut.getCurrentMasterName(); Long piId = prodInOut.getPiId(); String errMsg = null; if("in".equals(prodInOut.getPiWmsInType())){ errMsg = docCommonService.sendInToWms(prodInOut,masterName); } if("out".equals(prodInOut.getPiWmsInType())){ errMsg = docCommonService.sendOutToWms(prodInOut,masterName); } if("transfer".equals(prodInOut.getPiWmsInType())){ errMsg = docCommonService.sendOMoveToWms(prodInOut,masterName); } if(errMsg!=null){ if(errMsg.startsWith("OrderId:")){ retMap.put("OrderId",errMsg.replaceAll("OrderId:","")); logger.info("sendIO-End-Sucess master {} piid {} OrderId {}",master,piId,errMsg.replaceAll("OrderId:","")); //更新 WMSORDERID baseDao.execute("update "+master+".prodiowms set WMSORDERID = '"+errMsg.replaceAll("OrderId:","")+"' where PIID = "+piId); }else { errMsg = errMsg.replaceAll("'","''"); logger.info("sendIO-End-failure master {} piid {} errorTip {}",master,piId,errMsg); retMap.put("success",false); retMap.put("message",errMsg); } }else { logger.info("sendIO-End-success master {} piid {} ",master,piId); } return retMap; } @Override public Map cancelIO(String master, String id, String emCode, String caller,String cancelReason) { Map retMap = new HashMap<>(); String docOp = "取消"; retMap.put("success",true); String eMsg = null; logger.info("sendIO-cancel-Begin:master {} id {} cancelReason {}",master,id,cancelReason); // 执行查询 if(!baseDao.checkIf(master+".prodinout","pi_id = "+id+" and nvl(pi_sendwmsflag,0) = -1")){ logger.info("sendIO-cancel-End:master {} id {} res {}",master,id,"单据不存在或尚未同步到WMS。"); retMap.put("success",false); retMap.put("message","单据不存在或尚未同步到WMS。"); return retMap; } ProdInout prodInOut = docCommonService.getIO(master,id,true); if(prodInOut.getPiWmsstatus().equals("已确认")){ retMap.put("success",false); retMap.put("message","单据已确认采集,不允许取消。"); return retMap; } vwmsConfig.setEv(docCommonService.getMasterEv(master)); Long piId = prodInOut.getPiId(); BaseReq> req = new BaseReq(); OrderVastRequest cancelReq = new OrderVastRequest(); cancelReq.setOutBizCode("sendIO-cancel-"+prodInOut.getPiOrderType()+"-"+System.currentTimeMillis());// 外部业务代码 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理 OrderVastRequest.OrdersRequest orders = getOrderCancelOrdersRequest(cancelReason, prodInOut); cancelReq.setOrders(orders); req.setRequest(cancelReq); try { //转换为JSON字符串 String json = objectMapper.writeValueAsString(req); logger.info("sendIO-cancel-Request JSON: {}", json); HttpUtil.Response response = HttpUtil.doPostToVWMS("openapi.order.batchcancel.v2", json,vwmsConfig); if(!String.valueOf(response.getStatusCode()).startsWith("2")){ eMsg = "("+response.getStatusCode()+")"+StringUtil.nvl(response.getResponseText(),"无").replaceAll("'","''"); }else { BaseVastResp baseVastResp = new ObjectMapper().readValue(response.getResponseText(), BaseVastResp.class); BaseVastResp.Response baseVastRespResponse = baseVastResp.getResponse(); if(baseVastRespResponse!=null){ if("success".equals(baseVastRespResponse.getFlag())){ logger.info("sendIO-cancel-response-success code: {} message: {}", baseVastRespResponse.getCode(),baseVastRespResponse.getMessage()); // baseDao.execute("update "+master+".prodinout set pi_sendwmsstatus='取消成功' ,pi_sendwmserr=null,pi_sendwmsflag=0,PI_WMSORDERCODE=null where pi_id = "+piId); //TODO 删除表:WMS_IO_RECORD_SEQ }else { // logger.info("sendIO-cancel-response-failure {}", response.getResponseText()); eMsg = "(" + baseVastRespResponse.getCode() + ")"; String errorMessage = baseVastRespResponse.getMessage(); if (baseVastRespResponse.getOrders() != null && !CollectionUtil.isEmpty(baseVastRespResponse.getOrders().getOrder())) { errorMessage = StringUtil.nvl(baseVastRespResponse.getOrders().getOrder().get(0).getMessage(),baseVastRespResponse.getMessage()); } eMsg += StringUtil.nvl(errorMessage, "未知").replaceAll("'", "''"); } }else { eMsg = "RespJSON转换失败:"+response.getStatusCode()+":"+response.getResponseText(); } } } catch (JsonProcessingException e) { eMsg = "JSON转换失败"; e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); eMsg = StringUtil.nvl(e.getMessage(),"无").replaceAll("'","''"); } if(eMsg!=null){ eMsg = eMsg.replaceAll("'","''"); logger.info("sendIO-cancel-End-failure master {} piid {} errorTip {}",master,piId,eMsg); // baseDao.execute("update "+master+".prodinout set pi_sendwmsstatus='取消失败',pi_sendwmserr=UNISTR('"+eMsg+"') where pi_id = "+piId); retMap.put("success",false); retMap.put("message",eMsg); }else { logger.info("sendIO-cancel-End-success master {} piid {} ",master,piId); } return retMap; } @Override public Map sendStockData(String master, String emCode) { Map resMap = new HashMap<>(); resMap.put("success",true); logger.info("sendStockData-Begin master {} emCode {} ",master,emCode); List stockDataList = baseDao.getJdbcTemplate().query("SELECT * FROM "+master+".SCM_KCZLB_WMS_VIEW ", new BeanPropertyRowMapper<>(StockData.class)); String dataNo = ""; if(!CollectionUtil.isEmpty(stockDataList)){ vwmsConfig.setEv(docCommonService.getMasterEv(master)); // 每1000条分批处理 int batchSize = 1000; int totalSize = stockDataList.size(); int batchCount = (totalSize + batchSize - 1) / batchSize; String outBizCode = "erpStockData-"+ DateUtil.currentDateString(Constant.YMD_HMS); for (int i = 0; i < batchCount; i++) { int fromIndex = i * batchSize; int toIndex = Math.min((i + 1) * batchSize, totalSize); if(!StringUtil.hasText(dataNo)){ dataNo = outBizCode; } // 获取当前批次数据 InventorySyncReq inventorySyncReq = new InventorySyncReq(); inventorySyncReq.setDataNo(dataNo); inventorySyncReq.setWarehouseCode(vwmsConfig.getWarehouseCode()); inventorySyncReq.setOwnerCode(vwmsConfig.getOwnerCode()); inventorySyncReq.setOutBizCode(outBizCode); InventorySyncReq.StockDataItems items = new InventorySyncReq.StockDataItems(); items.setItem(stockDataList.subList(fromIndex, toIndex)); inventorySyncReq.setItems(items); BaseReq req = new BaseReq(); req.setRequest(inventorySyncReq); try { String json = objectMapper.writeValueAsString(req); // 处理当前批次数据 String errTip = docCommonService.sendToWms(json, "openapi.inventory.foreign.synchronize"); if (errTip!=null) { resMap.put("success", false); resMap.put("message", "【dataNo:"+dataNo+"】同步第" + (fromIndex) + "~"+toIndex+"行数据失败:" + errTip); break; } } catch (JsonProcessingException e) { e.printStackTrace(); resMap.put("success", false); resMap.put("message", "【dataNo:"+dataNo+"】同步第" + (fromIndex) + "~"+toIndex+"行数据失败:JSON转换失败" ); break; } } resMap.put("message", "【dataNo:"+dataNo+"】库存数据同步成功,共处理" + totalSize + "条数据"); } if("JOB".equals(emCode)){ //记录日志 baseDao.execute("Insert into " + master + ".MESSAGELOG (ML_ID,ML_DATE,ML_MAN,ML_CONTENT,ML_RESULT,ML_SEARCH,CODE) " + "values (" + master + ".MESSAGELOG_seq.nextval,sysdate,'定时任务','同步库存至WMS(自动)','" +resMap.get("message") +"','InventoryToWms|emCode=" + emCode + "','" + emCode + "')"); } logger.info("sendStockData-End-success master {} emCode {} dataNo {}",master,emCode,dataNo); return resMap; } private OrderVastRequest.OrdersRequest getOrderCancelOrdersRequest(String cancelReason, ProdInout prodInOut) { OrderVastRequest.OrdersRequest orders = new OrderVastRequest.OrdersRequest(); OrderCancel cancelOrder = new OrderCancel(); cancelOrder.setWarehouseCode(vwmsConfig.getWarehouseCode());// 仓库编码 cancelOrder.setOwnerCode(vwmsConfig.getOwnerCode());// 货主编码 cancelOrder.setOrderCode(prodInOut.getPiInoutno());// 入库单号 cancelOrder.setCancelReason(cancelReason); cancelOrder.setCancelType(prodInOut.getPiWmsInType()); orders.setOrder(Arrays.asList(cancelOrder)); return orders; } }