diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIssueTicketController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIssueTicketController.java index 6fade73b..f6d23865 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIssueTicketController.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIssueTicketController.java @@ -142,8 +142,8 @@ public class QmsIssueTicketController extends BaseController { } /** - * 创建人审核工单 - * 工单状态为2(已完成)时,创建人可以关闭或驳回工单 + * 工单审核 + * 巡检工单由负责人关闭;其他工单由创建人关闭或驳回 */ @PostMapping("creatorReview") public ApiResult creatorReview(@Valid @RequestBody QmsIssueTicketCreatorReviewQO request) { 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 fe6a8b87..86216952 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 @@ -454,25 +454,18 @@ public class QmsIssueTicketControllerService { // 3. 根据审批状态分支处理 if (approvalStatus == 1) { - // 驳回:不创建处理记录,工单改为待流转,推送消息给创建人 + // 驳回:不创建处理记录,巡检工单直接关闭 issueTicketService.lambdaUpdate() .eq(QmsIssueTicket::getId, ticket.getId()) - .set(QmsIssueTicket::getStatus, (short) 0) - .set(QmsIssueTicket::getApprovalUserId, null) - .set(QmsIssueTicket::getApprovalUserName, null) - .set(QmsIssueTicket::getApprovalStatus, null) - .set(QmsIssueTicket::getApprovalOpinion, null) - .set(QmsIssueTicket::getApprovalTime, null) + .set(QmsIssueTicket::getStatus, (short) 3) + .set(QmsIssueTicket::getApprovalStatus, approvalStatus) + .set(request.getApprovalOpinion() != null, + QmsIssueTicket::getApprovalOpinion, request.getApprovalOpinion()) + .set(QmsIssueTicket::getApprovalTime, now) .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); } else { // 通过:按现有流程处理 VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(request.getHandlerUserIds())) @@ -3435,11 +3428,8 @@ public class QmsIssueTicketControllerService { boolean isResponsiblePerson = currentUserId.equals(ticket.getApprovalUserId()); // 判断当前用户是否为处理人 - QmsIssueTicketProcess myProcess = allProcesses.stream() - .filter(p -> currentUserId.equals(p.getHandlerUserId())) - .findFirst() - .orElse(null); - boolean isHandler = myProcess != null; + boolean isHandler = allProcesses.stream() + .anyMatch(p -> currentUserId.equals(p.getHandlerUserId())); // 判断是否为领导:1.已在process表记录了leaderUserId 2.或当前用户是处理人的部门负责人 boolean isLeader = allProcesses.stream() @@ -3469,28 +3459,30 @@ public class QmsIssueTicketControllerService { && ticket.getApprovalStatus() == null; boolean responsibleCanDispatch = isResponsiblePerson && isProcessingStatus; - Short handlerApprovalStatus = isHandler ? myProcess.getApprovalStatus() : null; - boolean handlerCanReview = isHandler && handlerApprovalStatus == null; + boolean handlerCanReview = allProcesses.stream() + .filter(p -> currentUserId.equals(p.getHandlerUserId())) + .anyMatch(p -> p.getApprovalStatus() == null && p.getLeaderApprovalResult() == null); boolean handlerCanEdit = handlerCanReview; boolean leaderCanReview = isLeader && hasPendingLeaderReview(allProcesses, currentUserId); boolean creatorCanDispatch = isCreator && status != null && status == 0; - boolean creatorCanShut = isCreator && isCompletedStatus; + boolean creatorCanShut = isCreator && !Objects.equals(ticket.getSourceType(), (short) 2) && isCompletedStatus; + boolean responsibleCanShut = isResponsiblePerson && isCompletedStatus; vo.setIsReview(responsibleCanReview || handlerCanReview || leaderCanReview); vo.setIsDispatch((responsibleCanDispatch && !leaderCanReview) || creatorCanDispatch); vo.setIsEdit(handlerCanEdit); - vo.setIsShut(creatorCanShut); + vo.setIsShut(creatorCanShut || responsibleCanShut); return vo; } /** - * 创建人审核工单 - * 工单状态为2(已完成)时,创建人可以: - * - 关闭工单:status=3, createApproval=0 - * - 驳回工单:status=1, createApproval=1, 重置指定处理人的审批记录 + * 工单审核 + * 工单状态为2(已完成)时: + * - 巡检工单由负责人关闭 + * - 其他工单由创建人关闭或驳回 */ @Transactional(rollbackFor = Exception.class) public void creatorReview(@Valid QmsIssueTicketCreatorReviewQO request) { @@ -3498,10 +3490,18 @@ public class QmsIssueTicketControllerService { QmsIssueTicket ticket = issueTicketService.getById(request.getId()); VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在"); - // 2. 校验当前用户为工单创建人 + // 2. 校验当前用户权限:巡检工单由负责人关闭,其他工单由创建人审核 Long currentUserId = UserUtil.getUserId(); - VUtil.trueThrowBusinessError(!currentUserId.equals(ticket.getCreateUserId())) - .throwMessage("只有工单创建人才能审核"); + boolean inspectionTicket = Objects.equals(ticket.getSourceType(), (short) 2); + if (inspectionTicket) { + VUtil.trueThrowBusinessError(!currentUserId.equals(ticket.getApprovalUserId())) + .throwMessage("只有工单负责人才能审核"); + VUtil.trueThrowBusinessError(request.getCreateApproval() != 0) + .throwMessage("巡检工单只允许关闭"); + } else { + VUtil.trueThrowBusinessError(!currentUserId.equals(ticket.getCreateUserId())) + .throwMessage("只有工单创建人才能审核"); + } // 3. 校验工单状态为已完成 VUtil.trueThrowBusinessError(ticket.getStatus() != 2) 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 39a162c5..0237ff3e 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 @@ -16,6 +16,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Objects; @@ -298,34 +299,46 @@ public class QmsIssueTicketProcessControllerService { return null; } return processes.stream() - .filter(p -> StrUtil.isNotBlank(p.getTaskResultIds())) - .findFirst() + .min(Comparator.comparingInt(p -> getProcessPriority(p, currentUserId))) .orElse(processes.get(0)); } + private int getProcessPriority(QmsIssueTicketProcess process, Long currentUserId) { + if (Objects.equals(process.getHandlerUserId(), currentUserId) + && process.getApprovalStatus() == null + && process.getLeaderApprovalResult() == null) { + return 0; + } + if (Objects.equals(process.getApprovalUserId(), currentUserId) + && process.getApprovalStatus() == null + && process.getLeaderApprovalResult() == null) { + return 1; + } + if (Objects.equals(process.getLeaderUserId(), currentUserId) + && Objects.equals(process.getApprovalStatus(), (short) 0) + && process.getLeaderApprovalResult() == null) { + return 2; + } + if (StrUtil.isNotBlank(process.getTaskResultIds())) { + return 3; + } + return 4; + } + private void rejectInspectionByResponsible(QmsIssueTicketProcessDraftQO request, QmsIssueTicket ticket, LocalDateTime now, Long currentUserId, String currentUserName) { issueTicketToDoService.processed(ticket.getId()); issueTicketService.lambdaUpdate() .eq(QmsIssueTicket::getId, ticket.getId()) - .set(QmsIssueTicket::getStatus, (short) 0) - .set(QmsIssueTicket::getApprovalUserId, null) - .set(QmsIssueTicket::getApprovalUserName, null) - .set(QmsIssueTicket::getApprovalStatus, null) - .set(QmsIssueTicket::getApprovalOpinion, null) - .set(QmsIssueTicket::getApprovalTime, null) + .set(QmsIssueTicket::getStatus, (short) 3) + .set(QmsIssueTicket::getApprovalStatus, (short) 1) + .set(QmsIssueTicket::getApprovalOpinion, request.getApprovalOpinion()) + .set(QmsIssueTicket::getApprovalTime, now) .set(QmsIssueTicket::getUpdateUserId, currentUserId) .set(QmsIssueTicket::getUpdateUserName, currentUserName) .set(QmsIssueTicket::getUpdateTime, now) .update(); - - QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo() - .setTicketId(ticket.getId()) - .setHandlerUserId(ticket.getCreateUserId()) - .setHasProcessed(false) - .setIsRead(false); - issueTicketToDoService.save(todoItem); } private void leaderSubmitUnified(QmsIssueTicketProcessDraftQO request, QmsIssueTicket ticket, 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 acdfdb60..1c859cc0 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 @@ -20,6 +20,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.util.Comparator; import java.util.List; import java.util.Objects; @@ -236,11 +237,32 @@ public class QmsIssueTicketProcessMeasureControllerService { throw new NflgException(STATE.BusinessError, "未找到当前用户的工单处理记录"); } return processes.stream() - .filter(p -> StrUtil.isNotBlank(p.getTaskResultIds())) - .findFirst() + .min(Comparator.comparingInt(p -> getProcessPriority(p, userId))) .orElse(processes.get(0)); } + private int getProcessPriority(QmsIssueTicketProcess process, Long userId) { + if (Objects.equals(process.getHandlerUserId(), userId) + && process.getApprovalStatus() == null + && process.getLeaderApprovalResult() == null) { + return 0; + } + if (Objects.equals(process.getApprovalUserId(), userId) + && process.getApprovalStatus() == null + && process.getLeaderApprovalResult() == null) { + return 1; + } + if (Objects.equals(process.getLeaderUserId(), userId) + && Objects.equals(process.getApprovalStatus(), (short) 0) + && process.getLeaderApprovalResult() == null) { + return 2; + } + if (StrUtil.isNotBlank(process.getTaskResultIds())) { + return 3; + } + return 4; + } + /** * 保存措施记录(先删除旧数据,再分别插入临时措施和永久措施) */ 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 bf11d816..0688e5ff 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 @@ -272,8 +272,7 @@ public class QmsPdiInspectionResultsControllerService { .setDetectionCompletionTime(now) .setOverdue(overdueValue) .setInspectionEnable(hasDefect ? 3 : 2); - // 业务确认暂时关闭PDI回调WMS -// wmsPdiInspectionTaskCallbackService.callBack(taskRecord, overallResult); + wmsPdiInspectionTaskCallbackService.callBack(taskRecord, overallResult); // 8. 返回不合格项(转换为VO,图片改为List格式) return buildInspectionResultVOList(failedItems); diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsInspectionTicketDetailVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsInspectionTicketDetailVO.java index e63a52ec..8272e742 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsInspectionTicketDetailVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsInspectionTicketDetailVO.java @@ -33,7 +33,7 @@ public class QmsInspectionTicketDetailVO { private Boolean isEdit; /** - * 是否有关闭权限(创建人且工单状态为已完成时为true) + * 是否有关闭权限(负责人且工单状态为已完成时为true) */ private Boolean isShut; diff --git a/nflg-wms-repository/src/main/resources/mapper/QmsIssueTicketToDoMapper.xml b/nflg-wms-repository/src/main/resources/mapper/QmsIssueTicketToDoMapper.xml index 3d1a7cb9..6c5303e3 100644 --- a/nflg-wms-repository/src/main/resources/mapper/QmsIssueTicketToDoMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/QmsIssueTicketToDoMapper.xml @@ -13,7 +13,7 @@ vit.* FROM qms_issue_ticket_todo itd INNER JOIN v_qms_issue_ticket vit ON itd.ticket_id = vit.ticket_id - where itd.handler_user_id = #{userId} and (vit.handler_user_id=#{userId} or vit.approval_user_id=#{userId}) + where itd.handler_user_id = #{userId} AND vit.source_type = #{request.sourceType}