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 56732d21..865d7d09 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 @@ -276,9 +276,9 @@ public class QmsIssueTicketControllerService { throw new NflgException(STATE.BusinessError, "只能发起PQC工单"); } - // 3. 校验工单状态为待流转 - if (!Objects.equals(ticket.getStatus(), (short) 0)) { - throw new NflgException(STATE.BusinessError, "工单状态不是待流转"); + // 3. 校验工单状态为待流转或处理中 + if (!Objects.equals(ticket.getStatus(), (short) 0) && !Objects.equals(ticket.getStatus(), (short) 1)) { + throw new NflgException(STATE.BusinessError, "工单状态不是待流转或处理中"); } // 4. 更新工单的事故类型和备注 @@ -298,12 +298,24 @@ public class QmsIssueTicketControllerService { .set(QmsIssueTicketToDo::getHasProcessed, true) .update(); + Set redispatchableTaskResultIds = getPqcRedispatchableTaskResultIds(ticket); + // 5. 按处理人分组合并不合格项ID Map> userTaskMap = new LinkedHashMap<>(); for (QmsPqcTicketDispatchQO.AssigneeItem item : request.getAssignees()) { + List taskResultIds = Arrays.stream(item.getTaskResultIds().split(",")) + .filter(StrUtil::isNotBlank) + .map(String::trim) + .filter(taskResultId -> redispatchableTaskResultIds.contains(Long.valueOf(taskResultId))) + .distinct() + .collect(Collectors.toList()); + if (taskResultIds.isEmpty()) { + continue; + } userTaskMap.computeIfAbsent(item.getUserId(), k -> new ArrayList<>()) - .add(item.getTaskResultIds()); + .addAll(taskResultIds); } + VUtil.trueThrowBusinessError(userTaskMap.isEmpty()).throwMessage("请选择未分派或已驳回的不合格项"); // 6. 批量查询处理人信息 List userIds = new ArrayList<>(userTaskMap.keySet()); @@ -349,6 +361,40 @@ public class QmsIssueTicketControllerService { .update(); } + private Set getPqcRedispatchableTaskResultIds(QmsIssueTicket ticket) { + List allUnqualified = pqcTaskRecordDetailsService.lambdaQuery() + .eq(QmsPqcTaskRecordDetails::getTaskId, ticket.getSourceId()) + .eq(QmsPqcTaskRecordDetails::getReviewEnable, false) + .list(); + Set allUnqualifiedIds = allUnqualified.stream() + .map(QmsPqcTaskRecordDetails::getId) + .collect(Collectors.toSet()); + if (allUnqualifiedIds.isEmpty()) { + return Collections.emptySet(); + } + + List processes = issueTicketProcessService.lambdaQuery() + .eq(QmsIssueTicketProcess::getIssueTicketId, ticket.getId()) + .list(); + Set effectivelyDispatched = new HashSet<>(); + for (QmsIssueTicketProcess p : processes) { + if (StrUtil.isBlank(p.getTaskResultIds())) { + continue; + } + if (Objects.equals(p.getApprovalStatus(), (short) 1)) { + continue; + } + Arrays.stream(p.getTaskResultIds().split(",")) + .filter(StrUtil::isNotBlank) + .map(String::trim) + .map(Long::valueOf) + .forEach(effectivelyDispatched::add); + } + + allUnqualifiedIds.removeAll(effectivelyDispatched); + return allUnqualifiedIds; + } + /** * 巡检工单分派(支持多人) * 1. 校验工单存在且来源类型为巡检(sourceType=2) @@ -2736,10 +2782,10 @@ public class QmsIssueTicketControllerService { // 8. 设置权限字段 if (isCreator) { // 创建人: - // - isDispatch=true(状态=0或1时) + // - isDispatch=true(存在未有效分派的不合格项时) // - isReview=true(状态=2时) // - isEdit=false(创建人无编辑权限) - vo.setIsDispatch(ticket.getStatus() != null && (ticket.getStatus() == 0 || ticket.getStatus() == 1)); + vo.setIsDispatch(hasPqcUndispatchedOrRejectedItems(ticket, processes)); vo.setIsReview(ticket.getStatus() != null && ticket.getStatus() == 2); vo.setIsEdit(false); vo.setIsShut(ticket.getStatus() != null && ticket.getStatus() == 2); @@ -2763,6 +2809,38 @@ public class QmsIssueTicketControllerService { return vo; } + private boolean hasPqcUndispatchedOrRejectedItems(QmsIssueTicket ticket, List processes) { + if (ticket.getStatus() == null || (ticket.getStatus() != 0 && ticket.getStatus() != 1)) { + return false; + } + List allUnqualified = pqcTaskRecordDetailsService.lambdaQuery() + .eq(QmsPqcTaskRecordDetails::getTaskId, ticket.getSourceId()) + .eq(QmsPqcTaskRecordDetails::getReviewEnable, false) + .list(); + Set allUnqualifiedIds = allUnqualified.stream() + .map(QmsPqcTaskRecordDetails::getId) + .collect(Collectors.toSet()); + if (allUnqualifiedIds.isEmpty()) { + return false; + } + + Set effectivelyDispatched = new HashSet<>(); + for (QmsIssueTicketProcess p : processes) { + if (StrUtil.isBlank(p.getTaskResultIds())) { + continue; + } + if (Objects.equals(p.getApprovalStatus(), (short) 1)) { + continue; + } + Arrays.stream(p.getTaskResultIds().split(",")) + .filter(StrUtil::isNotBlank) + .map(String::trim) + .map(Long::valueOf) + .forEach(effectivelyDispatched::add); + } + return !effectivelyDispatched.containsAll(allUnqualifiedIds); + } + /** * 解析文件列表 */ diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessControllerService.java index 725f8351..39a162c5 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketProcessControllerService.java @@ -581,21 +581,20 @@ public class QmsIssueTicketProcessControllerService { // 3. 根据审批状态处理 if (approvalStatus == 1) { - boolean allHandlersRejected = isAllPqcHandlersRejected(ticket.getId()); - if (allHandlersRejected) { - issueTicketService.lambdaUpdate() - .eq(QmsIssueTicket::getId, ticket.getId()) - .set(QmsIssueTicket::getStatus, (short) 0) - .set(QmsIssueTicket::getUpdateUserId, currentUserId) - .set(QmsIssueTicket::getUpdateUserName, currentUserName) - .set(QmsIssueTicket::getUpdateTime, now) - .update(); + issueTicketService.lambdaUpdate() + .eq(QmsIssueTicket::getId, ticket.getId()) + .set(QmsIssueTicket::getStatus, (short) 1) + .set(QmsIssueTicket::getUpdateUserId, currentUserId) + .set(QmsIssueTicket::getUpdateUserName, currentUserName) + .set(QmsIssueTicket::getUpdateTime, now) + .update(); - QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo() - .setTicketId(ticket.getId()) - .setHandlerUserId(ticket.getCreateUserId()); - issueTicketToDoService.save(todoItem); - } + QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo() + .setTicketId(ticket.getId()) + .setHandlerUserId(ticket.getCreateUserId()) + .setHasProcessed(false) + .setIsRead(false); + issueTicketToDoService.save(todoItem); } else if (approvalStatus == 0) { // 通过:校验措施(临时措施或永久措施至少填一个) boolean hasMeasures = checkPqcMeasures(process.getId()); @@ -686,29 +685,4 @@ public class QmsIssueTicketProcessControllerService { .anyMatch(p -> p.getApprovalTime() != null || currentUserId.equals(p.getHandlerUserId()))); } - private boolean isAllPqcHandlersRejected(Long ticketId) { - List processes = issueTicketProcessService.lambdaQuery() - .eq(QmsIssueTicketProcess::getIssueTicketId, ticketId) - .list(); - - List dispatchedProcesses = processes.stream() - .filter(p -> StrUtil.isNotBlank(p.getTaskResultIds())) - .toList(); - List effectiveProcesses = dispatchedProcesses.isEmpty() - ? processes - : dispatchedProcesses; - - Map> processMap = effectiveProcesses.stream() - .filter(p -> p.getHandlerUserId() != null) - .collect(Collectors.groupingBy(QmsIssueTicketProcess::getHandlerUserId)); - if (processMap.isEmpty()) { - return false; - } - - return processMap - .values() - .stream() - .allMatch(list -> list.stream() - .anyMatch(p -> Objects.equals(p.getApprovalStatus(), (short) 1))); - } }