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 b21cfa63..d94b7ed5 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 @@ -3,16 +3,8 @@ package com.nflg.qms.admin.controller; import com.nflg.qms.admin.service.QmsIssueTicketControllerService; import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.PageData; -import com.nflg.wms.common.pojo.qo.QmsIssueTicketAddQO; -import com.nflg.wms.common.pojo.qo.QmsIssueTicketAuditQO; -import com.nflg.wms.common.pojo.qo.QmsIssueTicketPdiAddQO; -import com.nflg.wms.common.pojo.qo.QmsIssueTicketSearchQO; -import com.nflg.wms.common.pojo.qo.QmsPdiInitiateTicketQO; -import com.nflg.wms.common.pojo.vo.QmsIssueTicketDetailVO; -import com.nflg.wms.common.pojo.vo.QmsIssueTicketVO; -import com.nflg.wms.common.pojo.vo.QmsPdiInspectionResultVO; -import com.nflg.wms.common.pojo.vo.QmsPdiTicketDetailVO; -import com.nflg.wms.common.pojo.vo.QmsPdiTicketMyDetailVO; +import com.nflg.wms.common.pojo.qo.*; +import com.nflg.wms.common.pojo.vo.*; import com.nflg.wms.repository.service.IQmsIssueTicketService; import com.nflg.wms.starter.BaseController; import jakarta.annotation.Resource; @@ -59,11 +51,14 @@ public class QmsIssueTicketController extends BaseController { } /** - * PDI发起工单:查询任务的不合格检测项 + * PDI新建工单并返回不合格检测项 + * 1. 创建工单 + * 2. 查询任务的不合格检测项 + * 3. 返回工单ID和不合格检测项列表 */ - @PostMapping("initiatePdiTicket") - public ApiResult> initiatePdiTicket(@Valid @RequestBody QmsPdiInitiateTicketQO request) { - return ApiResult.success(issueTicketControllerService.initiatePdiTicket(request.getTaskRecordId())); + @PostMapping("createAndQueryPdiTicket") + public ApiResult createAndQueryPdiTicket(@Valid @RequestBody QmsPdiCreateAndQueryTicketQO request) { + return ApiResult.success(issueTicketControllerService.createAndQueryPdiTicket(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 68083fb0..f9caf760 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 @@ -8,6 +8,7 @@ import com.nflg.wms.common.exception.NflgException; import com.nflg.wms.common.pojo.qo.QmsIssueTicketAddQO; import com.nflg.wms.common.pojo.qo.QmsIssueTicketAuditQO; import com.nflg.wms.common.pojo.qo.QmsIssueTicketPdiAddQO; +import com.nflg.wms.common.pojo.qo.QmsPdiCreateAndQueryTicketQO; import com.nflg.wms.common.pojo.vo.*; import com.nflg.wms.common.util.UserUtil; import com.nflg.wms.common.util.VUtil; @@ -84,6 +85,46 @@ public class QmsIssueTicketControllerService { @Resource private IDepartmentService departmentService; + /** + * PDI新建工单并返回不合格检测项 + * 1. 创建工单 + * 2. 查询任务的不合格检测项 + * 3. 返回工单ID和不合格检测项列表 + */ + @Transactional(rollbackFor = Exception.class) + public QmsPdiCreateTicketResultVO createAndQueryPdiTicket(@Valid QmsPdiCreateAndQueryTicketQO request) { + // 1. 创建工单 + addPdiTicket(new QmsIssueTicketPdiAddQO() + .setTaskRecordId(request.getTaskRecordId()) + .setIncidentType(request.getIncidentType()) + .setHandlers(request.getHandlers().stream() + .map(h -> new QmsIssueTicketPdiAddQO.HandlerItem() + .setTaskResultId(h.getTaskResultId()) + .setHandlerUserId(h.getHandlerUserId())) + .collect(Collectors.toList()))); + + // 2. 查询该任务的不合格检测项 + List unqualifiedItems = initiatePdiTicket(request.getTaskRecordId()); + + // 3. 查询刚创建的工单 + QmsIssueTicket ticket = issueTicketService.lambdaQuery() + .eq(QmsIssueTicket::getSourceType, (short) 1) + .eq(QmsIssueTicket::getSourceId, request.getTaskRecordId()) + .orderByDesc(QmsIssueTicket::getCreateTime) + .last("LIMIT 1") + .one(); + + // 4. 构建返回结果 + QmsPdiCreateTicketResultVO result = new QmsPdiCreateTicketResultVO(); + if (ticket != null) { + result.setTicketId(ticket.getId()); + result.setTicketNo(ticket.getTicketNo()); + } + result.setUnqualifiedItems(unqualifiedItems != null ? unqualifiedItems : List.of()); + + return result; + } + /** * PDI发起工单:查询任务的不合格检测项 */ @@ -260,14 +301,8 @@ public class QmsIssueTicketControllerService { .one(); if (existingTicket != null) { - // 工单已存在,仅新增分配(工单处理记录) - issueTicketProcessControllerService.addAsync( - existingTicket.getId(), - request.getHandlerUserId(), - request.getInspectionResultIds(), - existingTicket.getTicketNo() - ); - return; + // 工单已存在,不允许重复创建,抛出异常提示使用追加处理记录接口 + throw new NflgException(STATE.BusinessError, "该任务已存在工单(工单编号:" + existingTicket.getTicketNo() + "),请使用追加处理记录接口"); } // 查询检测规则 @@ -288,6 +323,29 @@ public class QmsIssueTicketControllerService { taskRecord.getOrderNo(), "库存检验", rules.getInspectionVersion()); } + // 查询该任务的所有不合格项,汇总生成incidentDescription + String incidentDescription = ""; + List allUnqualifiedResults = pdiInspectionResultsService.lambdaQuery() + .eq(QmsPdiInspectionResults::getTaskId, request.getTaskRecordId()) + .eq(QmsPdiInspectionResults::getInspectionItemResults, false) + .list(); + + if (CollectionUtil.isNotEmpty(allUnqualifiedResults)) { + StringBuilder descBuilder = new StringBuilder(); + int index = 1; + for (QmsPdiInspectionResults result : allUnqualifiedResults) { + if (index > 1) { + descBuilder.append(";"); + } + descBuilder.append(index).append(". "); + descBuilder.append(result.getInspectionContent() != null ? result.getInspectionContent() : ""); + descBuilder.append(":"); + descBuilder.append(result.getInspectionResult() != null ? result.getInspectionResult() : ""); + index++; + } + incidentDescription = descBuilder.toString(); + } + // 统计不合格检测项数量 long unqualifiedCount = pdiInspectionResultsService.lambdaQuery() .eq(QmsPdiInspectionResults::getTaskId, request.getTaskRecordId()) @@ -304,7 +362,7 @@ public class QmsIssueTicketControllerService { .setTicketTitle(ticketTitle) .setProjectNo(taskRecord.getTaskNo()) .setIncidentType(request.getIncidentType()) - .setIncidentDescription(request.getIncidentDescription()) + .setIncidentDescription(incidentDescription) .setUnqualifiedQty((int) unqualifiedCount) .setApprovalStatus((short) 0) .setStatus((short) 0) @@ -317,13 +375,21 @@ public class QmsIssueTicketControllerService { issueTicketService.save(entity); - // 异步新增工单处理记录并推送待办 - issueTicketProcessControllerService.addAsync( - entity.getId(), - request.getHandlerUserId(), - request.getInspectionResultIds(), - ticketNo - ); + // 按处理人分组,异步新增工单处理记录并推送待办 + Map> handlerToResultsMap = request.getHandlers().stream() + .collect(Collectors.groupingBy( + QmsIssueTicketPdiAddQO.HandlerItem::getHandlerUserId, + Collectors.mapping(QmsIssueTicketPdiAddQO.HandlerItem::getTaskResultId, Collectors.toList()) + )); + + for (Map.Entry> entry : handlerToResultsMap.entrySet()) { + issueTicketProcessControllerService.addAsync( + entity.getId(), + entry.getKey(), + entry.getValue(), + ticketNo + ); + } } /** @@ -716,6 +782,15 @@ public class QmsIssueTicketControllerService { // 查询工单基本信息 QmsIssueTicket ticket = issueTicketService.getById(id); + // 如果工单状态是待流转(0),更新为处理中(1) + if (ticket.getStatus() != null && ticket.getStatus() == 0) { + issueTicketService.lambdaUpdate() + .eq(QmsIssueTicket::getId, id) + .set(QmsIssueTicket::getStatus, (short) 1) + .update(); + ticket.setStatus((short) 1); // 更新内存中的状态 + } + // 判断是否为工单创建者 boolean isCreator = ticket.getCreateUserId() != null && ticket.getCreateUserId().equals(currentUserId); 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 e8f58ecf..1d4bd8e9 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 @@ -65,7 +65,28 @@ public class QmsIssueTicketProcessControllerService { * 新增工单处理(同步,供 Controller 直接调用) */ public void add(QmsIssueTicketProcessAddQO request) { - doAdd(request.getIssueTicketId(), request.getHandlerUserId(), request.getTaskResultIds()); + // 校验工单是否存在 + QmsIssueTicket ticket = issueTicketService.getById(request.getIssueTicketId()); + if (ticket == null) { + throw new NflgException(STATE.BusinessError, "工单不存在"); + } + + // 校验工单状态:只有待流转(0)或处理中(1)才能追加处理记录 + if (ticket.getStatus() != null && ticket.getStatus() != 0 && ticket.getStatus() != 1) { + throw new NflgException(STATE.BusinessError, "工单状态为已完成,不允许追加处理记录"); + } + + // 按处理人分组 + Map> handlerToResultsMap = request.getHandlers().stream() + .collect(Collectors.groupingBy( + QmsIssueTicketProcessAddQO.HandlerItem::getHandlerUserId, + Collectors.mapping(QmsIssueTicketProcessAddQO.HandlerItem::getTaskResultId, Collectors.toList()) + )); + + // 为每个处理人创建处理记录 + for (Map.Entry> entry : handlerToResultsMap.entrySet()) { + doAdd(request.getIssueTicketId(), entry.getKey(), entry.getValue()); + } } /** diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketPdiAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketPdiAddQO.java index c11d6fe4..14011da9 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketPdiAddQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketPdiAddQO.java @@ -1,6 +1,6 @@ package com.nflg.wms.common.pojo.qo; -import jakarta.validation.constraints.NotBlank; +import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -19,18 +19,6 @@ public class QmsIssueTicketPdiAddQO { @NotNull(message = "PDI检测任务记录ID不能为空") private Long taskRecordId; - /** - * 处理人用户ID - */ - @NotNull(message = "处理人用户ID不能为空") - private Long handlerUserId; - - /** - * PDI检测结果ID列表(qms_pdi_inspection_results.ID),存入工单处理的task_result_ids - */ - @NotEmpty(message = "检测结果ID列表不能为空") - private List inspectionResultIds; - /** * 事故类型:0=一般,1=较严重,2=严重 */ @@ -38,8 +26,27 @@ public class QmsIssueTicketPdiAddQO { private Short incidentType; /** - * 事件描述(对不合格项的内容整合) + * 处理人列表 */ - @NotBlank(message = "事件描述不能为空") - private String incidentDescription; + @Valid + @NotEmpty(message = "处理人列表不能为空") + private List handlers; + + /** + * 处理人项 + */ + @Data + public static class HandlerItem { + /** + * PDI检测结果ID(qms_pdi_inspection_results.ID) + */ + @NotNull(message = "检测结果ID不能为空") + private Long taskResultId; + + /** + * 处理人用户ID + */ + @NotNull(message = "处理人用户ID不能为空") + private Long handlerUserId; + } } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketProcessAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketProcessAddQO.java index cd178657..ce4606f3 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketProcessAddQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsIssueTicketProcessAddQO.java @@ -1,5 +1,6 @@ package com.nflg.wms.common.pojo.qo; +import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -12,21 +13,34 @@ import java.util.List; @Data public class QmsIssueTicketProcessAddQO { - /** - * 任务结果ID列表(QmsPdiTaskRecord.ID) - */ - @NotEmpty(message = "任务结果ID列表不能为空") - private List taskResultIds; - - /** - * 处理人用户ID - */ - @NotNull(message = "处理人用户ID不能为空") - private Long handlerUserId; - /** * 质量问题工单ID */ @NotNull(message = "质量问题工单ID不能为空") private Long issueTicketId; + + /** + * 处理人列表 + */ + @Valid + @NotEmpty(message = "处理人列表不能为空") + private List handlers; + + /** + * 处理人项 + */ + @Data + public static class HandlerItem { + /** + * 任务结果ID(QmsPdiTaskRecord.ID) + */ + @NotNull(message = "任务结果ID不能为空") + private Long taskResultId; + + /** + * 处理人用户ID + */ + @NotNull(message = "处理人用户ID不能为空") + private Long handlerUserId; + } } diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiCreateAndQueryTicketQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiCreateAndQueryTicketQO.java new file mode 100644 index 00000000..927059c4 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiCreateAndQueryTicketQO.java @@ -0,0 +1,52 @@ +package com.nflg.wms.common.pojo.qo; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +/** + * PDI新建工单并查询不合格检测项 + */ +@Data +public class QmsPdiCreateAndQueryTicketQO { + + /** + * PDI检测任务记录ID(QmsPdiTaskRecord.ID),存入工单的source_id + */ + @NotNull(message = "PDI检测任务记录ID不能为空") + private Long taskRecordId; + + /** + * 事故类型:0=一般,1=较严重,2=严重 + */ + @NotNull(message = "事故类型不能为空") + private Short incidentType; + + /** + * 处理人列表 + */ + @Valid + @NotEmpty(message = "处理人列表不能为空") + private List handlers; + + /** + * 处理人项 + */ + @Data + public static class HandlerItem { + /** + * PDI检测结果ID(qms_pdi_inspection_results.ID) + */ + @NotNull(message = "检测结果ID不能为空") + private Long taskResultId; + + /** + * 处理人用户ID + */ + @NotNull(message = "处理人用户ID不能为空") + private Long handlerUserId; + } +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiCreateTicketResultVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiCreateTicketResultVO.java new file mode 100644 index 00000000..53290e48 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiCreateTicketResultVO.java @@ -0,0 +1,27 @@ +package com.nflg.wms.common.pojo.vo; + +import lombok.Data; + +import java.util.List; + +/** + * PDI新建工单并返回不合格检测项 + */ +@Data +public class QmsPdiCreateTicketResultVO { + + /** + * 工单ID + */ + private Long ticketId; + + /** + * 工单编号 + */ + private String ticketNo; + + /** + * 不合格检测项列表 + */ + private List unqualifiedItems; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTaskRecordDefectPageVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTaskRecordDefectPageVO.java index 940954be..76b76de7 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTaskRecordDefectPageVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTaskRecordDefectPageVO.java @@ -111,7 +111,12 @@ public class QmsPdiTaskRecordDefectPageVO { private Boolean overdue; /** - * 流程状态:有工单时取工单状态(0=待流转,1=处理中,2=已完成),无工单时取任务状态(2=已完成,3=待流转) + * 工单ID + */ + private Long ticketId; + + /** + * 流程状态:有工单时取工单状态(0=待流转,1=处理中,2=已完成),无工单时取任务状态(3=未发起) */ private Short status; diff --git a/nflg-wms-repository/src/main/resources/mapper/QmsPdiTaskRecordMapper.xml b/nflg-wms-repository/src/main/resources/mapper/QmsPdiTaskRecordMapper.xml index 9a5e1b4c..4c5473a6 100644 --- a/nflg-wms-repository/src/main/resources/mapper/QmsPdiTaskRecordMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/QmsPdiTaskRecordMapper.xml @@ -92,7 +92,11 @@ t.required_completion_time AS requiredCompletionTime, t.detection_completion_time AS detectionCompletionTime, t.overdue, - COALESCE(it.status, t.inspection_enable) AS status, + it.id AS ticketId, + CASE + WHEN it.id IS NOT NULL THEN it.status + ELSE 3 + END AS status, it.ticket_no AS ticketNo, it.ticket_title AS ticketTitle FROM qms_pdi_task_record t @@ -132,7 +136,10 @@ AND t.warehouse_no = #{request.warehouseNo} - AND COALESCE(it.status, t.inspection_enable) = #{request.status} + AND CASE + WHEN it.id IS NOT NULL THEN it.status + ELSE 3 + END = #{request.status} ORDER BY t.id DESC