PDI统计数据优化

PDI任务记录更新需求
This commit is contained in:
funny 2026-05-27 14:29:50 +08:00
parent 5bb2f41a0c
commit db885a9105
5 changed files with 173 additions and 6 deletions

View File

@ -73,6 +73,9 @@ public class QmsIssueTicketControllerService {
@Resource
private IQmsPdiInspectionResultsService pdiInspectionResultsService;
@Resource
private IQmsPdiInspectionResultsLoadingImageService pdiInspectionResultsLoadingImageService;
@Resource
private IQmsPdiDetectionRulesStatusItemService pdiStatusItemService;
@ -2700,6 +2703,11 @@ public class QmsIssueTicketControllerService {
.set(QmsIssueTicket::getUpdateTime, now)
.update();
// PDI工单关闭时创建新任务单复制内容不合格项改为合格
if (ticket.getSourceType() != null && ticket.getSourceType() == 1 && ticket.getSourceId() != null) {
createPdiRepairTask(ticket.getSourceId(), now);
}
} else if (request.getCreateApproval() == 1) {
// 驳回工单
// 校验handlers和审批意见不能为空
@ -2794,4 +2802,76 @@ public class QmsIssueTicketControllerService {
})
.collect(Collectors.toList());
}
/**
* PDI工单关闭时创建新任务单
* 复制原任务内容将不合格项改为合格
*/
private void createPdiRepairTask(Long originalTaskId, LocalDateTime now) {
// 1. 获取原任务
QmsPdiTaskRecord originalTask = pdiTaskRecordService.getById(originalTaskId);
if (originalTask == null) {
return;
}
// 2. 创建新任务单
QmsPdiTaskRecord newTask = new QmsPdiTaskRecord()
.setTaskNo(basdeSerialNumberControllerService.generateSerialNumber(1))
.setDeviceNo(originalTask.getDeviceNo())
.setDetectionRulesId(originalTask.getDetectionRulesId())
.setInspectionEnable(2) // 已完成
.setInspectionInspection(true) // 合格
.setAssistantId(originalTask.getAssistantId())
.setSubmissionTime(originalTask.getSubmissionTime())
.setRequiredCompletionTime(originalTask.getRequiredCompletionTime())
.setStartDetectionTime(originalTask.getStartDetectionTime())
.setDetectionCompletionTime(now)
.setOverdue(originalTask.getOverdue())
.setPushRecords(originalTask.getPushRecords())
.setFactoryNo(originalTask.getFactoryNo())
.setOrderNo(originalTask.getOrderNo())
.setWarehouseNo(originalTask.getWarehouseNo())
.setRelatedTaskId(originalTask.getId());
pdiTaskRecordService.save(newTask);
// 3. 复制检验结果不合格项改为合格
List<QmsPdiInspectionResults> oldResults = pdiInspectionResultsService.lambdaQuery()
.eq(QmsPdiInspectionResults::getTaskId, originalTaskId)
.list();
if (!oldResults.isEmpty()) {
List<QmsPdiInspectionResults> newResults = new ArrayList<>();
for (QmsPdiInspectionResults old : oldResults) {
QmsPdiInspectionResults newResult = new QmsPdiInspectionResults()
.setDetectionRulesId(old.getDetectionRulesId())
.setTaskId(newTask.getId())
.setInspectionItemId(old.getInspectionItemId())
.setInspectionItemType(old.getInspectionItemType())
.setInspectionItemImage(old.getInspectionItemImage())
.setInspectionItemResults(true) // 全部改为合格
.setRemark(old.getRemark())
.setInspectorId(old.getInspectorId())
.setInspectionTime(old.getInspectionTime())
.setInspectionBy(old.getInspectionBy());
newResults.add(newResult);
}
pdiInspectionResultsService.saveBatch(newResults);
}
// 4. 复制装车前图片
List<QmsPdiInspectionResultsLoadingImage> oldImages = pdiInspectionResultsLoadingImageService.lambdaQuery()
.eq(QmsPdiInspectionResultsLoadingImage::getTaskId, originalTaskId)
.list();
if (!oldImages.isEmpty()) {
List<QmsPdiInspectionResultsLoadingImage> newImages = new ArrayList<>();
for (QmsPdiInspectionResultsLoadingImage old : oldImages) {
QmsPdiInspectionResultsLoadingImage newImage = new QmsPdiInspectionResultsLoadingImage()
.setTaskId(newTask.getId())
.setLoadingImage(old.getLoadingImage());
newImages.add(newImage);
}
pdiInspectionResultsLoadingImageService.saveBatch(newImages);
}
}
}

View File

@ -847,21 +847,25 @@ public class QmsPqcTaskRecordControllerService {
}
}
// 校验工序检查一二级
// 校验工序检查一二级自检数据和自检附件有一个不为空即有效
if (request.getProcessInspections() != null) {
for (int i = 0; i < request.getProcessInspections().size(); i++) {
QmsPqcTaskRecordDraftQO.ProcessInspectionItem item = request.getProcessInspections().get(i);
if (StrUtil.isBlank(item.getSelfTestData())) {
boolean hasSelfTestData = StrUtil.isNotBlank(item.getSelfTestData());
boolean hasSelfTestFiles = item.getSelfTestFiles() != null && !item.getSelfTestFiles().isEmpty();
if (!hasSelfTestData && !hasSelfTestFiles) {
emptyFields.add("processInspections[" + i + "].selfTestData");
}
}
}
// 校验工序检查三级
// 校验工序检查三级QC检测数据和QC检测附件有一个不为空即有效
if (request.getProcessInspectionsLevel3() != null) {
for (int i = 0; i < request.getProcessInspectionsLevel3().size(); i++) {
QmsPqcTaskRecordDraftQO.ProcessInspectionLevel3Item item = request.getProcessInspectionsLevel3().get(i);
if (StrUtil.isBlank(item.getQcTestData())) {
boolean hasQcTestData = StrUtil.isNotBlank(item.getQcTestData());
boolean hasQcTestFiles = item.getQcTestFiles() != null && !item.getQcTestFiles().isEmpty();
if (!hasQcTestData && !hasQcTestFiles) {
emptyFields.add("processInspectionsLevel3[" + i + "].qcTestData");
}
}
@ -989,7 +993,69 @@ public class QmsPqcTaskRecordControllerService {
.setCreateTime(now);
issueTicketService.save(ticket);
// 2. 创建返修任务
String repairTaskNo = basdeSerialNumberControllerService.generateSerialNumber(42);
QmsPqcTaskRecord repairTask = new QmsPqcTaskRecord()
.setTaskNo(repairTaskNo)
.setAufnr(taskRecord.getAufnr())
.setModelNo(taskRecord.getModelNo())
.setNo(taskRecord.getNo())
.setInspectionPointId(taskRecord.getInspectionPointId())
.setRelatedTaskId(taskRecord.getId())
.setStatus((short) 0) // 自检中
.setEnable(true)
.setCreateTime(now);
pqcTaskRecordService.save(repairTask);
// 3. 复制详情记录合格项保留全部数据不合格项清空自检/QC数据附件及复核意见
List<QmsPqcTaskRecordDetails> oldDetails = pqcTaskRecordDetailsService.lambdaQuery()
.eq(QmsPqcTaskRecordDetails::getTaskId, taskRecord.getId())
.list();
List<QmsPqcTaskRecordDetails> newDetails = new ArrayList<>();
for (QmsPqcTaskRecordDetails old : oldDetails) {
QmsPqcTaskRecordDetails newDetail = new QmsPqcTaskRecordDetails()
.setTaskId(repairTask.getId())
.setInspectionPointItemId(old.getInspectionPointItemId())
.setType(old.getType());
if (old.getType() != null && old.getType() == 1) {
// 关键物料采集全部复制
newDetail.setSelfTestData(old.getSelfTestData())
.setReviewData(old.getReviewData())
.setSelfTestAttachments(old.getSelfTestAttachments());
} else {
// 工序检查根据是否合格决定复制策略
if (Boolean.TRUE.equals(old.getReviewEnable())) {
// 合格项保留全部数据
newDetail.setSelfTestData(old.getSelfTestData())
.setReviewData(old.getReviewData())
.setReviewEnable(old.getReviewEnable())
.setSelfTestAttachments(old.getSelfTestAttachments())
.setReviewAttachments(old.getReviewAttachments())
.setReviewOpinion(old.getReviewOpinion())
.setQcTestData(old.getQcTestData())
.setQcTestAttachments(old.getQcTestAttachments());
}
// 不合格项只保留 inspectionPointItemId type其他字段为空等自检人重新填写
}
newDetails.add(newDetail);
}
if (!newDetails.isEmpty()) {
pqcTaskRecordDetailsService.saveBatch(newDetails);
}
// 4. 推送通知原自检人重新自检
if (taskRecord.getSelfTesterId() != null) {
Long repairTypeId = dictionaryItemService.getId("消息类型", "PQCRepairTask");
if (repairTypeId != null) {
sendTodoMessage(taskRecord.getSelfTesterId(), taskRecord.getSelfTesterName(),
repairTask.getId(), repairTypeId, currentUserId, currentUserName, now);
}
}
// 返回工单编号
return ticketNo;
}

View File

@ -530,6 +530,7 @@ public class QmsReportControllerService {
// 当前周期总检测量
long currentTotal = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.ge(QmsPdiTaskRecord::getSubmissionTime, currentStart)
.le(QmsPdiTaskRecord::getSubmissionTime, currentEnd)
.count();
@ -538,6 +539,7 @@ public class QmsReportControllerService {
long previousTotal = 0;
if (hasTimeRange) {
previousTotal = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.ge(QmsPdiTaskRecord::getSubmissionTime, previousStart)
.le(QmsPdiTaskRecord::getSubmissionTime, previousEnd)
.count();
@ -565,6 +567,7 @@ public class QmsReportControllerService {
// 当前周期已完成
long currentCompleted = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.eq(QmsPdiTaskRecord::getInspectionEnable, 2)
.ge(QmsPdiTaskRecord::getSubmissionTime, currentStart)
.le(QmsPdiTaskRecord::getSubmissionTime, currentEnd)
@ -574,6 +577,7 @@ public class QmsReportControllerService {
long previousCompleted = 0;
if (hasTimeRange) {
previousCompleted = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.eq(QmsPdiTaskRecord::getInspectionEnable, 2)
.ge(QmsPdiTaskRecord::getSubmissionTime, previousStart)
.le(QmsPdiTaskRecord::getSubmissionTime, previousEnd)
@ -597,6 +601,7 @@ public class QmsReportControllerService {
*/
private int calculatePdiPendingTasks(LocalDateTime currentStart, LocalDateTime currentEnd) {
long count = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.eq(QmsPdiTaskRecord::getInspectionEnable, 0)
.ge(QmsPdiTaskRecord::getSubmissionTime, currentStart)
.le(QmsPdiTaskRecord::getSubmissionTime, currentEnd)
@ -617,6 +622,7 @@ public class QmsReportControllerService {
long currentAvgSeconds = 0;
List<QmsPdiTaskRecord> currentCompletedTasks = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.eq(QmsPdiTaskRecord::getInspectionEnable, 2)
.ge(QmsPdiTaskRecord::getSubmissionTime, currentStart)
.le(QmsPdiTaskRecord::getSubmissionTime, currentEnd)
@ -640,6 +646,7 @@ public class QmsReportControllerService {
if (hasTimeRange) {
List<QmsPdiTaskRecord> previousCompletedTasks = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.eq(QmsPdiTaskRecord::getInspectionEnable, 2)
.ge(QmsPdiTaskRecord::getSubmissionTime, previousStart)
.le(QmsPdiTaskRecord::getSubmissionTime, previousEnd)
@ -675,6 +682,7 @@ public class QmsReportControllerService {
*/
private double calculatePdiPlanCompletionRate(LocalDateTime currentStart, LocalDateTime currentEnd) {
long total = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.ge(QmsPdiTaskRecord::getSubmissionTime, currentStart)
.le(QmsPdiTaskRecord::getSubmissionTime, currentEnd)
.count();
@ -682,6 +690,7 @@ public class QmsReportControllerService {
if (total == 0) return 0;
long completed = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.eq(QmsPdiTaskRecord::getInspectionEnable, 2)
.ge(QmsPdiTaskRecord::getSubmissionTime, currentStart)
.le(QmsPdiTaskRecord::getSubmissionTime, currentEnd)
@ -700,6 +709,7 @@ public class QmsReportControllerService {
// 当前周期
long currentTotal = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.ge(QmsPdiTaskRecord::getSubmissionTime, currentStart)
.le(QmsPdiTaskRecord::getSubmissionTime, currentEnd)
.count();
@ -707,6 +717,7 @@ public class QmsReportControllerService {
long currentFail = 0;
if (currentTotal > 0) {
currentFail = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.eq(QmsPdiTaskRecord::getInspectionInspection, false)
.ge(QmsPdiTaskRecord::getSubmissionTime, currentStart)
.le(QmsPdiTaskRecord::getSubmissionTime, currentEnd)
@ -719,12 +730,14 @@ public class QmsReportControllerService {
double previousFailRate = 0;
if (hasTimeRange) {
long previousTotal = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.ge(QmsPdiTaskRecord::getSubmissionTime, previousStart)
.le(QmsPdiTaskRecord::getSubmissionTime, previousEnd)
.count();
if (previousTotal > 0) {
long previousFail = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.eq(QmsPdiTaskRecord::getInspectionInspection, false)
.ge(QmsPdiTaskRecord::getSubmissionTime, previousStart)
.le(QmsPdiTaskRecord::getSubmissionTime, previousEnd)
@ -761,6 +774,7 @@ public class QmsReportControllerService {
// 该周已完成数
long weekCompleted = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.eq(QmsPdiTaskRecord::getInspectionEnable, 2)
.ge(QmsPdiTaskRecord::getSubmissionTime, currentWeekStart)
.le(QmsPdiTaskRecord::getSubmissionTime, currentWeekEnd)
@ -770,6 +784,7 @@ public class QmsReportControllerService {
long weekQualified = 0;
if (weekCompleted > 0) {
weekQualified = pdiTaskRecordService.lambdaQuery()
.isNull(QmsPdiTaskRecord::getRelatedTaskId)
.eq(QmsPdiTaskRecord::getInspectionEnable, 2)
.eq(QmsPdiTaskRecord::getInspectionInspection, true)
.ge(QmsPdiTaskRecord::getSubmissionTime, currentWeekStart)

View File

@ -96,4 +96,9 @@ public class QmsPdiTaskRecord implements Serializable {
* 仓库编号
*/
private String warehouseNo;
/**
* 关联任务ID
*/
private Long relatedTaskId;
}

View File

@ -38,7 +38,8 @@
COUNT(*) AS "defectCount"
FROM qms_pdi_task_record t
INNER JOIN qms_pdi_detection_rules dr ON dr.id = t.detection_rules_id
WHERE t.submission_time &gt;= #{startTime}
WHERE t.related_task_id IS NULL
AND t.submission_time &gt;= #{startTime}
AND t.submission_time &lt;= #{endTime}
GROUP BY dr.model_no
ORDER BY COUNT(*) DESC