ERPServiceImpl.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. package com.uas.eis.service.Impl;
  2. import com.fasterxml.jackson.core.JsonParser;
  3. import com.fasterxml.jackson.core.JsonProcessingException;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import com.fasterxml.jackson.databind.node.TextNode;
  6. import com.uas.eis.core.support.TokenProperties;
  7. import com.uas.eis.dao.BaseDao;
  8. import com.uas.eis.dao.SqlRowList;
  9. import com.uas.eis.sdk.converter.ObjectToMapConverter;
  10. import com.uas.eis.sdk.dto.*;
  11. import com.uas.eis.service.ERPService;
  12. import com.uas.eis.task.httpclient.EDIX5JsonHttpClient;
  13. import com.uas.eis.utils.SqlUtil;
  14. import com.uas.eis.utils.X5StringUtils;
  15. import com.uas.eis.utils.XMEDIConfiguration;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.transaction.annotation.Transactional;
  21. import javax.annotation.Resource;
  22. import java.net.URLDecoder;
  23. import java.nio.charset.StandardCharsets;
  24. import java.text.SimpleDateFormat;
  25. import java.util.*;
  26. /**
  27. * @author koul
  28. * @email koul@usoftchina.com
  29. * @date 2021-12-06 18:27
  30. */
  31. @Service
  32. public class ERPServiceImpl implements ERPService {
  33. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  34. private static Map<String,String> tokenConfig = TokenProperties.getAllProperty();
  35. @Autowired
  36. private BaseDao baseDao;
  37. @Resource(name = "xmediConfiguration")
  38. private XMEDIConfiguration xmediConfiguration;
  39. @Transactional
  40. @Override
  41. public Map<String, Object> savePurchase(String data) {
  42. Map<String, Object> result = new HashMap<>();
  43. Map<String, Object> header_result = new HashMap<>();
  44. String resultSuccessMsg = "";
  45. String resultErrorMsg = "";
  46. String sign = null;
  47. String body = null;
  48. try {
  49. ObjectMapper objectMapper = new ObjectMapper();
  50. // String decode = URLDecoder.decode(data, StandardCharsets.UTF_8.toString());
  51. String jsonString = X5StringUtils.decodeBase64(data);
  52. Map<String, Object> map = objectMapper.readValue(jsonString, Map.class);
  53. if(map.size()>0 && map.get("header")!=null ){
  54. Map<String, Object> header_map = (Map<String, Object>) map.get("header");
  55. sign = header_map.get("sign") == null ? "" : header_map.get("sign").toString();
  56. }
  57. boolean checkSign = X5StringUtils.checkSign(sign, "test", jsonString, "218A05A252469F5A62B0B3204F669E1D");
  58. if(checkSign || true){
  59. try {
  60. if(map.get("body")!=null){
  61. body = map.get("body") == null ? "" : map.get("body").toString();
  62. PurchaseMain purchaseMain = objectMapper.readValue(body, PurchaseMain.class);
  63. String purord_num = purchaseMain.getPURORD_NUM();
  64. resultSuccessMsg="采购订单:"+purord_num+"处理成功";
  65. resultErrorMsg="采购订单:"+purord_num+"处理失败,";
  66. String operation_type = purchaseMain.getOPERATION_TYPE();
  67. if("I".equals(operation_type)){
  68. int count = baseDao.getCount("select * from PurchaseMainXM where PURORD_NUM='" + purord_num + "'");
  69. if (count == 0){
  70. //主表
  71. Map<String, Object> purchaseMain_map = ObjectToMapConverter.objectToMap(purchaseMain);
  72. purchaseMain_map.remove("ET_ITEM");
  73. purchaseMain_map.put("PMXID", 0);
  74. baseDao.execute(SqlUtil.getInsertSql(purchaseMain_map,"PurchaseMainXM","PMXID"));
  75. Object PMXID = baseDao.getFieldDataByCondition("PurchaseMainXM", "PMXID", "GUID='" + purchaseMain_map.get("GUID")+"'");
  76. //从表
  77. List<PurchaseItem> et_item = purchaseMain.getET_ITEM();
  78. for (PurchaseItem purchaseItem:et_item) {
  79. //List<String> ItemSqls = new ArrayList<>();
  80. Map<String, Object> purchaseItem_map = ObjectToMapConverter.objectToMap(purchaseItem);
  81. purchaseItem_map.remove("ET_ITEM_AMOUNT");
  82. purchaseItem_map.put("PIXID",0);
  83. purchaseItem_map.put("PIXPMXID",PMXID);
  84. String insertItemSql = SqlUtil.getInsertSql(purchaseItem_map, "PURCHASEITEMXM", "PIXID");
  85. //ItemSqls.add(insertItemSql);
  86. baseDao.execute(insertItemSql);
  87. Object PIXID = baseDao.getFieldDataByCondition("PURCHASEITEMXM left join PurchaseMainXM on PIXPMXID=PMXID", "PIXID", "GUID='" + purchaseMain_map.get("GUID")+"' and PURORD_ITEM_NUM='"+purchaseItem_map.get("PURORD_ITEM_NUM")+"'");
  88. List<PurchaseItemAmount> et_item_amount = purchaseItem.getET_ITEM_AMOUNT();
  89. List<String> ItemAmountSqls = new ArrayList<>();
  90. for (PurchaseItemAmount purchaseItemAmount:et_item_amount) {
  91. Map<String, Object> purchaseItemAmount_map = ObjectToMapConverter.objectToMap(purchaseItemAmount);
  92. purchaseItemAmount_map.put("PIMAID",0);
  93. purchaseItemAmount_map.put("PIMAPMXID",PMXID);
  94. purchaseItemAmount_map.put("PIMAPIXID",PIXID);
  95. String insertItemAmountSql = SqlUtil.getInsertSql(purchaseItemAmount_map, "PURCHASEITEMAMOUNTXM", "PIMAID");
  96. ItemAmountSqls.add(insertItemAmountSql);
  97. }
  98. baseDao.execute(ItemAmountSqls);
  99. }
  100. }else{
  101. //更新
  102. header_result.put("code", "400");
  103. header_result.put("desc", resultErrorMsg+"重复推送,采购单号已存在!");
  104. result.put("header", header_result);
  105. return result;
  106. }
  107. }else{
  108. int count = baseDao.getCount("select * from PurchaseMainXM where PURORD_NUM='" + purord_num + "'");
  109. if (count == 0){
  110. //更新
  111. header_result.put("code", "400");
  112. header_result.put("desc", resultErrorMsg+"采购单号不存在,不能执行更新操作!");
  113. result.put("header", header_result);
  114. return result;
  115. }else{
  116. //更新
  117. header_result.put("code", "200");
  118. header_result.put("desc", resultSuccessMsg+"执行更新操作中!");
  119. result.put("header", header_result);
  120. return result;
  121. }
  122. }
  123. header_result.put("code", "200");
  124. header_result.put("desc", resultSuccessMsg);
  125. result.put("header", header_result);
  126. }else{
  127. header_result.put("code", "400");
  128. header_result.put("desc", resultErrorMsg+"body数据不存在!");
  129. result.put("header", header_result);
  130. return result;
  131. }
  132. }catch (Exception e){
  133. logger.info("同步收料单异常信息:"+body);
  134. header_result.put("code", "400");
  135. header_result.put("desc", resultErrorMsg+"解析body失败!");
  136. result.put("header", header_result);
  137. return result;
  138. }
  139. }else{
  140. header_result.put("code", "400");
  141. header_result.put("desc", resultErrorMsg+"身份验证失败!");
  142. result.put("header", header_result);
  143. return result;
  144. }
  145. }catch (Exception e){
  146. logger.info("同步收料单异常信息:"+e.getMessage());
  147. header_result.put("code", "400");
  148. header_result.put("desc", resultErrorMsg+"未知错误!");
  149. result.put("header", header_result);
  150. return result;
  151. }
  152. return result;
  153. }
  154. @Override
  155. public void confirmPurchase(String id) {
  156. Map<String, Object> data = new HashMap<>();
  157. UUID uuid = UUID.randomUUID();
  158. ConfirmPurchase confirmPurchase = new ConfirmPurchase();
  159. confirmPurchase.setSYSTEMID("SRM");
  160. confirmPurchase.setGUID(uuid.toString().toUpperCase());
  161. SqlRowList rs = baseDao.queryForRowSet("select pu_code from purchase where pu_id=" + id);
  162. // 获取当前日期
  163. Date currentDate = new Date();
  164. // 创建SimpleDateFormat对象,指定格式
  165. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  166. SimpleDateFormat hhmmss = new SimpleDateFormat("yyyyMMddHHMMSS");
  167. if (rs.next()){
  168. String pu_code = rs.getGeneralString("pu_code");
  169. confirmPurchase.setPURORD_NUM(pu_code);
  170. confirmPurchase.setCONFIRM_STATUS("B");
  171. confirmPurchase.setCONFIRM_DATE(sdf.format(currentDate));
  172. confirmPurchase.setCONFIRM_TIME(hhmmss.format(currentDate));
  173. confirmPurchase.setSUPPLIER_CODE("108207");
  174. data.put("data", confirmPurchase);
  175. EDIX5JsonHttpClient edix5JsonHttpClient = new EDIX5JsonHttpClient(xmediConfiguration.getX5appid(), xmediConfiguration.getX5appkey(), xmediConfiguration.getX5confirmUrl());
  176. edix5JsonHttpClient.post(data, xmediConfiguration, baseDao, "ConfirmPurchase");
  177. }
  178. }
  179. @Override
  180. public Map<String, Object> closePurchase(String data) {
  181. Map<String, Object> result = new HashMap<>();
  182. Map<String, Object> header_result = new HashMap<>();
  183. Map<String, Object> body_result = new HashMap<>();
  184. Map<String, Object> it_return_result = new HashMap<>();
  185. String resultSuccessMsg = "";
  186. String resultErrorMsg = "";
  187. String sign = null;
  188. String body = null;
  189. try {
  190. ObjectMapper objectMapper = new ObjectMapper();
  191. //String decode = URLDecoder.decode(data, StandardCharsets.UTF_8.toString());
  192. String jsonString = X5StringUtils.decodeBase64(data);
  193. Map<String, Object> map = objectMapper.readValue(jsonString, Map.class);
  194. if(map.size()>0 && map.get("header")!=null ){
  195. Map<String, Object> header_map = (Map<String, Object>) map.get("header");
  196. sign = header_map.get("sign") == null ? "" : header_map.get("sign").toString();
  197. }
  198. boolean checkSign = X5StringUtils.checkSign(sign, "test", jsonString, "218A05A252469F5A62B0B3204F669E1D");
  199. if(checkSign || true){
  200. try {
  201. if(map.get("body")!=null){
  202. String item_guid = null;
  203. String purord_item_num = null;
  204. body = map.get("body") == null ? "" : map.get("body").toString();
  205. PurchaseCloseMain purchaseCloseMain = objectMapper.readValue(body, PurchaseCloseMain.class);
  206. String purord_num = purchaseCloseMain.getPURORD_NUM();
  207. List<PurchaseCloseItem> et_close_item1 = purchaseCloseMain.getET_CLOSE_ITEM();
  208. if(et_close_item1.size()>0){
  209. purord_item_num = et_close_item1.get(0).getPURORD_ITEM_NUM();
  210. }
  211. String guid = purchaseCloseMain.getGUID();
  212. resultSuccessMsg="采购订单:"+purord_num+",行号:"+purord_item_num+"执行成功,具体结果请查看IT_RETURN反馈明细表";
  213. resultErrorMsg="采购订单:"+purord_num+",行号:"+purord_item_num+"执行失败,";
  214. it_return_result.put("ITEM_GUID",guid);
  215. it_return_result.put("PURORD_NUM",purord_num);
  216. it_return_result.put("PURORD_ITEM_NUM",purord_item_num);
  217. it_return_result.put("MSG_TYPE","S");
  218. it_return_result.put("MESSAGE","处理成功");
  219. body_result.put("IT_RETURN",it_return_result);
  220. int count = baseDao.getCount("select * from PurchaseMainXM where PURORD_NUM='" + purord_num + "'");
  221. if (count > 0){
  222. //主表
  223. Map<String, Object> purchaseCloseMain_map = ObjectToMapConverter.objectToMap(purchaseCloseMain);
  224. purchaseCloseMain_map.remove("ET_CLOSE_ITEM");
  225. purchaseCloseMain_map.put("pcxid", 0);
  226. baseDao.execute(SqlUtil.getInsertSql(purchaseCloseMain_map,"purchaseCloseMainXM","pcxid"));
  227. Object pcxid = baseDao.getFieldDataByCondition("purchaseCloseMainXM", "pcxid", "GUID='" + purchaseCloseMain_map.get("GUID")+"'");
  228. //从表
  229. List<PurchaseCloseItem> et_close_item = purchaseCloseMain.getET_CLOSE_ITEM();
  230. for (PurchaseCloseItem purchaseCloseItem:et_close_item) {
  231. //List<String> ItemSqls = new ArrayList<>();
  232. Map<String, Object> purchaseCloseItem_map = ObjectToMapConverter.objectToMap(purchaseCloseItem);
  233. purchaseCloseItem_map.remove("ET_ITEM_AMOUNT");
  234. purchaseCloseItem_map.put("pcixid",0);
  235. purchaseCloseItem_map.put("pcixpcxid",pcxid);
  236. String insertItemSql = SqlUtil.getInsertSql(purchaseCloseItem_map, "PurchaseCloseItemXM", "pcixid");
  237. //ItemSqls.add(insertItemSql);
  238. baseDao.execute(insertItemSql);
  239. item_guid = purchaseCloseItem.getITEM_GUID();
  240. }
  241. int DEAL_STATUS = baseDao.getCount("select * from PurchaseCloseItemXM where DEAL_STATUS=-1 and ITEM_GUID='" + item_guid + "'");
  242. if(DEAL_STATUS == 0){
  243. //关闭订单逻辑
  244. }else{
  245. header_result.put("code", "400");
  246. header_result.put("desc", resultErrorMsg+"重复推送!");
  247. result.put("header", header_result);
  248. return result;
  249. }
  250. }else{
  251. header_result.put("code", "400");
  252. header_result.put("desc", resultErrorMsg+"采购单号不存在!");
  253. result.put("header", header_result);
  254. return result;
  255. }
  256. header_result.put("code", "200");
  257. header_result.put("desc", resultSuccessMsg);
  258. result.put("header", header_result);
  259. result.put("body",body_result);
  260. }else{
  261. header_result.put("code", "400");
  262. header_result.put("desc", resultErrorMsg+"body数据不存在!");
  263. result.put("header", header_result);
  264. return result;
  265. }
  266. }catch (Exception e){
  267. logger.info("同步收料单异常信息:"+e);
  268. logger.info("同步收料单异常信息:"+body);
  269. header_result.put("code", "400");
  270. header_result.put("desc", resultErrorMsg+"解析body失败!");
  271. result.put("header", header_result);
  272. return result;
  273. }
  274. }else{
  275. header_result.put("code", "400");
  276. header_result.put("desc", resultErrorMsg+"身份验证失败!");
  277. result.put("header", header_result);
  278. return result;
  279. }
  280. }catch (Exception e){
  281. logger.info("同步收料单异常信息:"+e.getMessage());
  282. header_result.put("code", "400");
  283. header_result.put("desc", resultErrorMsg+"未知错误!");
  284. result.put("header", header_result);
  285. return result;
  286. }
  287. return result;
  288. }
  289. @Override
  290. public Map<String, Object> deliInstruction(String data) {
  291. Map<String, Object> result = new HashMap<>();
  292. Map<String, Object> header_result = new HashMap<>();
  293. String resultSuccessMsg = "";
  294. String resultErrorMsg = "";
  295. String sign = null;
  296. String body = null;
  297. try {
  298. ObjectMapper objectMapper = new ObjectMapper();
  299. String decode = URLDecoder.decode(data, StandardCharsets.UTF_8.toString());
  300. String jsonString = X5StringUtils.decodeBase64(decode);
  301. Map<String, Object> map = objectMapper.readValue(jsonString, Map.class);
  302. if(map.size()>0 && map.get("header")!=null ){
  303. Map<String, Object> header_map = (Map<String, Object>) map.get("header");
  304. sign = header_map.get("sign") == null ? "" : header_map.get("sign").toString();
  305. }
  306. boolean checkSign = X5StringUtils.checkSign(sign, "test", jsonString, "218A05A252469F5A62B0B3204F669E1D");
  307. if(checkSign || true){
  308. try {
  309. if(map.get("body")!=null){
  310. body = map.get("body") == null ? "" : map.get("body").toString();
  311. DeliInstruction deliInstruction = objectMapper.readValue(body, DeliInstruction.class);
  312. String deli_instru_no = deliInstruction.getDELI_INSTRU_NO();
  313. String guid = deliInstruction.getGUID();
  314. resultSuccessMsg="送货指令:"+deli_instru_no+"处理成功";
  315. resultErrorMsg="送货指令:"+deli_instru_no+"处理失败,";
  316. String operation_type = deliInstruction.getOPERATION_TYPE();
  317. if("I".equals(operation_type) || "U".equals(operation_type)){
  318. int count = baseDao.getCount("select * from deliInstructionXM where GUID='" + guid + "'");
  319. if (count == 0){
  320. //主表
  321. Map<String, Object> deliInstruction_map = ObjectToMapConverter.objectToMap(deliInstruction);
  322. deliInstruction_map.remove("ET_ITEM");
  323. deliInstruction_map.put("DI_ID", 0);
  324. baseDao.execute(SqlUtil.getInsertSql(deliInstruction_map,"deliInstructionXM","DI_ID"));
  325. Object DI_ID = baseDao.getFieldDataByCondition("deliInstructionXM", "DI_ID", "GUID='" + guid+"'");
  326. //从表
  327. List<DeliInstructionItem> et_item = deliInstruction.getET_ITEM();
  328. for (DeliInstructionItem deliInstructionItem:et_item) {
  329. //List<String> ItemSqls = new ArrayList<>();
  330. Map<String, Object> deliInstructionItem_map = ObjectToMapConverter.objectToMap(deliInstructionItem);
  331. deliInstructionItem_map.remove("ET_ITEM_AMOUNT");
  332. deliInstructionItem_map.put("DID_ID",0);
  333. deliInstructionItem_map.put("DID_DIID",DI_ID);
  334. String insertItemSql = SqlUtil.getInsertSql(deliInstructionItem_map, "deliInstructionDetailXM", "DID_ID");
  335. baseDao.execute(insertItemSql);
  336. }
  337. }else{
  338. //更新
  339. header_result.put("code", "400");
  340. header_result.put("desc", resultErrorMsg+"具体报错原因:重复推送,GUID已存在!");
  341. result.put("header", header_result);
  342. return result;
  343. }
  344. }else{
  345. int count = baseDao.getCount("select * from deliInstructionXM where GUID='" + guid + "'");
  346. if (count == 0){
  347. //更新
  348. header_result.put("code", "400");
  349. header_result.put("desc", resultErrorMsg+"具体报错原因:采购单号不存在,不能执行更新操作!");
  350. result.put("header", header_result);
  351. return result;
  352. }else{
  353. //更新
  354. header_result.put("code", "200");
  355. header_result.put("desc", resultSuccessMsg+"执行更新操作中!");
  356. result.put("header", header_result);
  357. return result;
  358. }
  359. }
  360. header_result.put("code", "200");
  361. header_result.put("desc", resultSuccessMsg);
  362. result.put("header", header_result);
  363. }else{
  364. header_result.put("code", "400");
  365. header_result.put("desc", resultErrorMsg+"具体报错原因:body数据不存在!");
  366. result.put("header", header_result);
  367. return result;
  368. }
  369. }catch (Exception e){
  370. logger.info("同步收料单异常信息:"+body);
  371. header_result.put("code", "400");
  372. header_result.put("desc", resultErrorMsg+"具体报错原因:解析body失败!");
  373. result.put("header", header_result);
  374. return result;
  375. }
  376. }else{
  377. header_result.put("code", "400");
  378. header_result.put("desc", resultErrorMsg+"具体报错原因:身份验证失败!");
  379. result.put("header", header_result);
  380. return result;
  381. }
  382. }catch (Exception e){
  383. logger.info("同步收料单异常信息:"+e.getMessage());
  384. header_result.put("code", "400");
  385. header_result.put("desc", resultErrorMsg+"具体报错原因:JSON解析失败!!");
  386. result.put("header", header_result);
  387. return result;
  388. }
  389. return result;
  390. }
  391. public static String unescapeJsonWithJackson(String jsonString) {
  392. try {
  393. ObjectMapper mapper = new ObjectMapper();
  394. // 配置解析器允许特殊字符
  395. mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
  396. // 方法1:使用readTree解析后转为字符串
  397. String unescaped = mapper.readTree(jsonString).toString();
  398. return unescaped;
  399. } catch (JsonProcessingException e) {
  400. // 如果解析失败,可能是字符串本身,尝试使用TextNode
  401. try {
  402. ObjectMapper mapper = new ObjectMapper();
  403. TextNode textNode = mapper.readValue("\"" + jsonString + "\"", TextNode.class);
  404. return textNode.asText();
  405. } catch (Exception ex) {
  406. return jsonString;
  407. }
  408. } catch (Exception e) {
  409. return jsonString;
  410. }
  411. }
  412. }