ERPServiceImpl.java 48 KB

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