yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProcessServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.process.MesProProcessOutputItemVO;
import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.process.MesProRouteProcessSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductBomDO;
@@ -14,9 +15,11 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -63,12 +66,8 @@
        // 2. 插入
        MesProRouteProcessDO routeProcess = BeanUtils.toBean(createReqVO, MesProRouteProcessDO.class);
        if (CollUtil.isNotEmpty(createReqVO.getOutputItemIds())) {
            routeProcess.setOutputItemId(
                createReqVO.getOutputItemIds().stream()
                    .map(String::valueOf)
                    .collect(Collectors.joining(",")));
        }
        // 产出配置(含归属产品)序列化为 JSON 存入 output_item_id;兼容旧的 outputItemIds 平铺格式
        routeProcess.setOutputItemId(serializeOutputs(createReqVO.getOutputs(), createReqVO.getOutputItemIds()));
        routeProcessMapper.insert(routeProcess);
        // 3. 更新工序链
@@ -98,11 +97,10 @@
        // 2. 更新
        MesProRouteProcessDO updateObj = BeanUtils.toBean(updateReqVO, MesProRouteProcessDO.class);
        if (CollUtil.isNotEmpty(updateReqVO.getOutputItemIds())) {
            updateObj.setOutputItemId(
                updateReqVO.getOutputItemIds().stream()
                    .map(String::valueOf)
                    .collect(Collectors.joining(",")));
        // 产出配置:只要前端显式传了 outputs / outputItemIds 就覆盖(传空数组表示清空)
        if (updateReqVO.getOutputs() != null || updateReqVO.getOutputItemIds() != null) {
            String serialized = serializeOutputs(updateReqVO.getOutputs(), updateReqVO.getOutputItemIds());
            updateObj.setOutputItemId(serialized == null ? "" : serialized);
        }
        routeProcessMapper.updateById(updateObj);
@@ -245,4 +243,38 @@
        routeProcessMapper.deleteByRouteId(routeId);
    }
    /**
     * 产出配置序列化到 output_item_id 字段(JSON 数组)
     * 格式:[{"itemId":231,"productId":231}]
     */
    private String serializeOutputs(List<MesProProcessOutputItemVO> outputs, List<Long> outputItemIds) {
        List<Map<String, Object>> list = new ArrayList<>();
        if (CollUtil.isNotEmpty(outputs)) {
            for (MesProProcessOutputItemVO vo : outputs) {
                if (vo == null || vo.getItemId() == null) {
                    continue;
                }
                Map<String, Object> m = new LinkedHashMap<>();
                m.put("itemId", vo.getItemId());
                if (vo.getProductId() != null) {
                    m.put("productId", vo.getProductId());
                }
                list.add(m);
            }
        } else if (CollUtil.isNotEmpty(outputItemIds)) {
            for (Long id : outputItemIds) {
                if (id == null) {
                    continue;
                }
                Map<String, Object> m = new LinkedHashMap<>();
                m.put("itemId", id);
                list.add(m);
            }
        }
        if (list.isEmpty()) {
            return null;
        }
        return cn.hutool.json.JSONUtil.toJsonStr(list);
    }
}