| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932 |
- 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<String, Object> sendProd(String master, String ids,String emCode,String caller) {
- Map<String,Object> 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<Map<String, Object>> docMsgResultList = docMsg.getResultList();
- // 按 pr_sendwmsflag 分组
- Map<Object, List<Map<String, Object>>> groupedByFlag = docMsgResultList.stream()
- .collect(Collectors.groupingBy(map -> map.get("pr_sendwmsflag")));
- StringBuffer errMsg = new StringBuffer();
- List<Map<String,Object>> 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<String, Object> sendProdRes = sendProdSigle(master,actionType,list);
- if(!sendProdRes.get("success").equals(true)){
- if(errMsg.length()>0){
- errMsg.append("</br>");
- }
- errMsg.append("执行:"+actionTypeName+"操作失败:"+sendProdRes.get("message"));
- if(sendProdRes.get("errList")!=null){
- try {
- errorList.addAll((List<Map<String,Object>>) 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<String, Object> sendProdSigle(String master,String actionType,List<Map<String, Object>> list){
- List<ProductReq> prodList = new ArrayList<>();
- List<Object> docCodes = new ArrayList<>();
- String prCodes = "";
- StringBuffer errMsg = new StringBuffer();
- String eMsg = "";
- Map<String, Object> 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<String, Object> 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<ProductReq> prodBaseItemsReq = new BaseItemsReq();
- prodBaseItemsReq.setActionType(actionType);
- prodBaseItemsReq.setWarehouseCode(vwmsConfig.getWarehouseCode());
- prodBaseItemsReq.setOwnerCode(vwmsConfig.getOwnerCode());
- prodBaseItemsReq.setOutBizCode(outBizCode);
- // 创建BaseVastItem对象
- BaseItemsReq.BaseItems prodBaseItems = new BaseItemsReq<ProductReq>().new BaseItems<ProductReq>();
- // 设置BaseVastItem的item属性
- prodBaseItems.setItem(prodList);
- prodBaseItemsReq.setItems(prodBaseItems);
- // 创建RequestWrapper对象
- BaseReq<BaseItemsReq<ProductReq>> 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<Map<String,Object>> errorList = new ArrayList<>();
- // List<String> 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<String,Object> errorProd = new HashMap<>();
- errorProd.put("code",item.getItemCode());
- errorProd.put("eMsg",eMsg);
- errorList.add(errorProd);
- if(errMsg.length()>0){
- errMsg.append("</br>");
- }
- 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<String, Object> sendVend(String master, String ids,String emCode,String caller) {
- Map<String,Object> 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<Map<String, Object>> docMsgResultList = docMsg.getResultList();
- // 按 sendwmsflag 分组
- Map<Object, List<Map<String, Object>>> groupedByFlag = docMsgResultList.stream()
- .collect(Collectors.groupingBy(map -> map.get("sendwmsflag")));
- StringBuffer errMsg = new StringBuffer();
- List<Map<String,Object>> 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<Long, Vendor> vendorMap = new HashMap<>();
- for (Map<String, Object> 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<Vendor> vList = new ArrayList<>(vendorMap.values());
- Map<String, Object> res = sendVendSigle(master,actionType,vList);
- if(!res.get("success").equals(true)){
- if(errMsg.length()>0){
- errMsg.append("</br>");
- }
- errMsg.append("执行:"+actionTypeName+"操作失败:"+res.get("message"));
- if(res.get("errList")!=null){
- try {
- errorList.addAll((List<Map<String,Object>>) 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<String, Object> sendVendSigle(String master,String actionType,List<Vendor> list){
- List<PartnersReq> regList = new ArrayList<>();
- List<Object> docCodes = new ArrayList<>();
- String codes = "";
- StringBuffer errMsg = new StringBuffer();
- String eMsg = "";
- Map<String, Object> 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<PartnersReq> vendBaseItemsReq = new BaseItemsReq();
- vendBaseItemsReq.setActionType(actionType);
- vendBaseItemsReq.setWarehouseCode(vwmsConfig.getWarehouseCode());
- vendBaseItemsReq.setOwnerCode(vwmsConfig.getOwnerCode());
- vendBaseItemsReq.setOutBizCode(outBizCode);
- // 创建BaseVastItem对象
- BaseItemsReq.BaseItems vendBaseItems = new BaseItemsReq<PartnersReq>().new BaseItems<PartnersReq>();
- // 设置BaseVastItem的item属性
- vendBaseItems.setItem(regList);
- vendBaseItemsReq.setItems(vendBaseItems);
- // 创建BaseReq对象
- BaseReq<BaseItemsReq<PartnersReq>> 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<Map<String,Object>> errorList = new ArrayList<>();
- // List<String> 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<String,Object> errorVe = new HashMap<>();
- errorVe.put("code",item.getPartnerCode());
- errorVe.put("eMsg",eMsg);
- errorList.add(errorVe);
- if(errMsg.length()>0){
- errMsg.append("</br>");
- }
- 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<String, Object> sendCust(String master, String ids, String emCode,String caller) {
- Map<String,Object> 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<Map<String, Object>> docMsgResultList = docMsg.getResultList();
- // 按 sendwmsflag 分组
- Map<Object, List<Map<String, Object>>> groupedByFlag = docMsgResultList.stream()
- .collect(Collectors.groupingBy(map -> map.get("sendwmsflag")));
- StringBuffer errMsg = new StringBuffer();
- List<Map<String,Object>> 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<Long, Customer> custMap = new HashMap<>();
- for (Map<String, Object> 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<Customer> vList = new ArrayList<>(custMap.values());
- Map<String, Object> res = sendCustSigle(master,actionType,vList);
- if(!res.get("success").equals(true)){
- if(errMsg.length()>0){
- errMsg.append("</br>");
- }
- errMsg.append("执行:"+actionTypeName+"操作失败:"+res.get("message"));
- if(res.get("errList")!=null){
- try {
- errorList.addAll((List<Map<String,Object>>) 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<String, Object> sendCustSigle(String master,String actionType,List<Customer> list){
- List<PartnersReq> custList = new ArrayList<>();
- List<Object> docCodes = new ArrayList<>();
- String codes = "";
- StringBuffer errMsg = new StringBuffer();
- String eMsg = "";
- Map<String, Object> 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<PartnersReq> custBaseItemsReq = new BaseItemsReq();
- custBaseItemsReq.setActionType(actionType);
- custBaseItemsReq.setWarehouseCode(vwmsConfig.getWarehouseCode());
- custBaseItemsReq.setOwnerCode(vwmsConfig.getOwnerCode());
- custBaseItemsReq.setOutBizCode(outBizCode);
- // 创建BaseVastItem对象
- BaseItemsReq.BaseItems custBaseItems = new BaseItemsReq<PartnersReq>().new BaseItems<PartnersReq>();
- // 设置BaseVastItem的item属性
- custBaseItems.setItem(custList);
- custBaseItemsReq.setItems(custBaseItems);
- // 创建BaseReq对象
- BaseReq<BaseItemsReq<PartnersReq>> 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<String> sqls = new ArrayList<>();
- List<Map<String,Object>> 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<String,Object> errorCu = new HashMap<>();
- errorCu.put("code",item.getPartnerCode());
- errorCu.put("eMsg",eMsg);
- errorList.add(errorCu);
- if(errMsg.length()>0){
- errMsg.append("</br>");
- }
- 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<String, Object> sendIO(String master, String id, String emCode, String caller) {
- Map<String,Object> 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<String, Object> cancelIO(String master, String id, String emCode, String caller,String cancelReason) {
- Map<String,Object> 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<OrderVastRequest<OrderCancel>> req = new BaseReq();
- OrderVastRequest<OrderCancel> cancelReq = new OrderVastRequest();
- cancelReq.setOutBizCode("sendIO-cancel-"+prodInOut.getPiOrderType()+"-"+System.currentTimeMillis());// 外部业务代码 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理
- OrderVastRequest.OrdersRequest<OrderCancel> 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<String, Object> sendStockData(String master, String emCode) {
- Map<String, Object> resMap = new HashMap<>();
- resMap.put("success",true);
- logger.info("sendStockData-Begin master {} emCode {} ",master,emCode);
- List<StockData> 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<InventorySyncReq> 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<OrderCancel> getOrderCancelOrdersRequest(String cancelReason, ProdInout prodInOut) {
- OrderVastRequest.OrdersRequest<OrderCancel> orders = new OrderVastRequest.OrdersRequest<OrderCancel>();
- 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;
- }
- }
|