From 9126e6315288e1ea50e74c70b099974522d6b172 Mon Sep 17 00:00:00 2001
From: 1 <1>
Date: 星期一, 08 十二月 2025 09:17:11 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/jshdasrs' into jshdasrs
---
src/main/java/com/zy/asrs/task/kingdee/handler/SaveOrderSyncHandler.java | 286 ++++++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 212 insertions(+), 74 deletions(-)
diff --git a/src/main/java/com/zy/asrs/task/kingdee/handler/SaveOrderSyncHandler.java b/src/main/java/com/zy/asrs/task/kingdee/handler/SaveOrderSyncHandler.java
index 88134a3..809b938 100644
--- a/src/main/java/com/zy/asrs/task/kingdee/handler/SaveOrderSyncHandler.java
+++ b/src/main/java/com/zy/asrs/task/kingdee/handler/SaveOrderSyncHandler.java
@@ -4,13 +4,16 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
-import com.zy.asrs.entity.DocType;
-import com.zy.asrs.entity.Order;
+import com.zy.asrs.entity.*;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.OrderService;
+import com.zy.asrs.service.impl.ErpSecretServiceImpl;
+import com.zy.asrs.service.impl.OrderDetlPakinServiceImpl;
+import com.zy.asrs.service.impl.OrderDetlServiceImpl;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
+import com.zy.asrs.utils.OrderInAndOutUtil;
import com.zy.common.utils.HttpHandler;
import com.zy.erp.kingdee.enums.KingDeeUtilType;
import lombok.extern.slf4j.Slf4j;
@@ -19,8 +22,8 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import java.util.HashMap;
-import java.util.Set;
+import java.text.SimpleDateFormat;
+import java.util.*;
/**
* Created by Monkey D. Luffy on 2023.10.21
@@ -29,12 +32,10 @@
@Service
public class SaveOrderSyncHandler extends AbstractHandler<String> {
@Value("${erp.address.URL}")
- //绔彛
private String URL;
- @Value("${erp.address.outaddressSave}")
- //瀹℃牳鍦板潃
- private String outaddressSave;
+ @Value("${erp.address.imPurinbillAdd}")
+ private String imPurinbillAdd;
@Autowired
private OrderService orderService;
@@ -44,90 +45,227 @@
private DocTypeService docTypeService;
@Autowired
private LoginAuthenticationHandler loginAuthenticationHandler;
+ @Autowired
+ private ErpSecretServiceImpl erpSecretService;
+ @Autowired
+ private OrderDetlPakinServiceImpl orderDetlPakinService;
+ @Autowired
+ private OrderDetlServiceImpl orderDetlService;
+ @Value("${erp.login.accountId}")
+ private String accountId;
+ @Value("${erp.login.xAcfwIdentity}")
+ private String xAcfwIdentity;
+ String path;
@Transactional
public ReturnT<String> start(Order order) {
- //鐧诲綍閲戣澏r
- ReturnT<String> start = loginAuthenticationHandler.start();
+ SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
+
+ // 鑾峰彇 Token
+ ErpSecret erpSecret = erpSecretService.selectOne(new EntityWrapper<ErpSecret>().eq("account_id", accountId));
+
+ // 鑾峰彇 DocType
DocType docType = docTypeService.selectById(order.getDocType());
- if (null == docType) {
- return SUCCESS;
- }
+ if (docType == null) return SUCCESS;
+
+ // 鑾峰彇 KingDee 绫诲瀷
KingDeeUtilType kingDeeUtilType = KingDeeUtilType.get(docType.getDocName());
- //鏉′欢鎷兼帴
- JSONObject jsonObject = new JSONObject();
- jsonObject.put("Numbers",order.getOrderNo());
- JSONObject jsonObject1 = new JSONObject();
- jsonObject1.put("data", jsonObject);
- jsonObject1.put("FormId",kingDeeUtilType.correspondingFormId);
- String add = jsonObject1.toJSONString();
- //涓婃姤
+ // 鏋勫缓璇锋眰鍙傛暟
+ JSONObject add = buildRequestParams(order, kingDeeUtilType, sdf1, sdf2);
+ if (add == null) return FAIL.setMsg("璇锋眰鍙傛暟鏋勫缓澶辫触");
+
+ // 鍙戦�佽姹傚苟澶勭悊鍝嶅簲
+ return sendRequestAndProcessResponse(order, erpSecret, add);
+ }
+
+ private JSONObject buildRequestParams(Order order, KingDeeUtilType kingDeeUtilType, SimpleDateFormat sdf1, SimpleDateFormat sdf2) {
+ List<OrderDetl> orderDetlList = orderDetlService.selectList(new EntityWrapper<OrderDetl>().eq("order_no",order.getOrderNo()));
+
+ switch (kingDeeUtilType.formId) {
+ case "PUR_RECEIVEBIll": // 杩涗粨閫氱煡鍗�
+ path = imPurinbillAdd;
+ JSONArray billentryLkArray = new JSONArray();
+ JSONArray billentryArray = new JSONArray(); // 鐢ㄤ簬瀛樺偍 billentry 瀵硅薄
+ String suppCode = null; // 渚涘簲鍟�
+ String boxType2 = null; // 璐т富/璐ф簮
+
+ // 閬嶅巻璁㈠崟璇︽儏
+ for (OrderDetl orderDetl : orderDetlList) {
+ suppCode = orderDetl.getSuppCode();
+ boxType2 = orderDetl.getBoxType2();
+ if (orderDetl.getQty() == 0) {
+ continue;
+ }
+
+ // 鍒涘缓 billentry_lk 瀵硅薄
+ JSONObject billentryLk = new JSONObject()
+ .fluentPut("id", Long.parseLong(orderDetl.getThreeCode()))
+ .fluentPut("seq", orderDetl.getLineNumber())
+ .fluentPut("billentry_lk_stableid", 677270092232273922L)
+ .fluentPut("billentry_lk_sbillid", Long.parseLong(order.getItemName())) // 涓诲崟ID
+ .fluentPut("billentry_lk_sid", Long.parseLong(orderDetl.getThreeCode())) // 鏄庣粏ID
+ .fluentPut("billentry_lk_baseqty_old", orderDetl.getErpAnfme()) // ERP鏁伴噺
+ .fluentPut("billentry_lk_baseqty", orderDetl.getQty()); // 浣滀笟鏁伴噺
+ billentryLkArray.add(billentryLk);
+ // 鍒涘缓 billentry 瀵硅薄锛屽~鍏呯己澶辩殑瀛楁
+ JSONObject billentry = new JSONObject()
+ .fluentPut("id", Long.parseLong(orderDetl.getThreeCode()))
+ .fluentPut("warehouse_number", orderDetl.getManu()) // 浠撳簱缂栧彿
+ .fluentPut("invstatus_number", "110") // 搴撳瓨鐘舵��
+ .fluentPut("invtype_number", "110") // 搴撳瓨绫诲瀷
+ .fluentPut("outinvstatus_number", "110")
+ .fluentPut("linetype_number", "010") // 琛屽彿绫诲瀷
+ .fluentPut("qty", orderDetl.getQty()) // 鏁伴噺
+ .fluentPut("material_number", orderDetl.getMatnr()) // 鐗╂枡缂栧彿
+ .fluentPut("billentry_lk", billentryLkArray); // 灏� billentry_lk 娣诲姞鍒� billentry
+
+ billentryArray.add(billentry);
+ }
+ Date now = new Date();
+ // 鐢熸垚 INR 鐩稿叧璇锋眰鍙傛暟
+ return new JSONObject()
+ .fluentPut("data", new JSONArray(Arrays.asList(
+ new JSONObject()
+ .fluentPut("billno", order.getOrderNo())
+ .fluentPut("trdbillno", UUID.randomUUID().toString().replace("-", ""))
+ .fluentPut("billtype_number", "im_PurInBill_STD_BT_S")
+ .fluentPut("biztime", sdf1.format(now))
+ .fluentPut("exratedate", sdf1.format(now))
+ .fluentPut("bizorg_number", boxType2)
+ .fluentPut("biztype_number", "110") // 璐т富/璐ф簮
+ .fluentPut("org_number", boxType2) // 璐т富/璐ф簮
+ .fluentPut("paymode", "CREDIT")
+ .fluentPut("invscheme_number", "110")
+ .fluentPut("billtype_number", "im_PurInBill_STD_BT_S")
+ .fluentPut("supplier_number", suppCode) // 渚涘簲鍟嗙紪鍙�
+ .fluentPut("billno", order.getOrderNo())
+ .fluentPut("billentry", billentryArray) // 灏� billentry 鏁扮粍娣诲姞鍒拌姹傚弬鏁�
+ )));
+
+ default:
+ // 榛樿澶勭悊锛氬彲浠ユ姏鍑哄紓甯告垨杩斿洖绌哄璞�
+ throw new IllegalArgumentException("Unsupported formId: " + kingDeeUtilType.formId);
+ }
+ }
+
+
+ private ReturnT<String> sendRequestAndProcessResponse(Order order, ErpSecret erpSecret, JSONObject add) {
String response = "";
boolean success = false;
+
try {
- //鑾峰彇Cookie鍊�
- HashMap<String, Object> headers = new HashMap<>();
- headers.put("Cookie", start.getContent());
+ // 璁剧疆璇锋眰澶�
+ HashMap<String, Object> headers = buildRequestHeaders(erpSecret);
+
+ // 鍙戦�佽姹傦紝灏� JSONObject 杞崲涓� String
response = new HttpHandler.Builder()
.setHeaders(headers)
.setUri(URL)
- .setPath(outaddressSave)
- .setJson(add)
+ .setPath(path)
+ .setJson(add.toJSONString()) // 灏� JSONObject 杞崲涓� String
.build()
.doPost();
- JSONObject data = JSON.parseObject(response);
- Object IsSuccess = findValueByKey(JSON.parseObject(response), "IsSuccess");
- String bool=IsSuccess.toString();
- //淇濆瓨瀹屾垚鍘熻鍗�8杞�6
- if(bool.equals("true")){
- success = true;
- order.setSettle(6L);
- orderService.update(order,new EntityWrapper<Order>().eq("order_no",order.getOrderNo()));
+
+ // 瑙f瀽鍝嶅簲
+ JSONObject jsonResponse = JSON.parseObject(response);
+
+ // 鍒ゆ柇鏄惁鍥犱负 token 杩囨湡 (errorCode = 401)
+ if ("401".equals(jsonResponse.getString("errorCode"))) {
+ log.error("璁よ瘉澶辫触锛屽皾璇曢噸鏂拌幏鍙� Token");
+ loginAuthenticationHandler.start(); // 鍒锋柊 token
+ // 閲嶆柊鑾峰彇鏂扮殑 token
+ erpSecret = erpSecretService.selectOne(new EntityWrapper<ErpSecret>().eq("account_id", accountId)); // 閲嶆柊浠庢暟鎹簱鑾峰彇鏂扮殑 token
+ // 浣跨敤鏂扮殑 token 閲嶈瘯璇锋眰
+ headers.put("accesstoken", erpSecret.getAccessToken());
+ response = new HttpHandler.Builder()
+ .setHeaders(headers)
+ .setUri(URL)
+ .setPath(path)
+ .setJson(add.toJSONString()) // 灏� JSONObject 杞崲涓� String
+ .build()
+ .doPost();
}
- } catch (Exception e) {
- log.error("fail", e);
-// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- return FAIL.setMsg(e.getMessage());
- } finally {
- try {
- // 淇濆瓨鎺ュ彛鏃ュ織
- apiLogService.save(
- "淇濆瓨",
- URL+ outaddressSave,
- null,
- "127.0.0.1",
- add,
- response,
- success
- );
- } catch (Exception e) {
- log.error("", e);
- }
- }
- return SUCCESS;
- }
- public static Object findValueByKey(JSONObject json, String key) {
- Set<String> keySet = json.keySet();
- for (String k : keySet) {
- Object v = json.get(k);
- if (k.equals(key)) {
- return v;
- } else if (v instanceof JSONArray) {
- int size = ((JSONArray) v).size();
- for (int i = 0; i <= size - 1; i++) {
- Object result = findValueByKey((JSONObject) ((JSONArray) v).get(i), key);
- if (result != null){
- return result;
+
+ // 瑙f瀽杩斿洖鐨勫搷搴�
+ JSONObject data = jsonResponse.getJSONObject("data");
+ String errorCode = jsonResponse.getString("errorCode");
+ boolean status = jsonResponse.getBooleanValue("status");
+
+ // 妫�鏌ユ帴鍙h皟鐢ㄧ殑鏁翠綋鐘舵��
+ if ("0".equals(errorCode) && status) {
+ // 鑾峰彇鎴愬姛涓庡け璐ョ殑鏁伴噺
+ int successCount = data.getInteger("successCount");
+ int failCount = data.getInteger("failCount");
+
+ if (failCount == 0) {
+ success = true;
+ log.info("鎺ュ彛璋冪敤鎴愬姛锛屾垚鍔熺殑鎿嶄綔鏁伴噺: {}", successCount);
+ // 鑾峰彇杩斿洖鐨勫崟鎹彿鍜孖D
+ JSONArray resultArray = data.getJSONArray("result");
+ for (int i = 0; i < resultArray.size(); i++) {
+ JSONObject resultItem = resultArray.getJSONObject(i);
+ String billNo = resultItem.getString("number"); // 鑾峰彇杩斿洖鐨勫崟鎹彿
+ String billId = resultItem.getString("id"); // 鑾峰彇杩斿洖鐨処D
+
+ // 鍒ゆ柇杩斿洖鐨勫崟鎹彿涓庤鍗曞彿鏄惁涓�鑷�
+ if (billNo != null && billNo.equals(order.getOrderNo())) {
+ // 濡傛灉涓�鑷达紝璁剧疆璁㈠崟鐨� number
+ order.setNumber(billId);
+ log.info("璁㈠崟鍙� {} 涓庤繑鍥炵殑鍗曟嵁鍙峰尮閰嶏紝璁剧疆璁㈠崟 ID 涓� {}", order.getOrderNo(), billId);
+ }
+ }
+ } else {
+ log.error("鎺ュ彛璋冪敤澶辫触锛屽け璐ョ殑鎿嶄綔鏁伴噺: {}", failCount);
+ // 濡傛灉鏈夊け璐ョ殑鍗曟嵁锛岄亶鍘� result 鏁扮粍鏌ョ湅澶辫触鐨勮缁嗕俊鎭�
+ JSONArray resultArray = data.getJSONArray("result");
+ for (int i = 0; i < resultArray.size(); i++) {
+ JSONObject resultItem = resultArray.getJSONObject(i);
+ if (!resultItem.getBoolean("billStatus")) {
+ // 鍗曟嵁澶勭悊澶辫触锛岃褰曢敊璇俊鎭�
+ String billNo = resultItem.getString("billno");
+ JSONArray errors = resultItem.getJSONArray("errors");
+ log.error("鍗曟嵁鍙�: {}, 閿欒淇℃伅: {}", billNo, errors);
+ }
}
}
- } else if (v instanceof JSONObject){
- Object result = findValueByKey((JSONObject) v, key);
- if (result != null){
- return result;
- }
+ order.setSettle(10L); // 鏇存柊鐘舵�佷负 "宸蹭笂鎶�"
+ orderService.updateById(order);
+ } else {
+ log.error("鎺ュ彛璋冪敤澶辫触锛岄敊璇俊鎭�: {}", jsonResponse.getString("message"));
}
+ } catch (Exception e) {
+ log.error("璇锋眰澶辫触", e);
+ return FAIL.setMsg(e.getMessage());
+ } finally {
+ // 淇濆瓨鎺ュ彛鏃ュ織
+ saveApiLog(add, response, success);
}
- return null;
+
+ return success ? SUCCESS : FAIL;
+ }
+
+
+ private HashMap<String, Object> buildRequestHeaders(ErpSecret erpSecret) {
+ HashMap<String, Object> headers = new HashMap<>();
+ headers.put("accesstoken", erpSecret.getAccessToken());
+ headers.put("x-acgw-identity", xAcfwIdentity); // 鑷畾涔夎姹傚ご
+ return headers;
+ }
+ private void saveApiLog(JSONObject add, String response, boolean success) {
+ try {
+ apiLogService.save(
+ "杩涗粨閫氱煡鍗曚笂鎶ユ柊澧�",
+ URL + path,
+ null,
+ "127.0.0.1",
+ add.toJSONString(),
+ response,
+ success
+ );
+ } catch (Exception e) {
+ log.error("鎺ュ彛鏃ュ織淇濆瓨澶辫触", e);
+ }
}
}
--
Gitblit v1.9.1