From d8488e8393210649709a3670391adc689760eae5 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 21 Feb 2026 12:21:36 +0800 Subject: [PATCH] feat(mes): 添加生产任务选择器和工单选择器组件,支持前端过滤功能 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkplan/MesDvCheckPlanDO.java | 7 +++---- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialstock/MesWmMaterialStockDO.java | 4 ++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 3 +-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessServiceImpl.java | 3 +-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderService.java | 7 +++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderServiceImpl.java | 5 +++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectServiceImpl.java | 21 ++++++--------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineService.java | 7 +++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineServiceImpl.java | 7 +++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java | 39 +++++++++++++++++---------------------- 10 files changed, 56 insertions(+), 47 deletions(-) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkplan/MesDvCheckPlanDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkplan/MesDvCheckPlanDO.java index 6c586c7..764c49e 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkplan/MesDvCheckPlanDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkplan/MesDvCheckPlanDO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkplan; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.enums.DictTypeConstants; import cn.iocoder.yudao.module.mes.enums.dv.MesDvCheckPlanStatusEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; @@ -37,11 +38,10 @@ public class MesDvCheckPlanDO extends BaseDO { * 方案名称 */ private String name; - // TODO @AI:需要在 dict constants 里枚举下,然后 @过去 /** * 方案类型 * - * 字典类型 mes_dv_subject_type(1=设备点检,2=设备保养) + * 字典 {@link DictTypeConstants#MES_DV_SUBJECT_TYPE} */ private Integer type; /** @@ -52,11 +52,10 @@ public class MesDvCheckPlanDO extends BaseDO { * 结束日期 */ private LocalDateTime endDate; - // TODO @AI:需要在 dict constants 里枚举下,然后 @过去 /** * 周期类型 * - * 字典类型 mes_dv_cycle_type(1=天,2=周,3=月,4=年) + * 字典 {@link DictTypeConstants#MES_DV_CYCLE_TYPE} */ private Integer cycleType; /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialstock/MesWmMaterialStockDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialstock/MesWmMaterialStockDO.java index 2fd0c5a..5b537d9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialstock/MesWmMaterialStockDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/materialstock/MesWmMaterialStockDO.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; @@ -85,11 +86,10 @@ public class MesWmMaterialStockDO extends BaseDO { * 关联 {@link MesMdVendorDO#getId()} */ private Long vendorId; - // TODO @AI:去关联下; /** * 生产工单编号 * - * TODO @芋艿:待 mes_pro_work_order 模块完成后关联 + * 关联 {@link MesProWorkOrderDO#getId()} */ private Long workOrderId; /** 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 578e1ed..d544fcf 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 @@ -247,8 +247,7 @@ public interface ErrorCodeConstants { // ========== MES 质量管理-来料检验 IQC(1-040-603-000) ========== ErrorCode QC_IQC_NOT_EXISTS = new ErrorCode(1_040_603_000, "来料检验单不存在"); ErrorCode QC_IQC_CODE_DUPLICATE = new ErrorCode(1_040_603_001, "来料检验单编号已存在"); - ErrorCode QC_IQC_ONLY_PREPARE_CAN_DELETE = new ErrorCode(1_040_603_002, "只能删除草稿状态的检验单"); - ErrorCode QC_IQC_ONLY_PREPARE_CAN_COMPLETE = new ErrorCode(1_040_603_003, "只能完成草稿状态的检验单"); + 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 检测模板"); // ========== MES 质量管理-来料检验行(1-040-603-100) ========== diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessServiceImpl.java index 091f4b1..ec067db 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/process/MesProProcessServiceImpl.java @@ -70,8 +70,7 @@ public class MesProProcessServiceImpl implements MesProProcessService { // 1.1 校验存在 validateProcessExists(id); // 1.2 校验是否被工艺路线引用 - // TODO @AI:CollUtil.isNotEmpty() 可能更好 - if (!routeProcessMapper.selectListByProcessId(id).isEmpty()) { + if (CollUtil.isNotEmpty(routeProcessMapper.selectListByProcessId(id))) { throw exception(PRO_PROCESS_USED_BY_ROUTE); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderService.java index aaeb198..07494b8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderService.java @@ -112,4 +112,11 @@ public interface MesProWorkOrderService { */ void cancelWorkOrder(Long id); + /** + * 获得工单精简列表(用于下拉选项) + * + * @return 工单列表 + */ + List getWorkOrderSimpleList(); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderServiceImpl.java index 3007978..31885ea 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/workorder/MesProWorkorderServiceImpl.java @@ -222,6 +222,11 @@ public class MesProWorkOrderServiceImpl implements MesProWorkOrderService { } } + @Override + public List getWorkOrderSimpleList() { + return workOrderMapper.selectList(); + } + // ==================== BOM 自动生成 ==================== /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectServiceImpl.java index fe9bce3..c1b59b1 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectServiceImpl.java @@ -9,7 +9,6 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDefectDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.lqc.MesQcIqcDefectMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.qc.lqc.MesQcIqcLineMapper; import cn.iocoder.yudao.module.mes.dal.mysql.qc.lqc.MesQcIqcMapper; import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; import jakarta.annotation.Resource; @@ -20,6 +19,7 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -38,8 +38,6 @@ public class MesQcIqcDefectServiceImpl implements MesQcIqcDefectService { @Resource private MesQcIqcDefectMapper iqcDefectMapper; @Resource - private MesQcIqcLineMapper iqcLineMapper; - @Resource private MesQcIqcMapper iqcMapper; @Resource @Lazy @@ -130,8 +128,9 @@ public class MesQcIqcDefectServiceImpl implements MesQcIqcDefectService { // 1. 查询所有缺陷记录 List defects = iqcDefectMapper.selectListByIqcId(iqcId); - // 2. 更新每行的缺陷数量 + // 2. 按行汇总缺陷数量,批量更新 List lines = iqcLineService.selectListByIqcId(iqcId); + List updateLines = new ArrayList<>(); for (MesQcIqcLineDO line : lines) { int critical = 0, major = 0, minor = 0; for (MesQcIqcDefectDO defect : defects) { @@ -149,8 +148,10 @@ public class MesQcIqcDefectServiceImpl implements MesQcIqcDefectService { throw exception(QC_IQC_DEFECT_LEVEL_UNKNOWN); } } - updateLineDefectStats(line.getId(), critical, major, minor); + updateLines.add(new MesQcIqcLineDO().setId(line.getId()) + .setCriticalQuantity(critical).setMajorQuantity(major).setMinorQuantity(minor)); } + iqcLineService.batchUpdateDefectStats(updateLines); // 3.1 汇总主表的缺陷数量 int totalCritical = 0, totalMajor = 0, totalMinor = 0; @@ -187,14 +188,4 @@ public class MesQcIqcDefectServiceImpl implements MesQcIqcDefectService { iqcMapper.updateById(updateIqc); } - // TODO @AI:在 iqclineservice 里,提供一个方法,直接根据行 ID 列表,批量更新缺陷统计数量。然后这里直接调用即可,避免循环更新数据库。 - /** - * 更新检验行的缺陷统计数量 - */ - private void updateLineDefectStats(Long lineId, int critical, int major, int minor) { - MesQcIqcLineDO updateLine = new MesQcIqcLineDO().setId(lineId) - .setCriticalQuantity(critical).setMajorQuantity(major).setMinorQuantity(minor); - iqcLineMapper.updateById(updateLine); - } - } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineService.java index dd0b8b9..10b8906 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineService.java @@ -46,6 +46,13 @@ public interface MesQcIqcLineService { void createLinesFromTemplate(Long iqcId, Long templateId); /** + * 批量更新行的缺陷统计数量 + * + * @param lines 待更新的行列表(只需设置 id、criticalQuantity、majorQuantity、minorQuantity) + */ + void batchUpdateDefectStats(List lines); + + /** * 根据来料检验单 ID 级联删除所有行 * * @param iqcId 来料检验单 ID diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineServiceImpl.java index d5d9486..0cb2720 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcLineServiceImpl.java @@ -57,6 +57,13 @@ public class MesQcIqcLineServiceImpl implements MesQcIqcLineService { } @Override + public void batchUpdateDefectStats(List lines) { + for (MesQcIqcLineDO line : lines) { + iqcLineMapper.updateById(line); + } + } + + @Override public void deleteByIqcId(Long iqcId) { iqcLineMapper.deleteByIqcId(iqcId); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java index 5627cfb..eb8025b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.mes.service.qc.lqc; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; -import cn.iocoder.yudao.framework.common.exception.ErrorCode; 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.iqc.vo.MesQcIqcPageReqVO; @@ -76,11 +75,9 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { @Override public void updateIqc(MesQcIqcSaveReqVO updateReqVO) { - // 1.1 校验存在 - MesQcIqcDO iqc = validateIqcExists(updateReqVO.getId()); - // 1.2 校验状态为草稿 - validatePrepareStatus(iqc, QC_IQC_ONLY_PREPARE_CAN_COMPLETE); - // 1.3 校验编号唯一 + // 1.1 校验存在 + 草稿状态 + validateIqcStatusPrepare(updateReqVO.getId()); + // 1.2 校验编号唯一 validateIqcCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); // 2. 更新 @@ -90,11 +87,9 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { @Override public void completeIqc(Long id) { - // 1.1 校验存在 - MesQcIqcDO iqc = validateIqcExists(id); - // 1.2 校验状态为草稿 - validatePrepareStatus(iqc, QC_IQC_ONLY_PREPARE_CAN_COMPLETE); - // 1.3 校验合格品 + 不合格品 = 检测数量 + // 1.1 校验存在 + 草稿状态 + MesQcIqcDO iqc = validateIqcStatusPrepare(id); + // 1.2 校验合格品 + 不合格品 = 检测数量 if (iqc.getCheckQuantity() != null && iqc.getCheckQuantity() > 0) { int total = (iqc.getQualifiedQuantity() != null ? iqc.getQualifiedQuantity() : 0) + (iqc.getUnqualifiedQuantity() != null ? iqc.getUnqualifiedQuantity() : 0); @@ -114,10 +109,8 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { @Override @Transactional(rollbackFor = Exception.class) public void deleteIqc(Long id) { - // 1.1 校验存在 - MesQcIqcDO iqc = validateIqcExists(id); - // 1.2 仅草稿可删 - validatePrepareStatus(iqc, QC_IQC_ONLY_PREPARE_CAN_DELETE); + // 1. 校验存在 + 草稿状态 + validateIqcStatusPrepare(id); // 2.1 删除主表 iqcMapper.deleteById(id); @@ -127,19 +120,21 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { iqcDefectService.deleteByIqcId(id); } - private MesQcIqcDO validateIqcExists(Long id) { + /** + * 校验来料检验单存在且为草稿状态 + * + * @param id 来料检验单 ID + * @return 来料检验单 + */ + private MesQcIqcDO validateIqcStatusPrepare(Long id) { MesQcIqcDO iqc = iqcMapper.selectById(id); if (iqc == null) { throw exception(QC_IQC_NOT_EXISTS); } - return iqc; - } - - // TODO @AI:就搞个方法,传递 id 进去;抛出不为 草稿状态的异常;然后在 update/delete/complete 方法中调用这个方法(不用专门 errorCode) - private void validatePrepareStatus(MesQcIqcDO iqc, ErrorCode errorCode) { if (ObjUtil.notEqual(iqc.getStatus(), MesQcIqcStatusEnum.PREPARE.getType())) { - throw exception(errorCode); + throw exception(QC_IQC_NOT_PREPARE); } + return iqc; } private void validateIqcCodeUnique(Long id, String code) { -- libgit2 0.21.4