diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java index 91a5907d..ab782052 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java @@ -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 oldResults = pdiInspectionResultsService.lambdaQuery() + .eq(QmsPdiInspectionResults::getTaskId, originalTaskId) + .list(); + + if (!oldResults.isEmpty()) { + List 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 oldImages = pdiInspectionResultsLoadingImageService.lambdaQuery() + .eq(QmsPdiInspectionResultsLoadingImage::getTaskId, originalTaskId) + .list(); + + if (!oldImages.isEmpty()) { + List newImages = new ArrayList<>(); + for (QmsPdiInspectionResultsLoadingImage old : oldImages) { + QmsPdiInspectionResultsLoadingImage newImage = new QmsPdiInspectionResultsLoadingImage() + .setTaskId(newTask.getId()) + .setLoadingImage(old.getLoadingImage()); + newImages.add(newImage); + } + pdiInspectionResultsLoadingImageService.saveBatch(newImages); + } + } } diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPqcTaskRecordControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPqcTaskRecordControllerService.java index aa707359..c5678e3a 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPqcTaskRecordControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPqcTaskRecordControllerService.java @@ -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 oldDetails = pqcTaskRecordDetailsService.lambdaQuery() + .eq(QmsPqcTaskRecordDetails::getTaskId, taskRecord.getId()) + .list(); + + List 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; } diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsReportControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsReportControllerService.java index b2b04c03..af343d6f 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsReportControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsReportControllerService.java @@ -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 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 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) diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsPdiTaskRecord.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsPdiTaskRecord.java index 914b43e6..22e75fde 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsPdiTaskRecord.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsPdiTaskRecord.java @@ -96,4 +96,9 @@ public class QmsPdiTaskRecord implements Serializable { * 仓库编号 */ private String warehouseNo; + + /** + * 关联任务ID + */ + private Long relatedTaskId; } diff --git a/nflg-wms-repository/src/main/resources/mapper/QmsReportMapper.xml b/nflg-wms-repository/src/main/resources/mapper/QmsReportMapper.xml index 0a131ea1..3239b64b 100644 --- a/nflg-wms-repository/src/main/resources/mapper/QmsReportMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/QmsReportMapper.xml @@ -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 >= #{startTime} + WHERE t.related_task_id IS NULL + AND t.submission_time >= #{startTime} AND t.submission_time <= #{endTime} GROUP BY dr.model_no ORDER BY COUNT(*) DESC