From ff45c0a7ea1ad25b74b0929514e2681427bb4756 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B8=B8=E7=86=9F=E5=90=B4=E5=BD=A6=E7=A5=96?= Date: Fri, 11 Sep 2026 12:25:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=86=E5=88=86=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autoWareHourceHaian/HAIAN_AI_CONTEXT.md | 9 +++++++ .../HaiAnNoOrderMaterialAllocRequestData.java | 4 +-- ...ueNotifyOrderMaterialListAllocService.java | 2 +- ...tifyOrderMaterialListAllocServiceImpl.java | 26 +++++++++++++++++++ 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/HAIAN_AI_CONTEXT.md b/src/main/java/com/gaotao/modules/autoWareHourceHaian/HAIAN_AI_CONTEXT.md index f3e2b97a..31bc058e 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/HAIAN_AI_CONTEXT.md +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/HAIAN_AI_CONTEXT.md @@ -184,3 +184,12 @@ - 虽然本文档聚焦海安,但注释规范遵循 **整个 WMS 项目统一规则**:前后端新增/修改代码必须配套中文注释说明代码意图,不允许“只写代码不写注释” - rqrq - 后端 Java 注释必须非常详细,至少覆盖业务意图、关键入参/回参语义、边界条件、失败处理、状态流转与对上下游影响,确保后续排障可直接靠注释快速定位 - rqrq - 海安模块在实现组盘、分拣、任务下达、接口调用、回调处理等关键链路时,必须按“代码块级解释注释”执行,禁止仅依赖方法名表达业务含义 - rqrq + +## 17. 海安领料指定物料与推送查看页规则 + +- 指定物料表 `haian_SOIssueNotifyOrderMaterialList_alloc` 按 `site+notifyNo+itemNo+BOMItemNo` 隔离,不按 orderType 分表;无订单/工单/委外/销售查看页共用 `HaiAnIssureNotifyController` 的 get/save/availableLabel/listByNotifyNo 接口 - rqrq +- 仅 `status=ISSUE`(已下达)允许保存指定物料;`UNISSUE` 未下达前后端都必须拦截,提示“未下达申请单不允许指定物料”。指定清单页签仍可只读查询 - rqrq +- 工单/委外/销售查看页指定入口在「材料明细」操作列;无订单查看页入口仍在申请明细弹窗,同样受已下达限制 - rqrq +- 查看页推送WCS预览与确认统一走 `haiAnSearchIssureNotify/checkIssueNotifyInventory` 与 `pushInventoryToWcs`:预览展示物料汇总+指定明细(`displayRowType=SPECIFIED`),确认只传 `site+notifyNo`,由服务端重新匹配后推送 - rqrq +- 海安三类查看页(工单 `searchIssureNotify54`、委外 `searchPoIssureNotify54`、销售 `shipmentNotification54`)必须使用与无订单查看页同一套预览弹窗交互,禁止继续使用旧占位预览或“暂不启用”提示 - rqrq + diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/entity/dto/HaiAnNoOrderMaterialAllocRequestData.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/entity/dto/HaiAnNoOrderMaterialAllocRequestData.java index f95b7b64..81c1431e 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/entity/dto/HaiAnNoOrderMaterialAllocRequestData.java +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/entity/dto/HaiAnNoOrderMaterialAllocRequestData.java @@ -36,7 +36,7 @@ public class HaiAnNoOrderMaterialAllocRequestData { * 前端实际传 bOMItemNo,必须显式声明属性名和别名,否则反序列化后该字段为 null - rqrq */ @JsonProperty("bOMItemNo") - @JsonAlias({"bomItemNo", "BOMItemNo"}) + @JsonAlias({"bomItemNo", "BOMItemNo", "bomitemNo"}) private String bOMItemNo; /** @@ -53,7 +53,7 @@ public class HaiAnNoOrderMaterialAllocRequestData { * @Description 显式覆盖 Lombok setter,把前端的 bOMItemNo/bomItemNo/BOMItemNo 都写入同一字段 - rqrq */ @JsonProperty("bOMItemNo") - @JsonAlias({"bomItemNo", "BOMItemNo"}) + @JsonAlias({"bomItemNo", "BOMItemNo", "bomitemNo"}) public void setBOMItemNo(String bOMItemNo) { this.bOMItemNo = bOMItemNo; } diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/HaiAnSOIssueNotifyOrderMaterialListAllocService.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/HaiAnSOIssueNotifyOrderMaterialListAllocService.java index 3fe4e77e..0d3f8ced 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/HaiAnSOIssueNotifyOrderMaterialListAllocService.java +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/HaiAnSOIssueNotifyOrderMaterialListAllocService.java @@ -17,7 +17,7 @@ public interface HaiAnSOIssueNotifyOrderMaterialListAllocService { List queryAllocList(HaiAnNoOrderMaterialAllocRequestData requestData); /** - * 全量保存当前物料行分配策略,保存前会统一校验、排序、重建alloc_seq - rqrq + * 全量保存当前物料行分配策略;仅已下达(ISSUE)允许保存,保存前校验物料行、排序并重建alloc_seq - rqrq */ void saveAllocList(HaiAnNoOrderMaterialAllocRequestData requestData); diff --git a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnSOIssueNotifyOrderMaterialListAllocServiceImpl.java b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnSOIssueNotifyOrderMaterialListAllocServiceImpl.java index e968fa66..dc68df1e 100644 --- a/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnSOIssueNotifyOrderMaterialListAllocServiceImpl.java +++ b/src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnSOIssueNotifyOrderMaterialListAllocServiceImpl.java @@ -4,6 +4,7 @@ import com.gaotao.modules.autoWareHourceHaian.entity.HaiAnNoOrderAvailableLabelQ import com.gaotao.modules.autoWareHourceHaian.entity.HaiAnNoOrderAvailableLabelResult; import com.gaotao.modules.autoWareHourceHaian.entity.HaiAnNoOrderMaterialAllocListQueryData; import com.gaotao.modules.autoWareHourceHaian.entity.HaiAnNoOrderMaterialAllocListResult; +import com.gaotao.modules.autoWareHourceHaian.entity.HaiAnSOIssueNotifyHeaderData; import com.gaotao.modules.autoWareHourceHaian.entity.HaiAnSOIssueNotifyOrderMaterialListAllocData; import com.gaotao.modules.autoWareHourceHaian.entity.HaiAnSOIssueNotifyOrderMaterialListData; import com.gaotao.modules.autoWareHourceHaian.entity.dto.HaiAnNoOrderMaterialAllocRequestData; @@ -54,14 +55,20 @@ public class HaiAnSOIssueNotifyOrderMaterialListAllocServiceImpl implements HaiA @Transactional(rollbackFor = Exception.class) public void saveAllocList(HaiAnNoOrderMaterialAllocRequestData requestData) { validateRequestKey(requestData); + // 保存前先按site+notifyNo读主单状态;未下达(UNISSUE)禁止改指定,避免未正式下达就锁定标签/批次 - rqrq + validateIssuedHeader(requestData); + // 校验材料行仍存在:入参site+notifyNo+itemNo+BOMItemNo;找不到则拒绝保存,避免写孤儿指定记录 - rqrq validateExistingMaterial(requestData); List incoming = requestData.getAllocList(); if (incoming == null) { incoming = new ArrayList<>(); } + // 规范化指定行并按页面顺序生成allocSeq;校验失败抛异常,后续删插不会执行 - rqrq List normalized = normalizeAllocList(requestData, incoming); + // 先删后插保证全量重存幂等:按物料行键删除旧指定,失败则整单回滚 - rqrq allocMapper.deleteAllocList(requestData.getSite(), requestData.getNotifyNo(), requestData.getItemNo(), requestData.getBOMItemNo()); if (!normalized.isEmpty()) { + // 按当前页面顺序插入新指定行;插入失败回滚,前端弹窗保留可改 - rqrq allocMapper.insertAllocList(normalized); } } @@ -140,12 +147,31 @@ public class HaiAnSOIssueNotifyOrderMaterialListAllocServiceImpl implements HaiA } } + /** + * @author rqrq + * @Description 校验申请单已下达:仅status=ISSUE允许保存指定物料;UNISSUE/CLOSED等一律拒绝,避免未下达锁定库存 - rqrq + * @param requestData 含site+notifyNo的指定保存请求;查询失败或状态不符时抛异常,事务回滚且不写alloc表 - rqrq + */ + private void validateIssuedHeader(HaiAnNoOrderMaterialAllocRequestData requestData) { + // 调用海安主单查询:入参site+notifyNo定位当前申请单;查不到则视为单据已删,不能继续指定 - rqrq + HaiAnSOIssueNotifyHeaderData header = issueNotifyMapper.haiAnGetNotifyHeader( + requestData.getSite(), requestData.getNotifyNo()); + if (header == null) { + throw new RuntimeException("申请单不存在,无法保存指定物料"); + } + String status = StringUtils.defaultString(header.getStatus()).trim(); + if (!"ISSUE".equalsIgnoreCase(status)) { + throw new RuntimeException("未下达申请单不允许指定物料"); + } + } + private void validateExistingMaterial(HaiAnNoOrderMaterialAllocRequestData requestData) { HaiAnSOIssueNotifyOrderMaterialListData query = new HaiAnSOIssueNotifyOrderMaterialListData(); query.setSite(requestData.getSite()); query.setNotifyNo(requestData.getNotifyNo()); query.setItemNo(requestData.getItemNo()); query.setBOMItemNo(requestData.getBOMItemNo()); + // 调用海安材料明细查询确认当前BOM行仍在申请单内;查不到则指定无法落库 - rqrq List materialRows = issueNotifyMapper.haiAnGetNoOrderMaterialList(query); if (materialRows == null || materialRows.isEmpty()) { throw new RuntimeException("当前物料行不存在或已被删除");