LocationAllocationServiceImpl.java 4.39 KB
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.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
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.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 TaskHeaderService taskHeaderService;

    @Override
    public String allocation(String locationRule, String roadWay, String warehouseCode, List<LocationType> locationTypeList) {
        if (StringUtils.isEmpty(locationRule)) {
            return null;
        }
        switch (locationRule) {
            case "DoubleRK":
                return doubleRk(roadWay, warehouseCode, locationTypeList);
            case "SingleRK":
                return singleRk(roadWay, warehouseCode, locationTypeList);
        }
        return null;
    }

    /*
     * 双伸位库位入库分配库位
     */
    private String doubleRk(String roadWay, String warehouseCode, List<LocationType> locationTypeList) {
        LambdaQueryWrapper<Location> locationLambda = Wrappers.lambdaQuery();
        locationLambda.eq(Location::getRoadway, roadWay).
                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::getRoadway, roadWay).
                    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, roadWay);
        return locationCode;
    }

    private String singleRk(String roadWay, String warehouseCode, List<LocationType> locationTypeList) {
        LambdaQueryWrapper<Location> locationLambda = Wrappers.lambdaQuery();
        locationLambda.eq(Location::getRoadway, roadWay).
                eq(Location::getWarehouseCode, warehouseCode)
                .eq(Location::getStatus, "empty")
                .eq(Location::getContainerCode, "");
        List<Location> locationList = locationService.list(locationLambda);
        String locationCode =  filter(locationList, locationTypeList, roadWay);
        return locationCode;
    }

    private String filter(List<Location> locationList, List<LocationType> locationTypeList, String roadway) {
        List<String> codeList = locationTypeList.stream().map(t -> t.getCode()).collect(Collectors.toList());
        List<Location> newLocation = locationList.stream().filter(t -> codeList.contains(t.getLocationType()) && t.getRoadway().equals(roadway)).collect(Collectors.toList());
        if (newLocation.isEmpty()) {
            return null;
        } else {
            return newLocation.get(0).getCode();
        }
    }
}