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