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;
|
}
|
}
|
|
}
|