Compare commits

...

2 Commits

Author SHA1 Message Date
曹鹏飞 8acd4fa0ff feat(qms): 增加来料检验任务不合格管理功能
- 新增QmsIncomingInspectionTaskNonconformance实体及数据库映射
- 添加来料检验任务不合格管理分页查询接口及实现
- 引入不合格管理查询条件支持多维度筛选
- 新建不合格管理Mapper及对应XML配置,实现复杂查询
- 扩展VO层,增加不合格管理相关字段展示
- 新增REST Controller,支持不合格管理数据分页查询
- 新增来料检验任务查询功能完善及关联字段扩展
2026-04-24 17:49:38 +08:00
曹鹏飞 5727b7a8f1 feat(service): 实现来料检验任务相关核心业务逻辑
- 新增来料检验任务控制服务类,实现来料检验和库存检测申请接口
- 实现质检人员自动分配逻辑,支持物料和物料类别绑定递归查找
- 完善AQL类型计算和抽样严格性转移规则逻辑,自动调整抽样方案
- 实现任务待检验列表、任务详情、当前用户任务统计等查询功能
- 实现检验任务转办功能,支持代办人校验和批量更新
- 实现检验项目获取、检验记录增删改查及检验结果提交与暂存功能
- 新增相关持久层接口,包含检验标准、抽样方案、检验任务记录服务
- 新增检验任务检验详情、检验项目VO,支持检验项显示及样本数量计算
2026-04-24 16:58:36 +08:00
36 changed files with 1192 additions and 46 deletions

View File

@ -3,15 +3,15 @@ package com.nflg.qms.admin.controller;
import com.nflg.qms.admin.service.IncomingInspectionTaskControllerService;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.QmsIncomingInspectionTaskSearchQO;
import com.nflg.wms.common.pojo.qo.QmsIncomingInspectionTaskTodoSearchQO;
import com.nflg.wms.common.pojo.qo.QmsIncomingInspectionTaskTransferQO;
import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskCheckDetailVO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskCountVO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskVO;
import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskRecord;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ -74,4 +74,43 @@ public class QmsIncomingInspectionTaskController extends BaseController {
public ApiResult<List<QmsIncomingInspectionTaskRecord>> getRecords(@RequestParam Long taskId){
return ApiResult.success(incomingInspectionTaskControllerService.getRecords(taskId));
}
/**
* 查询待检测项
*/
@PostMapping("pad/items-for-check")
public ApiResult<QmsIncomingInspectionTaskCheckDetailVO> getItemsForCheck(@Valid @RequestBody QmsIncomingInspectionTaskTodoCheckItemsQO request){
return ApiResult.success(incomingInspectionTaskControllerService.getItemsForCheck(request));
}
/**
* 提交检测项
*/
@Transactional
@PostMapping("pad/add-check-item")
public ApiResult<Void> addCheckItem(@Valid @RequestBody QmsIncomingInspectionTaskTodoCheckSubmitQO request){
incomingInspectionTaskControllerService.submitCheckItem(request);
return ApiResult.success();
}
/**
* 暂存检验结果
*/
@Transactional
@PostMapping("pad/staging")
public ApiResult<Void> staging(@Valid @RequestBody QmsIncomingInspectionTaskSubmitQO request){
incomingInspectionTaskControllerService.staging(request);
return ApiResult.success();
}
/**
* 提交检验结果
*/
@Transactional
@PostMapping("pad/submit")
public ApiResult<Void> submit(@Valid @RequestBody QmsIncomingInspectionTaskSubmitQO request){
incomingInspectionTaskControllerService.submit(request);
return ApiResult.success();
}
}

View File

@ -0,0 +1,33 @@
package com.nflg.qms.admin.controller;
import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.QmsIncomingInspectionTaskNonconformanceSearchQO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskNonconformanceVO;
import com.nflg.wms.repository.service.IQmsIncomingInspectionTaskNonconformanceService;
import com.nflg.wms.starter.BaseController;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 来料检验任务不合格管理
*/
@RestController
@RequestMapping("/incoming-inspection-task-nonconformance")
public class QmsIncomingInspectionTaskNonconformanceController extends BaseController {
@Resource
private IQmsIncomingInspectionTaskNonconformanceService nonconformanceService;
/**
* 分页查询来料检验任务不合格管理列表
*/
@PostMapping("search")
public ApiResult<PageData<QmsIncomingInspectionTaskNonconformanceVO>> search(@Valid @RequestBody QmsIncomingInspectionTaskNonconformanceSearchQO request) {
return ApiResult.success(nonconformanceService.search(request));
}
}

View File

@ -6,11 +6,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.nflg.wms.common.constant.STATE;
import com.nflg.wms.common.exception.NflgException;
import com.nflg.wms.common.pojo.qo.ExternalIncomingInspectionApplyQO;
import com.nflg.wms.common.pojo.qo.ExternalInventoryInspectionApplyQO;
import com.nflg.wms.common.pojo.qo.QmsIncomingInspectionTaskSearchQO;
import com.nflg.wms.common.pojo.qo.QmsIncomingInspectionTaskTodoSearchQO;
import com.nflg.wms.common.pojo.qo.QmsIncomingInspectionTaskTransferQO;
import com.nflg.wms.common.pojo.qo.*;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskCheckDetailVO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskCheckItemVO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskCountVO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskVO;
import com.nflg.wms.common.util.UserUtil;
@ -18,6 +16,7 @@ import com.nflg.wms.common.util.VUtil;
import com.nflg.wms.repository.entity.*;
import com.nflg.wms.repository.service.*;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.stereotype.Component;
@ -37,9 +36,6 @@ public class IncomingInspectionTaskControllerService {
@Resource
private IQmsIncomingInspectionTaskService incomingInspectionTaskService;
@Resource
private IQmsInspectionStandardItemService inspectionStandardItemService;
@Resource
private IQmsQualityInspectorService qualityInspectorService;
@ -52,6 +48,9 @@ public class IncomingInspectionTaskControllerService {
@Resource
private IQmsInspectionStandardService inspectionStandardService;
@Resource
private IQmsInspectionStandardItemService inspectionStandardItemService;
@Resource
private BasdeSerialNumberControllerService basdeSerialNumberControllerService;
@ -79,6 +78,21 @@ public class IncomingInspectionTaskControllerService {
@Resource
private IQmsIncomingInspectionTaskRecordService incomingInspectionTaskRecordService;
@Resource
private IQmsIncomingInspectionTaskRecordItemService incomingInspectionTaskRecordItemService;
@Resource
private IQmsIncomingInspectionTaskRecordItemDataService incomingInspectionTaskRecordItemDataService;
@Resource
private IQmsSamplingPlanService samplingPlanService;
@Resource
private IQmsSamplingPlanInspectionService samplingPlanInspectionService;
@Resource
private IQmsCodeLetterMatrixService codeLetterMatrixService;
/**
* 来料检验申请对外接口
* 业务规则
@ -575,4 +589,194 @@ public class IncomingInspectionTaskControllerService {
.eq(QmsIncomingInspectionTaskRecord::getTaskId, taskId)
.list();
}
public QmsIncomingInspectionTaskCheckDetailVO getItemsForCheck(@Valid QmsIncomingInspectionTaskTodoCheckItemsQO request) {
QmsIncomingInspectionTask task = incomingInspectionTaskService.getById(request.getTaskId());
VUtil.trueThrowBusinessError(Objects.isNull(task)).throwMessage("任务不存在");
QmsInspectionStandard standard = inspectionStandardService.getById(task.getInspectionStandardId());
VUtil.trueThrowBusinessError(Objects.isNull(standard)).throwMessage("检验标准不存在");
List<QmsIncomingInspectionTaskCheckItemVO> datas = inspectionStandardService.getItemsForCheck(standard.getId());
VUtil.trueThrowBusinessError(CollectionUtil.isEmpty(datas)).throwMessage("未设置检验项目");
Integer count = incomingInspectionTaskRecordService.getCount(task.getId());
Integer total;
if (Objects.equals(standard.getTestingMethodDictItemId(), dictionaryItemService.getIdByCode("InspectionStandardTestingMethod", "Full"))) {
total = task.getInspectionQty();
} else {
total = getCountOfSampling(task.getId(), task.getInspectionQty(), standard);
}
VUtil.trueThrowBusinessError(count > total).throwMessage("样本数量不能大于总数量");
return new QmsIncomingInspectionTaskCheckDetailVO()
.setItems(datas)
.setCount(total - count)
.setPdfDrawings(
inspectionStandardItemService.lambdaQuery()
.select(QmsInspectionStandardItem::getPdfDrawing)
.eq(QmsInspectionStandardItem::getInspectionStandardId, standard.getId())
.list()
.stream()
.map(QmsInspectionStandardItem::getPdfDrawing)
.toList()
);
}
private Integer getCountOfSampling(Long taskId, Integer inspectionQty, QmsInspectionStandard standard) {
QmsSamplingPlan samplingPlan = samplingPlanService.getById(standard.getSamplingPlanId());
VUtil.trueThrowBusinessError(Objects.isNull(samplingPlan)).throwMessage("抽样方案不存在");
Long codeLetterId = getCodeLetter(samplingPlan.getId(), standard.getInspectionLevelDictItemId(), inspectionQty);
QmsIncomingInspectionTaskAqlRule incomingInspectionTaskAqlRule = incomingInspectionTaskAqlRuleService.lambdaQuery()
.eq(QmsIncomingInspectionTaskAqlRule::getTaskId, taskId)
.one();
VUtil.trueThrowBusinessError(Objects.isNull(incomingInspectionTaskAqlRule)).throwMessage("该任务未设置AQL类型");
DictionaryItem dictionaryItem = dictionaryItemService.getById(incomingInspectionTaskAqlRule.getUsedAqlType());
Integer aqltype = StrUtil.contains(dictionaryItem.getName(), "正常")
? 0
: (StrUtil.contains(dictionaryItem.getName(), "加严") ? 1 : 2);
QmsCodeLetterMatrix codeLetterMatrix = codeLetterMatrixService.lambdaQuery()
.eq(QmsCodeLetterMatrix::getSamplingPlanId, samplingPlan.getId())
.eq(QmsCodeLetterMatrix::getCodeLetterId, codeLetterId)
.eq(QmsCodeLetterMatrix::getInspectionType, aqltype)
.last("LIMIT 1")
.one();
VUtil.trueThrowBusinessError(Objects.isNull(codeLetterMatrix)).throwMessage("未找到对应的字码矩阵");
return codeLetterMatrix.getSampleSize();
}
private Long getCodeLetter(Long planId, Long inspectionLevelDictItemId, Integer inspectionQty) {
QmsSamplingPlanInspection samplingPlanInspection = samplingPlanInspectionService.lambdaQuery()
.eq(QmsSamplingPlanInspection::getSamplingPlanId, planId)
.eq(QmsSamplingPlanInspection::getInspectionDictionaryItemId, inspectionLevelDictItemId)
.le(QmsSamplingPlanInspection::getRangeStart, inspectionQty)
.ge(QmsSamplingPlanInspection::getRangeEnd, inspectionQty)
.one();
VUtil.trueThrowBusinessError(Objects.isNull(samplingPlanInspection)).throwMessage("未找到对应的检验水平");
return samplingPlanInspection.getCodeLetterId();
}
public void submitCheckItem(QmsIncomingInspectionTaskTodoCheckSubmitQO request) {
QmsIncomingInspectionTaskRecord record = new QmsIncomingInspectionTaskRecord()
.setId(request.getId())
.setTaskId(request.getTaskId())
.setMaterialUniqueNo(request.getMaterialUniqueNo())
.setQualifiedQty(request.getQualifiedQty())
.setUnqualifiedQty(request.getUnqualifiedQty())
.setInspectionQty(request.getInspectionQty())
.setQualified(Objects.equals(request.getQualifiedQty(), request.getInspectionQty()))
.setCreateUserId(UserUtil.getUserId())
.setCreateUserName(UserUtil.getUserName())
.setCreateTime(LocalDateTime.now());
incomingInspectionTaskRecordService.saveOrUpdate(record);
request.getItems().forEach(item -> {
QmsIncomingInspectionTaskRecordItem ditem = new QmsIncomingInspectionTaskRecordItem()
.setId(item.getId())
.setRecordId(record.getId())
.setRemark(item.getRemark())
.setInspectionStandardItemContentId(item.getInspectionStandardItemContentId());
incomingInspectionTaskRecordItemService.saveOrUpdate(ditem);
item.getDatas().forEach(data -> {
QmsIncomingInspectionTaskRecordItemData ddata = new QmsIncomingInspectionTaskRecordItemData()
.setId(data.getId())
.setTaskId(record.getTaskId())
.setItemId(ditem.getId())
.setQualified(data.getQualified())
.setMeasuredValue(data.getMeasuredValue())
.setImages(StrUtil.join(",",data.getImages()));
incomingInspectionTaskRecordItemDataService.saveOrUpdate(ddata);
});
});
}
/**
* 暂存检验结果
* 1. 根据任务ID查询所有样本记录
* 2. 计算合格数量和不合格数量
* 3. 更新任务的合格数量不合格数量检验结果
* 4. 如果检验开始时间为空则更新检验开始时间
*/
@Transactional
public void staging(QmsIncomingInspectionTaskSubmitQO request) {
QmsIncomingInspectionTask task = incomingInspectionTaskService.getById(request.getTaskId());
VUtil.trueThrowBusinessError(Objects.isNull(task)).throwMessage("任务不存在");
// 查询该任务下所有检验记录
List<QmsIncomingInspectionTaskRecord> records = incomingInspectionTaskRecordService.lambdaQuery()
.eq(QmsIncomingInspectionTaskRecord::getTaskId, request.getTaskId())
.list();
// 计算合格数量和不合格数量
int qualifiedQty = records.stream()
.map(QmsIncomingInspectionTaskRecord::getQualifiedQty)
.reduce(0, Integer::sum);
int unqualifiedQty = records.stream()
.map(QmsIncomingInspectionTaskRecord::getUnqualifiedQty)
.reduce(0, Integer::sum);
Long userId = UserUtil.getUserId();
String userName = UserUtil.getUserName();
LocalDateTime now = LocalDateTime.now();
// 构建更新对象
var updateWrapper = incomingInspectionTaskService.lambdaUpdate()
.eq(QmsIncomingInspectionTask::getId, request.getTaskId())
.ne(QmsIncomingInspectionTask::getInspectionStatus, 2)
.set(QmsIncomingInspectionTask::getQualifiedQty, qualifiedQty)
.set(QmsIncomingInspectionTask::getUnqualifiedQty, unqualifiedQty)
.set(QmsIncomingInspectionTask::getInspectionResult, request.getQualified())
.set(QmsIncomingInspectionTask::getUpdateUserId, userId)
.set(QmsIncomingInspectionTask::getUpdateUserName, userName)
.set(QmsIncomingInspectionTask::getUpdateTime, now);
// 如果检验开始时间为空则更新检验开始时间
if (Objects.isNull(task.getInspectionStartTime())) {
updateWrapper.set(QmsIncomingInspectionTask::getInspectionStartTime, request.getInspectionStartTime());
updateWrapper.set(QmsIncomingInspectionTask::getInspectionStatus, 1);
}
updateWrapper.update();
}
public void submit(@Valid QmsIncomingInspectionTaskSubmitQO request) {
QmsIncomingInspectionTask task = incomingInspectionTaskService.getById(request.getTaskId());
VUtil.trueThrowBusinessError(Objects.isNull(task)).throwMessage("任务不存在");
// 查询该任务下所有检验记录
List<QmsIncomingInspectionTaskRecord> records = incomingInspectionTaskRecordService.lambdaQuery()
.eq(QmsIncomingInspectionTaskRecord::getTaskId, request.getTaskId())
.list();
// 计算合格数量和不合格数量
int qualifiedQty = records.stream()
.map(QmsIncomingInspectionTaskRecord::getQualifiedQty)
.reduce(0, Integer::sum);
int unqualifiedQty = records.stream()
.map(QmsIncomingInspectionTaskRecord::getUnqualifiedQty)
.reduce(0, Integer::sum);
Long userId = UserUtil.getUserId();
String userName = UserUtil.getUserName();
LocalDateTime now = LocalDateTime.now();
// 构建更新对象
var updateWrapper = incomingInspectionTaskService.lambdaUpdate()
.eq(QmsIncomingInspectionTask::getId, request.getTaskId())
.ne(QmsIncomingInspectionTask::getInspectionStatus, 2)
.set(QmsIncomingInspectionTask::getQualifiedQty, qualifiedQty)
.set(QmsIncomingInspectionTask::getUnqualifiedQty, unqualifiedQty)
.set(QmsIncomingInspectionTask::getInspectionResult, request.getQualified())
.set(QmsIncomingInspectionTask::getInspectionStatus, 2)
.set(QmsIncomingInspectionTask::getInspectionFinishTime, LocalDateTime.now())
.set(QmsIncomingInspectionTask::getUpdateUserId, userId)
.set(QmsIncomingInspectionTask::getUpdateUserName, userName)
.set(QmsIncomingInspectionTask::getUpdateTime, now);
// 如果检验开始时间为空则更新检验开始时间
if (Objects.isNull(task.getInspectionStartTime())) {
updateWrapper.set(QmsIncomingInspectionTask::getInspectionStartTime, request.getInspectionStartTime());
}
updateWrapper.update();
if (!request.getQualified()) {
//TODO
}
}
}

View File

@ -0,0 +1,104 @@
package com.nflg.wms.common.pojo.qo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDate;
/**
* 来料检验任务不合格管理 - 分页查询QO
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class QmsIncomingInspectionTaskNonconformanceSearchQO extends PageQO {
/**
* 类型0来料1盘库
*/
private Integer dataType;
/**
* 物料编码模糊匹配
*/
private String materialNo;
/**
* 采购单号模糊匹配
*/
private String purchaseOrderNo;
/**
* 供应商名称模糊匹配
*/
private String supplierName;
/**
* 检验人姓名模糊匹配
*/
private String inspectorName;
/**
* 检验状态0=待检1=检验中2=已检
*/
private Short inspectionStatus;
/**
* 所属工厂
*/
private String factory;
/**
* 所属仓库
*/
private String warehouse;
/**
* 送货单号模糊匹配
*/
private String deliveryOrderNo;
/**
* 检验结果true=合格false=不合格
*/
private Boolean inspectionResult;
/**
* 是否超期true=超期false=未超期
*/
private Boolean isOverdue;
/**
* 送检日期开始
*/
private LocalDate submitStartDate;
/**
* 送检日期结束
*/
private LocalDate submitEndDate;
/**
* 检验开始日期开始检验开始时间
*/
private LocalDate inspectionBeginStartDate;
/**
* 检验开始日期结束检验开始时间
*/
private LocalDate inspectionBeginEndDate;
/**
* 检测日期开始检验完成时间
*/
private LocalDate inspectionStartDate;
/**
* 检测日期结束检验完成时间
*/
private LocalDate inspectionEndDate;
/**
* 不合格处理状态0=待办1=处理中2=处理完成
*/
private Short nonconformanceStatus;
}

View File

@ -47,6 +47,11 @@ public class QmsIncomingInspectionTaskSearchQO extends PageQO {
*/
private String factory;
/**
* 所属仓库
*/
private String warehouse;
/**
* 送货单号模糊匹配
*/

View File

@ -0,0 +1,28 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class QmsIncomingInspectionTaskSubmitQO {
/**
* 任务ID
*/
@NotNull(message = "任务ID不能为空")
private Long taskId;
/**
* 检验结果true=合格false=不合格
*/
@NotNull(message = "检验结果不能为空")
private Boolean qualified;
/**
* 检验开始时间
*/
@NotNull(message = "检验开始时间不能为空")
private LocalDateTime inspectionStartTime;
}

View File

@ -0,0 +1,20 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Data
public class QmsIncomingInspectionTaskTodoCheckItemsQO {
/**
* 任务id
*/
@NotNull(message = "任务id不能为空")
private Long taskId;
/**
* 数量二维码上的数量
*/
@NotNull(message = "数量不能为空")
private Integer num;
}

View File

@ -0,0 +1,29 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class QmsIncomingInspectionTaskTodoCheckSubmitItemDataQO {
private Long id;
/**
* 测量值
*/
private BigDecimal measuredValue;
/**
* 是否合格
*/
@NotNull(message = "是否合格不能为空")
private Boolean qualified;
/**
* 图片列表
*/
private List<String> images;
}

View File

@ -0,0 +1,29 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
@Data
public class QmsIncomingInspectionTaskTodoCheckSubmitItemQO {
private Long id;
/**
* 检验标准项内容ID
*/
@NotNull(message = "检验标准项内容ID不能为空")
private Long inspectionStandardItemContentId;
/**
* 备注
*/
private String remark;
@Valid
@NotEmpty(message = "样本列表不能为空")
private List<QmsIncomingInspectionTaskTodoCheckSubmitItemDataQO> datas;
}

View File

@ -0,0 +1,48 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
@Data
public class QmsIncomingInspectionTaskTodoCheckSubmitQO {
private Long id;
/**
* 任务ID
*/
@NotNull(message = "任务ID不能为空")
private Long taskId;
/**
* 物料唯一编号
*/
@NotNull(message = "物料唯一编号不能为空")
private String materialUniqueNo;
/**
* 样本数量
*/
@NotNull(message = "样本数量不能为空")
private Integer inspectionQty;
/**
* 合格数量
*/
@NotNull(message = "合格数量不能为空")
private Integer qualifiedQty;
/**
* 不合格数量
*/
@NotNull(message = "不合格数量不能为空")
private Integer unqualifiedQty;
@Valid
@NotEmpty
private List<QmsIncomingInspectionTaskTodoCheckSubmitItemQO> items;
}

View File

@ -0,0 +1,26 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
public class QmsIncomingInspectionTaskCheckDetailVO {
/**
* pdf图纸列表
*/
private List<String> pdfDrawings;
/**
* 样本数量
*/
private Integer count;
/**
* 检查项列表
*/
private List<QmsIncomingInspectionTaskCheckItemVO> items;
}

View File

@ -0,0 +1,37 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
@Data
public class QmsIncomingInspectionTaskCheckItemVO {
/**
* 检查项内容ID
*/
private Long itemContentId;
/**
* 检验标准项类型0-标准检测项1-尺寸检测项
*/
private Short itemType;
/**
* 检测项名称
*/
private String name;
/**
* 检测标准
*/
private String testStandard;
/**
* 图例
*/
private String legend;
/**
* 判定类型0直接判定1测量值
*/
private Integer judgmentType;
}

View File

@ -0,0 +1,177 @@
package com.nflg.wms.common.pojo.vo;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 来料检验任务不合格管理 - 查询VO
*/
@Data
public class QmsIncomingInspectionTaskNonconformanceVO {
/**
* 不合格管理记录ID
*/
private Long id;
/**
* 来料检验任务ID
*/
private Long taskId;
/**
* 检测单号
*/
private String taskNo;
/**
* 物料id
*/
private Long materialId;
/**
* 物料编码
*/
private String materialNo;
/**
* 物料描述
*/
private String materialDesc;
/**
* 图号版本号
*/
private String drawingNoVer;
/**
* 供应商编号
*/
private String supplierCode;
/**
* 供应商名称
*/
private String supplierName;
/**
* 送货单号
*/
private String deliveryOrderNo;
/**
* 送货单行号
*/
private String deliveryOrderLine;
/**
* 采购单号
*/
private String purchaseOrderNo;
/**
* 采购单行号
*/
private String purchaseOrderLine;
/**
* 所属工厂
*/
private String factory;
/**
* 检测类型0来料检测1盘库检测
*/
private Integer inspectionType;
/**
* 检验数量
*/
private Integer inspectionQty;
/**
* 合格数量
*/
private Integer qualifiedQty;
/**
* 不合格数量
*/
private Integer unqualifiedQty;
/**
* 检验状态0=待检1=检验中2=已检
*/
private Short inspectionStatus;
/**
* 检验结果true=合格false=不合格
*/
private Boolean inspectionResult;
/**
* 检验人id
*/
private Long inspectorId;
/**
* 检验人姓名
*/
private String inspectorName;
/**
* 送检时间
*/
private LocalDateTime submitTime;
/**
* 检验开始时间
*/
private LocalDateTime inspectionStartTime;
/**
* 检验完成时间
*/
private LocalDateTime inspectionFinishTime;
/**
* 要求完成时间
*/
private LocalDateTime requiredFinishTime;
/**
* 是否超期true=超期false=未超期
*/
private Boolean isOverdue;
/**
* 不合格处理状态0=待办1=处理中2=处理完成
*/
private Short nonconformanceStatus;
/**
* 不合格处理状态名称
*/
private String nonconformanceStatusName;
/**
* 不合格记录创建人ID
*/
private Long nonconformanceCreateUserId;
/**
* 不合格记录创建人姓名
*/
private String nonconformanceCreateUserName;
/**
* 不合格记录创建时间
*/
private LocalDateTime nonconformanceCreateTime;
/**
* 不合格记录更新时间
*/
private LocalDateTime nonconformanceUpdateTime;
}

View File

@ -0,0 +1,73 @@
package com.nflg.wms.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 来料检验任务不合格管理表
* </p>
*
* @author 代码生成器生成
* @since 2026
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
@TableName("qms_incoming_inspection_task_nonconformance")
public class QmsIncomingInspectionTaskNonconformance implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
/**
* 来料检验任务ID关联 qms_incoming_inspection_task
*/
private Long taskId;
/**
* 处理状态0=待办1=处理中2=处理完成
*/
private Short status;
/**
* 创建人ID
*/
private Long createUserId;
/**
* 创建人姓名
*/
private String createUserName;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新人ID
*/
private Long updateUserId;
/**
* 更新人姓名
*/
private String updateUserName;
/**
* 更新时间
*/
private LocalDateTime updateTime;
}

View File

@ -36,21 +36,6 @@ public class QmsIncomingInspectionTaskRecord implements Serializable {
*/
private Long taskId;
/**
* 检验标准id关联检验标准表
*/
private Long inspectionStandardId;
/**
* 检验标准项ID
*/
private Long inspectionStandardItemId;
/**
* 检验标准项内容ID
*/
private Long inspectionStandardItemContentId;
/**
* 物料唯一码
*/
@ -64,12 +49,17 @@ public class QmsIncomingInspectionTaskRecord implements Serializable {
/**
* 样本数量
*/
private Integer count;
private Integer inspectionQty;
/**
* 备注
* 合格数量
*/
private String remark;
private Integer qualifiedQty;
/**
* 不合格数量
*/
private Integer unqualifiedQty;
/**
* 创建人ID

View File

@ -9,7 +9,6 @@ import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* <p>
@ -31,28 +30,18 @@ public class QmsIncomingInspectionTaskRecordItem implements Serializable {
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
/**
* 来料检测任务id
*/
private Long taskId;
/**
* 来料检测任务记录id
*/
private Long recordId;
/**
* 测量值
* 检验标准项内容ID
*/
private BigDecimal measuredValue;
private Long inspectionStandardItemContentId;
/**
* 是否合格
* 备注
*/
private Boolean qualified;
/**
* 图片列表多个逗号分隔
*/
private String images;
private String remark;
}

View File

@ -0,0 +1,55 @@
package com.nflg.wms.repository.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
/**
* <p>
* 来料检验任务检验记录子项样本
* </p>
*
* @author 代码生成器生成
* @since 2026
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
@TableName("qms_incoming_inspection_task_record_item_data")
public class QmsIncomingInspectionTaskRecordItemData {
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
/**
* 来料检测任务id
*/
private Long taskId;
/**
* 来料检测任务记录项id
*/
private Long itemId;
/**
* 测量值
*/
private BigDecimal measuredValue;
/**
* 是否合格
*/
private Boolean qualified;
/**
* 图片列表多个逗号分隔
*/
private String images;
}

View File

@ -0,0 +1,19 @@
package com.nflg.wms.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.wms.common.pojo.qo.QmsIncomingInspectionTaskNonconformanceSearchQO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskNonconformanceVO;
import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskNonconformance;
/**
* 来料检验任务不合格管理 Mapper
*/
public interface QmsIncomingInspectionTaskNonconformanceMapper extends BaseMapper<QmsIncomingInspectionTaskNonconformance> {
/**
* 分页查询来料检验任务不合格管理列表
*/
IPage<QmsIncomingInspectionTaskNonconformanceVO> search(QmsIncomingInspectionTaskNonconformanceSearchQO request, Page<Object> page);
}

View File

@ -0,0 +1,16 @@
package com.nflg.wms.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskRecordItemData;
/**
* <p>
* 来料检验任务检验记录子项样本 Mapper 接口
* </p>
*
* @author 代码生成器生成
* @since 2026
*/
public interface QmsIncomingInspectionTaskRecordItemDataMapper extends BaseMapper<QmsIncomingInspectionTaskRecordItemData> {
}

View File

@ -8,4 +8,5 @@ import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskRecord;
*/
public interface QmsIncomingInspectionTaskRecordMapper extends BaseMapper<QmsIncomingInspectionTaskRecord> {
Integer getCount(Long taskId);
}

View File

@ -4,11 +4,14 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.wms.common.pojo.qo.QmsInspectionStandardSearchQO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskCheckItemVO;
import com.nflg.wms.common.pojo.vo.QmsInspectionStandardDetailVO;
import com.nflg.wms.common.pojo.vo.QmsInspectionStandardVO;
import com.nflg.wms.repository.entity.QmsInspectionStandard;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 检验标准 Mapper
*/
@ -23,4 +26,6 @@ public interface QmsInspectionStandardMapper extends BaseMapper<QmsInspectionSta
* 根据ID查询检验标准详情关联物料等信息
*/
QmsInspectionStandardDetailVO getDetailById(@Param("id") Long id);
List<QmsIncomingInspectionTaskCheckItemVO> getItemsForCheck(Long id);
}

View File

@ -7,4 +7,5 @@ import com.nflg.wms.repository.entity.QmsSamplingPlan;
* 抽样方案 Mapper
*/
public interface QmsSamplingPlanMapper extends BaseMapper<QmsSamplingPlan> {
}

View File

@ -0,0 +1,18 @@
package com.nflg.wms.repository.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.wms.common.pojo.qo.QmsIncomingInspectionTaskNonconformanceSearchQO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskNonconformanceVO;
import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskNonconformance;
/**
* 来料检验任务不合格管理 Service 接口
*/
public interface IQmsIncomingInspectionTaskNonconformanceService extends IService<QmsIncomingInspectionTaskNonconformance> {
/**
* 分页查询来料检验任务不合格管理列表
*/
IPage<QmsIncomingInspectionTaskNonconformanceVO> search(QmsIncomingInspectionTaskNonconformanceSearchQO request);
}

View File

@ -0,0 +1,16 @@
package com.nflg.wms.repository.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskRecordItemData;
/**
* <p>
* 来料检验任务检验记录子项样本 服务类
* </p>
*
* @author 代码生成器生成
* @since 2026
*/
public interface IQmsIncomingInspectionTaskRecordItemDataService extends IService<QmsIncomingInspectionTaskRecordItemData> {
}

View File

@ -8,4 +8,5 @@ import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskRecord;
*/
public interface IQmsIncomingInspectionTaskRecordService extends IService<QmsIncomingInspectionTaskRecord> {
Integer getCount(Long taskId);
}

View File

@ -1,6 +1,7 @@
package com.nflg.wms.repository.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskCheckItemVO;
import com.nflg.wms.repository.entity.QmsInspectionStandard;
import java.util.List;
@ -22,4 +23,6 @@ public interface IQmsInspectionStandardService extends IService<QmsInspectionSta
* @param enable 是否启用
*/
void enable(Long id, Boolean enable);
List<QmsIncomingInspectionTaskCheckItemVO> getItemsForCheck(Long id);
}

View File

@ -7,4 +7,5 @@ import com.nflg.wms.repository.entity.QmsSamplingPlan;
* 抽样方案 服务类
*/
public interface IQmsSamplingPlanService extends IService<QmsSamplingPlan> {
}

View File

@ -0,0 +1,23 @@
package com.nflg.wms.repository.service.impl;
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.qo.QmsIncomingInspectionTaskNonconformanceSearchQO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskNonconformanceVO;
import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskNonconformance;
import com.nflg.wms.repository.mapper.QmsIncomingInspectionTaskNonconformanceMapper;
import com.nflg.wms.repository.service.IQmsIncomingInspectionTaskNonconformanceService;
import org.springframework.stereotype.Service;
/**
* 来料检验任务不合格管理 Service 实现类
*/
@Service
public class QmsIncomingInspectionTaskNonconformanceServiceImpl extends ServiceImpl<QmsIncomingInspectionTaskNonconformanceMapper, QmsIncomingInspectionTaskNonconformance> implements IQmsIncomingInspectionTaskNonconformanceService {
@Override
public IPage<QmsIncomingInspectionTaskNonconformanceVO> search(QmsIncomingInspectionTaskNonconformanceSearchQO request) {
return baseMapper.search(request, new Page<>(request.getPage(), request.getPageSize()));
}
}

View File

@ -0,0 +1,20 @@
package com.nflg.wms.repository.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.repository.entity.QmsIncomingInspectionTaskRecordItemData;
import com.nflg.wms.repository.mapper.QmsIncomingInspectionTaskRecordItemDataMapper;
import com.nflg.wms.repository.service.IQmsIncomingInspectionTaskRecordItemDataService;
import org.springframework.stereotype.Service;
/**
* <p>
* 来料检验任务检验记录子项样本 服务实现类
* </p>
*
* @author 代码生成器生成
* @since 2026
*/
@Service
public class QmsIncomingInspectionTaskRecordItemDataServiceImpl extends ServiceImpl<QmsIncomingInspectionTaskRecordItemDataMapper, QmsIncomingInspectionTaskRecordItemData>
implements IQmsIncomingInspectionTaskRecordItemDataService {
}

View File

@ -12,4 +12,8 @@ import org.springframework.stereotype.Service;
@Service
public class QmsIncomingInspectionTaskRecordServiceImpl extends ServiceImpl<QmsIncomingInspectionTaskRecordMapper, QmsIncomingInspectionTaskRecord> implements IQmsIncomingInspectionTaskRecordService {
@Override
public Integer getCount(Long taskId) {
return baseMapper.getCount(taskId);
}
}

View File

@ -1,6 +1,8 @@
package com.nflg.wms.repository.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.wms.common.pojo.qo.QmsIncomingInspectionTaskTodoCheckItemsQO;
import com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskCheckItemVO;
import com.nflg.wms.common.util.UserUtil;
import com.nflg.wms.repository.entity.QmsInspectionStandard;
import com.nflg.wms.repository.mapper.QmsInspectionStandardMapper;
@ -54,4 +56,9 @@ public class QmsInspectionStandardServiceImpl extends ServiceImpl<QmsInspectionS
.set(QmsInspectionStandard::getUpdateTime, now)
.update();
}
@Override
public List<QmsIncomingInspectionTaskCheckItemVO> getItemsForCheck(Long id) {
return baseMapper.getItemsForCheck(id);
}
}

View File

@ -63,6 +63,9 @@
<if test="request.factory != null and request.factory != ''">
AND t.factory = #{request.factory}
</if>
<if test="request.warehouse != null and request.warehouse != ''">
AND t.warehouse = #{request.warehouse}
</if>
<if test="request.deliveryOrderNo != null and request.deliveryOrderNo != ''">
AND t.delivery_order_no ilike concat('%', #{request.deliveryOrderNo}, '%')
</if>
@ -126,13 +129,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>
<choose>
<when test="request.inspectionStatus != null">
@ -197,13 +201,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 t.id = #{id}
</select>

View File

@ -0,0 +1,106 @@
<?xml version="1.0" encoding="UTF-8"?>
<!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.QmsIncomingInspectionTaskNonconformanceMapper">
<select id="search" resultType="com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskNonconformanceVO">
SELECT
n.id,
n.task_id,
t.task_no,
t.material_id,
m.material_no,
m.material_desc,
m.drawing_no_ver,
t.supplier_code,
t.supplier_name,
t.delivery_order_no,
t.delivery_order_line,
t.purchase_order_no,
t.purchase_order_line,
t.factory,
t.inspection_type,
t.inspection_qty,
t.qualified_qty,
t.unqualified_qty,
t.inspection_status,
t.inspection_result,
t.inspector_id,
t.inspector_name,
t.submit_time,
t.inspection_start_time,
t.inspection_finish_time,
t.required_finish_time,
t.is_overdue,
n.status AS nonconformance_status,
CASE n.status
WHEN 0 THEN '待办'
WHEN 1 THEN '处理中'
WHEN 2 THEN '处理完成'
END AS nonconformance_status_name,
n.create_user_id AS nonconformance_create_user_id,
n.create_user_name AS nonconformance_create_user_name,
n.create_time AS nonconformance_create_time,
n.update_time AS nonconformance_update_time
FROM qms_incoming_inspection_task_nonconformance n
INNER JOIN qms_incoming_inspection_task t ON n.task_id = t.id
INNER JOIN qms_qc_material m ON t.material_id = m.id
<where>
<if test="request.dataType != null">
AND t.data_type = #{request.dataType}
</if>
<if test="request.materialNo != null and request.materialNo != ''">
AND m.material_no ilike concat('%', #{request.materialNo}, '%')
</if>
<if test="request.purchaseOrderNo != null and request.purchaseOrderNo != ''">
AND t.purchase_order_no ilike concat('%', #{request.purchaseOrderNo}, '%')
</if>
<if test="request.supplierName != null and request.supplierName != ''">
AND t.supplier_name ilike concat('%', #{request.supplierName}, '%')
</if>
<if test="request.inspectorName != null and request.inspectorName != ''">
AND t.inspector_name ilike concat('%', #{request.inspectorName}, '%')
</if>
<if test="request.inspectionStatus != null">
AND t.inspection_status = #{request.inspectionStatus}
</if>
<if test="request.factory != null and request.factory != ''">
AND t.factory = #{request.factory}
</if>
<if test="request.warehouse != null and request.warehouse != ''">
AND t.warehouse = #{request.warehouse}
</if>
<if test="request.deliveryOrderNo != null and request.deliveryOrderNo != ''">
AND t.delivery_order_no ilike concat('%', #{request.deliveryOrderNo}, '%')
</if>
<if test="request.inspectionResult != null">
AND t.inspection_result = #{request.inspectionResult}
</if>
<if test="request.isOverdue != null">
AND t.is_overdue = #{request.isOverdue}
</if>
<if test="request.submitStartDate != null">
AND t.submit_time &gt;= #{request.submitStartDate}
</if>
<if test="request.submitEndDate != null">
AND t.submit_time &lt; #{request.submitEndDate} + INTERVAL '1 day'
</if>
<if test="request.inspectionBeginStartDate != null">
AND t.inspection_start_time &gt;= #{request.inspectionBeginStartDate}
</if>
<if test="request.inspectionBeginEndDate != null">
AND t.inspection_start_time &lt; #{request.inspectionBeginEndDate} + INTERVAL '1 day'
</if>
<if test="request.inspectionStartDate != null">
AND t.inspection_finish_time &gt;= #{request.inspectionStartDate}
</if>
<if test="request.inspectionEndDate != null">
AND t.inspection_finish_time &lt; #{request.inspectionEndDate} + INTERVAL '1 day'
</if>
<if test="request.nonconformanceStatus != null">
AND n.status = #{request.nonconformanceStatus}
</if>
</where>
ORDER BY n.id DESC
</select>
</mapper>

View File

@ -2,4 +2,7 @@
<!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.QmsIncomingInspectionTaskRecordMapper">
<select id="getCount" resultType="java.lang.Integer">
SELECT SUM(count) FROM qms_incoming_inspection_task_record WHERE task_id=#{taskId}
</select>
</mapper>

View File

@ -89,4 +89,10 @@
s.create_user_id, s.create_user_name, s.create_time, s.update_user_id, s.update_user_name, s.update_time
</select>
<select id="getItemsForCheck" resultType="com.nflg.wms.common.pojo.vo.QmsIncomingInspectionTaskCheckItemVO">
SELECT qisic.id as "itemContentId",qisi.item_type,CASE WHEN qisi.item_type=0 THEN qisi.name ELSE qisic.name END as "name",qisic.test_standard,qisic.legend,qisic.judgment_type
FROM qms_inspection_standard_item qisi
INNER JOIN qms_inspection_standard_item_content qisic ON qisi."id"=qisic.inspection_standard_item_id
WHERE qisi.inspection_standard_id=#{id}
</select>
</mapper>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!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.QmsSamplingPlanMapper">
</mapper>