refactor(qms): 重构不合格品评审服务

- 在 IQcUnqualifiedReviewService 接口中添加新方法 autoGenerateUnqualifiedReview- 删除 QcUnqualifiedGeneratorService 类,将其功能整合到其他服务中
- 优化不合格品评审记录自动生成逻辑
master
zch 3 days ago
parent f73b17aeca
commit a82a25324c

@ -1,6 +1,8 @@
package org.dromara.qms.service;
import org.dromara.qms.domain.QcUnqualifiedReview;
import org.dromara.qms.domain.vo.QcInspectionMainVo;
import org.dromara.qms.domain.vo.QcInspectionResultVo;
import org.dromara.qms.domain.vo.QcUnqualifiedReviewVo;
import org.dromara.qms.domain.bo.QcUnqualifiedReviewBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@ -98,4 +100,13 @@ public interface IQcUnqualifiedReviewService {
* @return
*/
Boolean triggerWorkflowProcess(QcUnqualifiedReviewBo bo);
/**
*
*
* @param inspectionVo
* @param inspectionResults
* @return
*/
Boolean autoGenerateUnqualifiedReview(QcInspectionMainVo inspectionVo, List<QcInspectionResultVo> inspectionResults);
}

@ -1,278 +0,0 @@
package org.dromara.qms.service.impl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.qms.domain.bo.QcUnqualifiedReviewBo;
import org.dromara.qms.domain.vo.QcInspectionMainVo;
import org.dromara.qms.domain.vo.QcInspectionItemDetailVo;
import org.dromara.qms.service.IQcUnqualifiedReviewService;
import org.dromara.qms.utils.QcInspectionResultCalculator;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
*
*
*
* @author zch
* @date 2025-07-18
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class QcUnqualifiedGeneratorService {
private final IQcUnqualifiedReviewService qcUnqualifiedReviewService;
/**
*
*
*
* @param inspectionVo
* @param inspectionItems
* @return
*/
public Boolean autoGenerateUnqualifiedReview(QcInspectionMainVo inspectionVo, List<QcInspectionItemDetailVo> inspectionItems) {
if (inspectionVo == null) {
log.error("质检主表数据为空,无法生成不合格品评审任务");
return false;
}
// 检查是否存在不合格项
List<QcInspectionItemDetailVo> unqualifiedItems = getUnqualifiedItems(inspectionItems);
if (unqualifiedItems.isEmpty()) {
log.info("质检任务全部合格,无需生成不合格品评审任务: {}", inspectionVo.getInspectionNo());
return true;
}
try {
// 生成不合格品评审任务
QcUnqualifiedReviewBo reviewBo = createUnqualifiedReviewBo(inspectionVo, unqualifiedItems);
// 保存不合格品评审任务
Boolean result = qcUnqualifiedReviewService.insertByBo(reviewBo);
if (result) {
log.info("成功生成不合格品评审任务: 质检单号={}, 不合格项数量={}",
inspectionVo.getInspectionNo(), unqualifiedItems.size());
} else {
log.error("生成不合格品评审任务失败: {}", inspectionVo.getInspectionNo());
}
return result;
} catch (Exception e) {
log.error("生成不合格品评审任务异常: {}", inspectionVo.getInspectionNo(), e);
return false;
}
}
/**
*
*
* @param inspectionItems
* @return
*/
private List<QcInspectionItemDetailVo> getUnqualifiedItems(List<QcInspectionItemDetailVo> inspectionItems) {
if (inspectionItems == null || inspectionItems.isEmpty()) {
return List.of();
}
return inspectionItems.stream()
.filter(item -> {
Long resultStatus = QcInspectionResultCalculator.calculateItemResultStatus(item);
return QcInspectionResultCalculator.RESULT_STATUS_UNQUALIFIED.equals(resultStatus);
})
.collect(Collectors.toList());
}
/**
*
*
* @param inspectionVo
* @param unqualifiedItems
* @return
*/
private QcUnqualifiedReviewBo createUnqualifiedReviewBo(QcInspectionMainVo inspectionVo, List<QcInspectionItemDetailVo> unqualifiedItems) {
QcUnqualifiedReviewBo reviewBo = new QcUnqualifiedReviewBo();
// 生成不合格检测单号
String unqualifiedNo = generateUnqualifiedNo(inspectionVo.getInspectionNo());
reviewBo.setUnqualifiedNo(unqualifiedNo);
// 设置关联的质检主表ID
reviewBo.setInspectionId(inspectionVo.getInspectionId());
// 设置检测类型
reviewBo.setTypeId(inspectionVo.getTypeId());
// 复制质检主表的基本信息
// reviewBo.setWorkOrder(inspectionVo.getWorkOrder());
// reviewBo.setProcessCode(inspectionVo.getProcessCode());
reviewBo.setProcessName(inspectionVo.getProcessName());
reviewBo.setBatchNo(inspectionVo.getBatchNo());
reviewBo.setMaterialName(inspectionVo.getMaterialName());
reviewBo.setMaterialCode(inspectionVo.getMaterialCode());
// 设置质检员检测结果描述
String inspectorResult = buildInspectorResultDescription(unqualifiedItems);
reviewBo.setInspectorResult(inspectorResult);
// 初始状态待评审reviewResult为空
reviewBo.setReviewResult(null);
reviewBo.setReviewer(null);
reviewBo.setReviewTime(null);
return reviewBo;
}
/**
*
* UQ + + 4
*
* @param inspectionNo
* @return
*/
private String generateUnqualifiedNo(String inspectionNo) {
String timestamp = String.valueOf(System.currentTimeMillis());
String suffix = timestamp.substring(timestamp.length() - 4);
if (StringUtils.isNotBlank(inspectionNo)) {
return "UQ" + inspectionNo + suffix;
} else {
return "UQ" + System.currentTimeMillis();
}
}
/**
*
*
* @param unqualifiedItems
* @return
*/
private String buildInspectorResultDescription(List<QcInspectionItemDetailVo> unqualifiedItems) {
if (unqualifiedItems == null || unqualifiedItems.isEmpty()) {
return "无不合格项";
}
StringBuilder description = new StringBuilder();
description.append("不合格项目:");
for (int i = 0; i < unqualifiedItems.size(); i++) {
QcInspectionItemDetailVo item = unqualifiedItems.get(i);
if (i > 0) {
description.append("");
}
description.append(item.getItemName());
// 添加具体的不合格原因
if (QcInspectionResultCalculator.DETECT_TYPE_QUANTITATIVE.equals(item.getDetectType())) {
// 定量检测:显示检测值和限值
if (item.getValue() != null) {
description.append("(检测值:").append(item.getValue());
if (Boolean.TRUE.equals(item.getIsOutOfControlLimit())) {
description.append(", 超出控制限");
if (item.getUpperLimit() != null) {
description.append(", 上限:").append(item.getUpperLimit());
}
if (item.getLowerLimit() != null) {
description.append(", 下限:").append(item.getLowerLimit());
}
}
description.append(")");
}
} else {
// 定性检测:显示检测结果
if (StringUtils.isNotBlank(item.getResult())) {
description.append("(结果:").append(item.getResult()).append(")");
}
}
}
// 限制描述长度,避免过长
String result = description.toString();
if (result.length() > 500) {
result = result.substring(0, 497) + "...";
}
return result;
}
/**
*
*
* @param inspectionVo
* @param overallResult
* @return
*/
public Boolean shouldGenerateUnqualifiedReview(QcInspectionMainVo inspectionVo, Long overallResult) {
// 如果整体结果合格,不需要生成
if (QcInspectionResultCalculator.RESULT_STATUS_QUALIFIED.equals(overallResult)) {
return false;
}
// 检查是否已经存在不合格品评审任务
if (hasExistingUnqualifiedReview(inspectionVo.getInspectionId())) {
log.info("质检任务已存在不合格品评审任务,跳过生成: {}", inspectionVo.getInspectionNo());
return false;
}
return true;
}
/**
*
*
* @param inspectionId ID
* @return
*/
private Boolean hasExistingUnqualifiedReview(Long inspectionId) {
try {
// 查询是否已存在该质检任务的不合格品评审记录
QcUnqualifiedReviewBo queryBo = new QcUnqualifiedReviewBo();
queryBo.setInspectionId(inspectionId);
return !qcUnqualifiedReviewService.queryList(queryBo).isEmpty();
} catch (Exception e) {
log.error("检查不合格品评审任务是否存在时发生异常: inspectionId={}", inspectionId, e);
return false;
}
}
/**
*
*
* @param inspectionList
* @return
*/
public Integer batchGenerateUnqualifiedReviews(List<QcInspectionMainVo> inspectionList) {
if (inspectionList == null || inspectionList.isEmpty()) {
return 0;
}
int successCount = 0;
for (QcInspectionMainVo inspection : inspectionList) {
try {
// 这里需要获取检测项数据,实际实现中可能需要调用其他服务
// List<QcInspectionItemDetailVo> items = getInspectionItems(inspection.getInspectionId());
// Boolean result = autoGenerateUnqualifiedReview(inspection, items);
// if (Boolean.TRUE.equals(result)) {
// successCount++;
// }
} catch (Exception e) {
log.error("批量生成不合格品评审任务失败: {}", inspection.getInspectionNo(), e);
}
}
log.info("批量生成不合格品评审任务完成,总数: {}, 成功: {}", inspectionList.size(), successCount);
return successCount;
}
}
Loading…
Cancel
Save