feat(qms-pdi): 支持PDI发起工单时查询不合格检测项并优化图片数据结构

- 新增QmsPdiInitiateTicketQO请求参数类,支持传入任务记录ID查询
- 在QmsIssueTicketController新增接口initiatePdiTicket,返回不合格检测项列表
- 实现QmsIssueTicketControllerService.initiatePdiTicket方法 查询不合格检测项及对应图片详情
- 修改QmsPdiInspectionResultsControllerService.submit方法,返回类型调整为VO,图片字段转换为列表格式
- 在QmsPdiInspectionResultsControllerService新增buildInspectionResultVOList方法,将图片ID字符串转换为图片详情列表
- 优化QmsPdiTicketDetailVO和QmsPdiTicketMyDetailVO中图片字段类型,改用FileDetailVO列表替代原有字符串
- 统一解析和返回图片文件详情,提升前端处理效率和数据可读性
This commit is contained in:
funny 2026-05-08 10:35:40 +08:00
parent d94b0fe7b2
commit d81aaea6e6
8 changed files with 311 additions and 10 deletions

View File

@ -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.QmsIssueTicketAuditQO;
import com.nflg.wms.common.pojo.qo.QmsIssueTicketPdiAddQO; import com.nflg.wms.common.pojo.qo.QmsIssueTicketPdiAddQO;
import com.nflg.wms.common.pojo.qo.QmsIssueTicketSearchQO; 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.QmsIssueTicketDetailVO;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketVO; 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.QmsPdiTicketDetailVO;
import com.nflg.wms.common.pojo.vo.QmsPdiTicketMyDetailVO; import com.nflg.wms.common.pojo.vo.QmsPdiTicketMyDetailVO;
import com.nflg.wms.repository.service.IQmsIssueTicketService; import com.nflg.wms.repository.service.IQmsIssueTicketService;
@ -56,6 +58,14 @@ public class QmsIssueTicketController extends BaseController {
return ApiResult.success(); return ApiResult.success();
} }
/**
* PDI发起工单查询任务的不合格检测项
*/
@PostMapping("initiatePdiTicket")
public ApiResult<List<QmsPdiInspectionResultVO>> initiatePdiTicket(@Valid @RequestBody QmsPdiInitiateTicketQO request) {
return ApiResult.success(issueTicketControllerService.initiatePdiTicket(request.getTaskRecordId()));
}
/** /**
* 审核质量问题工单 * 审核质量问题工单
* 更新审批状态审批意见审批人信息并根据审批结果更新工单状态 * 更新审批状态审批意见审批人信息并根据审批结果更新工单状态

View File

@ -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.QmsPdiStatusItemsFillQO;
import com.nflg.wms.common.pojo.qo.QmsPdiTaskListQO; import com.nflg.wms.common.pojo.qo.QmsPdiTaskListQO;
import com.nflg.wms.common.pojo.qo.QmsPdiTaskRecordStatusItemDetailQO; 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.QmsPdiInspectionResultsPageVO;
import com.nflg.wms.common.pojo.vo.QmsPdiTaskListVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskListVO;
import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDetailVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDetailVO;
import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordSummaryVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordSummaryVO;
import com.nflg.wms.repository.entity.QmsPdiInspectionResults;
import com.nflg.wms.starter.BaseController; import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.validation.Valid; import jakarta.validation.Valid;
@ -52,7 +53,7 @@ public class QmsPdiInspectionResultsController extends BaseController {
* 5. 若有不合格项则以 list 返回无则返回 null * 5. 若有不合格项则以 list 返回无则返回 null
*/ */
@PostMapping("submit") @PostMapping("submit")
public ApiResult<List<QmsPdiInspectionResults>> submit( public ApiResult<List<QmsPdiInspectionResultVO>> submit(
@Valid @RequestBody QmsPdiInspectionResultsSubmitQO request) { @Valid @RequestBody QmsPdiInspectionResultsSubmitQO request) {
return ApiResult.success(inspectionResultsControllerService.submit(request)); return ApiResult.success(inspectionResultsControllerService.submit(request));
} }

View File

@ -81,6 +81,83 @@ public class QmsIssueTicketControllerService {
@Resource @Resource
private IDepartmentService departmentService; private IDepartmentService departmentService;
/**
* PDI发起工单查询任务的不合格检测项
*/
public List<QmsPdiInspectionResultVO> initiatePdiTicket(Long taskRecordId) {
// 查询不合格检测项
List<QmsPdiInspectionResults> failedItems = pdiInspectionResultsService.lambdaQuery()
.eq(QmsPdiInspectionResults::getTaskId, taskRecordId)
.eq(QmsPdiInspectionResults::getInspectionItemResults, false)
.list();
if (failedItems.isEmpty()) {
return null;
}
// 收集所有图片ID
Set<Long> 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<Long, FileUploadRecord> imageMap = new HashMap<>();
if (!imageIds.isEmpty()) {
List<FileUploadRecord> records = fileUploadRecordService.lambdaQuery()
.in(FileUploadRecord::getId, imageIds)
.list();
imageMap = records.stream()
.collect(Collectors.toMap(FileUploadRecord::getId, r -> r, (a, b) -> a));
}
// 构建返回值
final Map<Long, FileUploadRecord> 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<QmsPdiTaskRecordDetailVO.FileDetailVO> 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.setId(result.getId());
itemVO.setInspectionItemId(result.getInspectionItemId()); itemVO.setInspectionItemId(result.getInspectionItemId());
itemVO.setInspectionItemType(result.getInspectionItemType()); itemVO.setInspectionItemType(result.getInspectionItemType());
itemVO.setInspectionItemImage(result.getInspectionItemImage()); itemVO.setInspectionItemImage(parseImageList(result.getInspectionItemImage()));
itemVO.setRemark(result.getRemark()); itemVO.setRemark(result.getRemark());
itemVO.setInspectorId(result.getInspectorId()); itemVO.setInspectorId(result.getInspectorId());
itemVO.setInspectionTime(result.getInspectionTime()); itemVO.setInspectionTime(result.getInspectionTime());
@ -542,6 +619,9 @@ public class QmsIssueTicketControllerService {
QmsPdiTicketMyDetailVO vo = new QmsPdiTicketMyDetailVO(); QmsPdiTicketMyDetailVO vo = new QmsPdiTicketMyDetailVO();
BeanUtil.copyProperties(ticket, vo); BeanUtil.copyProperties(ticket, vo);
// imageIds 转换为图片详情列表
vo.setImages(parseImageList(ticket.getImageIds()));
// 构建处理记录列表 // 构建处理记录列表
List<QmsPdiTicketMyDetailVO.ProcessVO> processVOList = processes.stream().map(process -> { List<QmsPdiTicketMyDetailVO.ProcessVO> processVOList = processes.stream().map(process -> {
QmsPdiTicketMyDetailVO.ProcessVO processVO = new QmsPdiTicketMyDetailVO.ProcessVO(); QmsPdiTicketMyDetailVO.ProcessVO processVO = new QmsPdiTicketMyDetailVO.ProcessVO();
@ -565,4 +645,50 @@ public class QmsIssueTicketControllerService {
vo.setProcesses(processVOList); vo.setProcesses(processVOList);
return vo; return vo;
} }
/**
* 将逗号分隔的图片ID字符串转换为 FileDetailVO 列表
*/
private List<QmsPdiTaskRecordDetailVO.FileDetailVO> parseImageList(String imageIdsStr) {
if (StrUtil.isBlank(imageIdsStr)) {
return List.of();
}
// 收集所有图片ID
Set<Long> imageIds = Arrays.stream(imageIdsStr.split(","))
.filter(StrUtil::isNotBlank)
.map(String::trim)
.map(Long::valueOf)
.collect(Collectors.toSet());
if (imageIds.isEmpty()) {
return List.of();
}
// 查询图片文件信息
List<FileUploadRecord> records = fileUploadRecordService.lambdaQuery()
.in(FileUploadRecord::getId, imageIds)
.list();
// 构建 Map 保持顺序
Map<Long, FileUploadRecord> 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());
}
} }

View File

@ -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.QmsPdiStatusItemsFillQO;
import com.nflg.wms.common.pojo.qo.QmsPdiTaskListQO; import com.nflg.wms.common.pojo.qo.QmsPdiTaskListQO;
import com.nflg.wms.common.pojo.qo.QmsPdiTaskRecordStatusItemDetailQO; 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.QmsPdiInspectionResultsPageVO;
import com.nflg.wms.common.pojo.vo.QmsPdiTaskListVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskListVO;
import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDetailVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDetailVO;
import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordSummaryVO; import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordSummaryVO;
import com.nflg.wms.common.util.UserUtil; 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.QmsPdiDetectionRules;
import com.nflg.wms.repository.entity.QmsPdiDetectionRulesDeliveryItem; import com.nflg.wms.repository.entity.QmsPdiDetectionRulesDeliveryItem;
import com.nflg.wms.repository.entity.QmsPdiInspectionResults; import com.nflg.wms.repository.entity.QmsPdiInspectionResults;
import com.nflg.wms.repository.entity.QmsPdiTaskRecord; 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.IQmsPdiDetectionRulesDeliveryItemService;
import com.nflg.wms.repository.service.IQmsPdiDetectionRulesService; import com.nflg.wms.repository.service.IQmsPdiDetectionRulesService;
import com.nflg.wms.repository.service.IQmsPdiInspectionResultsService; import com.nflg.wms.repository.service.IQmsPdiInspectionResultsService;
@ -30,6 +33,8 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@ -57,6 +62,9 @@ public class QmsPdiInspectionResultsControllerService {
@Resource @Resource
private QmsPdiTaskRecordControllerService taskRecordControllerService; private QmsPdiTaskRecordControllerService taskRecordControllerService;
@Resource
private IFileUploadRecordService fileUploadRecordService;
// ========================= 动静态检查项填写 ========================= // ========================= 动静态检查项填写 =========================
/** /**
@ -150,7 +158,7 @@ public class QmsPdiInspectionResultsControllerService {
* 7. 若有不合格项则以 list 返回 type=0/1/3无则返回 null * 7. 若有不合格项则以 list 返回 type=0/1/3无则返回 null
*/ */
@Transactional @Transactional
public List<QmsPdiInspectionResults> submit(QmsPdiInspectionResultsSubmitQO request) { public List<QmsPdiInspectionResultVO> submit(QmsPdiInspectionResultsSubmitQO request) {
String operator = UserUtil.getUserName(); String operator = UserUtil.getUserName();
Long operatorId = UserUtil.getUserId(); Long operatorId = UserUtil.getUserId();
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
@ -225,8 +233,79 @@ public class QmsPdiInspectionResultsControllerService {
.set(QmsPdiTaskRecord::getInspectionEnable, hasDefect ? 3 : 2) .set(QmsPdiTaskRecord::getInspectionEnable, hasDefect ? 3 : 2)
.update(); .update();
// 7. 返回不合格项 // 7. 返回不合格项转换为VO图片改为List格式
return failedItems.isEmpty() ? null : failedItems; return buildInspectionResultVOList(failedItems);
}
/**
* QmsPdiInspectionResults 列表转换为 QmsPdiInspectionResultVO 列表图片转为List格式
*/
private List<QmsPdiInspectionResultVO> buildInspectionResultVOList(List<QmsPdiInspectionResults> items) {
if (items == null || items.isEmpty()) {
return null;
}
// 收集所有图片ID
Set<Long> 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<Long, FileUploadRecord> imageMap = new HashMap<>();
if (!imageIds.isEmpty()) {
List<FileUploadRecord> records = fileUploadRecordService.lambdaQuery()
.in(FileUploadRecord::getId, imageIds)
.list();
imageMap = records.stream()
.collect(Collectors.toMap(FileUploadRecord::getId, r -> r, (a, b) -> a));
}
// 构建返回值
final Map<Long, FileUploadRecord> 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<QmsPdiTaskRecordDetailVO.FileDetailVO> 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());
} }
// ========================= 分页查询 ========================= // ========================= 分页查询 =========================

View File

@ -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检测任务记录IDQmsPdiTaskRecord.ID
*/
@NotNull(message = "任务记录ID不能为空")
private Long taskRecordId;
}

View File

@ -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<QmsPdiTaskRecordDetailVO.FileDetailVO> inspectionItemImage;
/**
* 检验项结果false=不合格true=合格
*/
private Boolean inspectionItemResults;
/**
* 备注
*/
private String remark;
/**
* 质检人ID多个用逗号隔开
*/
private String inspectorId;
/**
* 质检时间
*/
private LocalDateTime inspectionTime;
/**
* 质检人
*/
private String inspectionBy;
}

View File

@ -56,9 +56,9 @@ public class QmsPdiTicketDetailVO {
private Integer inspectionItemType; private Integer inspectionItemType;
/** /**
* 检验现场图片 * 检验现场图片详情列表
*/ */
private String inspectionItemImage; private List<QmsPdiTaskRecordDetailVO.FileDetailVO> inspectionItemImage;
/** /**
* 备注 * 备注

View File

@ -77,9 +77,9 @@ public class QmsPdiTicketMyDetailVO {
private String incidentConsequence; private String incidentConsequence;
/** /**
* 图片列表多个图片ID用逗号分隔 * 图片详情列表
*/ */
private String imageIds; private List<QmsPdiTaskRecordDetailVO.FileDetailVO> images;
/** /**
* 备注 * 备注