feat(qms): 新增及编辑检验标准功能,实现检测项及内容管理

- 在QmsInspectionStandardController新增新增(add)和编辑(edit)接口
- 新增QmsInspectionStandardControllerService实现检验标准业务逻辑
- 实现检验标准分页查询、详情查询及启用/禁用功能
- 实现新增检验标准及编辑检验标准,并包含检测项和检测项内容的增删改逻辑
- 实现检测项和检测项内容的新增、更新和删除,保证数据一致性和事务管理
- 添加异常处理,防止不存在的检验标准、检测项或检测项内容操作
- 新增暂存功能,允许暂存检验标准的检测项及内容数据
This commit is contained in:
曹鹏飞 2026-04-16 18:06:15 +08:00
parent 72aef97677
commit 793100f124
6 changed files with 245 additions and 54 deletions

View File

@ -5,6 +5,8 @@ import com.nflg.wms.common.pojo.ApiResult;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.EnableQO; import com.nflg.wms.common.pojo.qo.EnableQO;
import com.nflg.wms.common.pojo.qo.IdsQO; import com.nflg.wms.common.pojo.qo.IdsQO;
import com.nflg.wms.common.pojo.qo.QmsInspectionStandardAddQO;
import com.nflg.wms.common.pojo.qo.QmsInspectionStandardEditQO;
import com.nflg.wms.common.pojo.qo.QmsInspectionStandardSaveQO; import com.nflg.wms.common.pojo.qo.QmsInspectionStandardSaveQO;
import com.nflg.wms.common.pojo.qo.QmsInspectionStandardSearchQO; import com.nflg.wms.common.pojo.qo.QmsInspectionStandardSearchQO;
import com.nflg.wms.common.pojo.vo.QmsInspectionStandardDetailVO; import com.nflg.wms.common.pojo.vo.QmsInspectionStandardDetailVO;
@ -40,6 +42,23 @@ public class QmsInspectionStandardController extends BaseController {
return ApiResult.success(inspectionStandardControllerService.search(request)); return ApiResult.success(inspectionStandardControllerService.search(request));
} }
/**
* 新增检验标准
*/
@PostMapping("add")
public ApiResult<Long> add(@Valid @RequestBody QmsInspectionStandardAddQO request) {
return ApiResult.success(inspectionStandardControllerService.add(request));
}
/**
* 编辑检验标准
*/
@PostMapping("edit")
public ApiResult<Void> edit(@Valid @RequestBody QmsInspectionStandardEditQO request) {
inspectionStandardControllerService.edit(request);
return ApiResult.success();
}
/** /**
* 批量发布检验标准 * 批量发布检验标准
*/ */

View File

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.wms.common.exception.NflgException; import com.nflg.wms.common.exception.NflgException;
import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.PageData;
import com.nflg.wms.common.pojo.qo.QmsInspectionStandardAddQO;
import com.nflg.wms.common.pojo.qo.QmsInspectionStandardEditQO;
import com.nflg.wms.common.pojo.qo.QmsInspectionStandardSaveQO; import com.nflg.wms.common.pojo.qo.QmsInspectionStandardSaveQO;
import com.nflg.wms.common.pojo.qo.QmsInspectionStandardSearchQO; import com.nflg.wms.common.pojo.qo.QmsInspectionStandardSearchQO;
import com.nflg.wms.common.pojo.vo.QmsInspectionStandardDetailVO; import com.nflg.wms.common.pojo.vo.QmsInspectionStandardDetailVO;
@ -190,6 +192,150 @@ public class QmsInspectionStandardControllerService {
return vo; return vo;
} }
/**
* 新增检验标准包含检测项列表
* @param qo 新增请求参数
* @return 新增的检验标准ID
*/
@Transactional(rollbackFor = Exception.class)
public Long add(QmsInspectionStandardAddQO qo) {
Long userId = UserUtil.getUserId();
String userName = UserUtil.getUserName();
LocalDateTime now = LocalDateTime.now();
QmsInspectionStandard standard = new QmsInspectionStandard();
standard.setMaterialId(qo.getMaterialId());
standard.setInspectionTaskItemId(qo.getInspectionTaskItemId());
standard.setDrawingUrl(qo.getDrawingUrl());
standard.setVersionNo(qo.getVersionNo());
standard.setPackagingMethodId(qo.getPackagingMethodId());
standard.setInspectionCycle(qo.getInspectionCycle());
// 默认值
standard.setIsEnabled(true);
standard.setPublishStatus((short) 0);
// 审计字段
standard.setCreateUserId(userId);
standard.setCreateUserName(userName);
standard.setCreateTime(now);
standard.setUpdateUserId(userId);
standard.setUpdateUserName(userName);
standard.setUpdateTime(now);
inspectionStandardService.save(standard);
// 处理检测项列表
processItems(standard.getId(), qo.getItems(), userId, userName, now);
return standard.getId();
}
/**
* 编辑检验标准包含检测项列表
* @param qo 编辑请求参数
*/
@Transactional(rollbackFor = Exception.class)
public void edit(QmsInspectionStandardEditQO qo) {
// 1. 校验检验标准是否存在
QmsInspectionStandard standard = inspectionStandardService.getById(qo.getId());
if (standard == null) {
throw new NflgException(com.nflg.wms.common.constant.STATE.BusinessError, "检验标准不存在");
}
// 2. 已发布的标准不允许修改
if (standard.getPublishStatus() != null && standard.getPublishStatus() == 1) {
throw new NflgException(com.nflg.wms.common.constant.STATE.BusinessError, "已发布的检验标准不允许修改");
}
Long userId = UserUtil.getUserId();
String userName = UserUtil.getUserName();
LocalDateTime now = LocalDateTime.now();
// 3. 更新字段
standard.setMaterialId(qo.getMaterialId());
standard.setInspectionTaskItemId(qo.getInspectionTaskItemId());
standard.setDrawingUrl(qo.getDrawingUrl());
standard.setVersionNo(qo.getVersionNo());
standard.setPackagingMethodId(qo.getPackagingMethodId());
standard.setInspectionCycle(qo.getInspectionCycle());
// 审计字段
standard.setUpdateUserId(userId);
standard.setUpdateUserName(userName);
standard.setUpdateTime(now);
inspectionStandardService.updateById(standard);
// 4. 处理检测项列表
processItems(qo.getId(), qo.getItems(), userId, userName, now);
}
/**
* 处理检测项列表新增更新删除
* @param inspectionStandardId 检验标准ID
* @param items 检测项列表
* @param userId 用户ID
* @param userName 用户名
* @param now 当前时间
*/
private void processItems(Long inspectionStandardId,
List<QmsInspectionStandardSaveQO.InspectionStandardItemQO> items,
Long userId, String userName, LocalDateTime now) {
if (items == null) {
return;
}
// 获取该检验标准下所有现有的检测项ID
List<Long> existingItemIds = inspectionStandardItemService.lambdaQuery()
.eq(QmsInspectionStandardItem::getInspectionStandardId, inspectionStandardId)
.list()
.stream()
.map(QmsInspectionStandardItem::getId)
.collect(Collectors.toList());
// 处理传入的检测项
List<Long> newItemIds = new ArrayList<>();
for (QmsInspectionStandardSaveQO.InspectionStandardItemQO itemQO : items) {
QmsInspectionStandardItem item;
if (itemQO.getId() != null) {
// 更新现有检测项
item = inspectionStandardItemService.getById(itemQO.getId());
if (item == null) {
throw new NflgException(com.nflg.wms.common.constant.STATE.BusinessError, "检测项不存在:" + itemQO.getId());
}
// 更新字段
updateItemFields(item, itemQO, userId, userName, now);
inspectionStandardItemService.updateById(item);
} else {
// 新增检测项
item = new QmsInspectionStandardItem()
.setInspectionStandardId(inspectionStandardId);
updateItemFields(item, itemQO, userId, userName, now);
inspectionStandardItemService.save(item);
}
newItemIds.add(item.getId());
// 处理检测项内容
processItemContents(item.getId(), itemQO.getContents(), userId, userName, now);
}
// 删除不在传入列表中的检测项及其内容
List<Long> itemsToDelete = existingItemIds.stream()
.filter(id -> !newItemIds.contains(id))
.collect(Collectors.toList());
if (!itemsToDelete.isEmpty()) {
// 先删除检测项内容
inspectionStandardItemContentService.lambdaUpdate()
.in(QmsInspectionStandardItemContent::getInspectionStandardItemId, itemsToDelete)
.remove();
// 再删除检测项
inspectionStandardItemService.removeByIds(itemsToDelete);
}
}
/** /**
* 暂存检验标准检测项和检测项内容 * 暂存检验标准检测项和检测项内容
* @param qo 暂存请求参数 * @param qo 暂存请求参数
@ -211,59 +357,8 @@ public class QmsInspectionStandardControllerService {
String userName = UserUtil.getUserName(); String userName = UserUtil.getUserName();
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
// 2. 获取该检验标准下所有现有的检测项ID // 2. 处理检测项列表
List<Long> existingItemIds = inspectionStandardItemService.lambdaQuery() processItems(qo.getInspectionStandardId(), qo.getItems(), userId, userName, now);
.eq(QmsInspectionStandardItem::getInspectionStandardId, qo.getInspectionStandardId())
.list()
.stream()
.map(QmsInspectionStandardItem::getId)
.collect(Collectors.toList());
// 3. 处理传入的检测项
List<Long> newItemIds = new ArrayList<>();
if (qo.getItems() != null && !qo.getItems().isEmpty()) {
for (QmsInspectionStandardSaveQO.InspectionStandardItemQO itemQO : qo.getItems()) {
QmsInspectionStandardItem item;
if (itemQO.getId() != null) {
// 更新现有检测项
item = inspectionStandardItemService.getById(itemQO.getId());
if (item == null) {
throw new NflgException(com.nflg.wms.common.constant.STATE.BusinessError, "检测项不存在:" + itemQO.getId());
}
// 更新字段
updateItemFields(item, itemQO, userId, userName, now);
inspectionStandardItemService.updateById(item);
} else {
// 新增检测项
item = new QmsInspectionStandardItem()
.setInspectionStandardId(qo.getInspectionStandardId());
updateItemFields(item, itemQO, userId, userName, now);
inspectionStandardItemService.save(item);
}
newItemIds.add(item.getId());
// 4. 处理检测项内容
processItemContents(item.getId(), itemQO.getContents(), userId, userName, now);
}
}
// 5. 删除不在传入列表中的检测项及其内容
List<Long> itemsToDelete = existingItemIds.stream()
.filter(id -> !newItemIds.contains(id))
.collect(Collectors.toList());
if (!itemsToDelete.isEmpty()) {
// 先删除检测项内容
inspectionStandardItemContentService.lambdaUpdate()
.in(QmsInspectionStandardItemContent::getInspectionStandardItemId, itemsToDelete)
.remove();
// 再删除检测项
inspectionStandardItemService.removeByIds(itemsToDelete);
}
} }
/** /**

View File

@ -103,6 +103,10 @@ public class QmsSamplingPlanControllerService {
if (CollectionUtil.isNotEmpty(request.getStrictnessTransferRules())) { if (CollectionUtil.isNotEmpty(request.getStrictnessTransferRules())) {
List<QmsSamplingStrictnessTransferRule> rules = new ArrayList<>(); List<QmsSamplingStrictnessTransferRule> rules = new ArrayList<>();
for (QmsSamplingPlanAddQO.StrictnessTransferRuleQO qo : request.getStrictnessTransferRules()) { for (QmsSamplingPlanAddQO.StrictnessTransferRuleQO qo : request.getStrictnessTransferRules()) {
// 已启用的规则连续质检批次数量必填
if (Boolean.TRUE.equals(qo.getIsEnabled())) {
VUtil.trueThrowBusinessError(qo.getContinuousBatchCount() == null).throwMessage("已启用的严格性转移规则,连续质检批次数量不能为空");
}
QmsSamplingStrictnessTransferRule entity = new QmsSamplingStrictnessTransferRule() QmsSamplingStrictnessTransferRule entity = new QmsSamplingStrictnessTransferRule()
.setSamplingPlanId(planId) .setSamplingPlanId(planId)
.setRuleType(qo.getRuleType()) .setRuleType(qo.getRuleType())
@ -229,6 +233,10 @@ public class QmsSamplingPlanControllerService {
if (CollectionUtil.isNotEmpty(request.getStrictnessTransferRules())) { if (CollectionUtil.isNotEmpty(request.getStrictnessTransferRules())) {
List<QmsSamplingStrictnessTransferRule> rules = new ArrayList<>(); List<QmsSamplingStrictnessTransferRule> rules = new ArrayList<>();
for (QmsSamplingPlanAddQO.StrictnessTransferRuleQO qo : request.getStrictnessTransferRules()) { for (QmsSamplingPlanAddQO.StrictnessTransferRuleQO qo : request.getStrictnessTransferRules()) {
// 已启用的规则连续质检批次数量必填
if (Boolean.TRUE.equals(qo.getIsEnabled())) {
VUtil.trueThrowBusinessError(qo.getContinuousBatchCount() == null).throwMessage("已启用的严格性转移规则,连续质检批次数量不能为空");
}
QmsSamplingStrictnessTransferRule entity = new QmsSamplingStrictnessTransferRule() QmsSamplingStrictnessTransferRule entity = new QmsSamplingStrictnessTransferRule()
.setSamplingPlanId(planId) .setSamplingPlanId(planId)
.setRuleType(qo.getRuleType()) .setRuleType(qo.getRuleType())

View File

@ -0,0 +1,51 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
/**
* 检验标准新增参数
*/
@Data
public class QmsInspectionStandardAddQO {
/**
* 物料ID
*/
@NotNull(message = "物料ID不能为空")
private Long materialId;
/**
* 检验任务项ID
*/
private Long inspectionTaskItemId;
/**
* 图纸URL
*/
private String drawingUrl;
/**
* 版本号
*/
private String versionNo;
/**
* 包装方式ID
*/
private Long packagingMethodId;
/**
* 检验周期
*/
private Integer inspectionCycle;
/**
* 检测项列表
*/
@Valid
private List<QmsInspectionStandardSaveQO.InspectionStandardItemQO> items;
}

View File

@ -0,0 +1,19 @@
package com.nflg.wms.common.pojo.qo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 检验标准编辑参数
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class QmsInspectionStandardEditQO extends QmsInspectionStandardAddQO {
/**
* 检验标准ID
*/
@NotNull(message = "检验标准ID不能为空")
private Long id;
}

View File

@ -93,7 +93,6 @@ public class QmsSamplingPlanAddQO {
/** /**
* 连续质检批次数量 * 连续质检批次数量
*/ */
@NotNull(message = "连续质检批次数量不能为空")
private Integer continuousBatchCount; private Integer continuousBatchCount;
/** /**