7 天以前 e418f64a7ca0d6ec76096c46a2b543dab8495119
refactor(mes): 调整物料状态控制逻辑

- 移除 MES 侧物料状态更新接口,状态只能由 MDM 控制
- MDM 物料同步到 MES 时传递状态,MES 物料状态跟随 MDM 保持同步
- MES 本地新增物料默认状态为禁用,且不允许自行修改状态
- 在 MesMdItemSaveReqVO 和 MesMdItemSyncReqDTO 中添加状态字段
- 更新 MDM 物料服务实现以同步状态字段到 MES
- 状态字段在 MES 侧变为只读,移除相关状态开关功能
- 添加物料状态控制文档说明前后端联调方案
已修改5个文件
已添加1个文件
87 ■■■■ 文件已修改
docs/mes_item_status_control.md 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/api/item/dto/MesMdItemSyncReqDTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemSaveReqVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/mes_item_status_control.md
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
# MES ç‰©æ–™çŠ¶æ€æŽ§åˆ¶ - å‰ç«¯è”调方案
## å˜æ›´æ¦‚è¿°
- MES æ¨¡å—**不再允许控制物料状态**,状态只能由基础数据(MDM)物料管理控制。
- ç§»é™¤ MES æŽ¥å£ `PUT /mes/md/item/update-status`。
- MDM ç‰©æ–™åŒæ­¥åˆ° MES æ—¶ä¼ é€’状态(启用/禁用),MES ç‰©æ–™çŠ¶æ€è·Ÿéš MDM ä¿æŒåŒæ­¥ã€‚
## æ¶‰åŠé¡µé¢
- MES ç‰©æ–™åˆ—表页:`src/views/mes/md/item/index.vue`(移除状态开关,改为只读展示)
- MES ç‰©æ–™æ–°å¢ž/编辑表单:`src/views/mes/md/item/modules/form.vue`(状态字段改为禁用/只读)
- åŸºç¡€æ•°æ®ç‰©æ–™ç®¡ç†é¡µï¼š`src/views/basicData/mdm/index.vue`(状态控制入口,保持不变)
## API
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| PUT(已移除) | `/mes/md/item/update-status` | MES ä¾§çŠ¶æ€æŽ§åˆ¶æŽ¥å£ï¼Œå·²åºŸå¼ƒï¼Œå‰ç«¯**不得再调用** |
MDM çŠ¶æ€æŽ§åˆ¶æŽ¥å£ï¼ˆä¿æŒä¸å˜ï¼ŒçŠ¶æ€ä¼šåŒæ­¥åˆ° MES):
| æ–¹æ³• | è·¯å¾„ | è¯´æ˜Ž |
|------|------|------|
| POST | `/mdm/item/create` | åˆ›å»ºç‰©æ–™ï¼Œstatus éšåŒæ­¥å¸¦å…¥ MES |
| PUT | `/mdm/item/update` | æ›´æ–°ç‰©æ–™ï¼Œstatus éšåŒæ­¥å¸¦å…¥ MES |
| PUT | `/mdm/item/update-status` | æ›´æ–°ç‰©æ–™çŠ¶æ€ï¼Œå®žæ—¶åŒæ­¥åˆ° MES |
## æ•°æ®å¸¦å…¥è¯´æ˜Ž
1. MDM åˆ›å»º/编辑物料时,`status`(0=启用,1=禁用)随同步链路带入 MES,MES ç‰©æ–™æ–°å»ºæ²¿ç”¨ MDM çŠ¶æ€ã€‚
2. MDM ç‰©æ–™å¯ç”¨/禁用(`update-status`),状态实时同步到 MES。
3. MES æœ¬åœ°æ–°å¢žç‰©æ–™ï¼ˆä¸ç»è¿‡ MDM åŒæ­¥ï¼‰é»˜è®¤çŠ¶æ€ä¸º**禁用**,且 MES ä¾§æ— æ³•自行启用,须在 MDM ä¸­å¯ç”¨åŽåŒæ­¥å›ž MES。
## å­—段展示规则
| å­—段 | å±•示位置 | è¯´æ˜Ž |
|------|----------|------|
| çŠ¶æ€ | MES ç‰©æ–™åˆ—表 | åªè¯»å±•示,来源为 MDM åŒæ­¥çŠ¶æ€ï¼Œä¸å†æä¾›å¼€å…³åˆ‡æ¢ |
| çŠ¶æ€ | MES æ–°å¢ž/编辑表单 | ç¦ç”¨/隐藏,不允许修改 |
| çŠ¶æ€ | MDM ç‰©æ–™åˆ—表/表单 | å¯ç¼–辑,为状态唯一控制入口 |
## ä¸šåŠ¡è§„åˆ™è¯´æ˜Ž
| åœºæ™¯ | è§„则 |
|------|------|
| MDM åˆ›å»º/编辑物料 | çŠ¶æ€éšåŒæ­¥åˆ° MES,MES ç‰©æ–™çŠ¶æ€ä¿æŒä¸€è‡´ |
| MDM å¯ç”¨/禁用物料 | çŠ¶æ€å®žæ—¶åŒæ­¥åˆ° MES |
| MES æœ¬åœ°æ–°å¢žç‰©æ–™ | é»˜è®¤ç¦ç”¨ï¼ŒMES ä¾§æ— æ³•启用,须在 MDM ä¸­å¯ç”¨ |
| MES ç¼–辑物料 | ä¸å…è®¸ä¿®æ”¹çŠ¶æ€å­—æ®µ |
| MES çŠ¶æ€æŽ§åˆ¶ | ä¸å†æä¾›å¯ç”¨/禁用入口 |
## æ³¨æ„äº‹é¡¹
- MES åˆ—表页需移除状态开关(`updateItemStatus` ç›¸å…³è°ƒç”¨ï¼‰ï¼ŒçŠ¶æ€åˆ—æ”¹ä¸ºåªè¯»æ–‡æœ¬/标签展示,或保留展示列但去掉可切换能力。
- MES æ–°å¢ž/编辑表单中的状态字段需禁用或隐藏,避免误传导致状态被修改。
- å‰ç«¯ `src/api/mes/md/item/index.ts` ä¸­çš„ `updateItemStatus` å‡½æ•°å¯ä¸€å¹¶æ¸…理(接口已移除)。
- MDM å¯ç”¨ç‰©æ–™æ—¶ï¼Œè‹¥è¯¥ç‰©æ–™åœ¨ MES ä¾§å¯ç”¨äº†æ‰¹æ¬¡ç®¡ç†ä½†æœªé…ç½®æ‰¹æ¬¡å±žæ€§ã€æˆ–为产品但未配置 BOM,MES åŒæ­¥æ ¡éªŒå¯èƒ½æ‹¦æˆªå¯ç”¨æ“ä½œï¼Œéœ€å…ˆåœ¨ MES ä¾§è¡¥é½å¯¹åº”配置。
yudao-module-mdm/src/main/java/cn/iocoder/yudao/module/mdm/service/item/MdmItemServiceImpl.java
@@ -143,6 +143,7 @@
        syncReqDTO.setMaxStock(reqVO.getMaxStock());
        syncReqDTO.setHighValue(reqVO.getIsHighValue());
        syncReqDTO.setBatchFlag(reqVO.getIsBatchManaged());
        syncReqDTO.setStatus(reqVO.getStatus());
        syncReqDTO.setRemark(reqVO.getRemark());
        // æ‰¹æ¬¡é…ç½®å­—段
        syncReqDTO.setProduceDateFlag(reqVO.getProduceDateFlag());
yudao-module-mes-api/src/main/java/cn/iocoder/yudao/module/mes/api/item/dto/MesMdItemSyncReqDTO.java
@@ -42,6 +42,9 @@
    @Schema(description = "备注", example = "备注")
    private String remark;
    @Schema(description = "状态", example = "1")
    private Integer status;
    // ========== æ‰¹æ¬¡å±žæ€§é…ç½® ==========
    @Schema(description = "生产日期必填", example = "true")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java
@@ -19,7 +19,6 @@
import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
@@ -62,19 +61,6 @@
    @PreAuthorize("@ss.hasPermission('mes:md-item:update')")
    public CommonResult<Boolean> updateItem(@Valid @RequestBody MesMdItemSaveReqVO updateReqVO) {
        itemService.updateItem(updateReqVO);
        return success(true);
    }
    @PutMapping("/update-status")
    @Operation(summary = "更新物料产品状态")
    @Parameters({
            @Parameter(name = "id", description = "编号", required = true),
            @Parameter(name = "status", description = "状态", required = true)
    })
    @PreAuthorize("@ss.hasPermission('mes:md-item:update')")
    public CommonResult<Boolean> updateItemStatus(@RequestParam("id") Long id,
                                                  @RequestParam("status") Integer status) {
        itemService.updateItemStatus(id, status);
        return success(true);
    }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemSaveReqVO.java
@@ -51,6 +51,9 @@
    @Schema(description = "备注", example = "备注")
    private String remark;
    @Schema(description = "状态", example = "1")
    private Integer status;
    @Schema(description = "是否同步到 MDM", example = "true")
    private Boolean syncMdm;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java
@@ -84,7 +84,9 @@
        // æ’å…¥
        MesMdItemDO item = BeanUtils.toBean(createReqVO, MesMdItemDO.class);
        item.setStatus(CommonStatusEnum.DISABLE.getStatus()); // é»˜è®¤ç¦ç”¨ã€‚信息完成后,再启用
        // çŠ¶æ€åªèƒ½ç”±åŸºç¡€æ•°æ®ï¼ˆMDM)控制:MDM åŒæ­¥æ—¶æ²¿ç”¨å…¶çŠ¶æ€ï¼›MES æœ¬åœ°æ–°å¢žé»˜è®¤ç¦ç”¨
        item.setStatus(createReqVO.getMdmItemId() != null && createReqVO.getStatus() != null
                ? createReqVO.getStatus() : CommonStatusEnum.DISABLE.getStatus());
        clearStockIfNotSafe(item); // å¦‚果未启用安全库存,清零库存上下限
        itemMapper.insert(item);
@@ -111,6 +113,10 @@
        // æ›´æ–°
        MesMdItemDO updateObj = BeanUtils.toBean(updateReqVO, MesMdItemDO.class);
        clearStockIfNotSafe(updateObj); // å¦‚果未启用安全库存,清零库存上下限
        // çŠ¶æ€åªèƒ½ç”±åŸºç¡€æ•°æ®ï¼ˆMDM)控制,MES æœ¬åœ°æ›´æ–°ä¸å…è®¸ä¿®æ”¹çŠ¶æ€
        if (updateReqVO.getMdmItemId() == null) {
            updateObj.setStatus(null);
        }
        itemMapper.updateById(updateObj);
        // åŒæ­¥åˆ° MDM(勾选 syncMdm æ—¶ï¼‰