RulesServiceImpl.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package com.steerinfo.dil.service.impl;
  2. import com.steerinfo.dil.mapper.RulesMapper;
  3. import com.steerinfo.dil.mapper.TmstruckLeaveFactoryResultMapper;
  4. import com.steerinfo.dil.mapper.UtilsMapper;
  5. import com.steerinfo.dil.model.TmstruckLeaveFactoryResult;
  6. import com.steerinfo.dil.service.IRulesService;
  7. import com.steerinfo.dil.util.DataChange;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.stereotype.Service;
  10. import java.math.BigDecimal;
  11. import java.text.SimpleDateFormat;
  12. import java.util.*;
  13. /**
  14. * @ author :TXF
  15. * @ time :2021/11/16 14:30
  16. */
  17. @Service(value = "rulesService")
  18. public class RulesServiceImpl implements IRulesService {
  19. @Autowired
  20. private UtilsMapper utilsMapper;
  21. @Autowired
  22. private RulesMapper rulesMapper;
  23. @Autowired
  24. private TmstruckLeaveFactoryResultMapper tmstruckLeaveFactoryResultMapper;
  25. /**
  26. * 通过运输订单号查询物资并根据门岗规则计算出厂门岗
  27. * @param map
  28. * @return
  29. */
  30. public int calculateGatepost(Map<String, Object> map){
  31. if(map != null){ //物资问题原因 计算不了门岗
  32. return 1;
  33. }
  34. BigDecimal materialId = utilsMapper.queryOrderMesByOrderId((String) map.get("orderNumber"));
  35. Map<String, Object> map1 = new HashMap<>();
  36. map1.put("materialId", materialId);
  37. //类型为出厂
  38. map1.put("type", 1);
  39. List<Map<String, Object>> list = rulesMapper.queryGatepostByMaterialId(map1);
  40. for (Map<String, Object> mes : list) {
  41. //从数据库中获取门岗开始时间结束时间 若当前时间满足该门岗进门时间 则下放 暂不考虑门岗优先级
  42. boolean judgeTime = judgeTime((String)mes.get("startTime"), (String)mes.get("endTime"));
  43. if(judgeTime){
  44. //更新出厂实绩门岗ID
  45. //通过运输订单号获取出厂实绩ID
  46. Map<String, Object> map2 = tmstruckLeaveFactoryResultMapper.selectResultId((String) map.get("orderNumber"));
  47. TmstruckLeaveFactoryResult tmstruckLeaveFactoryResult = new TmstruckLeaveFactoryResult();
  48. tmstruckLeaveFactoryResult.setResultId(DataChange.dataToBigDecimal(map2.get("resultId")));
  49. tmstruckLeaveFactoryResult.setGatepostId(DataChange.dataToBigDecimal(mes.get("gatepostId")));
  50. return tmstruckLeaveFactoryResultMapper.updateByPrimaryKeySelective(tmstruckLeaveFactoryResult);
  51. }
  52. }
  53. return 1;
  54. }
  55. /**
  56. * 判断当前时间是否在时间区间范围内
  57. * @param startTime
  58. * @param endTime
  59. * @return
  60. */
  61. public boolean judgeTime(String startTime, String endTime){
  62. SimpleDateFormat sdf = new SimpleDateFormat("HHmmss");
  63. String format = sdf.format(new Date());
  64. int begin = Integer.parseInt(startTime);
  65. int end = Integer.parseInt(endTime);
  66. int now = Integer.parseInt(format);
  67. if(begin < end){
  68. return now < end && now >= begin;
  69. }else {
  70. return now < end || now >= begin;
  71. }
  72. }
  73. /**
  74. * 通过物资ID 和 计量类型 查找汽车衡
  75. materialId 物资Id
  76. nature 1: 进厂秤 2:出厂秤 3:中转
  77. * @return 汽车衡
  78. */
  79. public int calculateWeighbridge(Map<String, Object> map){
  80. //物资类型:无法计算汽车衡 返回所有1
  81. if(map != null){
  82. return 1;
  83. }
  84. List<Integer> calculateList = queryTruckCalculate(map);
  85. //暂时不考虑优先级 随机进行取值
  86. int size = calculateList.size();
  87. if(size == 0){
  88. return 13; //没有查询到汽车衡 则使用备用秤
  89. }if(size == 1){
  90. return calculateList.get(0);
  91. }
  92. return calculateList.get(new Random().nextInt(size));
  93. }
  94. /**
  95. * 通过物资Id、计量类型(进厂、出厂、中转) 可能会有多个
  96. * @param map
  97. * @return
  98. */
  99. @Override
  100. public List<Integer> queryTruckCalculate(Map<String, Object> map) {
  101. return rulesMapper.queryTruckCalculate(map);
  102. }
  103. /**
  104. * 查询未装车实绩
  105. * @param orderId
  106. * @return
  107. */
  108. @Override
  109. public List<Map<String, Object>> judgeLastMaterial(BigDecimal orderId) {
  110. return rulesMapper.judgeLastMaterial(orderId);
  111. }
  112. /*=========================仓库排队规则=========================*/
  113. /**
  114. *通过物资Id查询仓库是否有货 或者 是否有多个仓库有货
  115. * @param materialId 物资ID
  116. * @return
  117. */
  118. @Override
  119. public List<Integer> getWarehouseIdByMaterialId(Integer materialId) {
  120. return rulesMapper.getWarehouseIdByMaterialId(materialId);
  121. }
  122. /**
  123. * 通过仓库Id 和 物资Id 查询垛位 层次 月台 仓库
  124. * @param map MaterialId 物资ID warehouseId 仓库ID
  125. * @return
  126. */
  127. @Override
  128. public List<Map<String, Object>> getStackGradation(Map<String, Object> map) {
  129. return rulesMapper.getStackGradation(map);
  130. }
  131. /**
  132. * 通过月台Id 查询月台当前排队车辆数
  133. * @param platformId 月台ID
  134. * @return
  135. */
  136. @Override
  137. public BigDecimal queueCountByPlatformId(BigDecimal platformId) {
  138. return rulesMapper.queueCountByPlatformId(platformId);
  139. }
  140. /**
  141. * 获取月台Id 通过物资ID 根据排队规则 获取车辆该去哪个月台
  142. * 规则:不同物资在不同仓库 --> 遍历仓库通过物资Id和仓库Id查找对应的仓储网格表
  143. * --> 找出多条数据 也就是说多个月台可以装 --> 遍历月台查看每个月台的排队车辆数 寻找最小的排队车辆数的月台
  144. * --> 返回物资ID 和 月台ID
  145. * @param materialId 物资ID
  146. * @return 月台ID
  147. */
  148. public Map<String, Object> getPlatId(Integer materialId){
  149. Map<String, Object> map = new HashMap<>();
  150. Integer platId = null;
  151. //一种物资可能在多个仓库中
  152. List<Integer> warehouseList = getWarehouseIdByMaterialId(materialId);
  153. int countNum = 1000; //初始化比较值
  154. for (Integer warehouseId : warehouseList) {
  155. HashMap<String, Object> hashMap = new HashMap<>();
  156. hashMap.put("materialId", materialId);
  157. hashMap.put("warehouseId", warehouseId);
  158. //通过物资Id和仓库ID对仓储网格表 再次进行查询并筛选出层次号最高的几条数据
  159. List<Map<String, Object>> mesList = getStackGradation(hashMap);
  160. //遍历筛选出来的月台 查看当前月台排队车辆数
  161. for (Map<String, Object> mesMap : mesList) {
  162. BigDecimal platformId = DataChange.dataToBigDecimal(mesMap.get("platformId"));
  163. //通过月台ID 和 网格类型 查找当前网格Id
  164. hashMap.put("queueLocationId", platformId);
  165. hashMap.put("gridType", 1);
  166. BigDecimal gridId = rulesMapper.getGridIdByGatepostIdAndGridType(hashMap);
  167. //取得排队车辆数
  168. int count = queueCountByPlatformId(gridId).intValue();
  169. map.put("count", count);
  170. //如果当前月台排队车数为0 则直接选择这个月台
  171. if(count == 0){
  172. platId = platformId.intValue();
  173. map.put("loadingId", platId);
  174. return map;
  175. }
  176. //如果排队车辆数小于上个月台排队车辆数
  177. if(count < countNum){
  178. countNum = count; //取代比较数
  179. platId = platformId.intValue(); //替换月台ID
  180. map.put("loadingId", platId);
  181. }
  182. }
  183. }
  184. return map;
  185. }
  186. /**
  187. * 计算物资优先级顺序 并计算装车点 传入多个物资ID
  188. * @param mapList
  189. */
  190. public Map<String, Object> calculateMaterialPriority (List<Map<String, Object>> mapList){
  191. int compareNum = 100; //优先级比较基准数初始值
  192. int compareNum2 = 0; //车辆排队序号
  193. Map<String, Object> map = new HashMap<>();
  194. for (Map<String, Object> mesMap : mapList) {
  195. int materialOrder = DataChange.dataToBigDecimal(mesMap.get("materialOrder")).intValue();
  196. if(materialOrder < compareNum){
  197. //通过当前物资Id查找装车点
  198. Map<String, Object> loadingIdMap = getPlatId(DataChange.dataToBigDecimal(map.get("materialId")).intValue());
  199. mesMap.put("loadingId", loadingIdMap.get("loadingId"));
  200. compareNum = materialOrder; //替换比较数
  201. compareNum2 = (int) loadingIdMap.get("count"); //添加车辆排队比较数
  202. map = mesMap;
  203. }
  204. if(materialOrder == compareNum){//如果优先级相同 计算当前月台排队车辆数
  205. //通过当前物资Id查找装车点
  206. Map<String, Object> loadingIdMap = getPlatId(DataChange.dataToBigDecimal(map.get("materialId")).intValue());
  207. int count = (int) loadingIdMap.get("count");
  208. mesMap.put("loadingId", loadingIdMap.get("loadingId"));
  209. //如果当前排队车辆数小于上一排队车辆数
  210. if(count < compareNum2){
  211. map = mesMap;//更换要返回的map
  212. compareNum2 = count;//替换排队比较数
  213. }
  214. }
  215. }
  216. return map;
  217. }
  218. /**
  219. * 计算装车顺序
  220. * @return
  221. */
  222. public Map<String, Object> calculateMaterial(List<Map<String, Object>> mapList){
  223. int compareNum = 100; //比较基准数
  224. //传入多个未装车的装车物资ID以及装车顺序
  225. Map<String, Object> map = null;
  226. for (Map<String, Object> mesMap : mapList) {
  227. //获取装车顺序 顺序小的先装
  228. BigDecimal loadingSequence = DataChange.dataToBigDecimal(mesMap.get("loadingSequence"));
  229. if(loadingSequence.intValue() < compareNum){
  230. map = mesMap;
  231. }
  232. }
  233. return map;
  234. }
  235. }