RulesServiceImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  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 || orderType == 2){//销售
  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; //
  122. }else {
  123. if(randomNum < 5){
  124. return 17;
  125. }else{
  126. return 18;
  127. }
  128. }
  129. }
  130. if(orderType == 17 || orderType == 18){ // 化工材料采购 现只考虑化工厂
  131. return 16;
  132. }
  133. return 0;
  134. }
  135. // List<Integer> calculateList = queryTruckCalculate(map);
  136. // //暂时不考虑优先级 随机进行取值
  137. // int size = calculateList.size();
  138. // if(size == 0){
  139. // return 13; //没有查询到汽车衡 则使用备用秤
  140. // }if(size == 1){
  141. // return calculateList.get(0);
  142. // }
  143. // return calculateList.get(new Random().nextInt(size));
  144. return 0;
  145. }
  146. /**
  147. * 通过物资Id、计量类型(进厂、出厂、中转) 可能会有多个
  148. * @param map
  149. * @return
  150. */
  151. @Override
  152. public List<Integer> queryTruckCalculate(Map<String, Object> map) {
  153. return rulesMapper.queryTruckCalculate(map);
  154. }
  155. /**
  156. * 查询未装车实绩
  157. * @param orderId
  158. * @return
  159. */
  160. @Override
  161. public List<Map<String, Object>> judgeLastMaterial(BigDecimal orderId) {
  162. return rulesMapper.judgeLastMaterial(orderId);
  163. }
  164. /*=========================仓库排队规则=========================*/
  165. /**
  166. *通过物资Id查询仓库是否有货 或者 是否有多个仓库有货
  167. * @param materialId 物资ID
  168. * @return
  169. */
  170. @Override
  171. public List<Integer> getWarehouseIdByMaterialId(Integer materialId) {
  172. return rulesMapper.getWarehouseIdByMaterialId(materialId);
  173. }
  174. /**
  175. * 通过仓库Id 和 物资Id 查询垛位 层次 月台 仓库
  176. * @param map MaterialId 物资ID warehouseId 仓库ID
  177. * @return
  178. */
  179. @Override
  180. public List<Map<String, Object>> getStackGradation(Map<String, Object> map) {
  181. return rulesMapper.getStackGradation(map);
  182. }
  183. /**
  184. * 通过月台Id 查询月台当前排队车辆数
  185. * @param platformId 月台ID
  186. * @return
  187. */
  188. @Override
  189. public BigDecimal queueCountByPlatformId(BigDecimal platformId) {
  190. return rulesMapper.queueCountByPlatformId(platformId);
  191. }
  192. /**
  193. * 获取月台Id 通过物资ID 根据排队规则 获取车辆该去哪个月台
  194. * 规则:不同物资在不同仓库 --> 遍历仓库通过物资Id和仓库Id查找对应的仓储网格表
  195. * --> 找出多条数据 也就是说多个月台可以装 --> 遍历月台查看每个月台的排队车辆数 寻找最小的排队车辆数的月台
  196. * --> 返回物资ID 和 月台ID
  197. * @param materialId 物资ID
  198. * @return 月台ID
  199. */
  200. public Map<String, Object> getPlatId(Integer materialId){
  201. Map<String, Object> map = new HashMap<>();
  202. Integer platId = null;
  203. //一种物资可能在多个仓库中
  204. List<Integer> warehouseList = getWarehouseIdByMaterialId(materialId);
  205. int countNum = 1000; //初始化比较值
  206. for (Integer warehouseId : warehouseList) {
  207. HashMap<String, Object> hashMap = new HashMap<>();
  208. hashMap.put("materialId", materialId);
  209. hashMap.put("warehouseId", warehouseId);
  210. //通过物资Id和仓库ID对仓储网格表 再次进行查询并筛选出层次号最高的几条数据
  211. List<Map<String, Object>> mesList = getStackGradation(hashMap);
  212. //遍历筛选出来的月台 查看当前月台排队车辆数
  213. for (Map<String, Object> mesMap : mesList) {
  214. BigDecimal platformId = DataChange.dataToBigDecimal(mesMap.get("platformId"));
  215. //通过月台ID 和 网格类型 查找当前网格Id
  216. hashMap.put("queueLocationId", platformId);
  217. hashMap.put("gridType", 1);
  218. BigDecimal gridId = rulesMapper.getGridIdByGatepostIdAndGridType(hashMap);
  219. //取得排队车辆数
  220. int count = queueCountByPlatformId(gridId).intValue();
  221. map.put("count", count);
  222. //如果当前月台排队车数为0 则直接选择这个月台
  223. if(count == 0){
  224. platId = platformId.intValue();
  225. map.put("loadingId", platId);
  226. return map;
  227. }
  228. //如果排队车辆数小于上个月台排队车辆数
  229. if(count < countNum){
  230. countNum = count; //取代比较数
  231. platId = platformId.intValue(); //替换月台ID
  232. map.put("loadingId", platId);
  233. }
  234. }
  235. }
  236. return map;
  237. }
  238. /**
  239. * 计算物资优先级顺序 并计算装车点 传入多个物资ID
  240. * @param mapList
  241. */
  242. public Map<String, Object> calculateMaterialPriority (List<Map<String, Object>> mapList){
  243. int compareNum = 100; //优先级比较基准数初始值
  244. int compareNum2 = 0; //车辆排队序号
  245. Map<String, Object> map = new HashMap<>();
  246. for (Map<String, Object> mesMap : mapList) {
  247. int materialOrder = DataChange.dataToBigDecimal(mesMap.get("materialOrder")).intValue();
  248. if(materialOrder < compareNum){
  249. //通过当前物资Id查找装车点
  250. Map<String, Object> loadingIdMap = getPlatId(DataChange.dataToBigDecimal(map.get("materialId")).intValue());
  251. mesMap.put("loadingId", loadingIdMap.get("loadingId"));
  252. compareNum = materialOrder; //替换比较数
  253. compareNum2 = (int) loadingIdMap.get("count"); //添加车辆排队比较数
  254. map = mesMap;
  255. }
  256. if(materialOrder == compareNum){//如果优先级相同 计算当前月台排队车辆数
  257. //通过当前物资Id查找装车点
  258. Map<String, Object> loadingIdMap = getPlatId(DataChange.dataToBigDecimal(map.get("materialId")).intValue());
  259. int count = (int) loadingIdMap.get("count");
  260. mesMap.put("loadingId", loadingIdMap.get("loadingId"));
  261. //如果当前排队车辆数小于上一排队车辆数
  262. if(count < compareNum2){
  263. map = mesMap;//更换要返回的map
  264. compareNum2 = count;//替换排队比较数
  265. }
  266. }
  267. }
  268. return map;
  269. }
  270. /**
  271. * 计算装车顺序
  272. * @return
  273. */
  274. public Map<String, Object> calculateMaterial(List<Map<String, Object>> mapList){
  275. int compareNum = 100; //比较基准数
  276. //传入多个未装车的装车物资ID以及装车顺序
  277. Map<String, Object> map = null;
  278. for (Map<String, Object> mesMap : mapList) {
  279. //获取装车顺序 顺序小的先装
  280. BigDecimal loadingSequence = DataChange.dataToBigDecimal(mesMap.get("loadingSequence"));
  281. if(loadingSequence.intValue() < compareNum){
  282. map = mesMap;
  283. }
  284. }
  285. return map;
  286. }
  287. /**
  288. * 计算门岗
  289. * @param map
  290. * @return
  291. */
  292. public int calculateDxGatepostId(Map<String, Object> map){
  293. BigDecimal orderId = DataChange.dataToBigDecimal(map.get("orderId"));
  294. //针对新厂区
  295. int orderType = DataChange.dataToBigDecimal(map.get("orderType")).intValue();
  296. if(orderType == 1 || orderType == 2){ //销售
  297. //通过订单ID获取线路类型为哪种类型 钢材 焦炭 危化品
  298. Integer isSteel = rulesMapper.getLineIsSteel(orderId);
  299. if(isSteel == 3){
  300. return 12; //化工厂 化工厂二号门
  301. }
  302. if(isSteel == 4){
  303. return 9; //焦化厂 达兴二号门
  304. }
  305. }
  306. if(orderType == 7){
  307. return 10; // 采购燃料
  308. }
  309. if (orderType == 12 || orderType == 13){
  310. return 9; //内转 达兴二号门
  311. }
  312. if(orderType == 10){
  313. //查询还没有出厂门岗ID的实绩
  314. Integer resultCount = rulesMapper.getNoGatepostIdResult(orderId);
  315. if(resultCount == 0){
  316. return 13;
  317. }else {
  318. return 10;
  319. }
  320. }
  321. if(orderType == 17 || orderType == 18){ // 化工材料采购 现只考虑化工厂
  322. return 12;
  323. }
  324. return 0;
  325. }
  326. }