package cn.iocoder.yudao.module.mes.service.wm.warehouse; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area.MesWmWarehouseAreaSaveReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; /** * 仓库默认库区/库位 Service 实现类 */ @Service @Validated public class MesWmWarehouseDefaultServiceImpl implements MesWmWarehouseDefaultService { /** 默认库区编码前缀(按仓库隔离,保证编码全局唯一) */ private static final String DEFAULT_LOCATION_CODE_PREFIX = "DEFAULT_KQ_"; private static final String DEFAULT_LOCATION_NAME = "默认库区"; /** 默认库位编码前缀 */ private static final String DEFAULT_AREA_CODE_PREFIX = "DEFAULT_KW_"; private static final String DEFAULT_AREA_NAME = "默认库位"; @Resource private MesWmWarehouseLocationService locationService; @Resource private MesWmWarehouseAreaService areaService; @Resource private MesWmWarehouseService warehouseService; @Override public MesWmWarehouseLocationDO getOrCreateDefaultLocation(Long warehouseId) { String code = DEFAULT_LOCATION_CODE_PREFIX + warehouseId; MesWmWarehouseLocationDO location = locationService.getWarehouseLocationByCode(code); if (location != null) { return location; } // 仓库不存在时给出明确提示,避免建出没有归属的库区 warehouseService.validateWarehouseExists(warehouseId); MesWmWarehouseLocationSaveReqVO createReqVO = new MesWmWarehouseLocationSaveReqVO(); createReqVO.setWarehouseId(warehouseId); createReqVO.setCode(code); createReqVO.setName(DEFAULT_LOCATION_NAME); createReqVO.setFrozen(false); try { Long id = locationService.createWarehouseLocation(createReqVO); return locationService.getWarehouseLocation(id); } catch (ServiceException ex) { // 并发首次使用时可能已被其他请求创建,回查一次 MesWmWarehouseLocationDO created = locationService.getWarehouseLocationByCode(code); if (created != null) { return created; } throw ex; } } @Override public MesWmWarehouseAreaDO getOrCreateDefaultArea(Long warehouseId) { String code = DEFAULT_AREA_CODE_PREFIX + warehouseId; MesWmWarehouseAreaDO area = areaService.getWarehouseAreaByCode(code); if (area != null) { return area; } MesWmWarehouseLocationDO location = getOrCreateDefaultLocation(warehouseId); MesWmWarehouseAreaSaveReqVO createReqVO = new MesWmWarehouseAreaSaveReqVO(); createReqVO.setCode(code); createReqVO.setName(DEFAULT_AREA_NAME); createReqVO.setLocationId(location.getId()); createReqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); createReqVO.setFrozen(false); // 默认库位需兼容所有物料/批次,避免在无库位管理的场景下触发混放校验 createReqVO.setAllowItemMixing(true); createReqVO.setAllowBatchMixing(true); try { Long id = areaService.createWarehouseArea(createReqVO); return areaService.getWarehouseArea(id); } catch (ServiceException ex) { MesWmWarehouseAreaDO created = areaService.getWarehouseAreaByCode(code); if (created != null) { return created; } throw ex; } } }