xiaoyi
5 天以前 05ab6e3f69a5e73624b2573db043f5923e8f7d8b
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/route/MesProRouteProductServiceImpl.java
@@ -5,6 +5,7 @@
import cn.iocoder.yudao.module.mes.controller.admin.pro.route.vo.product.MesProRouteProductSaveReqVO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProductDO;
import cn.iocoder.yudao.module.mes.dal.mysql.pro.route.MesProRouteProductMapper;
import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@@ -34,6 +35,10 @@
    @Resource
    @Lazy
    private MesProRouteProductBomService routeProductBomService;
    @Resource
    private MesWmWarehouseAreaService warehouseAreaService;
    @Resource
    private cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService warehouseService;
    @Override
    public Long createRouteProduct(MesProRouteProductSaveReqVO createReqVO) {
@@ -41,6 +46,8 @@
        routeService.validateRouteNotEnable(createReqVO.getRouteId());
        // 1.1 校验产品唯一性(一个产品只能关联一条工艺路线)
        validateItemUnique(null, createReqVO.getItemId());
        // 1.2 校验报工入库三级(仓库 → 库区 → 库位)的父子关系
        validateWarehouseChain(createReqVO);
        // 2. 插入
        MesProRouteProductDO routeProduct = BeanUtils.toBean(createReqVO, MesProRouteProductDO.class);
@@ -56,6 +63,8 @@
        validateRouteProductExists(updateReqVO.getId());
        // 1.2 校验产品唯一性
        validateItemUnique(updateReqVO.getId(), updateReqVO.getItemId());
        // 1.3 校验报工入库三级的父子关系
        validateWarehouseChain(updateReqVO);
        // 2. 更新
        MesProRouteProductDO updateObj = BeanUtils.toBean(updateReqVO, MesProRouteProductDO.class);
@@ -89,6 +98,22 @@
        }
    }
    /**
     * 校验报工入库三级:仓库 → 库区 → 库位 的父子关系
     *
     * <p>三个都填时才校验层级是否匹配,避免前端联动错位时把库位挂到别的仓库下。
     * 允许只填仓库(部分场景只要知道入哪个仓),所以不是三个都必填。</p>
     */
    private void validateWarehouseChain(MesProRouteProductSaveReqVO reqVO) {
        // 1. 仓库填了就校验存在(只填仓库、不填库区库位是允许的)
        if (reqVO.getWarehouseId() != null) {
            warehouseService.validateWarehouseExists(reqVO.getWarehouseId());
        }
        // 2. 库位填了就校验「库区→库位」「仓库→库区」的父子关系是否串了
        warehouseAreaService.validateWarehouseAreaExists(
                reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId());
    }
    private void validateItemUnique(Long id, Long itemId) {
        MesProRouteProductDO existing = routeProductMapper.selectByItemId(itemId);
        if (existing == null) {