From 23d6d553c573bb77cf1b97622d41c4537e7b3634 Mon Sep 17 00:00:00 2001 From: funny <834502597@qq.com> Date: Wed, 13 May 2026 17:15:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E5=8D=95=E6=8E=AA=E6=96=BD=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E6=8E=A5=E5=8F=A3=E3=80=81=E6=9F=A5=E8=AF=A2=E6=98=8E?= =?UTF-8?q?=E7=BB=86=E6=8E=A5=E5=8F=A3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QmsIssueTicketControllerService.java | 220 ++++++++++++------ ...msIssueTicketProcessControllerService.java | 33 ++- .../qo/QmsIssueTicketDispatchMultipleQO.java | 11 + .../pojo/vo/QmsInspectionTicketDetailVO.java | 10 + 4 files changed, 185 insertions(+), 89 deletions(-) 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 eab11196..bdbdb09f 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 @@ -154,6 +154,12 @@ public class QmsIssueTicketControllerService { .set(QmsIssueTicket::getUpdateUserName, UserUtil.getUserName()) .set(QmsIssueTicket::getUpdateTime, LocalDateTime.now()) .update(); + + // 7. 推送待办消息给负责人 + QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo() + .setTicketId(request.getId()) + .setHandlerUserId(request.getHandlerUserId()); + issueTicketToDoService.save(todoItem); } /** @@ -169,11 +175,6 @@ public class QmsIssueTicketControllerService { String currentUserName = UserUtil.getUserName(); LocalDateTime now = LocalDateTime.now(); - // 校验不能分配给自己 - if (request.getHandlerUserIds().contains(currentUserId)) { - throw new NflgException(STATE.BusinessError, "不能将工单分配给自己"); - } - // 1. 校验工单存在 QmsIssueTicket ticket = issueTicketService.getById(request.getId()); VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在"); @@ -183,61 +184,78 @@ public class QmsIssueTicketControllerService { throw new NflgException(STATE.BusinessError, "只能分派巡检工单"); } - // 3. 查询消息类型ID - Long sourceTypeId = dictionaryItemService.getIdByCode("MessageType", "InspectionTaskWorkOrder"); - VUtil.trueThrowBusinessError(Objects.isNull(sourceTypeId)).throwMessage("消息类型配置不存在"); - - // 4. 批量查询并校验所有处理人 - List handlerUsers = userService.listByIds(request.getHandlerUserIds()); - if (handlerUsers.size() != request.getHandlerUserIds().size()) { - throw new NflgException(STATE.BusinessError, "部分处理人不存在"); - } - - // 构建处理人ID到用户的映射 - Map handlerUserMap = handlerUsers.stream() - .collect(Collectors.toMap(User::getId, user -> user)); - - // 5. 为每个处理人创建处理记录并推送待办 - List processes = new ArrayList<>(); - List todoItems = new ArrayList<>(); - - for (Long handlerUserId : request.getHandlerUserIds()) { - User handlerUser = handlerUserMap.get(handlerUserId); - - // 创建处理记录 - QmsIssueTicketProcess process = new QmsIssueTicketProcess() - .setIssueTicketId(ticket.getId()) - .setHandlerUserId(handlerUserId) - .setHandlerUserName(handlerUser.getUserName()); - processes.add(process); - - // 创建待办消息 - QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo() - .setTicketId(ticket.getId()) - .setHandlerUserId(handlerUserId); - todoItems.add(todoItem); - } - - // 6. 批量保存处理记录 - issueTicketProcessService.saveBatch(processes); - - // 7. 更新处理记录中的sourceId(因为saveBatch后才有ID) -// for (int i = 0; i < processes.size(); i++) { -// todoItems.get(i).setSourceId(processes.get(i).getId()); -// } - - // 8. 批量推送待办消息 - issueTicketToDoService.saveBatch(todoItems); - - // 9. 如果工单状态是待流转(0),更新为处理中(1) - if (ticket.getStatus() != null && ticket.getStatus() == 0) { + // 3. 根据审批状态分支处理 + if (request.getApprovalStatus() == 1) { + // 驳回:不创建处理记录,工单改为已完成,推送消息给创建人 issueTicketService.lambdaUpdate() .eq(QmsIssueTicket::getId, ticket.getId()) - .set(QmsIssueTicket::getStatus, (short) 1) + .set(QmsIssueTicket::getStatus, (short) 2) + .set(request.getApprovalOpinion() != null, + QmsIssueTicket::getApprovalOpinion, request.getApprovalOpinion()) .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 { + // 通过:按现有流程处理 + // 校验不能分配给自己 + if (request.getHandlerUserIds().contains(currentUserId)) { + throw new NflgException(STATE.BusinessError, "不能将工单分配给自己"); + } + + // 批量查询并校验所有处理人 + List handlerUsers = userService.listByIds(request.getHandlerUserIds()); + if (handlerUsers.size() != request.getHandlerUserIds().size()) { + throw new NflgException(STATE.BusinessError, "部分处理人不存在"); + } + + // 构建处理人ID到用户的映射 + Map handlerUserMap = handlerUsers.stream() + .collect(Collectors.toMap(User::getId, user -> user)); + + // 为每个处理人创建处理记录并推送待办 + List processes = new ArrayList<>(); + List todoItems = new ArrayList<>(); + + for (Long handlerUserId : request.getHandlerUserIds()) { + User handlerUser = handlerUserMap.get(handlerUserId); + + // 创建处理记录 + QmsIssueTicketProcess process = new QmsIssueTicketProcess() + .setIssueTicketId(ticket.getId()) + .setHandlerUserId(handlerUserId) + .setHandlerUserName(handlerUser.getUserName()); + processes.add(process); + + // 创建待办消息 + QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo() + .setTicketId(ticket.getId()) + .setHandlerUserId(handlerUserId); + todoItems.add(todoItem); + } + + // 批量保存处理记录 + issueTicketProcessService.saveBatch(processes); + + // 批量推送待办消息 + issueTicketToDoService.saveBatch(todoItems); + + // 如果工单状态是待流转(0),更新为处理中(1) + if (ticket.getStatus() != null && ticket.getStatus() == 0) { + 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(); + } } } @@ -715,6 +733,12 @@ public class QmsIssueTicketControllerService { .setUpdateTime(now); issueTicketService.save(entity); + + // 6. 推送待办消息给负责人 + QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo() + .setTicketId(entity.getId()) + .setHandlerUserId(request.getHandlerUserId()); + issueTicketToDoService.save(todoItem); } /** @@ -1906,6 +1930,10 @@ public class QmsIssueTicketControllerService { vo.setIncidentReason(ticket.getIncidentReason()); vo.setIncidentConsequence(ticket.getIncidentConsequence()); + // 填充负责人审批状态和意见(来自工单表) + vo.setResponsiblePersonApprovalStatus(ticket.getApprovalStatus()); + vo.setResponsiblePersonApprovalComments(ticket.getApprovalOpinion()); + // 解析图片列表 if (StrUtil.isNotBlank(ticket.getImageIds())) { List imageIds = Arrays.stream(ticket.getImageIds().split(",")) @@ -1948,10 +1976,15 @@ public class QmsIssueTicketControllerService { .eq(QmsIssueTicketProcess::getIssueTicketId, id) .list(); - if (CollectionUtil.isNotEmpty(processes)) { + // 过滤掉审批状态为驳回(1)的处理记录,不返回 + List validProcesses = processes.stream() + .filter(p -> p.getApprovalStatus() == null || p.getApprovalStatus() != 1) + .collect(Collectors.toList()); + + if (CollectionUtil.isNotEmpty(validProcesses)) { // 组装处理人列表(按部门合并) Map> handlersByDept = new LinkedHashMap<>(); - for (QmsIssueTicketProcess process : processes) { + for (QmsIssueTicketProcess process : validProcesses) { if (StrUtil.isBlank(process.getHandlerUserName())) { continue; } @@ -1980,7 +2013,7 @@ public class QmsIssueTicketControllerService { // 组装领导列表(仅处理人已提交、领导已审批时才展示) Map> leadersByDept = new LinkedHashMap<>(); - for (QmsIssueTicketProcess process : processes) { + for (QmsIssueTicketProcess process : validProcesses) { // 领导审批状态为 null 表示处理人尚未提交,不展示 if (process.getLeaderApprovalResult() == null || StrUtil.isBlank(process.getLeaderUserName())) { continue; @@ -2017,7 +2050,7 @@ public class QmsIssueTicketControllerService { vo.setLeaders(leaders); // 填充根本原因(取第一条处理记录) - QmsIssueTicketProcess firstProcess = processes.get(0); + QmsIssueTicketProcess firstProcess = validProcesses.get(0); if (StrUtil.isNotBlank(firstProcess.getRootCause())) { vo.setRootCause(firstProcess.getRootCause()); } @@ -2029,7 +2062,7 @@ public class QmsIssueTicketControllerService { List temporaryMeasures = new ArrayList<>(); List permanentMeasures = new ArrayList<>(); - for (QmsIssueTicketProcess p : processes) { + for (QmsIssueTicketProcess p : validProcesses) { List measures = issueTicketProcessMeasureService.lambdaQuery() .eq(QmsIssueTicketProcessMeasure::getIssueTicketProcessId, p.getId()) .list(); @@ -2066,16 +2099,27 @@ public class QmsIssueTicketControllerService { // === 权限判断:isReview / isDispatch / isEdit === Long currentUserId = UserUtil.getUserId(); - // 获取该工单全部处理记录 + // 获取该工单全部处理记录(权限判断用全部记录,不过滤) List allProcesses = issueTicketProcessService.lambdaQuery() .eq(QmsIssueTicketProcess::getIssueTicketId, id) .list(); + Short status = ticket.getStatus(); + + // 判断当前用户是否为负责人(工单表的 approvalUserId) + boolean isResponsiblePerson = currentUserId.equals(ticket.getApprovalUserId()); + + // 判断当前用户是否为处理人 + QmsIssueTicketProcess myProcess = allProcesses.stream() + .filter(p -> currentUserId.equals(p.getHandlerUserId())) + .findFirst() + .orElse(null); + boolean isHandler = myProcess != null; + // 判断是否为领导:1.已在process表记录了leaderUserId 2.或当前用户是处理人的部门负责人 boolean isLeader = allProcesses.stream() .anyMatch(p -> currentUserId.equals(p.getLeaderUserId())); if (!isLeader) { - // 检查当前用户是否为任一处理人的部门负责人 for (QmsIssueTicketProcess p : allProcesses) { if (p.getHandlerUserId() == null) continue; UserInterior handlerInterior = userInteriorService.lambdaQuery() @@ -2091,25 +2135,47 @@ public class QmsIssueTicketControllerService { } } - // isEdit:仅处理人为true,领导只有审核权限 - boolean isHandler = allProcesses.stream() - .anyMatch(p -> currentUserId.equals(p.getHandlerUserId())); - vo.setIsEdit(isHandler); - - // isReview:领导始终有审核权限 - vo.setIsReview(isLeader); - - // isDispatch - Short status = ticket.getStatus(); - if (currentUserId.equals(ticket.getCreateUserId())) { - // 创建人:isDispatch仅在待流转状态 - vo.setIsDispatch(status != null && status == 0); - } else if (currentUserId.equals(ticket.getApprovalUserId())) { - // 工单表审批人:isDispatch在处理中状态 + // 负责人权限:工单状态为处理中时有审批和分配权限,有了审批状态后失去审批权限 + if (isResponsiblePerson) { + vo.setIsReview(status != null && status == 1 && ticket.getApprovalStatus() == null); vo.setIsDispatch(status != null && status == 1); - } else { + vo.setIsEdit(false); + } + // 处理人权限:拿到工单时有编辑和审批权限,有了审批状态后失去审批权限,驳回时失去编辑权限 + else if (isHandler) { + Short handlerApprovalStatus = myProcess.getApprovalStatus(); + vo.setIsReview(handlerApprovalStatus == null); + if (handlerApprovalStatus != null && handlerApprovalStatus == 1) { + // 驳回:失去编辑权限 + vo.setIsEdit(false); + } else if (handlerApprovalStatus != null && handlerApprovalStatus == 0) { + // 通过:按之前逻辑(领导未审批时可编辑) + boolean leaderNotApproved = myProcess.getLeaderApprovalResult() == null; + vo.setIsEdit(leaderNotApproved); + } else { + // 未提交:有编辑权限 + vo.setIsEdit(true); + } vo.setIsDispatch(false); } + // 领导权限:只有审核权限 + else if (isLeader) { + vo.setIsReview(true); + vo.setIsEdit(false); + vo.setIsDispatch(false); + } + // 创建人权限 + else if (currentUserId.equals(ticket.getCreateUserId())) { + vo.setIsReview(false); + vo.setIsDispatch(status != null && status == 0); + vo.setIsEdit(false); + } + // 其他 + else { + vo.setIsReview(false); + vo.setIsDispatch(false); + vo.setIsEdit(false); + } return vo; } 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 35ddb80a..5bdb5402 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 @@ -165,7 +165,7 @@ public class QmsIssueTicketProcessControllerService { } else if (sourceType == 2) { // 巡检任务 if (isHandler) { - // 处理人处理:保存根本原因和措施,写入审批时间 + // 处理人提交:保存根本原因、审批状态和措施 issueTicketProcessMeasureControllerService.draftUnified(request); // 写入审批时间 @@ -174,18 +174,27 @@ public class QmsIssueTicketProcessControllerService { .set(QmsIssueTicketProcess::getApprovalTime, now) .update(); - // 推送给领导(处理人所在部门负责人) - UserInterior userInterior = userInteriorService.lambdaQuery() - .eq(UserInterior::getUserId, currentUserId) - .one(); + // 根据审批状态推送待办 + if (request.getApprovalStatus() != null && request.getApprovalStatus() == 1) { + // 驳回:推送待办给负责人(工单表的 approvalUserId) + QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo() + .setTicketId(ticket.getId()) + .setHandlerUserId(ticket.getApprovalUserId()); + issueTicketToDoService.save(todoItem); + } else if (request.getApprovalStatus() != null && request.getApprovalStatus() == 0) { + // 通过:推送给处理人所在部门负责人 + UserInterior userInterior = userInteriorService.lambdaQuery() + .eq(UserInterior::getUserId, currentUserId) + .one(); - if (userInterior != null && userInterior.getDeptId() != null) { - Department department = departmentService.getById(userInterior.getDeptId()); - if (department != null && department.getHeadUserId() != null) { - QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo() - .setTicketId(ticket.getId()) - .setHandlerUserId(department.getHeadUserId()); - issueTicketToDoService.save(todoItem); + if (userInterior != null && userInterior.getDeptId() != null) { + Department department = departmentService.getById(userInterior.getDeptId()); + if (department != null && department.getHeadUserId() != null) { + QmsIssueTicketToDo todoItem = new QmsIssueTicketToDo() + .setTicketId(ticket.getId()) + .setHandlerUserId(department.getHeadUserId()); + issueTicketToDoService.save(todoItem); + } } } } else { diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketDispatchMultipleQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketDispatchMultipleQO.java index 2cb0c6ab..ea65f9ce 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketDispatchMultipleQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketDispatchMultipleQO.java @@ -23,4 +23,15 @@ public class QmsIssueTicketDispatchMultipleQO { */ @NotEmpty(message = "处理人列表不能为空") private List handlerUserIds; + + /** + * 审批状态(0=通过,1=驳回) + */ + @NotNull(message = "审批状态不能为空") + private Short approvalStatus; + + /** + * 审批意见 + */ + private String approvalOpinion; } 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 d4749671..c939b546 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 @@ -132,6 +132,16 @@ public class QmsInspectionTicketDetailVO { */ private String rootCause; + /** + * 负责人审批状态(qms_issue_ticket表) + */ + private Short responsiblePersonApprovalStatus; + + /** + * 负责人审批意见(qms_issue_ticket表) + */ + private String responsiblePersonApprovalComments; + /** * 文件详情 */