feat(qc): 新增检验任务含明细功能
- 在 IQcInspectionTaskService 中添加 insertByBoWithItems 方法接口 - 在 QcInspectionTaskController 中新增 addWithItems 接口支持检验任务含明细创建 - 在 QcInspectionTaskServiceImpl 中实现完整的检验任务含明细创建逻辑 - 集成检验方案模板查询、待检项明细获取、任务主表及明细批量保存功能 - 添加事务管理确保数据一致性,并增加详细的日志记录和异常处理机制
This commit is contained in:
@@ -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));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改检验任务主
|
* 修改检验任务主
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -37,6 +37,11 @@ public interface IQcInspectionTaskService {
|
|||||||
*/
|
*/
|
||||||
Boolean insertByBo(QcInspectionTaskBo bo);
|
Boolean insertByBo(QcInspectionTaskBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增检验任务(包含明细)
|
||||||
|
*/
|
||||||
|
Boolean insertByBoWithItems(QcInspectionTaskBo bo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改检验任务主
|
* 修改检验任务主
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改检验任务主
|
* 修改检验任务主
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user