ERPServiceImpl.java 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932
  1. package com.uas.eis.service.Impl;
  2. import com.fasterxml.jackson.core.JsonProcessingException;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.uas.eis.config.VwmsConfig;
  5. import com.uas.eis.dao.*;
  6. import com.uas.eis.entity.vwms.entity.*;
  7. import com.uas.eis.entity.vwms.req.*;
  8. import com.uas.eis.entity.vwms.resp.BaseVastResp;
  9. import com.uas.eis.service.DocCommonService;
  10. import com.uas.eis.service.ERPService;
  11. import com.uas.eis.utils.*;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.jdbc.core.BeanPropertyRowMapper;
  16. import org.springframework.stereotype.Service;
  17. import java.math.BigDecimal;
  18. import java.util.*;
  19. import java.util.stream.Collectors;
  20. /**
  21. * @author wuyx
  22. * @email wuyx@usoftchina.com
  23. * @date 2025-03-04
  24. */
  25. @Service
  26. public class ERPServiceImpl implements ERPService {
  27. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  28. @Autowired
  29. private BaseDao baseDao;
  30. @Autowired
  31. private VwmsConfig vwmsConfig;
  32. @Autowired
  33. private ObjectMapper objectMapper; // 注入Jackson的ObjectMapper
  34. @Autowired
  35. private DocCommonService docCommonService;
  36. @Override
  37. public Map<String, Object> sendProd(String master, String ids,String emCode,String caller) {
  38. Map<String,Object> retMap = new HashMap<>();
  39. retMap.put("success",true);
  40. logger.info("sendProd-Begin:master {} ids {}",master,ids);
  41. // SpObserver.putSp(master);//没有用
  42. // 执行查询
  43. 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 " +
  44. " from DATACENTER_P.product left join DATACENTER_P.productbrand on pb_name = pr_brand where pr_id in ("+ids+") and pb_sendwms = -1 ");
  45. if(!docMsg.hasNext()){
  46. baseDao.execute("update DATACENTER_P.product set pr_sendwmsstatus='同步失败',pr_sendwmserr='没有需要同步的商品(品牌需设置对接MWS)。' where pr_id IN ("+ids+")");
  47. retMap.put("success",false);
  48. retMap.put("message","没有需要同步的商品(品牌需设置对接MWS)。");
  49. return retMap;
  50. }
  51. List<Map<String, Object>> docMsgResultList = docMsg.getResultList();
  52. // 按 pr_sendwmsflag 分组
  53. Map<Object, List<Map<String, Object>>> groupedByFlag = docMsgResultList.stream()
  54. .collect(Collectors.groupingBy(map -> map.get("pr_sendwmsflag")));
  55. StringBuffer errMsg = new StringBuffer();
  56. List<Map<String,Object>> errorList = new ArrayList<>();
  57. // 处理分组后的数据
  58. groupedByFlag.forEach((sendflag, list) -> {
  59. logger.info("sendProd Flag: {}, Count: {}", sendflag, list.size());
  60. // 其他处理逻辑
  61. String actionType = "update";
  62. String actionTypeName = "更新";
  63. if("0".equals(String.valueOf(sendflag))){
  64. actionType = "add";
  65. actionTypeName = "创建";
  66. }
  67. Map<String, Object> sendProdRes = sendProdSigle(master,actionType,list);
  68. if(!sendProdRes.get("success").equals(true)){
  69. if(errMsg.length()>0){
  70. errMsg.append("</br>");
  71. }
  72. errMsg.append("执行:"+actionTypeName+"操作失败:"+sendProdRes.get("message"));
  73. if(sendProdRes.get("errList")!=null){
  74. try {
  75. errorList.addAll((List<Map<String,Object>>) sendProdRes.get("errList"));
  76. }catch (Exception e){
  77. e.printStackTrace();
  78. }
  79. }
  80. }
  81. });
  82. if(errMsg.length()>0){
  83. retMap.put("success",false);
  84. retMap.put("message",errMsg.toString());
  85. if(!CollectionUtil.isEmpty(errorList)){
  86. retMap.put("errList",errorList);
  87. }
  88. return retMap;
  89. }
  90. logger.info("sendProd-End:master {} ids {}",master,ids);
  91. retMap.put("message","同步成功。");
  92. return retMap;
  93. }
  94. private Map<String, Object> sendProdSigle(String master,String actionType,List<Map<String, Object>> list){
  95. List<ProductReq> prodList = new ArrayList<>();
  96. List<Object> docCodes = new ArrayList<>();
  97. String prCodes = "";
  98. StringBuffer errMsg = new StringBuffer();
  99. String eMsg = "";
  100. Map<String, Object> retMap = new HashMap<>();
  101. if(CollectionUtil.isEmpty(list)){
  102. retMap.put("success",false);
  103. retMap.put("message","没有需要同步的商品(品牌需设置对接MWS)。");
  104. return retMap;
  105. }
  106. vwmsConfig.setEv(docCommonService.getMasterEv(master));
  107. String outBizCode = "sendProd-"+System.currentTimeMillis();
  108. for (Map<String, Object> map : list) {
  109. // 创建ProductReq对象
  110. docCodes.add(map.get("pr_code"));
  111. // logger.info("sendProd-test: id {} code {}",map.get("pr_id"),map.get("pr_code"));
  112. // 创建ProductReq对象
  113. String ycxh = StringUtil.nvl(map.get("pr_ycxh"),"");
  114. ycxh = (StringUtil.hasText(ycxh)?ycxh+";":"")+StringUtil.nvl(map.get("pr_ycxhin"),"");
  115. ProductReq productReq = new ProductReq.Builder()
  116. .itemId(map.get("pr_code").toString())
  117. .itemCode(map.get("pr_code").toString())
  118. .barCode(ycxh)
  119. .itemName(StringUtil.nvl(map.get("pr_detail")," "))
  120. .goodsCode(StringUtil.nvl(map.get("pr_orispeccode")," "))
  121. .brandName(StringUtil.nvl(map.get("pr_brand")," "))
  122. .categoryName(StringUtil.nvl(map.get("pr_brand")," "))
  123. .stockUnit(StringUtil.nvl(map.get("pr_unit")," "))
  124. .ExtendProps(new ProductReq.ExtendProps() {{
  125. setKey1(StringUtil.nvl(map.get("pr_zxbzs"),"0.0"));
  126. }})
  127. .build();
  128. prodList.add(productReq);
  129. }
  130. prCodes = "'"+docCodes.stream()
  131. .map(String::valueOf)
  132. .collect(Collectors.joining("','"))+"'";
  133. // 创建BaseReq对象
  134. BaseItemsReq<ProductReq> prodBaseItemsReq = new BaseItemsReq();
  135. prodBaseItemsReq.setActionType(actionType);
  136. prodBaseItemsReq.setWarehouseCode(vwmsConfig.getWarehouseCode());
  137. prodBaseItemsReq.setOwnerCode(vwmsConfig.getOwnerCode());
  138. prodBaseItemsReq.setOutBizCode(outBizCode);
  139. // 创建BaseVastItem对象
  140. BaseItemsReq.BaseItems prodBaseItems = new BaseItemsReq<ProductReq>().new BaseItems<ProductReq>();
  141. // 设置BaseVastItem的item属性
  142. prodBaseItems.setItem(prodList);
  143. prodBaseItemsReq.setItems(prodBaseItems);
  144. // 创建RequestWrapper对象
  145. BaseReq<BaseItemsReq<ProductReq>> prodBaseReq = new BaseReq();
  146. prodBaseReq.setRequest(prodBaseItemsReq);
  147. try {
  148. // 将wrapper对象转换为JSON字符串
  149. String json = objectMapper.writeValueAsString(prodBaseReq);
  150. // logger.info("Request JSON: {}", json);
  151. HttpUtil.Response response = HttpUtil.doPostToVWMS("openapi.items.synchronize", json,vwmsConfig);
  152. // logger.info("response code: {} text: {}", response.getStatusCode(),response.getResponseText());
  153. if(!String.valueOf(response.getStatusCode()).startsWith("2")){
  154. eMsg = StringUtil.nvl(response.getResponseText(),"未知");
  155. retMap.put("success", false);
  156. retMap.put("message", "["+outBizCode+"]请求失败:"+response.getStatusCode()+":"+eMsg);
  157. // baseDao.execute("update DATACENTER_P.product set pr_sendwmsstatus='同步失败',pr_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') " +
  158. // " where pr_code IN ("+prCodes+")");
  159. }else {
  160. retMap.put("success",true);
  161. List<Map<String,Object>> errorList = new ArrayList<>();
  162. // List<String> sqls = new ArrayList<>();
  163. BaseVastResp baseVastResp = new ObjectMapper().readValue(response.getResponseText(), BaseVastResp.class);
  164. BaseVastResp.Response baseVastRespResponse= baseVastResp.getResponse();
  165. if(baseVastRespResponse!=null){
  166. //默认成功
  167. // baseDao.execute("update DATACENTER_P.product set pr_sendwmsstatus='同步成功' ,pr_sendwmserr=null where pr_code in ("+prCodes+")");
  168. if("success".equals(baseVastRespResponse.getFlag())){
  169. logger.info("response-{}-success code: {} message: {}",outBizCode, baseVastRespResponse.getCode(),baseVastRespResponse.getMessage());
  170. }else {
  171. retMap.put("success",false);
  172. logger.info("response-{}-failure code: {} message: {}",outBizCode, baseVastRespResponse.getCode(),baseVastRespResponse.getMessage());
  173. //不一定全部失败,此处只会返回失败提示
  174. BaseVastResp.Items items = baseVastRespResponse.getItems();
  175. if(items!=null&&!CollectionUtil.isEmpty(items.getItem())){
  176. for (BaseVastResp.Item item : items.getItem()) {
  177. eMsg = item.getMessage();
  178. if(!eMsg.equals("The goods don't exists, you can't update it.")){//提示异常但是实际会自动创建 可以认定为请求成功
  179. logger.info("response-{}-failure-item code: {} message: {}",outBizCode, item.getItemCode(),item.getMessage());
  180. // sqls.add("update DATACENTER_P.product set pr_sendwmsstatus='同步失败',pr_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') where pr_code ='"+item.getItemCode()+"'");
  181. Map<String,Object> errorProd = new HashMap<>();
  182. errorProd.put("code",item.getItemCode());
  183. errorProd.put("eMsg",eMsg);
  184. errorList.add(errorProd);
  185. if(errMsg.length()>0){
  186. errMsg.append("</br>");
  187. }
  188. errMsg.append("物料编号:"+item.getItemCode()+",失败原因:"+eMsg);
  189. }
  190. }
  191. if(!CollectionUtil.isEmpty(errorList)){
  192. // baseDao.execute(sqls);
  193. retMap.put("message", errMsg.toString());
  194. retMap.put("errList",errorList);
  195. }else {
  196. logger.info("response-{}-failure-item all message: {}",outBizCode, "The goods don't exists, you can't update it.");
  197. retMap.put("success",true);//全部提示失败但实际创建成功
  198. }
  199. }else {
  200. eMsg = StringUtil.nvl(baseVastRespResponse.getMessage(),"无");
  201. // baseDao.execute("update DATACENTER_P.product set pr_sendwmsstatus='同步失败',pr_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') " +
  202. // " where pr_code IN ("+prCodes+")");
  203. retMap.put("message", eMsg);
  204. }
  205. }
  206. // baseDao.execute("update DATACENTER_P.product set pr_sendwmsflag=-1 where pr_code in ("+prCodes+") AND NVL(pr_sendwmsflag,0) = 0 AND pr_sendwmsstatus='同步成功'");
  207. }else {
  208. retMap.put("success", false);
  209. retMap.put("message", "转换失败:"+response.getStatusCode()+":"+response.getResponseText());
  210. }
  211. }
  212. //TODO 考虑记录日志
  213. return retMap;
  214. } catch (JsonProcessingException e) {
  215. e.printStackTrace();
  216. logger.info("sendProd-Error:JSON转换失败 outBizCode {} codes {} ",outBizCode,prCodes);
  217. retMap.put("success", false);
  218. retMap.put("message", "JSON转换失败");
  219. return retMap;
  220. } catch (Exception e) {
  221. logger.info("sendProd-Error:报错 outBizCode {} codes {} ",outBizCode,prCodes);
  222. e.printStackTrace();
  223. eMsg = StringUtil.nvl(e.getMessage(),"无");
  224. retMap.put("success", false);
  225. retMap.put("message", eMsg);
  226. return retMap;
  227. // baseDao.execute("update DATACENTER_P.product set pr_sendwmsstatus='同步失败' ,pr_sendwmserr='操作:"+actionType+":"+eMsg+"' where pr_code in ("+prCodes+")");
  228. // throw new RuntimeException(e);
  229. }
  230. }
  231. @Override
  232. public Map<String, Object> sendVend(String master, String ids,String emCode,String caller) {
  233. Map<String,Object> retMap = new HashMap<>();
  234. retMap.put("success",true);
  235. logger.info("sendVend-Begin:master {} ids {}",master,ids);
  236. // 执行查询
  237. SqlRowList docMsg = baseDao.queryForRowSet(" select nvl(ve_sendwmsflag,0) sendwmsflag,ve_id,ve_code,ve_name,ve_shortname,ve_add1," +
  238. "vc_id,(case when nvl(vc_isvendor,0) = 0 then 0 else 1 end ) vc_isvendor,vc_name,vc_officeemail,vc_mobile " +
  239. "from "+master+".vendor left join "+master+".VendorContact on ve_id = vc_veid " +
  240. "where ve_id in ("+ids+") order by ve_id,vc_id");
  241. if(!docMsg.hasNext()){
  242. retMap.put("success",false);
  243. retMap.put("message","供应商资料不存在。");
  244. return retMap;
  245. }
  246. List<Map<String, Object>> docMsgResultList = docMsg.getResultList();
  247. // 按 sendwmsflag 分组
  248. Map<Object, List<Map<String, Object>>> groupedByFlag = docMsgResultList.stream()
  249. .collect(Collectors.groupingBy(map -> map.get("sendwmsflag")));
  250. StringBuffer errMsg = new StringBuffer();
  251. List<Map<String,Object>> errorList = new ArrayList<>();
  252. // 处理分组后的数据
  253. groupedByFlag.forEach((sendflag, list) -> {
  254. logger.info("Flag: {}, Count: {}", sendflag, list.size());
  255. // 其他处理逻辑
  256. String actionType = "update";
  257. String actionTypeName = "更新";
  258. if("0".equals(String.valueOf(sendflag))){
  259. actionType = "add";
  260. actionTypeName = "创建";
  261. }
  262. // // 按ve_id和vc_id升序排序
  263. // list.sort(Comparator
  264. // .comparing(m -> (Long) m.get("ve_id"))
  265. // .thenComparing(m -> (Long) m.get("vc_id")));
  266. // 拆分主从表 按ve_id分组
  267. // 按ve_id分组
  268. Map<Long, Vendor> vendorMap = new HashMap<>();
  269. for (Map<String, Object> map : list) {
  270. Long veId = ((BigDecimal) map.get("ve_id")).longValue();
  271. // 获取或创建主表对象
  272. Vendor main = vendorMap.computeIfAbsent(veId, k -> {
  273. Vendor v = new Vendor();
  274. v.setVeId(veId);
  275. v.setVeCode((String) map.get("ve_code"));
  276. v.setVeName((String) map.get("ve_name"));
  277. v.setVeShortname((String) map.get("ve_shortname"));
  278. v.setVeAdd1((String) map.get("ve_add1"));
  279. return v;
  280. });
  281. // 创建从表对象
  282. if(map.get("vc_id") != null){
  283. VendorContact contact = new VendorContact();
  284. contact.setVcId(((BigDecimal) map.get("vc_id")).longValue());
  285. contact.setVcIsvendor(((BigDecimal) map.get("vc_isvendor")).intValue());
  286. contact.setVcName((String) map.get("vc_name"));
  287. contact.setVcOfficeemail((String) map.get("vc_officeemail"));
  288. contact.setVcMobile((String) map.get("vc_mobile"));
  289. // 将联系人添加到主表
  290. main.getVendorContacts().add(contact);
  291. }
  292. }
  293. // 返回按ve_id分组的VendorMain列表
  294. List<Vendor> vList = new ArrayList<>(vendorMap.values());
  295. Map<String, Object> res = sendVendSigle(master,actionType,vList);
  296. if(!res.get("success").equals(true)){
  297. if(errMsg.length()>0){
  298. errMsg.append("</br>");
  299. }
  300. errMsg.append("执行:"+actionTypeName+"操作失败:"+res.get("message"));
  301. if(res.get("errList")!=null){
  302. try {
  303. errorList.addAll((List<Map<String,Object>>) res.get("errList"));
  304. }catch (Exception e){
  305. e.printStackTrace();
  306. }
  307. }
  308. }
  309. });
  310. if(errMsg.length()>0){
  311. retMap.put("success",false);
  312. retMap.put("message",errMsg.toString());
  313. if(!CollectionUtil.isEmpty(errorList)){
  314. retMap.put("errList",errorList);
  315. }
  316. return retMap;
  317. }
  318. logger.info("sendVend-End:master {} ids {}",master,ids);
  319. retMap.put("message","同步成功。");
  320. return retMap;
  321. }
  322. private Map<String, Object> sendVendSigle(String master,String actionType,List<Vendor> list){
  323. List<PartnersReq> regList = new ArrayList<>();
  324. List<Object> docCodes = new ArrayList<>();
  325. String codes = "";
  326. StringBuffer errMsg = new StringBuffer();
  327. String eMsg = "";
  328. Map<String, Object> retMap = new HashMap<>();
  329. if(CollectionUtil.isEmpty(list)){
  330. retMap.put("success",false);
  331. retMap.put("message","没有需要同步的商品(品牌需设置对接MWS)。");
  332. return retMap;
  333. }
  334. vwmsConfig.setEv(docCommonService.getMasterEv(master));
  335. String outBizCode = "sendVend-"+System.currentTimeMillis();
  336. for (Vendor vend : list) {
  337. // 创建Req对象
  338. docCodes.add(vend.getVeCode());
  339. // logger.info("sendVend-test: id {} code {}",vend.getVeId(),vend.getVeCode());
  340. // 创建ProductReq对象
  341. PartnersReq req = PartnersReq.builder()
  342. .partnerCode(vend.getVeCode())
  343. .name(vend.getVeName())
  344. .cnShortName(vend.getVeShortname())
  345. .enCompanyType("supplier")
  346. /* .customField1("自定义2")
  347. .customField2("自定义2")
  348. .customField3("自定义3")
  349. .customField4("自定义4")
  350. .customField5("自定义5")
  351. .remark("备注注")*/
  352. .contactsInfos(PartnersReq.ContactsInfos.builder()
  353. .contactsInfo(Optional.ofNullable(vend.getVendorContacts())
  354. .orElse(Collections.emptyList())
  355. .stream()
  356. .map(contact -> PartnersReq.ContactsInfo.builder()
  357. .isDefault(contact.getVcIsvendor())
  358. .name(contact.getVcName())
  359. .email(contact.getVcOfficeemail())
  360. .mobile(contact.getVcMobile())
  361. .address(vend.getVeAdd1())
  362. .build())
  363. .collect(Collectors.toList()))
  364. .build())
  365. .build();
  366. regList.add(req);
  367. }
  368. codes = "'"+docCodes.stream()
  369. .map(String::valueOf)
  370. .collect(Collectors.joining("','"))+"'";
  371. // 创建BaseReq对象
  372. BaseItemsReq<PartnersReq> vendBaseItemsReq = new BaseItemsReq();
  373. vendBaseItemsReq.setActionType(actionType);
  374. vendBaseItemsReq.setWarehouseCode(vwmsConfig.getWarehouseCode());
  375. vendBaseItemsReq.setOwnerCode(vwmsConfig.getOwnerCode());
  376. vendBaseItemsReq.setOutBizCode(outBizCode);
  377. // 创建BaseVastItem对象
  378. BaseItemsReq.BaseItems vendBaseItems = new BaseItemsReq<PartnersReq>().new BaseItems<PartnersReq>();
  379. // 设置BaseVastItem的item属性
  380. vendBaseItems.setItem(regList);
  381. vendBaseItemsReq.setItems(vendBaseItems);
  382. // 创建BaseReq对象
  383. BaseReq<BaseItemsReq<PartnersReq>> vendBaseReq = new BaseReq();
  384. vendBaseReq.setRequest(vendBaseItemsReq);
  385. try {
  386. // 将wrapper对象转换为JSON字符串
  387. String json = objectMapper.writeValueAsString(vendBaseReq);
  388. // logger.info("Request JSON: {}", json);
  389. HttpUtil.Response response = HttpUtil.doPostToVWMS("openapi.partners.batchcreate", json,vwmsConfig);
  390. if(!String.valueOf(response.getStatusCode()).startsWith("2")){
  391. eMsg = StringUtil.nvl(response.getResponseText(),"未知");
  392. retMap.put("success", false);
  393. retMap.put("message", "["+outBizCode+"]请求失败:"+response.getStatusCode()+":"+eMsg);
  394. // baseDao.execute("update "+master+".vendor set ve_sendwmsstatus='同步失败',ve_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') " +
  395. // " where ve_code IN ("+codes+")");
  396. }else {
  397. retMap.put("success",true);
  398. List<Map<String,Object>> errorList = new ArrayList<>();
  399. // List<String> sqls = new ArrayList<>();
  400. BaseVastResp baseVastResp = new ObjectMapper().readValue(response.getResponseText(), BaseVastResp.class);
  401. BaseVastResp.Response baseVastRespResponse= baseVastResp.getResponse();
  402. if(baseVastRespResponse!=null){
  403. //默认成功
  404. // baseDao.execute("update "+master+".vendor set ve_sendwmsstatus='同步成功' ,ve_sendwmserr=null where ve_code in ("+codes+")");
  405. if("success".equals(baseVastRespResponse.getFlag())){
  406. logger.info("response-{}-success code: {} message: {}",outBizCode, baseVastRespResponse.getCode(),baseVastRespResponse.getMessage());
  407. }else {
  408. retMap.put("success",false);
  409. logger.info("response-{}-failure code: {} message: {}",outBizCode, baseVastRespResponse.getCode(),baseVastRespResponse.getMessage());
  410. //不一定全部失败,此处只会返回失败提示
  411. BaseVastResp.Items items = baseVastRespResponse.getItems();
  412. if(items!=null&&!CollectionUtil.isEmpty(items.getItem())){
  413. for (BaseVastResp.Item item : items.getItem()) {
  414. eMsg = item.getMessage();
  415. logger.info("response-{}-failure-item code: {} message: {}",outBizCode, item.getPartnerCode(),item.getMessage());
  416. // sqls.add("update "+master+".vendor set ve_sendwmsstatus='同步失败',ve_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') where ve_code ='"+item.getItemCode()+"'");
  417. Map<String,Object> errorVe = new HashMap<>();
  418. errorVe.put("code",item.getPartnerCode());
  419. errorVe.put("eMsg",eMsg);
  420. errorList.add(errorVe);
  421. if(errMsg.length()>0){
  422. errMsg.append("</br>");
  423. }
  424. errMsg.append("供应商编号:"+item.getPartnerCode()+",失败原因:"+eMsg);
  425. }
  426. if(!CollectionUtil.isEmpty(errorList)){
  427. // baseDao.execute(sqls);
  428. retMap.put("message", errMsg.toString());
  429. retMap.put("errList",errorList);
  430. }else {
  431. logger.info("response-{}-failure-item all ok",outBizCode);
  432. retMap.put("success",true);//全部提示失败但实际创建成功
  433. }
  434. }else {
  435. eMsg = StringUtil.nvl(baseVastRespResponse.getMessage(),"无");
  436. // baseDao.execute("update "+master+".vendor set ve_sendwmsstatus='同步失败',ve_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') " +
  437. // " where ve_code IN ("+codes+")");
  438. retMap.put("message", eMsg);
  439. }
  440. }
  441. // baseDao.execute("update "+master+".vendor set ve_sendwmsflag=-1 where ve_code in ("+codes+") AND NVL(ve_sendwmsflag,0) = 0 AND ve_sendwmsstatus='同步成功'");
  442. }else {
  443. retMap.put("success", false);
  444. retMap.put("message", "转换失败:"+response.getStatusCode()+":"+response.getResponseText());
  445. }
  446. }
  447. //TODO 考虑记录日志
  448. return retMap;
  449. } catch (JsonProcessingException e) {
  450. logger.info("sendVend-Error:JSON转换失败 outBizCode{} codes {} ",outBizCode,codes);
  451. e.printStackTrace();
  452. retMap.put("success", false);
  453. retMap.put("message", "JSON转换失败");
  454. return retMap;
  455. } catch (Exception e) {
  456. logger.info("sendVend-Error:报错 outBizCode {} codes {} ",outBizCode,codes);
  457. e.printStackTrace();
  458. eMsg = StringUtil.nvl(e.getMessage(),"无");
  459. retMap.put("success", false);
  460. retMap.put("message", eMsg);
  461. return retMap;
  462. // baseDao.execute("update "+master+".vendor set ve_sendwmsstatus='同步失败' ,ve_sendwmserr='操作:"+actionType+":"+eMsg+"' where ve_code in ("+codes+")");
  463. // throw new RuntimeException(e);
  464. }
  465. }
  466. @Override
  467. public Map<String, Object> sendCust(String master, String ids, String emCode,String caller) {
  468. Map<String,Object> retMap = new HashMap<>();
  469. retMap.put("success",true);
  470. logger.info("sendCust-Begin:master {} ids {}",master,ids);
  471. // 执行查询
  472. SqlRowList docMsg = baseDao.queryForRowSet(" select nvl(cu_sendwmsflag,0) sendwmsflag,cu_id,cu_code,cu_name,cu_shortname," +
  473. "ca_id,(case when nvl(ca_remark,' ') = '是' then 1 else 0 end ) isDefault,ca_person,ca_phone,ca_address " +
  474. "from "+master+".customer left join "+master+".CustomerAddress on cu_id = ca_cuid " +
  475. "where cu_id in ("+ids+") order by cu_id,ca_detno,ca_id");
  476. if(!docMsg.hasNext()){
  477. retMap.put("success",false);
  478. retMap.put("message","客户资料不存在。");
  479. return retMap;
  480. }
  481. List<Map<String, Object>> docMsgResultList = docMsg.getResultList();
  482. // 按 sendwmsflag 分组
  483. Map<Object, List<Map<String, Object>>> groupedByFlag = docMsgResultList.stream()
  484. .collect(Collectors.groupingBy(map -> map.get("sendwmsflag")));
  485. StringBuffer errMsg = new StringBuffer();
  486. List<Map<String,Object>> errorList = new ArrayList<>();
  487. // 处理分组后的数据
  488. groupedByFlag.forEach((sendflag, list) -> {
  489. logger.info("Flag: {}, Count: {}", sendflag, list.size());
  490. // 其他处理逻辑
  491. String actionType = "update";
  492. String actionTypeName = "更新";
  493. if("0".equals(String.valueOf(sendflag))){
  494. actionType = "add";
  495. actionTypeName = "创建";
  496. }
  497. // 按cu_id和vc_id升序排序
  498. // 按cu_id分组
  499. Map<Long, Customer> custMap = new HashMap<>();
  500. for (Map<String, Object> map : list) {
  501. Long cuId = ((BigDecimal) map.get("cu_id")).longValue();
  502. // 获取或创建主表对象
  503. Customer main = custMap.computeIfAbsent(cuId, k -> {
  504. Customer v = new Customer();
  505. v.setCuId(cuId);
  506. v.setCuCode((String) map.get("cu_code"));
  507. v.setCuName((String) map.get("cu_name"));
  508. v.setCuShortname((String) map.get("cu_shortname"));
  509. return v;
  510. });
  511. // 创建从表对象
  512. if(map.get("ca_id") != null){
  513. CustomerAddress customerAddress = new CustomerAddress();
  514. customerAddress.setCaId(((BigDecimal) map.get("ca_id")).longValue());
  515. customerAddress.setIsDefault(((BigDecimal) map.get("isDefault")).intValue());
  516. customerAddress.setCaPhone((String) map.get("ca_person"));
  517. customerAddress.setCaPhone((String) map.get("ca_phone"));
  518. customerAddress.setCaAddress((String) map.get("ca_address"));
  519. // 将联系人添加到主表
  520. main.getCustomerAddresses().add(customerAddress);
  521. }
  522. }
  523. // 返回按ve_id分组的VendorMain列表
  524. List<Customer> vList = new ArrayList<>(custMap.values());
  525. Map<String, Object> res = sendCustSigle(master,actionType,vList);
  526. if(!res.get("success").equals(true)){
  527. if(errMsg.length()>0){
  528. errMsg.append("</br>");
  529. }
  530. errMsg.append("执行:"+actionTypeName+"操作失败:"+res.get("message"));
  531. if(res.get("errList")!=null){
  532. try {
  533. errorList.addAll((List<Map<String,Object>>) res.get("errList"));
  534. }catch (Exception e){
  535. e.printStackTrace();
  536. }
  537. }
  538. }
  539. });
  540. if(errMsg.length()>0){
  541. retMap.put("success",false);
  542. retMap.put("message",errMsg.toString());
  543. if(!CollectionUtil.isEmpty(errorList)){
  544. retMap.put("errList",errorList);
  545. }
  546. return retMap;
  547. }
  548. logger.info("sendCust-End:master {} ids {}",master,ids);
  549. retMap.put("message","同步成功。");
  550. return retMap;
  551. }
  552. private Map<String, Object> sendCustSigle(String master,String actionType,List<Customer> list){
  553. List<PartnersReq> custList = new ArrayList<>();
  554. List<Object> docCodes = new ArrayList<>();
  555. String codes = "";
  556. StringBuffer errMsg = new StringBuffer();
  557. String eMsg = "";
  558. Map<String, Object> retMap = new HashMap<>();
  559. if(CollectionUtil.isEmpty(list)){
  560. retMap.put("success",false);
  561. retMap.put("message","没有需要同步的客户。");
  562. return retMap;
  563. }
  564. vwmsConfig.setEv(docCommonService.getMasterEv(master));
  565. String outBizCode = "sendCust-"+System.currentTimeMillis();
  566. for (Customer cust : list) {
  567. // 创建Req对象
  568. docCodes.add(cust.getCuCode());
  569. // logger.info("sendCust-test: id {} code {}",cust.getCuId(),cust.getCuCode());
  570. // 创建ProductReq对象
  571. PartnersReq req = PartnersReq.builder()
  572. .partnerCode(cust.getCuCode())
  573. .name(cust.getCuName())
  574. .cnShortName(cust.getCuShortname())
  575. .enCompanyType("customer")
  576. /* .customField1("自定义2")
  577. .customField2("自定义2")
  578. .customField3("自定义3")
  579. .customField4("自定义4")
  580. .customField5("自定义5")
  581. .remark("备注注")*/
  582. .contactsInfos(PartnersReq.ContactsInfos.builder()
  583. .contactsInfo(Optional.ofNullable(cust.getCustomerAddresses())
  584. .orElse(Collections.emptyList())
  585. .stream()
  586. .map(customerAddress -> PartnersReq.ContactsInfo.builder()
  587. .isDefault(customerAddress.getIsDefault())
  588. .name(customerAddress.getCaPerson())
  589. .mobile(customerAddress.getCaPhone() )
  590. .address(customerAddress.getCaAddress())
  591. .build())
  592. .collect(Collectors.toList()))
  593. .build())
  594. .build();
  595. custList.add(req);
  596. }
  597. codes = "'"+docCodes.stream()
  598. .map(String::valueOf)
  599. .collect(Collectors.joining("','"))+"'";
  600. // 创建BaseReq对象
  601. BaseItemsReq<PartnersReq> custBaseItemsReq = new BaseItemsReq();
  602. custBaseItemsReq.setActionType(actionType);
  603. custBaseItemsReq.setWarehouseCode(vwmsConfig.getWarehouseCode());
  604. custBaseItemsReq.setOwnerCode(vwmsConfig.getOwnerCode());
  605. custBaseItemsReq.setOutBizCode(outBizCode);
  606. // 创建BaseVastItem对象
  607. BaseItemsReq.BaseItems custBaseItems = new BaseItemsReq<PartnersReq>().new BaseItems<PartnersReq>();
  608. // 设置BaseVastItem的item属性
  609. custBaseItems.setItem(custList);
  610. custBaseItemsReq.setItems(custBaseItems);
  611. // 创建BaseReq对象
  612. BaseReq<BaseItemsReq<PartnersReq>> custBaseReq = new BaseReq();
  613. custBaseReq.setRequest(custBaseItemsReq);
  614. try {
  615. // 将wrapper对象转换为JSON字符串
  616. String json = objectMapper.writeValueAsString(custBaseReq);
  617. // logger.info("Request JSON: {}", json);
  618. HttpUtil.Response response = HttpUtil.doPostToVWMS("openapi.partners.batchcreate", json,vwmsConfig);
  619. if(!String.valueOf(response.getStatusCode()).startsWith("2")){
  620. eMsg = StringUtil.nvl(response.getResponseText(),"未知");
  621. retMap.put("success", false);
  622. retMap.put("message", "["+outBizCode+"]请求失败:"+response.getStatusCode()+":"+eMsg);
  623. // baseDao.execute("update "+master+".customer set cu_sendwmsstatus='同步失败',cu_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') " +
  624. // " where cu_code IN ("+codes+")");
  625. }else {
  626. retMap.put("success",true);
  627. // List<String> sqls = new ArrayList<>();
  628. List<Map<String,Object>> errorList = new ArrayList<>();
  629. BaseVastResp baseVastResp = new ObjectMapper().readValue(response.getResponseText(), BaseVastResp.class);
  630. BaseVastResp.Response baseVastRespResponse= baseVastResp.getResponse();
  631. if(baseVastRespResponse!=null){
  632. //默认成功
  633. // baseDao.execute("update "+master+".customer set cu_sendwmsstatus='同步成功' ,cu_sendwmserr=null where cu_code in ("+codes+")");
  634. if("success".equals(baseVastRespResponse.getFlag())){
  635. logger.info("response-{}-success code: {} message: {}",outBizCode, baseVastRespResponse.getCode(),baseVastRespResponse.getMessage());
  636. }else {
  637. retMap.put("success",false);
  638. logger.info("response-{}-failure code: {} message: {}",outBizCode, baseVastRespResponse.getCode(),baseVastRespResponse.getMessage());
  639. //不一定全部失败,此处只会返回失败提示
  640. BaseVastResp.Items items = baseVastRespResponse.getItems();
  641. if(items!=null&&!CollectionUtil.isEmpty(items.getItem())){
  642. for (BaseVastResp.Item item : items.getItem()) {
  643. eMsg = item.getMessage();
  644. // if(!eMsg.equals("The goods don't exists, you can't update it.")){
  645. logger.info("response-{}-failure-item code: {} message: {}",outBizCode, item.getPartnerCode(),item.getMessage());
  646. // sqls.add("update "+master+".customer set cu_sendwmsstatus='同步失败',cu_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') where cu_code ='"+item.getPartnerCode()+"'");
  647. Map<String,Object> errorCu = new HashMap<>();
  648. errorCu.put("code",item.getPartnerCode());
  649. errorCu.put("eMsg",eMsg);
  650. errorList.add(errorCu);
  651. if(errMsg.length()>0){
  652. errMsg.append("</br>");
  653. }
  654. errMsg.append("客户编号:"+item.getPartnerCode()+",失败原因:"+eMsg);
  655. // }
  656. }
  657. if(!CollectionUtil.isEmpty(errorList)){
  658. // baseDao.execute(sqls);
  659. retMap.put("message", errMsg.toString());
  660. retMap.put("errList",errorList);
  661. }else {
  662. logger.info("response-{}-failure-item all message: {}",outBizCode, "The goods don't exists, you can't update it.");
  663. retMap.put("success",true);
  664. }
  665. }else {
  666. eMsg = StringUtil.nvl(baseVastRespResponse.getMessage(),"无");
  667. // baseDao.execute("update "+master+".customer set cu_sendwmsstatus='同步失败',cu_sendwmserr=('操作:"+actionType+":"+eMsg.replaceAll("'","''")+"') " +
  668. // " where cu_code IN ("+codes+")");
  669. retMap.put("message", eMsg);
  670. }
  671. }
  672. // baseDao.execute("update "+master+".customer set cu_sendwmsflag=-1 where cu_code in ("+codes+") AND NVL(cu_sendwmsflag,0) = 0 AND cu_sendwmsstatus='同步成功'");
  673. }else {
  674. retMap.put("success", false);
  675. retMap.put("message", "转换失败:"+response.getStatusCode()+":"+response.getResponseText());
  676. }
  677. }
  678. return retMap;
  679. } catch (JsonProcessingException e) {
  680. e.printStackTrace();
  681. logger.info("sendCust-Error:JSON转换失败 outBizCode {} codes {} ",outBizCode,codes);
  682. retMap.put("success", false);
  683. retMap.put("message", "JSON转换失败");
  684. return retMap;
  685. } catch (Exception e) {
  686. logger.info("sendCust-Error:报错 outBizCode {} codes {} ",outBizCode,codes);
  687. e.printStackTrace();
  688. eMsg = StringUtil.nvl(e.getMessage(),"无");
  689. // baseDao.execute("update "+master+".customer set cu_sendwmsstatus='同步失败' ,cu_sendwmserr='操作:"+actionType+":"+eMsg+"' where cu_code in ("+codes+")");
  690. retMap.put("success", false);
  691. retMap.put("message",eMsg);
  692. return retMap;
  693. }
  694. }
  695. @Override
  696. public Map<String, Object> sendIO(String master, String id, String emCode, String caller) {
  697. Map<String,Object> retMap = new HashMap<>();
  698. retMap.put("success",true);
  699. logger.info("sendIO-Begin:master {} id {}",master,id);
  700. // 执行查询
  701. 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 "
  702. ,"pd_piid = "+id+" and pb_sendwms = -1"
  703. )){
  704. logger.info("sendIO-End:master {} id {} res {}",master,id,"没有需要对接的明细。");
  705. retMap.put("success",false);
  706. retMap.put("message","没有需要对接的明细。");
  707. return retMap;
  708. }
  709. ProdInout prodInOut = docCommonService.getIO(master,id,false);
  710. if(CollectionUtil.isEmpty(prodInOut.getDetails())){
  711. retMap.put("success",false);
  712. retMap.put("message","没有需要同步的明细。");
  713. return retMap;
  714. }
  715. if(prodInOut.getPiWmsstatus().equals("已确认")){
  716. retMap.put("success",false);
  717. retMap.put("message","单据已确认采集,不允许重复同步。");
  718. return retMap;
  719. }
  720. if (!StringUtil.hasText(prodInOut.getPiWmsInType())
  721. || (StringUtil.hasText(prodInOut.getPiWmsInType())
  722. && !prodInOut.getPiWmsInType().equals("in")
  723. && !prodInOut.getPiWmsInType().equals("out")
  724. && !prodInOut.getPiWmsInType().equals("transfer")
  725. )) {
  726. retMap.put("success",false);
  727. retMap.put("message","WMS单据类型为空或异常,不允许同步。");
  728. return retMap;
  729. }
  730. vwmsConfig.setEv(docCommonService.getMasterEv(master));
  731. //构建请求主体
  732. String masterName = prodInOut.getCurrentMasterName();
  733. Long piId = prodInOut.getPiId();
  734. String errMsg = null;
  735. if("in".equals(prodInOut.getPiWmsInType())){
  736. errMsg = docCommonService.sendInToWms(prodInOut,masterName);
  737. }
  738. if("out".equals(prodInOut.getPiWmsInType())){
  739. errMsg = docCommonService.sendOutToWms(prodInOut,masterName);
  740. }
  741. if("transfer".equals(prodInOut.getPiWmsInType())){
  742. errMsg = docCommonService.sendOMoveToWms(prodInOut,masterName);
  743. }
  744. if(errMsg!=null){
  745. if(errMsg.startsWith("OrderId:")){
  746. retMap.put("OrderId",errMsg.replaceAll("OrderId:",""));
  747. logger.info("sendIO-End-Sucess master {} piid {} OrderId {}",master,piId,errMsg.replaceAll("OrderId:",""));
  748. //更新 WMSORDERID
  749. baseDao.execute("update "+master+".prodiowms set WMSORDERID = '"+errMsg.replaceAll("OrderId:","")+"' where PIID = "+piId);
  750. }else {
  751. errMsg = errMsg.replaceAll("'","''");
  752. logger.info("sendIO-End-failure master {} piid {} errorTip {}",master,piId,errMsg);
  753. retMap.put("success",false);
  754. retMap.put("message",errMsg);
  755. }
  756. }else {
  757. logger.info("sendIO-End-success master {} piid {} ",master,piId);
  758. }
  759. return retMap;
  760. }
  761. @Override
  762. public Map<String, Object> cancelIO(String master, String id, String emCode, String caller,String cancelReason) {
  763. Map<String,Object> retMap = new HashMap<>();
  764. String docOp = "取消";
  765. retMap.put("success",true);
  766. String eMsg = null;
  767. logger.info("sendIO-cancel-Begin:master {} id {} cancelReason {}",master,id,cancelReason);
  768. // 执行查询
  769. if(!baseDao.checkIf(master+".prodinout","pi_id = "+id+" and nvl(pi_sendwmsflag,0) = -1")){
  770. logger.info("sendIO-cancel-End:master {} id {} res {}",master,id,"单据不存在或尚未同步到WMS。");
  771. retMap.put("success",false);
  772. retMap.put("message","单据不存在或尚未同步到WMS。");
  773. return retMap;
  774. }
  775. ProdInout prodInOut = docCommonService.getIO(master,id,true);
  776. if(prodInOut.getPiWmsstatus().equals("已确认")){
  777. retMap.put("success",false);
  778. retMap.put("message","单据已确认采集,不允许取消。");
  779. return retMap;
  780. }
  781. vwmsConfig.setEv(docCommonService.getMasterEv(master));
  782. Long piId = prodInOut.getPiId();
  783. BaseReq<OrderVastRequest<OrderCancel>> req = new BaseReq();
  784. OrderVastRequest<OrderCancel> cancelReq = new OrderVastRequest();
  785. cancelReq.setOutBizCode("sendIO-cancel-"+prodInOut.getPiOrderType()+"-"+System.currentTimeMillis());// 外部业务代码 消息ID, 用于去重, 因为网络等原因导致重复传输, 请求不会被重复处理
  786. OrderVastRequest.OrdersRequest<OrderCancel> orders = getOrderCancelOrdersRequest(cancelReason, prodInOut);
  787. cancelReq.setOrders(orders);
  788. req.setRequest(cancelReq);
  789. try {
  790. //转换为JSON字符串
  791. String json = objectMapper.writeValueAsString(req);
  792. logger.info("sendIO-cancel-Request JSON: {}", json);
  793. HttpUtil.Response response = HttpUtil.doPostToVWMS("openapi.order.batchcancel.v2", json,vwmsConfig);
  794. if(!String.valueOf(response.getStatusCode()).startsWith("2")){
  795. eMsg = "("+response.getStatusCode()+")"+StringUtil.nvl(response.getResponseText(),"无").replaceAll("'","''");
  796. }else {
  797. BaseVastResp baseVastResp = new ObjectMapper().readValue(response.getResponseText(), BaseVastResp.class);
  798. BaseVastResp.Response baseVastRespResponse = baseVastResp.getResponse();
  799. if(baseVastRespResponse!=null){
  800. if("success".equals(baseVastRespResponse.getFlag())){
  801. logger.info("sendIO-cancel-response-success code: {} message: {}", baseVastRespResponse.getCode(),baseVastRespResponse.getMessage());
  802. // baseDao.execute("update "+master+".prodinout set pi_sendwmsstatus='取消成功' ,pi_sendwmserr=null,pi_sendwmsflag=0,PI_WMSORDERCODE=null where pi_id = "+piId);
  803. //TODO 删除表:WMS_IO_RECORD_SEQ
  804. }else {
  805. // logger.info("sendIO-cancel-response-failure {}", response.getResponseText());
  806. eMsg = "(" + baseVastRespResponse.getCode() + ")";
  807. String errorMessage = baseVastRespResponse.getMessage();
  808. if (baseVastRespResponse.getOrders() != null &&
  809. !CollectionUtil.isEmpty(baseVastRespResponse.getOrders().getOrder())) {
  810. errorMessage = StringUtil.nvl(baseVastRespResponse.getOrders().getOrder().get(0).getMessage(),baseVastRespResponse.getMessage());
  811. }
  812. eMsg += StringUtil.nvl(errorMessage, "未知").replaceAll("'", "''");
  813. }
  814. }else {
  815. eMsg = "RespJSON转换失败:"+response.getStatusCode()+":"+response.getResponseText();
  816. }
  817. }
  818. } catch (JsonProcessingException e) {
  819. eMsg = "JSON转换失败";
  820. e.printStackTrace();
  821. } catch (Exception e) {
  822. e.printStackTrace();
  823. eMsg = StringUtil.nvl(e.getMessage(),"无").replaceAll("'","''");
  824. }
  825. if(eMsg!=null){
  826. eMsg = eMsg.replaceAll("'","''");
  827. logger.info("sendIO-cancel-End-failure master {} piid {} errorTip {}",master,piId,eMsg);
  828. // baseDao.execute("update "+master+".prodinout set pi_sendwmsstatus='取消失败',pi_sendwmserr=UNISTR('"+eMsg+"') where pi_id = "+piId);
  829. retMap.put("success",false);
  830. retMap.put("message",eMsg);
  831. }else {
  832. logger.info("sendIO-cancel-End-success master {} piid {} ",master,piId);
  833. }
  834. return retMap;
  835. }
  836. @Override
  837. public Map<String, Object> sendStockData(String master, String emCode) {
  838. Map<String, Object> resMap = new HashMap<>();
  839. resMap.put("success",true);
  840. logger.info("sendStockData-Begin master {} emCode {} ",master,emCode);
  841. List<StockData> stockDataList = baseDao.getJdbcTemplate().query("SELECT * FROM "+master+".SCM_KCZLB_WMS_VIEW ",
  842. new BeanPropertyRowMapper<>(StockData.class));
  843. String dataNo = "";
  844. if(!CollectionUtil.isEmpty(stockDataList)){
  845. vwmsConfig.setEv(docCommonService.getMasterEv(master));
  846. // 每1000条分批处理
  847. int batchSize = 1000;
  848. int totalSize = stockDataList.size();
  849. int batchCount = (totalSize + batchSize - 1) / batchSize;
  850. String outBizCode = "erpStockData-"+ DateUtil.currentDateString(Constant.YMD_HMS);
  851. for (int i = 0; i < batchCount; i++) {
  852. int fromIndex = i * batchSize;
  853. int toIndex = Math.min((i + 1) * batchSize, totalSize);
  854. if(!StringUtil.hasText(dataNo)){
  855. dataNo = outBizCode;
  856. }
  857. // 获取当前批次数据
  858. InventorySyncReq inventorySyncReq = new InventorySyncReq();
  859. inventorySyncReq.setDataNo(dataNo);
  860. inventorySyncReq.setWarehouseCode(vwmsConfig.getWarehouseCode());
  861. inventorySyncReq.setOwnerCode(vwmsConfig.getOwnerCode());
  862. inventorySyncReq.setOutBizCode(outBizCode);
  863. InventorySyncReq.StockDataItems items = new InventorySyncReq.StockDataItems();
  864. items.setItem(stockDataList.subList(fromIndex, toIndex));
  865. inventorySyncReq.setItems(items);
  866. BaseReq<InventorySyncReq> req = new BaseReq();
  867. req.setRequest(inventorySyncReq);
  868. try {
  869. String json = objectMapper.writeValueAsString(req);
  870. // 处理当前批次数据
  871. String errTip = docCommonService.sendToWms(json, "openapi.inventory.foreign.synchronize");
  872. if (errTip!=null) {
  873. resMap.put("success", false);
  874. resMap.put("message", "【dataNo:"+dataNo+"】同步第" + (fromIndex) + "~"+toIndex+"行数据失败:" + errTip);
  875. break;
  876. }
  877. } catch (JsonProcessingException e) {
  878. e.printStackTrace();
  879. resMap.put("success", false);
  880. resMap.put("message", "【dataNo:"+dataNo+"】同步第" + (fromIndex) + "~"+toIndex+"行数据失败:JSON转换失败" );
  881. break;
  882. }
  883. }
  884. resMap.put("message", "【dataNo:"+dataNo+"】库存数据同步成功,共处理" + totalSize + "条数据");
  885. }
  886. if("JOB".equals(emCode)){
  887. //记录日志
  888. baseDao.execute("Insert into " + master + ".MESSAGELOG (ML_ID,ML_DATE,ML_MAN,ML_CONTENT,ML_RESULT,ML_SEARCH,CODE) " +
  889. "values (" + master + ".MESSAGELOG_seq.nextval,sysdate,'定时任务','同步库存至WMS(自动)','"
  890. +resMap.get("message")
  891. +"','InventoryToWms|emCode=" + emCode + "','" + emCode + "')");
  892. }
  893. logger.info("sendStockData-End-success master {} emCode {} dataNo {}",master,emCode,dataNo);
  894. return resMap;
  895. }
  896. private OrderVastRequest.OrdersRequest<OrderCancel> getOrderCancelOrdersRequest(String cancelReason, ProdInout prodInOut) {
  897. OrderVastRequest.OrdersRequest<OrderCancel> orders = new OrderVastRequest.OrdersRequest<OrderCancel>();
  898. OrderCancel cancelOrder = new OrderCancel();
  899. cancelOrder.setWarehouseCode(vwmsConfig.getWarehouseCode());// 仓库编码
  900. cancelOrder.setOwnerCode(vwmsConfig.getOwnerCode());// 货主编码
  901. cancelOrder.setOrderCode(prodInOut.getPiInoutno());// 入库单号
  902. cancelOrder.setCancelReason(cancelReason);
  903. cancelOrder.setCancelType(prodInOut.getPiWmsInType());
  904. orders.setOrder(Arrays.asList(cancelOrder));
  905. return orders;
  906. }
  907. }