From c34e8eab2283c34b639723ee5f2de5fcd63b384b Mon Sep 17 00:00:00 2001 From: qiankanghui Date: Wed, 12 Aug 2026 10:58:33 +0800 Subject: [PATCH] =?UTF-8?q?feat(inspection):=20=E6=B7=BB=E5=8A=A0=E8=8D=89?= =?UTF-8?q?=E7=A8=BF=E7=BC=96=E8=BE=91=E4=BF=9D=E5=AD=98=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 editSave 接口支持验货申请草稿的完整编辑保存 - 创建 InspectionEditSaveVO 数据传输对象用于接收前端编辑数据 - 实现事务性操作确保删除/修改/新增明细的原子性处理 - 集成 PO 数量回滚机制避免库存锁定问题 - 支持基础信息(验货日期、地址、联系人)的同时更新 - 完善日志记录便于操作追踪和问题排查 --- .../controller/InspectionController.java | 9 ++++ .../inspection/data/InspectionEditSaveVO.java | 50 +++++++++++++++++ .../service/InspectionRequestService.java | 5 ++ .../impl/InspectionRequestServiceImpl.java | 54 +++++++++++++++++++ 4 files changed, 118 insertions(+) create mode 100644 src/main/java/com/xujie/modules/inspection/data/InspectionEditSaveVO.java diff --git a/src/main/java/com/xujie/modules/inspection/controller/InspectionController.java b/src/main/java/com/xujie/modules/inspection/controller/InspectionController.java index 5dbd45a..e7464bb 100644 --- a/src/main/java/com/xujie/modules/inspection/controller/InspectionController.java +++ b/src/main/java/com/xujie/modules/inspection/controller/InspectionController.java @@ -170,6 +170,15 @@ public class InspectionController { return R.ok(); } + /** + * 草稿编辑保存(合并删除/修改/新增/更新基础信息,事务保证原子性) + */ + @PostMapping("/editSave") + public R editSave(@RequestBody InspectionEditSaveVO vo){ + inspectionRequestService.editSave(vo); + return R.ok(); + } + /** * 修改验货申请(仅允许修改建议验货日期、验货地址和联系人) */ diff --git a/src/main/java/com/xujie/modules/inspection/data/InspectionEditSaveVO.java b/src/main/java/com/xujie/modules/inspection/data/InspectionEditSaveVO.java new file mode 100644 index 0000000..16a98af --- /dev/null +++ b/src/main/java/com/xujie/modules/inspection/data/InspectionEditSaveVO.java @@ -0,0 +1,50 @@ +package com.xujie.modules.inspection.data; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * 草稿编辑保存VO(前端传入编辑后的完整明细最终状态) + */ +@Data +public class InspectionEditSaveVO { + + /** + * 申请单号 + */ + private String requestNo; + + /** + * 站点/工厂编码 + */ + private String site; + + /** + * 编辑后的完整PO明细列表(最终状态,包含所有保留和新增的明细) + */ + private List items; + + /** + * 建议验货日期 + */ + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date needInspectDate; + + /** + * 验货地址 + */ + private String inspectAddress; + + /** + * 验货地址ID + */ + private String inspectAddressId; + + /** + * 联系人 + */ + private String inspectContract; +} diff --git a/src/main/java/com/xujie/modules/inspection/service/InspectionRequestService.java b/src/main/java/com/xujie/modules/inspection/service/InspectionRequestService.java index 877207e..836f41e 100644 --- a/src/main/java/com/xujie/modules/inspection/service/InspectionRequestService.java +++ b/src/main/java/com/xujie/modules/inspection/service/InspectionRequestService.java @@ -88,6 +88,11 @@ public interface InspectionRequestService extends IService items = vo.getItems(); + + if (items == null || items.isEmpty()) { + // 所有明细都被删除了,回滚PO数量并清空明细记录 + log.info("草稿编辑保存-所有明细已被删除,回滚PO数量并清空记录: requestNo={}", requestNo); + List existingSubs = + inspectionRequestDetailSubMapper.selectByRequestNo(site, requestNo); + for (InspectionRequestDetailSub sub : existingSubs) { + int count = poDetailMapper.rollbackInspectQty( + site, sub.getPoNo(), sub.getPoItemNo(), sub.getQty()); + if (count == 0) { + throw new RuntimeException("回退PO待验货数量失败:" + sub.getPoNo() + "-" + sub.getPoItemNo()); + } + } + inspectionRequestDetailSubMapper.deleteByRequestNo(site, requestNo); + inspectionRequestDetailMapper.deleteByRequestNo(site, requestNo); + } else { + // 调用editDetails全量替换明细(回滚旧数量 → 删除旧记录 → 插入新明细并锁定新数量) + InspectionRequestEditVO editVO = new InspectionRequestEditVO(); + editVO.setRequestNo(requestNo); + editVO.setSite(site); + editVO.setItems(items); + this.editDetails(editVO); + } + + // 更新基础信息 + InspectionRequestHeader header = new InspectionRequestHeader(); + header.setRequestNo(requestNo); + header.setNeedInspectDate(vo.getNeedInspectDate()); + header.setInspectAddress(vo.getInspectAddress()); + header.setInspectAddressId(vo.getInspectAddressId()); + header.setInspectContract(vo.getInspectContract()); + this.updateRequest(header); + + log.info("草稿编辑保存完成: requestNo={}", requestNo); + } + @Transactional(rollbackFor = Exception.class) @Override public void startInspection(String requestNo, Integer itemNo) {