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 dd2af85f..b9734c9d 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 @@ -70,9 +70,6 @@ public class QmsIssueTicketControllerService { @Resource private IQmsPdiInspectionResultsService pdiInspectionResultsService; - @Resource - private IQmsPdiInspectionResultsLoadingImageService pdiInspectionResultsLoadingImageService; - @Resource private IQmsPdiDetectionRulesStatusItemService pdiStatusItemService; @@ -2056,11 +2053,15 @@ public class QmsIssueTicketControllerService { .eq(QmsIssueTicketProcess::getIssueTicketId, id) .list(); } else { - // 非创建者:仅返回自己作为处理人的记录 - processes = issueTicketProcessService.lambdaQuery() + // 非创建者:返回自己作为处理人/审批人/直属领导相关的处理记录 + List allProcesses = issueTicketProcessService.lambdaQuery() .eq(QmsIssueTicketProcess::getIssueTicketId, id) - .eq(QmsIssueTicketProcess::getHandlerUserId, currentUserId) .list(); + processes = allProcesses.stream() + .filter(p -> currentUserId.equals(p.getHandlerUserId()) + || currentUserId.equals(p.getApprovalUserId()) + || isCurrentUserLeaderOfProcess(p, currentUserId)) + .collect(Collectors.toList()); } // 构建返回VO - 工单基本信息 @@ -3148,10 +3149,37 @@ public class QmsIssueTicketControllerService { .filter(p -> p.getApprovalStatus() == null || p.getApprovalStatus() != 1) .collect(Collectors.toList()); - if (CollectionUtil.isNotEmpty(validProcesses)) { + Long currentUserId = UserUtil.getUserId(); + Short status = ticket.getStatus(); + boolean isCreator = currentUserId.equals(ticket.getCreateUserId()); + boolean isCompletedStatus = status != null && status == 2; + boolean isClosedStatus = status != null && status == 3; + boolean isVisibleLeader = validProcesses.stream() + .anyMatch(p -> isCurrentUserLeaderOfProcess(p, currentUserId)); + boolean isVisibleHandler = validProcesses.stream() + .anyMatch(p -> currentUserId.equals(p.getHandlerUserId()) || currentUserId.equals(p.getApprovalUserId())); + + List visibleProcesses; + if (isClosedStatus || (isCompletedStatus && isCreator)) { + visibleProcesses = validProcesses; + } else if (isVisibleLeader) { + visibleProcesses = validProcesses.stream() + .filter(p -> isCurrentUserLeaderOfProcess(p, currentUserId)) + .collect(Collectors.toList()); + } else if (isVisibleHandler) { + visibleProcesses = validProcesses.stream() + .filter(p -> currentUserId.equals(p.getHandlerUserId()) || currentUserId.equals(p.getApprovalUserId())) + .collect(Collectors.toList()); + } else if (isCreator) { + visibleProcesses = validProcesses; + } else { + visibleProcesses = List.of(); + } + + if (CollectionUtil.isNotEmpty(visibleProcesses)) { // 组装处理人列表(按部门合并) Map> handlersByDept = new LinkedHashMap<>(); - for (QmsIssueTicketProcess process : validProcesses) { + for (QmsIssueTicketProcess process : visibleProcesses) { if (StrUtil.isBlank(process.getHandlerUserName())) { continue; } @@ -3180,7 +3208,7 @@ public class QmsIssueTicketControllerService { // 组装领导列表(仅处理人已提交、领导已审批时才展示) Map> leadersByDept = new LinkedHashMap<>(); - for (QmsIssueTicketProcess process : validProcesses) { + for (QmsIssueTicketProcess process : visibleProcesses) { // 领导审批状态为 null 表示处理人尚未提交,不展示 if (process.getLeaderApprovalResult() == null || StrUtil.isBlank(process.getLeaderUserName())) { continue; @@ -3216,10 +3244,17 @@ public class QmsIssueTicketControllerService { } vo.setLeaders(leaders); - // 填充根本原因(取第一条处理记录) - QmsIssueTicketProcess firstProcess = validProcesses.get(0); - if (StrUtil.isNotBlank(firstProcess.getRootCause())) { - vo.setRootCause(firstProcess.getRootCause()); + // 填充当前用户可见的根本原因 + List rootCauseProcesses = visibleProcesses.stream() + .filter(p -> StrUtil.isNotBlank(p.getRootCause())) + .collect(Collectors.toList()); + if (rootCauseProcesses.size() == 1) { + vo.setRootCause(rootCauseProcesses.get(0).getRootCause()); + } else if (rootCauseProcesses.size() > 1) { + String rootCause = rootCauseProcesses.stream() + .map(QmsIssueTicketProcess::getRootCause) + .collect(Collectors.joining("\n")); + vo.setRootCause(rootCause); } // 查询纠正措施 @@ -3229,7 +3264,7 @@ public class QmsIssueTicketControllerService { List temporaryMeasures = new ArrayList<>(); List permanentMeasures = new ArrayList<>(); - for (QmsIssueTicketProcess p : validProcesses) { + for (QmsIssueTicketProcess p : visibleProcesses) { List measures = issueTicketProcessMeasureService.lambdaQuery() .eq(QmsIssueTicketProcessMeasure::getIssueTicketProcessId, p.getId()) .list(); @@ -3267,13 +3302,8 @@ public class QmsIssueTicketControllerService { } // === 权限判断:isReview / isDispatch / isEdit === - Long currentUserId = UserUtil.getUserId(); // 获取该工单全部处理记录(权限判断用全部记录,不过滤) - List allProcesses = issueTicketProcessService.lambdaQuery() - .eq(QmsIssueTicketProcess::getIssueTicketId, id) - .list(); - - Short status = ticket.getStatus(); + List allProcesses = processes; // 判断当前用户是否为负责人(工单表的 approvalUserId) boolean isResponsiblePerson = currentUserId.equals(ticket.getApprovalUserId()); @@ -3305,9 +3335,7 @@ public class QmsIssueTicketControllerService { } // 负责人权限:工单状态为处理中时有审批和分配权限,有了审批状态后失去审批权限 - boolean isCreator = currentUserId.equals(ticket.getCreateUserId()); boolean isProcessingStatus = status != null && (status == 0 || status == 1); - boolean isCompletedStatus = status != null && status == 2; boolean responsibleCanReview = isResponsiblePerson && status != null @@ -3368,17 +3396,22 @@ public class QmsIssueTicketControllerService { .set(QmsIssueTicket::getUpdateTime, now) .update(); - issueTicketToDoService.lambdaUpdate() - .eq(QmsIssueTicketToDo::getTicketId, ticket.getId()) - .eq(QmsIssueTicketToDo::getHasProcessed, false) - .set(QmsIssueTicketToDo::getHasProcessed, true) - .update(); + if (Objects.equals(ticket.getSourceType(), (short) 1)) { + issueTicketToDoService.processed(ticket.getId()); + } else { + issueTicketToDoService.lambdaUpdate() + .eq(QmsIssueTicketToDo::getTicketId, ticket.getId()) + .eq(QmsIssueTicketToDo::getHasProcessed, false) + .set(QmsIssueTicketToDo::getHasProcessed, true) + .update(); + } // PDI工单关闭时:创建新任务单,复制内容,不合格项改为合格 if (ticket.getSourceType() != null && ticket.getSourceType() == 1 && ticket.getSourceId() != null) { QmsPdiTaskRecord originalTask = createPdiRepairTask(ticket.getSourceId(), now); if (originalTask != null) { - callbackPdiInspectionTask(originalTask, true); + // 业务确认暂时关闭PDI回调WMS +// callbackPdiInspectionTask(originalTask, true); } } @@ -3419,6 +3452,10 @@ public class QmsIssueTicketControllerService { .set(QmsIssueTicket::getUpdateTime, now) .update(); + if (Objects.equals(ticket.getSourceType(), (short) 1)) { + issueTicketToDoService.processed(ticket.getId()); + } + // 推送待办给被驳回的处理人 for (Long userId : rejectUserIds) { QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo() @@ -3532,21 +3569,6 @@ public class QmsIssueTicketControllerService { 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); - } return originalTask; } } diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessMeasureControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessMeasureControllerService.java index a78fff4f..acdfdb60 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessMeasureControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessMeasureControllerService.java @@ -162,7 +162,7 @@ public class QmsIssueTicketProcessMeasureControllerService { // 处理人处理:保存根本原因、审批状态和措施 issueTicketProcessService.lambdaUpdate() .eq(QmsIssueTicketProcess::getId, processId) - .set(request.getRootCause() != null, QmsIssueTicketProcess::getRootCause, mergedRootCause) + .set(request.getRootCause() != null, QmsIssueTicketProcess::getRootCause, request.getRootCause()) .set(request.getApprovalStatus() != null, QmsIssueTicketProcess::getApprovalStatus, request.getApprovalStatus()) .set(request.getApprovalOpinion() != null, QmsIssueTicketProcess::getApprovalOpinion, request.getApprovalOpinion()) .set(QmsIssueTicketProcess::getApprovalUserId, currentUserId) diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiInspectionResultsControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiInspectionResultsControllerService.java index 59eec245..bf11d816 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiInspectionResultsControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiInspectionResultsControllerService.java @@ -202,10 +202,22 @@ public class QmsPdiInspectionResultsControllerService { .update(); }); - // 2. 检查 type=0/1/3 是否都有结果 + Set deliveryItemIds = deliveryItemService.lambdaQuery() + .eq(QmsPdiDetectionRulesDeliveryItem::getDetectionRulesId, taskRecord.getDetectionRulesId()) + .list() + .stream() + .map(QmsPdiDetectionRulesDeliveryItem::getId) + .collect(Collectors.toSet()); + request.getLoadingItems().stream() + .map(item -> item.getId()) + .filter(Objects::nonNull) + .forEach(deliveryItemIds::add); + + // 2. 检查 type=0/1/3 是否都有结果,装车前检查项不参与检测项结果校验 long unfilledResults = inspectionResultsService.lambdaQuery() .eq(QmsPdiInspectionResults::getTaskId, request.getTaskId()) - .ne(QmsPdiInspectionResults::getInspectionItemType, 2) + .in(QmsPdiInspectionResults::getInspectionItemType, Arrays.asList(0, 1, 3)) + .notIn(!deliveryItemIds.isEmpty(), QmsPdiInspectionResults::getInspectionItemId, deliveryItemIds) .isNull(QmsPdiInspectionResults::getInspectionItemResults) .count(); if (unfilledResults > 0) { @@ -225,15 +237,13 @@ public class QmsPdiInspectionResultsControllerService { // 4. 查询不合格检测项(type=0/1/3,装车前不计入) List failedItems = inspectionResultsService.lambdaQuery() .eq(QmsPdiInspectionResults::getTaskId, request.getTaskId()) - .ne(QmsPdiInspectionResults::getInspectionItemType, 2) + .in(QmsPdiInspectionResults::getInspectionItemType, Arrays.asList(0, 1, 3)) + .notIn(!deliveryItemIds.isEmpty(), QmsPdiInspectionResults::getInspectionItemId, deliveryItemIds) .eq(QmsPdiInspectionResults::getInspectionItemResults, false) .list(); - // 5. 校验:如果所有检测项都合格,总体判定不能为不合格 + // 5. 装车前整体检测结果不参与普通检测项判定 boolean hasDefect = !failedItems.isEmpty(); - if (!hasDefect && !request.getOverallResult()) { - throw new NflgException(STATE.BusinessError, "所有检测项均为合格,总体判定不能为不合格"); - } // 6. 将整体判定结果存入 task_record boolean overallResult = request.getOverallResult() != null && request.getOverallResult(); @@ -262,7 +272,8 @@ public class QmsPdiInspectionResultsControllerService { .setDetectionCompletionTime(now) .setOverdue(overdueValue) .setInspectionEnable(hasDefect ? 3 : 2); - wmsPdiInspectionTaskCallbackService.callBack(taskRecord, overallResult); + // 业务确认暂时关闭PDI回调WMS +// wmsPdiInspectionTaskCallbackService.callBack(taskRecord, overallResult); // 8. 返回不合格项(转换为VO,图片改为List格式) return buildInspectionResultVOList(failedItems); diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiTaskRecordControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiTaskRecordControllerService.java index 31c6b7c5..551fd4cb 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiTaskRecordControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiTaskRecordControllerService.java @@ -517,6 +517,7 @@ public class QmsPdiTaskRecordControllerService { vo.setOrderNo(record.getOrderNo()); vo.setDeviceNo(record.getDeviceNo()); vo.setFactoryNo(record.getFactoryNo()); + vo.setInspectionEnable(record.getInspectionEnable()); vo.setInspectionInspection(record.getInspectionInspection()); vo.setDetectionCompletionTime(record.getDetectionCompletionTime()); vo.setInspectionRuleId(record.getDetectionRulesId()); diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTaskRecordDetailVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTaskRecordDetailVO.java index 21f1e3d7..cb4480f7 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTaskRecordDetailVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTaskRecordDetailVO.java @@ -158,6 +158,11 @@ public class QmsPdiTaskRecordDetailVO { */ private Integer inspectionType; + /** + * 质检状态:0为待检查,1为检验中,2为已完成,3为待流转 + */ + private Integer inspectionEnable; + /** * 检测结果:true=合格,false=不合格 */