package com.steerinfo.dil.service.impl;

import com.steerinfo.dil.mapper.QmsQueueResultMapper;
import com.steerinfo.dil.mapper.QueuingRulesMapper;
import com.steerinfo.dil.service.IQueuingRulesService;
import com.steerinfo.dil.util.DataChange;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 排队规则
 * @ author    :TXF
 * @ time      :2021/10/16 10:04
 */

@Service
public class QueuingRulesServiceImpl implements IQueuingRulesService {

    @Resource
    private QueuingRulesMapper queuingRulesMapper;

    /*=========================进厂排队规则=========================*/

    /**
     * 通过物资Id查询网格ID
     * @param materialId
     * @return
     */
    public BigDecimal calculateGridId(BigDecimal materialId){
        Map<String, Object> map = new HashMap<>();
        //通过物资Id 和 进厂类型 查询 门岗ID
        map.put("materialId", materialId);
        map.put("type", 0); //匹配物资可进厂的门岗
        List<Map<String, Object>> gatepostMesList = queuingRulesMapper.queryGatepostByMaterialId(map); //可能会有多个门岗可入
        for (Map<String, Object> mes : gatepostMesList) {
            //从数据库中获取门岗开始时间结束时间 若当前时间满足该门岗进门时间 则下放 暂不考虑门岗优先级
            boolean judgeTime = judgeTime((String)mes.get("startTime"), (String)mes.get("endTime"));
            if(judgeTime){
                mes.put("gridType", 3);
                //通过匹配出来的门岗ID获取网格ID
                return getGridIdByGatepostIdAndGridType(mes);
            }
        }
        return null;
    }

    /**
     * 判断当前时间是否在时间区间范围内
     * @param startTime
     * @param endTime
     * @return
     */
    public boolean judgeTime(String startTime, String endTime){
        SimpleDateFormat sdf = new SimpleDateFormat("HHmmss");
        String format = sdf.format(new Date());
        int begin = Integer.parseInt(startTime);
        int end = Integer.parseInt(endTime);
        int now = Integer.parseInt(format);
        if(begin < end){
            return now < end && now >= begin;
        }else {
            return now < end || now >= begin;
        }
    }

    /**
     * 通过门岗ID 和 网格类型 匹配 网格主键
     * @param map
     * @return
     */
    @Override
    public BigDecimal getGridIdByGatepostIdAndGridType(Map<String, Object> map) {
        return queuingRulesMapper.getGridIdByGatepostIdAndGridType(map);
    }

    /*=========================仓库排队规则=========================*/
    /**
     * 查询订单中所需要运输的物资  物资表对订单表 一对多
     * @param map 运输订单号 orderNumber
     * @return
     */
    @Override
    public List<Integer> getAllMaterialId(Map<String, Object> map) {
        return queuingRulesMapper.getAllMaterialId(map);
    }

    /**
     *通过物资Id查询仓库是否有货 或者 是否有多个仓库有货
     * @param materialId 物资ID
     * @return
     */
    @Override
    public List<Integer> getWarehouseIdByMaterialId(Integer materialId) {
        return queuingRulesMapper.getWarehouseIdByMaterialId(materialId);
    }

    /**
     * 通过仓库Id 和 物资Id 查询垛位 层次 月台 仓库
     * @param map MaterialId 物资ID warehouseId 仓库ID
     * @return
     */
    @Override
    public List<Map<String, Object>> getStackGradation(Map<String, Object> map) {
        return queuingRulesMapper.getStackGradation(map);
    }

    /**
     * 通过月台Id 查询月台当前排队车辆数
     * @param platformId 月台ID
     * @return
     */
    @Override
    public BigDecimal queueCountByPlatformId(BigDecimal platformId) {
        return queuingRulesMapper.queueCountByPlatformId(platformId);
    }


    /**
     * 获取月台Id 通过物资ID 根据排队规则 获取车辆该去哪个月台
     * 遗留问题:多种物资会有多个装车实绩 多个月台该如何插入装车实绩  先装哪个物资 查询线路会有多条数据 如何进行筛选
     * @param materialIdList
     * @return
     */
    public List<Map<String, Object>> getPlatId(List<Integer> materialIdList){
        //遍历每一中物资查找月台
        List<Map<String, Object>> platIdList = new ArrayList<>();
        con:for (Integer materialId : materialIdList) {
            Integer platId = null;
            //一种物资可能在多个仓库中
            Map<String, Object> map = new HashMap<>();
            map.put("materialId", materialId);

            List<Integer> warehouseList = getWarehouseIdByMaterialId(materialId);
            int countNum = 1000; //初始化比较值
            for (Integer warehouseId : warehouseList) {
                HashMap<String, Object> hashMap = new HashMap<>();
                hashMap.put("materialId", materialId);
                hashMap.put("warehouseId", warehouseId);
                //通过物资Id和仓库ID对仓储网格表 再次进行查询并筛选出层次号最高的几条数据
                List<Map<String, Object>> mesList = getStackGradation(hashMap);
                //遍历筛选出来的月台 查看当前月台排队车辆数
                for (Map<String, Object> mesMap : mesList) {
                    BigDecimal platformId = DataChange.dataToBigDecimal(mesMap.get("platformId"));
                    //通过月台ID 和 网格类型 查找当前网格Id
                    hashMap.put("queueLocationId", platformId);
                    hashMap.put("gridType", 1);
                    BigDecimal gridId = queuingRulesMapper.getGridIdByGatepostIdAndGridType(hashMap);
                    //取得排队车辆数
                    int count = queueCountByPlatformId(gridId).intValue();
                    //如果当前月台排队车数为0 则直接选择这个月台
                    if(count == 0){
                        platId = platformId.intValue();
                        map.put("loadingId", platId);
                        platIdList.add(map);
                        continue con;
                    }
                    //如果排队车辆数小于上个月台排队车辆数
                    if(count < countNum){
                        countNum = count; //取代比较数
                        platId = platformId.intValue(); //替换月台ID
                        map.put("loadingId", platId);
                    }
                }
            }
            platIdList.add(map);
        }
        return platIdList;
    }

}