From 6759fb6ab5046fe21b477636ac15d4a7b5f7165e Mon Sep 17 00:00:00 2001 From: funny <834502597@qq.com> Date: Tue, 12 May 2026 08:38:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD=E5=92=8C?= =?UTF-8?q?=E5=B7=A5=E5=8D=95=E8=BF=94=E5=9B=9E=E6=A8=A1=E6=9D=BF=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20=E6=96=B0=E5=A2=9E=E5=B7=A1=E6=A3=80=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E4=BF=AE=E6=94=B9=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QmsIssueTicketControllerService.java | 633 +++++++++++------- .../QmsPdiStatusItemControllerService.java | 21 +- .../pojo/vo/QmsPdiTicketMyDetailVO.java | 25 +- 3 files changed, 446 insertions(+), 233 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 b7392a80..a293c016 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 @@ -22,6 +22,7 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @@ -610,6 +611,61 @@ public class QmsIssueTicketControllerService { issueTicketService.save(entity); } + /** + * 修改巡检工单(发起前) + * 仅允许创建人修改,且工单状态必须为待流转(0) + */ + @Transactional(rollbackFor = Exception.class) + public void updateInspectionTicket(QmsIssueTicketUpdateQO request) { + Long currentUserId = UserUtil.getUserId(); + String currentUserName = UserUtil.getUserName(); + LocalDateTime now = LocalDateTime.now(); + + // 1. 查询工单 + QmsIssueTicket ticket = issueTicketService.getById(request.getId()); + VUtil.trueThrowBusinessError(ticket == null).throwMessage("工单不存在"); + + // 2. 权限校验:只有创建人才能修改 + VUtil.trueThrowBusinessError(!ticket.getCreateUserId().equals(currentUserId)) + .throwMessage("只有创建人才能修改工单"); + + // 3. 状态校验:只有待流转状态才能修改 + VUtil.trueThrowBusinessError(ticket.getStatus() != 0) + .throwMessage("只有待流转状态的工单才能修改"); + + // 4. 来源类型校验:只能修改巡检工单 + VUtil.trueThrowBusinessError(ticket.getSourceType() != 2) + .throwMessage("只能修改巡检工单"); + + // 5. 校验是否已设置负责人(已发起) + VUtil.trueThrowBusinessError(ticket.getApprovalUserId() != null) + .throwMessage("工单已发起,不允许修改"); + + // 6. 更新工单信息 + issueTicketService.lambdaUpdate() + .eq(QmsIssueTicket::getId, request.getId()) + .set(QmsIssueTicket::getTicketTitle, request.getTicketTitle()) + .set(QmsIssueTicket::getProjectNo, request.getProjectNo()) + .set(QmsIssueTicket::getIncidentType, request.getIncidentType()) + .set(QmsIssueTicket::getExceptionCode, request.getExceptionCode()) + .set(QmsIssueTicket::getUnqualifiedQty, request.getUnqualifiedQty()) + .set(QmsIssueTicket::getImpactQuantity, request.getImpactQuantity()) + .set(QmsIssueTicket::getIncidentLocation, request.getIncidentLocation()) + .set(QmsIssueTicket::getIncidentDescription, request.getIncidentDescription()) + .set(QmsIssueTicket::getIncidentReason, request.getIncidentReason()) + .set(QmsIssueTicket::getIncidentConsequence, request.getIncidentConsequence()) + .set(QmsIssueTicket::getImageIds, request.getImages() == null + ? "" + : StrUtil.join(",", request.getImages().stream() + .map(com.nflg.wms.common.pojo.vo.FileUploadVO::getId) + .toList())) + .set(QmsIssueTicket::getRemark, request.getRemark()) + .set(QmsIssueTicket::getUpdateUserId, currentUserId) + .set(QmsIssueTicket::getUpdateUserName, currentUserName) + .set(QmsIssueTicket::getUpdateTime, now) + .update(); + } + /** * 平板端查询巡检工单列表 * 仅查询当前登录人创建的巡检工单(sourceType=2) @@ -1008,224 +1064,228 @@ public class QmsIssueTicketControllerService { * 返回工单基本信息及处理记录、措施列表 */ public QmsPdiTicketDetailVO getPdiTicketDetail(Long id) { - // 查询工单基本信息 - QmsIssueTicket ticket = issueTicketService.getById(id); - QmsPdiTicketDetailVO vo = new QmsPdiTicketDetailVO(); - vo.setTicketNo(ticket.getTicketNo()); - vo.setTicketTitle(ticket.getTicketTitle()); - vo.setProjectNo(ticket.getProjectNo()); - vo.setIncidentType(ticket.getIncidentType()); - vo.setExceptionCode(ticket.getExceptionCode()); - vo.setUnqualifiedQty(ticket.getUnqualifiedQty()); - vo.setCreator(ticket.getCreateUserName()); - vo.setCreateTime(ticket.getCreateTime()); - vo.setStatus(ticket.getStatus()); - vo.setCompleteTime(ticket.getCompleteTime()); // 设置完成时间 - - // 查询工单类型:PDI-新机检测 或 PDI-库存检测 - if (ticket.getSourceId() != null) { - QmsPdiTaskRecord taskRecord = pdiTaskRecordService.getById(ticket.getSourceId()); - if (taskRecord != null && taskRecord.getDetectionRulesId() != null) { - QmsPdiDetectionRules detectionRules = pdiDetectionRulesService.getById(taskRecord.getDetectionRulesId()); - if (detectionRules != null && detectionRules.getInspectionType() != null) { - String inspectionTypeStr = detectionRules.getInspectionType() == 0 ? "新机检测" : "库存检测"; - vo.setTicketType("PDI-" + inspectionTypeStr); - } - } - } - - // 查询处理记录列表 - List processes = issueTicketProcessService.lambdaQuery() - .eq(QmsIssueTicketProcess::getIssueTicketId, id) - .list(); - - // 构建不合格检测项列表(每项关联处理信息) - List inspectionItems = new ArrayList<>(); - String rootCause = null; - List temporaryMeasures = new ArrayList<>(); - List permanentMeasures = new ArrayList<>(); - - for (QmsIssueTicketProcess process : processes) { - // 提取根本原因(取第一条) - if (rootCause == null && StrUtil.isNotBlank(process.getRootCause())) { - rootCause = process.getRootCause(); - } - - // 查询该处理记录关联的不合格检测项 - if (StrUtil.isNotBlank(process.getTaskResultIds())) { - String[] taskIds = process.getTaskResultIds().split(","); - for (String taskId : taskIds) { - if (StrUtil.isNotBlank(taskId)) { - List unqualifiedResults = pdiInspectionResultsService.lambdaQuery() - .eq(QmsPdiInspectionResults::getTaskId, Long.parseLong(taskId.trim())) - .eq(QmsPdiInspectionResults::getInspectionItemResults, false) - .list(); - - // 收集检测项ID(仅type=0/1/3) - Set statusItemIds = unqualifiedResults.stream() - .filter(r -> r.getInspectionItemType() != null && r.getInspectionItemType() != 2) - .map(QmsPdiInspectionResults::getInspectionItemId) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); - - // 查询检测项信息 - Map statusItemMap = new HashMap<>(); - if (!statusItemIds.isEmpty()) { - List statusItems = pdiStatusItemService.lambdaQuery() - .in(QmsPdiDetectionRulesStatusItem::getId, statusItemIds) - .list(); - statusItemMap = statusItems.stream() - .collect(Collectors.toMap(QmsPdiDetectionRulesStatusItem::getId, s -> s, (a, b) -> a)); - } - - // 收集示例图ID - Set exampleImageIds = statusItemMap.values().stream() - .map(QmsPdiDetectionRulesStatusItem::getInspectionImage) - .filter(StrUtil::isNotBlank) - .flatMap(imageStr -> Arrays.stream(imageStr.split(","))) - .filter(StrUtil::isNotBlank) - .map(Long::valueOf) - .collect(Collectors.toSet()); - - // 查询示例图 - Map exampleImageMap = new HashMap<>(); - if (!exampleImageIds.isEmpty()) { - List records = fileUploadRecordService.lambdaQuery() - .in(FileUploadRecord::getId, exampleImageIds) - .list(); - exampleImageMap = records.stream() - .collect(Collectors.toMap(FileUploadRecord::getId, r -> r, (a, b) -> a)); - } - - // 查询处理人部门信息 - Long handlerDeptId = null; - String handlerDeptName = null; - if (process.getHandlerUserId() != null) { - UserInterior userInterior = userInteriorService.lambdaQuery() - .eq(UserInterior::getUserId, process.getHandlerUserId()) - .one(); - if (userInterior != null && userInterior.getDeptId() != null) { - Department department = departmentService.getById(userInterior.getDeptId()); - if (department != null) { - handlerDeptId = department.getId(); - handlerDeptName = department.getName(); - } - } - } - - final Map finalStatusItemMap = statusItemMap; - final Map finalExampleImageMap = exampleImageMap; - final Long finalHandlerDeptId = handlerDeptId; - final String finalHandlerDeptName = handlerDeptName; - - for (QmsPdiInspectionResults result : unqualifiedResults) { - QmsPdiTicketDetailVO.InspectionItemVO itemVO = new QmsPdiTicketDetailVO.InspectionItemVO(); - itemVO.setId(result.getId()); - itemVO.setInspectionItemId(result.getInspectionItemId()); - itemVO.setInspectionItemType(result.getInspectionItemType()); - itemVO.setInspectionItemImage(parseImageList(result.getInspectionItemImage())); - itemVO.setInspectionItemResults(result.getInspectionItemResults()); - itemVO.setRemark(result.getRemark()); - itemVO.setInspectorId(result.getInspectorId()); - itemVO.setInspectionTime(result.getInspectionTime()); - itemVO.setInspectionBy(result.getInspectionBy()); - - // 填充检测项信息(仅type=0/1/3) - if (result.getInspectionItemType() != null && result.getInspectionItemType() != 2) { - QmsPdiDetectionRulesStatusItem statusItem = finalStatusItemMap.get(result.getInspectionItemId()); - if (statusItem != null) { - itemVO.setComponentsDes(statusItem.getComponentsDes()); - itemVO.setInspectionContent(statusItem.getInspectionContent()); - // 解析示例图URL - if (StrUtil.isNotBlank(statusItem.getInspectionImage())) { - String exampleUrl = Arrays.stream(statusItem.getInspectionImage().split(",")) - .filter(StrUtil::isNotBlank) - .map(String::trim) - .map(Long::valueOf) - .map(finalExampleImageMap::get) - .filter(Objects::nonNull) - .map(FileUploadRecord::getUrl) - .findFirst() - .orElse(null); - itemVO.setInspectionExampleImage(exampleUrl); - } - } - } - - // 填充处理信息 - itemVO.setHandlerUserId(process.getHandlerUserId()); - itemVO.setHandlerUserName(process.getHandlerUserName()); - itemVO.setHandlerDeptId(finalHandlerDeptId); - itemVO.setHandlerDeptName(finalHandlerDeptName); - itemVO.setProcessTime(process.getApprovalTime()); - itemVO.setProcessStatus(process.getApprovalStatus()); - itemVO.setApprovalUserId(process.getApprovalUserId()); - itemVO.setApprovalUserName(process.getApprovalUserName()); - itemVO.setApprovalTime(process.getApprovalTime()); - itemVO.setApprovalStatus(process.getApprovalStatus()); - - inspectionItems.add(itemVO); - } - } - } - } - - // 查询措施列表,按措施类型区分临时/永久 - List measures = issueTicketProcessMeasureService.lambdaQuery() - .eq(QmsIssueTicketProcessMeasure::getIssueTicketProcessId, process.getId()) - .list(); - - // 查询字典项ID - Long temporaryTypeId = dictionaryItemService.getIdByCode("MeasureType", "TemporaryCorrectiveMeasures"); - Long permanentTypeId = dictionaryItemService.getIdByCode("MeasureType", "PermanentCorrectiveMeasures"); - - for (QmsIssueTicketProcessMeasure measure : measures) { - QmsPdiTicketDetailVO.MeasureVO measureVO = new QmsPdiTicketDetailVO.MeasureVO(); - measureVO.setId(measure.getId()); - measureVO.setMeasureTypeId(measure.getMeasureTypeId()); - measureVO.setMeasureContent(measure.getMeasureContent()); - measureVO.setChargeUser(measure.getChargeUser()); - measureVO.setPlanDate(measure.getPlanDate()); - measureVO.setConfirmDate(measure.getConfirmDate()); - measureVO.setRemark(measure.getRemark()); - - // 根据measureTypeId区分临时措施和永久措施 - if (measure.getMeasureTypeId() != null) { - if (measure.getMeasureTypeId().equals(temporaryTypeId)) { - temporaryMeasures.add(measureVO); - } else if (measure.getMeasureTypeId().equals(permanentTypeId)) { - permanentMeasures.add(measureVO); - } - } - } - } - - // 构建处理人信息(按部门分组) - Map> handlers = new HashMap<>(); - for (QmsIssueTicketProcess process : processes) { - if (process.getHandlerUserId() != null) { - UserInterior userInterior = userInteriorService.lambdaQuery() - .eq(UserInterior::getUserId, process.getHandlerUserId()) - .one(); - if (userInterior != null && userInterior.getDeptId() != null) { - Department department = departmentService.getById(userInterior.getDeptId()); - if (department != null) { - String deptName = department.getName(); - handlers.computeIfAbsent(deptName, k -> new ArrayList<>()) - .add(process.getHandlerUserName()); - } - } - } - } - - vo.setInspectionItems(inspectionItems); - vo.setHandlers(handlers); - vo.setRootCause(rootCause); - vo.setTemporaryMeasures(temporaryMeasures); - vo.setPermanentMeasures(permanentMeasures); - vo.setSignatures(new HashMap<>()); - - return vo; +// // 查询工单基本信息 +// QmsIssueTicket ticket = issueTicketService.getById(id); +// QmsPdiTicketDetailVO vo = new QmsPdiTicketDetailVO(); +// vo.setTicketNo(ticket.getTicketNo()); +// vo.setTicketTitle(ticket.getTicketTitle()); +// vo.setProjectNo(ticket.getProjectNo()); +// vo.setIncidentType(ticket.getIncidentType()); +// vo.setExceptionCode(ticket.getExceptionCode()); +// vo.setUnqualifiedQty(ticket.getUnqualifiedQty()); +// vo.setCreator(ticket.getCreateUserName()); +// vo.setCreateTime(ticket.getCreateTime()); +// vo.setStatus(ticket.getStatus()); +// vo.setCompleteTime(ticket.getCompleteTime()); // 设置完成时间 +// +// // 查询工单类型:PDI-新机检测 或 PDI-库存检测 +// if (ticket.getSourceId() != null) { +// QmsPdiTaskRecord taskRecord = pdiTaskRecordService.getById(ticket.getSourceId()); +// if (taskRecord != null && taskRecord.getDetectionRulesId() != null) { +// QmsPdiDetectionRules detectionRules = pdiDetectionRulesService.getById(taskRecord.getDetectionRulesId()); +// if (detectionRules != null && detectionRules.getInspectionType() != null) { +// String inspectionTypeStr = detectionRules.getInspectionType() == 0 ? "新机检测" : "库存检测"; +// vo.setTicketType("PDI-" + inspectionTypeStr); +// } +// } +// } +// +// // 查询处理记录列表 +// List processes = issueTicketProcessService.lambdaQuery() +// .eq(QmsIssueTicketProcess::getIssueTicketId, id) +// .list(); +// +// // 构建不合格检测项列表(每项关联处理信息) +// List inspectionItems = new ArrayList<>(); +// String rootCause = null; +// List temporaryMeasures = new ArrayList<>(); +// List permanentMeasures = new ArrayList<>(); +// +// for (QmsIssueTicketProcess process : processes) { +// // 提取根本原因(取第一条) +// if (rootCause == null && StrUtil.isNotBlank(process.getRootCause())) { +// rootCause = process.getRootCause(); +// } +// +// // 查询该处理记录关联的不合格检测项 +// if (StrUtil.isNotBlank(process.getTaskResultIds())) { +// String[] taskIds = process.getTaskResultIds().split(","); +// for (String taskId : taskIds) { +// if (StrUtil.isNotBlank(taskId)) { +// List unqualifiedResults = pdiInspectionResultsService.lambdaQuery() +// .eq(QmsPdiInspectionResults::getTaskId, Long.parseLong(taskId.trim())) +// .eq(QmsPdiInspectionResults::getInspectionItemResults, false) +// .list(); +// +// // 收集检测项ID(仅type=0/1/3) +// Set statusItemIds = unqualifiedResults.stream() +// .filter(r -> r.getInspectionItemType() != null && r.getInspectionItemType() != 2) +// .map(QmsPdiInspectionResults::getInspectionItemId) +// .filter(Objects::nonNull) +// .collect(Collectors.toSet()); +// +// // 查询检测项信息 +// Map statusItemMap = new HashMap<>(); +// if (!statusItemIds.isEmpty()) { +// List statusItems = pdiStatusItemService.lambdaQuery() +// .in(QmsPdiDetectionRulesStatusItem::getId, statusItemIds) +// .list(); +// statusItemMap = statusItems.stream() +// .collect(Collectors.toMap(QmsPdiDetectionRulesStatusItem::getId, s -> s, (a, b) -> a)); +// } +// +// // 收集示例图ID +// Set exampleImageIds = statusItemMap.values().stream() +// .map(QmsPdiDetectionRulesStatusItem::getInspectionImage) +// .filter(StrUtil::isNotBlank) +// .flatMap(imageStr -> Arrays.stream(imageStr.split(","))) +// .filter(StrUtil::isNotBlank) +// .map(Long::valueOf) +// .collect(Collectors.toSet()); +// +// // 查询示例图 +// Map exampleImageMap = new HashMap<>(); +// if (!exampleImageIds.isEmpty()) { +// List records = fileUploadRecordService.lambdaQuery() +// .in(FileUploadRecord::getId, exampleImageIds) +// .list(); +// exampleImageMap = records.stream() +// .collect(Collectors.toMap(FileUploadRecord::getId, r -> r, (a, b) -> a)); +// } +// +// // 查询处理人部门信息 +// Long handlerDeptId = null; +// String handlerDeptName = null; +// if (process.getHandlerUserId() != null) { +// UserInterior userInterior = userInteriorService.lambdaQuery() +// .eq(UserInterior::getUserId, process.getHandlerUserId()) +// .one(); +// if (userInterior != null && userInterior.getDeptId() != null) { +// Department department = departmentService.getById(userInterior.getDeptId()); +// if (department != null) { +// handlerDeptId = department.getId(); +// handlerDeptName = department.getName(); +// } +// } +// } +// +// final Map finalStatusItemMap = statusItemMap; +// final Map finalExampleImageMap = exampleImageMap; +// final Long finalHandlerDeptId = handlerDeptId; +// final String finalHandlerDeptName = handlerDeptName; +// +// for (QmsPdiInspectionResults result : unqualifiedResults) { +// QmsPdiTicketDetailVO.InspectionItemVO itemVO = new QmsPdiTicketDetailVO.InspectionItemVO(); +// itemVO.setId(result.getId()); +// itemVO.setInspectionItemId(result.getInspectionItemId()); +// itemVO.setInspectionItemType(result.getInspectionItemType()); +// itemVO.setInspectionItemImage(parseImageList(result.getInspectionItemImage())); +// itemVO.setInspectionItemResults(result.getInspectionItemResults()); +// itemVO.setRemark(result.getRemark()); +// itemVO.setInspectorId(result.getInspectorId()); +// itemVO.setInspectionTime(result.getInspectionTime()); +// itemVO.setInspectionBy(result.getInspectionBy()); +// +// // 填充检测项信息(仅type=0/1/3) +// if (result.getInspectionItemType() != null && result.getInspectionItemType() != 2) { +// QmsPdiDetectionRulesStatusItem statusItem = finalStatusItemMap.get(result.getInspectionItemId()); +// if (statusItem != null) { +// itemVO.setComponentsDes(statusItem.getComponentsDes()); +// itemVO.setInspectionContent(statusItem.getInspectionContent()); +// // 解析示例图URL +// if (StrUtil.isNotBlank(statusItem.getInspectionImage())) { +// String exampleUrl = Arrays.stream(statusItem.getInspectionImage().split(",")) +// .filter(StrUtil::isNotBlank) +// .map(String::trim) +// .map(Long::valueOf) +// .map(finalExampleImageMap::get) +// .filter(Objects::nonNull) +// .map(FileUploadRecord::getUrl) +// .findFirst() +// .orElse(null); +// itemVO.setInspectionExampleImage(exampleUrl); +// } +// } +// } +// +// // 填充处理信息 +// itemVO.setHandlerUserId(process.getHandlerUserId()); +// itemVO.setHandlerUserName(process.getHandlerUserName()); +// itemVO.setHandlerDeptId(finalHandlerDeptId); +// itemVO.setHandlerDeptName(finalHandlerDeptName); +// itemVO.setProcessTime(process.getApprovalTime()); +// itemVO.setProcessStatus(process.getApprovalStatus()); +// itemVO.setApprovalUserId(process.getApprovalUserId()); +// itemVO.setApprovalUserName(process.getApprovalUserName()); +// itemVO.setApprovalTime(process.getApprovalTime()); +// itemVO.setApprovalStatus(process.getApprovalStatus()); +// +// inspectionItems.add(itemVO); +// } +// } +// } +// } +// +// // 查询措施列表,按措施类型区分临时/永久 +// List measures = issueTicketProcessMeasureService.lambdaQuery() +// .eq(QmsIssueTicketProcessMeasure::getIssueTicketProcessId, process.getId()) +// .list(); +// +// // 查询字典项ID +// Long temporaryTypeId = dictionaryItemService.getIdByCode("MeasureType", "TemporaryCorrectiveMeasures"); +// Long permanentTypeId = dictionaryItemService.getIdByCode("MeasureType", "PermanentCorrectiveMeasures"); +// +// for (QmsIssueTicketProcessMeasure measure : measures) { +// QmsPdiTicketDetailVO.MeasureVO measureVO = new QmsPdiTicketDetailVO.MeasureVO(); +// measureVO.setId(measure.getId()); +// measureVO.setMeasureTypeId(measure.getMeasureTypeId()); +// measureVO.setMeasureContent(measure.getMeasureContent()); +// measureVO.setChargeUser(measure.getChargeUser()); +// measureVO.setPlanDate(measure.getPlanDate()); +// measureVO.setConfirmDate(measure.getConfirmDate()); +// measureVO.setRemark(measure.getRemark()); +// +// // 根据measureTypeId区分临时措施和永久措施 +// if (measure.getMeasureTypeId() != null) { +// if (measure.getMeasureTypeId().equals(temporaryTypeId)) { +// temporaryMeasures.add(measureVO); +// } else if (measure.getMeasureTypeId().equals(permanentTypeId)) { +// permanentMeasures.add(measureVO); +// } +// } +// } +// } +// +// // 构建处理人信息(按部门分组) +// Map> handlers = new HashMap<>(); +// for (QmsIssueTicketProcess process : processes) { +// if (process.getHandlerUserId() != null) { +// UserInterior userInterior = userInteriorService.lambdaQuery() +// .eq(UserInterior::getUserId, process.getHandlerUserId()) +// .one(); +// if (userInterior != null && userInterior.getDeptId() != null) { +// Department department = departmentService.getById(userInterior.getDeptId()); +// if (department != null) { +// String deptName = department.getName(); +// handlers.computeIfAbsent(deptName, k -> new ArrayList<>()) +// .add(process.getHandlerUserName()); +// } +// } +// } +// } +// +// vo.setInspectionItems(inspectionItems); +// vo.setHandlers(handlers); +// vo.setRootCause(rootCause); +// vo.setTemporaryMeasures(temporaryMeasures); +// vo.setPermanentMeasures(permanentMeasures); +// +// // 构建相关人员签字(按部门,只返回已审批的) +// Map signatures = buildSignatures(processes); +// vo.setSignatures(signatures); +// +// return vo; + return null; } /** @@ -1265,29 +1325,60 @@ public class QmsIssueTicketControllerService { .list(); } - // 构建返回VO + // 构建返回VO - 工单基本信息 QmsPdiTicketMyDetailVO vo = new QmsPdiTicketMyDetailVO(); + vo.setId(ticket.getId()); + vo.setSourceType(ticket.getSourceType()); + vo.setSourceId(ticket.getSourceId()); vo.setTicketNo(ticket.getTicketNo()); + vo.setTicketTitle(ticket.getTicketTitle()); vo.setProjectNo(ticket.getTicketNo()); // 工程编号使用工单编号 vo.setIncidentType(ticket.getIncidentType()); vo.setExceptionCode(ticket.getExceptionCode()); vo.setUnqualifiedQty(ticket.getUnqualifiedQty()); - vo.setRemark(ticket.getRemark()); - vo.setCreator(ticket.getCreateUserName()); - vo.setCreateTime(ticket.getCreateTime()); - vo.setStatus(ticket.getStatus()); - vo.setCompleteTime(ticket.getCompleteTime()); // 设置完成时间 + vo.setIncidentLocation(ticket.getIncidentLocation()); + vo.setIncidentDescription(ticket.getIncidentDescription()); + vo.setIncidentReason(ticket.getIncidentReason()); + vo.setIncidentConsequence(ticket.getIncidentConsequence()); vo.setImages(parseImageList(ticket.getImageIds())); + vo.setRemark(ticket.getRemark()); + vo.setStatus(ticket.getStatus()); + vo.setCompleteTime(ticket.getCompleteTime()); + vo.setApprovalStatus(ticket.getApprovalStatus()); + vo.setApprovalOpinion(ticket.getApprovalOpinion()); + vo.setApprovalUserId(ticket.getApprovalUserId()); + vo.setApprovalUserName(ticket.getApprovalUserName()); + vo.setApprovalTime(ticket.getApprovalTime()); + vo.setCreateUserId(ticket.getCreateUserId()); + vo.setCreateUserName(ticket.getCreateUserName()); + vo.setCreateTime(ticket.getCreateTime()); + vo.setCreator(ticket.getCreateUserName()); + + // 工单类型:根据sourceType转换 + if (ticket.getSourceType() != null) { + switch (ticket.getSourceType()) { + case 0: + vo.setTicketType("IQC检测任务"); + break; + case 1: + vo.setTicketType("PDI检测任务"); + break; + case 2: + vo.setTicketType("巡检"); + break; + default: + vo.setTicketType("未知"); + } + } - // 生成主题:机型编号+订单编号+出厂检测/库存检测+检测版本号 - if (ticket.getSourceId() != null) { + // 生成主题:机型编号+订单编号+新机检测/库存检测+检测版本号(仅PDI工单) + if (ticket.getSourceType() != null && ticket.getSourceType() == 1 && ticket.getSourceId() != null) { QmsPdiTaskRecord taskRecord = pdiTaskRecordService.getById(ticket.getSourceId()); if (taskRecord != null && taskRecord.getDetectionRulesId() != null) { QmsPdiDetectionRules detectionRules = pdiDetectionRulesService.getById(taskRecord.getDetectionRulesId()); if (detectionRules != null) { String inspectionTypeStr = detectionRules.getInspectionType() != null && detectionRules.getInspectionType() == 0 ? "新机检测" : "库存检测"; vo.setTicketTitle(detectionRules.getMachineNo() + "-" + detectionRules.getOrderNo() + "-" + inspectionTypeStr + "-" + detectionRules.getInspectionVersion()); - vo.setTicketType("PDI-" + inspectionTypeStr); } } } @@ -1465,11 +1556,97 @@ public class QmsIssueTicketControllerService { vo.setRootCause(rootCause); vo.setTemporaryMeasures(temporaryMeasures); vo.setPermanentMeasures(permanentMeasures); - vo.setSignatures(new HashMap<>()); + + // 构建相关人员签字(按部门,只返回已审批的) + Map signatures = buildSignatures(processes); + vo.setSignatures(signatures); return vo; } + /** + * 构建相关人员签字(按部门,只返回已审批的) + * @param processes 处理记录列表 + * @return 部门签字信息Map + */ + private Map buildSignatures(List processes) { + Map signatures = new HashMap<>(); + + for (QmsIssueTicketProcess process : processes) { + // 只返回已审批的记录(approvalStatus 不为 null) + if (process.getApprovalStatus() == null) { + continue; + } + + // 查询处理人的部门信息 + if (process.getHandlerUserId() != null) { + UserInterior userInterior = userInteriorService.lambdaQuery() + .eq(UserInterior::getUserId, process.getHandlerUserId()) + .one(); + + if (userInterior != null && userInterior.getDeptId() != null) { + Department department = departmentService.getById(userInterior.getDeptId()); + if (department != null) { + String deptName = department.getName(); + + // 查询部门领导 + Department leaderDept = departmentService.getById(userInterior.getDeptId()); + String leaderName = null; + if (leaderDept != null && leaderDept.getHeadUserId() != null) { + User leaderUser = userService.getById(leaderDept.getHeadUserId()); + if (leaderUser != null) { + leaderName = leaderUser.getUserName(); + } + } + + // 如果领导未审批,跳过 + if (StrUtil.isBlank(leaderName)) { + continue; + } + + // 构建签名:姓名(状态) + String statusText = convertApprovalStatus(process.getApprovalStatus()); + String signature = leaderName + "(" + statusText + ")"; + + // 构建签字信息 + QmsPdiTicketMyDetailVO.SignatureInfo signatureInfo = new QmsPdiTicketMyDetailVO.SignatureInfo(); + signatureInfo.setDeptName(deptName); + signatureInfo.setApprovalOpinion(process.getApprovalOpinion()); + signatureInfo.setApprovalTime(process.getApprovalTime() != null + ? process.getApprovalTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + : null); + signatureInfo.setSignature(signature); + + signatures.put(deptName, signatureInfo); + } + } + } + } + + return signatures; + } + + /** + * 转换审批状态为文本 + * @param status 审批状态:0=通过,1=驳回,2=重检,3=报废,4=维修,5=挑选使用,6=让渡使用 + * @return 状态文本 + */ + private String convertApprovalStatus(Short status) { + if (status == null) { + return "未审批"; + } + switch (status) { + case 0: return "通过"; + case 1: return "驳回"; + case 2: return "重检"; + case 3: return "报废"; + case 4: return "维修"; + case 5: return "挑选使用"; + case 6: return "让渡使用"; + default: return "未知"; + } + } + /** * 查询巡检工单详情 * 返回工单基本信息、图片列表、处理人信息、纠正措施等 diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java index bfdd00b0..8e265cbc 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java @@ -199,23 +199,36 @@ public class QmsPdiStatusItemControllerService { // 读取 Excel 里的所有图片 List pictures = new ExcelReader(new java.io.ByteArrayInputStream(fileBytes)).listPictures(); - // 遍历 DTO,遇到 DISPIMG 就上传图片并替换地址 + // 遍历 DTO,遇到 DISPIMG 就上传图片并替换为文件ID for (int i = 0; i < data.size(); i++) { QmsPdiStatusItemImportDTO dto = data.get(i); String inspectionImage = dto.getInspectionImage(); - // 如果是图片公式,就取图片上传,把地址填回去 + // 如果是图片公式,就取图片上传,把文件ID填回去 if (StrUtil.isNotBlank(inspectionImage) && inspectionImage.startsWith("=DISPIMG(")) { if (i < pictures.size()) { Drawings.Picture pic = pictures.get(i); try (FileInputStream fis = new FileInputStream(pic.getLocalPath().toFile())) { - // 上传图片 → 获取地址 + // 1. 上传图片 → 获取URL String imageUrl = fileUploadService.upload( "image/" + DateTimeUtil.format(LocalDate.now(), "yyyyMMdd") + "/" + IdUtil.fastUUID() + ".png", fis, "image/png" ); - dto.setInspectionImage(imageUrl); + + // 2. 保存文件上传记录 + FileUploadRecord record = new FileUploadRecord(); + record.setId(IdUtil.getSnowflakeNextId()); + record.setFileName(pic.getLocalPath().getFileName().toString()); + record.setFileType("image/png"); + record.setUrl(imageUrl); + record.setFrom("PDI检测项导入"); + record.setCreateBy(UserUtil.getUserName()); + record.setCreateTime(LocalDateTime.now()); + fileUploadRecordService.save(record); + + // 3. 将文件ID填回到DTO + dto.setInspectionImage(String.valueOf(record.getId())); } } else { dto.setInspectionImage(null); 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 0cc1045e..81322e39 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 @@ -172,7 +172,7 @@ public class QmsPdiTicketMyDetailVO { /** * 相关人员签字(按部门) */ - private Map signatures; + private Map signatures; // ===== 旧的处理记录列表(保留兼容) ===== @@ -416,4 +416,27 @@ public class QmsPdiTicketMyDetailVO { */ private Long approvalUserId; } + + @Data + public static class SignatureInfo { + /** + * 部门名称 + */ + private String deptName; + + /** + * 审批意见 + */ + private String approvalOpinion; + + /** + * 审批时间 + */ + private String approvalTime; + + /** + * 签名(格式:姓名(状态)) + */ + private String signature; + } }