package com.huaheng.api.wcs.service.warecellAllocation; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.huaheng.common.constant.Constants; import com.huaheng.common.exception.service.ServiceException; import com.huaheng.common.utils.StringUtils; import com.huaheng.pc.config.container.domain.Container; import com.huaheng.pc.config.container.service.ContainerService; import com.huaheng.pc.config.containerType.domain.ContainerType; import com.huaheng.pc.config.containerType.service.ContainerTypeService; import com.huaheng.pc.config.location.domain.Location; import com.huaheng.pc.config.location.service.LocationService; import com.huaheng.pc.config.locationType.domain.LocationType; import com.huaheng.pc.config.locationType.service.LocationTypeService; import com.huaheng.pc.task.taskHeader.service.TaskHeaderService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @Service public class LocationAllocationServiceImpl implements LocationAllocationService { @Resource private LocationService locationService; @Resource private LocationTypeService locationTypeService; @Resource private ContainerService containerService; @Resource private ContainerTypeService containerTypeService; @Resource private TaskHeaderService taskHeaderService; @Override public String allocation(String locationRule, String area, String warehouseCode, String containerCode) { if (StringUtils.isEmpty(locationRule)) { return null; } LambdaQueryWrapper<Container> containerLambdaQueryWrapper = Wrappers.lambdaQuery(); containerLambdaQueryWrapper.eq(Container::getCode, containerCode) .eq(Container::getWarehouseCode, warehouseCode); Container container = containerService.getOne(containerLambdaQueryWrapper); LambdaQueryWrapper<ContainerType> containerTypeLambdaQueryWrapper = Wrappers.lambdaQuery(); containerTypeLambdaQueryWrapper.eq(ContainerType::getCode, container.getContainerType()) .eq(ContainerType::getWarehouseCode, warehouseCode); ContainerType containerType = containerTypeService.getOne(containerTypeLambdaQueryWrapper); String locationType = containerType.getLocationType(); List<LocationType> locationTypeList = new ArrayList<>(); String[] list = locationType.split(","); for(String str : list) { LambdaQueryWrapper<LocationType> locationTypeLambdaQueryWrapper = Wrappers.lambdaQuery(); locationTypeLambdaQueryWrapper.eq(LocationType::getWarehouseCode, warehouseCode) .eq(LocationType::getCode, str); LocationType locationType1 = locationTypeService.getOne(locationTypeLambdaQueryWrapper); locationTypeList.add(locationType1); } switch (locationRule) { case Constants.DOUBLE_RK: return doubleRk(area, warehouseCode, locationTypeList); case Constants.SINGER_RK: return singleRk(area, warehouseCode, locationTypeList); } return null; } /* * 双伸位库位入库分配库位 */ private String doubleRk(String area, String warehouseCode, List<LocationType> locationTypeList) { LambdaQueryWrapper<Location> locationLambda = Wrappers.lambdaQuery(); locationLambda.eq(Location::getArea, area). eq(Location::getWarehouseCode, warehouseCode) .eq(Location::getStatus, "empty") .eq(Location::getRowFlag, 1) .eq(Location::getContainerCode, ""); List<Location> locationList = locationService.list(locationLambda); List<Location> removeLocaationList = new ArrayList<>(); for (Location location1 : locationList) { if (taskHeaderService.getUncompleteTaskInNear(location1) > 0) { removeLocaationList.add(location1); } else { break; } } locationList.removeAll(removeLocaationList); if (locationList == null || locationList.size() == 0) { locationLambda = Wrappers.lambdaQuery(); locationLambda.eq(Location::getArea, area). eq(Location::getWarehouseCode, warehouseCode) .eq(Location::getStatus, "empty") .eq(Location::getRowFlag, 0) .eq(Location::getContainerCode, ""); locationList = locationService.list(locationLambda); removeLocaationList = new ArrayList<>(); for (Location location1 : locationList) { if (taskHeaderService.getUncompleteTaskInNear(location1) > 0) { removeLocaationList.add(location1); } else { break; } } locationList.removeAll(removeLocaationList); } String locationCode = filter(locationList, locationTypeList, area); return locationCode; } /* * 单伸位库位入库分配库位 */ private String singleRk(String area, String warehouseCode, List<LocationType> locationTypeList) { LambdaQueryWrapper<Location> locationLambda = Wrappers.lambdaQuery(); locationLambda.eq(Location::getArea, area). eq(Location::getWarehouseCode, warehouseCode) .eq(Location::getStatus, "empty") .eq(Location::getContainerCode, ""); List<Location> locationList = locationService.list(locationLambda); String locationCode = filter(locationList, locationTypeList, area); return locationCode; } private String filter(List<Location> locationList, List<LocationType> locationTypeList, String area) { List<String> codeList = locationTypeList.stream().map(t -> t.getCode()).collect(Collectors.toList()); List<Location> newLocation = locationList.stream().filter(t -> codeList.contains(t.getLocationType()) && t.getArea().equals(area)).collect(Collectors.toList()); if (newLocation.isEmpty()) { return null; } else { return newLocation.get(0).getCode(); } } }