Compare commits

...

4 Commits

Author SHA1 Message Date
funny 8f25bf27f2 Merge branch 'qms/develop' into qms/yf
# Conflicts:
#	nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsIssueTicketController.java
#	nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsIssueTicketControllerService.java
2026-04-27 15:49:40 +08:00
曹鹏飞 26dd1383a0 fix(repository): 修复入库检验任务相关任务号查询逻辑
- 修改相关任务号查询字段为关联任务的任务号
- 添加入库检验任务表关联,实现相关任务号连接查询
- 优化SQL查询结构,确保相关任务号数据准确返回
2026-04-27 15:24:56 +08:00
曹鹏飞 f3e41e69e6 feat(issueTicket): 新增质量问题工单功能及详情查询
- 增加质量问题工单新增接口,实现工单编号自动生成及基本信息保存
- 添加质量问题工单详情查询,包含图片信息、来料检测任务详情及检验记录
- 来料检验任务检验记录子项新增样本数量、合格数量、不合格数量属性
- 重命名检验记录样本数据中的图片字段为imageIds,统一字段命名
- 新增获取不合格数据分组方法,聚合不合格数量并合并图片列表
- 实现质量问题工单分页查询及搜索功能
- 新增质量问题工单相关的请求参数和响应视图对象定义
- 完善数据库Mapper接口及XML配置,支持新查询语句
- 调整前端传递及后端处理逻辑对应的字段及校验逻辑
2026-04-27 15:19:10 +08:00
funny 097a61ac21 pdi功能工单部分新增,分页查询部分修改 2026-04-27 15:10:47 +08:00
31 changed files with 977 additions and 86 deletions

View File

@ -0,0 +1,58 @@
package com.nflg.qms.admin.controller;
import com.nflg.qms.admin.service.QmsIssueTicketControllerService;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.QmsIssueTicketAddQO;
import com.nflg.wms.common.pojo.qo.QmsIssueTicketSearchQO;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketDetailVO;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketVO;
import com.nflg.wms.repository.service.IQmsIssueTicketService;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 质量问题工单管理
*/
@RestController
@RequestMapping("/issueTicket")
public class QmsIssueTicketController extends BaseController {
@Resource
private IQmsIssueTicketService issueTicketService;
@Resource
private QmsIssueTicketControllerService issueTicketControllerService;
/**
* 新增质量问题工单
* 工单编号自动生成来源类型固定为2巡检
*/
@PostMapping("add")
public ApiResult<Void> add(@Valid @RequestBody QmsIssueTicketAddQO request) {
issueTicketControllerService.add(request);
return ApiResult.success();
}
/**
* 查询来料检测任务质量问题工单详情
* 含来料检测任务详情及来料检验任务检验记录子项样本列表
*/
@GetMapping("detail")
public ApiResult<QmsIssueTicketDetailVO> detail(@NotNull(message = "ID不能为空") Long id) {
return ApiResult.success(issueTicketControllerService.getDetail(id));
}
/**
* 分页查询质量问题工单列表
*/
@PostMapping("search")
public ApiResult<PageData<QmsIssueTicketVO>> search(@Valid @RequestBody QmsIssueTicketSearchQO request) {
return ApiResult.success(issueTicketService.search(request));
}
}

View File

@ -0,0 +1,19 @@
package com.nflg.qms.admin.controller;
import com.nflg.qms.admin.service.QmsIssueTicketProcessControllerService;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 质量问题工单处理管理
*/
@RestController
@RequestMapping("/issueTicketProcess")
public class QmsIssueTicketProcessController extends BaseController {
@Resource
private QmsIssueTicketProcessControllerService issueTicketProcessControllerService;
}

View File

@ -0,0 +1,19 @@
package com.nflg.qms.admin.controller;
import com.nflg.qms.admin.service.QmsIssueTicketProcessMeasureControllerService;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 质量问题工单处理解决措施管理
*/
@RestController
@RequestMapping("/issueTicketProcessMeasure")
public class QmsIssueTicketProcessMeasureController extends BaseController {
@Resource
private QmsIssueTicketProcessMeasureControllerService issueTicketProcessMeasureControllerService;
}

View File

@ -5,6 +5,7 @@ import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.qo.QmsPdiSortBatchUpdateQO;
import com.nflg.wms.common.pojo.qo.QmsPdiStatusItemAddQO;
import com.nflg.wms.common.pojo.qo.QmsPdiStatusItemExportQO;
import com.nflg.wms.common.pojo.qo.QmsPdiStatusItemSearchQO;
import com.nflg.wms.common.pojo.qo.QmsPdiStatusItemUpdateQO;
import com.nflg.wms.common.pojo.vo.QmsPdiStatusItemGroupVO;
import com.nflg.wms.common.util.EecExcelUtil;
@ -92,12 +93,11 @@ public class QmsPdiStatusItemController extends BaseController {
}
/**
* 分页查询按状态分组返回
* 分页查询按状态分组各自独立分页返回
*/
@GetMapping("/search")
public ApiResult<QmsPdiStatusItemGroupVO> search(
@NotNull(message = "PDI检测规则ID不能为空") @RequestParam Long detectionRulesId) {
return ApiResult.success(statusItemControllerService.search(detectionRulesId));
public ApiResult<QmsPdiStatusItemGroupVO> search(@Valid QmsPdiStatusItemSearchQO request) {
return ApiResult.success(statusItemControllerService.search(request));
}
/**

View File

@ -52,7 +52,7 @@ public class QmsPdiTaskRecordController extends BaseController {
*/
@PostMapping("detail")
public ApiResult<QmsPdiTaskRecordDetailVO> detail(@Valid @RequestBody QmsPdiTaskRecordDetailQO request) {
return ApiResult.success(taskRecordControllerService.detail(request.getId(), request.getPage(), request.getSize()));
return ApiResult.success(taskRecordControllerService.detail(request));
}
/**

View File

@ -799,6 +799,9 @@ public class IncomingInspectionTaskControllerService {
QmsIncomingInspectionTaskRecordItem ditem = new QmsIncomingInspectionTaskRecordItem()
.setId(item.getId())
.setRecordId(record.getId())
.setInspectionQty(request.getInspectionQty())
.setQualifiedQty(item.getQualifiedQty())
.setUnqualifiedQty(item.getUnqualifiedQty())
.setRemark(item.getRemark())
.setInspectionStandardItemContentId(item.getInspectionStandardItemContentId());
allItemEntities.add(ditem);
@ -833,7 +836,7 @@ public class IncomingInspectionTaskControllerService {
.setItemId(ditem.getId())
.setQualified(data.getQualified())
.setMeasuredValue(data.getMeasuredValue())
.setImages(imageIds);
.setImageIds(imageIds);
if (data.getId() == null) {
insertDatas.add(ddata);
} else {
@ -1047,10 +1050,10 @@ public class IncomingInspectionTaskControllerService {
dataVO.setItemId(data.getItemId());
dataVO.setMeasuredValue(data.getMeasuredValue());
dataVO.setQualified(data.getQualified());
if (StrUtil.isNotBlank(data.getImages())) {
if (StrUtil.isNotBlank(data.getImageIds())) {
dataVO.setImages(
fileUploadRecordService.lambdaQuery()
.in(FileUploadRecord::getId, StrUtil.split(data.getImages(), ","))
.in(FileUploadRecord::getId, StrUtil.split(data.getImageIds(), ","))
.list()
.stream()
.map(file -> new FileUploadVO()
@ -1067,4 +1070,8 @@ public class IncomingInspectionTaskControllerService {
return vo;
}).toList();
}
public List<QmsIssueTicketInspectionRecordItemVO> getNonconformanceDataGroups(Long recordId) {
return incomingInspectionTaskRecordItemService.getNonconformanceDataGroups(recordId);
}
}

View File

@ -0,0 +1,172 @@
package com.nflg.qms.admin.service;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.exception.NflgException;
import com.nflg.wms.common.pojo.qo.QmsIssueTicketAddQO;
import com.nflg.wms.common.pojo.vo.FileUploadVO;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketDetailVO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskRecordItemDetailVO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskRecordVO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskVO;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketInspectionRecordItemVO;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.repository.entity.FileUploadRecord;
import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskRecord;
import com.nflg.wms.repository.entity.QmsIssueTicket;
import com.nflg.wms.repository.service.IFileUploadRecordService;
import com.nflg.wms.repository.service.IQmsIssueTicketService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import jakarta.validation.Valid;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 质量问题工单 ControllerService
* 质量问题工单 业务逻辑
*/
@Service
@Component
public class QmsIssueTicketControllerService {
@Resource
private IQmsIssueTicketService issueTicketService;
@Resource
private BasdeSerialNumberControllerService basdeSerialNumberControllerService;
@Resource
private IFileUploadRecordService fileUploadRecordService;
@Resource
private IncomingInspectionTaskControllerService incomingInspectionTaskControllerService;
/**
* 新增质量问题工单
* 工单编号自动生成来源类型固定为2巡检状态默认为0待流转
*/
@Transactional(rollbackFor = Exception.class)
public void add(@Valid QmsIssueTicketAddQO request) {
Long userId = UserUtil.getUserId();
String userName = UserUtil.getUserName();
LocalDateTime now = LocalDateTime.now();
// 自动生成工单编号
String ticketNo = basdeSerialNumberControllerService.generateSerialNumber(36);
QmsIssueTicket entity = new QmsIssueTicket()
.setSourceType((short) 2)
.setTicketNo(ticketNo)
.setTicketTitle(request.getTicketTitle())
.setProjectNo(request.getProjectNo())
.setIncidentType(request.getIncidentType())
.setExceptionCode(request.getExceptionCode())
.setUnqualifiedQty(request.getUnqualifiedQty())
.setIncidentLocation(request.getIncidentLocation())
.setIncidentDescription(request.getIncidentDescription())
.setIncidentReason(request.getIncidentReason())
.setIncidentConsequence(request.getIncidentConsequence())
.setImageIds(request.getImages() == null
? ""
: StrUtil.join(",", request.getImages().stream().map(FileUploadVO::getId).toList())
)
.setRemark(request.getRemark())
.setCreateUserId(userId)
.setCreateUserName(userName)
.setCreateTime(now)
.setUpdateUserId(userId)
.setUpdateUserName(userName)
.setUpdateTime(now);
issueTicketService.save(entity);
}
/**
* 查询来料检测任务质量问题工单详情
* 包含图片文件信息来料检测任务详情检验记录含子项和样本数据
*/
public QmsIssueTicketDetailVO getDetail(Long id) {
QmsIssueTicket entity = issueTicketService.getById(id);
if (Objects.isNull(entity)) {
throw new NflgException(STATE.BusinessError, "质量问题工单不存在");
}
QmsIssueTicketDetailVO vo = BeanUtil.copyProperties(entity, QmsIssueTicketDetailVO.class);
// 解析图片ID列表并查询文件信息
if (StrUtil.isNotBlank(entity.getImageIds())) {
List<Long> imageIdList = Arrays.stream(entity.getImageIds().split(","))
.filter(StrUtil::isNotBlank)
.map(Long::valueOf)
.collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(imageIdList)) {
List<FileUploadRecord> records = fileUploadRecordService.lambdaQuery()
.in(FileUploadRecord::getId, imageIdList)
.list();
vo.setImages(records.stream()
.map(file -> new FileUploadVO()
.setId(file.getId())
.setFileName(file.getFileName())
.setUrl(file.getUrl())
)
.collect(Collectors.toList())
);
}
}
// 查询关联的来料检测任务详情及检验记录
if (Objects.nonNull(entity.getSourceId())) {
// 来料检测任务详情
QmsIncomingInspectionTaskVO taskDetail = incomingInspectionTaskControllerService.getDetail(entity.getSourceId());
vo.setTaskDetail(taskDetail);
List<QmsIssueTicketInspectionRecordItemVO> datas = incomingInspectionTaskControllerService.getNonconformanceDataGroups(entity.getSourceId());
List<QmsIssueTicketInspectionRecordItemVO> records = new ArrayList<>();
datas.forEach(record -> {
QmsIssueTicketInspectionRecordItemVO r = records.stream()
.filter(item -> item.getId().equals(record.getId()))
.findFirst()
.orElseGet(() -> {
QmsIssueTicketInspectionRecordItemVO r1 = new QmsIssueTicketInspectionRecordItemVO()
.setId(record.getId())
.setName(record.getName())
.setLegend(record.getLegend())
.setUnqualifiedQty(0)
.setImageIds(record.getImageIds());
records.add(r1);
return r1;
});
r.setUnqualifiedQty(r.getUnqualifiedQty() + record.getUnqualifiedQty());
r.setImageIds(StrUtil.join(",", r.getImageIds(), record.getImageIds()));
});
records.stream()
.filter(record -> StrUtil.isNotBlank(record.getImageIds()))
.forEach(record -> {
record.setImages(fileUploadRecordService.lambdaQuery()
.in(FileUploadRecord::getId, StrUtil.split(record.getImageIds(), ","))
.list()
.stream()
.map(file -> new FileUploadVO()
.setId(file.getId())
.setFileName(file.getFileName())
.setUrl(file.getUrl())
)
.collect(Collectors.toList())
);
});
vo.setRecords(records);
}
return vo;
}
}

View File

@ -0,0 +1,15 @@
package com.nflg.qms.admin.service;
import com.nflg.wms.repository.service.IQmsIssueTicketProcessService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
/**
* 质量问题工单处理 ControllerService
*/
@Service
public class QmsIssueTicketProcessControllerService {
@Resource
private IQmsIssueTicketProcessService issueTicketProcessService;
}

View File

@ -0,0 +1,15 @@
package com.nflg.qms.admin.service;
import com.nflg.wms.repository.service.IQmsIssueTicketProcessMeasureService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
/**
* 质量问题工单处理解决措施 ControllerService
*/
@Service
public class QmsIssueTicketProcessMeasureControllerService {
@Resource
private IQmsIssueTicketProcessMeasureService issueTicketProcessMeasureService;
}

View File

@ -2,12 +2,15 @@ package com.nflg.qms.admin.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.wms.common.exception.NflgException;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.dto.QmsPdiStatusItemExportDTO;
import com.nflg.wms.common.pojo.dto.QmsPdiStatusItemImportDTO;
import com.nflg.wms.common.pojo.qo.QmsPdiSortBatchUpdateQO;
import com.nflg.wms.common.pojo.qo.QmsPdiStatusItemAddQO;
import com.nflg.wms.common.pojo.qo.QmsPdiStatusItemSearchQO;
import com.nflg.wms.common.pojo.qo.QmsPdiStatusItemUpdateQO;
import com.nflg.wms.common.pojo.vo.QmsPdiStatusItemGroupVO;
import com.nflg.wms.common.util.EecExcelUtil;
@ -212,38 +215,45 @@ public class QmsPdiStatusItemControllerService {
// ========================= 分页查询 =========================
/**
* 查询PDI检测项按状态分组返回
*
* @param detectionRulesId PDI检测规则ID必传
* 查询PDI检测项按状态分组各自独立分页返回
*/
public QmsPdiStatusItemGroupVO search(Long detectionRulesId) {
List<QmsPdiDetectionRulesStatusItem> all = statusItemService.lambdaQuery()
.eq(QmsPdiDetectionRulesStatusItem::getDetectionRulesId, detectionRulesId)
.orderByAsc(QmsPdiDetectionRulesStatusItem::getSort)
.list();
List<QmsPdiStatusItemGroupVO.QmsPdiStatusItemVO> staticList = all.stream()
.filter(item -> Objects.equals(item.getStatus(), 0))
.map(this::toVO)
.collect(Collectors.toList());
List<QmsPdiStatusItemGroupVO.QmsPdiStatusItemVO> dynamicList = all.stream()
.filter(item -> Objects.equals(item.getStatus(), 1))
.map(this::toVO)
.collect(Collectors.toList());
List<QmsPdiStatusItemGroupVO.QmsPdiStatusItemVO> specialList = all.stream()
.filter(item -> Objects.equals(item.getStatus(), 2))
.map(this::toVO)
.collect(Collectors.toList());
public QmsPdiStatusItemGroupVO search(QmsPdiStatusItemSearchQO request) {
QmsPdiStatusItemGroupVO vo = new QmsPdiStatusItemGroupVO();
vo.setStaticItems(staticList);
vo.setDynamicItems(dynamicList);
vo.setSpecialItems(specialList);
// 静态检测项status=0
vo.setStaticItems(buildStatusItemPage(request.getDetectionRulesId(), 0,
request.getStaticPage(), request.getStaticSize()));
// 动态检测项status=1
vo.setDynamicItems(buildStatusItemPage(request.getDetectionRulesId(), 1,
request.getDynamicPage(), request.getDynamicSize()));
// 特殊检测项status=2
vo.setSpecialItems(buildStatusItemPage(request.getDetectionRulesId(), 2,
request.getSpecialPage(), request.getSpecialSize()));
return vo;
}
/**
* 按状态构建检测项分页数据
*/
private PageData<QmsPdiStatusItemGroupVO.QmsPdiStatusItemVO> buildStatusItemPage(
Long detectionRulesId, int status, int pageNum, int pageSize) {
Page<QmsPdiDetectionRulesStatusItem> page = statusItemService.lambdaQuery()
.eq(QmsPdiDetectionRulesStatusItem::getDetectionRulesId, detectionRulesId)
.eq(QmsPdiDetectionRulesStatusItem::getStatus, status)
.orderByAsc(QmsPdiDetectionRulesStatusItem::getSort)
.page(new Page<>(pageNum, pageSize));
List<QmsPdiStatusItemGroupVO.QmsPdiStatusItemVO> voList = page.getRecords().stream()
.map(this::toVO)
.collect(Collectors.toList());
PageData<QmsPdiStatusItemGroupVO.QmsPdiStatusItemVO> pd = new PageData<>();
pd.setPage(pageNum);
pd.setPageSize(pageSize);
pd.setTotal((int) page.getTotal());
pd.setItems(voList);
return pd;
}
private QmsPdiStatusItemGroupVO.QmsPdiStatusItemVO toVO(QmsPdiDetectionRulesStatusItem item) {
QmsPdiStatusItemGroupVO.QmsPdiStatusItemVO vo = new QmsPdiStatusItemGroupVO.QmsPdiStatusItemVO();
vo.setId(item.getId());

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.exception.NflgException;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.QmsPdiTaskRecordDetailQO;
import com.nflg.wms.common.pojo.qo.QmsPdiTaskRecordSearchQO;
import com.nflg.wms.common.pojo.qo.QmsPdiTaskRecordTransferQO;
import com.nflg.wms.common.pojo.vo.QmsPdiTaskRecordDetailVO;
@ -100,10 +101,10 @@ public class QmsPdiTaskRecordControllerService {
* 根据ID查询检测任务详情
* - 检验结果统一所有检测项均有结果 "合格"否则为空
* - 检验员检测规则.质检负责人 user.username
* - 各类型检测项分页返回
* - 静态/动态/特殊各自独立分页返回装车前不分页
*/
public QmsPdiTaskRecordDetailVO detail(Long id, Integer page, Integer size) {
QmsPdiTaskRecord record = taskRecordService.getById(id);
public QmsPdiTaskRecordDetailVO detail(QmsPdiTaskRecordDetailQO request) {
QmsPdiTaskRecord record = taskRecordService.getById(request.getId());
if (Objects.isNull(record)) {
throw new NflgException(STATE.BusinessError, "检测任务记录不存在");
}
@ -122,10 +123,10 @@ public class QmsPdiTaskRecordControllerService {
// 统一检验结果所有检测项均有结果 "合格"否则为空
long totalResults = inspectionResultsService.lambdaQuery()
.eq(QmsPdiInspectionResults::getTaskId, id)
.eq(QmsPdiInspectionResults::getTaskId, request.getId())
.count();
long filledResults = inspectionResultsService.lambdaQuery()
.eq(QmsPdiInspectionResults::getTaskId, id)
.eq(QmsPdiInspectionResults::getTaskId, request.getId())
.isNotNull(QmsPdiInspectionResults::getInspectionItemResults)
.count();
String inspectionResult = (totalResults > 0 && filledResults == totalResults) ? "合格" : null;
@ -141,21 +142,20 @@ public class QmsPdiTaskRecordControllerService {
vo.setInspectorName(inspectorName);
vo.setDetectionCompletionTime(record.getDetectionCompletionTime());
// 分页参数
int pageNum = page != null ? page : 1;
int pageSize = size != null ? size : 20;
// 静态检测项type=0独立分页
vo.setStaticItems(buildStatusItemPage(record.getId(), 0,
request.getStaticPage(), request.getStaticSize()));
// 静态检测项type=0分页
vo.setStaticItems(buildStatusItemPage(record.getId(), 0, pageNum, pageSize));
// 动态检测项type=1独立分页
vo.setDynamicItems(buildStatusItemPage(record.getId(), 1,
request.getDynamicPage(), request.getDynamicSize()));
// 动态检测项type=1分页
vo.setDynamicItems(buildStatusItemPage(record.getId(), 1, pageNum, pageSize));
// 特殊检测项type=3独立分页
vo.setSpecialItems(buildStatusItemPage(record.getId(), 3,
request.getSpecialPage(), request.getSpecialSize()));
// 特殊检测项type=3分页
vo.setSpecialItems(buildStatusItemPage(record.getId(), 3, pageNum, pageSize));
// 准备发货type=2分页
vo.setLoadingItems(buildLoadingItemPage(record.getId(), pageNum, pageSize));
// 准备发货type=2不分页
vo.setLoadingItems(buildLoadingItem(record.getId()));
return vo;
}
@ -173,6 +173,8 @@ public class QmsPdiTaskRecordControllerService {
List<QmsPdiInspectionResults> records = resultPage.getRecords();
if (records.isEmpty()) {
PageData<QmsPdiTaskRecordDetailVO.StatusItemVO> pd = new PageData<>();
pd.setPage(pageNum);
pd.setPageSize(pageSize);
pd.setItems(List.of());
pd.setTotal(0);
return pd;
@ -227,16 +229,17 @@ public class QmsPdiTaskRecordControllerService {
}).collect(Collectors.toList());
PageData<QmsPdiTaskRecordDetailVO.StatusItemVO> pd = new PageData<>();
pd.setPage(pageNum);
pd.setPageSize(pageSize);
pd.setItems(voList);
pd.setTotal((int) resultPage.getTotal());
return pd;
}
/**
* 构建准备发货装车前分页数据
* 构建准备发货装车前数据不分页
*/
private PageData<QmsPdiTaskRecordDetailVO.LoadingItemVO> buildLoadingItemPage(
Long taskId, int pageNum, int pageSize) {
private QmsPdiTaskRecordDetailVO.LoadingItemVO buildLoadingItem(Long taskId) {
// 查询装车前整体记录type=2只有一条
QmsPdiInspectionResults loadingResult = inspectionResultsService.lambdaQuery()
.eq(QmsPdiInspectionResults::getTaskId, taskId)
@ -244,10 +247,7 @@ public class QmsPdiTaskRecordControllerService {
.one();
if (loadingResult == null) {
PageData<QmsPdiTaskRecordDetailVO.LoadingItemVO> pd = new PageData<>();
pd.setItems(List.of());
pd.setTotal(0);
return pd;
return null;
}
// 查询该任务单下所有装车前检查项明细
@ -270,10 +270,7 @@ public class QmsPdiTaskRecordControllerService {
// 构建返回结果
QmsPdiTaskRecordDetailVO.LoadingItemVO vo = new QmsPdiTaskRecordDetailVO.LoadingItemVO();
vo.setId(loadingResult.getId());
// 拆分图片/视频ID并转换为FileDetailVO
vo.setInspectionItemImage(convertImageIdsToVO(loadingResult.getInspectionItemImage()));
vo.setInspectionItemResults(loadingResult.getInspectionItemResults());
// 构建明细列表
@ -283,21 +280,16 @@ public class QmsPdiTaskRecordControllerService {
QmsPdiTaskRecordDetailVO.DeliveryItemDetailVO detailVO = new QmsPdiTaskRecordDetailVO.DeliveryItemDetailVO();
detailVO.setDeliveryItemId(lr.getDeliveryItemId());
detailVO.setDeliveryItemResult(lr.getDeliveryItemResult());
QmsPdiDetectionRulesDeliveryItem di = finalMap.get(lr.getDeliveryItemId());
if (di != null) {
detailVO.setChecklist(di.getChecklist());
}
detailList.add(detailVO);
}
vo.setDeliveryItemList(detailList);
// 包装成分页格式只有1条
PageData<QmsPdiTaskRecordDetailVO.LoadingItemVO> pd = new PageData<>();
pd.setItems(List.of(vo));
pd.setTotal(1);
return pd;
return vo;
}
/**

View File

@ -18,6 +18,18 @@ public class QmsIncomingInspectionTaskTodoCheckSubmitItemQO {
@NotNull(message = "检验标准项内容ID不能为空")
private Long inspectionStandardItemContentId;
/**
* 合格数量
*/
@NotNull(message = "合格数量不能为空")
private Integer qualifiedQty;
/**
* 不合格数量
*/
@NotNull(message = "不合格数量不能为空")
private Integer unqualifiedQty;
/**
* 备注
*/

View File

@ -0,0 +1,72 @@
package com.nflg.wms.common.pojo.qo;
import com.nflg.wms.common.pojo.vo.FileUploadVO;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
/**
* 质量问题工单 新增参数
*/
@Data
public class QmsIssueTicketAddQO {
/**
* 工单标题
*/
@NotBlank(message = "工单标题不能为空")
private String ticketTitle;
/**
* 工程编号
*/
private String projectNo;
/**
* 事故类型0=一般1=较严重2=严重
*/
@NotNull(message = "事故类型不能为空")
private Short incidentType;
/**
* 异常代码
*/
private String exceptionCode;
/**
* 不合格数量
*/
private Integer unqualifiedQty;
/**
* 事件地点
*/
private String incidentLocation;
/**
* 事件描述
*/
private String incidentDescription;
/**
* 事件原因
*/
private String incidentReason;
/**
* 事件后果
*/
private String incidentConsequence;
/**
* 图片列表
*/
private List<FileUploadVO> images;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,59 @@
package com.nflg.wms.common.pojo.qo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDate;
/**
* 质量问题工单 列表查询参数
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class QmsIssueTicketSearchQO extends PageQO {
/**
* 工单编号模糊匹配
*/
private String ticketNo;
/**
* 工单标题模糊匹配
*/
private String ticketTitle;
/**
* 工程编号模糊匹配
*/
private String projectNo;
/**
* 异常代码精确匹配
*/
private String exceptionCode;
/**
* 工单类型/来源类型0=IQC检测任务1=PDI检测任务2=巡检
*/
private Short ticketType;
/**
* 工单状态0=待流转1=处理中2=已完成
*/
private Short status;
/**
* 事故类型0=一般1=较严重2=严重
*/
private Short incidentType;
/**
* 创建时间开始日期
*/
private LocalDate createTimeStart;
/**
* 创建时间结束日期
*/
private LocalDate createTimeEnd;
}

View File

@ -0,0 +1,47 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* PDI动静态检测项 分页查询请求参数按状态分组各自独立分页
*/
@Data
public class QmsPdiStatusItemSearchQO {
/**
* PDI检测规则ID必传
*/
@NotNull(message = "PDI检测规则ID不能为空")
private Long detectionRulesId;
/**
* 静态检测项页码默认1
*/
private Integer staticPage = 1;
/**
* 静态检测项每页条数默认20
*/
private Integer staticSize = 20;
/**
* 动态检测项页码默认1
*/
private Integer dynamicPage = 1;
/**
* 动态检测项每页条数默认20
*/
private Integer dynamicSize = 20;
/**
* 特殊检测项页码默认1
*/
private Integer specialPage = 1;
/**
* 特殊检测项每页条数默认20
*/
private Integer specialSize = 20;
}

View File

@ -16,12 +16,32 @@ public class QmsPdiTaskRecordDetailQO {
private Long id;
/**
* 页码默认1
* 静态检测项页码默认1
*/
private Integer page = 1;
private Integer staticPage = 1;
/**
* 每页条数默认20
* 静态检测项每页条数默认20
*/
private Integer size = 20;
private Integer staticSize = 20;
/**
* 动态检测项页码默认1
*/
private Integer dynamicPage = 1;
/**
* 动态检测项每页条数默认20
*/
private Integer dynamicSize = 20;
/**
* 特殊检测项页码默认1
*/
private Integer specialPage = 1;
/**
* 特殊检测项每页条数默认20
*/
private Integer specialSize = 20;
}

View File

@ -61,5 +61,5 @@ public class QmsIncomingInspectionTaskRecordVO {
/**
* 检验记录项列表
*/
private List<QmsIncomingInspectionTaskRecordItemVO> items;
private List<QmsIssueTicketInspectionRecordItemVO> items;
}

View File

@ -0,0 +1,140 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* 质量问题工单 详情视图对象
*/
@Data
public class QmsIssueTicketDetailVO {
private Long id;
/**
* 来源类型0=IQC检测任务1=PDI检测任务2=巡检
*/
private Short sourceType;
/**
* 来源ID关联对应检测任务表
*/
private Long sourceId;
/**
* 工单编号
*/
private String ticketNo;
/**
* 工单标题
*/
private String ticketTitle;
/**
* 工程编号
*/
private String projectNo;
/**
* 事故类型0=一般1=较严重2=严重
*/
private Short incidentType;
/**
* 异常代码
*/
private String exceptionCode;
/**
* 不合格数量
*/
private Integer unqualifiedQty;
/**
* 事件地点
*/
private String incidentLocation;
/**
* 事件描述
*/
private String incidentDescription;
/**
* 事件原因
*/
private String incidentReason;
/**
* 事件后果
*/
private String incidentConsequence;
/**
* 图片列表
*/
private List<FileUploadVO> images;
/**
* 备注
*/
private String remark;
/**
* 状态0=待流转1=处理中2=已完成
*/
private Short status;
/**
* 审批状态0=通过1=驳回2=重检3=报废4=维修5=挑选使用6=让渡使用
*/
private Short approvalStatus;
/**
* 审批意见
*/
private String approvalOpinion;
/**
* 审批人姓名
*/
private String approvalUserName;
/**
* 审批时间
*/
private LocalDateTime approvalTime;
/**
* 创建人姓名
*/
private String createUserName;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新人姓名
*/
private String updateUserName;
/**
* 更新时间
*/
private LocalDateTime updateTime;
/**
* 来料检测任务详情
*/
private QmsIncomingInspectionTaskVO taskDetail;
/**
* 来料检验任务检验记录不合格列表
*/
private List<QmsIssueTicketInspectionRecordItemVO> records;
}

View File

@ -0,0 +1,46 @@
package com.nflg.wms.common.pojo.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* 质量问题工单 - 来料检验记录子项及样本合并VO
*/
@Data
@Accessors(chain = true)
public class QmsIssueTicketInspectionRecordItemVO {
@JsonIgnore
private Long id;
/**
* 检测项名称
*/
private String name;
/**
* 图例
*/
private String legend;
/**
* 不合格数量
*/
private Integer unqualifiedQty;
/**
* 图片列表
*/
@JsonIgnore
private String imageIds;
/**
* 图片列表
*/
private List<FileUploadVO> images=new ArrayList<>();
}

View File

@ -0,0 +1,99 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 质量问题工单 列表视图对象
*/
@Data
public class QmsIssueTicketVO {
private Long id;
/**
* 来源类型0=IQC检测任务1=PDI检测任务2=巡检
*/
private Short sourceType;
/**
* 来源ID
*/
private Long sourceId;
/**
* 工单编号
*/
private String ticketNo;
/**
* 工单标题
*/
private String ticketTitle;
/**
* 工程编号
*/
private String projectNo;
/**
* 事故类型0=一般1=较严重2=严重
*/
private Short incidentType;
/**
* 异常代码
*/
private String exceptionCode;
/**
* 不合格数量
*/
private Integer unqualifiedQty;
/**
* 事件地点
*/
private String incidentLocation;
/**
* 状态0=待流转1=处理中2=已完成
*/
private Short status;
/**
* 审批状态0=通过1=驳回2=重检3=报废4=维修5=挑选使用6=让渡使用
*/
private Short approvalStatus;
/**
* 审批人姓名
*/
private String approvalUserName;
/**
* 审批时间
*/
private LocalDateTime approvalTime;
/**
* 创建人姓名
*/
private String createUserName;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新人姓名
*/
private String updateUserName;
/**
* 更新时间
*/
private LocalDateTime updateTime;
}

View File

@ -1,30 +1,31 @@
package com.nflg.wms.common.pojo.vo;
import com.nflg.wms.common.pojo.PageData;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* PDI动静态检测项 分页查询返回VO按状态分组
* PDI动静态检测项 分页查询返回VO按状态分组各自独立分页
*/
@Data
public class QmsPdiStatusItemGroupVO {
/**
* 静态检测项列表status=0
* 静态检测项status=0分页
*/
private List<QmsPdiStatusItemVO> staticItems;
private PageData<QmsPdiStatusItemVO> staticItems;
/**
* 动态检测项列表status=1
* 动态检测项status=1分页
*/
private List<QmsPdiStatusItemVO> dynamicItems;
private PageData<QmsPdiStatusItemVO> dynamicItems;
/**
* 特殊检测项列表status=2
* 特殊检测项status=2分页
*/
private List<QmsPdiStatusItemVO> specialItems;
private PageData<QmsPdiStatusItemVO> specialItems;
@Data
public static class QmsPdiStatusItemVO {

View File

@ -68,9 +68,9 @@ public class QmsPdiTaskRecordDetailVO {
private PageData<StatusItemVO> specialItems;
/**
* 准备发货列表inspection_item_type=2分页
* 准备发货inspection_item_type=2分页
*/
private PageData<LoadingItemVO> loadingItems;
private LoadingItemVO loadingItems;
/**
* 静态/动态/特殊检测项 子VO

View File

@ -44,4 +44,19 @@ public class QmsIncomingInspectionTaskRecordItem implements Serializable {
* 备注
*/
private String remark;
/**
* 样本数量
*/
private Integer inspectionQty;
/**
* 合格数量
*/
private Integer qualifiedQty;
/**
* 不合格数量
*/
private Integer unqualifiedQty;
}

View File

@ -51,5 +51,5 @@ public class QmsIncomingInspectionTaskRecordItemData {
/**
* 图片id列表多个逗号分隔
*/
private String images;
private String imageIds;
}

View File

@ -1,8 +1,11 @@
package com.nflg.wms.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketInspectionRecordItemVO;
import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskRecordItem;
import java.util.List;
/**
* <p>
* 来料检验任务检验记录子项 Mapper 接口
@ -13,4 +16,5 @@ import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskRecordItem;
*/
public interface QmsIncomingInspectionTaskRecordItemMapper extends BaseMapper<QmsIncomingInspectionTaskRecordItem> {
List<QmsIssueTicketInspectionRecordItemVO> getNonconformanceDataGroups(Long recordId);
}

View File

@ -1,8 +1,11 @@
package com.nflg.wms.repository.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketInspectionRecordItemVO;
import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskRecordItem;
import java.util.List;
/**
* <p>
* 来料检验任务检验记录子项 服务类
@ -13,4 +16,5 @@ import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskRecordItem;
*/
public interface IQmsIncomingInspectionTaskRecordItemService extends IService<QmsIncomingInspectionTaskRecordItem> {
List<QmsIssueTicketInspectionRecordItemVO> getNonconformanceDataGroups(Long recordId);
}

View File

@ -1,5 +1,8 @@
package com.nflg.wms.repository.service;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.QmsIssueTicketSearchQO;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketVO;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.wms.repository.entity.QmsIssueTicket;
@ -7,4 +10,9 @@ import com.nflg.wms.repository.entity.QmsIssueTicket;
* 质量问题工单 Service
*/
public interface IQmsIssueTicketService extends IService<QmsIssueTicket> {
/**
* 分页查询质量问题工单列表
*/
PageData<QmsIssueTicketVO> search(QmsIssueTicketSearchQO request);
}

View File

@ -1,11 +1,14 @@
package com.nflg.wms.repository.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketInspectionRecordItemVO;
import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskRecordItem;
import com.nflg.wms.repository.mapper.QmsIncomingInspectionTaskRecordItemMapper;
import com.nflg.wms.repository.service.IQmsIncomingInspectionTaskRecordItemService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 来料检验任务检验记录子项 服务实现类
@ -17,4 +20,8 @@ import org.springframework.stereotype.Service;
@Service
public class QmsIncomingInspectionTaskRecordItemServiceImpl extends ServiceImpl<QmsIncomingInspectionTaskRecordItemMapper, QmsIncomingInspectionTaskRecordItem>
implements IQmsIncomingInspectionTaskRecordItemService {
@Override
public List<QmsIssueTicketInspectionRecordItemVO> getNonconformanceDataGroups(Long recordId) {
return baseMapper.getNonconformanceDataGroups(recordId);
}
}

View File

@ -1,11 +1,23 @@
package com.nflg.wms.repository.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.QmsIssueTicketSearchQO;
import com.nflg.wms.common.pojo.vo.QmsIssueTicketVO;
import com.nflg.wms.repository.entity.QmsIssueTicket;
import com.nflg.wms.repository.mapper.QmsIssueTicketMapper;
import com.nflg.wms.repository.service.IQmsIssueTicketService;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import java.util.stream.Collectors;
/**
* 质量问题工单 ServiceImpl
*/
@ -13,4 +25,34 @@ import org.springframework.stereotype.Service;
public class QmsIssueTicketServiceImpl
extends ServiceImpl<QmsIssueTicketMapper, QmsIssueTicket>
implements IQmsIssueTicketService {
@Override
public PageData<QmsIssueTicketVO> search(QmsIssueTicketSearchQO request) {
Page<QmsIssueTicket> page = new Page<>(request.getPage(), request.getPageSize());
var query = lambdaQuery()
.like(StrUtil.isNotBlank(request.getTicketNo()), QmsIssueTicket::getTicketNo, request.getTicketNo())
.like(StrUtil.isNotBlank(request.getTicketTitle()), QmsIssueTicket::getTicketTitle, request.getTicketTitle())
.like(StrUtil.isNotBlank(request.getProjectNo()), QmsIssueTicket::getProjectNo, request.getProjectNo())
.eq(StrUtil.isNotBlank(request.getExceptionCode()), QmsIssueTicket::getExceptionCode, request.getExceptionCode())
.eq(request.getTicketType() != null, QmsIssueTicket::getSourceType, request.getTicketType())
.eq(request.getStatus() != null, QmsIssueTicket::getStatus, request.getStatus())
.eq(request.getIncidentType() != null, QmsIssueTicket::getIncidentType, request.getIncidentType())
.ge(request.getCreateTimeStart() != null, QmsIssueTicket::getCreateTime, request.getCreateTimeStart().atStartOfDay())
.le(request.getCreateTimeEnd() != null, QmsIssueTicket::getCreateTime, request.getCreateTimeEnd().atTime(LocalTime.MAX))
.orderByDesc(QmsIssueTicket::getCreateTime);
IPage<QmsIssueTicket> result = query.page(page);
List<QmsIssueTicketVO> voList = result.getRecords().stream()
.map(entity -> BeanUtil.copyProperties(entity, QmsIssueTicketVO.class))
.collect(Collectors.toList());
PageData<QmsIssueTicketVO> pageData = new PageData<>();
pageData.setPage((int) result.getCurrent());
pageData.setPageSize((int) result.getSize());
pageData.setTotal((int) result.getTotal());
pageData.setItems(voList);
return pageData;
}
}

View File

@ -34,13 +34,14 @@
t.inspection_finish_time,
t.required_finish_time,
t.is_overdue,
t.related_task_no,
t2.task_no as related_task_no,
t.update_user_id,
t.update_user_name,
t.update_time
FROM qms_incoming_inspection_task t
LEFT JOIN qms_qc_material m ON t.material_id = m.id
LEFT JOIN qms_inspection_standard s ON t.inspection_standard_id = s.id
LEFT JOIN qms_incoming_inspection_task t2 ON t.related_task_id = t2.id
<where>
<if test="request.dataType != null">
AND t.data_type = #{request.dataType}

View File

@ -2,4 +2,11 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.nflg.wms.repository.mapper.QmsIncomingInspectionTaskRecordItemMapper">
<select id="getNonconformanceDataGroups"
resultType="com.nflg.wms.common.pojo.vo.QmsIssueTicketInspectionRecordItemVO">
SELECT isic."id",CASE WHEN isi.item_type=0 THEN isi.name ELSE isic."name" END,isic.legend,iitri.unqualified_qty
FROM qms_incoming_inspection_task_record_item iitri
INNER JOIN qms_inspection_standard_item_content isic ON iitri.inspection_standard_item_content_id=isic."id"
INNER JOIN qms_inspection_standard_item isi ON isic.inspection_standard_item_id=isi."id"
</select>
</mapper>