RulesServiceImpl.java 12 KB

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