BmstruckDetailsOrderServiceImpl.java 57 KB

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