BmstruckDetailsOrderServiceImpl.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994
  1. package com.steerinfo.dil.service.impl;
  2. import com.steerinfo.dil.feign.AmsFeign;
  3. import com.steerinfo.dil.feign.JoinApiFeign;
  4. import com.steerinfo.dil.feign.OmsFeign;
  5. import com.steerinfo.dil.mapper.BmstruckDetailsOrderMapper;
  6. import com.steerinfo.dil.mapper.OmstruckOrderMapper;
  7. import com.steerinfo.dil.model.BmstruckDetailsOrder;
  8. import com.steerinfo.dil.model.OmstruckOrder;
  9. import com.steerinfo.dil.service.IBmstruckDetailsOrderService;
  10. import com.steerinfo.dil.util.DataChange;
  11. import com.steerinfo.dil.util.EASUtil;
  12. import com.steerinfo.dil.util.NoUtil;
  13. import io.swagger.models.auth.In;
  14. import org.apache.shiro.crypto.hash.Hash;
  15. import org.junit.Test;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.stereotype.Service;
  18. import org.springframework.transaction.annotation.Transactional;
  19. import javax.annotation.Resource;
  20. import java.lang.reflect.Array;
  21. import java.math.BigDecimal;
  22. import java.math.RoundingMode;
  23. import java.text.DecimalFormat;
  24. import java.util.*;
  25. import java.util.regex.Matcher;
  26. import java.util.regex.Pattern;
  27. /**
  28. * @Description:
  29. * @Author:HuJianGuo
  30. * @GreateTime:2021/9/24 17:34
  31. * @Version:V2.0
  32. */
  33. @Service
  34. public class BmstruckDetailsOrderServiceImpl implements IBmstruckDetailsOrderService {
  35. @Autowired
  36. BmstruckDetailsOrderMapper bmstruckDetailsOrderMapper;
  37. @Autowired
  38. BmstruckFormulaServiceImpl bmstruckFormulaService;
  39. @Autowired
  40. NoUtil noUtil;
  41. @Autowired
  42. JoinApiFeign joinApiFeign;
  43. @Autowired
  44. EASUtil easUtil;
  45. @Autowired
  46. OmstruckOrderMapper omstruckOrderMapper;
  47. @Autowired
  48. OmsFeign omsFeign;
  49. @Autowired
  50. AmsFeign amsFeign;
  51. //以下订单类型是需要算计量实绩的
  52. final private List<Integer> inwardTypeList = Arrays.asList(10,11,15,16,23,24,20,25);
  53. //以下订单类型是需要根据线路去匹配承运起止范围以及物资
  54. final private List<Integer> toLineAndMaterial = Arrays.asList(10,20,23,24);
  55. //以下订单类型是需要去根据固定承运起止范围以及物资
  56. final private List<Integer> fixLineList = Arrays.asList(15,16);
  57. //以下订单类型是钢材
  58. final private List<Integer> steelTypeList = Arrays.asList(25);
  59. /**
  60. * 展示汽运详单列表
  61. * @param mapVal
  62. * @return
  63. */
  64. @Override
  65. public List<Map<String, Object>> getTruckDetailsOrderList(Map<String, Object> mapVal) {
  66. Integer orderType = (Integer) mapVal.get("orderType");
  67. List<Map<String, Object>> truckDetailsOrderList;
  68. if (orderType <= 3 && orderType >= 1) {
  69. truckDetailsOrderList = bmstruckDetailsOrderMapper.getSaleTruckDetailsOrderList(mapVal);
  70. }
  71. else {
  72. truckDetailsOrderList = bmstruckDetailsOrderMapper.getTruckDetailsOrderList(mapVal);
  73. }
  74. return truckDetailsOrderList;
  75. }
  76. /**
  77. * 新增详单
  78. * @param orderId
  79. * @return
  80. */
  81. @Override
  82. public int insertSelective(BigDecimal orderId) throws Exception {
  83. List<Map<String,Object>> weightTaskResultIdList = bmstruckDetailsOrderMapper.getSteelWeightTaskResultId(orderId);
  84. Map<String,Object> priceMap = getPriceId(orderId);
  85. if (priceMap == null || priceMap.size() == 0) {
  86. return 0;
  87. }
  88. BigDecimal priceId = (BigDecimal) priceMap.get("priceId");
  89. // if (priceId.intValue() == 0) {
  90. // return 0;
  91. // }
  92. int result = 0;
  93. for (Map<String, Object> map : weightTaskResultIdList) {
  94. BigDecimal weightTaskResultId = DataChange.dataToBigDecimal(map.get("weightTaskResultId"));
  95. //判断该计量实绩有没有结算数据
  96. if(bmstruckDetailsOrderMapper.getIsHaveDetailsOrder(weightTaskResultId) > 0 ){
  97. continue;
  98. }
  99. //BigDecimal detailsAmountOld=new BigDecimal(0);
  100. try {
  101. BigDecimal detailsAmountOld = generateTruckFees(orderId, weightTaskResultId);
  102. Double amount = detailsAmountOld.doubleValue();
  103. BigDecimal detailsAmount = new BigDecimal(amount).setScale(2,RoundingMode.HALF_UP);
  104. BigDecimal orderType = bmstruckDetailsOrderMapper.getOrderType(orderId);
  105. BmstruckDetailsOrder bmstruckDetailsOrder = new BmstruckDetailsOrder();
  106. if (orderType.intValue() == 3) {
  107. BigDecimal purchaseOrderId = getFormulaMembers(orderId);
  108. bmstruckDetailsOrder.setPurchaseOrderId(purchaseOrderId);
  109. }
  110. if (orderType.intValue() == 2 || orderType.intValue() == 1) {
  111. bmstruckDetailsOrder.setWetherToStatement(new BigDecimal(0));
  112. }
  113. // 得到最大id
  114. BigDecimal detailsId = selectMaxId();
  115. String detailsNo = noUtil.setResultNo("QYXD", detailsId);
  116. bmstruckDetailsOrder.setDetailsId(detailsId);
  117. bmstruckDetailsOrder.setWeightTaskResultId(weightTaskResultId);
  118. bmstruckDetailsOrder.setOrderId(orderId);
  119. bmstruckDetailsOrder.setDetailsNo(detailsNo);
  120. bmstruckDetailsOrder.setPriceId(priceId);
  121. bmstruckDetailsOrder.setDetailsAmount(detailsAmount);
  122. bmstruckDetailsOrder.setDetailsTime(new Date());
  123. // 设置常规字段
  124. bmstruckDetailsOrder.setInsertTime(new Date());
  125. bmstruckDetailsOrder.setUpdateTime(new Date());
  126. bmstruckDetailsOrder.setInsertUsername("admin");
  127. bmstruckDetailsOrder.setUpdateUsername("admin");
  128. bmstruckDetailsOrder.setInsertUpdateRemark("无");
  129. result += bmstruckDetailsOrderMapper.insertSelective(bmstruckDetailsOrder);
  130. }catch (Exception e){
  131. //不打印给控制台(有可能是正常情况)
  132. e.printStackTrace();
  133. }
  134. }
  135. return result;
  136. }
  137. /**
  138. * 查询最大id
  139. * @return
  140. */
  141. @Override
  142. public BigDecimal selectMaxId() {
  143. return bmstruckDetailsOrderMapper.selectDetailsId();
  144. }
  145. /**
  146. * 展示汽运实绩列表
  147. * @param mapVal
  148. * @return
  149. */
  150. @Override
  151. public List<Map<String, Object>> getTruckResultList(Map<String, Object> mapVal) {
  152. BigDecimal orderId = (BigDecimal) mapVal.get("orderId") ;
  153. BigDecimal orderType = bmstruckDetailsOrderMapper.getOrderType(orderId);
  154. List<Map<String,Object>> mapList;
  155. if (orderType.intValue() <= 3 && orderType.intValue() >= 1) {
  156. mapList = bmstruckDetailsOrderMapper.getSaleTruckResultList(mapVal);
  157. }
  158. else {
  159. mapList = bmstruckDetailsOrderMapper.getTruckResultList(mapVal);
  160. }
  161. return mapList;
  162. }
  163. /**
  164. * 得到计算因子
  165. * @param orderId
  166. * @return
  167. */
  168. @Override
  169. public BigDecimal getFormulaMembers(BigDecimal orderId) {
  170. return bmstruckDetailsOrderMapper.getFormulaMembers(orderId);
  171. }
  172. /**
  173. * 得到价格id
  174. * @return
  175. */
  176. @Override
  177. public Map<String, Object> getPriceId(BigDecimal orderId) {
  178. return bmstruckDetailsOrderMapper.getPriceId(orderId);
  179. }
  180. /**
  181. * 得到单价
  182. * @param priceId
  183. * @return
  184. */
  185. @Override
  186. public BigDecimal getPriceValue(BigDecimal priceId) {
  187. return bmstruckDetailsOrderMapper.getPriceValue(priceId);
  188. }
  189. /**
  190. * 得到到厂湿重
  191. * @param weightTaskResultId
  192. * @return
  193. */
  194. @Override
  195. public BigDecimal getNetWeight(BigDecimal weightTaskResultId) {
  196. return bmstruckDetailsOrderMapper.getNetWeight(weightTaskResultId);
  197. }
  198. /**
  199. * 展示未转成销售账单的销售详单
  200. * @param mapVal
  201. * @param orderType
  202. * @return
  203. */
  204. @Override
  205. public List<Map<String, Object>> getUnFinishedTruckDetailsOrderList(Map<String, Object> mapVal, Integer orderType) {
  206. if (mapVal == null) {
  207. mapVal = new HashMap<>();
  208. }
  209. mapVal.put("orderType",new BigDecimal(orderType));
  210. return bmstruckDetailsOrderMapper.getUnFinishedTruckDetailsOrderList(mapVal);
  211. }
  212. //通过不同的值,查询未生成账单的计费详单
  213. @Override
  214. public List<Map<String, Object>> getUnFinishedConvertedTruckDetailsOrderList(Map<String, Object> mapVal, Integer orderType) {
  215. //orderType:1:计时,2:计数,3:计重,4:包月
  216. if(orderType==1){
  217. return bmstruckDetailsOrderMapper.getUnFinishedTimeTruckDetailsOrderList(mapVal);
  218. }
  219. else if(orderType==2){
  220. return bmstruckDetailsOrderMapper.getUnFinishedNumTruckDetailsOrderList(mapVal);
  221. }
  222. else if(orderType==3){
  223. return bmstruckDetailsOrderMapper.getUnFinishedWeightTruckDetailsOrderList(mapVal);
  224. }
  225. else if(orderType==4){
  226. return bmstruckDetailsOrderMapper.getUnFinishedMonthTruckDetailsOrderList(mapVal);
  227. }
  228. return null;
  229. }
  230. /**
  231. * 替换汽运费公式并进行计算
  232. * @param orderId
  233. * @return
  234. * @throws Exception
  235. */
  236. public BigDecimal generateTruckFees(BigDecimal orderId,BigDecimal weightTaskResultId) throws Exception {
  237. BigDecimal orderType = bmstruckDetailsOrderMapper.getOrderType(orderId);
  238. Map<String, Object> priceMap = getPriceId(orderId);
  239. BigDecimal priceId = (BigDecimal) priceMap.get("priceId");
  240. BigDecimal priceValue = getPriceValue(priceId);
  241. BigDecimal netWeight = getNetWeight(weightTaskResultId);
  242. //用于给单价id为2400的生成详单
  243. if (priceValue==null||priceValue.compareTo(BigDecimal.ZERO)==0){
  244. //该值为任意给的值
  245. priceValue=BigDecimal.TEN;
  246. }
  247. // 得到计费公式
  248. String formula_string = null;
  249. if (orderType.intValue() == 3) {
  250. // 得到采购汽运计费公式
  251. formula_string = bmstruckFormulaService.getTruckFormula(new BigDecimal(8));
  252. // 替换采购汽运运计算公式
  253. formula_string = formula_string.replace("到厂计量湿吨",netWeight.toString())
  254. .replace("单价",priceValue.toString());
  255. }
  256. if (orderType.intValue() >= 1 && orderType.intValue() <= 3) {
  257. // BigDecimal distance = new BigDecimal(101);
  258. // 得到销售汽运计费公式
  259. // if (distance.intValue() >= 91 || distance.intValue() <= 109) {
  260. // 得到销售10km差距内的汽运计费公式
  261. formula_string = bmstruckFormulaService.getTruckFormula(new BigDecimal(10));
  262. // 替换采购汽运运计算公式
  263. formula_string = formula_string.replace("运输单价",priceValue.toString())
  264. .replace("物资净重",netWeight.toString());
  265. // }
  266. // else {
  267. // // 得到销售10km差距外的汽运计费公式
  268. // formula_string = bmstruckFormulaService.getTruckFormula(new BigDecimal(11));
  269. // // 替换采购汽运运计算公式
  270. // formula_string = formula_string.replace("运输单价",priceValue.toString())
  271. // .replace("运输距离",distance.toString())
  272. // .replace("物资净重",netWeight.toString());
  273. // }
  274. }
  275. String s = toSufExpr(formula_string);
  276. return calSufExpr(s);
  277. }
  278. public BigDecimal updateSteelAmounts(Map<String,Object> map) throws Exception {
  279. BigDecimal orderId = DataChange.dataToBigDecimal(map.get("orderId"));
  280. BigDecimal weightTaskResultId = DataChange.dataToBigDecimal(map.get("weightTaskResultId"));
  281. BigDecimal orderType = bmstruckDetailsOrderMapper.getOrderType(orderId);
  282. BigDecimal priceId = DataChange.dataToBigDecimal(map.get("priceId"));
  283. BigDecimal priceValue = getPriceValue(priceId);
  284. if(priceValue==null){
  285. //单价为Null,则返回0
  286. return new BigDecimal(0);
  287. }
  288. BigDecimal netWeight = getNetWeight(weightTaskResultId);
  289. // 得到计费公式
  290. String formula_string = null;
  291. if (orderType.intValue() >= 1 && orderType.intValue() <= 3) {
  292. // BigDecimal distance = new BigDecimal(101);
  293. // 得到销售汽运计费公式
  294. // if (distance.intValue() >= 91 || distance.intValue() <= 109) {
  295. // 得到销售10km差距内的汽运计费公式
  296. formula_string = bmstruckFormulaService.getTruckFormula(new BigDecimal(10));
  297. // 替换采购汽运运计算公式
  298. formula_string = formula_string.replace("运输单价",priceValue.toString())
  299. .replace("物资净重",netWeight.toString());
  300. // }
  301. // else {
  302. // // 得到销售10km差距外的汽运计费公式
  303. // formula_string = bmstruckFormulaService.getTruckFormula(new BigDecimal(11));
  304. // // 替换采购汽运运计算公式
  305. // formula_string = formula_string.replace("运输单价",priceValue.toString())
  306. // .replace("运输距离",distance.toString())
  307. // .replace("物资净重",netWeight.toString());
  308. // }
  309. }
  310. String s = toSufExpr(formula_string);
  311. return calSufExpr(s);
  312. }
  313. /**
  314. * 中缀转换后缀表达式
  315. */
  316. public String toSufExpr(String s) {
  317. StringBuffer sufExpr = new StringBuffer();
  318. Stack<String> stack = new Stack<>();
  319. //压入空方便判断
  320. stack.push(null);
  321. Pattern pattern = Pattern.compile("\\(int\\)|(?<!\\d|[)])-?\\d+(\\.\\d+)?|!=|>=|<=|==|[+\\-*/%()><=|]");
  322. Matcher matcher = pattern.matcher(s);
  323. while (matcher.find()) {
  324. String group = matcher.group();
  325. if (group.matches("!=|>=|<=|==|[+\\-*/%()><=|]|\\(int\\)")) {//是运算符
  326. if (group.equals("(")) {//之间压栈
  327. stack.push(group);
  328. } else if (group.equals(")")) {//等于右括号,一直弹栈,直到遇到左括号
  329. String pop = null;
  330. while (!(pop = stack.pop()).equals("(")) {//遍历循环至左括号
  331. sufExpr.append(pop + " ");
  332. }
  333. } else {//是运算符:加减乘除强转,根据优先级压栈
  334. while (getPriority(group) <= getPriority(stack.peek())) {
  335. String pop = stack.pop();
  336. System.out.println(pop);
  337. System.out.println(sufExpr);
  338. if(pop!=null&&!pop.equals("|")){
  339. sufExpr.append(pop + " ");
  340. }
  341. }
  342. stack.push(group);
  343. }
  344. } else {//是数字
  345. sufExpr.append(group + " ");
  346. }
  347. }
  348. String pop = null;
  349. while (null != (pop = stack.pop())) {
  350. sufExpr.append(pop + " ");
  351. }
  352. return sufExpr.toString();
  353. }
  354. /**
  355. * 设置出栈优先级,(:优先级最低,表示只有遇到)才能出栈
  356. * 当栈顶遇到优先级比自己小或等于的弹栈
  357. */
  358. public Integer getPriority(String c) {
  359. if (c == null) {
  360. return 0;
  361. }
  362. switch (c) {
  363. case "(":
  364. return 1;
  365. case "+":
  366. case "-":
  367. return 2;
  368. case "*":
  369. case "/":
  370. case "%":
  371. return 3;
  372. case ">":
  373. case "<":
  374. case ">=":
  375. case "<=":
  376. case "!=":
  377. case "==":
  378. return 4;
  379. case "|":
  380. return 5;
  381. case "=":
  382. return 6;
  383. case "(int)":
  384. return 7;
  385. }
  386. return 0;
  387. }
  388. /**
  389. * 计算值
  390. */
  391. public BigDecimal cal(BigDecimal a1, BigDecimal a2, String operator) throws Exception {
  392. switch (operator){
  393. case "+":return a1.add(a2);
  394. case "-":return a1.subtract(a2);
  395. case "*":return a1.multiply(a2);
  396. case "/":return a1.divide(a2,3,BigDecimal.ROUND_CEILING);
  397. case "%":return a1.divideAndRemainder(a2)[1];
  398. default:
  399. break;
  400. }
  401. throw new Exception("非法运算符");
  402. }
  403. public Boolean calBoolean(BigDecimal a1, BigDecimal a2, String operator) throws Exception {
  404. switch (operator){
  405. case ">":return a1.compareTo(a2) == 1;
  406. case "<":return a1.compareTo(a2) == -1;
  407. case ">=":return a1.compareTo(a2) > -1;
  408. case "<=":return a1.compareTo(a2) < 1;
  409. case "!=":return a1.compareTo(a2) != 0;
  410. case "==":return a1.compareTo(a2) == 0;
  411. default:
  412. break;
  413. }
  414. throw new Exception("非法运算符");
  415. }
  416. /**
  417. * 计算后缀表达式
  418. */
  419. public BigDecimal calSufExpr(String sufExpr) throws Exception {
  420. Stack<BigDecimal> stack = new Stack<>();
  421. Pattern pattern=Pattern.compile("\\(int\\)|-?\\d+(\\.\\d+)?|!=|>=|<=|==|[+\\-*/%><=]");//提取运算符和数字
  422. Matcher matcher = pattern.matcher(sufExpr);
  423. BigDecimal result=new BigDecimal("0.0");
  424. while (matcher.find()){
  425. String group = matcher.group();
  426. if(group.matches("[+\\-*/%]")){
  427. BigDecimal a1 =stack.pop();
  428. BigDecimal a2 =stack.pop();
  429. result = cal(a2, a1, group);
  430. stack.push(result);
  431. }
  432. else if(group.equals("(int)")){
  433. BigDecimal pop = stack.pop();
  434. BigDecimal bigDecimal = pop.setScale(0, BigDecimal.ROUND_DOWN);
  435. stack.push(bigDecimal);
  436. }
  437. else if(group.matches("!=|>=|<=|==|[><]")){
  438. BigDecimal a1 =stack.pop();
  439. BigDecimal a2 =stack.pop();
  440. stack.push(calBoolean(a2,a1,group)?new BigDecimal(1):new BigDecimal(0));
  441. }
  442. else if(group.equals("=")){
  443. BigDecimal a1 =stack.pop();
  444. BigDecimal a2 =stack.pop();
  445. if (a2.compareTo(new BigDecimal(1))==0) {
  446. stack.push(a1);
  447. }
  448. }
  449. else {//为数字直接压栈
  450. stack.push(new BigDecimal(group));
  451. }
  452. }
  453. return result;
  454. }
  455. /**
  456. * 新增内转汽运详单
  457. * @param orderId
  458. * @return
  459. * @throws Exception
  460. */
  461. @Override
  462. public int addConvertedDetailsOrder(BigDecimal orderId) throws Exception {
  463. // 得到最大id
  464. BigDecimal detailsId = selectMaxId();
  465. String detailsNo = noUtil.setResultNo("QYXD", detailsId);
  466. // 新增详单实体
  467. BmstruckDetailsOrder bmstruckDetailsOrder = new BmstruckDetailsOrder();
  468. // 设置常规字段
  469. bmstruckDetailsOrder.setInsertTime(new Date());
  470. bmstruckDetailsOrder.setInsertUsername("admin");
  471. bmstruckDetailsOrder.setInsertUpdateRemark("无");
  472. // 通过订单号获取物资信息以及结算方式
  473. Map<String, Object> mapVal=getSettlement(orderId);
  474. //需求类型(0:计重;1:计时;2:计次;3:包月)
  475. String requirementType=mapVal.get("requirementType").toString();
  476. Integer materialId =Integer.parseInt(mapVal.get("materialId").toString());
  477. //通过物资id以及结算方式获取单价;
  478. BigDecimal priceId=getPriceByWz(requirementType,materialId);
  479. // 将单价存入实体
  480. bmstruckDetailsOrder.setPriceId(priceId);
  481. // 获取物资数量/计时获取时长/计数为一次/包月为包月价
  482. if("0".equals(requirementType)){
  483. //通过单价ID获取单价
  484. BigDecimal price=getPriceValue(priceId);
  485. //获取物资重量
  486. BigDecimal weight=getNetWeight(priceId);
  487. bmstruckDetailsOrder.setDetailsAmount(new BigDecimal(price.doubleValue()*weight.doubleValue()));
  488. }
  489. else{
  490. //通过单价ID获取单价
  491. BigDecimal price=getPriceValue(priceId);
  492. bmstruckDetailsOrder.setDetailsAmount(price);
  493. }
  494. return bmstruckDetailsOrderMapper.insertSelective(bmstruckDetailsOrder);
  495. }
  496. //通过物资id以及结算方式获取单价;
  497. @Override
  498. public BigDecimal getPriceByWz(String requirementType, Integer materialId) {
  499. return bmstruckDetailsOrderMapper.getPriceByWz(requirementType,materialId);
  500. }
  501. @Override
  502. // 通过订单号获取物资信息以及结算方式
  503. public Map<String, Object> getSettlement(BigDecimal orderId) {
  504. return bmstruckDetailsOrderMapper.getSettlement(orderId);
  505. }
  506. /**
  507. * 修改详单
  508. * @param mapValue
  509. * @return
  510. */
  511. @Transactional
  512. @Override
  513. public int updateDetailsOrder(Map<String, Object> mapValue) {
  514. BigDecimal orderId = DataChange.dataToBigDecimal(mapValue.get("orderId"));
  515. BigDecimal priceId = DataChange.dataToBigDecimal(mapValue.get("priceId"));
  516. try {
  517. int i = insertSelective(orderId);
  518. } catch (Exception e) {
  519. //不打印给控制台(可能是正常情况)
  520. }
  521. //根据运输订单id查询计费详单id
  522. OmstruckOrder omstruckOrder = new OmstruckOrder();
  523. omstruckOrder.setOrderId(orderId);
  524. omstruckOrder.setPriceId(priceId);
  525. try{
  526. //通过userId查询出用户名
  527. String carrierName = bmstruckDetailsOrderMapper.getCarrierNameForPriceValue((String) mapValue.get("userId"));
  528. //根据运输ID查询出记录下来的用户名
  529. String recordUserName = bmstruckDetailsOrderMapper.getUserName(orderId);
  530. if (recordUserName==null){
  531. omstruckOrder.setRecordUsername(carrierName+",");
  532. }else {
  533. String[] s = recordUserName.split(",");
  534. if (s.length < 2){
  535. omstruckOrder.setRecordUsername(recordUserName+carrierName+",");
  536. }else if (s.length ==2){
  537. omstruckOrder.setRecordUsername(recordUserName+carrierName);
  538. }else if (s.length==3){
  539. s[0]=s[1];
  540. s[1]=s[2];
  541. s[2]=carrierName;
  542. omstruckOrder.setRecordUsername(s[0]+","+s[1]+","+s[2]);
  543. }
  544. }
  545. }catch (Exception e){
  546. System.out.println("e"+e.getMessage());
  547. }
  548. omstruckOrderMapper.updateByPrimaryKeySelective(omstruckOrder);
  549. List<BigDecimal> detailIds = bmstruckDetailsOrderMapper.getDetailIds(orderId);
  550. int result = 0;
  551. for (BigDecimal detailsId : detailIds) {
  552. BmstruckDetailsOrder bmstruckDetailsOrder = bmstruckDetailsOrderMapper.selectByPrimaryKey(detailsId);
  553. bmstruckDetailsOrder.setHistoryDetailsAmount(bmstruckDetailsOrder.getDetailsAmount());
  554. // 重新设置单价
  555. BigDecimal priceId1 = bmstruckDetailsOrder.getPriceId();
  556. bmstruckDetailsOrder.setPriceids(priceId1+","+priceId);
  557. bmstruckDetailsOrder.setPriceId(priceId);
  558. BigDecimal weightTaskResultId = bmstruckDetailsOrder.getWeightTaskResultId();
  559. Map<String,Object> map = new HashMap<>();
  560. map.put("orderId",orderId);
  561. map.put("weightTaskResultId",weightTaskResultId);
  562. map.put("priceId",priceId);
  563. try {
  564. // 计算出新的详单金额
  565. BigDecimal newAmount = updateSteelAmounts(map);
  566. bmstruckDetailsOrder.setDetailsAmount(newAmount.divide(new BigDecimal(1),2, RoundingMode.HALF_UP));
  567. //修改单价的历史时间
  568. //omstruckOrderMapper.modifyOldTime(priceId,new Date());
  569. }catch (Exception e) {
  570. System.out.println("更新历史时间失败");
  571. }
  572. result = bmstruckDetailsOrderMapper.updateByPrimaryKeySelective(bmstruckDetailsOrder);
  573. }
  574. /*try {
  575. amsFeign.copySteelPrice(mapValue);
  576. } catch (Exception e) {
  577. e.printStackTrace();
  578. }*/
  579. if(DataChange.dataToBigDecimal(mapValue.get("updatePlace")).intValue() == 1) {
  580. Map<String, Object> stringObjectMap = bmstruckDetailsOrderMapper.getsaleShippingAddressId(mapValue);
  581. BigDecimal saleShippingAddressId = (BigDecimal) stringObjectMap.get("saleShippingAddressId");
  582. BigDecimal historyShippingAddressId = (BigDecimal) stringObjectMap.get("historyShippingAddressId");
  583. if (historyShippingAddressId!=null){
  584. //修改地址(不修改历史地址)
  585. bmstruckDetailsOrderMapper.updatePlaceNew(mapValue);
  586. }else if (historyShippingAddressId==null ) {
  587. mapValue.put("historyPlaceId", saleShippingAddressId);
  588. //修改地址(不修改历史地址)
  589. bmstruckDetailsOrderMapper.updatePlace(mapValue);
  590. }
  591. }
  592. return result;
  593. }
  594. @Override
  595. public int updateAsomPriceId(Map<String, Object> mapValue) {
  596. //前面更新运单时更新过地址了,这里就不更新了,如果订单ID为空,才更新
  597. if(DataChange.dataToBigDecimal(mapValue.get("updatePlace")).intValue() == 1 && mapValue.get("orderId")==null) {
  598. Map<String, Object> stringObjectMap = bmstruckDetailsOrderMapper.getsaleShippingAddressId(mapValue);
  599. BigDecimal saleShippingAddressId = (BigDecimal) stringObjectMap.get("saleShippingAddressId");
  600. BigDecimal historyShippingAddressId = (BigDecimal) stringObjectMap.get("historyShippingAddressId");
  601. if (historyShippingAddressId!=null){
  602. //修改地址(不修改历史地址)
  603. bmstruckDetailsOrderMapper.updatePlaceNew(mapValue);
  604. }else if (historyShippingAddressId==null ) {
  605. mapValue.put("historyPlaceId", saleShippingAddressId);
  606. //修改地址(不修改历史地址)
  607. bmstruckDetailsOrderMapper.updatePlace(mapValue);
  608. }
  609. }
  610. return bmstruckDetailsOrderMapper.updateAsomPriceId(mapValue);
  611. }
  612. @Override
  613. public BigDecimal getCarrierIdBySSO(String carrierSsoId) {
  614. return bmstruckDetailsOrderMapper.getCarrierIdBySSO(carrierSsoId);
  615. }
  616. // 根据单价id查询价格和地址
  617. @Override
  618. public Map<String,Object> findAddressAndPrice(Integer priceId) {
  619. return bmstruckDetailsOrderMapper.findAddressAndPrice(new BigDecimal(priceId));
  620. }
  621. /**
  622. * 增加焦炭途损费
  623. * @param map
  624. * @return
  625. */
  626. @Override
  627. public int addLossFeeOfCoke(Map<String,Object> map) {
  628. BigDecimal lossFees = DataChange.dataToBigDecimal(map.get("lossFees"));
  629. BigDecimal detailsId = DataChange.dataToBigDecimal(map.get("detailsId"));
  630. BmstruckDetailsOrder bmstruckDetailsOrder = bmstruckDetailsOrderMapper.selectByPrimaryKey(detailsId);
  631. BigDecimal detailsAmount = bmstruckDetailsOrder.getDetailsAmount();
  632. DecimalFormat df = new DecimalFormat("0.00");
  633. Double newAmount = detailsAmount.doubleValue() - lossFees.doubleValue();
  634. String newAmountStr = df.format(newAmount);
  635. bmstruckDetailsOrder.setDetailsAmount(new BigDecimal(newAmountStr));
  636. int result = bmstruckDetailsOrderMapper.updateByPrimaryKeySelective(bmstruckDetailsOrder);
  637. return result;
  638. }
  639. /*
  640. 内转计重计费详单
  641. */
  642. @Override
  643. public List<Map<String, Object>> getInwardWeightDetailsOrder(Map<String, Object> mapValue, Integer orderType) {
  644. List<Map<String,Object>>mapList = new ArrayList<>();
  645. switch (orderType){
  646. case 10:
  647. List<Map<String, Object>> inwardReportResult = bmstruckDetailsOrderMapper.getPurInwarWeightDetailsOrder(mapValue);
  648. return inwardReportResult;
  649. case 21:
  650. return bmstruckDetailsOrderMapper.getInwardTimeDetailsOrder(mapValue);
  651. case 11:
  652. return bmstruckDetailsOrderMapper.getAllInwardWeight(mapValue);
  653. case 26:
  654. return bmstruckDetailsOrderMapper.getInwardCountDetailsOrder(mapValue);
  655. default:
  656. break;
  657. }
  658. return mapList;
  659. }
  660. @Override
  661. public int inserInwardOrder(Map<String, Object> mapVal) {
  662. //获取运输订单ID
  663. BigDecimal orderId= DataChange.dataToBigDecimal(mapVal.get("orderId"));
  664. //根据运输订单去查找订单类型
  665. BigDecimal orderType = bmstruckDetailsOrderMapper.getOrderType(orderId);
  666. //根据运输订单id去查询计费详单id
  667. if(bmstruckDetailsOrderMapper.selectDetailsByOrder(orderId) > 0){
  668. return -1;
  669. }
  670. List<Map<String,Object>> priceAmountList = new ArrayList<>();
  671. if(inwardTypeList.contains(orderType.intValue())){
  672. //获取该订单的计量实绩ID以及净重,只会返回一条数据
  673. priceAmountList = bmstruckDetailsOrderMapper.getWeightTaskResultId(orderId);
  674. }
  675. if(toLineAndMaterial.contains(orderType.intValue())){
  676. //如果在以上订单类型里面则需要根据运输订单ID去找线路和物资
  677. Map<String,Object> priceInfoPur = bmstruckDetailsOrderMapper.getPriceInfoPur(orderId);
  678. //根据物资品类ID和承运起止范围去匹配单价
  679. Map<String,Object> map = bmstruckDetailsOrderMapper.getPurInwardPrice(priceInfoPur);
  680. if(map != null){
  681. mapVal.putAll(map);
  682. }else{
  683. return -1;
  684. }
  685. }
  686. if(fixLineList.contains(orderType.intValue())){
  687. //拼装车皮进厂以及一焦化采购焦炭进厂
  688. Map<String,Object> priceInfoPur = bmstruckDetailsOrderMapper.getPriceInfoPur(orderId);
  689. priceInfoPur.put("transRangeId",1);
  690. //根据物资品类ID和承运起止范围去匹配单价
  691. Map<String,Object> map = bmstruckDetailsOrderMapper.getPurInwardPrice(priceInfoPur);
  692. if(map != null){
  693. mapVal.putAll(map);
  694. }else{
  695. return -1;
  696. }
  697. }
  698. if(steelTypeList.contains(orderType.intValue())){
  699. //钢材倒库
  700. //首先获取净重
  701. //BigDecimal netWeight = bmstruckDetailsOrderMapper.selectNetWeight(orderId);
  702. //mapVal.put("netWeight",netWeight);
  703. //获取单价
  704. Map<String, Object> priceInfoPur = new HashMap<>();
  705. priceInfoPur.put("transRangeId",1);
  706. priceInfoPur.put("materialTypeId",5102);
  707. Map<String,Object> map = bmstruckDetailsOrderMapper.getPurInwardPrice(priceInfoPur);
  708. if(map != null){
  709. mapVal.putAll(map);
  710. }else{
  711. return -1;
  712. }
  713. }
  714. if(orderType.intValue() == 21 || orderType.intValue()==26){
  715. //计时/计次
  716. priceAmountList.add(mapVal);
  717. }
  718. //获取单价ID
  719. BigDecimal priceId = DataChange.dataToBigDecimal(mapVal.get("priceId")) ;
  720. //获取单价值
  721. BigDecimal priceValue = DataChange.dataToBigDecimal(mapVal.get("priceValue"));
  722. if(priceId == null){
  723. System.out.println(orderId + "没有单价");
  724. return 1;
  725. }
  726. int result = 0;
  727. for (Map<String, Object> map : priceAmountList) {
  728. BmstruckDetailsOrder bmstruckDetailsOrder = new BmstruckDetailsOrder();
  729. //查询计重且计时
  730. String s = bmstruckDetailsOrderMapper.selectWeightAndTimeByOrderId(orderId);
  731. int num=0;
  732. if (s!=null && s.contains("计时且过计量")){
  733. num=21;
  734. }
  735. if(inwardTypeList.contains(orderType.intValue()) && num==0){
  736. BigDecimal weightTaskResultId = DataChange.dataToBigDecimal(map.get("weightTaskResultId"));
  737. BigDecimal netWeight = null;
  738. if(mapVal.get("netWeight") != null) {
  739. //因为事务的关系,部分订单结束时可能没有净重,故需要添加净重
  740. netWeight = DataChange.dataToBigDecimal(mapVal.get("netWeight"));
  741. }
  742. else{
  743. netWeight = DataChange.dataToBigDecimal(map.get("netWeight"));
  744. }
  745. //计算详单金额
  746. BigDecimal detailsAmount = new BigDecimal(priceValue.doubleValue()*netWeight.doubleValue());
  747. //保留两位小数
  748. DecimalFormat df = new DecimalFormat("0.00");
  749. String format = df.format(detailsAmount);
  750. //关联计量实绩
  751. bmstruckDetailsOrder.setWeightTaskResultId(weightTaskResultId);
  752. if(priceId != null && priceValue !=null && detailsAmount.intValue() > 0){
  753. bmstruckDetailsOrder.setDetailsAmount(new BigDecimal(format));
  754. }
  755. }
  756. //内转计时结算
  757. if(orderType.intValue() == 21 || num==21){
  758. BigDecimal resultTime = DataChange.dataToBigDecimal(mapVal.get("Time1"));
  759. //保留两位小数
  760. DecimalFormat df = new DecimalFormat("0.00");
  761. BigDecimal settleTime = new BigDecimal(String.valueOf(resultTime.divide(new BigDecimal(60), 14, BigDecimal.ROUND_HALF_UP)));
  762. if(settleTime.doubleValue()<2.00){
  763. BigDecimal detailsAmount = new BigDecimal(priceValue.doubleValue()*2);
  764. bmstruckDetailsOrder.setDetailsAmount(new BigDecimal(df.format(detailsAmount)));
  765. }else{
  766. BigDecimal detailsAmount = new BigDecimal(priceValue.doubleValue()*settleTime.doubleValue());
  767. bmstruckDetailsOrder.setDetailsAmount(new BigDecimal(df.format(detailsAmount)));
  768. }
  769. }
  770. //内转计次结算
  771. if(orderType.intValue() == 26){
  772. //保留两位小数
  773. DecimalFormat df = new DecimalFormat("0.00");
  774. BigDecimal detailsAmount = new BigDecimal(priceValue.doubleValue());
  775. bmstruckDetailsOrder.setDetailsAmount(new BigDecimal(df.format(detailsAmount)));
  776. }
  777. bmstruckDetailsOrder.setPriceId(priceId);
  778. bmstruckDetailsOrder.setInsertUpdateRemark("单价存在");
  779. // 得到最大id
  780. BigDecimal detailsId = selectMaxId();
  781. bmstruckDetailsOrder.setOrderId(orderId);
  782. String detailsNo = noUtil.setResultNo("QYXD", detailsId);
  783. bmstruckDetailsOrder.setDetailsId(detailsId);
  784. bmstruckDetailsOrder.setDetailsNo(detailsNo);
  785. bmstruckDetailsOrder.setDetailsTime(new Date());
  786. // 设置常规字段
  787. bmstruckDetailsOrder.setInsertTime(new Date());
  788. bmstruckDetailsOrder.setWetherToStatement(new BigDecimal(0));
  789. bmstruckDetailsOrder.setInsertUsername("admin");
  790. bmstruckDetailsOrder.setUpdateUsername("admin");
  791. result += bmstruckDetailsOrderMapper.insertSelective(bmstruckDetailsOrder);
  792. }
  793. return result;
  794. }
  795. @Override
  796. public int updateDetails() {
  797. List<Map<String,Object>>mapList = bmstruckDetailsOrderMapper.selectDetailsNoAmount();
  798. int i=0;
  799. for (Map<String,Object>map:mapList
  800. ) {
  801. //获取详单ID、价格值,净重
  802. BigDecimal detailsId = DataChange.dataToBigDecimal(map.get("detailsId"));
  803. BigDecimal netWeight = DataChange.dataToBigDecimal(map.get("netWeight"));
  804. BigDecimal priceValue = DataChange.dataToBigDecimal(map.get("priceValue"));
  805. BmstruckDetailsOrder bmstruckDetailsOrder = new BmstruckDetailsOrder();
  806. bmstruckDetailsOrder.setDetailsId(detailsId);
  807. BigDecimal detailsAmount = new BigDecimal(priceValue.doubleValue()*netWeight.doubleValue());
  808. DecimalFormat df = new DecimalFormat("0.00");
  809. String format = df.format(detailsAmount);
  810. bmstruckDetailsOrder.setDetailsAmount(new BigDecimal(format));
  811. i += bmstruckDetailsOrderMapper.updateByPrimaryKeySelective(bmstruckDetailsOrder);
  812. }
  813. return i;
  814. }
  815. /*
  816. 内转计重+计时计费详单
  817. */
  818. @Override
  819. public List<Map<String, Object>> getInwardWeightTimeDetailsOrder(Map<String, Object> mapValue, Integer orderType) {
  820. List<Map<String,Object>>mapListWeight = new ArrayList<>();
  821. List<Map<String,Object>>mapListTime = new ArrayList<>();
  822. //计重计费详单查询结果
  823. mapListWeight = bmstruckDetailsOrderMapper.getInwardWeightDetailsOrder(mapValue);
  824. //for(Map<String, Object> mapListWeightOne : mapListWeight)
  825. //{
  826. // mapListWeightOne.put("resultTime","null");
  827. //}
  828. //计时计费详单查询结果
  829. mapListTime = bmstruckDetailsOrderMapper.getInwardTimeDetailsOrder(mapValue);
  830. //将计时查询结果加入到计重查询结果中
  831. for(Map<String, Object> mapListTimeOne:mapListTime)
  832. { mapListTimeOne.put("capacityNumber",mapListTimeOne.remove("capacityNum"));
  833. mapListWeight.add(mapListTimeOne);
  834. }
  835. //返回计重+计时计费详单查询结果
  836. return mapListWeight;
  837. }
  838. @Override
  839. public List<Map<String, Object>> getNoInwardDetails(Map<String, Object> mapValue) {
  840. return bmstruckDetailsOrderMapper.getNoInwardDetails(mapValue);
  841. }
  842. @Override
  843. public List<Map<String, Object>> getSteelTruckDetailsOrder(Map<String, Object> mapValue) {
  844. return bmstruckDetailsOrderMapper.getSteelTruckDetailsOrder(mapValue);
  845. }
  846. @Override
  847. public int newInwardSettle(List<Map<String,Object>> orderIds) {
  848. int count = 0;
  849. //遍历数组
  850. for(Map<String,Object> orderIdMap:orderIds){
  851. Integer orderId = DataChange.dataToBigDecimal(orderIdMap.get("orderId")).intValue();
  852. //根据运输ID获取订单类型
  853. BigDecimal orderType = bmstruckDetailsOrderMapper.getOrderType(new BigDecimal(orderId));
  854. //根据订单类型调用不同的方法
  855. //如果订单类型是11,
  856. if(orderType.intValue() == 11){
  857. List<BigDecimal> detailsIds = bmstruckDetailsOrderMapper.getDetailsIdByOrderId(orderId);
  858. if(detailsIds.size() == 0){
  859. omsFeign.closeInwardOrder(orderId);
  860. count++;
  861. }else{
  862. for(int i=0;i<detailsIds.size();i++){
  863. bmstruckDetailsOrderMapper.deleteByPrimaryKey(detailsIds.get(i));
  864. omsFeign.closeInwardOrder(orderId);
  865. count++;
  866. }
  867. }
  868. }
  869. if(orderType.intValue() == 10 || orderType.intValue() == 20){
  870. //根据运输订单ID找寻计费详单ID
  871. List<BigDecimal> detailsIds = bmstruckDetailsOrderMapper.getDetailsIdByOrderId(orderId);
  872. for(BigDecimal detailsId:detailsIds){
  873. //根据详单ID物理删除详单
  874. bmstruckDetailsOrderMapper.deleteByPrimaryKey(detailsId);
  875. count++;
  876. }
  877. inserInwardOrder(orderIdMap);
  878. }
  879. if(orderType.intValue() == 23 || orderType.intValue() == 24){
  880. List<BigDecimal> detailsIds = bmstruckDetailsOrderMapper.getDetailsIdByOrderId(orderId);
  881. for(BigDecimal detailsId:detailsIds){
  882. //根据详单ID物理删除详单
  883. bmstruckDetailsOrderMapper.deleteByPrimaryKey(detailsId);
  884. count++;
  885. }
  886. inserInwardOrder(orderIdMap);
  887. }
  888. if(orderType.intValue() == 16 || orderType.intValue() == 15){
  889. List<BigDecimal> detailsIds = bmstruckDetailsOrderMapper.getDetailsIdByOrderId(orderId);
  890. for(BigDecimal detailsId:detailsIds){
  891. //根据详单ID物理删除详单
  892. bmstruckDetailsOrderMapper.deleteByPrimaryKey(detailsId);
  893. count++;
  894. }
  895. inserInwardOrder(orderIdMap);
  896. }
  897. }
  898. return count;
  899. }
  900. @Override
  901. public int updateDetailsStatus(List<Integer> mapList) {
  902. int i = 0;
  903. for(Integer orderId :mapList) {
  904. //BigDecimal detailId = DataChange.dataToBigDecimal(map.get("detailId"));
  905. //BmstruckDetailsOrder bmstruckDetailsOrder = new BmstruckDetailsOrder();
  906. //bmstruckDetailsOrder.setDetailsId(detailId);
  907. //bmstruckDetailsOrder.setWetherToStatement(new BigDecimal(1));
  908. //i += bmstruckDetailsOrderMapper.updateByPrimaryKeySelective(bmstruckDetailsOrder);
  909. i += bmstruckDetailsOrderMapper.updateDetailsStatus(orderId);
  910. /*BigDecimal priceId = omstruckOrderMapper.getPriceId(orderId);
  911. omstruckOrderMapper.modifyOldTime(priceId,new Date());*/
  912. }
  913. return i;
  914. }
  915. @Override
  916. public int getSaleOrderStatus(BigDecimal orderId) {
  917. return bmstruckDetailsOrderMapper.getSaleOrderStatus(orderId);
  918. }
  919. @Override
  920. public int insertPriceValue(List<Map<String, Object>> mapList) {
  921. for (Map<String, Object> map : mapList) {
  922. Integer placeId =(Integer) map.get("placeId");
  923. //根据位置ID去查询是否有单价存在,如果有就跳过
  924. BigDecimal priceIdInt = bmstruckDetailsOrderMapper.getPriceIdInt(placeId);
  925. if (priceIdInt!=null&&priceIdInt.compareTo(BigDecimal.ZERO)!=0){
  926. break;
  927. }else {
  928. //新增单价
  929. BigDecimal orderId = DataChange.dataToBigDecimal(map.get("orderId"));
  930. BigDecimal omsTruckOrderPriceId = bmstruckDetailsOrderMapper.getOmsTruckOrderPriceId(orderId);
  931. Map<String,Object> map1=new HashMap<>();
  932. map1.put("orderId",orderId);
  933. map1.put("priceId",omsTruckOrderPriceId);
  934. try {
  935. amsFeign.copySteelPrice(map1);
  936. } catch (Exception e) {
  937. e.printStackTrace();
  938. }
  939. //单价的主键
  940. //map1.put("priceId",bmstruckDetailsOrderMapper.selectMaxIdNew());
  941. //map1.put("priceValue",map.get("priceValue"));
  942. //map1.put("placeId",placeId);
  943. //bmstruckDetailsOrderMapper.insertPriceValue(map1);
  944. }
  945. }
  946. return 0;
  947. }
  948. }