diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectPageReqVO.java index 7f2638c..dbd1b7a 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectPageReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectPageReqVO.java @@ -18,8 +18,8 @@ public class MesQcDefectPageReqVO extends PageParam { @Schema(description = "缺陷描述", example = "外观缺陷") private String name; - @Schema(description = "检测项类型", example = "APPEARANCE") - private String type; + @Schema(description = "检测项类型", example = "2") + private Integer type; @Schema(description = "缺陷等级", example = "1") private Integer level; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRespVO.java index 37cb917..aee6211 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRespVO.java @@ -27,10 +27,10 @@ public class MesQcDefectRespVO { @ExcelProperty("缺陷描述") private String name; - @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "APPEARANCE") + @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") @ExcelProperty(value = "检测项类型", converter = DictConvert.class) @DictFormat(DictTypeConstants.MES_DEFECT_TYPE) - private String type; + private Integer type; @Schema(description = "缺陷等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @ExcelProperty(value = "缺陷等级", converter = DictConvert.class) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectSaveReqVO.java index 7fb00a5..0ff1b1b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectSaveReqVO.java @@ -22,9 +22,9 @@ public class MesQcDefectSaveReqVO { @NotEmpty(message = "缺陷描述不能为空") private String name; - @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "APPEARANCE") - @NotEmpty(message = "检测项类型不能为空") - private String type; + @Schema(description = "检测项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2") + @NotNull(message = "检测项类型不能为空") + private Integer type; @Schema(description = "缺陷等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "缺陷等级不能为空") @@ -34,4 +34,4 @@ public class MesQcDefectSaveReqVO { @Schema(description = "备注", example = "备注") private String remark; - } +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectDO.java index ee835c7..43eef25 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectDO.java @@ -39,7 +39,7 @@ public class MesQcDefectDO extends BaseDO { * * 字典类型 {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_DEFECT_TYPE} */ - private String type; + private Integer type; /** * 缺陷等级 * diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java index 635ca29..4dd8f91 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java @@ -1,8 +1,8 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscreceipt; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; import cn.iocoder.yudao.module.mes.enums.wm.MesWmMiscReceiptStatusEnum; -import cn.iocoder.yudao.module.mes.enums.wm.MesWmMiscReceiptTypeEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -41,7 +41,7 @@ public class MesWmMiscReceiptDO extends BaseDO { /** * 杂项类型 * - * 枚举 {@link MesWmMiscReceiptTypeEnum} + * 字典 {@link DictTypeConstants#MES_WM_MISC_RECEIPT_TYPE} */ private Integer type; /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java index 265ba12..b134d96 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/indicatorresult/MesQcIndicatorResultMapper.java @@ -24,4 +24,10 @@ public interface MesQcIndicatorResultMapper extends BaseMapperX() + .eq(MesQcIndicatorResultDO::getQcId, qcId) + .eq(MesQcIndicatorResultDO::getQcType, qcType)); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java index ea23413..16173a4 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java @@ -54,6 +54,7 @@ public interface DictTypeConstants { String MES_WM_QUALITY_STATUS = "mes_wm_quality_status"; // MES 质量状态(待检/合格/不合格) String MES_WM_RETURN_ISSUE_STATUS = "mes_wm_return_issue_status"; // MES 生产退料单状态 String MES_WM_RETURN_ISSUE_TYPE = "mes_wm_return_issue_type"; // MES 生产退料类型 + String MES_WM_MISC_RECEIPT_TYPE = "mes_wm_misc_receipt_type"; // MES 杂项入库类型 String MES_WM_MISC_ISSUE_TYPE = "mes_wm_misc_issue_type"; // MES 杂项出库类型 String MES_WM_MISC_ISSUE_STATUS = "mes_wm_misc_issue_status"; // MES 杂项出库单状态 String MES_WM_SALES_NOTICE_STATUS = "mes_wm_sales_notice_status"; // MES 发货通知单状态 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 de84d52..6d6aad3 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 @@ -345,6 +345,7 @@ public interface ErrorCodeConstants { ErrorCode QC_IPQC_QUANTITY_MISMATCH = new ErrorCode(1_040_604_004, "合格品与不合格品数量之和须等于检测数量"); ErrorCode QC_IPQC_NO_TEMPLATE = new ErrorCode(1_040_604_005, "当前产品未配置 IPQC 检测模板"); ErrorCode QC_IPQC_CHECK_RESULT_EMPTY = new ErrorCode(1_040_604_006, "完成检验单前,检测结果必须填写"); + ErrorCode QC_IPQC_SOURCE_DOC_TYPE_UNKNOWN = new ErrorCode(1_040_604_007, "未知的 IPQC 来源单据类型"); // ========== MES 质量管理-过程检验行(1-040-604-100) ========== ErrorCode QC_IPQC_LINE_NOT_EXISTS = new ErrorCode(1_040_604_100, "过程检验行不存在"); @@ -355,6 +356,8 @@ public interface ErrorCodeConstants { // ========== MES 质量管理-检验结果(1-040-606-000) ========== ErrorCode QC_RESULT_NOT_EXISTS = new ErrorCode(1_040_606_000, "检验结果不存在"); + ErrorCode QC_RESULT_VALUE_FORMAT_INVALID = new ErrorCode(1_040_606_001, "检测值格式不正确:{}"); + ErrorCode QC_FINISH_INDICATOR_RESULT_REQUIRED = new ErrorCode(1_040_606_002, "完成检验单前,至少需要录入一条检测结果"); // ========== MES 质量管理-出货检验(1-040-607-000) ========== ErrorCode QC_OQC_NOT_EXISTS = new ErrorCode(1_040_607_000, "出货检验单不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java deleted file mode 100644 index 072637e..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java +++ /dev/null @@ -1,34 +0,0 @@ -package cn.iocoder.yudao.module.mes.enums.wm; - -import cn.iocoder.yudao.framework.common.core.ArrayValuable; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Arrays; - -/** - * MES 杂项入库类型枚举 - */ -@Getter -@AllArgsConstructor -public enum MesWmMiscReceiptTypeEnum implements ArrayValuable { - - ADJUST(1, "库存调整"); - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmMiscReceiptTypeEnum::getType).toArray(Integer[]::new); - - /** - * 类型值 - */ - private final Integer type; - /** - * 类型名 - */ - private final String name; - - @Override - public Integer[] array() { - return ARRAYS; - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorService.java index 8a9f5cb..7d6078e 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorService.java @@ -82,4 +82,12 @@ public interface MesQcIndicatorService { return convertMap(getIndicatorList(ids), MesQcIndicatorDO::getId); } + /** + * 批量校验质检指标是否都存在 + * + * @param ids 编号数组 + * @return 质检指标 Map + */ + Map validateIndicatorListExists(Collection ids); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorServiceImpl.java index b72cdc1..c3c6819 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicator/MesQcIndicatorServiceImpl.java @@ -18,8 +18,10 @@ import org.springframework.validation.annotation.Validated; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** @@ -132,4 +134,13 @@ public class MesQcIndicatorServiceImpl implements MesQcIndicatorService { return indicatorMapper.selectByIds(ids); } + @Override + public Map validateIndicatorListExists(Collection ids) { + List indicators = getIndicatorList(ids); + if (indicators.size() != ids.size()) { + throw exception(QC_INDICATOR_NOT_EXISTS); + } + return convertMap(indicators, MesQcIndicatorDO::getId); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java index ea4f2c7..e4a8c71 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultService.java @@ -62,4 +62,21 @@ public interface MesQcIndicatorResultService { */ List getIndicatorResultDetailListByResultId(Long resultId); + /** + * 获取指定质检单下的检验结果数量 + * + * @param qcId 质检单 ID + * @param qcType 质检类型 + * @return 结果数量 + */ + Long getIndicatorResultCountByQcIdAndType(Long qcId, Integer qcType); + + /** + * 校验指定质检单下至少存在一条检验结果 + * + * @param qcId 质检单 ID + * @param qcType 质检类型 + */ + void validateIndicatorResultExistsByQcIdAndType(Long qcId, Integer qcType); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java index 5a7a887..cbd021c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/indicatorresult/MesQcIndicatorResultServiceImpl.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.mes.service.qc.indicatorresult; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcIndicatorResultPageReqVO; @@ -8,11 +9,12 @@ import cn.iocoder.yudao.module.mes.controller.admin.qc.indicatorresult.vo.MesQcI import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicator.MesQcIndicatorDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.indicatorresult.MesQcIndicatorResultDetailDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ipqc.MesQcIpqcDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.iqc.MesQcIqcDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.rqc.MesQcRqcDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.indicatorresult.MesQcIndicatorResultMapper; +import cn.iocoder.yudao.module.mes.enums.qc.MesQcResultValueTypeEnum; import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; import cn.iocoder.yudao.module.mes.service.qc.indicator.MesQcIndicatorService; import cn.iocoder.yudao.module.mes.service.qc.ipqc.MesQcIpqcService; @@ -25,6 +27,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.math.BigDecimal; import java.util.*; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -42,9 +45,9 @@ public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultServ @Resource private MesQcIndicatorResultMapper resultMapper; + @Resource private MesQcIndicatorResultDetailService resultDetailService; - @Resource private MesQcIndicatorService indicatorService; @Resource @@ -64,8 +67,8 @@ public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultServ public Long createIndicatorResult(MesQcIndicatorResultSaveReqVO createReqVO) { // 1.1 根据 qcType 查询源质检单,获取 itemId Long itemId = getItemIdFromQcDoc(createReqVO.getQcId(), createReqVO.getQcType()); - // 1.2 校验所有明细的 indicatorId 是否存在 - validateIndicatorIds(createReqVO.getItems()); + // 1.2 校验明细数据(indicatorId 存在性 + 值格式) + validateItemsSaveData(createReqVO.getItems()); // 2.1 插入主表 MesQcIndicatorResultDO result = BeanUtils.toBean(createReqVO, MesQcIndicatorResultDO.class); @@ -84,8 +87,8 @@ public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultServ public void updateIndicatorResult(MesQcIndicatorResultSaveReqVO updateReqVO) { // 1.1 校验存在 validateIndicatorResultExists(updateReqVO.getId()); - // 1.2 校验所有明细的 indicatorId 是否存在 - validateIndicatorIds(updateReqVO.getItems()); + // 1.2 校验明细数据(indicatorId 存在性 + 值格式) + validateItemsSaveData(updateReqVO.getItems()); // 2.1 更新主表(锁定 qcId/qcType/itemId,不允许改挂到其他质检单) MesQcIndicatorResultDO updateObj = BeanUtils.toBean(updateReqVO, MesQcIndicatorResultDO.class); @@ -124,6 +127,19 @@ public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultServ return resultDetailService.getDetailListByResultId(resultId); } + @Override + public Long getIndicatorResultCountByQcIdAndType(Long qcId, Integer qcType) { + return resultMapper.selectCountByQcIdAndType(qcId, qcType); + } + + @Override + public void validateIndicatorResultExistsByQcIdAndType(Long qcId, Integer qcType) { + Long resultCount = getIndicatorResultCountByQcIdAndType(qcId, qcType); + if (resultCount == 0) { + throw exception(QC_FINISH_INDICATOR_RESULT_REQUIRED); + } + } + // ==================== 私有方法 ==================== private MesQcIndicatorResultDO validateIndicatorResultExists(Long id) { @@ -135,18 +151,64 @@ public class MesQcIndicatorResultServiceImpl implements MesQcIndicatorResultServ } /** + * 校验明细保存数据(indicatorId 存在性 + 值格式) + */ + private void validateItemsSaveData(List items) { + // 校验所有明细的 indicatorId 是否存在 + Map indicatorMap = validateIndicatorIds(items); + // 校验明细值格式是否符合指标的 resultType + validateDetailValues(items, indicatorMap); + } + + /** * 校验所有明细的 indicatorId 是否存在 + * + * @return indicatorId -> MesQcIndicatorDO 映射,供后续值格式校验使用 */ - private void validateIndicatorIds(List items) { + private Map validateIndicatorIds(List items) { if (CollUtil.isEmpty(items)) { - return; + return Collections.emptyMap(); } Set indicatorIds = convertSet(items, MesQcIndicatorResultSaveReqVO.Item::getIndicatorId); - List indicators = indicatorService.getIndicatorList(indicatorIds); - if (indicators.size() != indicatorIds.size()) { - Set existIds = convertSet(indicators, MesQcIndicatorDO::getId); - indicatorIds.removeAll(existIds); - throw exception(QC_INDICATOR_NOT_EXISTS); + return indicatorService.validateIndicatorListExists(indicatorIds); + } + + /** + * 按检测项的 resultType 校验明细值格式 + * + *

FLOAT → 必须可解析为 BigDecimal;INTEGER → 必须可解析为整数; + * TEXT / DICT / FILE → 放行 + */ + private void validateDetailValues(List items, + Map indicatorMap) { + if (CollUtil.isEmpty(items)) { + return; + } + for (MesQcIndicatorResultSaveReqVO.Item item : items) { + if (item.getIndicatorId() == null || StrUtil.isBlank(item.getValue())) { + continue; + } + MesQcIndicatorDO indicator = indicatorMap.get(item.getIndicatorId()); + if (indicator == null || indicator.getResultType() == null) { + continue; + } + Integer resultType = indicator.getResultType(); + if (Objects.equals(resultType, MesQcResultValueTypeEnum.FLOAT.getType())) { + try { + new BigDecimal(item.getValue()); + } catch (NumberFormatException e) { + throw exception(QC_RESULT_VALUE_FORMAT_INVALID, + "检测项[" + indicator.getName() + "]要求浮点数,实际值=" + item.getValue()); + } + } else if (Objects.equals(resultType, MesQcResultValueTypeEnum.INTEGER.getType())) { + try { + Long.parseLong(item.getValue()); + } catch (NumberFormatException e) { + throw exception(QC_RESULT_VALUE_FORMAT_INVALID, + "检测项[" + indicator.getName() + "]要求整数,实际值=" + item.getValue()); + } + } + // TEXT / DICT / FILE 不做格式校验 } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java index 2136db9..3bae6eb 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/ipqc/MesQcIpqcServiceImpl.java @@ -27,6 +27,7 @@ import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProductService; import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; +import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import jakarta.annotation.Resource; @@ -87,6 +88,9 @@ public class MesQcIpqcServiceImpl implements MesQcIpqcService { @Resource @Lazy private MesProFeedbackService feedbackService; + @Resource + @Lazy + private MesQcIndicatorResultService indicatorResultService; @Override @Transactional(rollbackFor = Exception.class) @@ -183,6 +187,8 @@ public class MesQcIpqcServiceImpl implements MesQcIpqcService { if (ipqc.getCheckResult() == null) { throw exception(QC_IPQC_CHECK_RESULT_EMPTY); } + // 1.3 校验至少存在一条检测结果 + indicatorResultService.validateIndicatorResultExistsByQcIdAndType(id, MesQcTypeEnum.IPQC.getType()); // 2. 更新状态为已完成 ipqcMapper.updateById(new MesQcIpqcDO() @@ -276,7 +282,8 @@ public class MesQcIpqcServiceImpl implements MesQcIpqcService { MesProFeedbackDO feedback = feedbackService.validateFeedbackExists(sourceDocId); return feedback.getCode(); } - return null; + // 未知来源类型应报错,而不是静默忽略 + throw exception(QC_IPQC_SOURCE_DOC_TYPE_UNKNOWN); } /** 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 9533984..23f0644 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 @@ -18,11 +18,13 @@ import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; +import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; import cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt.MesWmOutsourceReceiptService; import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -65,6 +67,9 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { @Resource private AdminUserApi adminUserApi; + @Resource + @Lazy + private MesQcIndicatorResultService indicatorResultService; @Override @Transactional(rollbackFor = Exception.class) @@ -125,6 +130,8 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { if (iqc.getCheckResult() == null) { throw exception(QC_IQC_CHECK_RESULT_EMPTY); } + // 1.2 校验至少存在一条检测结果 + indicatorResultService.validateIndicatorResultExistsByQcIdAndType(id, MesQcTypeEnum.IQC.getType()); // 2. 更新状态为已完成 MesQcIqcDO updateObj = new MesQcIqcDO() diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java index 943a0f5..36bbc73 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/oqc/MesQcOqcServiceImpl.java @@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; +import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesLineService; import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesService; @@ -69,6 +70,9 @@ public class MesQcOqcServiceImpl implements MesQcOqcService { @Resource private AdminUserApi adminUserApi; + @Resource + @Lazy + private MesQcIndicatorResultService indicatorResultService; @Override @Transactional(rollbackFor = Exception.class) @@ -128,6 +132,8 @@ public class MesQcOqcServiceImpl implements MesQcOqcService { if (oqc.getCheckResult() == null) { throw exception(QC_OQC_CHECK_RESULT_EMPTY); } + // 1.3 校验至少存在一条检测结果 + indicatorResultService.validateIndicatorResultExistsByQcIdAndType(id, MesQcTypeEnum.OQC.getType()); // 2. 更新状态为已完成 MesQcOqcDO updateObj = new MesQcOqcDO() diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java index 0d1d0bf..0492bce 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java @@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.qc.defectrecord.MesQcDefectRecordService; +import cn.iocoder.yudao.module.mes.service.qc.indicatorresult.MesQcIndicatorResultService; import cn.iocoder.yudao.module.mes.service.wm.returnissue.MesWmReturnIssueService; import cn.iocoder.yudao.module.mes.service.wm.returnsales.MesWmReturnSalesService; import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateItemService; @@ -68,6 +69,9 @@ public class MesQcRqcServiceImpl implements MesQcRqcService { @Resource @Lazy private MesWmReturnSalesService returnSalesService; + @Resource + @Lazy + private MesQcIndicatorResultService indicatorResultService; @Resource private AdminUserApi adminUserApi; @@ -137,6 +141,8 @@ public class MesQcRqcServiceImpl implements MesQcRqcService { throw exception(QC_RQC_QUANTITY_MISMATCH); } } + // 1.4 校验至少存在一条检测结果 + indicatorResultService.validateIndicatorResultExistsByQcIdAndType(id, MesQcTypeEnum.RQC.getType()); // 2. 更新状态为已完成 MesQcRqcDO updateObj = new MesQcRqcDO().setId(id).setStatus(MesQcStatusEnum.FINISHED.getStatus());