From 9c94c1f58940f0e3aeb90aa4c449ff88dc584e20 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 24 Feb 2026 03:57:50 +0800 Subject: [PATCH] feat(mes): 修复 IQC 模块 TODO @AI(第二轮) --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcLineController.java | 11 ----------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcSaveReqVO.java | 11 +++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/line/MesQcIqcLineRespVO.java | 7 ++----- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/iqc/MesQcIqcLineDO.java | 7 +++---- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/template/MesQcTemplateIndicatorMapper.java | 1 + yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 8 ++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcLineServiceImpl.java | 31 +++++++++++++++++++++++-------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcService.java | 6 ++++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java | 8 ++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java | 19 +++++++++++++++++++ 11 files changed, 129 insertions(+), 66 deletions(-) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcLineController.java index 558a95e..10ea277 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcLineController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcLineController.java @@ -9,11 +9,9 @@ import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.line.MesQcIqcLineR import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcLineDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolDO; import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcLineService; import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; -import cn.iocoder.yudao.module.mes.service.tm.tool.MesTmToolService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -46,8 +44,6 @@ public class MesQcIqcLineController { private MesQcIndicatorService indicatorService; @Resource private MesMdUnitMeasureService unitMeasureService; - @Resource - private MesTmToolService toolService; @GetMapping("/get") @Operation(summary = "获得来料检验单行") @@ -85,13 +81,6 @@ public class MesQcIqcLineController { .setIndicatorType(indicator.getType())); findAndThen(unitMeasureMap, vo.getUnitMeasureId(), unit -> vo.setUnitMeasureName(unit.getName())); - // 逐个查询工具名称(工具数量通常较少) - if (vo.getToolId() != null) { - MesTmToolDO tool = toolService.getTool(vo.getToolId()); - if (tool != null) { - vo.setToolName(tool.getName()); - } - } }); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcSaveReqVO.java index 8a734fb..59c40a3 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/MesQcIqcSaveReqVO.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo; +import cn.hutool.core.util.ObjUtil; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.AssertTrue; import jakarta.validation.constraints.DecimalMin; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; @@ -82,4 +84,13 @@ public class MesQcIqcSaveReqVO { @Schema(description = "备注", example = "备注") private String remark; + @AssertTrue(message = "合格品数量与不合格品数量之和必须等于本次接收数量") + @Schema(hidden = true) + public boolean isQuantityValid() { + if (ObjUtil.hasNull(qualifiedQuantity, unqualifiedQuantity, receivedQuantity)) { + return true; // @NotNull 会处理 null + } + return qualifiedQuantity.add(unqualifiedQuantity).compareTo(receivedQuantity) == 0; + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/line/MesQcIqcLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/line/MesQcIqcLineRespVO.java index e1c70d1..d8170ae 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/line/MesQcIqcLineRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/line/MesQcIqcLineRespVO.java @@ -30,11 +30,8 @@ public class MesQcIqcLineRespVO { @Schema(description = "检测指标类型", example = "QUANTITATIVE") private String indicatorType; - @Schema(description = "检测工具 ID", example = "5") - private Long toolId; - - @Schema(description = "检测工具名称", example = "卡尺") - private String toolName; + @Schema(description = "检测工具", example = "卡尺") + private String tool; @Schema(description = "检测方法", example = "目测") private String checkMethod; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/iqc/MesQcIqcLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/iqc/MesQcIqcLineDO.java index abc3736..8c56b8d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/iqc/MesQcIqcLineDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/iqc/MesQcIqcLineDO.java @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -44,11 +43,11 @@ public class MesQcIqcLineDO extends BaseDO { */ private Long indicatorId; /** - * 检测工具 ID + * 检测工具 * - * 关联 {@link MesTmToolDO#getId()} + * 冗余 {@link MesQcIndicatorDO#getTool()} */ - private Long toolId; + private String tool; /** * 检测方法 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/template/MesQcTemplateIndicatorMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/template/MesQcTemplateIndicatorMapper.java index 94b2ae2..12cbffa 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/template/MesQcTemplateIndicatorMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/template/MesQcTemplateIndicatorMapper.java @@ -9,6 +9,7 @@ import org.apache.ibatis.annotations.Mapper; import java.util.List; +// TODO @AI:MesQcTemplateIndicatorService 独立一个;然后非 MesQcTemplateIndicatorService 调用 mapper 的地方,都替换下; /** * MES 质检方案-检测指标项 Mapper * diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 18ffc98..d7e5747 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -250,6 +250,8 @@ public interface ErrorCodeConstants { ErrorCode QC_IQC_NOT_PREPARE = new ErrorCode(1_040_603_002, "只有草稿状态的检验单才可操作"); ErrorCode QC_IQC_QUANTITY_MISMATCH = new ErrorCode(1_040_603_004, "合格品与不合格品数量之和须等于检测数量"); ErrorCode QC_IQC_NO_TEMPLATE = new ErrorCode(1_040_603_005, "当前产品未配置 IQC 检测模板"); + ErrorCode QC_IQC_SOURCE_DOC_PARAMS_MISSING = new ErrorCode(1_040_603_006, "来源单据类型非空时,来源单据 ID 和来源单据行 ID 不能为空"); + ErrorCode QC_IQC_CHECK_RESULT_EMPTY = new ErrorCode(1_040_603_007, "完成检验单前,检测结果必须填写"); // ========== MES 质量管理-来料检验行(1-040-603-100) ========== ErrorCode QC_IQC_LINE_NOT_EXISTS = new ErrorCode(1_040_603_100, "来料检验行不存在"); @@ -344,4 +346,10 @@ public interface ErrorCodeConstants { ErrorCode WM_MATERIAL_REQUEST_STATUS_INVALID = new ErrorCode(1_040_706_001, "领料申请单状态不正确,无法执行该操作"); ErrorCode WM_MATERIAL_REQUEST_LINE_NOT_EXISTS = new ErrorCode(1_040_706_100, "领料申请单行不存在"); + // ========== MES 仓库管理-外协出库单(1-040-707-000) ========== + ErrorCode WM_OUTSOURCE_ISSUE_NOT_EXISTS = new ErrorCode(1_040_707_000, "外协出库单不存在"); + ErrorCode WM_OUTSOURCE_ISSUE_STATUS_INVALID = new ErrorCode(1_040_707_001, "外协出库单状态不正确,无法执行该操作"); + ErrorCode WM_OUTSOURCE_ISSUE_QUANTITY_MISMATCH = new ErrorCode(1_040_707_002, "出库单行数量与明细数量不一致"); + ErrorCode WM_OUTSOURCE_ISSUE_LINE_NOT_EXISTS = new ErrorCode(1_040_707_100, "外协出库单行不存在"); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcLineServiceImpl.java index 3f40c26..74e9b79 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcLineServiceImpl.java @@ -6,20 +6,24 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.line.MesQcIqcLinePageReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateIndicatorDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.iqc.MesQcIqcLineMapper; import cn.iocoder.yudao.module.mes.dal.mysql.qc.template.MesQcTemplateIndicatorMapper; import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; +import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** @@ -36,6 +40,9 @@ public class MesQcIqcLineServiceImpl implements MesQcIqcLineService { @Resource private MesQcTemplateIndicatorMapper templateIndicatorMapper; + @Resource + private MesQcIndicatorService indicatorService; + @Override public MesQcIqcLineDO validateIqcLineExists(Long id) { MesQcIqcLineDO line = iqcLineMapper.selectById(id); @@ -57,14 +64,22 @@ public class MesQcIqcLineServiceImpl implements MesQcIqcLineService { @Override public void createLinesFromTemplate(Long iqcId, Long templateId) { - List indicators = templateIndicatorMapper.selectListByTemplateId(templateId); - List lines = convertList(indicators, indicator -> new MesQcIqcLineDO() - .setIqcId(iqcId).setIndicatorId(indicator.getIndicatorId()) - .setToolId(null) // TODO @芋艿:模板指标暂无 toolId,后续可扩展 - .setCheckMethod(indicator.getCheckMethod()) - .setStandardValue(indicator.getStandardValue()).setUnitMeasureId(indicator.getUnitMeasureId()) - .setMaxThreshold(indicator.getThresholdMax()).setMinThreshold(indicator.getThresholdMin()) - .setCriticalQuantity(0).setMajorQuantity(0).setMinorQuantity(0)); + List templateIndicators = templateIndicatorMapper.selectListByTemplateId(templateId); + if (CollUtil.isEmpty(templateIndicators)) { + return; + } + Map indicatorMap = indicatorService.getIndicatorMap( + convertSet(templateIndicators, MesQcTemplateIndicatorDO::getIndicatorId)); + List lines = convertList(templateIndicators, templateIndicator -> { + MesQcIndicatorDO indicator = indicatorMap.get(templateIndicator.getIndicatorId()); + return new MesQcIqcLineDO() + .setIqcId(iqcId).setIndicatorId(templateIndicator.getIndicatorId()) + .setTool(indicator != null ? indicator.getTool() : null) + .setCheckMethod(templateIndicator.getCheckMethod()) + .setStandardValue(templateIndicator.getStandardValue()).setUnitMeasureId(templateIndicator.getUnitMeasureId()) + .setMaxThreshold(templateIndicator.getThresholdMax()).setMinThreshold(templateIndicator.getThresholdMin()) + .setCriticalQuantity(0).setMajorQuantity(0).setMinorQuantity(0); + }); iqcLineMapper.insertBatch(lines); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcService.java index d2619d4..181b365 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcService.java @@ -22,16 +22,18 @@ public interface MesQcIqcService { * 创建来料检验单 * * @param createReqVO 创建信息 + * @param inspectorUserId 检测人员用户 ID * @return 编号 */ - Long createIqc(@Valid MesQcIqcSaveReqVO createReqVO); + Long createIqc(@Valid MesQcIqcSaveReqVO createReqVO, Long inspectorUserId); /** * 更新来料检验单 * * @param updateReqVO 更新信息 + * @param inspectorUserId 检测人员用户 ID */ - void updateIqc(@Valid MesQcIqcSaveReqVO updateReqVO); + void updateIqc(@Valid MesQcIqcSaveReqVO updateReqVO, Long inspectorUserId); /** * 完成来料检验单 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java index 108cbd7..1859f6f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/iqc/MesQcIqcServiceImpl.java @@ -4,11 +4,11 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.MesQcIqcSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defectrecord.MesQcDefectRecordDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.iqc.MesQcIqcMapper; import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; @@ -16,7 +16,7 @@ import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; import cn.iocoder.yudao.module.mes.enums.qc.MesQcIqcStatusEnum; import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; -import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateService; +import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateDetailService; import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -44,7 +44,7 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { @Resource private MesQcIqcMapper iqcMapper; @Resource - private MesQcTemplateService templateService; + private MesQcTemplateDetailService templateDetailService; @Resource private MesQcIqcLineService iqcLineService; @@ -55,46 +55,42 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { @Override @Transactional(rollbackFor = Exception.class) - public Long createIqc(MesQcIqcSaveReqVO createReqVO) { + public Long createIqc(MesQcIqcSaveReqVO createReqVO, Long inspectorUserId) { // 1.1 校验编号唯一 validateIqcCodeUnique(null, createReqVO.getCode()); - // 1.2 查找物料关联的 IQC 检测模板 - Long templateId = createReqVO.getTemplateId(); - MesQcTemplateDO template = templateService.validateTemplateExists(templateId); - if (!CollUtil.contains(template.getTypes(), MesQcTypeEnum.IQC.getType())) { - throw exception(QC_IQC_NO_TEMPLATE); - } + // 1.2 校验来源单据参数,并验证数据存在 + validateSourceDoc(createReqVO.getSourceDocType(), createReqVO.getSourceDocId(), createReqVO.getSourceLineId()); + // 1.3 通过 itemId + IQC 类型自动查找模板 + MesQcTemplateItemDO templateItem = templateDetailService.getRequiredTemplateByItemIdAndType( + createReqVO.getItemId(), MesQcTypeEnum.IQC.getType()); + Long templateId = templateItem.getTemplateId(); - // 3.1 从模板的产品关联中获取检测参数(min_check_quantity、max_unqualified_quantity) - MesQcTemplateItemDO templateItem = templateService.getTemplateItemByTemplateIdAndItemId( - templateId, createReqVO.getItemId()); - if (templateItem != null) { - if (createReqVO.getMinCheckQuantity() == null) { - createReqVO.setMinCheckQuantity(templateItem.getQuantityCheck()); - } - if (createReqVO.getMaxUnqualifiedQuantity() == null) { - createReqVO.setMaxUnqualifiedQuantity(templateItem.getQuantityUnqualified()); - } - } - // 3.2 插入主表 + // 2. 插入主表 MesQcIqcDO iqc = BeanUtils.toBean(createReqVO, MesQcIqcDO.class); + iqc.setTemplateId(templateId); + iqc.setCheckQuantity(createReqVO.getQualifiedQuantity().add(createReqVO.getUnqualifiedQuantity())); + iqc.setInspectorUserId(inspectorUserId); iqc.setStatus(MesQcIqcStatusEnum.PREPARE.getType()); iqcMapper.insert(iqc); - // 4. 从模板指标自动生成检验行 + // 3. 从模板指标自动生成检验行 iqcLineService.createLinesFromTemplate(iqc.getId(), templateId); return iqc.getId(); } @Override - public void updateIqc(MesQcIqcSaveReqVO updateReqVO) { + public void updateIqc(MesQcIqcSaveReqVO updateReqVO, Long inspectorUserId) { // 1.1 校验存在 + 草稿状态 validateIqcStatusPrepare(updateReqVO.getId()); // 1.2 校验编号唯一 validateIqcCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); - // 2. 更新 + // 2. 更新主表 MesQcIqcDO updateObj = BeanUtils.toBean(updateReqVO, MesQcIqcDO.class); + updateObj.setSourceDocType(null).setSourceDocId(null).setSourceLineId(null); // 不允许修改来源单据 + updateObj.setTemplateId(null); // 不允许修改模板 + updateObj.setCheckQuantity(updateReqVO.getQualifiedQuantity().add(updateReqVO.getUnqualifiedQuantity())); + updateObj.setInspectorUserId(inspectorUserId); iqcMapper.updateById(updateObj); } @@ -102,14 +98,11 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { public void completeIqc(Long id) { // 1.1 校验存在 + 草稿状态 MesQcIqcDO iqc = validateIqcStatusPrepare(id); - // 1.2 校验合格品 + 不合格品 = 检测数量 - if (iqc.getCheckQuantity() != null && iqc.getCheckQuantity().compareTo(BigDecimal.ZERO) > 0) { - BigDecimal total = ObjUtil.defaultIfNull(iqc.getQualifiedQuantity(), BigDecimal.ZERO) - .add(ObjUtil.defaultIfNull(iqc.getUnqualifiedQuantity(), BigDecimal.ZERO)); - if (total.compareTo(iqc.getCheckQuantity()) != 0) { - throw exception(QC_IQC_QUANTITY_MISMATCH); - } + // DONE @AI:已修复,增加 checkResult 必填校验 + if (iqc.getCheckResult() == null) { + throw exception(QC_IQC_CHECK_RESULT_EMPTY); } + // DONE @AI:已修复,数量校验已在 MesQcIqcSaveReqVO 的 @AssertTrue 中保证,此处移除 // 2. 更新状态为已完成 MesQcIqcDO updateObj = new MesQcIqcDO() @@ -130,7 +123,8 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { if (iqc.getSourceDocType() == null) { return; } - if (iqc.getSourceLineId() == null || iqc.getSourceDocId() == null) { + // DONE @AI:已修复,使用 ObjectUtil.hasNull() 简化判断 + if (ObjectUtil.hasNull(iqc.getSourceLineId(), iqc.getSourceDocId())) { throw new IllegalArgumentException( "IQC 单[" + iqc.getId() + "] sourceDocType 非空但 sourceLineId 或 sourceDocId 为空"); } @@ -152,9 +146,9 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { // 2.1 删除主表 iqcMapper.deleteById(id); // 2.2 级联删除行 - iqcLineService.deleteByIqcId(id); + iqcLineService.deleteListByIqcId(id); // 2.3 级联删除缺陷记录 - defectRecordService.deleteByQcTypeAndQcId(MesQcTypeEnum.IQC.getType(), id); + defectRecordService.deleteListByQcTypeAndQcId(MesQcTypeEnum.IQC.getType(), id); } @Override @@ -190,6 +184,26 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { } } + /** + * 校验来源单据参数,并验证数据存在 + * + * @param sourceDocType 来源单据类型 + * @param sourceDocId 来源单据 ID + * @param sourceLineId 来源单据行 ID + */ + private void validateSourceDoc(Integer sourceDocType, Long sourceDocId, Long sourceLineId) { + if (sourceDocType == null) { + return; + } + if (ObjUtil.hasNull(sourceDocId, sourceLineId)) { + throw exception(QC_IQC_SOURCE_DOC_PARAMS_MISSING); + } + // 根据来源单据类型,校验数据存在且匹配 + if (Objects.equals(sourceDocType, MesBizTypeConstants.WM_ARRIVAL_NOTICE)) { + arrivalNoticeService.validateArrivalNoticeAndLineExists(sourceDocId, sourceLineId); + } + } + @Override public MesQcIqcDO getIqc(Long id) { return iqcMapper.selectById(id); @@ -246,7 +260,7 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { if (CollUtil.isEmpty(ids)) { return Collections.emptyMap(); } - List list = iqcMapper.selectBatchIds(ids); + List list = iqcMapper.selectByIds(ids); return convertMap(list, MesQcIqcDO::getId); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java index 201dffe..37976ee 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java @@ -93,6 +93,14 @@ public interface MesWmArrivalNoticeService { } /** + * 校验到货通知单和行存在,且行属于该通知单 + * + * @param noticeId 到货通知单 ID + * @param lineId 到货通知单行 ID + */ + void validateArrivalNoticeAndLineExists(Long noticeId, Long lineId); + + /** * 按状态获得到货通知单列表 * * @param status 状态 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java index 91a9252..337dfdd 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java @@ -21,6 +21,7 @@ import java.math.BigDecimal; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @@ -166,6 +167,24 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService return arrivalNoticeMapper.selectListByStatus(status); } + @Override + public void validateArrivalNoticeAndLineExists(Long noticeId, Long lineId) { + // 1. 校验通知单存在 + MesWmArrivalNoticeDO notice = arrivalNoticeMapper.selectById(noticeId); + if (notice == null) { + throw exception(WM_ARRIVAL_NOTICE_NOT_EXISTS); + } + // 2.1 校验行存在 + MesWmArrivalNoticeLineDO line = arrivalNoticeLineService.getArrivalNoticeLine(lineId); + if (line == null) { + throw exception(WM_ARRIVAL_NOTICE_LINE_NOT_EXISTS); + } + // 2.2 校验行属于该通知单 + if (ObjUtil.notEqual(line.getNoticeId(), noticeId)) { + throw exception(WM_ARRIVAL_NOTICE_LINE_NOT_EXISTS); + } + } + private MesWmArrivalNoticeDO validateArrivalNoticeExists(Long id) { MesWmArrivalNoticeDO notice = arrivalNoticeMapper.selectById(id); if (notice == null) { -- libgit2 0.21.4