AssignMethod2.java 8.6 KB
package com.neotel.webbox.capacity.method;

import com.neotel.webbox.capacity.bean.BoxData;
import com.neotel.webbox.capacity.bean.BoxResult;
import com.neotel.webbox.capacity.bean.ReelData;
import com.neotel.webbox.capacity.bean.RequestItem;
import com.neotel.webbox.capacity.box.Box;
import com.neotel.webbox.capacity.box.Column;
import com.neotel.webbox.capacity.box.SlotUnit;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

@Slf4j
public class AssignMethod2 extends BasicMethod{

    public static BoxResult assignToBox(BoxData boxData, List<RequestItem> requestList){
        //从厚到薄排充,先放厚的,再放薄的
        requestList.sort(new Comparator<RequestItem>() {
            @Override
            public int compare(RequestItem o1, RequestItem o2) {
                int reelHeightDiff = o2.getReelData().getReelHeight() - o1.getReelData().getReelHeight();
                if(reelHeightDiff == 0){
                    return o2.getReelData().getReelSize() - o1.getReelData().getReelSize();
                }
                return reelHeightDiff;
            }
        });

        for (RequestItem requestItem : requestList) {
            ReelData rd = requestItem.getReelData();
            //纯放此料盘料仓容量
            int pureBoxCapacity = boxData.getBoxPureSizeCapacity(requestItem.getReelData());

            Float rate = 1.0f * requestItem.getNum()/pureBoxCapacity;
            int boxCount = rate.intValue();
            if(rate - boxCount > 0.85){
                boxCount = boxCount + 1;
            }
            int pureBoxCount = boxCount;
            int remainNum = requestItem.getNum() - pureBoxCount * pureBoxCapacity;
            requestItem.setPureBoxCount(pureBoxCount);
            requestItem.setRemainNum(remainNum);
            log.info("料盘["+rd.getReelSizeStr()+"]总需求:"+requestItem.getNum()+"需要纯料仓"+ pureBoxCount+"个,每个料仓可放:"+pureBoxCapacity+"盘,剩余:"+ remainNum+"盘需要放到混合仓");
        }
        List<Box> mixBoxList = new ArrayList<>();
        Box mixBox = null;
        //填充料盘(需求数量最多的)
        RequestItem fillRequestItem = null;
        for (RequestItem requestItem : requestList) {
            ReelData rd = requestItem.getReelData();
            if(fillRequestItem == null || requestItem.getNum() > fillRequestItem.getNum()){
                fillRequestItem = requestItem;
            }
            while (requestItem.getRemainNum() > 0){
                if(!isBoxCanPutIn(mixBox,rd)){
                    log.info("开启一个混合仓,开始放"+ rd.getReelSizeStr()+"的料盘");
                    int pressHeight = rd.getPressHeight();
                    mixBox = Box.newBox(boxData,pressHeight);
                    int columnValidHeight = boxData.getColumnValidHeight(pressHeight);
                    //标准列
                    Column column = new Column(columnValidHeight);
                    mixBox.setColumn(column);
                    mixBox.setColumnCount(boxData.getColumnCount());
                    mixBoxList.add(mixBox);
                }
                requestItem = assignToMixBox(requestItem,mixBox);
            }
        }
        int fillCount = 0;

        for (Box box : mixBoxList) {
            fillCount = fillToColumn(box.getColumn(),-1,fillRequestItem.getReelData());
            if(fillCount > 0){
                log.info("填充"+fillCount+"个"+ fillRequestItem.getReelSizeStr()+"料盘到标准列,标准列空闲高度为:" + box.getColumn().getRemainHeight());
            }else{
                log.info("标准列空闲高度为: " + box.getColumn().getRemainHeight()+" ");
            }
            fillCount = fillToColumn(box.getDoorUp(),-1,fillRequestItem.getReelData());
            if(fillCount > 0){
                log.info("填充"+fillCount+"个"+ fillRequestItem.getReelSizeStr()+"料盘到门口上方列,其空闲高度为:" + box.getDoorUp().getRemainHeight());
            }else{
                log.info("门口上方列空闲高度为:" + box.getDoorUp().getRemainHeight()+" ");
            }
            fillCount = fillToColumn(box.getDoorDown(),-1,fillRequestItem.getReelData());
            if(fillCount > 0){
                log.info("填充"+fillCount+"个"+ fillRequestItem.getReelSizeStr()+"料盘到门口下方列,其空闲高度为:" + box.getDoorDown().getRemainHeight());
            }else{
                log.info("门口下方列空闲高度为:" + box.getDoorDown().getRemainHeight()+" ");
            }
        }
        return getBoxResult(requestList,boxData,mixBoxList);
    }

    private static boolean isBoxCanPutIn(Box mixBox, ReelData rd){
        if(mixBox == null){
            return false;
        }
        if(mixBox.getColumn().getRemainHeight() > rd.getReelSlotHeight()){
            return true;
        }
        if(mixBox.getColumn().getRemainHeight() > rd.getReelSlotHeight()){
            return true;
        }
        if(mixBox.getColumn().getRemainHeight() > rd.getReelSlotHeight()){
            return true;
        }
        return false;
    }

    private static RequestItem assignToMixBox(RequestItem requestItem, Box mixBox){

        int totalRemainNum = requestItem.getRemainNum();
        int totalColumn = mixBox.getColumnCount();
        int countPerColumn = totalRemainNum/totalColumn;
        if(requestItem.getReelData().is7Reel()){
            //7寸盘会填充,这里不需要填充
            countPerColumn = countPerColumn /2 * 2;
        }
        int assignReelCount = 0;
        SlotUnit slotUnit = getValidSlotUnit(countPerColumn, requestItem.getReelData(),mixBox.getColumn().getRemainHeight());
        slotUnit = mixBox.getColumn().addSlotUnit(slotUnit);
        //为null表示一个没填充进去, 不为null可能只填充了一部分
        if(slotUnit != null){
            assignReelCount = slotUnit.getReelCount() * totalColumn;
            log.info("添加"+assignReelCount+"个"+ requestItem.getReelSizeStr()+"料盘到标准列,每列"+ slotUnit.getReelCount()+"个料盘");
        }
        //没有安排的料盘,安排到料口的上下两部分
        int notArrangedNum = totalRemainNum - assignReelCount;
        Column doorDown = mixBox.getDoorDown();
        SlotUnit doorDownAddUnit = getValidSlotUnit(notArrangedNum, requestItem.getReelData(), doorDown.getRemainHeight());
        doorDownAddUnit = doorDown.addSlotUnit(doorDownAddUnit);
        if(doorDownAddUnit != null){
            log.info("添加"+doorDownAddUnit.getReelCount()+"个"+ requestItem.getReelSizeStr()+"料盘到门口下方列");
            notArrangedNum = notArrangedNum - doorDownAddUnit.getReelCount();
        }

        Column doorUp = mixBox.getDoorUp();
        SlotUnit doorUpAddUnit = getValidSlotUnit(notArrangedNum, requestItem.getReelData(), doorUp.getRemainHeight());
        doorUpAddUnit = doorUp.addSlotUnit(doorUpAddUnit);
        if(doorUpAddUnit != null){
            log.info("添加"+doorUpAddUnit.getReelCount()+"个"+ requestItem.getReelSizeStr()+"料盘到门口上方列");
            notArrangedNum = notArrangedNum - doorUpAddUnit.getReelCount();
        }

        requestItem.setRemainNum(notArrangedNum);
        if(notArrangedNum > 0){
            //还有未安排的料盘,如果标准列有位置就添加进去,如果没有那就是放不下了
            log.warn(""+notArrangedNum+"个"+ requestItem.getReelSizeStr()+"无处安放");
        }

        int remainNum = notArrangedNum;
        int addCount = fillToColumn(mixBox.getColumn(),remainNum,requestItem.getReelData());
        if(addCount > 0){
            remainNum = remainNum - addCount;
            requestItem.setRemainNum(remainNum);
            log.info("添加"+addCount+"个"+ requestItem.getReelSizeStr()+"料盘到标准列,无处安放料盘数为:" + remainNum);
        }

        if(remainNum > 0){
            addCount = fillToColumn(mixBox.getDoorUp(),remainNum,requestItem.getReelData());
            if(addCount > 0){
                remainNum = remainNum - addCount;
                requestItem.setRemainNum(remainNum);
                log.info("添加"+addCount+"个"+ requestItem.getReelSizeStr()+"料盘到门口上方列,无处安放料盘数为:" + remainNum);
            }
            addCount = fillToColumn(mixBox.getDoorDown(),remainNum,requestItem.getReelData());
            if(addCount > 0){
                remainNum = remainNum - addCount;
                requestItem.setRemainNum(remainNum);
                log.info("添加"+addCount+"个"+ requestItem.getReelSizeStr()+"料盘到门口下方列,无处安放料盘数为:" + remainNum);
            }
        }
        requestItem.setRemainNum(remainNum);
        return requestItem;
    }
}