From ace2827b6a9f520eb64a15f9dd8ad4010640890f Mon Sep 17 00:00:00 2001 From: funny <834502597@qq.com> Date: Sat, 9 May 2026 14:24:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(issue-ticket):=20=E4=BC=98=E5=8C=96PDI?= =?UTF-8?q?=E5=B7=A5=E5=8D=95=E5=88=9B=E5=BB=BA=E5=8F=8A=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 只创建工单主表,不创建处理明细,避免重复插入 - 查询任务记录及检测规则,校验数据完整性 - 判断是否已存在工单,避免重复创建并抛出异常提示 - 根据检测类型生成工单标题,提升信息准确性 - 汇总所有不合格项生成事件描述,便于问题追踪 - 统计不合格项数量赋值工单主表字段 - 调用编号生成服务生成唯一工单编号 - 异步新增工单处理记录并推送待办任务 - 返回工单ID、工单编号及不合格检测项列表 --- .../QmsIssueTicketControllerService.java | 132 ++++++++++++++---- 1 file changed, 104 insertions(+), 28 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 891809d0..17c7013d 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 @@ -88,46 +88,106 @@ public class QmsIssueTicketControllerService { /** * PDI新建工单并返回不合格检测项 - * 1. 创建工单 + * 1. 创建工单(只创建工单主表,不创建处理明细) * 2. 查询任务的不合格检测项 * 3. 返回工单ID和不合格检测项列表 */ @Transactional(rollbackFor = Exception.class) public QmsPdiCreateTicketResultVO createAndQueryPdiTicket(@Valid QmsPdiCreateAndQueryTicketQO request) { - // 1. 创建工单 - QmsIssueTicketPdiAddQO addQO = new QmsIssueTicketPdiAddQO(); - addQO.setTaskRecordId(request.getTaskRecordId()); - addQO.setIncidentType(request.getIncidentType()); + Long userId = UserUtil.getUserId(); + String userName = UserUtil.getUserName(); + LocalDateTime now = LocalDateTime.now(); - List handlerItems = request.getHandlers().stream() - .map(h -> { - QmsIssueTicketPdiAddQO.HandlerItem item = new QmsIssueTicketPdiAddQO.HandlerItem(); - item.setTaskResultId(h.getTaskResultId()); - item.setHandlerUserId(h.getHandlerUserId()); - return item; - }) - .collect(Collectors.toList()); - addQO.setHandlers(handlerItems); + // 1. 查询任务记录 + QmsPdiTaskRecord taskRecord = pdiTaskRecordService.getById(request.getTaskRecordId()); + if (Objects.isNull(taskRecord)) { + throw new NflgException(STATE.BusinessError, "PDI检测任务记录不存在"); + } - addPdiTicket(addQO); - - // 2. 查询该任务的不合格检测项 - List unqualifiedItems = initiatePdiTicket(request.getTaskRecordId()); - - // 3. 查询刚创建的工单 - QmsIssueTicket ticket = issueTicketService.lambdaQuery() + // 2. 校验是否已存在工单 + QmsIssueTicket existingTicket = 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()); + if (existingTicket != null) { + throw new NflgException(STATE.BusinessError, "该任务已存在工单(工单编号:" + existingTicket.getTicketNo() + "),请使用追加处理记录接口"); } + + // 3. 查询检测规则 + QmsPdiDetectionRules rules = pdiDetectionRulesService.getById(taskRecord.getDetectionRulesId()); + if (Objects.isNull(rules)) { + throw new NflgException(STATE.BusinessError, "PDI检测规则不存在"); + } + + // 4. 生成工单标题 + String ticketTitle; + if (Objects.equals(rules.getInspectionType(), 0)) { + ticketTitle = StrUtil.join("-", rules.getMachineNo(), taskRecord.getDeviceNo(), + taskRecord.getOrderNo(), "出厂检验", rules.getInspectionVersion()); + } else { + ticketTitle = StrUtil.join("-", rules.getMachineNo(), + taskRecord.getOrderNo(), "库存检验", rules.getInspectionVersion()); + } + + // 5. 查询所有不合格项,汇总生成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.getRemark() != null ? result.getRemark() : ""); + index++; + } + incidentDescription = descBuilder.toString(); + } + + // 6. 统计不合格检测项数量 + long unqualifiedCount = pdiInspectionResultsService.lambdaQuery() + .eq(QmsPdiInspectionResults::getTaskId, request.getTaskRecordId()) + .eq(QmsPdiInspectionResults::getInspectionItemResults, false) + .count(); + + // 7. 生成工单编号 + String ticketNo = basdeSerialNumberControllerService.generateSerialNumber(38); + + // 8. 创建工单主表 + QmsIssueTicket entity = new QmsIssueTicket() + .setSourceType((short) 1) + .setSourceId(request.getTaskRecordId()) + .setTicketNo(ticketNo) + .setTicketTitle(ticketTitle) + .setProjectNo(taskRecord.getTaskNo()) + .setIncidentType(request.getIncidentType()) + .setIncidentDescription(incidentDescription) + .setUnqualifiedQty((int) unqualifiedCount) + .setApprovalStatus((short) 0) + .setStatus((short) 0) + .setCreateUserId(userId) + .setCreateUserName(userName) + .setCreateTime(now) + .setUpdateUserId(userId) + .setUpdateUserName(userName) + .setUpdateTime(now); + + issueTicketService.save(entity); + + // 9. 查询该任务的不合格检测项 + List unqualifiedItems = initiatePdiTicket(request.getTaskRecordId()); + + // 10. 构建返回结果 + QmsPdiCreateTicketResultVO result = new QmsPdiCreateTicketResultVO(); + result.setTicketId(entity.getId()); + result.setTicketNo(ticketNo); result.setUnqualifiedItems(unqualifiedItems != null ? unqualifiedItems : List.of()); return result; @@ -385,6 +445,22 @@ public class QmsIssueTicketControllerService { .setUpdateTime(now); issueTicketService.save(entity); + + // 按处理人分组,异步新增工单处理记录并推送待办 + 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 + ); + } } /**