xiaoyi
4 天以前 05ab6e3f69a5e73624b2573db043f5923e8f7d8b
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;
@@ -27,7 +30,7 @@
/**
 * MES 工艺路线工序 Service 实现类
 *
 * @author 芋道源码
 * @author 超级管理员
 */
@Service
@Validated
@@ -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. 更新工序链
@@ -81,8 +80,14 @@
    public void updateRouteProcess(MesProRouteProcessSaveReqVO updateReqVO) {
        // 1.0 已启用的工艺路线,不允许操作
        routeService.validateRouteNotEnable(updateReqVO.getRouteId());
        // 1.1 校验存在
        validateRouteProcessExists(updateReqVO.getId());
        // 1.1 校验存在;部分更新(如仅调整产出产品)时未传的必填字段用现有值回填
        MesProRouteProcessDO existing = validateRouteProcessExists(updateReqVO.getId());
        if (updateReqVO.getProcessId() == null) {
            updateReqVO.setProcessId(existing.getProcessId());
        }
        if (updateReqVO.getSort() == null) {
            updateReqVO.setSort(existing.getSort());
        }
        // 1.2 校验工艺路线、工序存在
        validateRouteAndProcessExists(updateReqVO.getRouteId(), updateReqVO.getProcessId());
        // 1.3 校验唯一性
@@ -92,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);
@@ -239,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);
    }
}