Commit 74005fc603047ad9288b85b23ddc5ffac2afcd80
1 parent
4080ca5e
fix(mes): 工艺路线模块 TODO 修复:启用限制、枚举规范、字典链接
- 工艺路线启用后禁止关闭/删除,前后端+关联表(工序/产品/BOM)均增加校验 - MesProLinkTypeEnum 枚举常量重命名为全称(START_START/FINISH_FINISH 等) - 新增 MesTimeUnitTypeEnum 时间单位枚举(MINUTE/HOUR/DAY) - DictTypeConstants 补充 MES_PRO_LINK_TYPE、MES_TIME_UNIT_TYPE - MesProRouteProcessDO/MesProRouteProductDO 补充字典+枚举 Javadoc 链接 - MesProRouteProcessMapper 移除冗余的 findPreProcess/findNextProcess 方法
Showing
11 changed files
with
75 additions
and
43 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/route/MesProRouteProcessDO.java
| ... | ... | @@ -51,6 +51,7 @@ public class MesProRouteProcessDO extends BaseDO { |
| 51 | 51 | /** |
| 52 | 52 | * 与下一道工序关系 |
| 53 | 53 | * |
| 54 | + * 字典 {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_PRO_LINK_TYPE} | |
| 54 | 55 | * 枚举 {@link cn.iocoder.yudao.module.mes.enums.pro.MesProLinkTypeEnum} |
| 55 | 56 | */ |
| 56 | 57 | private Integer linkType; | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/pro/route/MesProRouteProductDO.java
| ... | ... | @@ -51,9 +51,9 @@ public class MesProRouteProductDO extends BaseDO { |
| 51 | 51 | /** |
| 52 | 52 | * 时间单位 |
| 53 | 53 | * |
| 54 | - * 字典类型 mes_time_unit_type | |
| 54 | + * 字典 {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_TIME_UNIT_TYPE} | |
| 55 | + * 枚举 {@link cn.iocoder.yudao.module.mes.enums.pro.MesTimeUnitTypeEnum} | |
| 55 | 56 | */ |
| 56 | - // TODO @AI:外链 @ 加下,字典 + 枚举类;(需要枚举出来。在 dictconstants 里) | |
| 57 | 57 | private String timeUnitType; |
| 58 | 58 | /** |
| 59 | 59 | * 备注 | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/pro/MesProRouteProcessMapper.java
| ... | ... | @@ -48,22 +48,4 @@ public interface MesProRouteProcessMapper extends BaseMapperX<MesProRouteProcess |
| 48 | 48 | return selectList(MesProRouteProcessDO::getProcessId, processId); |
| 49 | 49 | } |
| 50 | 50 | |
| 51 | - default MesProRouteProcessDO findPreProcess(Long routeId, Integer sort) { | |
| 52 | - return selectOne(new LambdaQueryWrapperX<MesProRouteProcessDO>() | |
| 53 | - .eq(MesProRouteProcessDO::getRouteId, routeId) | |
| 54 | - .lt(MesProRouteProcessDO::getSort, sort) | |
| 55 | - .orderByDesc(MesProRouteProcessDO::getSort) | |
| 56 | - // TODO @AI:limit 1,使用 mybatis utils | |
| 57 | - .last("LIMIT 1")); | |
| 58 | - } | |
| 59 | - | |
| 60 | - default MesProRouteProcessDO findNextProcess(Long routeId, Integer sort) { | |
| 61 | - return selectOne(new LambdaQueryWrapperX<MesProRouteProcessDO>() | |
| 62 | - .eq(MesProRouteProcessDO::getRouteId, routeId) | |
| 63 | - .gt(MesProRouteProcessDO::getSort, sort) | |
| 64 | - .orderByAsc(MesProRouteProcessDO::getSort) | |
| 65 | - // TODO @AI:limit 1,使用 mybatis utils | |
| 66 | - .last("LIMIT 1")); | |
| 67 | - } | |
| 68 | - | |
| 69 | 51 | } | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java
| ... | ... | @@ -24,5 +24,7 @@ public interface DictTypeConstants { |
| 24 | 24 | String MES_PRO_WORK_ORDER_SOURCE_TYPE = "mes_pro_work_order_source_type"; // MES 工单来源类型 |
| 25 | 25 | String MES_PRO_WORK_ORDER_TYPE = "mes_pro_work_order_type"; // MES 工单类型 |
| 26 | 26 | String MES_QC_TYPE = "mes_qc_type"; // MES 检测种类(IQC/IPQC/OQC/RQC) |
| 27 | + String MES_PRO_LINK_TYPE = "mes_pro_link_type"; // MES 工序关系类型 | |
| 28 | + String MES_TIME_UNIT_TYPE = "mes_time_unit_type"; // MES 时间单位 | |
| 27 | 29 | |
| 28 | 30 | } | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
| ... | ... | @@ -150,6 +150,7 @@ public interface ErrorCodeConstants { |
| 150 | 150 | ErrorCode PRO_ROUTE_ENABLE_NO_PROCESS = new ErrorCode(1_040_501_002, "请先添加组成工序"); |
| 151 | 151 | ErrorCode PRO_ROUTE_ENABLE_NO_KEY_PROCESS = new ErrorCode(1_040_501_003, "工艺路线必须要有关键工序"); |
| 152 | 152 | ErrorCode PRO_ROUTE_ENABLE_PRODUCT_NO_BOM = new ErrorCode(1_040_501_004, "产品 {} 未配置工序的 BOM 消耗"); |
| 153 | + ErrorCode PRO_ROUTE_IS_ENABLE = new ErrorCode(1_040_501_005, "工艺路线已启用,不允许操作"); | |
| 153 | 154 | // ========== MES 生产管理-工艺路线工序(1-040-501-100) ========== |
| 154 | 155 | ErrorCode PRO_ROUTE_PROCESS_NOT_EXISTS = new ErrorCode(1_040_501_100, "工艺路线工序不存在"); |
| 155 | 156 | ErrorCode PRO_ROUTE_PROCESS_SORT_DUPLICATE = new ErrorCode(1_040_501_101, "序号已存在"); | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/pro/MesProLinkTypeEnum.java
| ... | ... | @@ -15,11 +15,10 @@ import java.util.Arrays; |
| 15 | 15 | @AllArgsConstructor |
| 16 | 16 | public enum MesProLinkTypeEnum implements ArrayValuable<Integer> { |
| 17 | 17 | |
| 18 | - // TODO @AI:START_START,类似这样的缩写; | |
| 19 | - SS(0, "开始-开始"), | |
| 20 | - FF(1, "结束-结束"), | |
| 21 | - SF(2, "开始-结束"), | |
| 22 | - FS(3, "结束-开始"); | |
| 18 | + START_START(0, "开始-开始"), | |
| 19 | + FINISH_FINISH(1, "结束-结束"), | |
| 20 | + START_FINISH(2, "开始-结束"), | |
| 21 | + FINISH_START(3, "结束-开始"); | |
| 23 | 22 | |
| 24 | 23 | public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesProLinkTypeEnum::getType).toArray(Integer[]::new); |
| 25 | 24 | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java
| ... | ... | @@ -41,6 +41,8 @@ public class MesProRouteProcessServiceImpl implements MesProRouteProcessService |
| 41 | 41 | @Override |
| 42 | 42 | @Transactional(rollbackFor = Exception.class) |
| 43 | 43 | public Long createRouteProcess(MesProRouteProcessSaveReqVO createReqVO) { |
| 44 | + // 1.0 已启用的工艺路线,不允许操作 | |
| 45 | + routeService.validateRouteNotEnable(createReqVO.getRouteId()); | |
| 44 | 46 | // 1.1 校验工艺路线、工序存在 |
| 45 | 47 | validateRouteAndProcessExists(createReqVO.getRouteId(), createReqVO.getProcessId()); |
| 46 | 48 | // 1.2 校验唯一性 |
| ... | ... | @@ -60,6 +62,8 @@ public class MesProRouteProcessServiceImpl implements MesProRouteProcessService |
| 60 | 62 | @Override |
| 61 | 63 | @Transactional(rollbackFor = Exception.class) |
| 62 | 64 | public void updateRouteProcess(MesProRouteProcessSaveReqVO updateReqVO) { |
| 65 | + // 1.0 已启用的工艺路线,不允许操作 | |
| 66 | + routeService.validateRouteNotEnable(updateReqVO.getRouteId()); | |
| 63 | 67 | // 1.1 校验存在 |
| 64 | 68 | validateRouteProcessExists(updateReqVO.getId()); |
| 65 | 69 | // 1.2 校验工艺路线、工序存在 |
| ... | ... | @@ -80,11 +84,10 @@ public class MesProRouteProcessServiceImpl implements MesProRouteProcessService |
| 80 | 84 | @Override |
| 81 | 85 | @Transactional(rollbackFor = Exception.class) |
| 82 | 86 | public void deleteRouteProcess(Long id) { |
| 83 | - // 1. 校验存在 | |
| 84 | - MesProRouteProcessDO routeProcess = routeProcessMapper.selectById(id); | |
| 85 | - if (routeProcess == null) { | |
| 86 | - throw exception(PRO_ROUTE_PROCESS_NOT_EXISTS); | |
| 87 | - } | |
| 87 | + // 1.1 校验存在 | |
| 88 | + MesProRouteProcessDO routeProcess = validateRouteProcessExists(id); | |
| 89 | + // 1.2 已启用的工艺路线,不允许操作 | |
| 90 | + routeService.validateRouteNotEnable(routeProcess.getRouteId()); | |
| 88 | 91 | |
| 89 | 92 | // 2. 删除 |
| 90 | 93 | routeProcessMapper.deleteById(id); |
| ... | ... | @@ -114,10 +117,12 @@ public class MesProRouteProcessServiceImpl implements MesProRouteProcessService |
| 114 | 117 | } |
| 115 | 118 | } |
| 116 | 119 | |
| 117 | - private void validateRouteProcessExists(Long id) { | |
| 118 | - if (routeProcessMapper.selectById(id) == null) { | |
| 120 | + private MesProRouteProcessDO validateRouteProcessExists(Long id) { | |
| 121 | + MesProRouteProcessDO routeProcess = routeProcessMapper.selectById(id); | |
| 122 | + if (routeProcess == null) { | |
| 119 | 123 | throw exception(PRO_ROUTE_PROCESS_NOT_EXISTS); |
| 120 | 124 | } |
| 125 | + return routeProcess; | |
| 121 | 126 | } |
| 122 | 127 | |
| 123 | 128 | private void validateRouteAndProcessExists(Long routeId, Long processId) { | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProductBomServiceImpl.java
| ... | ... | @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.productbom.MesP |
| 6 | 6 | import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductBomDO; |
| 7 | 7 | import cn.iocoder.yudao.module.mes.dal.mysql.pro.MesProRouteProductBomMapper; |
| 8 | 8 | import jakarta.annotation.Resource; |
| 9 | +import org.springframework.context.annotation.Lazy; | |
| 9 | 10 | import org.springframework.stereotype.Service; |
| 10 | 11 | import org.springframework.validation.annotation.Validated; |
| 11 | 12 | |
| ... | ... | @@ -26,9 +27,15 @@ public class MesProRouteProductBomServiceImpl implements MesProRouteProductBomSe |
| 26 | 27 | @Resource |
| 27 | 28 | private MesProRouteProductBomMapper routeProductBomMapper; |
| 28 | 29 | |
| 30 | + @Resource | |
| 31 | + @Lazy | |
| 32 | + private MesProRouteService routeService; | |
| 33 | + | |
| 29 | 34 | @Override |
| 30 | 35 | public Long createRouteProductBom(MesProRouteProductBomSaveReqVO createReqVO) { |
| 31 | - // 1. 校验唯一性 | |
| 36 | + // 1.0 已启用的工艺路线,不允许操作 | |
| 37 | + routeService.validateRouteNotEnable(createReqVO.getRouteId()); | |
| 38 | + // 1.1 校验唯一性 | |
| 32 | 39 | validateBomUnique(null, createReqVO.getItemId(), createReqVO.getProcessId(), createReqVO.getProductId()); |
| 33 | 40 | // 2. 插入 |
| 34 | 41 | MesProRouteProductBomDO routeProductBom = BeanUtils.toBean(createReqVO, MesProRouteProductBomDO.class); |
| ... | ... | @@ -38,9 +45,11 @@ public class MesProRouteProductBomServiceImpl implements MesProRouteProductBomSe |
| 38 | 45 | |
| 39 | 46 | @Override |
| 40 | 47 | public void updateRouteProductBom(MesProRouteProductBomSaveReqVO updateReqVO) { |
| 41 | - // 1. 校验存在 | |
| 48 | + // 1.0 已启用的工艺路线,不允许操作 | |
| 49 | + routeService.validateRouteNotEnable(updateReqVO.getRouteId()); | |
| 50 | + // 1.1 校验存在 | |
| 42 | 51 | validateRouteProductBomExists(updateReqVO.getId()); |
| 43 | - // 2. 校验唯一性 | |
| 52 | + // 1.2 校验唯一性 | |
| 44 | 53 | validateBomUnique(updateReqVO.getId(), updateReqVO.getItemId(), updateReqVO.getProcessId(), updateReqVO.getProductId()); |
| 45 | 54 | // 3. 更新 |
| 46 | 55 | MesProRouteProductBomDO updateObj = BeanUtils.toBean(updateReqVO, MesProRouteProductBomDO.class); |
| ... | ... | @@ -49,8 +58,13 @@ public class MesProRouteProductBomServiceImpl implements MesProRouteProductBomSe |
| 49 | 58 | |
| 50 | 59 | @Override |
| 51 | 60 | public void deleteRouteProductBom(Long id) { |
| 52 | - // 1. 校验存在 | |
| 53 | - validateRouteProductBomExists(id); | |
| 61 | + // 1.1 校验存在 | |
| 62 | + MesProRouteProductBomDO bom = routeProductBomMapper.selectById(id); | |
| 63 | + if (bom == null) { | |
| 64 | + throw exception(PRO_ROUTE_PRODUCT_BOM_NOT_EXISTS); | |
| 65 | + } | |
| 66 | + // 1.2 已启用的工艺路线,不允许操作 | |
| 67 | + routeService.validateRouteNotEnable(bom.getRouteId()); | |
| 54 | 68 | // 2. 删除 |
| 55 | 69 | routeProductBomMapper.deleteById(id); |
| 56 | 70 | } | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProductServiceImpl.java
| ... | ... | @@ -30,11 +30,16 @@ public class MesProRouteProductServiceImpl implements MesProRouteProductService |
| 30 | 30 | |
| 31 | 31 | @Resource |
| 32 | 32 | @Lazy |
| 33 | + private MesProRouteService routeService; | |
| 34 | + @Resource | |
| 35 | + @Lazy | |
| 33 | 36 | private MesProRouteProductBomService routeProductBomService; |
| 34 | 37 | |
| 35 | 38 | @Override |
| 36 | 39 | public Long createRouteProduct(MesProRouteProductSaveReqVO createReqVO) { |
| 37 | - // 1. 校验产品唯一性(一个产品只能关联一条工艺路线) | |
| 40 | + // 1.0 已启用的工艺路线,不允许操作 | |
| 41 | + routeService.validateRouteNotEnable(createReqVO.getRouteId()); | |
| 42 | + // 1.1 校验产品唯一性(一个产品只能关联一条工艺路线) | |
| 38 | 43 | validateItemUnique(null, createReqVO.getItemId()); |
| 39 | 44 | |
| 40 | 45 | // 2. 插入 |
| ... | ... | @@ -45,6 +50,8 @@ public class MesProRouteProductServiceImpl implements MesProRouteProductService |
| 45 | 50 | |
| 46 | 51 | @Override |
| 47 | 52 | public void updateRouteProduct(MesProRouteProductSaveReqVO updateReqVO) { |
| 53 | + // 1.0 已启用的工艺路线,不允许操作 | |
| 54 | + routeService.validateRouteNotEnable(updateReqVO.getRouteId()); | |
| 48 | 55 | // 1.1 校验存在 |
| 49 | 56 | validateRouteProductExists(updateReqVO.getId()); |
| 50 | 57 | // 1.2 校验产品唯一性 |
| ... | ... | @@ -58,9 +65,11 @@ public class MesProRouteProductServiceImpl implements MesProRouteProductService |
| 58 | 65 | @Override |
| 59 | 66 | @Transactional(rollbackFor = Exception.class) |
| 60 | 67 | public void deleteRouteProduct(Long id) { |
| 61 | - // 1. 校验存在 | |
| 68 | + // 1.1 校验存在 | |
| 62 | 69 | MesProRouteProductDO routeProduct = routeProductMapper.selectById(id); |
| 63 | 70 | validateRouteProductExists(routeProduct); |
| 71 | + // 1.2 已启用的工艺路线,不允许操作 | |
| 72 | + routeService.validateRouteNotEnable(routeProduct.getRouteId()); | |
| 64 | 73 | |
| 65 | 74 | // 2.1 级联删除关联的 BOM |
| 66 | 75 | routeProductBomService.deleteRouteProductBomByRouteIdAndProductId(routeProduct.getRouteId(), routeProduct.getItemId()); | ... | ... |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteService.java
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteServiceImpl.java
| ... | ... | @@ -71,7 +71,7 @@ public class MesProRouteServiceImpl implements MesProRouteService { |
| 71 | 71 | @Override |
| 72 | 72 | public void updateRouteStatus(Long id, Integer status) { |
| 73 | 73 | // 1.1 校验存在 |
| 74 | - validateRouteExists(id); | |
| 74 | + MesProRouteDO route = validateRouteExists(id); | |
| 75 | 75 | // 1.2 启用时的校验 |
| 76 | 76 | if (CommonStatusEnum.ENABLE.getStatus().equals(status)) { |
| 77 | 77 | validateRouteEnable(id); |
| ... | ... | @@ -84,8 +84,10 @@ public class MesProRouteServiceImpl implements MesProRouteService { |
| 84 | 84 | @Override |
| 85 | 85 | @Transactional(rollbackFor = Exception.class) |
| 86 | 86 | public void deleteRoute(Long id) { |
| 87 | - // 1. 校验存在 | |
| 87 | + // 1.1 校验存在 | |
| 88 | 88 | validateRouteExists(id); |
| 89 | + // 1.2 已启用的工艺路线,不允许删除 | |
| 90 | + validateRouteNotEnable(id); | |
| 89 | 91 | |
| 90 | 92 | // 2.1 级联删除 |
| 91 | 93 | routeProcessService.deleteRouteProcessByRouteId(id); |
| ... | ... | @@ -95,10 +97,12 @@ public class MesProRouteServiceImpl implements MesProRouteService { |
| 95 | 97 | routeMapper.deleteById(id); |
| 96 | 98 | } |
| 97 | 99 | |
| 98 | - private void validateRouteExists(Long id) { | |
| 99 | - if (routeMapper.selectById(id) == null) { | |
| 100 | + private MesProRouteDO validateRouteExists(Long id) { | |
| 101 | + MesProRouteDO route = routeMapper.selectById(id); | |
| 102 | + if (route == null) { | |
| 100 | 103 | throw exception(PRO_ROUTE_NOT_EXISTS); |
| 101 | 104 | } |
| 105 | + return route; | |
| 102 | 106 | } |
| 103 | 107 | |
| 104 | 108 | private void validateRouteCodeUnique(Long id, String code) { |
| ... | ... | @@ -151,4 +155,12 @@ public class MesProRouteServiceImpl implements MesProRouteService { |
| 151 | 155 | return routeMapper.selectListByStatus(status); |
| 152 | 156 | } |
| 153 | 157 | |
| 158 | + @Override | |
| 159 | + public void validateRouteNotEnable(Long routeId) { | |
| 160 | + MesProRouteDO route = routeMapper.selectById(routeId); | |
| 161 | + if (route != null && CommonStatusEnum.ENABLE.getStatus().equals(route.getStatus())) { | |
| 162 | + throw exception(PRO_ROUTE_IS_ENABLE); | |
| 163 | + } | |
| 164 | + } | |
| 165 | + | |
| 154 | 166 | } | ... | ... |