Browse Source

feat(qms): 添加检验单删除时的状态回滚功能

- 新增 rollbackHeaderToScheduled 方法用于回滚头表状态为已排程
- 在 IQC 记录删除时添加状态一致性校验
- 实现明细回滚后检查是否全部为已排程状态
- 当所有明细都回滚为已排程时自动更新主单状态
- 优化 PO 行号转换逻辑并添加异常处理
- 添加详细的日志记录用于调试跟踪
master
qiankanghui 3 weeks ago
parent
commit
3e585496f7
  1. 6
      src/main/java/com/xujie/modules/inspection/mapper/InspectionRequestHeaderMapper.java
  2. 68
      src/main/java/com/xujie/modules/qms/service/impl/QcServiceImpl.java
  3. 11
      src/main/resources/mapper/inspection/InspectionRequestHeaderMapper.xml

6
src/main/java/com/xujie/modules/inspection/mapper/InspectionRequestHeaderMapper.java

@ -75,4 +75,10 @@ public interface InspectionRequestHeaderMapper extends BaseMapper<InspectionRequ
*/
int rollbackHeaderToInspecting(@Param("site") String site,
@Param("requestNo") String requestNo);
/**
* 回滚头表状态为已排程当所有明细都回滚为已排程时调用
*/
int rollbackHeaderToScheduled(@Param("site") String site,
@Param("requestNo") String requestNo);
}

68
src/main/java/com/xujie/modules/qms/service/impl/QcServiceImpl.java

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xujie.common.exception.XJException;
import com.xujie.common.utils.*;
import com.xujie.modules.inspection.data.MyInspectionListVO;
import com.xujie.modules.inspection.entity.InspectionRequestDetail;
import com.xujie.modules.inspection.mapper.InspectionRequestDetailMapper;
import com.xujie.modules.inspection.mapper.InspectionRequestHeaderMapper;
import com.xujie.modules.qms.data.PartData;
@ -3675,41 +3676,80 @@ public class QcServiceImpl implements QcService {
@Override
@Transactional
public void iqcRecordDelete(QcFAIRecordData data) {
String state = data.getSubmitList().get(0).getState();
// 判断状态是否一致
boolean bool = data.getSubmitList().stream().anyMatch(a -> !state.equals(a.getState()));
if (bool) {
List<QcFAIRecordData> list = data.getSubmitList();
if (list == null || list.isEmpty()) {
return;
}
// 1. 校验状态一致性
String firstState = list.get(0).getState();
boolean inconsistent = list.stream()
.anyMatch(a -> !Objects.equals(firstState, a.getState()));
if (inconsistent) {
throw new RuntimeException("所选检验单状态不一致,请确认!");
}
for (QcFAIRecordData qcData : data.getSubmitList()){
// 判断状态
// 2. 循环处理删除
for (QcFAIRecordData qcData : list) {
// 状态校验
if ("已完成".equals(qcData.getState())) {
throw new RuntimeException("检验单已完成,不允许删除!");
}
// 回滚验货申请明细清空inspect_no并更新状态为已排程
// ===== 回滚逻辑 =====
if (qcData.getPoOrderNo() != null && qcData.getPoItemNo() != null) {
try {
Integer poItemNo = Integer.parseInt(qcData.getPoItemNo());
Integer poItemNo = Integer.valueOf(qcData.getPoItemNo());
// 回滚明细
inspectionRequestDetailMapper.rollbackInspectRequestDetail(
qcData.getSite(),
qcData.getPoOrderNo(),
poItemNo
);
// 查询明细
List<InspectionRequestDetail> detailList =
inspectionRequestDetailMapper.selectList(
new LambdaQueryWrapper<InspectionRequestDetail>()
.eq(InspectionRequestDetail::getSite, qcData.getSite())
.eq(InspectionRequestDetail::getRequestNo, qcData.getPoOrderNo())
);
// 判断是否全部 Scheduled
boolean allScheduled = detailList.stream()
.allMatch(d -> "Scheduled".equals(d.getStatusDb()));
// 更新主表
if (allScheduled) {
log.info("所有明细已回滚为Scheduled,更新主单: {}", qcData.getPoOrderNo());
int count = inspectionRequestHeaderMapper.rollbackHeaderToScheduled(
qcData.getSite(),
qcData.getPoOrderNo()
);
if (count == 0) {
throw new RuntimeException("更新主记录状态失败");
}
} else {
log.info("存在未回滚明细,不更新主单: {}, size={}",
qcData.getPoOrderNo(), detailList.size());
}
} catch (NumberFormatException e) {
// poItemNo格式错误时忽略继续执行删除逻辑
throw new RuntimeException("PO行号格式错误: " + qcData.getPoItemNo(), e);
}
}
// 删除检验记录
// ===== 删除业务数据 =====
qcMapper.deleteIQCRecord(qcData);
// 删除明细记录信息
qcMapper.deleteIQCDetailedRecord(qcData);
// 删除子明细记录信息
qcMapper.deleteIQCSubDetailedRecord(qcData);
// 删除数据采集的数据
qcMapper.deleteEquipmentDataAcquisition(qcData);
// 删除文件
qcMapper.deleteInspectionFiles(qcData);
}
}

11
src/main/resources/mapper/inspection/InspectionRequestHeaderMapper.xml

@ -51,7 +51,7 @@
<if test="query.planStartDateStr != null and query.planStartDateStr != '' "> and h.plan_start_date &gt;= #{query.planStartDateStr}</if>
<if test="query.planEndDateStr != null and query.planEndDateStr != '' "> and h.plan_end_date &lt;= #{query.planEndDateStr}</if>
</where>
order by h.request_date desc
order by h.request_no desc
</select>
<select id="queryPoPage" resultType="com.xujie.modules.inspection.data.InspectionRequestItemVO">
SELECT
@ -248,4 +248,13 @@
WHERE site = #{site}
AND request_no = #{requestNo}
</update>
<!-- 回滚头表状态为已排程(当所有明细都回滚为已排程时调用) -->
<update id="rollbackHeaderToScheduled">
UPDATE srm_inspection_request_header
SET status = '已排程',
status_db = 'Scheduled'
WHERE site = #{site}
AND request_no = #{requestNo}
</update>
</mapper>
Loading…
Cancel
Save