Browse Source

feat(inspection): 添加验货申请状态管理功能

- 新增countOtherInspectionRequests方法用于查询指定订单的其他验货申请
- 实现删除验货申请时的状态回退逻辑,包括PO明细和订单头状态
- 优化MyBatis Plus Lambda表达式的使用,统一引用方式
- 完善验货完成和回滚操作中的状态更新机制
- 添加对PO订单状态流转的完整支持,确保数据一致性
master
qiankanghui 2 weeks ago
parent
commit
57e87cc01d
  1. 15
      src/main/java/com/xujie/modules/inspection/mapper/InspectionRequestDetailSubMapper.java
  2. 214
      src/main/java/com/xujie/modules/inspection/service/impl/InspectionRequestServiceImpl.java
  3. 10
      src/main/resources/mapper/inspection/InspectionRequestDetailSubMapper.xml

15
src/main/java/com/xujie/modules/inspection/mapper/InspectionRequestDetailSubMapper.java

@ -26,4 +26,19 @@ public interface InspectionRequestDetailSubMapper extends BaseMapper<InspectionR
);
int deleteByRequestNo(@Param("site") String site, @Param("requestNo") String requestNo);
/**
* 查询指定订单是否还有其他验货申请排除当前申请单
* @param site 站点
* @param orderNo 订单号
* @param itemNo 行号
* @param excludeRequestNo 排除的申请单号
* @return 其他验货申请的数量
*/
int countOtherInspectionRequests(
@Param("site") String site,
@Param("orderNo") String orderNo,
@Param("itemNo") Integer itemNo,
@Param("excludeRequestNo") String excludeRequestNo
);
}

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

@ -1,6 +1,8 @@
package com.xujie.modules.inspection.service.impl;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -13,6 +15,9 @@ import com.xujie.modules.inspection.entity.QcPersonList;
import com.xujie.modules.inspection.mapper.InspectionRequestDetailMapper;
import com.xujie.modules.inspection.mapper.InspectionRequestDetailSubMapper;
import com.xujie.modules.order.dao.PODetailMapper;
import com.xujie.modules.order.dao.POHeaderMapper;
import com.xujie.modules.order.entity.PODetail;
import com.xujie.modules.order.entity.POHeader;
import com.xujie.modules.srm.mapper.SrmSupplierMapper;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
@ -47,9 +52,9 @@ public class InspectionRequestServiceImpl extends ServiceImpl<InspectionRequestH
@Autowired
private PODetailMapper podetailMapper;
@Autowired
private com.xujie.modules.order.dao.POHeaderMapper poheaderMapper;
private POHeaderMapper poheaderMapper;
@Autowired
private SrmSupplierMapper srmSupplierMapper;
@ -148,30 +153,30 @@ public class InspectionRequestServiceImpl extends ServiceImpl<InspectionRequestH
}
// 检查并更新POHeader和PODetail状态已下达 -> 待验货
com.xujie.modules.order.entity.PODetail poDetail =
PODetail poDetail =
podetailMapper.selectByPK(item.getOrderNo(), site, item.getItemNo());
if (poDetail != null && "已下达".equals(poDetail.getStatus())) {
// 更新 PODetail 状态为待验货
podetailMapper.update(null,
new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<com.xujie.modules.order.entity.PODetail>()
.eq(com.xujie.modules.order.entity.PODetail::getOrderNo, item.getOrderNo())
.eq(com.xujie.modules.order.entity.PODetail::getSite, site)
.eq(com.xujie.modules.order.entity.PODetail::getItemNo, item.getItemNo())
.set(com.xujie.modules.order.entity.PODetail::getStatus, "待验货")
new LambdaUpdateWrapper<PODetail>()
.eq(PODetail::getOrderNo, item.getOrderNo())
.eq(PODetail::getSite, site)
.eq(PODetail::getItemNo, item.getItemNo())
.set(PODetail::getStatus, "待验货")
);
log.info("开验货申请单 - 更新PODetail状态为待验货: orderNo={}, itemNo={}",
log.info("开验货申请单 - 更新PODetail状态为待验货: orderNo={}, itemNo={}",
item.getOrderNo(), item.getItemNo());
// 更新 POHeader 状态为待验货
poheaderMapper.update(null,
new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<com.xujie.modules.order.entity.POHeader>()
.eq(com.xujie.modules.order.entity.POHeader::getOrderNo, item.getOrderNo())
.eq(com.xujie.modules.order.entity.POHeader::getSite, site)
.set(com.xujie.modules.order.entity.POHeader::getStatus, "待验货")
new LambdaUpdateWrapper<POHeader>()
.eq(POHeader::getOrderNo, item.getOrderNo())
.eq(POHeader::getSite, site)
.set(POHeader::getStatus, "待验货")
);
log.info("开验货申请单 - 更新POHeader状态为待验货: orderNo={}", item.getOrderNo());
}
@ -266,7 +271,7 @@ public class InspectionRequestServiceImpl extends ServiceImpl<InspectionRequestH
throw new RuntimeException("只有状态为草稿,待审核和已下达的验货申请允许删除,当前状态:" + header.getStatus());
}
// 2. 查询sub表回退PO明细的to_inspect_qty数量
// 2. 查询sub表回退PO明细的to_inspect_qty数量并检查是否需要回退订单状态
List<InspectionRequestDetailSub> subList =
inspectionRequestDetailSubMapper.selectByRequestNo(site, requestNo);
@ -285,6 +290,57 @@ public class InspectionRequestServiceImpl extends ServiceImpl<InspectionRequestH
+ "-" + sub.getPoItemNo()
);
}
// 检查该订单是否还有其他验货申请
int otherRequestCount = inspectionRequestDetailSubMapper.countOtherInspectionRequests(
site,
sub.getPoNo(),
sub.getPoItemNo(),
requestNo
);
// 如果没有其他验货申请则回退订单状态待验货 -> 已下达
if (otherRequestCount == 0) {
PODetail poDetail =
podetailMapper.selectByPK(sub.getPoNo(), site, sub.getPoItemNo());
if (poDetail != null && "待验货".equals(poDetail.getStatus())) {
// 更新 PODetail 状态为已下达
podetailMapper.update(null,
new LambdaUpdateWrapper<PODetail>()
.eq(PODetail::getOrderNo, sub.getPoNo())
.eq(PODetail::getSite, site)
.eq(PODetail::getItemNo, sub.getPoItemNo())
.set(PODetail::getStatus, "已下达")
);
log.info("删除验货申请 - 回退PODetail状态为已下达: orderNo={}, itemNo={}",
sub.getPoNo(), sub.getPoItemNo());
// 检查 POHeader 下所有 PODetail 是否都是已下达状态
// 如果是则将 POHeader 也回退为已下达
java.util.List<PODetail> allDetails =
podetailMapper.selectList(
new LambdaQueryWrapper<PODetail>()
.eq(PODetail::getOrderNo, sub.getPoNo())
.eq(PODetail::getSite, site)
);
boolean allReleased = allDetails.stream()
.allMatch(detail -> "已下达".equals(detail.getStatus()));
if (allReleased) {
poheaderMapper.update(null,
new LambdaUpdateWrapper<POHeader>()
.eq(POHeader::getOrderNo, sub.getPoNo())
.eq(POHeader::getSite, site)
.set(POHeader::getStatus, "已下达")
);
log.info("删除验货申请 - 回退POHeader状态为已下达: orderNo={}", sub.getPoNo());
}
}
}
}
// 3. 删除子表明细 srm_inspect_request_detail_sub
@ -693,29 +749,29 @@ public class InspectionRequestServiceImpl extends ServiceImpl<InspectionRequestH
if (subList != null && !subList.isEmpty()) {
for (InspectionRequestDetailSub sub : subList) {
// 查询当前 PODetail
com.xujie.modules.order.entity.PODetail poDetail =
PODetail poDetail =
podetailMapper.selectByPK(sub.getPoNo(), site, sub.getPoItemNo());
if (poDetail != null && "待验货".equals(poDetail.getStatus())) {
// 更新 PODetail 状态为验货中
podetailMapper.update(null,
new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<com.xujie.modules.order.entity.PODetail>()
.eq(com.xujie.modules.order.entity.PODetail::getOrderNo, sub.getPoNo())
.eq(com.xujie.modules.order.entity.PODetail::getSite, site)
.eq(com.xujie.modules.order.entity.PODetail::getItemNo, sub.getPoItemNo())
.set(com.xujie.modules.order.entity.PODetail::getStatus, "验货中")
new LambdaUpdateWrapper<PODetail>()
.eq(PODetail::getOrderNo, sub.getPoNo())
.eq(PODetail::getSite, site)
.eq(PODetail::getItemNo, sub.getPoItemNo())
.set(PODetail::getStatus, "验货中")
);
log.info("开始验货 - 更新PODetail状态为验货中: orderNo={}, itemNo={}", sub.getPoNo(), sub.getPoItemNo());
// 更新 POHeader 状态为验货中
poheaderMapper.update(null,
new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<com.xujie.modules.order.entity.POHeader>()
.eq(com.xujie.modules.order.entity.POHeader::getOrderNo, sub.getPoNo())
.eq(com.xujie.modules.order.entity.POHeader::getSite, site)
.set(com.xujie.modules.order.entity.POHeader::getStatus, "验货中")
new LambdaUpdateWrapper<POHeader>()
.eq(POHeader::getOrderNo, sub.getPoNo())
.eq(POHeader::getSite, site)
.set(POHeader::getStatus, "验货中")
);
log.info("开始验货 - 更新POHeader状态为验货中: orderNo={}", sub.getPoNo());
}
}
@ -779,33 +835,33 @@ public class InspectionRequestServiceImpl extends ServiceImpl<InspectionRequestH
if (subList != null && !subList.isEmpty()) {
for (InspectionRequestDetailSub sub : subList) {
// 查询当前 PODetail inspect_approve_qty
com.xujie.modules.order.entity.PODetail poDetail =
PODetail poDetail =
podetailMapper.selectByPK(sub.getPoNo(), site, sub.getPoItemNo());
if (poDetail != null) {
BigDecimal currentApproveQty = poDetail.getInspectApproveQty() != null
BigDecimal currentApproveQty = poDetail.getInspectApproveQty() != null
? poDetail.getInspectApproveQty() : BigDecimal.ZERO;
BigDecimal newApproveQty = currentApproveQty.add(sub.getQty());
// 更新 PODetail inspect_approve_qty
int podUpdateCount = podetailMapper.update(null,
new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<com.xujie.modules.order.entity.PODetail>()
.eq(com.xujie.modules.order.entity.PODetail::getOrderNo, sub.getPoNo())
.eq(com.xujie.modules.order.entity.PODetail::getSite, site)
.eq(com.xujie.modules.order.entity.PODetail::getItemNo, sub.getPoItemNo())
.set(com.xujie.modules.order.entity.PODetail::getInspectApproveQty, newApproveQty)
new LambdaUpdateWrapper<PODetail>()
.eq(PODetail::getOrderNo, sub.getPoNo())
.eq(PODetail::getSite, site)
.eq(PODetail::getItemNo, sub.getPoItemNo())
.set(PODetail::getInspectApproveQty, newApproveQty)
);
if (podUpdateCount == 0) {
log.warn("更新 PODetail 验货完成数量失败: orderNo={}, itemNo={}", sub.getPoNo(), sub.getPoItemNo());
} else {
log.info("更新 PODetail 验货完成数量: orderNo={}, itemNo={}, qty={}, 原数量={}, 新数量={}",
sub.getPoNo(), sub.getPoItemNo(), sub.getQty(), currentApproveQty, newApproveQty);
// 根据验货完成数量更新 PODetail POHeader 状态
BigDecimal orderQty = poDetail.getQty() != null ? BigDecimal.valueOf(poDetail.getQty()) : BigDecimal.ZERO;
String newStatus;
if (newApproveQty.compareTo(orderQty) >= 0) {
// 验货完成数量 >= 订单数量验货完成
newStatus = "验货完成";
@ -816,27 +872,27 @@ public class InspectionRequestServiceImpl extends ServiceImpl<InspectionRequestH
// 验货完成数量 = 0保持原状态或回退到待验货
newStatus = poDetail.getStatus();
}
// 更新 PODetail 状态
podetailMapper.update(null,
new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<com.xujie.modules.order.entity.PODetail>()
.eq(com.xujie.modules.order.entity.PODetail::getOrderNo, sub.getPoNo())
.eq(com.xujie.modules.order.entity.PODetail::getSite, site)
.eq(com.xujie.modules.order.entity.PODetail::getItemNo, sub.getPoItemNo())
.set(com.xujie.modules.order.entity.PODetail::getStatus, newStatus)
new LambdaUpdateWrapper<PODetail>()
.eq(PODetail::getOrderNo, sub.getPoNo())
.eq(PODetail::getSite, site)
.eq(PODetail::getItemNo, sub.getPoItemNo())
.set(PODetail::getStatus, newStatus)
);
log.info("验货完成 - 更新PODetail状态: orderNo={}, itemNo={}, 状态={}",
log.info("验货完成 - 更新PODetail状态: orderNo={}, itemNo={}, 状态={}",
sub.getPoNo(), sub.getPoItemNo(), newStatus);
// 更新 POHeader 状态
poheaderMapper.update(null,
new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<com.xujie.modules.order.entity.POHeader>()
.eq(com.xujie.modules.order.entity.POHeader::getOrderNo, sub.getPoNo())
.eq(com.xujie.modules.order.entity.POHeader::getSite, site)
.set(com.xujie.modules.order.entity.POHeader::getStatus, newStatus)
new LambdaUpdateWrapper<POHeader>()
.eq(POHeader::getOrderNo, sub.getPoNo())
.eq(POHeader::getSite, site)
.set(POHeader::getStatus, newStatus)
);
log.info("验货完成 - 更新POHeader状态: orderNo={}, 状态={}", sub.getPoNo(), newStatus);
}
}
@ -929,24 +985,24 @@ public class InspectionRequestServiceImpl extends ServiceImpl<InspectionRequestH
int podRollbackCount = podetailMapper.deductInspectApproveQty(
sub.getPoNo(), site, sub.getPoItemNo(), sub.getQty()
);
if (podRollbackCount == 0) {
log.warn("回滚 PODetail 验货完成数量失败: orderNo={}, itemNo={}", sub.getPoNo(), sub.getPoItemNo());
} else {
log.info("回滚 PODetail 验货完成数量: orderNo={}, itemNo={}, 扣减qty={}",
sub.getPoNo(), sub.getPoItemNo(), sub.getQty());
// 查询更新后的 PODetail 以获取最新的 inspect_approve_qty
com.xujie.modules.order.entity.PODetail poDetail =
PODetail poDetail =
podetailMapper.selectByPK(sub.getPoNo(), site, sub.getPoItemNo());
if (poDetail != null) {
BigDecimal newApproveQty = poDetail.getInspectApproveQty() != null
BigDecimal newApproveQty = poDetail.getInspectApproveQty() != null
? poDetail.getInspectApproveQty() : BigDecimal.ZERO;
// 根据验货完成数量更新 PODetail POHeader 状态
String newStatus;
if (newApproveQty.compareTo(BigDecimal.ZERO) > 0) {
// 验货完成数量 > 0部分验货
newStatus = "部分验货";
@ -954,27 +1010,27 @@ public class InspectionRequestServiceImpl extends ServiceImpl<InspectionRequestH
// 验货完成数量 = 0回退到待验货
newStatus = "待验货";
}
// 更新 PODetail 状态
podetailMapper.update(null,
new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<com.xujie.modules.order.entity.PODetail>()
.eq(com.xujie.modules.order.entity.PODetail::getOrderNo, sub.getPoNo())
.eq(com.xujie.modules.order.entity.PODetail::getSite, site)
.eq(com.xujie.modules.order.entity.PODetail::getItemNo, sub.getPoItemNo())
.set(com.xujie.modules.order.entity.PODetail::getStatus, newStatus)
new LambdaUpdateWrapper<PODetail>()
.eq(PODetail::getOrderNo, sub.getPoNo())
.eq(PODetail::getSite, site)
.eq(PODetail::getItemNo, sub.getPoItemNo())
.set(PODetail::getStatus, newStatus)
);
log.info("回滚验货 - 更新PODetail状态: orderNo={}, itemNo={}, 状态={}, 当前数量={}",
log.info("回滚验货 - 更新PODetail状态: orderNo={}, itemNo={}, 状态={}, 当前数量={}",
sub.getPoNo(), sub.getPoItemNo(), newStatus, newApproveQty);
// 更新 POHeader 状态
poheaderMapper.update(null,
new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<com.xujie.modules.order.entity.POHeader>()
.eq(com.xujie.modules.order.entity.POHeader::getOrderNo, sub.getPoNo())
.eq(com.xujie.modules.order.entity.POHeader::getSite, site)
.set(com.xujie.modules.order.entity.POHeader::getStatus, newStatus)
new LambdaUpdateWrapper<POHeader>()
.eq(POHeader::getOrderNo, sub.getPoNo())
.eq(POHeader::getSite, site)
.set(POHeader::getStatus, newStatus)
);
log.info("回滚验货 - 更新POHeader状态: orderNo={}, 状态={}", sub.getPoNo(), newStatus);
}
}

10
src/main/resources/mapper/inspection/InspectionRequestDetailSubMapper.xml

@ -65,4 +65,14 @@
WHERE site = #{site}
AND request_no = #{requestNo}
</delete>
<!-- 查询指定订单是否还有其他验货申请(排除当前申请单) -->
<select id="countOtherInspectionRequests" resultType="int">
SELECT COUNT(1)
FROM srm_inspect_request_detail_sub
WHERE site = #{site}
AND po_no = #{orderNo}
AND po_item_no = #{itemNo}
AND request_no != #{excludeRequestNo}
</select>
</mapper>
Loading…
Cancel
Save