From 264a479aa1ad16818110e9f9d833bbf02e298f47 Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期一, 16 三月 2026 10:06:28 +0800
Subject: [PATCH] #lfderp接口开发

---
 src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java |  965 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 939 insertions(+), 26 deletions(-)

diff --git a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
index 762ed92..783b114 100644
--- a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -5,24 +5,35 @@
 import com.core.common.DateUtils;
 import com.core.common.SnowflakeIdWorker;
 import com.core.exception.CoolException;
-import com.zy.asrs.entity.DocType;
-import com.zy.asrs.entity.Mat;
-import com.zy.asrs.entity.Order;
-import com.zy.asrs.entity.OrderDetl;
-import com.zy.asrs.entity.param.OpenOrderCompleteParam;
-import com.zy.asrs.entity.param.OpenOrderPakinParam;
+import com.zy.asrs.entity.*;
+import com.zy.asrs.entity.param.*;
 import com.zy.asrs.entity.result.OpenOrderCompeteResult;
 import com.zy.asrs.entity.result.StockVo;
+import com.zy.asrs.mapper.TagMapper;
 import com.zy.asrs.service.*;
+import com.zy.asrs.service.ErpMatService;
+import com.zy.asrs.service.ErpOrderService;
+import com.zy.asrs.service.ErpOrderDetlService;
+import com.zy.asrs.utils.MatUtils;
 import com.zy.common.model.DetlDto;
+import com.zy.common.utils.HttpHandler;
+import com.zy.common.utils.NodeUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.TransactionDefinition;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionTemplate;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Created by vincent on 2022/4/9
@@ -43,7 +54,22 @@
     private MatService matService;
     @Autowired
     private LocDetlService locDetlService;
-
+    @Autowired
+    private PackService packService;
+    @Autowired
+    private TagService tagService;
+    @Autowired
+    private TagMapper tagMapper;
+    @Autowired
+    private ErpMatService erpMatService;
+    @Autowired
+    private ErpOrderService erpOrderService;
+    @Autowired
+    private ErpOrderDetlService erpOrderDetlService;
+    @Autowired
+    private ApiLogService apiLogService;
+    @Autowired
+    private PlatformTransactionManager transactionManager;
     @Override
     @Transactional
     public void pakinOrderCreate(OpenOrderPakinParam param) {
@@ -113,6 +139,8 @@
             }
             OrderDetl orderDetl = new OrderDetl();
             orderDetl.sync(mat);
+            orderDetl.setBatch(detlDto.getBatch());
+            orderDetl.setAnfme(detlDto.getAnfme());
             orderDetl.setOrderId(order.getId());
             orderDetl.setOrderNo(order.getOrderNo());
             orderDetl.setCreateBy(9527L);
@@ -131,25 +159,7 @@
     @Transactional
     public List<OpenOrderCompeteResult> pakinOrderComplete(OpenOrderCompleteParam param) {
         List<OpenOrderCompeteResult> results = new ArrayList<>();
-        if (Cools.isEmpty(param.getOrderNo())) {
-            // 鎵�鏈夎鍗�
-            List<Order> orders = orderService.selectList(new EntityWrapper<Order>().eq("settle", 4L));
-            for (Order order : orders) {
-                OpenOrderCompeteResult result = new OpenOrderCompeteResult();
-                results.add(result);
-                result.setOrderNo(order.getOrderNo());
-                result.setOrderTime(order.getOrderTime());
-                result.setOrderType(order.getDocType$());
-                List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
-                for (OrderDetl orderDetl : orderDetls) {
-                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
-                }
-                // 淇敼璁㈠崟鐘舵�� 4.瀹屾垚 ===>> 6.宸蹭笂鎶�
-                if (!orderService.updateSettle(order.getId(), 6L, null)) {
-                    throw new CoolException("鏈嶅姟鍣ㄥ唴閮ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
-                }
-            }
-        } else {
+        if (!Cools.isEmpty(param) && !Cools.isEmpty(param.getOrderNo())) {
             // 鎸囧畾璁㈠崟
             Order order = orderService.selectByNo(param.getOrderNo());
             if (null != order) {
@@ -169,6 +179,158 @@
                     }
                 }
             }
+        } else {
+            // 鎵�鏈夎鍗�
+            List<Order> orders = orderService.selectList(new EntityWrapper<Order>().eq("settle", 4L));
+            for (Order order : orders) {
+                OpenOrderCompeteResult result = new OpenOrderCompeteResult();
+                results.add(result);
+                result.setOrderNo(order.getOrderNo());
+                result.setOrderTime(order.getOrderTime());
+                result.setOrderType(order.getDocType$());
+                List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
+                for (OrderDetl orderDetl : orderDetls) {
+                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
+                }
+                // 淇敼璁㈠崟鐘舵�� 4.瀹屾垚 ===>> 6.宸蹭笂鎶�
+                if (!orderService.updateSettle(order.getId(), 6L, null)) {
+                    throw new CoolException("鏈嶅姟鍣ㄥ唴閮ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
+                }
+            }
+        }
+        return results;
+    }
+
+    @Override
+    @Transactional
+    public void pakoutOrderCreate(OpenOrderPakoutParam param) {
+        Order order = orderService.selectByNo(param.getOrderNo());
+        // 濡傛灉鍗曟嵁涓嶅瓨鍦ㄥ垯娣诲姞锛涘鏋滃崟鎹瓨鍦紝浣滀笟涓棤娉曚慨鏀癸紝鍙嶄箣鍒欎慨鏀瑰崟鎹�
+        if (!Cools.isEmpty(order)) {
+            if (order.getSettle() > 1L) {
+                throw new CoolException(param.getOrderNo() + "姝e湪鍑哄簱锛屾棤娉曚慨鏀瑰崟鎹�");
+            }
+            orderService.remove(order.getId());
+        }
+        DocType docType = docTypeService.selectOrAdd(param.getOrderType(), Boolean.FALSE);
+        Date now = new Date();
+        // 鍗曟嵁涓绘。
+        order = new Order(
+                String.valueOf(snowflakeIdWorker.nextId()),    // 缂栧彿[闈炵┖]
+                param.getOrderNo(),    // 璁㈠崟缂栧彿
+                DateUtils.convert(now),    // 鍗曟嵁鏃ユ湡
+                docType.getDocId(),    // 鍗曟嵁绫诲瀷
+                null,    // 椤圭洰缂栧彿
+                null,    //
+                null,    // 璋冩嫧椤圭洰缂栧彿
+                null,    // 鍒濆绁ㄦ嵁鍙�
+                null,    // 绁ㄦ嵁鍙�
+                null,    // 瀹㈡埛缂栧彿
+                null,    // 瀹㈡埛
+                null,    // 鑱旂郴鏂瑰紡
+                null,    // 鎿嶄綔浜哄憳
+                null,    // 鍚堣閲戦
+                null,    // 浼樻儬鐜�
+                null,    // 浼樻儬閲戦
+                null,    // 閿�鍞垨閲囪喘璐圭敤鍚堣
+                null,    // 瀹炰粯閲戦
+                null,    // 浠樻绫诲瀷
+                null,    // 涓氬姟鍛�
+                null,    // 缁撶畻澶╂暟
+                null,    // 閭垂鏀粯绫诲瀷
+                null,    // 閭垂
+                null,    // 浠樻鏃堕棿
+                null,    // 鍙戣揣鏃堕棿
+                null,    // 鐗╂祦鍚嶇О
+                null,    // 鐗╂祦鍗曞彿
+                1L,    // 璁㈠崟鐘舵��
+                1,    // 鐘舵��
+                9527L,    // 娣诲姞浜哄憳
+                now,    // 娣诲姞鏃堕棿
+                9527L,    // 淇敼浜哄憳
+                now,    // 淇敼鏃堕棿
+                null    // 澶囨敞
+        );
+        if (!orderService.insert(order)) {
+            throw new CoolException("鐢熸垚鍗曟嵁涓绘。澶辫触锛岃鑱旂郴绠$悊鍛�");
+        }
+        // 鍗曟嵁鏄庣粏妗�
+        List<DetlDto> list = new ArrayList<>();
+        List<DetlDto> orderDetails = param.getOrderDetails();
+        for (DetlDto detail : orderDetails) {
+            DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(), detail.getAnfme());
+            if (DetlDto.has(list, dto)) {
+                DetlDto detlDto = DetlDto.find(list, dto.getMatnr(), dto.getBatch());
+                assert detlDto != null;
+                detlDto.setAnfme(detlDto.getAnfme() + detail.getAnfme());
+            } else {
+                list.add(dto);
+            }
+        }
+        for (DetlDto detlDto : list) {
+            Mat mat = matService.selectByMatnr(detlDto.getMatnr());
+            if (Cools.isEmpty(mat)) {
+                throw new CoolException(detlDto.getMatnr() + "缂栧彿鍟嗗搧妫�绱㈠け璐ワ紝璇峰厛娣诲姞鍟嗗搧");
+            }
+            OrderDetl orderDetl = new OrderDetl();
+            orderDetl.sync(mat);
+            orderDetl.setBatch(detlDto.getBatch());
+            orderDetl.setAnfme(detlDto.getAnfme());
+            orderDetl.setOrderId(order.getId());
+            orderDetl.setOrderNo(order.getOrderNo());
+            orderDetl.setCreateBy(9527L);
+            orderDetl.setCreateTime(now);
+            orderDetl.setUpdateBy(9527L);
+            orderDetl.setUpdateTime(now);
+            orderDetl.setStatus(1);
+            orderDetl.setQty(0.0D);
+            if (!orderDetlService.insert(orderDetl)) {
+                throw new CoolException("鐢熸垚鍗曟嵁鏄庣粏澶辫触锛岃鑱旂郴绠$悊鍛�");
+            }
+        }
+    }
+
+    @Override
+    public List<OpenOrderCompeteResult> pakoutOrderComplete(OpenOrderCompleteParam param) {
+        List<OpenOrderCompeteResult> results = new ArrayList<>();
+        if (!Cools.isEmpty(param) && !Cools.isEmpty(param.getOrderNo())) {
+            // 鎸囧畾璁㈠崟
+            Order order = orderService.selectByNo(param.getOrderNo());
+            if (null != order) {
+                OpenOrderCompeteResult result = new OpenOrderCompeteResult();
+                results.add(result);
+                result.setOrderNo(order.getOrderNo());
+                result.setOrderTime(order.getOrderTime());
+                result.setOrderType(order.getDocType$());
+                List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
+                for (OrderDetl orderDetl : orderDetls) {
+                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
+                }
+                if (order.getSettle() == 4L) {
+                    // 淇敼璁㈠崟鐘舵�� 4.瀹屾垚 ===>> 6.宸蹭笂鎶�
+                    if (!orderService.updateSettle(order.getId(), 6L, null)) {
+                        throw new CoolException("鏈嶅姟鍣ㄥ唴閮ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
+                    }
+                }
+            }
+        } else {
+            // 鎵�鏈夎鍗�
+            List<Order> orders = orderService.selectList(new EntityWrapper<Order>().eq("settle", 4L));
+            for (Order order : orders) {
+                OpenOrderCompeteResult result = new OpenOrderCompeteResult();
+                results.add(result);
+                result.setOrderNo(order.getOrderNo());
+                result.setOrderTime(order.getOrderTime());
+                result.setOrderType(order.getDocType$());
+                List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
+                for (OrderDetl orderDetl : orderDetls) {
+                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
+                }
+                // 淇敼璁㈠崟鐘舵�� 4.瀹屾垚 ===>> 6.宸蹭笂鎶�
+                if (!orderService.updateSettle(order.getId(), 6L, null)) {
+                    throw new CoolException("鏈嶅姟鍣ㄥ唴閮ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
+                }
+            }
         }
         return results;
     }
@@ -179,4 +341,755 @@
         return locDetlService.queryStockTotal();
     }
 
+    @Override
+    @Transactional
+    public void packageUp(PackParam param) {
+        if (Cools.isEmpty(param.getBarcode())) {
+            throw new CoolException("barcode涓嶈兘涓虹┖");
+        }
+        Mat analyse = MatUtils.analyseMat(param.getBarcode());
+        Pack pack = packService.selectByBarcode(param.getBarcode());
+        if (null != pack) {
+            throw new CoolException(param.getBarcode() + "閲嶅鎻愪氦");
+        }
+        Date now = new Date();
+        pack = new Pack(
+                param.getBarcode(),    // 鏉$爜[闈炵┖]
+                analyse.getMatnr(),    // 鍟嗗搧缂栧彿
+                analyse.getBarcode(),    // 搴忓垪鐮�
+                1L,    // 璁㈠崟鐘舵��
+                1,    // 鐘舵��
+                now,    // 娣诲姞鏃堕棿
+                null,    // 娣诲姞浜哄憳
+                now,    // 淇敼鏃堕棿
+                null,    // 淇敼浜哄憳
+                null    // 澶囨敞
+        );
+        if (!packService.insert(pack)) {
+            throw new CoolException("鏈嶅姟鍣ㄥ唴閮ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
+        }
+
+        Mat mat = matService.selectByMatnr(analyse.getMatnr());
+        if (mat == null) {
+            mat = new Mat();
+            // 鍒嗙被
+            Long tagId;
+            // 涓�绾у垎绫�
+            if (!Cools.isEmpty(param.getGroupCode()) && !Cools.isEmpty(param.getGroupName())) {
+                Tag priTag = tagService.selectByName(param.getGroupCode(), 2);
+                if (priTag == null) {
+                    Tag top = tagService.getTop();
+                    NodeUtils nodeUtils = new NodeUtils();
+                    nodeUtils.executePath(top.getId());
+                    priTag = new Tag(
+                            null,    // 缂栧彿
+                            param.getGroupCode(),    // 鍚嶇О
+                            top.getId(),    // 鐖剁骇
+                            top.getName(),    // 鐖剁骇鍚嶇О
+                            nodeUtils.path.toString(),    // 鍏宠仈璺緞
+                            nodeUtils.pathName.toString(),    // 鍏宠仈璺緞鍚�
+                            0,    // 绫诲瀷
+                            null,    // 璐熻矗浜�
+                            null,    // 鍥剧墖
+                            null,    // 绠�瑕佹弿杩�
+                            null,    // 鏁伴噺
+                            2,    // 绛夌骇
+                            null,    // 鎺掑簭
+                            1,    // 鐘舵��
+                            now,    // 娣诲姞鏃堕棿
+                            null,    // 娣诲姞浜哄憳
+                            now,    // 淇敼鏃堕棿
+                            null,    // 淇敼浜哄憳
+                            null    // 澶囨敞
+                    );
+                    if (tagMapper.insert(priTag) == 0) {
+                        throw new CoolException("鏈嶅姟鍣ㄥ唴閮ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
+                    }
+                }
+                // 浜岀骇鍒嗙被
+                Tag secTag = tagService.selectByName(param.getGroupName(), 3);
+                if (secTag == null) {
+                    NodeUtils nodeUtils = new NodeUtils();
+                    nodeUtils.executePath(priTag.getId());
+                    secTag = new Tag(
+                            null,    // 缂栧彿
+                            param.getGroupName(),    // 鍚嶇О
+                            priTag.getId(),    // 鐖剁骇
+                            priTag.getName(),    // 鐖剁骇鍚嶇О
+                            nodeUtils.path.toString(),    // 鍏宠仈璺緞
+                            nodeUtils.pathName.toString(),    // 鍏宠仈璺緞鍚�
+                            0,    // 绫诲瀷
+                            null,    // 璐熻矗浜�
+                            null,    // 鍥剧墖
+                            null,    // 绠�瑕佹弿杩�
+                            null,    // 鏁伴噺
+                            3,    // 绛夌骇
+                            null,    // 鎺掑簭
+                            1,    // 鐘舵��
+                            now,    // 娣诲姞鏃堕棿
+                            null,    // 娣诲姞浜哄憳
+                            now,    // 淇敼鏃堕棿
+                            null,    // 淇敼浜哄憳
+                            null    // 澶囨敞
+                    );
+                    if (tagMapper.insert(secTag) == 0) {
+                        throw new CoolException("鏈嶅姟鍣ㄥ唴閮ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
+                    }
+                }
+                tagId = secTag.getId();
+            } else {
+                tagId = tagService.getTop().getId();
+            }
+            mat.setTagId(tagId);
+            mat.setMatnr(analyse.getMatnr());
+            mat.setMaktx(param.getMaterialName());
+            mat.setSpecs(param.getConfigureDesc());
+            mat.setModel(analyse.getModel());
+            mat.setStatus(1);
+            mat.setCreateTime(now);
+            mat.setUpdateTime(now);
+            if (!matService.insert(mat)) {
+                throw new CoolException("鏈嶅姟鍣ㄥ唴閮ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
+            } else {
+                log.info("鎵撳寘涓婄嚎娣诲姞鏂扮墿鏂橻鍟嗗搧缂栧彿锛歿}]", mat.getMatnr());
+            }
+        }
+    }
+
+    @Override
+    @Transactional
+    public void syncMat(MatSyncParam param) {
+        if (Cools.isEmpty(param.getMatDetails()) || param.getMatDetails().size() <=0 ) {
+            throw new CoolException("鍟嗗搧鏁版嵁涓虹┖");
+        }
+
+        for(MatSyncParam.MatParam matParam : param.getMatDetails()){
+            if(Cools.isEmpty(matParam.getMatnr())){
+                throw new CoolException("鍟嗗搧缂栫爜涓嶈兘涓虹┖");
+            }
+
+            Date now = new Date();
+            Mat mat = matService.selectByMatnr(matParam.getMatnr());
+            if (mat == null) {
+                mat = new Mat();
+                // 鍒嗙被
+                Long tagId;
+                // 涓�绾у垎绫�
+                if (!Cools.isEmpty(matParam.getGroupCode()) && !Cools.isEmpty(matParam.getGroupName())) {
+                    Tag priTag = tagService.selectByName(matParam.getGroupCode(), 2);
+                    if (priTag == null) {
+                        Tag top = tagService.getTop();
+                        NodeUtils nodeUtils = new NodeUtils();
+                        nodeUtils.executePath(top.getId());
+                        priTag = new Tag(
+                                null,    // 缂栧彿
+                                matParam.getGroupCode(),    // 鍚嶇О
+                                top.getId(),    // 鐖剁骇
+                                top.getName(),    // 鐖剁骇鍚嶇О
+                                nodeUtils.path.toString(),    // 鍏宠仈璺緞
+                                nodeUtils.pathName.toString(),    // 鍏宠仈璺緞鍚�
+                                0,    // 绫诲瀷
+                                null,    // 璐熻矗浜�
+                                null,    // 鍥剧墖
+                                null,    // 绠�瑕佹弿杩�
+                                null,    // 鏁伴噺
+                                2,    // 绛夌骇
+                                null,    // 鎺掑簭
+                                1,    // 鐘舵��
+                                now,    // 娣诲姞鏃堕棿
+                                null,    // 娣诲姞浜哄憳
+                                now,    // 淇敼鏃堕棿
+                                null,    // 淇敼浜哄憳
+                                null    // 澶囨敞
+                        );
+                        if (tagMapper.insert(priTag) == 0) {
+                            throw new CoolException("鏈嶅姟鍣ㄥ唴閮ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
+                        }
+                    }
+                    // 浜岀骇鍒嗙被
+                    Tag secTag = tagService.selectByName(matParam.getGroupName(), 3);
+                    if (secTag == null) {
+                        NodeUtils nodeUtils = new NodeUtils();
+                        nodeUtils.executePath(priTag.getId());
+                        secTag = new Tag(
+                                null,    // 缂栧彿
+                                matParam.getGroupName(),    // 鍚嶇О
+                                priTag.getId(),    // 鐖剁骇
+                                priTag.getName(),    // 鐖剁骇鍚嶇О
+                                nodeUtils.path.toString(),    // 鍏宠仈璺緞
+                                nodeUtils.pathName.toString(),    // 鍏宠仈璺緞鍚�
+                                0,    // 绫诲瀷
+                                null,    // 璐熻矗浜�
+                                null,    // 鍥剧墖
+                                null,    // 绠�瑕佹弿杩�
+                                null,    // 鏁伴噺
+                                3,    // 绛夌骇
+                                null,    // 鎺掑簭
+                                1,    // 鐘舵��
+                                now,    // 娣诲姞鏃堕棿
+                                null,    // 娣诲姞浜哄憳
+                                now,    // 淇敼鏃堕棿
+                                null,    // 淇敼浜哄憳
+                                null    // 澶囨敞
+                        );
+                        if (tagMapper.insert(secTag) == 0) {
+                            throw new CoolException("鏈嶅姟鍣ㄥ唴閮ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
+                        }
+                    }
+                    tagId = secTag.getId();
+                } else {
+                    tagId = tagService.getTop().getId();
+                }
+                mat.sync(matParam);
+//            mat.setMatnr(param.getMatnr());
+//            mat.setMaktx(param.getMaktx());
+//            mat.setSpecs(param.getSpecs());
+//            mat.setModel(param.getModel());
+
+                mat.setTagId(tagId);
+                mat.setStatus(1);
+                mat.setCreateTime(now);
+                mat.setUpdateTime(now);
+                if (!matService.insert(mat)) {
+                    throw new CoolException("鏈嶅姟鍣ㄥ唴閮ㄩ敊璇紝璇疯仈绯荤鐞嗗憳");
+                } else {
+                    log.info("鍚屾鏂扮墿鏂橻鍟嗗搧缂栧彿锛歿}]", mat.getMatnr());
+                }
+            } else {
+                mat.sync(matParam);
+                if (!matService.update(mat, new EntityWrapper<Mat>().eq("matnr",matParam.getMatnr()))) {
+                    throw new CoolException("鏇存柊宸插瓨鍦ㄥ晢鍝佷俊鎭け璐ワ紝璇疯仈绯荤鐞嗗憳");
+                }
+            }
+        }
+
+    }
+
+    @Override
+    @Transactional
+    public void syncErpMat(List<Map<String, Object>> body) {
+        if (Cools.isEmpty(body)) {
+            return;
+        }
+        int count = 0;
+        for (Map<String, Object> m : body) {
+            Object matNrObj = m.get("matNr");
+            Object makTxObj = m.get("makTx");
+            if (Cools.isEmpty(matNrObj) || Cools.isEmpty(makTxObj)) {
+                continue;
+            }
+            ErpMat erpMat = new ErpMat();
+            erpMat.setMatNr(String.valueOf(matNrObj));
+            erpMat.setMakTx(String.valueOf(makTxObj));
+            Object groupIdObj = m.get("groupId");
+            if (!Cools.isEmpty(groupIdObj)) {
+                erpMat.setGroupId(String.valueOf(groupIdObj));
+            }
+            Object groupNameObj = m.get("groupName");
+            if (!Cools.isEmpty(groupNameObj)) {
+                erpMat.setGroupName(String.valueOf(groupNameObj));
+            }
+            Object specObj = m.get("spec");
+            if (!Cools.isEmpty(specObj)) {
+                erpMat.setSpec(String.valueOf(specObj));
+            }
+            Object modelObj = m.get("model");
+            if (!Cools.isEmpty(modelObj)) {
+                erpMat.setModel(String.valueOf(modelObj));
+            }
+            Object weightObj = m.get("weight");
+            if (!Cools.isEmpty(weightObj)) {
+                Double w = null;
+                if (weightObj instanceof Number) {
+                    w = ((Number) weightObj).doubleValue();
+                } else {
+                    try {
+                        w = Double.valueOf(String.valueOf(weightObj));
+                    } catch (Exception ignored) {}
+                }
+                erpMat.setWeight(w);
+            }
+            Object colorObj = m.get("color");
+            if (!Cools.isEmpty(colorObj)) {
+                erpMat.setColor(String.valueOf(colorObj));
+            }
+            Object sizeObj = m.get("size");
+            if (!Cools.isEmpty(sizeObj)) {
+                erpMat.setSize(String.valueOf(sizeObj));
+            }
+            Object unitObj = m.get("unit");
+            if (!Cools.isEmpty(unitObj)) {
+                erpMat.setUnit(String.valueOf(unitObj));
+            }
+            Object describleObj = m.get("describle");
+            if (!Cools.isEmpty(describleObj)) {
+                erpMat.setDescribe(String.valueOf(describleObj));
+            }
+            Object wareHouseIdObj = m.get("wareHouseId");
+            if (!Cools.isEmpty(wareHouseIdObj)) {
+                erpMat.setWareHouseId(String.valueOf(wareHouseIdObj));
+            }
+            // 璋冪敤澶栭儴鎺ュ彛鏍¢獙
+            String syncError = null;
+            String whId = erpMat.getWareHouseId();
+            if (!Cools.isEmpty(whId)) {
+                if ("WH01".equals(whId)) {
+                    syncError = syncToWarehouse1(erpMat);
+                } else if ("WH2".equals(whId)) {
+                    syncError = syncToWarehouse2(erpMat);
+                } else if ("WH3".equals(whId)) {
+                    syncError = syncToWarehouse3(erpMat);
+                } else {
+                    callApiLogSave(null, null, "鏈壘鍒板搴斾粨搴撶紪鐮侊紒锛�", true);
+                    throw new CoolException("鍚屾澶栭儴鎺ュ彛澶辫触锛屼粨搴揑D锛�" + whId + "锛岄敊璇俊鎭細鏈壘鍒板搴斾粨搴撶紪鍙�"  );
+                }
+            }
+
+            if (syncError != null) {
+                // 濡傛灉鍚屾澶辫触锛屽垯涓嶆彃鍏ユ暟鎹簱锛屾姏寮傚父鍥炴粴鎴栬�呰烦杩囷紙褰撳墠閫昏緫涓烘姏寮傚父锛屽洜涓烘槸浜嬪姟鏁翠綋锛�
+                // 鑻ヨ閮ㄥ垎鎴愬姛锛岄渶瑕佽皟鏁翠簨鍔$瓥鐣ャ�傝繖閲屽亣璁捐姹傚叏閮ㄦ垚鍔熴��
+                throw new CoolException("鍚屾澶栭儴鎺ュ彛澶辫触锛屼粨搴揑D锛�" + whId + "锛岀墿鏂欙細" + erpMat.getMatNr() + "锛岄敊璇俊鎭細" + syncError);
+            }
+
+            Object operateTypeObj = m.get("operateType");
+            if (!Cools.isEmpty(operateTypeObj)) {
+                Integer ot = null;
+                if (operateTypeObj instanceof Number) {
+                    ot = ((Number) operateTypeObj).intValue();
+                } else {
+                    try {
+                        ot = Integer.valueOf(String.valueOf(operateTypeObj));
+                    } catch (Exception ignored) {}
+                }
+                erpMat.setOperateType(ot);
+            }
+            erpMat.setSendStatus(1);
+            boolean ok = erpMatService.insert(erpMat);
+            if (ok) {
+                count++;
+            }
+        }
+        if (count <= 0) {
+            throw new CoolException("鍚屾鐗╂枡澶辫触锛屾棤鏈夋晥鏁版嵁鎻掑叆");
+        }
+    }
+
+    // 妯℃嫙璋冪敤浠撳簱1鎺ュ彛
+    private String syncToWarehouse1(ErpMat mat) {
+        log.info("Calling Warehouse 1 API for mat: {}", mat.getMatNr());
+        return callMatSyncApi(mat, "http://localhost:8081");
+    }
+
+    // 妯℃嫙璋冪敤浠撳簱2鎺ュ彛
+    private String syncToWarehouse2(ErpMat mat) {
+        log.info("Calling Warehouse 2 API for mat: {}", mat.getMatNr());
+        return callMatSyncApi(mat, "http://localhost:8080");
+    }
+
+    // 妯℃嫙璋冪敤浠撳簱3鎺ュ彛
+    private String syncToWarehouse3(ErpMat mat) {
+        log.info("Calling Warehouse 3 API for mat: {}", mat.getMatNr());
+        return callMatSyncApi(mat, "http://localhost:8080");
+    }
+
+    private String callMatSyncApi(ErpMat mat, String baseUrl) {
+        try {
+            // 鏋勯�犺姹傚弬鏁�
+            MatSyncParam param = new MatSyncParam();
+            List<MatSyncParam.MatParam> list = new ArrayList<>();
+            MatSyncParam.MatParam matParam = new MatSyncParam.MatParam();
+            Date now = new Date();
+
+            // 瀛楁鏄犲皠
+            matParam.setMatnr(mat.getMatNr());
+            matParam.setMaktx(mat.getMakTx());
+            matParam.setSpecs(mat.getSpec());
+            matParam.setModel(mat.getModel());
+            matParam.setWeight(mat.getWeight());
+            matParam.setColor(mat.getColor());
+            matParam.setUnit(mat.getUnit());
+            matParam.setMemo(mat.getDescribe());
+            matParam.setGroupCode(mat.getGroupId());
+            matParam.setGroupName(mat.getGroupName());
+            
+            list.add(matParam);
+            param.setMatDetails(list);
+            param.setCreateTime(String.valueOf(now));
+            String path = "/lfdwms/open/asrs/order/matSync/default/v1";
+            String json = JSON.toJSONString(param);
+
+            Map<String, Object> headers = new HashMap<>();
+            headers.put("appkey", "ea1f0459efc02a79f046f982767939ae");
+            // headers.put("x-acgw-identity", "your_identity");
+            String response = new HttpHandler.Builder()
+                    .setHeaders(headers)
+                    .setUri(baseUrl)
+                    .setPath(path)
+                    .setJson(json)
+                    .build()
+                    .doPost();
+            
+            if (Cools.isEmpty(response)) {
+                return "鎺ュ彛鏃犲搷搴�";
+            }
+            
+            JSONObject jsonResponse = JSON.parseObject(response);
+            if (jsonResponse == null) {
+                return "鎺ュ彛鍝嶅簲鏍煎紡閿欒";
+            }
+            
+            // 鏍规嵁瀹為檯杩斿洖缁撴瀯鍒ゆ柇鎴愬姛澶辫触
+            // 鍋囪 code == 0 鎴� 200 涓烘垚鍔�
+            Integer code = jsonResponse.getInteger("code");
+            if (code != null && (code == 0 || code == 200)) {
+                return null; // 鎴愬姛杩斿洖 null
+            } else {
+                return jsonResponse.getString("msg") != null ? jsonResponse.getString("msg") : "鏈煡閿欒锛宑ode=" + code;
+            }
+
+        } catch (Exception e) {
+            log.error("Call sync api error", e);
+            return "鎺ュ彛璋冪敤寮傚父锛�" + e.getMessage();
+        }
+    }
+
+    @Override
+    public Map<String, Object> addErpOrder(List<OrderDto> orders) {
+        if (Cools.isEmpty(orders)) {
+            Map<String, Object> res = new HashMap<>();
+            res.put("result", "FAIL");
+            res.put("successOrders", new ArrayList<>());
+            res.put("failOrders", new ArrayList<>());
+            res.put("successCount", 0);
+            res.put("failCount", 0);
+            return res;
+        }
+
+        TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
+        transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
+
+        List<String> successOrders = new ArrayList<>();
+        List<Map<String, Object>> failOrders = new ArrayList<>();
+
+        for (OrderDto dto : orders) {
+            String orderNo = dto != null ? dto.getOrderNo() : null;
+            try {
+                transactionTemplate.execute(status -> {
+                    if (dto == null) {
+                        throw new CoolException("璁㈠崟鍙傛暟涓嶅畬鏁�");
+                    }
+                    ErpOrder order = new ErpOrder();
+                    order.setOrderNo(dto.getOrderNo());
+                    order.setOrderType(dto.getOrderType());
+                    order.setWkType(dto.getWkType());
+                    order.setBusinessTime(dto.getBusinessTime());
+                    order.setCreateTime(dto.getCreateTime());
+                    order.setWarehouseId(dto.getWareHouseId());
+                    order.setOperateType(dto.getOperateType());
+                    order.setSendStatus(dto.getSendStatus() != null ? dto.getSendStatus() : 0);
+
+                    List<ErpOrderDetl> detls = dto.getOrderItems();
+
+                    if (Cools.isEmpty(order.getOrderNo()) || order.getOrderType() == null
+                            || Cools.isEmpty(order.getWkType()) || order.getBusinessTime() == null || order.getCreateTime() == null
+                            || Cools.isEmpty(order.getWarehouseId())) {
+                        throw new CoolException("璁㈠崟鍙傛暟涓嶅畬鏁�");
+                    }
+                    if (Cools.isEmpty(detls)) {
+                        throw new CoolException("璁㈠崟鏄庣粏涓虹┖");
+                    }
+
+                    String syncError = null;
+                    String whId = order.getWarehouseId();
+                    Integer orderType = order.getOrderType();
+
+                    if (!Cools.isEmpty(whId)) {
+                        if ("WH01".equals(whId)) {
+                            syncError = syncOrderToWarehouse1(order, detls, orderType);
+                        } else if ("WH2".equals(whId)) {
+                            syncError = syncOrderToWarehouse2(order, detls, orderType);
+                        } else if ("WH3".equals(whId)) {
+                            syncError = syncOrderToWarehouse3(order, detls, orderType);
+                        } else {
+                            throw new CoolException("鏈壘鍒板搴斾粨搴撶紪鍙�");
+                        }
+                    }
+
+                    if (syncError != null) {
+                        throw new CoolException(syncError);
+                    }
+
+                    if (!erpOrderService.insert(order)) {
+                        throw new CoolException("璁㈠崟鎻掑叆澶辫触");
+                    }
+                    if (order.getId() == null) {
+                        throw new CoolException("璁㈠崟鎻掑叆澶辫触锛屾湭杩斿洖orderId");
+                    }
+
+                    for (ErpOrderDetl detl : detls) {
+                        if (detl == null || Cools.isEmpty(detl.getLineId()) || Cools.isEmpty(detl.getMatNr())
+                                || Cools.isEmpty(detl.getMakTx()) || detl.getAnfme() == null) {
+                            throw new CoolException("鏄庣粏鍙傛暟涓嶅畬鏁�");
+                        }
+                        detl.setOrderId(order.getId());
+                        if (!erpOrderDetlService.insert(detl)) {
+                            throw new CoolException("璁㈠崟鏄庣粏鎻掑叆澶辫触");
+                        }
+                    }
+                    return null;
+                });
+                successOrders.add(orderNo);
+            } catch (Exception e) {
+                Map<String, Object> fail = new HashMap<>();
+                fail.put("orderNo", orderNo);
+                fail.put("msg", e.getMessage());
+                failOrders.add(fail);
+            }
+        }
+
+        Map<String, Object> res = new HashMap<>();
+        res.put("successOrders", successOrders);
+        res.put("failOrders", failOrders);
+        res.put("successCount", successOrders.size());
+        res.put("failCount", failOrders.size());
+        res.put("result", failOrders.isEmpty() ? "SUCCESS" : (successOrders.isEmpty() ? "FAIL" : "PART_SUCCESS"));
+        return res;
+    }
+
+    @Override
+    public List<Map<String, Object>> mesInventoryDetails(Map<String, Object> param) throws IOException {
+        String wareHouseId = param != null ? String.valueOf(param.get("wareHouseId")) : null;
+        if ("null".equalsIgnoreCase(wareHouseId)) wareHouseId = null;
+
+        List<String> whIds = new ArrayList<>();
+        if (Cools.isEmpty(wareHouseId)) {
+            whIds.add("WH01");
+            whIds.add("WH02");
+            whIds.add("WH03");
+        } else {
+            whIds.add(wareHouseId);
+        }
+
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (String whId : whIds) {
+            String baseUrl = getWarehouseBaseUrl(whId);
+            if (Cools.isEmpty(baseUrl)) {
+                throw new CoolException("鏈壘鍒板搴斾粨搴撶紪鍙�");
+            }
+            Map<String, Object> payload = param == null ? new HashMap<>() : new HashMap<>(param);
+            payload.put("wareHouseId", whId);
+            List<Map<String, Object>> data = callMesInventoryApi(baseUrl, "/lfdwms/open/asrs/MES/inventory/details", payload);
+            if (!Cools.isEmpty(data)) {
+                result.addAll(data);
+            }
+        }
+        return result;
+    }
+
+    @Override
+    public List<Map<String, Object>> mesInventorySummary(Map<String, Object> param) throws IOException {
+        String wareHouseId = param != null ? String.valueOf(param.get("wareHouseId")) : null;
+        if ("null".equalsIgnoreCase(wareHouseId)) wareHouseId = null;
+
+        List<String> whIds = new ArrayList<>();
+        if (Cools.isEmpty(wareHouseId)) {
+            whIds.add("WH01");
+            whIds.add("WH02");
+            whIds.add("WH03");
+        } else {
+            whIds.add(wareHouseId);
+        }
+
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (String whId : whIds) {
+            String baseUrl = getWarehouseBaseUrl(whId);
+            if (Cools.isEmpty(baseUrl)) {
+                throw new CoolException("鏈壘鍒板搴斾粨搴撶紪鍙�");
+            }
+            Map<String, Object> payload = param == null ? new HashMap<>() : new HashMap<>(param);
+            payload.put("wareHouseId", whId);
+            List<Map<String, Object>> data = callMesInventoryApi(baseUrl, "/lfdwms/open/asrs/MES/inventory/summary", payload);
+            if (!Cools.isEmpty(data)) {
+                result.addAll(data);
+            }
+        }
+        return result;
+    }
+
+    private String getWarehouseBaseUrl(String wareHouseId) {
+        if (Cools.isEmpty(wareHouseId)) {
+            return null;
+        }
+        String wh = wareHouseId.trim();
+        if ("WH01".equalsIgnoreCase(wh) || "WH1".equalsIgnoreCase(wh)) {
+            return "http://localhost:8081";
+        }
+        if ("WH02".equalsIgnoreCase(wh) || "WH2".equalsIgnoreCase(wh)) {
+            return "http://localhost:8080";
+        }
+        if ("WH03".equalsIgnoreCase(wh) || "WH3".equalsIgnoreCase(wh)) {
+            return "http://localhost:8080";
+        }
+        return null;
+    }
+
+    private List<Map<String, Object>> callMesInventoryApi(String baseUrl, String path, Map<String, Object> payload) throws IOException {
+        String json = JSON.toJSONString(payload == null ? new HashMap<>() : payload);
+        Map<String, Object> headers = new HashMap<>();
+        headers.put("appkey", "ea1f0459efc02a79f046f982767939ae");
+        String response = new HttpHandler.Builder()
+                .setHeaders(headers)
+                .setUri(baseUrl)
+                .setPath(path)
+                .setJson(json)
+                .build()
+                .doPost();
+
+        if (Cools.isEmpty(response)) {
+            throw new CoolException("鎺ュ彛鏃犲搷搴�");
+        }
+        JSONObject jsonResponse = JSON.parseObject(response);
+        if (jsonResponse == null) {
+            throw new CoolException("鎺ュ彛鍝嶅簲鏍煎紡閿欒");
+        }
+        Integer code = jsonResponse.getInteger("code");
+        if (code != null && (code == 0 || code == 200)) {
+            Object data = jsonResponse.get("data");
+            if (data == null) {
+                return new ArrayList<>();
+            }
+            if (data instanceof List) {
+                return JSON.parseObject(JSON.toJSONString(data), List.class);
+            }
+            List<Map<String, Object>> list = new ArrayList<>();
+            Map<String, Object> one = JSON.parseObject(JSON.toJSONString(data), Map.class);
+            if (one != null) {
+                list.add(one);
+            }
+            return list;
+        }
+        String msg = jsonResponse.getString("msg");
+        throw new CoolException(!Cools.isEmpty(msg) ? msg : "鏈煡閿欒锛宑ode=" + code);
+    }
+
+    // 妯℃嫙璋冪敤浠撳簱1鎺ュ彛
+    private String syncOrderToWarehouse1(ErpOrder order, List<ErpOrderDetl> details, Integer orderType) {
+        log.info("Calling Warehouse 1 API for order: {}", order.getOrderNo());
+        return callOrderSyncApi(order, details, orderType, "http://localhost:8081");
+    }
+
+    // 妯℃嫙璋冪敤浠撳簱2鎺ュ彛
+    private String syncOrderToWarehouse2(ErpOrder order, List<ErpOrderDetl> details, Integer orderType) {
+        log.info("Calling Warehouse 2 API for order: {}", order.getOrderNo());
+        return callOrderSyncApi(order, details, orderType, "http://localhost:8080");
+    }
+
+    // 妯℃嫙璋冪敤浠撳簱3鎺ュ彛
+    private String syncOrderToWarehouse3(ErpOrder order, List<ErpOrderDetl> details, Integer orderType) {
+        log.info("Calling Warehouse 3 API for order: {}", order.getOrderNo());
+        return callOrderSyncApi(order, details, orderType, "http://localhost:8080");
+    }
+
+    private String callOrderSyncApi(ErpOrder order, List<ErpOrderDetl> details, Integer orderType, String baseUrl) {
+        try {
+            // 鏍规嵁 orderType 鍒ゆ柇鎺ュ彛璺緞
+            // 鍋囪 1=鍑哄簱锛�2=鍏ュ簱锛堣鏍规嵁瀹為檯涓氬姟璋冩暣锛岃繖閲屾寜鐢ㄦ埛鎻忚堪閫昏緫瀹炵幇锛�
+            // 鐢ㄦ埛鎻忚堪锛氳嫢鏄叆搴撳崟鍒欒皟鐢╫rder/pakin/default/v1锛岃嫢鏄嚭搴搊rder/pakout/default/v1
+            // 鍋囪 orderType 2 涓哄叆搴擄紝1 鎴� 3 涓哄嚭搴擄紙闇�纭 3 璋冩嫧鍗曞睘浜庡摢绫伙紝鏆傚綊涓哄嚭搴撴垨涓嶅鐞嗭級
+            
+            String path;
+            String json;
+            
+            if (orderType == 2) {
+                // 鍏ュ簱鍗�
+                path = "/lfdwms/open/asrs/order/pakin/default/v1";
+                OpenOrderPakinParam param = new OpenOrderPakinParam();
+                param.setOrderNo(order.getOrderNo());
+                // 杩欓噷鍙兘闇�瑕佹槧灏� wkType 鍒� orderType 瀛楃涓诧紝鎴栬�呯洿鎺ョ敤
+                param.setOrderType(order.getWkType()); 
+                param.setOrderTime(DateUtils.convert(new Date(order.getBusinessTime())));
+                
+                List<DetlDto> detlDtos = new ArrayList<>();
+                if (!Cools.isEmpty(details)) {
+                    for (ErpOrderDetl d : details) {
+                        DetlDto dto = new DetlDto();
+                        dto.setMatnr(d.getMatNr());
+                        // 濡傛灉鏈� batch 瀛楁鍒欒缃紝OpenOrderPakinParam 鐨� DetlDto 鍙兘闇�瑕佺‘璁ゅ瓧娈�
+                        dto.setBatch(d.getBatch());
+                        dto.setAnfme(d.getAnfme() != null ? d.getAnfme().doubleValue() : 0.0);
+                        // 鍏朵粬瀛楁鏄犲皠...
+                        detlDtos.add(dto);
+                    }
+                }
+                param.setOrderDetails(detlDtos);
+                json = JSON.toJSONString(param);
+                
+            } else if (orderType == 1 || orderType == 3) {
+                // 鍑哄簱鍗�
+                path = "/lfdwms/open/asrs/order/pakout/default/v1";
+                OpenOrderPakoutParam param = new OpenOrderPakoutParam();
+                param.setOrderNo(order.getOrderNo());
+                param.setOrderType(order.getWkType());
+                param.setOrderTime(DateUtils.convert(new Date(order.getBusinessTime())));
+                param.setLgort("5006"); // 蹇呭~鏍¢獙瑕佹眰
+                
+                List<DetlDto> detlDtos = new ArrayList<>();
+                if (!Cools.isEmpty(details)) {
+                    for (ErpOrderDetl d : details) {
+                        DetlDto dto = new DetlDto();
+                        dto.setMatnr(d.getMatNr());
+                        dto.setBatch(d.getBatch());
+                        dto.setAnfme(d.getAnfme() != null ? d.getAnfme().doubleValue() : 0.0);
+                        detlDtos.add(dto);
+                    }
+                }
+                param.setOrderDetails(detlDtos);
+                json = JSON.toJSONString(param);
+            } else {
+                return "鏈煡鐨勮鍗曠被鍨嬶細" + orderType;
+            }
+
+            Map<String, Object> headers = new HashMap<>();
+            headers.put("appkey", "ea1f0459efc02a79f046f982767939ae");
+            String response = new HttpHandler.Builder()
+                    .setHeaders(headers)
+                    .setUri(baseUrl)
+                    .setPath(path)
+                    .setJson(json)
+                    .build()
+                    .doPost();
+            
+            if (Cools.isEmpty(response)) {
+                return "鎺ュ彛鏃犲搷搴�";
+            }
+            
+            JSONObject jsonResponse = JSON.parseObject(response);
+            if (jsonResponse == null) {
+                return "鎺ュ彛鍝嶅簲鏍煎紡閿欒";
+            }
+            
+            Integer code = jsonResponse.getInteger("code");
+            if (code != null && (code == 0 || code == 200)) {
+                return null;
+            } else {
+                return jsonResponse.getString("msg") != null ? jsonResponse.getString("msg") : "鏈煡閿欒锛宑ode=" + code;
+            }
+
+        } catch (Exception e) {
+            log.error("Call order sync api error", e);
+            return "鎺ュ彛璋冪敤寮傚父锛�" + e.getMessage();
+        }
+    }
+    public void callApiLogSave(Mat mat, String url, String response, Boolean bool) {
+        apiLogService.save(
+                "ERP鍚屾鐗╂枡淇℃伅",
+                url,
+                null,
+                null,
+                "鐗╂枡缂栧彿锛�" + (mat != null ? mat.getMatnr() : null) +
+                        "銆佺墿鏂欏悕绉帮細" + (mat != null ? mat.getMaktx() : null),
+                response,
+                bool
+        );
+    }
 }

--
Gitblit v1.9.1