ERPServiceImpl.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. package com.uas.eis.service.Impl;
  2. import com.fasterxml.jackson.core.JsonProcessingException;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.fasterxml.jackson.dataformat.xml.XmlMapper;
  5. import com.uas.eis.config.VwmsConfig;
  6. import com.uas.eis.dao.*;
  7. import com.uas.eis.entity.vwms.entity.*;
  8. import com.uas.eis.entity.vwms.req.*;
  9. import com.uas.eis.entity.vwms.resp.BaseVastResp;
  10. import com.uas.eis.entity.vwms.resp.ProdResp;
  11. import com.uas.eis.service.DocCommonService;
  12. import com.uas.eis.service.ERPService;
  13. import com.uas.eis.utils.*;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.stereotype.Service;
  18. import java.util.*;
  19. /**
  20. * @author wuyx
  21. * @email wuyx@usoftchina.com
  22. * @date 2025-03-04
  23. */
  24. @Service
  25. public class ERPServiceImpl implements ERPService {
  26. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  27. @Autowired
  28. private BaseDao baseDao;
  29. @Autowired
  30. private VwmsConfig vwmsConfig;
  31. @Autowired
  32. private DocCommonService docCommonService;
  33. @Override
  34. public Map<String, Object> sendProd(String master, String id, String emCode, String caller) {
  35. Map<String, Object> retMap = new HashMap<>();
  36. retMap.put("success", true);
  37. logger.info("sendProd-Begin:master {} id {}", master, id);
  38. vwmsConfig.setEv(docCommonService.getMasterEv(master));
  39. // 执行查询
  40. SqlRowList docMsg = baseDao.queryForRowSet(" select nvl(pr_sendwmsflag,0) pr_sendwmsflag,pr_id,pr_code,pr_detail,pr_spec,pr_brand,pr_xsl_user,pr_hsl_user,pr_psl_user " +
  41. " from " + vwmsConfig.getDC_MASTER() + ".product where pr_id = " + id);
  42. if (!docMsg.next()) {
  43. // baseDao.execute("update " + master + ".product set pr_sendwmsstatus='同步失败',pr_sendwmserr='没有需要同步的商品。' where pr_id = " + id);
  44. retMap.put("success", false);
  45. retMap.put("message", "没有需要同步的商品。");
  46. return retMap;
  47. }
  48. StringBuffer errMsg = new StringBuffer();
  49. // 处理分组后的数据
  50. String sendflag = docMsg.getGeneralString("pr_sendwmsflag");
  51. logger.info("Flag: {}", sendflag);
  52. // 其他处理逻辑
  53. String actionType = "update";
  54. String actionTypeName = "更新";
  55. if ("0".equals(String.valueOf(sendflag))) {
  56. actionType = "add";
  57. actionTypeName = "创建";
  58. }
  59. //需要调用三次对接方法
  60. String[] masterList = new String[]{"YUEJH_TEST", "YJH_T", "YIT_T"};//YUEJH、AIFL、YJH_HK
  61. for (String m : masterList) {
  62. Map<String, Object> res = sendProdSigle(m, actionType, docMsg.getCurrentMap());
  63. if (!res.get("success").equals(true)) {
  64. if(StringUtil.hasText(res.get("message"))){
  65. if(errMsg.length()>0){
  66. errMsg.append("</br>");
  67. }
  68. errMsg.append(res.get("message"));
  69. }
  70. }
  71. }
  72. if (errMsg.length() > 0) {
  73. logger.info("sendProd-End-F:master {} id {} message {}", master, id,errMsg.toString());
  74. retMap.put("success", false);
  75. retMap.put("message", errMsg.toString());
  76. // baseDao.execute("update " + master + ".product set pr_sendwmsstatus='同步失败',pr_sendwmserr=('操作:" + actionTypeName + "</br>" + errMsg.toString().replaceAll("'", "''") + "') " +
  77. // " where pr_id = " + id);
  78. }else {
  79. logger.info("sendProd-End-S:master {} id {}", master, id);
  80. retMap.put("message", "同步成功。");
  81. // baseDao.execute("update " + master + ".product set pr_sendwmsflag=-1,pr_sendwmsstatus='同步成功' ,pr_sendwmserr=null where pr_id = " + id);
  82. }
  83. return retMap;
  84. }
  85. private Map<String, Object> sendProdSigle(String master, String actionType, Map<String, Object> map) {
  86. List<Object> docCodes = new ArrayList<>();
  87. StringBuffer errMsg = new StringBuffer();
  88. String eMsg = "";
  89. Map<String, Object> retMap = new HashMap<>();
  90. retMap.put("success", true);
  91. String ownerCode = master;
  92. String ownerName = "越加红";
  93. if ("YUEJH_TEST".equals(master)) {
  94. ownerCode = "YUEJH";
  95. }
  96. if ("YJH_T".equals(master)) {
  97. ownerCode = "AIFL";
  98. ownerName = "艾富利";
  99. }
  100. if ("YIT_T".equals(master)) {
  101. ownerCode = "YJH_HK";
  102. ownerName = "越加红香港";
  103. }
  104. if (map == null || !StringUtil.hasText(map.get("pr_code"))) {
  105. retMap.put("success", false);
  106. retMap.put("message", "账套:"+ownerName+"没有需要同步的商品。");
  107. return retMap;
  108. }
  109. String prCode = map.get("pr_code").toString();
  110. // 创建ProductReq对象
  111. docCodes.add(map.get("pr_code"));
  112. logger.info("sendProd-test: id {} code {} ownerCode {}", map.get("pr_id"), prCode,ownerCode);
  113. // 创建ProductReq对象
  114. ProductReq productReq = new ProductReq();
  115. productReq.setItemCode(prCode.toString());
  116. productReq.setItemName(StringUtil.nvl(map.get("pr_detail"), " "));
  117. productReq.setBrandName(StringUtil.nvl(map.get("pr_brand"), " "));
  118. productReq.setBoxQuantity(Long.valueOf(StringUtil.nvl(map.get("pr_xsl_user"), "0")));
  119. productReq.setSecondQuantity(Long.valueOf(StringUtil.nvl(map.get("pr_hsl_user"), "0")));
  120. productReq.setThirdQuantity(Long.valueOf(StringUtil.nvl(map.get("pr_psl_user"), "0")));
  121. productReq.setSkuProperty(StringUtil.nvl(map.get("pr_spec"), " "));
  122. // 创建BaseReq对象
  123. BaseItemReq<ProductReq> prodBaseItemReq = new BaseItemReq();
  124. prodBaseItemReq.setActionType(actionType);
  125. prodBaseItemReq.setWarehouseCode(vwmsConfig.getWarehouseCode());
  126. prodBaseItemReq.setOwnerCode(ownerCode);
  127. prodBaseItemReq.setItem(productReq);
  128. try {
  129. // 创建XmlMapper实例
  130. XmlMapper xmlMapper = new XmlMapper();
  131. String xml = xmlMapper.writeValueAsString(prodBaseItemReq);
  132. logger.info("Request XML: {}", xml);
  133. HttpUtil.Response response = HttpUtil.postXmlToVWMS("singleitem.synchronize", xml, "UTF-8", vwmsConfig);
  134. // System.out.println("responseText:"+responseText);
  135. // 解析XML响应
  136. if (!String.valueOf(response.getStatusCode()).startsWith("2")) {
  137. eMsg = "请求失败:" + response.getStatusCode() + ":" +StringUtil.nvl(response.getResponseText(), "未知");
  138. } else {
  139. ProdResp prodResp = xmlMapper.readValue(response.getResponseText(), ProdResp.class);
  140. if (prodResp != null) {
  141. if ("success".equals(prodResp.getFlag())) {
  142. logger.info("response-success ownerCode {} prcode: {}", ownerCode,prodResp.getItemId());
  143. } else {
  144. logger.info("response-failure ownerCode {} code: {} message: {}", ownerCode,prodResp.getCode(), prodResp.getMessage());
  145. eMsg = StringUtil.nvl(prodResp.getMessage(), "无");
  146. }
  147. } else {
  148. eMsg="转换失败:" + response.getStatusCode() + ":" + response.getResponseText();
  149. }
  150. }
  151. //TODO 考虑记录日志
  152. } catch (Exception e) {
  153. e.printStackTrace();
  154. eMsg = StringUtil.nvl(e.getMessage(), "无");
  155. }
  156. if (StringUtil.hasText(eMsg)) {
  157. errMsg.append("账套:").append(ownerName).append(eMsg);
  158. }
  159. if (errMsg.length() > 0) {
  160. retMap.put("success", false);
  161. retMap.put("message", errMsg.toString());
  162. return retMap;
  163. }
  164. return retMap;
  165. }
  166. @Override
  167. public Map<String, Object> sendIO(String master, String id, String emCode, String caller) {
  168. Map<String, Object> retMap = new HashMap<>();
  169. retMap.put("success", true);
  170. logger.info("sendIO-Begin:master {} id {}", master, id);
  171. vwmsConfig.setEv(docCommonService.getMasterEv(master));
  172. // 执行查询
  173. if (!baseDao.checkIf(master + ".prodiodetail left join "+vwmsConfig.getDC_MASTER()+".product on pr_code = pd_prodcode "
  174. , "pd_piid = " + id + " and nvl(pr_sendwmsflag,0) = -1")) {
  175. logger.info("sendIO-End:master {} id {} res {}", master, id, "没有需要对接的明细。");
  176. retMap.put("success", false);
  177. retMap.put("message", "没有需要对接的明细。");
  178. return retMap;
  179. }
  180. ProdInout prodInOut = docCommonService.getIO(master, id,null);
  181. if (CollectionUtil.isEmpty(prodInOut.getDetails())) {
  182. retMap.put("success", false);
  183. retMap.put("message", "没有需要同步的明细。");
  184. return retMap;
  185. }
  186. if (prodInOut.getPiWmsstatus().equals("已确认")) {
  187. retMap.put("success", false);
  188. retMap.put("message", "单据已确认采集,不允许重复同步。");
  189. return retMap;
  190. }
  191. if (!StringUtil.hasText(prodInOut.getPiWmsInType())
  192. || (StringUtil.hasText(prodInOut.getPiWmsInType())
  193. && !prodInOut.getPiWmsInType().equals("in")
  194. && !prodInOut.getPiWmsInType().equals("out")
  195. && !prodInOut.getPiWmsInType().equals("transfer")
  196. )) {
  197. retMap.put("success", false);
  198. retMap.put("message", "WMS单据类型为空或异常,不允许同步。");
  199. return retMap;
  200. }
  201. //构建请求主体
  202. String masterName = prodInOut.getCurrentMaster();
  203. Long piId = prodInOut.getPiId();
  204. String errMsg = null;
  205. if ("in".equals(prodInOut.getPiWmsInType())) {
  206. errMsg = docCommonService.sendInToWms(prodInOut, masterName);
  207. }
  208. if ("out".equals(prodInOut.getPiWmsInType())||"transfer".equals(prodInOut.getPiWmsInType())) {
  209. errMsg = docCommonService.sendOutToWms(prodInOut, masterName);
  210. }
  211. if (errMsg != null) {
  212. if (errMsg.startsWith("OrderId:")) {
  213. retMap.put("OrderId", errMsg.replaceAll("OrderId:", ""));
  214. logger.info("sendIO-End-Sucess master {} piid {} OrderId {}", master, piId, errMsg.replaceAll("OrderId:", ""));
  215. //更新 WMSORDERID
  216. baseDao.execute("update " + master + ".prodiowms set WMSORDERID = '" + errMsg.replaceAll("OrderId:", "") + "' where PIID = " + piId);
  217. } else {
  218. errMsg = errMsg.replaceAll("'", "''");
  219. logger.info("sendIO-End-failure master {} piid {} errorTip {}", master, piId, errMsg);
  220. retMap.put("success", false);
  221. retMap.put("message", errMsg);
  222. }
  223. } else {
  224. logger.info("sendIO-End-success master {} piid {} ", master, piId);
  225. }
  226. return retMap;
  227. }
  228. @Override
  229. public Map<String, Object> cancelIO(ErpCancelIORequest erpCancelIORequest) {
  230. String master = erpCancelIORequest.getMaster();
  231. String emCode = erpCancelIORequest.getEmCode();
  232. String caller = erpCancelIORequest.getCaller();
  233. String formStore = erpCancelIORequest.getFormStore();
  234. String gridStore = erpCancelIORequest.getGridStore();
  235. Map<Object, Object> store = BaseUtil.parseFormStoreToMap(formStore);
  236. List<Map<Object, Object>> gstore = BaseUtil.parseGridStoreToMaps(gridStore);
  237. Object piId = store.get("pi_id");
  238. Map<String, Object> retMap = new HashMap<>();
  239. retMap.put("success", true);
  240. logger.info("cancelIO-Begin:master {} id {}", master, piId);
  241. vwmsConfig.setEv(docCommonService.getMasterEv(master));
  242. if(CollectionUtil.isEmpty(gstore)) {
  243. logger.info("cancelIO-End:master {} id {} res {}", master, piId, "没有需要对接的明细。");
  244. retMap.put("success", false);
  245. retMap.put("message", "没有需要对接的明细。");
  246. return retMap;
  247. }
  248. StringBuffer pdIds = new StringBuffer();
  249. for (Map<Object, Object> map : gstore) {
  250. if(pdIds.length()>0){
  251. pdIds.append(",");
  252. }
  253. if(StringUtil.hasText(map.get("pd_id"))){
  254. pdIds.append(map.get("pd_id"));
  255. }
  256. if(StringUtil.hasText(map.get("PD_ID"))){
  257. pdIds.append(map.get("PD_ID"));
  258. }
  259. }
  260. // 执行查询
  261. if (!baseDao.checkIf(master + ".prodiodetail left join " + vwmsConfig.getDC_MASTER() + ".product on pr_code = pd_prodcode "
  262. , "pd_id in (" + pdIds + ") and nvl(pr_sendwmsflag,0) = -1")) {
  263. logger.info("cancelIO-End:master {} id {} res {}", master, piId, "明细不需要对接WMS。");
  264. retMap.put("success", false);
  265. retMap.put("message", "明细不需要对接WMS。");
  266. return retMap;
  267. }
  268. ProdInout prodInOut = docCommonService.getIO(master, piId.toString(),pdIds.toString());
  269. if (prodInOut.getPiWmsstatus().equals("已确认")) {
  270. retMap.put("success", false);
  271. retMap.put("message", "单据已确认采集,不允许重复同步。");
  272. return retMap;
  273. }
  274. String ownerCode = master;
  275. if("YUEJH_TEST".equals(master)){
  276. ownerCode = "YUEJH";
  277. }
  278. if("YJH_T".equals(master)){
  279. ownerCode = "AIFL";
  280. }
  281. if("YIT_T".equals(master)){
  282. ownerCode = "YJH_HK";
  283. }
  284. String deliveryOrderCode = prodInOut.getPiInoutno();
  285. String warehouseCode = vwmsConfig.getWarehouseCode();
  286. List<Prodiodetail> prodiodetails = prodInOut.getDetails();
  287. CancelIORequest cancelIORequest = new CancelIORequest();
  288. CancelIORequest.CancelItems cancelItems = new CancelIORequest.CancelItems();
  289. List<CancelIORequest.CancelItem> cancelItemList = new ArrayList<>();
  290. for (Map<Object, Object> map : gstore) {
  291. Long pdId = 0L;
  292. Double qtyAfter = 0.0;
  293. if(StringUtil.hasText(map.get("pd_id"))){
  294. pdId = Long.valueOf(map.get("pd_id").toString());
  295. }
  296. if(StringUtil.hasText(map.get("PD_ID"))){
  297. pdId = Long.valueOf(map.get("PD_ID").toString());
  298. }
  299. if(StringUtil.hasText(map.get("pd_outqty"))){
  300. qtyAfter = Double.valueOf(map.get("pd_outqty").toString());
  301. }
  302. if(StringUtil.hasText(map.get("PD_OUTQTY"))){
  303. qtyAfter = Double.valueOf(map.get("PD_OUTQTY").toString());
  304. }
  305. if(pdId > 0){
  306. Long finalPdId = pdId;
  307. Prodiodetail detail = prodiodetails.stream()
  308. .filter(p -> finalPdId.equals(p.getPdId()))
  309. .findFirst()
  310. .orElse(null);
  311. if(detail != null) {
  312. Double qtyBefor = detail.getPdQty();
  313. Double cancelQty = NumberUtil.sub(qtyBefor,qtyAfter);
  314. if(cancelQty>0){
  315. CancelIORequest.CancelItem cancelItem = new CancelIORequest.CancelItem(warehouseCode,ownerCode,deliveryOrderCode);
  316. cancelItem.setOrderLineNo(String.valueOf(detail.getPdPdno()));
  317. cancelItem.setLogicWarehouseCode(detail.getPdWhcode());
  318. cancelItem.setItemCode(detail.getPdProdcode());
  319. cancelItem.setItemName(detail.getPdProdname());
  320. cancelItem.setCancelQty(cancelQty);
  321. cancelItemList.add(cancelItem);
  322. }
  323. }
  324. }
  325. }
  326. if(CollectionUtil.isEmpty(cancelItemList)){
  327. retMap.put("success", false);
  328. retMap.put("message", "无需要取消的明细。");
  329. return retMap;
  330. }
  331. cancelItems.setCancelItem(cancelItemList);
  332. cancelIORequest.setCancelItems(cancelItems);
  333. String xml = null;
  334. String method = "stockout.detailCancel";
  335. try {
  336. XmlMapper xmlMapper = new XmlMapper();
  337. xml = xmlMapper.writeValueAsString(cancelIORequest);
  338. // System.out.println("xml:"+xml);
  339. String errMsg = docCommonService.doPostToWms(xml,method);
  340. if (errMsg != null) {
  341. errMsg = errMsg.replaceAll("'", "''");
  342. logger.info("cancelIO-End-failure master {} pdIds {} errorTip {}", master, pdIds.toString(), errMsg);
  343. retMap.put("success", false);
  344. retMap.put("message", errMsg);
  345. return retMap;
  346. } else {
  347. logger.info("cancelIO-End-success master {} pdIds {} ", master, pdIds.toString());
  348. }
  349. } catch (JsonProcessingException e) {
  350. e.printStackTrace();
  351. retMap.put("success", false);
  352. retMap.put("message", "JSON转换失败。");
  353. return retMap;
  354. }
  355. retMap.put("message", "取消成功。");
  356. return retMap;
  357. }
  358. }