QueuingRulesServiceImpl.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package com.steerinfo.dil.service.impl;
  2. import com.steerinfo.dil.mapper.QmsQueueResultMapper;
  3. import com.steerinfo.dil.mapper.QueuingRulesMapper;
  4. import com.steerinfo.dil.service.IQueuingRulesService;
  5. import com.steerinfo.dil.util.DataChange;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Service;
  8. import javax.annotation.Resource;
  9. import java.math.BigDecimal;
  10. import java.text.SimpleDateFormat;
  11. import java.util.*;
  12. /**
  13. * 排队规则
  14. * @ author :TXF
  15. * @ time :2021/10/16 10:04
  16. */
  17. @Service
  18. public class QueuingRulesServiceImpl implements IQueuingRulesService {
  19. @Resource
  20. private QueuingRulesMapper queuingRulesMapper;
  21. /*=========================进厂排队规则=========================*/
  22. /**
  23. * 通过物资Id查询网格ID
  24. * @param materialId
  25. * @return
  26. */
  27. public BigDecimal calculateGridId(BigDecimal materialId){
  28. Map<String, Object> map = new HashMap<>();
  29. //通过物资Id 和 进厂类型 查询 门岗ID
  30. map.put("materialId", materialId);
  31. map.put("type", 0); //匹配物资可进厂的门岗
  32. List<Map<String, Object>> gatepostMesList = queuingRulesMapper.queryGatepostByMaterialId(map); //可能会有多个门岗可入
  33. for (Map<String, Object> mes : gatepostMesList) {
  34. //从数据库中获取门岗开始时间结束时间 若当前时间满足该门岗进门时间 则下放 暂不考虑门岗优先级
  35. boolean judgeTime = judgeTime((String)mes.get("startTime"), (String)mes.get("endTime"));
  36. if(judgeTime){
  37. mes.put("gridType", 3);
  38. //通过匹配出来的门岗ID获取网格ID
  39. return getGridIdByGatepostIdAndGridType(mes);
  40. }
  41. }
  42. return null;
  43. }
  44. /**
  45. * 判断当前时间是否在时间区间范围内
  46. * @param startTime
  47. * @param endTime
  48. * @return
  49. */
  50. public boolean judgeTime(String startTime, String endTime){
  51. SimpleDateFormat sdf = new SimpleDateFormat("HHmmss");
  52. String format = sdf.format(new Date());
  53. int begin = Integer.parseInt(startTime);
  54. int end = Integer.parseInt(endTime);
  55. int now = Integer.parseInt(format);
  56. if(begin < end){
  57. return now < end && now >= begin;
  58. }else {
  59. return now < end || now >= begin;
  60. }
  61. }
  62. /**
  63. * 通过门岗ID 和 网格类型 匹配 网格主键
  64. * @param map
  65. * @return
  66. */
  67. @Override
  68. public BigDecimal getGridIdByGatepostIdAndGridType(Map<String, Object> map) {
  69. return queuingRulesMapper.getGridIdByGatepostIdAndGridType(map);
  70. }
  71. /*=========================仓库排队规则=========================*/
  72. /**
  73. * 查询订单中所需要运输的物资 物资表对订单表 一对多
  74. * @param map 运输订单号 orderNumber
  75. * @return
  76. */
  77. @Override
  78. public List<Integer> getAllMaterialId(Map<String, Object> map) {
  79. return queuingRulesMapper.getAllMaterialId(map);
  80. }
  81. /**
  82. *通过物资Id查询仓库是否有货 或者 是否有多个仓库有货
  83. * @param materialId 物资ID
  84. * @return
  85. */
  86. @Override
  87. public List<Integer> getWarehouseIdByMaterialId(Integer materialId) {
  88. return queuingRulesMapper.getWarehouseIdByMaterialId(materialId);
  89. }
  90. /**
  91. * 通过仓库Id 和 物资Id 查询垛位 层次 月台 仓库
  92. * @param map MaterialId 物资ID warehouseId 仓库ID
  93. * @return
  94. */
  95. @Override
  96. public List<Map<String, Object>> getStackGradation(Map<String, Object> map) {
  97. return queuingRulesMapper.getStackGradation(map);
  98. }
  99. /**
  100. * 通过月台Id 查询月台当前排队车辆数
  101. * @param platformId 月台ID
  102. * @return
  103. */
  104. @Override
  105. public BigDecimal queueCountByPlatformId(BigDecimal platformId) {
  106. return queuingRulesMapper.queueCountByPlatformId(platformId);
  107. }
  108. /**
  109. * 获取月台Id 通过物资ID 根据排队规则 获取车辆该去哪个月台
  110. * 遗留问题:多种物资会有多个装车实绩 多个月台该如何插入装车实绩 先装哪个物资 查询线路会有多条数据 如何进行筛选
  111. * @param materialIdList
  112. * @return
  113. */
  114. public List<Map<String, Object>> getPlatId(List<Integer> materialIdList){
  115. //遍历每一中物资查找月台
  116. List<Map<String, Object>> platIdList = new ArrayList<>();
  117. con:for (Integer materialId : materialIdList) {
  118. Integer platId = null;
  119. //一种物资可能在多个仓库中
  120. Map<String, Object> map = new HashMap<>();
  121. map.put("materialId", materialId);
  122. List<Integer> warehouseList = getWarehouseIdByMaterialId(materialId);
  123. int countNum = 1000; //初始化比较值
  124. for (Integer warehouseId : warehouseList) {
  125. HashMap<String, Object> hashMap = new HashMap<>();
  126. hashMap.put("materialId", materialId);
  127. hashMap.put("warehouseId", warehouseId);
  128. //通过物资Id和仓库ID对仓储网格表 再次进行查询并筛选出层次号最高的几条数据
  129. List<Map<String, Object>> mesList = getStackGradation(hashMap);
  130. //遍历筛选出来的月台 查看当前月台排队车辆数
  131. for (Map<String, Object> mesMap : mesList) {
  132. BigDecimal platformId = DataChange.dataToBigDecimal(mesMap.get("platformId"));
  133. //通过月台ID 和 网格类型 查找当前网格Id
  134. hashMap.put("queueLocationId", platformId);
  135. hashMap.put("gridType", 1);
  136. BigDecimal gridId = queuingRulesMapper.getGridIdByGatepostIdAndGridType(hashMap);
  137. //取得排队车辆数
  138. int count = queueCountByPlatformId(gridId).intValue();
  139. //如果当前月台排队车数为0 则直接选择这个月台
  140. if(count == 0){
  141. platId = platformId.intValue();
  142. map.put("loadingId", platId);
  143. platIdList.add(map);
  144. continue con;
  145. }
  146. //如果排队车辆数小于上个月台排队车辆数
  147. if(count < countNum){
  148. countNum = count; //取代比较数
  149. platId = platformId.intValue(); //替换月台ID
  150. map.put("loadingId", platId);
  151. }
  152. }
  153. }
  154. platIdList.add(map);
  155. }
  156. return platIdList;
  157. }
  158. }