Browse Source

feat(inspection): 添加草稿编辑保存功能

- 新增 editSave 接口支持验货申请草稿的完整编辑保存
- 创建 InspectionEditSaveVO 数据传输对象用于接收前端编辑数据
- 实现事务性操作确保删除/修改/新增明细的原子性处理
- 集成 PO 数量回滚机制避免库存锁定问题
- 支持基础信息(验货日期、地址、联系人)的同时更新
- 完善日志记录便于操作追踪和问题排查
master
qiankanghui 12 hours ago
parent
commit
c34e8eab22
  1. 9
      src/main/java/com/xujie/modules/inspection/controller/InspectionController.java
  2. 50
      src/main/java/com/xujie/modules/inspection/data/InspectionEditSaveVO.java
  3. 5
      src/main/java/com/xujie/modules/inspection/service/InspectionRequestService.java
  4. 54
      src/main/java/com/xujie/modules/inspection/service/impl/InspectionRequestServiceImpl.java

9
src/main/java/com/xujie/modules/inspection/controller/InspectionController.java

@ -170,6 +170,15 @@ public class InspectionController {
return R.ok(); return R.ok();
} }
/**
* 草稿编辑保存合并删除/修改/新增/更新基础信息事务保证原子性
*/
@PostMapping("/editSave")
public R editSave(@RequestBody InspectionEditSaveVO vo){
inspectionRequestService.editSave(vo);
return R.ok();
}
/** /**
* 修改验货申请仅允许修改建议验货日期验货地址和联系人 * 修改验货申请仅允许修改建议验货日期验货地址和联系人
*/ */

50
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<InspectionRequestItemVO> items;
/**
* 建议验货日期
*/
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date needInspectDate;
/**
* 验货地址
*/
private String inspectAddress;
/**
* 验货地址ID
*/
private String inspectAddressId;
/**
* 联系人
*/
private String inspectContract;
}

5
src/main/java/com/xujie/modules/inspection/service/InspectionRequestService.java

@ -88,6 +88,11 @@ public interface InspectionRequestService extends IService<InspectionRequestHead
void updateRequest(InspectionRequestHeader header); void updateRequest(InspectionRequestHeader header);
/**
* 草稿编辑保存合并删除/修改/新增/更新基础信息
*/
void editSave(InspectionEditSaveVO vo);
/** /**
* 开始验货 * 开始验货
*/ */

54
src/main/java/com/xujie/modules/inspection/service/impl/InspectionRequestServiceImpl.java

@ -1538,6 +1538,60 @@ public class InspectionRequestServiceImpl extends ServiceImpl<InspectionRequestH
log.info("验货申请修改成功: requestNo={}", header.getRequestNo()); log.info("验货申请修改成功: requestNo={}", header.getRequestNo());
} }
@Transactional(rollbackFor = Exception.class)
@Override
public void editSave(InspectionEditSaveVO vo) {
if (vo == null || !StringUtils.hasText(vo.getRequestNo())) {
throw new RuntimeException("申请单号不能为空");
}
String requestNo = vo.getRequestNo();
String site = vo.getSite();
if (!StringUtils.hasText(site)) {
SysUserEntity user = (SysUserEntity) SecurityUtils.getSubject().getPrincipal();
site = user.getSite();
}
log.info("草稿编辑保存开始: requestNo={}, site={}, 明细数量={}", requestNo, site,
vo.getItems() != null ? vo.getItems().size() : 0);
List<InspectionRequestItemVO> items = vo.getItems();
if (items == null || items.isEmpty()) {
// 所有明细都被删除了回滚PO数量并清空明细记录
log.info("草稿编辑保存-所有明细已被删除,回滚PO数量并清空记录: requestNo={}", requestNo);
List<InspectionRequestDetailSub> 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) @Transactional(rollbackFor = Exception.class)
@Override @Override
public void startInspection(String requestNo, Integer itemNo) { public void startInspection(String requestNo, Integer itemNo) {

Loading…
Cancel
Save