From d81aaea6e62e74e4d3c09474905208b148dc1da5 Mon Sep 17 00:00:00 2001 From: funny <834502597@qq.com> Date: Fri, 8 May 2026 10:35:40 +0800 Subject: [PATCH] =?UTF-8?q?feat(qms-pdi):=20=E6=94=AF=E6=8C=81PDI=E5=8F=91?= =?UTF-8?q?=E8=B5=B7=E5=B7=A5=E5=8D=95=E6=97=B6=E6=9F=A5=E8=AF=A2=E4=B8=8D?= =?UTF-8?q?=E5=90=88=E6=A0=BC=E6=A3=80=E6=B5=8B=E9=A1=B9=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=9B=BE=E7=89=87=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增QmsPdiInitiateTicketQO请求参数类,支持传入任务记录ID查询 - 在QmsIssueTicketController新增接口initiatePdiTicket,返回不合格检测项列表 - 实现QmsIssueTicketControllerService.initiatePdiTicket方法 查询不合格检测项及对应图片详情 - 修改QmsPdiInspectionResultsControllerService.submit方法,返回类型调整为VO,图片字段转换为列表格式 - 在QmsPdiInspectionResultsControllerService新增buildInspectionResultVOList方法,将图片ID字符串转换为图片详情列表 - 优化QmsPdiTicketDetailVO和QmsPdiTicketMyDetailVO中图片字段类型,改用FileDetailVO列表替代原有字符串 - 统一解析和返回图片文件详情,提升前端处理效率和数据可读性 --- .../controller/QmsIssueTicketController.java | 10 ++ .../QmsPdiInspectionResultsController.java | 5 +- .../QmsIssueTicketControllerService.java | 128 +++++++++++++++++- ...PdiInspectionResultsControllerService.java | 85 +++++++++++- .../pojo/qo/QmsPdiInitiateTicketQO.java | 17 +++ .../pojo/vo/QmsPdiInspectionResultVO.java | 68 ++++++++++ .../common/pojo/vo/QmsPdiTicketDetailVO.java | 4 +- .../pojo/vo/QmsPdiTicketMyDetailVO.java | 4 +- 8 files changed, 311 insertions(+), 10 deletions(-) create mode 100644 nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiInitiateTicketQO.java create mode 100644 nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiInspectionResultVO.java 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 7f01aa10..309e363a 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 @@ -7,8 +7,10 @@ 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.repository.service.IQmsIssueTicketService; @@ -56,6 +58,14 @@ public class QmsIssueTicketController extends BaseController { return ApiResult.success(); } + /** + * PDI发起工单:查询任务的不合格检测项 + */ + @PostMapping("initiatePdiTicket") + public ApiResult> initiatePdiTicket(@Valid @RequestBody QmsPdiInitiateTicketQO request) { + return ApiResult.success(issueTicketControllerService.initiatePdiTicket(request.getTaskRecordId())); + } + /** * 审核质量问题工单 * 更新审批状态、审批意见、审批人信息,并根据审批结果更新工单状态 diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiInspectionResultsController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiInspectionResultsController.java index 8a03c38b..70bc7d74 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiInspectionResultsController.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiInspectionResultsController.java @@ -8,11 +8,12 @@ import com.nflg.wms.common.pojo.qo.QmsPdiInspectionResultsSubmitQO; import com.nflg.wms.common.pojo.qo.QmsPdiStatusItemsFillQO; import com.nflg.wms.common.pojo.qo.QmsPdiTaskListQO; import com.nflg.wms.common.pojo.qo.QmsPdiTaskRecordStatusItemDetailQO; -import com.nflg.wms.repository.entity.QmsPdiInspectionResults; +import com.nflg.wms.common.pojo.vo.QmsPdiInspectionResultVO; import com.nflg.wms.common.pojo.vo.QmsPdiInspectionResultsPageVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskListVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDetailVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordSummaryVO; +import com.nflg.wms.repository.entity.QmsPdiInspectionResults; import com.nflg.wms.starter.BaseController; import jakarta.annotation.Resource; import jakarta.validation.Valid; @@ -52,7 +53,7 @@ public class QmsPdiInspectionResultsController extends BaseController { * 5. 若有不合格项则以 list 返回,无则返回 null */ @PostMapping("submit") - public ApiResult> submit( + public ApiResult> submit( @Valid @RequestBody QmsPdiInspectionResultsSubmitQO request) { return ApiResult.success(inspectionResultsControllerService.submit(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 817fbfd5..6c1cc352 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 @@ -81,6 +81,83 @@ public class QmsIssueTicketControllerService { @Resource private IDepartmentService departmentService; + /** + * PDI发起工单:查询任务的不合格检测项 + */ + public List initiatePdiTicket(Long taskRecordId) { + // 查询不合格检测项 + List failedItems = pdiInspectionResultsService.lambdaQuery() + .eq(QmsPdiInspectionResults::getTaskId, taskRecordId) + .eq(QmsPdiInspectionResults::getInspectionItemResults, false) + .list(); + + if (failedItems.isEmpty()) { + return null; + } + + // 收集所有图片ID + Set imageIds = failedItems.stream() + .map(QmsPdiInspectionResults::getInspectionItemImage) + .filter(StrUtil::isNotBlank) + .flatMap(imageStr -> Arrays.stream(imageStr.split(","))) + .filter(StrUtil::isNotBlank) + .map(Long::valueOf) + .collect(Collectors.toSet()); + + // 查询图片文件信息 + Map imageMap = new HashMap<>(); + if (!imageIds.isEmpty()) { + List records = fileUploadRecordService.lambdaQuery() + .in(FileUploadRecord::getId, imageIds) + .list(); + imageMap = records.stream() + .collect(Collectors.toMap(FileUploadRecord::getId, r -> r, (a, b) -> a)); + } + + // 构建返回值 + final Map finalImageMap = imageMap; + return failedItems.stream().map(item -> { + QmsPdiInspectionResultVO vo = new QmsPdiInspectionResultVO(); + vo.setId(item.getId()); + vo.setDetectionRulesId(item.getDetectionRulesId()); + vo.setTaskId(item.getTaskId()); + vo.setInspectionItemId(item.getInspectionItemId()); + vo.setInspectionItemType(item.getInspectionItemType()); + vo.setInspectionItemResults(item.getInspectionItemResults()); + vo.setRemark(item.getRemark()); + vo.setInspectorId(item.getInspectorId()); + vo.setInspectionTime(item.getInspectionTime()); + vo.setInspectionBy(item.getInspectionBy()); + + // 解析图片为 FileDetailVO 列表 + if (StrUtil.isNotBlank(item.getInspectionItemImage())) { + List imageList = Arrays.stream(item.getInspectionItemImage().split(",")) + .filter(StrUtil::isNotBlank) + .map(String::trim) + .map(Long::valueOf) + .map(id -> { + FileUploadRecord record = finalImageMap.get(id); + if (record != null) { + QmsPdiTaskRecordDetailVO.FileDetailVO fileVO = new QmsPdiTaskRecordDetailVO.FileDetailVO(); + fileVO.setId(record.getId()); + fileVO.setFileName(record.getFileName()); + fileVO.setFileType(record.getFileType()); + fileVO.setUrl(record.getUrl()); + return fileVO; + } + return null; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + vo.setInspectionItemImage(imageList); + } else { + vo.setInspectionItemImage(List.of()); + } + + return vo; + }).collect(Collectors.toList()); + } + /** * 审核质量问题工单 * 更新审批状态、审批意见、审批人信息、事故类型,并更新工单状态 @@ -469,7 +546,7 @@ public class QmsIssueTicketControllerService { itemVO.setId(result.getId()); itemVO.setInspectionItemId(result.getInspectionItemId()); itemVO.setInspectionItemType(result.getInspectionItemType()); - itemVO.setInspectionItemImage(result.getInspectionItemImage()); + itemVO.setInspectionItemImage(parseImageList(result.getInspectionItemImage())); itemVO.setRemark(result.getRemark()); itemVO.setInspectorId(result.getInspectorId()); itemVO.setInspectionTime(result.getInspectionTime()); @@ -542,6 +619,9 @@ public class QmsIssueTicketControllerService { QmsPdiTicketMyDetailVO vo = new QmsPdiTicketMyDetailVO(); BeanUtil.copyProperties(ticket, vo); + // 将 imageIds 转换为图片详情列表 + vo.setImages(parseImageList(ticket.getImageIds())); + // 构建处理记录列表 List processVOList = processes.stream().map(process -> { QmsPdiTicketMyDetailVO.ProcessVO processVO = new QmsPdiTicketMyDetailVO.ProcessVO(); @@ -565,4 +645,50 @@ public class QmsIssueTicketControllerService { vo.setProcesses(processVOList); return vo; } + + /** + * 将逗号分隔的图片ID字符串转换为 FileDetailVO 列表 + */ + private List parseImageList(String imageIdsStr) { + if (StrUtil.isBlank(imageIdsStr)) { + return List.of(); + } + + // 收集所有图片ID + Set imageIds = Arrays.stream(imageIdsStr.split(",")) + .filter(StrUtil::isNotBlank) + .map(String::trim) + .map(Long::valueOf) + .collect(Collectors.toSet()); + + if (imageIds.isEmpty()) { + return List.of(); + } + + // 查询图片文件信息 + List records = fileUploadRecordService.lambdaQuery() + .in(FileUploadRecord::getId, imageIds) + .list(); + + // 构建 Map 保持顺序 + Map imageMap = records.stream() + .collect(Collectors.toMap(FileUploadRecord::getId, r -> r, (a, b) -> a)); + + // 按原始顺序返回 + return Arrays.stream(imageIdsStr.split(",")) + .filter(StrUtil::isNotBlank) + .map(String::trim) + .map(Long::valueOf) + .map(imageMap::get) + .filter(Objects::nonNull) + .map(record -> { + QmsPdiTaskRecordDetailVO.FileDetailVO fileVO = new QmsPdiTaskRecordDetailVO.FileDetailVO(); + fileVO.setId(record.getId()); + fileVO.setFileName(record.getFileName()); + fileVO.setFileType(record.getFileType()); + fileVO.setUrl(record.getUrl()); + return fileVO; + }) + .collect(Collectors.toList()); + } } diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiInspectionResultsControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiInspectionResultsControllerService.java index 7fbd6448..7b633dcf 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiInspectionResultsControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiInspectionResultsControllerService.java @@ -10,15 +10,18 @@ import com.nflg.wms.common.pojo.qo.QmsPdiInspectionResultsSubmitQO; import com.nflg.wms.common.pojo.qo.QmsPdiStatusItemsFillQO; import com.nflg.wms.common.pojo.qo.QmsPdiTaskListQO; import com.nflg.wms.common.pojo.qo.QmsPdiTaskRecordStatusItemDetailQO; +import com.nflg.wms.common.pojo.vo.QmsPdiInspectionResultVO; import com.nflg.wms.common.pojo.vo.QmsPdiInspectionResultsPageVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskListVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDetailVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordSummaryVO; import com.nflg.wms.common.util.UserUtil; +import com.nflg.wms.repository.entity.FileUploadRecord; import com.nflg.wms.repository.entity.QmsPdiDetectionRules; import com.nflg.wms.repository.entity.QmsPdiDetectionRulesDeliveryItem; import com.nflg.wms.repository.entity.QmsPdiInspectionResults; import com.nflg.wms.repository.entity.QmsPdiTaskRecord; +import com.nflg.wms.repository.service.IFileUploadRecordService; import com.nflg.wms.repository.service.IQmsPdiDetectionRulesDeliveryItemService; import com.nflg.wms.repository.service.IQmsPdiDetectionRulesService; import com.nflg.wms.repository.service.IQmsPdiInspectionResultsService; @@ -30,6 +33,8 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -57,6 +62,9 @@ public class QmsPdiInspectionResultsControllerService { @Resource private QmsPdiTaskRecordControllerService taskRecordControllerService; + @Resource + private IFileUploadRecordService fileUploadRecordService; + // ========================= 动静态检查项填写 ========================= /** @@ -150,7 +158,7 @@ public class QmsPdiInspectionResultsControllerService { * 7. 若有不合格项则以 list 返回(仅 type=0/1/3),无则返回 null */ @Transactional - public List submit(QmsPdiInspectionResultsSubmitQO request) { + public List submit(QmsPdiInspectionResultsSubmitQO request) { String operator = UserUtil.getUserName(); Long operatorId = UserUtil.getUserId(); LocalDateTime now = LocalDateTime.now(); @@ -225,8 +233,79 @@ public class QmsPdiInspectionResultsControllerService { .set(QmsPdiTaskRecord::getInspectionEnable, hasDefect ? 3 : 2) .update(); - // 7. 返回不合格项 - return failedItems.isEmpty() ? null : failedItems; + // 7. 返回不合格项(转换为VO,图片改为List格式) + return buildInspectionResultVOList(failedItems); + } + + /** + * 将 QmsPdiInspectionResults 列表转换为 QmsPdiInspectionResultVO 列表(图片转为List格式) + */ + private List buildInspectionResultVOList(List items) { + if (items == null || items.isEmpty()) { + return null; + } + + // 收集所有图片ID + Set imageIds = items.stream() + .map(QmsPdiInspectionResults::getInspectionItemImage) + .filter(cn.hutool.core.util.StrUtil::isNotBlank) + .flatMap(imageStr -> Arrays.stream(imageStr.split(","))) + .filter(cn.hutool.core.util.StrUtil::isNotBlank) + .map(Long::valueOf) + .collect(Collectors.toSet()); + + // 查询图片文件信息 + Map imageMap = new HashMap<>(); + if (!imageIds.isEmpty()) { + List records = fileUploadRecordService.lambdaQuery() + .in(FileUploadRecord::getId, imageIds) + .list(); + imageMap = records.stream() + .collect(Collectors.toMap(FileUploadRecord::getId, r -> r, (a, b) -> a)); + } + + // 构建返回值 + final Map finalImageMap = imageMap; + return items.stream().map(item -> { + QmsPdiInspectionResultVO vo = new QmsPdiInspectionResultVO(); + vo.setId(item.getId()); + vo.setDetectionRulesId(item.getDetectionRulesId()); + vo.setTaskId(item.getTaskId()); + vo.setInspectionItemId(item.getInspectionItemId()); + vo.setInspectionItemType(item.getInspectionItemType()); + vo.setInspectionItemResults(item.getInspectionItemResults()); + vo.setRemark(item.getRemark()); + vo.setInspectorId(item.getInspectorId()); + vo.setInspectionTime(item.getInspectionTime()); + vo.setInspectionBy(item.getInspectionBy()); + + // 解析图片为 FileDetailVO 列表 + if (cn.hutool.core.util.StrUtil.isNotBlank(item.getInspectionItemImage())) { + List imageList = Arrays.stream(item.getInspectionItemImage().split(",")) + .filter(cn.hutool.core.util.StrUtil::isNotBlank) + .map(String::trim) + .map(Long::valueOf) + .map(id -> { + FileUploadRecord record = finalImageMap.get(id); + if (record != null) { + QmsPdiTaskRecordDetailVO.FileDetailVO fileVO = new QmsPdiTaskRecordDetailVO.FileDetailVO(); + fileVO.setId(record.getId()); + fileVO.setFileName(record.getFileName()); + fileVO.setFileType(record.getFileType()); + fileVO.setUrl(record.getUrl()); + return fileVO; + } + return null; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + vo.setInspectionItemImage(imageList); + } else { + vo.setInspectionItemImage(List.of()); + } + + return vo; + }).collect(Collectors.toList()); } // ========================= 分页查询 ========================= diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiInitiateTicketQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiInitiateTicketQO.java new file mode 100644 index 00000000..128dd42e --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiInitiateTicketQO.java @@ -0,0 +1,17 @@ +package com.nflg.wms.common.pojo.qo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * PDI发起工单 请求参数 + */ +@Data +public class QmsPdiInitiateTicketQO { + + /** + * PDI检测任务记录ID(QmsPdiTaskRecord.ID) + */ + @NotNull(message = "任务记录ID不能为空") + private Long taskRecordId; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiInspectionResultVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiInspectionResultVO.java new file mode 100644 index 00000000..cb991ef0 --- /dev/null +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiInspectionResultVO.java @@ -0,0 +1,68 @@ +package com.nflg.wms.common.pojo.vo; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * PDI不合格检测项 VO(用于发起工单和提交时返回) + */ +@Data +public class QmsPdiInspectionResultVO { + + /** + * 检测结果记录ID + */ + private Long id; + + /** + * PDI检测规则ID + */ + private Long detectionRulesId; + + /** + * 任务单ID + */ + private Long taskId; + + /** + * 检验项ID + */ + private Long inspectionItemId; + + /** + * 检验项类型:0=静态检测项,1=动态检测项,2=装车前检测项,3=特殊检测项 + */ + private Integer inspectionItemType; + + /** + * 检验现场图片详情列表 + */ + private List inspectionItemImage; + + /** + * 检验项结果:false=不合格,true=合格 + */ + private Boolean inspectionItemResults; + + /** + * 备注 + */ + private String remark; + + /** + * 质检人ID(多个用逗号隔开) + */ + private String inspectorId; + + /** + * 质检时间 + */ + private LocalDateTime inspectionTime; + + /** + * 质检人 + */ + private String inspectionBy; +} diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTicketDetailVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTicketDetailVO.java index c36efedd..5a054017 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTicketDetailVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiTicketDetailVO.java @@ -56,9 +56,9 @@ public class QmsPdiTicketDetailVO { private Integer inspectionItemType; /** - * 检验现场图片 + * 检验现场图片详情列表 */ - private String inspectionItemImage; + private List inspectionItemImage; /** * 备注 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 c7818896..500ff2d5 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 @@ -77,9 +77,9 @@ public class QmsPdiTicketMyDetailVO { private String incidentConsequence; /** - * 图片列表,多个图片ID用逗号分隔 + * 图片详情列表 */ - private String imageIds; + private List images; /** * 备注