BmstruckDetailsOrderServiceImpl.java 33 KB

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