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 |  285 ++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 210 insertions(+), 75 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 65de7a7..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,11 +4,13 @@
 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;
@@ -20,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
@@ -30,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;
@@ -45,92 +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()));
-                OrderInAndOutUtil.updateOrder(order.getPakinPakoutStatus$(),order.getId(), 6L, null);
 
+            // 瑙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