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 88cdd97f..70b285b1 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 @@ -1661,11 +1661,13 @@ public class QmsIssueTicketControllerService { .map(QmsPdiInspectionResults::getId) .collect(Collectors.toSet()); - // 收集有效分派的不合格项ID(仅非驳回记录:approvalStatus为null待处理 或 0已通过) + // 收集有效分派的不合格项ID(排除处理人/审批人驳回的记录) Set effectivelyDispatched = new HashSet<>(); for (QmsIssueTicketProcess p : processes) { if (StrUtil.isBlank(p.getTaskResultIds())) continue; - if (p.getApprovalStatus() != null && p.getApprovalStatus() == 1) continue; // 被驳回的不算有效覆盖 + // 处理人/审批人驳回的不算有效覆盖,需要创建人重新分派 + if (p.getApprovalStatus() != null && p.getApprovalStatus() == 1) continue; + // 领导驳回不影响分派权限(由处理人重新提交处理) Arrays.stream(p.getTaskResultIds().split(",")) .filter(StrUtil::isNotBlank).map(String::trim).map(Long::valueOf) .forEach(effectivelyDispatched::add); 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 25e25153..a887a7f8 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 @@ -121,14 +121,23 @@ public class QmsIssueTicketProcessControllerService { String currentUserName = UserUtil.getUserName(); LocalDateTime now = LocalDateTime.now(); - // 1. 查询处理记录 - QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId()); - VUtil.trueThrowBusinessError(Objects.isNull(process)).throwMessage("工单处理记录不存在"); - - // 2. 查询工单获取source_type - QmsIssueTicket ticket = issueTicketService.getById(process.getIssueTicketId()); + // 1. 查询工单(request.getId()现在是工单ID) + QmsIssueTicket ticket = issueTicketService.getById(request.getId()); VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在"); + // 2. 通过工单ID + 当前登录人查找处理记录 + QmsIssueTicketProcess process = issueTicketProcessService.lambdaQuery() + .eq(QmsIssueTicketProcess::getIssueTicketId, request.getId()) + .and(w -> w + .eq(QmsIssueTicketProcess::getHandlerUserId, currentUserId) + .or() + .eq(QmsIssueTicketProcess::getApprovalUserId, currentUserId) + .or() + .eq(QmsIssueTicketProcess::getLeaderUserId, currentUserId)) + .last("LIMIT 1") + .one(); + VUtil.trueThrowBusinessError(Objects.isNull(process)).throwMessage("未找到当前用户的工单处理记录"); + Short sourceType = ticket.getSourceType(); Long handlerUserId = process.getHandlerUserId(); @@ -152,7 +161,7 @@ public class QmsIssueTicketProcessControllerService { // 写入审批时间 issueTicketProcessService.lambdaUpdate() - .eq(QmsIssueTicketProcess::getId, request.getId()) + .eq(QmsIssueTicketProcess::getId, process.getId()) .set(QmsIssueTicketProcess::getApprovalTime, now) .update(); @@ -189,9 +198,11 @@ public class QmsIssueTicketProcessControllerService { VUtil.trueThrowBusinessError(Objects.isNull(request.getApprovalStatus())) .throwMessage("提交时审批状态不能为空"); + Long processId = process.getId(); + // 2. 保存数据:前端传入approvalStatus/approvalOpinion,数据库填入leaderApprovalResult/leaderApprovalOpinion issueTicketProcessService.lambdaUpdate() - .eq(QmsIssueTicketProcess::getId, request.getId()) + .eq(QmsIssueTicketProcess::getId, processId) .set(request.getApprovalOpinion() != null, QmsIssueTicketProcess::getLeaderApprovalOpinion, request.getApprovalOpinion()) .set(request.getApprovalStatus() != null, @@ -251,12 +262,14 @@ public class QmsIssueTicketProcessControllerService { VUtil.trueThrowBusinessError(Objects.isNull(request.getApprovalStatus())) .throwMessage("提交时审批状态不能为空"); + Long processId = process.getId(); + // 2. 保存数据 issueTicketProcessMeasureControllerService.draft(request); // 3. 写入审批时间,并重置领导审批结果(允许领导重新审批) issueTicketProcessService.lambdaUpdate() - .eq(QmsIssueTicketProcess::getId, request.getId()) + .eq(QmsIssueTicketProcess::getId, processId) .set(QmsIssueTicketProcess::getApprovalTime, now) .set(QmsIssueTicketProcess::getLeaderApprovalResult, null) .set(QmsIssueTicketProcess::getLeaderApprovalOpinion, null) 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 e4780514..f0cb5920 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 @@ -10,6 +10,7 @@ import com.nflg.wms.common.util.VUtil; import com.nflg.wms.repository.entity.QmsIssueTicket; import com.nflg.wms.repository.entity.QmsIssueTicketProcess; import com.nflg.wms.repository.entity.QmsIssueTicketProcessMeasure; +import com.nflg.wms.repository.service.IDictionaryItemService; import com.nflg.wms.repository.service.IQmsIssueTicketProcessMeasureService; import com.nflg.wms.repository.service.IQmsIssueTicketProcessService; import com.nflg.wms.repository.service.IQmsIssueTicketService; @@ -19,6 +20,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.util.List; import java.util.Objects; /** @@ -36,45 +38,38 @@ public class QmsIssueTicketProcessMeasureControllerService { @Resource private IQmsIssueTicketService issueTicketService; + @Resource + private IDictionaryItemService dictionaryItemService; + /** - * 暂存工单处理:更新工单处理记录,有措施内容则新增一条措施记录 + * 暂存工单处理:更新工单处理记录,有措施内容则新增措施记录 */ @Transactional(rollbackFor = Exception.class) public void draft(@Valid QmsIssueTicketProcessDraftQO request) { - // 校验工单处理记录存在 - QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId()); - VUtil.trueThrowBusinessError(Objects.isNull(process)).throwMessage("工单处理记录不存在"); + Long currentUserId = UserUtil.getUserId(); + + // 通过工单ID + 当前登录人查找处理记录 + QmsIssueTicketProcess process = findProcessByTicketAndUser(request.getId(), currentUserId); // 校验:领导已同意时不允许修改 if (process.getLeaderApprovalResult() != null && process.getLeaderApprovalResult() == 1) { throw new NflgException(STATE.BusinessError, "领导已审批同意,不允许修改"); } + Long processId = process.getId(); + // 更新工单处理记录 issueTicketProcessService.lambdaUpdate() - .eq(QmsIssueTicketProcess::getId, request.getId()) + .eq(QmsIssueTicketProcess::getId, processId) .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, UserUtil.getUserId()) + .set(QmsIssueTicketProcess::getApprovalUserId, currentUserId) .set(QmsIssueTicketProcess::getApprovalUserName, UserUtil.getUserName()) .update(); - // 有措施列表则批量新增措施记录 - if (CollectionUtil.isNotEmpty(request.getMeasures())) { - for (QmsIssueTicketProcessDraftQO.MeasureItem item : request.getMeasures()) { - if (StrUtil.isBlank(item.getMeasureContent())) continue; - QmsIssueTicketProcessMeasure measure = new QmsIssueTicketProcessMeasure() - .setIssueTicketProcessId(request.getId()) - .setMeasureContent(item.getMeasureContent()) - .setMeasureTypeId(item.getMeasureTypeId()) - .setChargeUser(UserUtil.getUserName()) - .setPlanDate(item.getPlanDate()) - .setConfirmDate(item.getConfirmDate()) - .setRemark(item.getRemark()); - issueTicketProcessMeasureService.save(measure); - } - } + // 保存措施记录(临时措施 + 永久措施) + saveMeasures(processId, request.getTemporaryMeasures(), request.getPermanentMeasures()); } /** @@ -82,17 +77,21 @@ public class QmsIssueTicketProcessMeasureControllerService { */ @Transactional(rollbackFor = Exception.class) public void leaderDraft(@Valid QmsIssueTicketProcessDraftQO request) { - QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId()); - VUtil.trueThrowBusinessError(Objects.isNull(process)).throwMessage("工单处理记录不存在"); + Long currentUserId = UserUtil.getUserId(); + + // 通过工单ID + 当前登录人查找处理记录 + QmsIssueTicketProcess process = findProcessByTicketAndUser(request.getId(), currentUserId); + + Long processId = process.getId(); // 前端传入approvalOpinion/approvalStatus,数据库填入leaderApprovalOpinion/leaderApprovalResult issueTicketProcessService.lambdaUpdate() - .eq(QmsIssueTicketProcess::getId, request.getId()) + .eq(QmsIssueTicketProcess::getId, processId) .set(request.getApprovalOpinion() != null, QmsIssueTicketProcess::getLeaderApprovalOpinion, request.getApprovalOpinion()) .set(request.getApprovalStatus() != null, QmsIssueTicketProcess::getLeaderApprovalResult, request.getApprovalStatus()) - .set(QmsIssueTicketProcess::getLeaderUserId, UserUtil.getUserId()) + .set(QmsIssueTicketProcess::getLeaderUserId, currentUserId) .set(QmsIssueTicketProcess::getLeaderUserName, UserUtil.getUserName()) .set(QmsIssueTicketProcess::getLeaderApprovalTime, LocalDateTime.now()) .update(); @@ -105,12 +104,12 @@ public class QmsIssueTicketProcessMeasureControllerService { public void draftUnified(@Valid QmsIssueTicketProcessDraftQO request) { Long currentUserId = UserUtil.getUserId(); - // 1. 查询处理记录 - QmsIssueTicketProcess process = issueTicketProcessService.getById(request.getId()); - VUtil.trueThrowBusinessError(Objects.isNull(process)).throwMessage("工单处理记录不存在"); + // 1. 通过工单ID + 当前登录人查找处理记录 + QmsIssueTicketProcess process = findProcessByTicketAndUser(request.getId(), currentUserId); + Long processId = process.getId(); // 2. 查询工单获取source_type - QmsIssueTicket ticket = issueTicketService.getById(process.getIssueTicketId()); + QmsIssueTicket ticket = issueTicketService.getById(request.getId()); VUtil.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("工单不存在"); Short sourceType = ticket.getSourceType(); @@ -133,31 +132,18 @@ public class QmsIssueTicketProcessMeasureControllerService { if (isHandler) { // 处理人处理:只填根本原因和措施,不填审批状态 issueTicketProcessService.lambdaUpdate() - .eq(QmsIssueTicketProcess::getId, request.getId()) + .eq(QmsIssueTicketProcess::getId, processId) .set(request.getRootCause() != null, QmsIssueTicketProcess::getRootCause, request.getRootCause()) .set(QmsIssueTicketProcess::getApprovalUserId, currentUserId) .set(QmsIssueTicketProcess::getApprovalUserName, UserUtil.getUserName()) .update(); - // 有措施列表则批量新增 - if (CollectionUtil.isNotEmpty(request.getMeasures())) { - for (QmsIssueTicketProcessDraftQO.MeasureItem item : request.getMeasures()) { - if (StrUtil.isBlank(item.getMeasureContent())) continue; - QmsIssueTicketProcessMeasure measure = new QmsIssueTicketProcessMeasure() - .setIssueTicketProcessId(request.getId()) - .setMeasureContent(item.getMeasureContent()) - .setMeasureTypeId(item.getMeasureTypeId()) - .setChargeUser(UserUtil.getUserName()) - .setPlanDate(item.getPlanDate()) - .setConfirmDate(item.getConfirmDate()) - .setRemark(item.getRemark()); - issueTicketProcessMeasureService.save(measure); - } - } + // 保存措施记录(临时措施 + 永久措施) + saveMeasures(processId, request.getTemporaryMeasures(), request.getPermanentMeasures()); } else { // 领导审批:前端传入approvalStatus/approvalOpinion,数据库填入leaderApprovalResult/leaderApprovalOpinion issueTicketProcessService.lambdaUpdate() - .eq(QmsIssueTicketProcess::getId, request.getId()) + .eq(QmsIssueTicketProcess::getId, processId) .set(request.getApprovalOpinion() != null, QmsIssueTicketProcess::getLeaderApprovalOpinion, request.getApprovalOpinion()) .set(request.getApprovalStatus() != null, @@ -171,4 +157,71 @@ public class QmsIssueTicketProcessMeasureControllerService { throw new NflgException(STATE.BusinessError, "不支持的工单类型"); } } + + /** + * 通过工单ID + 用户ID查找处理记录 + */ + private QmsIssueTicketProcess findProcessByTicketAndUser(Long ticketId, Long userId) { + QmsIssueTicketProcess process = issueTicketProcessService.lambdaQuery() + .eq(QmsIssueTicketProcess::getIssueTicketId, ticketId) + .and(w -> w + .eq(QmsIssueTicketProcess::getHandlerUserId, userId) + .or() + .eq(QmsIssueTicketProcess::getApprovalUserId, userId) + .or() + .eq(QmsIssueTicketProcess::getLeaderUserId, userId)) + .last("LIMIT 1") + .one(); + if (process == null) { + throw new NflgException(STATE.BusinessError, "未找到当前用户的工单处理记录"); + } + return process; + } + + /** + * 保存措施记录(先删除旧数据,再分别插入临时措施和永久措施) + */ + private void saveMeasures(Long processId, List temporaryMeasures, + List permanentMeasures) { + // 先删除该处理记录下的旧措施 + issueTicketProcessMeasureService.lambdaUpdate() + .eq(QmsIssueTicketProcessMeasure::getIssueTicketProcessId, processId) + .remove(); + + String currentUserName = UserUtil.getUserName(); + + // 保存临时措施 + if (CollectionUtil.isNotEmpty(temporaryMeasures)) { + Long tempTypeId = dictionaryItemService.getIdByCode("MeasureType", "TemporaryCorrectiveMeasures"); + for (QmsIssueTicketProcessDraftQO.MeasureItem item : temporaryMeasures) { + if (StrUtil.isBlank(item.getMeasureContent())) continue; + QmsIssueTicketProcessMeasure measure = new QmsIssueTicketProcessMeasure() + .setIssueTicketProcessId(processId) + .setMeasureTypeId(tempTypeId) + .setMeasureContent(item.getMeasureContent()) + .setChargeUser(currentUserName) + .setPlanDate(item.getPlanDate()) + .setConfirmDate(item.getConfirmDate()) + .setRemark(item.getRemark()); + issueTicketProcessMeasureService.save(measure); + } + } + + // 保存永久措施 + if (CollectionUtil.isNotEmpty(permanentMeasures)) { + Long permTypeId = dictionaryItemService.getIdByCode("MeasureType", "PermanentCorrectiveMeasures"); + for (QmsIssueTicketProcessDraftQO.MeasureItem item : permanentMeasures) { + if (StrUtil.isBlank(item.getMeasureContent())) continue; + QmsIssueTicketProcessMeasure measure = new QmsIssueTicketProcessMeasure() + .setIssueTicketProcessId(processId) + .setMeasureTypeId(permTypeId) + .setMeasureContent(item.getMeasureContent()) + .setChargeUser(currentUserName) + .setPlanDate(item.getPlanDate()) + .setConfirmDate(item.getConfirmDate()) + .setRemark(item.getRemark()); + issueTicketProcessMeasureService.save(measure); + } + } + } } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketProcessDraftQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketProcessDraftQO.java index e3aba89a..b809e94c 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketProcessDraftQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketProcessDraftQO.java @@ -13,9 +13,9 @@ import java.util.List; public class QmsIssueTicketProcessDraftQO { /** - * 工单处理ID(QmsIssueTicketProcess.ID) + * 工单ID(QmsIssueTicket.ID) */ - @NotNull(message = "工单处理ID不能为空") + @NotNull(message = "工单ID不能为空") private Long id; /** @@ -34,9 +34,14 @@ public class QmsIssueTicketProcessDraftQO { private String approvalOpinion; /** - * 措施列表(可选),每项对应一条 QmsIssueTicketProcessMeasure 记录 + * 临时措施列表(可选),measureTypeId由后端根据字典值TemporaryCorrectiveMeasures自动赋值 */ - private List measures; + private List temporaryMeasures; + + /** + * 永久措施列表(可选),measureTypeId由后端根据字典值PermanentCorrectiveMeasures自动赋值 + */ + private List permanentMeasures; /** * 措施项 @@ -44,11 +49,6 @@ public class QmsIssueTicketProcessDraftQO { @Data public static class MeasureItem { - /** - * 措施类型ID,关联字典项表 - */ - private Long measureTypeId; - /** * 措施内容 */