From 01ac161eaaa3657da9ea014eee5abe23c2976721 Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期二, 12 五月 2026 17:14:32 +0800
Subject: [PATCH] 7.13接收XBPS托盘进仓编号

---
 src/main/java/com/zy/asrs/mapper/LocDetlMapper.java                                   |    5 +
 src/main/java/com/zy/asrs/service/LocDetlService.java                                 |    2 
 src/main/java/com/zy/asrs/controller/OpenController.java                              |   16 ++++
 src/test/java/com/zy/asrs/service/impl/OpenServiceImplPendingPakoutOrderTaskTest.java |   66 ++++++++++++++++
 src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java                        |    5 +
 src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java                           |   99 ++++++++++++++++++++++++
 src/main/java/com/zy/asrs/service/OpenService.java                                    |    5 +
 src/main/java/com/zy/asrs/entity/param/XbpsPalletEntryWmsCodeParam.java               |   13 +++
 8 files changed, 211 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/OpenController.java b/src/main/java/com/zy/asrs/controller/OpenController.java
index edbd0d3..d113310 100644
--- a/src/main/java/com/zy/asrs/controller/OpenController.java
+++ b/src/main/java/com/zy/asrs/controller/OpenController.java
@@ -709,6 +709,22 @@
     }
 
     /**
+     * 7.13 鎺ユ敹 XBPS 鎵樼洏杩涗粨缂栧彿銆�
+     *
+     * ERP 鎵归噺鎻愪緵鎵樼洏鍜岃繘浠撶紪鍙凤紝WMS 瑕嗙洊搴撳瓨 asr_loc_detl.standby1锛�
+     * 瀵瑰皻鏈敓鎴愪换鍔$殑鍑哄簱璁㈠崟鏄庣粏锛屽悓姝ヨ鐩� entry_wms_code / batch_seq銆�
+     */
+    @PostMapping("/xbps/pallet/entryWmsCode/v1")
+    public synchronized R receiveXbpsPalletEntryWmsCode(@RequestBody List<XbpsPalletEntryWmsCodeParam> params,
+                                                        HttpServletRequest request) {
+        if (request != null) {
+            log.info("[receiveXbpsPalletEntryWmsCode] cache: {}", params == null ? "null" : JSON.toJSONString(params));
+            request.setAttribute("cache", params);
+        }
+        return openService.receiveXbpsPalletEntryWmsCode(params);
+    }
+
+    /**
      * 7.9 鍑哄簱寮傚父鍙樺姩涓婃姤
      */
     @PostMapping("/order/pakout/abnormal/report/v1")
diff --git a/src/main/java/com/zy/asrs/entity/param/XbpsPalletEntryWmsCodeParam.java b/src/main/java/com/zy/asrs/entity/param/XbpsPalletEntryWmsCodeParam.java
new file mode 100644
index 0000000..e3e953c
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/XbpsPalletEntryWmsCodeParam.java
@@ -0,0 +1,13 @@
+package com.zy.asrs.entity.param;
+
+import lombok.Data;
+
+@Data
+public class XbpsPalletEntryWmsCodeParam {
+
+    // 鎵樼洏缂栫爜
+    private String palletId;
+
+    // 杩涗粨缂栧彿
+    private String entryWmsCode;
+}
diff --git a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
index f428a86..1cd58f8 100644
--- a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -52,6 +52,11 @@
     @Update("update asr_loc_detl set loc_no = #{newLocNo}, modi_time=getDate() where loc_no = #{oldLocNo}")
     int updateLocNo(String newLocNo, String oldLocNo);
 
+    @Update("update asr_loc_detl set standby1 = #{entryWmsCode}, modi_user = #{modiUser}, modi_time = getDate() where zpallet = #{palletId}")
+    int updateEntryWmsCodeByPallet(@Param("palletId") String palletId,
+                                   @Param("entryWmsCode") String entryWmsCode,
+                                   @Param("modiUser") Long modiUser);
+
     @Select("SELECT ld.loc_no FROM asr_loc_detl ld LEFT JOIN asr_loc_mast lm ON ld.loc_no = lm.loc_no WHERE (1 = 1 AND ld.matnr = #{matnr} AND (lm.row1 >= #{start} AND lm.row1 <= #{end})  AND lm.loc_sts = 'F' AND DateDiff(dd, ld.appe_time, getdate()) = 0) ORDER BY ld.appe_time ASC")
     List<String> selectSameDetlToday(@Param("matnr") String matnr, @Param("start") Integer start, @Param("end") Integer end);
 
diff --git a/src/main/java/com/zy/asrs/service/LocDetlService.java b/src/main/java/com/zy/asrs/service/LocDetlService.java
index d270405..97786a6 100644
--- a/src/main/java/com/zy/asrs/service/LocDetlService.java
+++ b/src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -37,6 +37,8 @@
     boolean updateAnfme(Double anfme, String locNo, String matnr
             ,String batch,String brand,String standby1,String standby2,String standby3,String boxType1,String boxType2,String boxType3);
 
+    boolean updateEntryWmsCodeByPallet(String palletId, String entryWmsCode, Long modiUser);
+
     boolean updateLocNo(String newLocNo, String oldLocNo);
 
     /**
diff --git a/src/main/java/com/zy/asrs/service/OpenService.java b/src/main/java/com/zy/asrs/service/OpenService.java
index bc177cc..7b209a9 100644
--- a/src/main/java/com/zy/asrs/service/OpenService.java
+++ b/src/main/java/com/zy/asrs/service/OpenService.java
@@ -94,6 +94,11 @@
     R outOrderBatch(Map<String, List<OutTaskParam>> linesByBatchSeq,int count);
 
     /**
+     * 7.13 鎺ユ敹 XBPS 鎵樼洏杩涗粨缂栧彿銆�
+     */
+    R receiveXbpsPalletEntryWmsCode(List<XbpsPalletEntryWmsCodeParam> params);
+
+    /**
      * ERP / IoT 鍑哄簱閫氱煡鍏堢敓鎴愬嚭搴撹鍗曪紝涓嶇洿鎺ョ敓鎴愪换鍔°��
      *
      * 璇ユ柟娉曞彧璐熻矗鎶婃帴鍙e弬鏁拌惤鍒� man_order_pakout / man_order_detl_pakout銆�
diff --git a/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
index edf0e16..c85d95d 100644
--- a/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -63,6 +63,11 @@
         }
     }
 
+    @Override
+    public boolean updateEntryWmsCodeByPallet(String palletId, String entryWmsCode, Long modiUser) {
+        return baseMapper.updateEntryWmsCodeByPallet(palletId, entryWmsCode, modiUser) > 0;
+    }
+
 
     @Override
     public boolean updateLocNo(String newLocNo, String oldLocNo) {
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 f0a9e16..922702b 100644
--- a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -1969,6 +1969,105 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R receiveXbpsPalletEntryWmsCode(List<XbpsPalletEntryWmsCodeParam> params) {
+        if (Cools.isEmpty(params)) {
+            return R.error("璇锋眰鍙傛暟涓嶈兘涓虹┖");
+        }
+
+        Map<String, XbpsPalletEntryWmsCodeParam> rowsByPallet = new LinkedHashMap<>();
+        Set<String> duplicatePalletIds = new LinkedHashSet<>();
+        for (int i = 0; i < params.size(); i++) {
+            XbpsPalletEntryWmsCodeParam param = params.get(i);
+            if (param == null) {
+                return R.error("绗�" + (i + 1) + "琛屽弬鏁颁笉鑳戒负绌�");
+            }
+            if (Cools.isEmpty(param.getPalletId())) {
+                return R.error("绗�" + (i + 1) + "琛屾墭鐩樼紪鐮乕palletId]涓嶈兘涓虹┖");
+            }
+            if (Cools.isEmpty(param.getEntryWmsCode())) {
+                return R.error("鎵樼洏銆�" + param.getPalletId() + "銆嶈繘浠撶紪鍙穂entryWmsCode]涓嶈兘涓虹┖");
+            }
+            if (rowsByPallet.containsKey(param.getPalletId())) {
+                duplicatePalletIds.add(param.getPalletId());
+                continue;
+            }
+            rowsByPallet.put(param.getPalletId(), param);
+        }
+        if (!duplicatePalletIds.isEmpty()) {
+            return R.error("鎵樼洏缂栫爜閲嶅锛�" + String.join("锛�", duplicatePalletIds));
+        }
+
+        List<String> missingPalletIds = new ArrayList<>();
+        for (String palletId : rowsByPallet.keySet()) {
+            int count = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet", palletId));
+            if (count <= 0) {
+                missingPalletIds.add(palletId);
+            }
+        }
+        if (!missingPalletIds.isEmpty()) {
+            return R.error("搴撳瓨涓笉瀛樺湪鎵樼洏锛�" + String.join("锛�", missingPalletIds)).add(missingPalletIds);
+        }
+
+        Date now = new Date();
+        int updatedStockCount = 0;
+        int updatedOrderDetailCount = 0;
+        int skippedDispatchedOrderDetailCount = 0;
+        List<Map<String, Object>> details = new ArrayList<>();
+        for (XbpsPalletEntryWmsCodeParam param : rowsByPallet.values()) {
+            String palletId = param.getPalletId();
+            String entryWmsCode = param.getEntryWmsCode();
+
+            if (!locDetlService.updateEntryWmsCodeByPallet(palletId, entryWmsCode, 9527L)) {
+                throw new CoolException("鏇存柊搴撳瓨杩涗粨缂栧彿澶辫触锛�" + palletId);
+            }
+            updatedStockCount++;
+
+            int rowOrderDetailUpdatedCount = 0;
+            int rowOrderDetailSkippedCount = 0;
+            List<OrderDetlPakout> orderDetails = orderDetlPakoutService.selectList(new EntityWrapper<OrderDetlPakout>()
+                    .eq("pallet_id", palletId)
+                    .eq("status", 1)
+                    .orderBy("id", true));
+            if (!Cools.isEmpty(orderDetails)) {
+                for (OrderDetlPakout orderDetail : orderDetails) {
+                    if (!isUndispatchedPendingDetail(orderDetail)) {
+                        rowOrderDetailSkippedCount++;
+                        continue;
+                    }
+                    orderDetail.setEntryWmsCode(entryWmsCode);
+                    orderDetail.setBatchSeq(entryWmsCode);
+                    orderDetail.setStandby1(entryWmsCode);
+                    orderDetail.setUpdateBy(9527L);
+                    orderDetail.setUpdateTime(now);
+                    if (!orderDetlPakoutService.updateById(orderDetail)) {
+                        throw new CoolException("鏇存柊鍑哄簱璁㈠崟鏄庣粏杩涗粨缂栧彿澶辫触锛�" + palletId);
+                    }
+                    rowOrderDetailUpdatedCount++;
+                }
+            }
+            updatedOrderDetailCount += rowOrderDetailUpdatedCount;
+            skippedDispatchedOrderDetailCount += rowOrderDetailSkippedCount;
+
+            Map<String, Object> row = new LinkedHashMap<>();
+            row.put("palletId", palletId);
+            row.put("entryWmsCode", entryWmsCode);
+            row.put("updatedStock", true);
+            row.put("updatedOrderDetailCount", rowOrderDetailUpdatedCount);
+            row.put("skippedDispatchedOrderDetailCount", rowOrderDetailSkippedCount);
+            details.add(row);
+        }
+
+        Map<String, Object> result = new LinkedHashMap<>();
+        result.put("receivedCount", params.size());
+        result.put("updatedStockCount", updatedStockCount);
+        result.put("updatedOrderDetailCount", updatedOrderDetailCount);
+        result.put("skippedDispatchedOrderDetailCount", skippedDispatchedOrderDetailCount);
+        result.put("details", details);
+        return R.ok("XBPS鎵樼洏杩涗粨缂栧彿鎺ユ敹鎴愬姛").add(result);
+    }
+
+    @Override
     public R generatePendingPakoutOrderTasks() {
         // 瀹氭椂鍏ュ彛鍙壂鎻忓惎鐢ㄤ腑鐨勫嚭搴撹鍗曪細
         // status=1 琛ㄧず鏈 pakoutOrderPause 涓锛�
diff --git a/src/test/java/com/zy/asrs/service/impl/OpenServiceImplPendingPakoutOrderTaskTest.java b/src/test/java/com/zy/asrs/service/impl/OpenServiceImplPendingPakoutOrderTaskTest.java
index a60f880..af9a757 100644
--- a/src/test/java/com/zy/asrs/service/impl/OpenServiceImplPendingPakoutOrderTaskTest.java
+++ b/src/test/java/com/zy/asrs/service/impl/OpenServiceImplPendingPakoutOrderTaskTest.java
@@ -9,6 +9,7 @@
 import com.zy.asrs.entity.WrkDetl;
 import com.zy.asrs.entity.WrkMast;
 import com.zy.asrs.entity.param.OutTaskParam;
+import com.zy.asrs.entity.param.XbpsPalletEntryWmsCodeParam;
 import com.zy.asrs.mapper.WrkMastMapper;
 import com.zy.asrs.service.LocDetlService;
 import com.zy.asrs.service.WrkMastService;
@@ -199,6 +200,64 @@
     }
 
     @Test
+    void receiveXbpsPalletEntryWmsCodeUpdatesStockAndUndispatchedOrderDetails() {
+        XbpsPalletEntryWmsCodeParam param = entryWmsCodeParam("PALLET-1", "ENTRY-001");
+        OrderDetlPakout detail = pendingDetail();
+        detail.setId(2001L);
+        detail.setPalletId("PALLET-1");
+        when(locDetlService.selectCount(any())).thenReturn(1);
+        when(locDetlService.updateEntryWmsCodeByPallet("PALLET-1", "ENTRY-001", 9527L)).thenReturn(true);
+        when(orderDetlPakoutService.selectList(any())).thenReturn(Collections.singletonList(detail));
+        when(orderDetlPakoutService.updateById(detail)).thenReturn(true);
+
+        R result = service.receiveXbpsPalletEntryWmsCode(Collections.singletonList(param));
+
+        assertEquals(200, ((Number) result.get("code")).intValue());
+        assertEquals("ENTRY-001", detail.getEntryWmsCode());
+        assertEquals("ENTRY-001", detail.getBatchSeq());
+        assertEquals("ENTRY-001", detail.getStandby1());
+        Map<?, ?> data = (Map<?, ?>) result.get("data");
+        assertEquals(1, ((Number) data.get("updatedStockCount")).intValue());
+        assertEquals(1, ((Number) data.get("updatedOrderDetailCount")).intValue());
+        assertEquals(0, ((Number) data.get("skippedDispatchedOrderDetailCount")).intValue());
+        verify(locDetlService).updateEntryWmsCodeByPallet("PALLET-1", "ENTRY-001", 9527L);
+        verify(orderDetlPakoutService).updateById(detail);
+    }
+
+    @Test
+    void receiveXbpsPalletEntryWmsCodeReturnsErrorWhenPalletNotInStock() {
+        XbpsPalletEntryWmsCodeParam param = entryWmsCodeParam("PALLET-1", "ENTRY-001");
+        when(locDetlService.selectCount(any())).thenReturn(0);
+
+        R result = service.receiveXbpsPalletEntryWmsCode(Collections.singletonList(param));
+
+        assertEquals(500, ((Number) result.get("code")).intValue());
+        verify(locDetlService, never()).updateEntryWmsCodeByPallet(any(), any(), any());
+        verify(orderDetlPakoutService, never()).updateById(any(OrderDetlPakout.class));
+    }
+
+    @Test
+    void receiveXbpsPalletEntryWmsCodeSkipsDispatchedOrderDetails() {
+        XbpsPalletEntryWmsCodeParam param = entryWmsCodeParam("PALLET-1", "ENTRY-001");
+        OrderDetlPakout detail = pendingDetail();
+        detail.setId(2001L);
+        detail.setPalletId("PALLET-1");
+        detail.setWorkQty(1.0D);
+        when(locDetlService.selectCount(any())).thenReturn(1);
+        when(locDetlService.updateEntryWmsCodeByPallet("PALLET-1", "ENTRY-001", 9527L)).thenReturn(true);
+        when(orderDetlPakoutService.selectList(any())).thenReturn(Collections.singletonList(detail));
+
+        R result = service.receiveXbpsPalletEntryWmsCode(Collections.singletonList(param));
+
+        assertEquals(200, ((Number) result.get("code")).intValue());
+        assertNull(detail.getEntryWmsCode());
+        Map<?, ?> data = (Map<?, ?>) result.get("data");
+        assertEquals(0, ((Number) data.get("updatedOrderDetailCount")).intValue());
+        assertEquals(1, ((Number) data.get("skippedDispatchedOrderDetailCount")).intValue());
+        verify(orderDetlPakoutService, never()).updateById(any(OrderDetlPakout.class));
+    }
+
+    @Test
     void outOrderBatchUsesMaxIssuedUnstartedPriorityInSameArea() {
         OutTaskParam first = outTask("PALLET-1", "BATCH-1", 1);
         OutTaskParam second = outTask("PALLET-2", "BATCH-1", 2);
@@ -363,6 +422,13 @@
         return param;
     }
 
+    private static XbpsPalletEntryWmsCodeParam entryWmsCodeParam(String palletId, String entryWmsCode) {
+        XbpsPalletEntryWmsCodeParam param = new XbpsPalletEntryWmsCodeParam();
+        param.setPalletId(palletId);
+        param.setEntryWmsCode(entryWmsCode);
+        return param;
+    }
+
     private static LocMast locMast(String locNo, String barcode, Integer areaId, Integer crnNo) {
         LocMast locMast = new LocMast();
         locMast.setLocNo(locNo);

--
Gitblit v1.9.1