feat(qc): 新增检验任务含明细功能

- 在 IQcInspectionTaskService 中添加 insertByBoWithItems 方法接口
- 在 QcInspectionTaskController 中新增 addWithItems 接口支持检验任务含明细创建
- 在 QcInspectionTaskServiceImpl 中实现完整的检验任务含明细创建逻辑
- 集成检验方案模板查询、待检项明细获取、任务主表及明细批量保存功能
- 添加事务管理确保数据一致性,并增加详细的日志记录和异常处理机制
This commit is contained in:
2026-05-16 10:05:15 +08:00
parent 935e74b2db
commit 74e5bd66a4
3 changed files with 123 additions and 0 deletions

View File

@@ -75,6 +75,16 @@ public class QcInspectionTaskController extends BaseController {
return toAjax(iQcInspectionTaskService.insertByBo(bo)); return toAjax(iQcInspectionTaskService.insertByBo(bo));
} }
/**
* 新增检验任务(包含明细)
*/
@Log(title = "新增检验任务含明细", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/addWithItems")
public R<Void> addWithItems(@Validated(AddGroup.class) @RequestBody QcInspectionTaskBo bo) {
return toAjax(iQcInspectionTaskService.insertByBoWithItems(bo));
}
/** /**
* 修改检验任务主 * 修改检验任务主
*/ */

View File

@@ -37,6 +37,11 @@ public interface IQcInspectionTaskService {
*/ */
Boolean insertByBo(QcInspectionTaskBo bo); Boolean insertByBo(QcInspectionTaskBo bo);
/**
* 新增检验任务(包含明细)
*/
Boolean insertByBoWithItems(QcInspectionTaskBo bo);
/** /**
* 修改检验任务主 * 修改检验任务主
*/ */

View File

@@ -8,16 +8,26 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils; import com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.klp.mes.qc.domain.bo.QcInspectionTaskBo; import com.klp.mes.qc.domain.bo.QcInspectionTaskBo;
import com.klp.mes.qc.domain.vo.QcInspectionTaskVo; import com.klp.mes.qc.domain.vo.QcInspectionTaskVo;
import com.klp.mes.qc.domain.QcInspectionTask; import com.klp.mes.qc.domain.QcInspectionTask;
import com.klp.mes.qc.domain.QcInspectionItem;
import com.klp.mes.qc.mapper.QcInspectionTaskMapper; import com.klp.mes.qc.mapper.QcInspectionTaskMapper;
import com.klp.mes.qc.mapper.QcInspectionItemMapper;
import com.klp.mes.qc.mapper.WmsCheckItemMapper;
import com.klp.mes.qc.service.IQcInspectionTaskService; import com.klp.mes.qc.service.IQcInspectionTaskService;
import com.klp.mes.qc.domain.vo.WmsCheckItemVo;
import com.klp.mes.qc.domain.WmsInspectionItemTemplate;
import com.klp.mes.qc.mapper.WmsInspectionItemTemplateMapper;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Collection; import java.util.Collection;
import java.util.ArrayList;
import java.util.Date;
/** /**
* 检验任务主Service业务层处理 * 检验任务主Service业务层处理
@@ -25,11 +35,15 @@ import java.util.Collection;
* @author klp * @author klp
* @date 2026-05-15 * @date 2026-05-15
*/ */
@Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
@Service @Service
public class QcInspectionTaskServiceImpl implements IQcInspectionTaskService { public class QcInspectionTaskServiceImpl implements IQcInspectionTaskService {
private final QcInspectionTaskMapper baseMapper; private final QcInspectionTaskMapper baseMapper;
private final QcInspectionItemMapper inspectionItemMapper;
private final WmsCheckItemMapper checkItemMapper;
private final WmsInspectionItemTemplateMapper templateMapper;
/** /**
* 查询检验任务主 * 查询检验任务主
@@ -91,6 +105,100 @@ public class QcInspectionTaskServiceImpl implements IQcInspectionTaskService {
return flag; return flag;
} }
/**
* 新增检验任务(包含明细)
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBoWithItems(QcInspectionTaskBo bo) {
// 1. 校验schemeId
if (bo.getSchemeId() == null) {
log.error("检验方案ID不能为空");
throw new IllegalArgumentException("检验方案ID不能为空");
}
// 2. 根据schemeId查询模板信息
WmsInspectionItemTemplate template = templateMapper.selectById(bo.getSchemeId());
if (template == null) {
log.error("未找到检验方案schemeId: {}", bo.getSchemeId());
throw new IllegalArgumentException("未找到检验方案");
}
// 3. 获取模板中的inspection_item逗号分隔的ID字符串
String inspectionItemIds = template.getInspectionItem();
if (StringUtils.isBlank(inspectionItemIds)) {
log.warn("检验方案中未配置待检项schemeId: {}", bo.getSchemeId());
throw new IllegalArgumentException("检验方案中未配置待检项");
}
// 4. 拆分ID并转换为Long类型
String[] itemIdArray = inspectionItemIds.split(",");
List<Long> itemIds = new ArrayList<>();
for (String id : itemIdArray) {
if (StringUtils.isNotBlank(id)) {
try {
itemIds.add(Long.valueOf(id.trim()));
} catch (NumberFormatException e) {
log.warn("无效的待检项ID: {}", id);
}
}
}
// 5. 如果没有有效的ID抛出异常
if (itemIds.isEmpty()) {
log.error("检验方案中没有有效的待检项ID");
throw new IllegalArgumentException("检验方案中没有有效的待检项ID");
}
// 6. 批量查询所有待检项信息
List<WmsCheckItemVo> checkItems = checkItemMapper.selectVoListByIds(itemIds);
if (checkItems == null || checkItems.isEmpty()) {
log.error("未找到待检项明细信息");
throw new IllegalArgumentException("未找到待检项明细信息");
}
// 7. 保存检验任务主表
QcInspectionTask task = BeanUtil.toBean(bo, QcInspectionTask.class);
validEntityBeforeSave(task);
boolean flag = baseMapper.insert(task) > 0;
if (!flag) {
log.error("检验任务主表保存失败");
throw new RuntimeException("检验任务主表保存失败");
}
// 8. 根据待检项明细创建检验任务明细
Long taskId = task.getTaskId();
List<QcInspectionItem> inspectionItems = new ArrayList<>();
Date now = new Date();
for (WmsCheckItemVo checkItem : checkItems) {
QcInspectionItem item = new QcInspectionItem();
item.setTaskId(taskId);
item.setItemName(checkItem.getItemName());
item.setStandardValue(checkItem.getStandardTarget() != null ? checkItem.getStandardTarget().toString() : null);
item.setUpperLimit(checkItem.getTargetUpper());
item.setLowerLimit(checkItem.getTargetLower());
item.setUnit(checkItem.getUnit());
item.setItemType(checkItem.getQualitativeQuantitative() != null && checkItem.getQualitativeQuantitative() == 1 ? "定量" : "定性");
item.setInspectUser(task.getInspectUser());
item.setDelFlag(0);
item.setCreateTime(now);
item.setCreateBy(task.getCreateBy());
inspectionItems.add(item);
}
// 9. 批量插入检验任务明细
if (!inspectionItems.isEmpty()) {
for (QcInspectionItem item : inspectionItems) {
inspectionItemMapper.insert(item);
}
}
log.info("检验任务创建成功taskId: {}, 明细数量: {}", taskId, inspectionItems.size());
return true;
}
/** /**
* 修改检验任务主 * 修改检验任务主
*/ */