feat(qms-pdi): 支持PDI发起工单时查询不合格检测项并优化图片数据结构
- 新增QmsPdiInitiateTicketQO请求参数类,支持传入任务记录ID查询 - 在QmsIssueTicketController新增接口initiatePdiTicket,返回不合格检测项列表 - 实现QmsIssueTicketControllerService.initiatePdiTicket方法 查询不合格检测项及对应图片详情 - 修改QmsPdiInspectionResultsControllerService.submit方法,返回类型调整为VO,图片字段转换为列表格式 - 在QmsPdiInspectionResultsControllerService新增buildInspectionResultVOList方法,将图片ID字符串转换为图片详情列表 - 优化QmsPdiTicketDetailVO和QmsPdiTicketMyDetailVO中图片字段类型,改用FileDetailVO列表替代原有字符串 - 统一解析和返回图片文件详情,提升前端处理效率和数据可读性
This commit is contained in:
parent
d94b0fe7b2
commit
d81aaea6e6
|
|
@ -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<List<QmsPdiInspectionResultVO>> initiatePdiTicket(@Valid @RequestBody QmsPdiInitiateTicketQO request) {
|
||||
return ApiResult.success(issueTicketControllerService.initiatePdiTicket(request.getTaskRecordId()));
|
||||
}
|
||||
|
||||
/**
|
||||
* 审核质量问题工单
|
||||
* 更新审批状态、审批意见、审批人信息,并根据审批结果更新工单状态
|
||||
|
|
|
|||
|
|
@ -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<List<QmsPdiInspectionResults>> submit(
|
||||
public ApiResult<List<QmsPdiInspectionResultVO>> submit(
|
||||
@Valid @RequestBody QmsPdiInspectionResultsSubmitQO request) {
|
||||
return ApiResult.success(inspectionResultsControllerService.submit(request));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -81,6 +81,83 @@ public class QmsIssueTicketControllerService {
|
|||
@Resource
|
||||
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.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<QmsPdiTicketMyDetailVO.ProcessVO> 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<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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<QmsPdiInspectionResults> submit(QmsPdiInspectionResultsSubmitQO request) {
|
||||
public List<QmsPdiInspectionResultVO> 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<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());
|
||||
}
|
||||
|
||||
// ========================= 分页查询 =========================
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -56,9 +56,9 @@ public class QmsPdiTicketDetailVO {
|
|||
private Integer inspectionItemType;
|
||||
|
||||
/**
|
||||
* 检验现场图片
|
||||
* 检验现场图片详情列表
|
||||
*/
|
||||
private String inspectionItemImage;
|
||||
private List<QmsPdiTaskRecordDetailVO.FileDetailVO> inspectionItemImage;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
|
|
|
|||
|
|
@ -77,9 +77,9 @@ public class QmsPdiTicketMyDetailVO {
|
|||
private String incidentConsequence;
|
||||
|
||||
/**
|
||||
* 图片列表,多个图片ID用逗号分隔
|
||||
* 图片详情列表
|
||||
*/
|
||||
private String imageIds;
|
||||
private List<QmsPdiTaskRecordDetailVO.FileDetailVO> images;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
|
|
|
|||
Loading…
Reference in New Issue