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 19b02732..10ffa95a 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 @@ -1646,36 +1646,39 @@ public class QmsIssueTicketControllerService { Map signatures = buildSignatures(processes); vo.setSignatures(signatures); - // === 权限判断:isReview / isDispatch === + // === 权限判断:isReview / isDispatch / isEdit === if (isCreator) { - // 创建人:isReview = false,isDispatch = 是否有未分派/被驳回的不合格项 + // 创建人:isReview=false,isEdit=false vo.setIsReview(false); + vo.setIsEdit(false); - // 获取该工单全部处理记录(创建人场景下 processes 已经是全量) + // isDispatch:查询全部不合格项,判断是否都已被有效分派 + List allUnqualified = pdiInspectionResultsService.lambdaQuery() + .eq(QmsPdiInspectionResults::getTaskId, ticket.getSourceId()) + .eq(QmsPdiInspectionResults::getInspectionItemResults, false) + .list(); + Set allUnqualifiedIds = allUnqualified.stream() + .map(QmsPdiInspectionResults::getId) + .collect(Collectors.toSet()); + + // 收集有效分派的不合格项ID(仅非驳回记录:approvalStatus为null待处理 或 0已通过) Set effectivelyDispatched = new HashSet<>(); - Set rejectedResultIds = new HashSet<>(); for (QmsIssueTicketProcess p : processes) { if (StrUtil.isBlank(p.getTaskResultIds())) continue; - List ids = Arrays.stream(p.getTaskResultIds().split(",")) + if (p.getApprovalStatus() != null && p.getApprovalStatus() == 1) continue; // 被驳回的不算有效覆盖 + Arrays.stream(p.getTaskResultIds().split(",")) .filter(StrUtil::isNotBlank).map(String::trim).map(Long::valueOf) - .collect(Collectors.toList()); - if (p.getApprovalStatus() != null && p.getApprovalStatus() == 1) { - // 被驳回的记录,其中的不合格项视为未分派 - rejectedResultIds.addAll(ids); - } else { - // 有效分派(pending 或已通过) - effectivelyDispatched.addAll(ids); - } + .forEach(effectivelyDispatched::add); } - // 被驳回且未被重新分派的项 - rejectedResultIds.removeAll(effectivelyDispatched); - // 没有任何处理记录 或 存在被驳回未重新分派的项 → isDispatch = true - vo.setIsDispatch(processes.isEmpty() || !rejectedResultIds.isEmpty()); + + // 全部不合格项都在有效分派集合中 → isDispatch=false + // 有未覆盖的(从未分派 或 被驳回后未重新分派)→ isDispatch=true + vo.setIsDispatch(!allUnqualifiedIds.isEmpty() && !effectivelyDispatched.containsAll(allUnqualifiedIds)); } else { - // 非创建人:isDispatch = false + // 非创建人:isDispatch=false vo.setIsDispatch(false); - // 判断是否为上级领导 + // 获取全部处理记录判断角色 List allProcesses = issueTicketProcessService.lambdaQuery() .eq(QmsIssueTicketProcess::getIssueTicketId, id) .list(); @@ -1683,14 +1686,21 @@ public class QmsIssueTicketControllerService { .anyMatch(p -> currentUserId.equals(p.getLeaderUserId())); if (isLeader) { - // 上级领导:isReview = true + // 领导:isReview=true vo.setIsReview(true); + // isEdit:领导未提交审批(leaderApprovalResult为null)时有编辑权限 + boolean leaderNotSubmitted = allProcesses.stream() + .filter(p -> currentUserId.equals(p.getLeaderUserId())) + .anyMatch(p -> p.getLeaderApprovalResult() == null); + vo.setIsEdit(leaderNotSubmitted); } else { - // 处理人/审批人:检查是否有未审批的处理记录 + // 处理人/审批人 boolean hasUnapproved = allProcesses.stream() .filter(p -> currentUserId.equals(p.getHandlerUserId()) || currentUserId.equals(p.getApprovalUserId())) .anyMatch(p -> p.getApprovalStatus() == null); vo.setIsReview(hasUnapproved); + // isEdit:处理人未提交(approvalStatus为null)时有编辑权限 + vo.setIsEdit(hasUnapproved); } } @@ -1980,24 +1990,28 @@ public class QmsIssueTicketControllerService { .eq(QmsIssueTicketProcess::getIssueTicketId, id) .list(); - // isEdit:仅当前登录人是处理人时为true + // isEdit:处理人或领导为true boolean isHandler = allProcesses.stream() .anyMatch(p -> currentUserId.equals(p.getHandlerUserId())); - vo.setIsEdit(isHandler); + boolean isLeader = allProcesses.stream() + .anyMatch(p -> currentUserId.equals(p.getLeaderUserId())); + vo.setIsEdit(isHandler || isLeader); - if (currentUserId.equals(ticket.getCreateUserId()) || currentUserId.equals(ticket.getApprovalUserId())) { - // 情况1/2:创建人 或 工单表审批人 → isReview=false,isDispatch看是否有未分派/被驳回 + Short status = ticket.getStatus(); + if (currentUserId.equals(ticket.getCreateUserId())) { + // 创建人:isReview=false,isDispatch仅在待流转状态 vo.setIsReview(false); - // 无处理记录 或 存在被驳回的处理记录 → isDispatch=true - boolean hasRejected = allProcesses.stream() - .anyMatch(p -> p.getApprovalStatus() != null && p.getApprovalStatus() == 1); - vo.setIsDispatch(allProcesses.isEmpty() || hasRejected); + vo.setIsDispatch(status != null && status == 0); + } else if (currentUserId.equals(ticket.getApprovalUserId())) { + // 工单表审批人:isReview=false,isDispatch在处理中到已完成之间 + vo.setIsReview(false); + vo.setIsDispatch(status != null && status == 1); } else if (allProcesses.stream().anyMatch(p -> currentUserId.equals(p.getLeaderUserId()))) { - // 情况4:上级领导 → isReview=true,isDispatch=false + // 上级领导:isReview=true,isDispatch=false vo.setIsReview(true); vo.setIsDispatch(false); } else { - // 情况3:处理人/审批人(工单处理表) → isReview=false,isDispatch=false + // 处理人/审批人(工单处理表):全false vo.setIsReview(false); vo.setIsDispatch(false); } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTicketMyDetailVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTicketMyDetailVO.java index eed7c886..f1ae4bda 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTicketMyDetailVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTicketMyDetailVO.java @@ -27,6 +27,11 @@ public class QmsPdiTicketMyDetailVO { */ private Boolean isDispatch; + /** + * 是否有编辑权限 + */ + private Boolean isEdit; + /** * 来源类型:0=IQC检测任务,1=PDI检测任务,2=巡检 */ diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsIssueTicketServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsIssueTicketServiceImpl.java index 34320241..f077f4d1 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsIssueTicketServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsIssueTicketServiceImpl.java @@ -9,10 +9,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.qo.QmsIssueTicketSearchQO; import com.nflg.wms.common.pojo.vo.QmsIssueTicketVO; +import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.repository.entity.FileUploadRecord; import com.nflg.wms.repository.entity.QmsIssueTicket; +import com.nflg.wms.repository.entity.QmsIssueTicketProcess; import com.nflg.wms.repository.mapper.QmsIssueTicketMapper; import com.nflg.wms.repository.service.IFileUploadRecordService; +import com.nflg.wms.repository.service.IQmsIssueTicketProcessService; import com.nflg.wms.repository.service.IQmsIssueTicketService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -31,12 +34,32 @@ public class QmsIssueTicketServiceImpl implements IQmsIssueTicketService { private final IFileUploadRecordService fileUploadRecordService; + private final IQmsIssueTicketProcessService issueTicketProcessService; @Override public PageData search(QmsIssueTicketSearchQO request) { + Long currentUserId = UserUtil.getUserId(); Page page = new Page<>(request.getPage(), request.getPageSize()); + // 查询当前用户在处理记录中关联的工单ID(处理人/审批人/领导) + List processTicketIds = issueTicketProcessService.lambdaQuery() + .and(w -> w + .eq(QmsIssueTicketProcess::getHandlerUserId, currentUserId) + .or().eq(QmsIssueTicketProcess::getApprovalUserId, currentUserId) + .or().eq(QmsIssueTicketProcess::getLeaderUserId, currentUserId) + ) + .list() + .stream().map(QmsIssueTicketProcess::getIssueTicketId).distinct().collect(Collectors.toList()); + var query = lambdaQuery() + // 数据权限:只能看到与当前登录人相关的工单 + .and(w -> { + w.eq(QmsIssueTicket::getCreateUserId, currentUserId) + .or().eq(QmsIssueTicket::getApprovalUserId, currentUserId); + if (CollectionUtil.isNotEmpty(processTicketIds)) { + w.or().in(QmsIssueTicket::getId, processTicketIds); + } + }) .like(StrUtil.isNotBlank(request.getTicketNo()), QmsIssueTicket::getTicketNo, request.getTicketNo()) .like(StrUtil.isNotBlank(request.getTicketTitle()), QmsIssueTicket::getTicketTitle, request.getTicketTitle()) .like(StrUtil.isNotBlank(request.getProjectNo()), QmsIssueTicket::getProjectNo, request.getProjectNo())