Browse Source

拆分标签

dev
常熟吴彦祖 1 week ago
parent
commit
ff45c0a7ea
  1. 9
      src/main/java/com/gaotao/modules/autoWareHourceHaian/HAIAN_AI_CONTEXT.md
  2. 4
      src/main/java/com/gaotao/modules/autoWareHourceHaian/entity/dto/HaiAnNoOrderMaterialAllocRequestData.java
  3. 2
      src/main/java/com/gaotao/modules/autoWareHourceHaian/service/HaiAnSOIssueNotifyOrderMaterialListAllocService.java
  4. 26
      src/main/java/com/gaotao/modules/autoWareHourceHaian/service/impl/HaiAnSOIssueNotifyOrderMaterialListAllocServiceImpl.java

9
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

4
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;
}

2
src/main/java/com/gaotao/modules/autoWareHourceHaian/service/HaiAnSOIssueNotifyOrderMaterialListAllocService.java

@ -17,7 +17,7 @@ public interface HaiAnSOIssueNotifyOrderMaterialListAllocService {
List<HaiAnSOIssueNotifyOrderMaterialListAllocData> queryAllocList(HaiAnNoOrderMaterialAllocRequestData requestData);
/**
* 全量保存当前物料行分配策略保存前会统一校验排序重建alloc_seq - rqrq
* 全量保存当前物料行分配策略仅已下达(ISSUE)允许保存保存前校验物料行排序并重建alloc_seq - rqrq
*/
void saveAllocList(HaiAnNoOrderMaterialAllocRequestData requestData);

26
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<HaiAnSOIssueNotifyOrderMaterialListAllocData> incoming = requestData.getAllocList();
if (incoming == null) {
incoming = new ArrayList<>();
}
// 规范化指定行并按页面顺序生成allocSeq校验失败抛异常后续删插不会执行 - rqrq
List<HaiAnSOIssueNotifyOrderMaterialListAllocData> 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<HaiAnSOIssueNotifyOrderMaterialListData> materialRows = issueNotifyMapper.haiAnGetNoOrderMaterialList(query);
if (materialRows == null || materialRows.isEmpty()) {
throw new RuntimeException("当前物料行不存在或已被删除");

Loading…
Cancel
Save