BaseDataCache.java 6.3 KB
package com.neotel.webbox.capacity.data;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.neotel.webbox.capacity.bean.*;
import com.neotel.webbox.capacity.method.AssignMethod1;
import com.neotel.webbox.capacity.method.AssignMethod2;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;

import javax.annotation.PostConstruct;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.net.URL;
import java.util.*;

@Slf4j
@Component
public class BaseDataCache {

    /**
     * 料仓基础数据
     */
    private static Map<String,BoxData> boxDataMap = new HashMap<>();

    /**
     * 料盘单元基础数据
     */
    private static Map<String, ReelData> reelDataMap = new HashMap<>();

    @PostConstruct
    public void readExcel() {
        try {
            InputStream fileStream = null;
            File file = new File("data.xlsx");
            if(file.exists()){
                log.info("加载包外数据文件:" + file.getAbsolutePath());
                fileStream = new FileInputStream(file);
            }else{
                URL baseDir = ResourceUtils.getURL("classpath:data.xlsx");
                fileStream = baseDir.openStream();
                log.info("加载默认数据文件:" + baseDir.getPath());
            }

            // 写法1
            try(ExcelReader excelReader = EasyExcel.read(fileStream).build()) {
                // 这里为了简单 所以注册了 同样的head 和Listener 自己使用功能必须不同的Listener
                ReadSheet readSheet1 =
                        EasyExcel.readSheet(0).head(BoxData.class).registerReadListener(new ReadListener<BoxData>(){
                            @Override
                            public void invoke(BoxData data, AnalysisContext analysisContext) {
                                if(data.isValid()){
                                    log.info("加载到料仓{}数据",data.getBoxName());
                                    boxDataMap.put(data.getBoxName(),data);
                                }else{
                                    log.error("料仓表第{}行数据{}异常,忽略", analysisContext.getCurrentRowNum(),data.getBoxName());
                                }
                            }

                            @Override
                            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                                log.info("料仓数据加载完成,共加载" + boxDataMap.size() +"条有效数据");
                            }
                        }).build();
                ReadSheet readSheet2 = EasyExcel.readSheet(1).head(ReelData.class).registerReadListener(new ReadListener<ReelData>() {

                            @Override
                            public void invoke(ReelData reelData, AnalysisContext analysisContext) {
                                if(reelData.isValid()){
                                    log.info("加载到盘{}数据",reelData.getReelSizeStr());
                                    reelDataMap.put(reelData.getReelSizeStr(),reelData);
                                }else{
                                    log.error("料仓表第{}行数据{}异常,忽略", analysisContext.getCurrentRowNum(),reelData.getReelSizeStr());
                                }
                            }

                            @Override
                            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                                log.info("料盘数据加载完成,共加载" + reelDataMap.size() +"条有效数据");
                            }
                        }).build();
                // 这里注意 一定要把sheet1 sheet2 一起传进去,不然有个问题就是03版的excel 会读取多次,浪费性能
                excelReader.read(readSheet1, readSheet2);
            }

//            BoxData boxData = getBoxData("SISO1");
//            List<RequestItem> testList = testData();
//            BoxResult boxResult = AssignMethod1.averageAssignToBox(boxData,testList);
//            log.info("方案一共需要"+boxResult.getBoxList().size()+"个料仓");
//            for (ReelItem reelItem : boxResult.getReelItemList()) {
//                log.info(reelItem.getSizeStr()+" 料盘需求:" + reelItem.getNeedNum() + " 容量:" + reelItem.getCapacity());
//            }
            //testList = testData();
//            boxResult = AssignMethod2.assignToBox(boxData,testList);
//            log.info("方案二共需要"+boxResult.getBoxList().size()+"个料仓");
//            for (ReelItem reelItem : boxResult.getReelItemList()) {
//                log.info(reelItem.getSizeStr()+" 料盘需求:" + reelItem.getNeedNum() + " 容量:" + reelItem.getCapacity());
//            }

        } catch (FileNotFoundException e) {
            log.error("未找到数据文件",e);
        } catch (Exception ex){
            log.error("读取数据异常",ex);
        }
    }

    private static List<RequestItem> testData(){

        List<RequestItem> requestList = new ArrayList<>();

        ReelData reelData = getReelData("7 x 8");
        ReelData reelData2 = getReelData("13 x 24");
        ReelData reelData3 = getReelData("13 x 12");
        ReelData reelData4 = getReelData("7 x 12");

        RequestItem item2 = new RequestItem(100,reelData2);
        requestList.add(item2);
        RequestItem item = new RequestItem(3300,reelData);
        requestList.add(item);

        RequestItem item3 = new RequestItem(150,reelData3);
        requestList.add(item3);
        RequestItem item4 = new RequestItem(1250,reelData4);
        requestList.add(item4);

        return requestList;
    }

    public static Collection<ReelData> getReelDataList(){
        return reelDataMap.values();
    }

    public static Collection<BoxData> getBoxDataList(){
        return boxDataMap.values();
    }

    public static BoxData getBoxData(String boxName){
        return boxDataMap.get(boxName);
    }

    public static ReelData getReelData(String reelSizeStr){
        return reelDataMap.get(reelSizeStr);
    }

}