AmsContractTruckPriceServiceImpl.java 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758
  1. package com.steerinfo.dil.service.impl;
  2. import com.steerinfo.dil.mapper.AmsContaactPriceMaterialMapper;
  3. import com.steerinfo.dil.mapper.AmsContractTruckPriceMapper;
  4. import com.steerinfo.dil.mapper.RmsLineNodePointMapper;
  5. import com.steerinfo.dil.mapper.RmsReceivePlaceMapper;
  6. import com.steerinfo.dil.model.AmsContaactPriceMaterial;
  7. import com.steerinfo.dil.model.AmsContractTransportPrice;
  8. import com.steerinfo.dil.model.RmsLineNodePoint;
  9. import com.steerinfo.dil.model.RmsReceivePlace;
  10. import com.steerinfo.dil.service.IAmsContractTruckPriceService;
  11. import com.steerinfo.dil.util.DataChange;
  12. import org.apache.commons.lang.math.NumberUtils;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.stereotype.Service;
  15. import org.springframework.transaction.annotation.Transactional;
  16. import java.math.BigDecimal;
  17. import java.text.ParseException;
  18. import java.text.SimpleDateFormat;
  19. import java.util.*;
  20. import java.util.regex.Matcher;
  21. import java.util.regex.Pattern;
  22. /**
  23. * AmsContractTransportPrice服务实现:
  24. * @author generator
  25. * @version 1.0-SNAPSHORT 2021-09-06 07:10
  26. * 类描述
  27. * 修订历史:
  28. * 日期:2021-09-06
  29. * 作者:generator
  30. * 参考:
  31. * 描述:AmsContractTransportPrice服务实现
  32. * @see null
  33. * @Copyright 湖南视拓信息技术股份有限公司. All rights reserved.
  34. */
  35. @Service(value = "amsContractTruckPriceService")
  36. public class AmsContractTruckPriceServiceImpl implements IAmsContractTruckPriceService {
  37. @Autowired
  38. private AmsContractTruckPriceMapper amsContractTruckPriceMapper;
  39. @Autowired
  40. RmsReceivePlaceMapper rmsReceivePlaceMapper;
  41. @Autowired
  42. AmsContaactPriceMaterialMapper amsContaactPriceMaterialMapper;
  43. //@Autowired
  44. //private RmsLineNodePoint rmsLineNodePoint;
  45. @Autowired
  46. private RmsLineNodePointMapper rmsLineNodePointMapper;
  47. /**
  48. * 新增汽运单价
  49. * @Author zzd
  50. * @Date 2022/1/20 11:33
  51. * @param mapValue
  52. * @return
  53. **/
  54. @Transactional
  55. @Override
  56. public int addAmsContractTransportPrice(Map<String,Object> mapValue) {
  57. BigDecimal shipperId = DataChange.dataToBigDecimal(mapValue.get("shipperId"));
  58. BigDecimal carrierId = DataChange.dataToBigDecimal(mapValue.get("carrierId"));
  59. BigDecimal addressId = DataChange.dataToBigDecimal(mapValue.get("addressId"));
  60. BigDecimal lineId = DataChange.dataToBigDecimal(mapValue.get("lineId"));
  61. BigDecimal capacityTypeId = DataChange.dataToBigDecimal(mapValue.get("capacityTypeId"));
  62. BigDecimal formulaId = DataChange.dataToBigDecimal(mapValue.get("formulaId"));
  63. BigDecimal priceValue = DataChange.dataToBigDecimal(mapValue.get("priceValue"));
  64. Date priceDate = new Date((Long)mapValue.get("priceDate"));
  65. BigDecimal type = DataChange.dataToBigDecimal(mapValue.get("type"));
  66. BigDecimal oilpriceBase = DataChange.dataToBigDecimal(mapValue.get("oilpriceBase"));
  67. BigDecimal oilTypeId = DataChange.dataToBigDecimal(mapValue.get("oilTypeId"));
  68. BigDecimal oilpriceChangeThreshold = DataChange.dataToBigDecimal(mapValue.get("oilpriceChangeThreshold"));
  69. AmsContractTransportPrice amsContractTransportPrice = new AmsContractTransportPrice();
  70. String place = (String) mapValue.get("place");
  71. if (place != null && place.length() != 0) {
  72. BigDecimal placeId = rmsReceivePlaceMapper.getPlaceId(mapValue);
  73. if (placeId != null) {
  74. amsContractTransportPrice.setPlaceId(placeId);
  75. }
  76. else {
  77. RmsReceivePlace rmsReceivePlace = new RmsReceivePlace();
  78. rmsReceivePlace.setAddressId(addressId);
  79. rmsReceivePlace.setAddressDeliveryAddress(place);
  80. rmsReceivePlace.setPlaceId(rmsReceivePlaceMapper.selectMaxId());
  81. }
  82. }
  83. amsContractTransportPrice.setType(type);
  84. amsContractTransportPrice.setOilpriceBase(oilpriceBase);
  85. amsContractTransportPrice.setShipperId(shipperId);
  86. amsContractTransportPrice.setOilpriceChangeThreshold(oilpriceChangeThreshold);
  87. amsContractTransportPrice.setOilTypeId(oilTypeId);
  88. amsContractTransportPrice.setPriceValue(priceValue);
  89. amsContractTransportPrice.setPriceDate(priceDate);
  90. amsContractTransportPrice.setCapacityTypeId(capacityTypeId);
  91. amsContractTransportPrice.setCargonameId(formulaId);
  92. amsContractTransportPrice.setCarrierId(carrierId);
  93. //生成主键id
  94. amsContractTransportPrice.setPriceId(amsContractTruckPriceMapper.selectMaxId());
  95. if(lineId == null){
  96. //计算并插入吨公里
  97. BigDecimal priceTonKilometer = calculationPriceTonKilometer(lineId, priceValue);
  98. amsContractTransportPrice.setPriceTonKilometer(priceTonKilometer);
  99. }
  100. amsContractTransportPrice.setType(new BigDecimal(1));
  101. amsContractTransportPrice.setInsertUsername("admin");
  102. amsContractTransportPrice.setInsertTime(new Date());
  103. amsContractTransportPrice.setUpdateUsername("admin");
  104. amsContractTransportPrice.setUpdateTime(new Date());
  105. amsContractTransportPrice.setInsertUpdateRemark("无");
  106. amsContractTransportPrice.setDeleted(new BigDecimal(0));
  107. return amsContractTruckPriceMapper.insertSelective(amsContractTransportPrice);
  108. }
  109. //计算吨公里值
  110. public BigDecimal calculationPriceTonKilometer(BigDecimal lineId,BigDecimal priceValue){
  111. //查询参考运距
  112. BigDecimal linePathLength = amsContractTruckPriceMapper.getLinePathLength(lineId);
  113. //计算吨公里 吨公里(元/吨.km) = 运价(元/吨)/ 参考运距(公里),保留4位小数
  114. BigDecimal priceTonKilometer = priceValue.divide(linePathLength, 4, BigDecimal.ROUND_HALF_UP);
  115. return priceTonKilometer;
  116. }
  117. @Override
  118. public List<Map<String, Object>> getAmsContractTransportPrice(Map<String, Object> map) {
  119. return amsContractTruckPriceMapper.getAmsContractTransportPrice(map);
  120. }
  121. @Override
  122. public int deleteAmsContractTransportPrice(BigDecimal priceId) {
  123. AmsContractTransportPrice amsContractTransportPrice = new AmsContractTransportPrice();
  124. amsContractTransportPrice.setId(priceId);
  125. amsContractTransportPrice.setDeleted(new BigDecimal(1));
  126. return amsContractTruckPriceMapper.updateByPrimaryKeySelective(amsContractTransportPrice);
  127. }
  128. @Override
  129. public List<Map<String, Object>> getCarrierName() {
  130. return amsContractTruckPriceMapper.getCarrierName();
  131. }
  132. @Override
  133. public List<Map<String, Object>> getLineNo() {
  134. return amsContractTruckPriceMapper.getLineNo();
  135. }
  136. @Override
  137. public List<Map<String, Object>> getCapacityNumber() {
  138. return amsContractTruckPriceMapper.getCapacityNumber();
  139. }
  140. @Override
  141. public List<Map<String, Object>> getAddressDeliveryAddress(Map<String,Object> map) {
  142. return amsContractTruckPriceMapper.getAddressDeliveryAddress(map);
  143. }
  144. @Override
  145. public List<Map<String, Object>> selectByPriceId(BigDecimal priceId) {
  146. return amsContractTruckPriceMapper.selectByPriceId(priceId);
  147. }
  148. @Override
  149. public int updateAmsContractTransportPrice(AmsContractTransportPrice amsContractTransportPrice) {
  150. //获取路线Id和运价
  151. BigDecimal lineId = amsContractTransportPrice.getLineId();
  152. BigDecimal priceValue = amsContractTransportPrice.getPriceValue();
  153. //如果传入路线则修改运价
  154. if(lineId != null){
  155. BigDecimal priceId = amsContractTransportPrice.getPriceId();
  156. //获取未修改前的汽运单价信息
  157. AmsContractTransportPrice amsContractTransportPrice1 = amsContractTruckPriceMapper.selectByPrimaryKey(priceId);
  158. //若运价修改了
  159. if(!amsContractTransportPrice.getPriceValue().equals(amsContractTransportPrice1.getPriceValue())){
  160. //计算并插入吨公里
  161. BigDecimal priceTonKilometer = calculationPriceTonKilometer(lineId, priceValue);
  162. amsContractTransportPrice.setPriceTonKilometer(priceTonKilometer);
  163. }
  164. }
  165. amsContractTransportPrice.setUpdateTime(new Date());
  166. return amsContractTruckPriceMapper.updateByPrimaryKeySelective(amsContractTransportPrice);
  167. }
  168. @Override
  169. public List<Map<String, Object>> getOriginAndNowOilPrice() {
  170. return amsContractTruckPriceMapper.getOriginAndNowOilPrice();
  171. }
  172. @Override
  173. public List<Map<String, Object>> getCargoName() {
  174. return amsContractTruckPriceMapper.getCargoName();
  175. }
  176. @Override
  177. public List<Map<String, Object>> getOilTypeName() {
  178. return amsContractTruckPriceMapper.getOilTypeName();
  179. }
  180. /**
  181. * 批量修改运输单价
  182. * @return
  183. */
  184. @Override
  185. @Transactional
  186. public int batchUpdateTransportPriceByOilPrice(Map<String,Object> map){
  187. //正数的判断条件
  188. String flag= (String) map.get("flag");
  189. //运输单价变化的条数
  190. int i = 0;
  191. //获取油品名称ID
  192. BigDecimal oilTypeId = DataChange.dataToBigDecimal(map.get("oilTypeId"));
  193. //获取预执行油价
  194. BigDecimal newOilPrice = DataChange.dataToBigDecimal(map.get("newOilPrice"));
  195. BigDecimal type = new BigDecimal(1);
  196. //根据油品名称ID和非历史油价筛选出符合条件的运价合集
  197. List<Map<String, Object>> PriceValueList = amsContractTruckPriceMapper.getPriceValueList(oilTypeId,type);
  198. for (Map<String, Object> stringObjectMap : PriceValueList) {
  199. stringObjectMap.put("priceDate",map.get("priceDate"));
  200. //获取该条单价的原油价基准
  201. BigDecimal oilpriceBase = DataChange.dataToBigDecimal(stringObjectMap.get("oilpriceBase"));
  202. //获取该条单价的油价变化率阈值
  203. BigDecimal oilpriceChangeThreshold = DataChange.dataToBigDecimal(stringObjectMap.get("oilpriceChangeThreshold"));
  204. //计算油价变化率,公式:n=(当前油价-基数)÷基数×100% (9.06-8.26)/8.26
  205. BigDecimal n = (oilpriceBase.subtract(newOilPrice)).divide(newOilPrice,4,4);
  206. //若油价变化率超过该条单价的油价变化率阈值,修改原单价为历史数据,新增一条单价
  207. if(n.abs().doubleValue()>oilpriceChangeThreshold.doubleValue()){
  208. //加一个判断(如果数据为正数则需要二次判断,如果数据为负数则直接生效)
  209. try{
  210. if(newOilPrice.compareTo(oilpriceBase)==-1){
  211. //直接降低油价
  212. i+=addANewAmsContractTransportPrice(stringObjectMap,n,newOilPrice);
  213. }else if (newOilPrice.compareTo(oilpriceBase)==1 && "1".equals(flag)){
  214. //加上两个判断之后
  215. i+=addANewAmsContractTransportPrice(stringObjectMap,n,newOilPrice);
  216. }
  217. }catch (Exception e){
  218. e.printStackTrace();
  219. }
  220. }
  221. }
  222. return i;
  223. // if(updateOilPrice>0.05||updateOilPrice<-0.05) {
  224. // //逐条修改吨公里数
  225. // for (Map<String, Object> stringObjectMap : priceValueAndPriceTonKilometer) {
  226. // //主键Id
  227. // BigDecimal priceId = (BigDecimal) stringObjectMap.get("priceId");
  228. // //原运价
  229. // BigDecimal priceValue = (BigDecimal) stringObjectMap.get("priceValue");
  230. // //吨公里数
  231. // BigDecimal priceTonKilometer = (BigDecimal) stringObjectMap.get("priceTonKilometer");
  232. // //参考距离,四舍五入,保留两位小数
  233. // BigDecimal distance;
  234. // if (priceTonKilometer.doubleValue() != 0) {
  235. // distance = priceValue.divide(priceTonKilometer, 2, BigDecimal.ROUND_HALF_UP);
  236. // //现运价
  237. // Double nowPriceValue = priceValue.doubleValue() * 0.65 + priceValue.doubleValue() * 0.35 * (1 + updateOilPrice);
  238. // BigDecimal nowPriceValue1 = new BigDecimal(nowPriceValue);
  239. // //新吨公里数
  240. // BigDecimal newPriceTonKilometer = nowPriceValue1.divide(distance, 4, BigDecimal.ROUND_HALF_UP);
  241. // //通过主键修改一条吨公里数
  242. // amsContractTruckPriceMapper.updatePriceTonKilometer(priceId, newPriceTonKilometer);
  243. // }
  244. // return amsContractTruckPriceMapper.batchUpdateTransportPriceByOilPrice(updateOilPrice);
  245. // }
  246. // }
  247. }
  248. /**
  249. * 油价变化率超过该条单价的油价变化率阈值,修改原单价为历史数据,新增一条执行单价
  250. * @param stringObjectMap
  251. * @param n
  252. * @param newOilPrice
  253. * @return
  254. * @throws Exception
  255. */
  256. @Transactional
  257. public int addANewAmsContractTransportPrice(Map<String, Object> stringObjectMap,BigDecimal n,BigDecimal newOilPrice) throws ParseException {
  258. //定义将要改变的执行价
  259. BigDecimal nowPriceValue;
  260. //存储原运输单价实绩对象
  261. AmsContractTransportPrice oldAmsContractTransportPrice = new AmsContractTransportPrice();
  262. //查询货物名称
  263. // String cargonameValue = amsContractTruckPriceMapper.getCargonameValue(new BigDecimal(stringObjectMap.get("cargonameId").toString()));
  264. //获取原主键Id
  265. BigDecimal priceId = (BigDecimal) stringObjectMap.get("priceId");
  266. //修改原单价为历史数据
  267. oldAmsContractTransportPrice.setPriceId(priceId);
  268. oldAmsContractTransportPrice.setDeleted(new BigDecimal(1));
  269. amsContractTruckPriceMapper.updateByPrimaryKeySelective(oldAmsContractTransportPrice);
  270. //获取原单价的所有数据
  271. AmsContractTransportPrice amsContractTransportPrice = amsContractTruckPriceMapper.selectByPrimaryKey(priceId);
  272. //生成主键
  273. BigDecimal i = amsContractTruckPriceMapper.selectMaxId();
  274. amsContractTransportPrice.setPriceId(i);
  275. //生成执行日期
  276. amsContractTransportPrice.setPriceDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse((String) stringObjectMap.get("priceDate")));
  277. //常规字段
  278. amsContractTransportPrice.setInsertUsername("admin");
  279. amsContractTransportPrice.setInsertTime(new Date());
  280. amsContractTransportPrice.setUpdateUsername("admin");
  281. amsContractTransportPrice.setUpdateTime(new Date());
  282. amsContractTransportPrice.setInsertUpdateRemark("无");
  283. //修改现单价为执行数据
  284. amsContractTransportPrice.setDeleted(new BigDecimal(0));
  285. // //若货物名称为焦炭
  286. // if(cargonameValue.equals("焦炭")){
  287. // //现执行价=((63.00+63.00*0.13*n)+(66.50+66.50*0.3*n)+40.00)
  288. // //调用焦炭运价计算公式计算现执行价
  289. // try {
  290. // nowPriceValue = UpdateCokePriceValueByOilPrice(n.toString());
  291. // //保留两位小数
  292. // nowPriceValue = nowPriceValue.divide(new BigDecimal(1),2,4);
  293. // //调整焦炭运价
  294. // amsContractTransportPrice.setPriceValue(nowPriceValue);
  295. // //修改基准油价
  296. // amsContractTransportPrice.setOilpriceBase(newOilPrice);
  297. // } catch (Exception e) {
  298. // e.printStackTrace();
  299. // }
  300. // }
  301. // if(cargonameValue.equals("纯苯")){
  302. // //现执行价=(中标价*0.7)+(中标价*0.3)*(1+n)
  303. // //调用纯苯运价计算公式计算现执行价
  304. // try {
  305. // nowPriceValue = UpdatePureBenzenePriceValueByOilPrice(n.toString(),amsContractTransportPrice.getPriceValue());
  306. // //保留两位小数
  307. // nowPriceValue = nowPriceValue.divide(new BigDecimal(1),2,4);
  308. // //调整纯苯运价
  309. // amsContractTransportPrice.setPriceValue(nowPriceValue);
  310. // //修改基准油价
  311. // amsContractTransportPrice.setOilpriceBase(newOilPrice);
  312. // } catch (Exception e) {
  313. // e.printStackTrace();
  314. // }
  315. // }
  316. // 得到油价联动公式id
  317. //BigDecimal formulaId = DataChange.dataToBigDecimal(stringObjectMap.get("cargonameId"));
  318. //BigDecimal formulaId= (BigDecimal) stringObjectMap.get("cargonameId");
  319. String s= (String) stringObjectMap.get("cargonameId");
  320. BigDecimal formulaId = NumberUtils.createBigDecimal(s.trim());
  321. amsContractTransportPrice.setCargonameId(formulaId);
  322. try {
  323. nowPriceValue = UpdatePureBenzenePriceValueByOilPrice(n.toString(),amsContractTransportPrice.getPriceValue(),formulaId);
  324. //保留两位小数
  325. nowPriceValue = nowPriceValue.divide(new BigDecimal(1),3,0);
  326. //调整纯苯运价
  327. amsContractTransportPrice.setPriceValue(nowPriceValue);
  328. //修改基准油价
  329. amsContractTransportPrice.setOilpriceBase(newOilPrice);
  330. } catch (Exception e) {
  331. e.printStackTrace();
  332. return 0;
  333. }
  334. //新增数据
  335. int insert = amsContractTruckPriceMapper.insert(amsContractTransportPrice);
  336. return insert;
  337. }
  338. /**
  339. * 替换焦炭运价公式并进行计算
  340. * @param n
  341. * @return
  342. * @throws Exception
  343. */
  344. public BigDecimal UpdateCokePriceValueByOilPrice(String n) throws Exception {
  345. // 得到运算公式
  346. String formula_string = null;
  347. // 得到焦炭运价计算公式
  348. formula_string = amsContractTruckPriceMapper.getTruckFormula(new BigDecimal(12));
  349. // 替换焦炭运价计算公式
  350. formula_string = formula_string.replace("油价变动率",n);
  351. String s = toSufExpr(formula_string);
  352. return calSufExpr(s);
  353. }
  354. /**
  355. * 替换运价公式并进行计算
  356. * @param n
  357. * @return
  358. * @throws Exception
  359. */
  360. public BigDecimal UpdatePureBenzenePriceValueByOilPrice(String n,BigDecimal priceValue,BigDecimal formulaId) throws Exception {
  361. // 得到运算公式
  362. String formula_string;
  363. // 得到运价计算公式
  364. formula_string = amsContractTruckPriceMapper.getTruckFormula(formulaId);
  365. if (formula_string.contains("中标价") && formula_string.contains("油价变动率")) {
  366. // 替换纯苯运价计算公式
  367. formula_string = formula_string.replace("中标价", priceValue.toString())
  368. .replace("油价变动率", n);
  369. }
  370. else {
  371. // 替换焦炭
  372. formula_string = formula_string.replace("油价变动率",n);
  373. }
  374. String s = toSufExpr(formula_string);
  375. return calSufExpr(s);
  376. }
  377. /**
  378. * 中缀转换后缀表达式
  379. */
  380. public String toSufExpr(String s) {
  381. StringBuffer sufExpr = new StringBuffer();
  382. Stack<String> stack = new Stack<>();
  383. //压入空方便判断
  384. stack.push(null);
  385. Pattern pattern = Pattern.compile("\\(int\\)|(?<!\\d|[)])-?\\d+(\\.\\d+)?|!=|>=|<=|==|[+\\-*/%()><=|]");
  386. Matcher matcher = pattern.matcher(s);
  387. while (matcher.find()) {
  388. String group = matcher.group();
  389. if (group.matches("!=|>=|<=|==|[+\\-*/%()><=|]|\\(int\\)")) {//是运算符
  390. if (group.equals("(")) {//之间压栈
  391. stack.push(group);
  392. } else if (group.equals(")")) {//等于右括号,一直弹栈,直到遇到左括号
  393. String pop = null;
  394. while (!(pop = stack.pop()).equals("(")) {//遍历循环至左括号
  395. sufExpr.append(pop + " ");
  396. }
  397. } else {//是运算符:加减乘除强转,根据优先级压栈
  398. while (getPriority(group) <= getPriority(stack.peek())) {
  399. String pop = stack.pop();
  400. System.out.println(pop);
  401. System.out.println(sufExpr);
  402. if(pop!=null&&!pop.equals("|")){
  403. sufExpr.append(pop + " ");
  404. }
  405. }
  406. stack.push(group);
  407. }
  408. } else {//是数字
  409. sufExpr.append(group + " ");
  410. }
  411. }
  412. String pop = null;
  413. while (null != (pop = stack.pop())) {
  414. sufExpr.append(pop + " ");
  415. }
  416. return sufExpr.toString();
  417. }
  418. /**
  419. * 设置出栈优先级,(:优先级最低,表示只有遇到)才能出栈
  420. * 当栈顶遇到优先级比自己小或等于的弹栈
  421. */
  422. public Integer getPriority(String c) {
  423. if (c == null) {
  424. return 0;
  425. }
  426. switch (c) {
  427. case "(":
  428. return 1;
  429. case "+":
  430. case "-":
  431. return 2;
  432. case "*":
  433. case "/":
  434. case "%":
  435. return 3;
  436. case ">":
  437. case "<":
  438. case ">=":
  439. case "<=":
  440. case "!=":
  441. case "==":
  442. return 4;
  443. case "|":
  444. return 5;
  445. case "=":
  446. return 6;
  447. case "(int)":
  448. return 7;
  449. }
  450. return 0;
  451. }
  452. /**
  453. * 计算值
  454. */
  455. public BigDecimal cal(BigDecimal a1, BigDecimal a2, String operator) throws Exception {
  456. switch (operator){
  457. case "+":return a1.add(a2);
  458. case "-":return a1.subtract(a2);
  459. case "*":return a1.multiply(a2);
  460. case "/":return a1.divide(a2,3,BigDecimal.ROUND_CEILING);
  461. case "%":return a1.divideAndRemainder(a2)[1];
  462. default:
  463. break;
  464. }
  465. throw new Exception("非法运算符");
  466. }
  467. public Boolean calBoolean(BigDecimal a1, BigDecimal a2, String operator) throws Exception {
  468. switch (operator){
  469. case ">":return a1.compareTo(a2) == 1;
  470. case "<":return a1.compareTo(a2) == -1;
  471. case ">=":return a1.compareTo(a2) > -1;
  472. case "<=":return a1.compareTo(a2) < 1;
  473. case "!=":return a1.compareTo(a2) != 0;
  474. case "==":return a1.compareTo(a2) == 0;
  475. default:
  476. break;
  477. }
  478. throw new Exception("非法运算符");
  479. }
  480. /**
  481. * 计算后缀表达式
  482. */
  483. public BigDecimal calSufExpr(String sufExpr) throws Exception {
  484. Stack<BigDecimal> stack = new Stack<>();
  485. Pattern pattern=Pattern.compile("\\(int\\)|-?\\d+(\\.\\d+)?|!=|>=|<=|==|[+\\-*/%><=]");//提取运算符和数字
  486. Matcher matcher = pattern.matcher(sufExpr);
  487. BigDecimal result=new BigDecimal("0.0");
  488. while (matcher.find()){
  489. String group = matcher.group();
  490. if(group.matches("[+\\-*/%]")){
  491. BigDecimal a1 =stack.pop();
  492. BigDecimal a2 =stack.pop();
  493. result = cal(a2, a1, group);
  494. stack.push(result);
  495. }
  496. else if(group.equals("(int)")){
  497. BigDecimal pop = stack.pop();
  498. BigDecimal bigDecimal = pop.setScale(0, BigDecimal.ROUND_DOWN);
  499. stack.push(bigDecimal);
  500. }
  501. else if(group.matches("!=|>=|<=|==|[><]")){
  502. BigDecimal a1 =stack.pop();
  503. BigDecimal a2 =stack.pop();
  504. stack.push(calBoolean(a2,a1,group)?new BigDecimal(1):new BigDecimal(0));
  505. }
  506. else if(group.equals("=")){
  507. BigDecimal a1 =stack.pop();
  508. BigDecimal a2 =stack.pop();
  509. if (a2.compareTo(new BigDecimal(1))==0) {
  510. stack.push(a1);
  511. }
  512. }
  513. else {//为数字直接压栈
  514. stack.push(new BigDecimal(group));
  515. }
  516. }
  517. return result;
  518. }
  519. /**
  520. * 边输边查具体地址
  521. * @param map
  522. * @return
  523. */
  524. @Override
  525. public List<Map<String, Object>> getRealAddressByLike(Map<String, Object> map) {
  526. return amsContractTruckPriceMapper.getRealAddressByLike(map);
  527. }
  528. @Override
  529. public int insertInwardPrice(Map<String, Object> mapValue) {
  530. int i = 0;
  531. BigDecimal capacityTypeId = DataChange.dataToBigDecimal(mapValue.get("capacityTypeId"));
  532. BigDecimal lineId = DataChange.dataToBigDecimal(mapValue.get("rangeId"));
  533. BigDecimal formulaId = DataChange.dataToBigDecimal(mapValue.get("formulaId"));
  534. BigDecimal priceValue = DataChange.dataToBigDecimal(mapValue.get("priceValue"));
  535. Date priceDate = new Date((Long)mapValue.get("priceDate"));
  536. BigDecimal type = DataChange.dataToBigDecimal(mapValue.get("type"));
  537. BigDecimal oilpriceBase = DataChange.dataToBigDecimal(mapValue.get("oilpriceBase"));
  538. BigDecimal oilTypeId = DataChange.dataToBigDecimal(mapValue.get("oilTypeId"));
  539. BigDecimal oilpriceChangeThreshold = DataChange.dataToBigDecimal(mapValue.get("oilpriceChangeThreshold"));
  540. List<Map<String,Object>>mapList = (List<Map<String, Object>>) mapValue.get("mapList");
  541. AmsContractTransportPrice amsContractTransportPrice = new AmsContractTransportPrice();
  542. amsContractTransportPrice.setType(type);
  543. amsContractTransportPrice.setOilpriceBase(oilpriceBase);
  544. //承运起止点ID
  545. amsContractTransportPrice.setLineId(lineId);
  546. amsContractTransportPrice.setOilpriceChangeThreshold(oilpriceChangeThreshold);
  547. amsContractTransportPrice.setOilTypeId(oilTypeId);
  548. amsContractTransportPrice.setPriceValue(priceValue);
  549. amsContractTransportPrice.setPriceDate(priceDate);
  550. amsContractTransportPrice.setCapacityTypeId(capacityTypeId);
  551. amsContractTransportPrice.setCargonameId(formulaId);
  552. //生成主键id
  553. amsContractTransportPrice.setPriceId(amsContractTruckPriceMapper.selectMaxId());
  554. amsContractTransportPrice.setInsertUsername("admin");
  555. amsContractTransportPrice.setInsertTime(new Date());
  556. amsContractTransportPrice.setUpdateUsername("admin");
  557. amsContractTransportPrice.setUpdateTime(new Date());
  558. amsContractTransportPrice.setInsertUpdateRemark("无");
  559. amsContractTransportPrice.setDeleted(new BigDecimal(0));
  560. i = amsContractTruckPriceMapper.insertSelective(amsContractTransportPrice);
  561. for (Map<String,Object>map:mapList
  562. ) {
  563. map.get("materialId");
  564. AmsContaactPriceMaterial amsContaactPriceMaterial = new AmsContaactPriceMaterial();
  565. //设置最大主键ID
  566. amsContaactPriceMaterial.setId(amsContractTruckPriceMapper.selectPriceMaterialMaxId());
  567. amsContaactPriceMaterial.setMaterialId(DataChange.dataToBigDecimal(map.get("materialId")));
  568. amsContaactPriceMaterial.setPriceId(amsContractTransportPrice.getPriceId());
  569. amsContaactPriceMaterial.setDeleted(new BigDecimal(0));
  570. i = amsContaactPriceMaterialMapper.insertSelective(amsContaactPriceMaterial);
  571. }
  572. return i;
  573. }
  574. @Override
  575. public List<Map<String, Object>> getInwardContractPrice(Map<String, Object> mapValue) {
  576. String material="";
  577. // if (mapValue.get("materialNames")!=null && mapValue.get("materialNames").toString().contains("、")) {
  578. // material= mapValue.get("materialNames").toString();
  579. // mapValue.put("materialNames",null);
  580. // }
  581. List<Map<String,Object>>mapList = amsContractTruckPriceMapper.getInwardContractPrice(mapValue);
  582. for (Map<String,Object>map:mapList
  583. ) {
  584. List<Map<String,Object>> materialList = amsContaactPriceMaterialMapper.getMaterialName(map);
  585. String materialNames = "";
  586. int i = 1;
  587. for (Map<String,Object>materialMap:materialList
  588. ) {
  589. if(i==materialList.size()){
  590. materialNames = materialNames + materialMap.get("materialName") ;
  591. }
  592. else{
  593. materialNames = materialNames + materialMap.get("materialName") + "、";
  594. }
  595. i++;
  596. }
  597. map.put("materialNames",materialNames);
  598. if(((BigDecimal)map.get("type")).intValue() == 2){
  599. map.put("type","元/吨");
  600. }else if(((BigDecimal)map.get("type")).intValue() == 5){
  601. map.put("type","元/小时");
  602. }else if(((BigDecimal)map.get("type")).intValue() == 6){
  603. map.put("type","元/趟");
  604. }
  605. // if (material!=null &&
  606. // material.contains("、") &&
  607. // material.equals(materialNames)) {
  608. // List<Map<String, Object>> newMapList=new ArrayList<>();
  609. // newMapList.add(map);
  610. // return newMapList;
  611. // }
  612. }
  613. return mapList;
  614. }
  615. @Override
  616. public List<Map<String, Object>> selectInwardPrice(Map<String, Object> mapvalue) {
  617. return amsContractTruckPriceMapper.selectInwardPrice(mapvalue);
  618. }
  619. @Override
  620. public List<Map<String, Object>> getRangePoint(Map<String, Object> mapValue) {
  621. return amsContractTruckPriceMapper.getRangePoint(mapValue);
  622. }
  623. @Override
  624. public int insertLineNodePoint(Map<String, Object> map) {
  625. RmsLineNodePoint rmsLineNodePoint = new RmsLineNodePoint();
  626. BigDecimal rangeId = DataChange.dataToBigDecimal(map.get("rangeId"));
  627. String loadName = (String)map.get("loadPointName");
  628. String unloadName = (String)map.get("unloadPointName");
  629. rmsLineNodePoint.setId(rmsLineNodePointMapper.lineMaxId());
  630. rmsLineNodePoint.setTransRangeId(rangeId);
  631. rmsLineNodePoint.setLoadPointName(loadName);
  632. rmsLineNodePoint.setUnloadPointName(unloadName);
  633. rmsLineNodePoint.setDeleted(new BigDecimal(0));
  634. int i = rmsLineNodePointMapper.insertSelective(rmsLineNodePoint);
  635. return i;
  636. }
  637. @Override
  638. public int updatePriceById(Map<String, Object> map) {
  639. int count = 0;
  640. //获取单价ID
  641. BigDecimal priceId = DataChange.dataToBigDecimal(map.get("priceId"));
  642. //获取物资详ID
  643. List<Map<String, Object>> materialTypeList = (List<Map<String,Object>>)map.get("materialTypeList");
  644. for (Map<String,Object> materialTypeMap:materialTypeList){
  645. }
  646. return count;
  647. }
  648. @Override
  649. public int updatePriceByPriceId(Map<String, Object> mapValue){
  650. int i = 0;
  651. BigDecimal capacityTypeId = DataChange.dataToBigDecimal(mapValue.get("capacityTypeId"));
  652. BigDecimal lineId = DataChange.dataToBigDecimal(mapValue.get("rangeId"));
  653. BigDecimal formulaId = DataChange.dataToBigDecimal(mapValue.get("cargonameId"));
  654. BigDecimal priceValue = DataChange.dataToBigDecimal(mapValue.get("priceValue"));
  655. Date priceDate = new Date((Long)mapValue.get("priceDate"));
  656. BigDecimal type = DataChange.dataToBigDecimal(mapValue.get("type"));
  657. BigDecimal oilpriceBase = DataChange.dataToBigDecimal(mapValue.get("oilpriceBase"));
  658. // BigDecimal oilTypeId = DataChange.dataToBigDecimal(mapValue.get("oilTypeId"));
  659. BigDecimal oilpriceChangeThreshold = DataChange.dataToBigDecimal(mapValue.get("oilpriceChangeThreshold"));
  660. List<Map<String,Object>>mapList = (List<Map<String, Object>>) mapValue.get("mapList");
  661. BigDecimal priceId=DataChange.dataToBigDecimal(mapValue.get("priceId"));
  662. AmsContractTransportPrice amsContractTransportPrice = new AmsContractTransportPrice();
  663. amsContractTransportPrice.setOilpriceBase(oilpriceBase);
  664. // amsContractTransportPrice.setOilTypeId(oilTypeId); 油品名称
  665. amsContractTransportPrice.setPriceValue(priceValue);
  666. amsContractTransportPrice.setPriceDate(priceDate);
  667. amsContractTransportPrice.setCargonameId(formulaId);
  668. amsContractTransportPrice.setPriceId(priceId);
  669. amsContractTransportPrice.setUpdateTime(new Date());
  670. i = amsContractTruckPriceMapper.updateByPrimaryKeySelective(amsContractTransportPrice);
  671. // 根据priceId先查询之前是否有物资
  672. // 如果有,但是接受的没有就删除
  673. List<Map<String, Object>> selectwz = amsContractTruckPriceMapper.selectwz(mapValue);
  674. if (!selectwz.isEmpty() && mapList.isEmpty()){
  675. i = amsContaactPriceMaterialMapper.deletePriceByPriceId(mapValue.get("priceId").toString());
  676. }
  677. //把之前的全删了,然后新增
  678. if (mapList!=null && mapList.size()>0) {
  679. i = amsContaactPriceMaterialMapper.deletePriceByPriceId(mapValue.get("priceId").toString());
  680. }
  681. for (Map<String,Object>map:mapList
  682. ) {
  683. //新增
  684. AmsContaactPriceMaterial amsContaactPriceMaterial = new AmsContaactPriceMaterial();
  685. //设置最大主键ID
  686. amsContaactPriceMaterial.setId(amsContractTruckPriceMapper.selectPriceMaterialMaxId());
  687. amsContaactPriceMaterial.setMaterialId(DataChange.dataToBigDecimal(map.get("materialId")));
  688. amsContaactPriceMaterial.setPriceId(amsContractTransportPrice.getPriceId());
  689. amsContaactPriceMaterial.setDeleted(new BigDecimal(0));
  690. i = amsContaactPriceMaterialMapper.insertSelective(amsContaactPriceMaterial);
  691. }
  692. return i;
  693. }
  694. @Override
  695. public List<Map<String, Object>> getwz(Map<String, Object> map){
  696. List<Map<String, Object>> selectwz = amsContractTruckPriceMapper.selectwz(map);
  697. return selectwz;
  698. }
  699. @Override
  700. public Map<String, Object> getcargonameId(Map<String, Object> map) {
  701. Map<String, Object> value = amsContractTruckPriceMapper.getcargonameId(map);
  702. return value;
  703. }
  704. @Override
  705. public int updateDCodd() {
  706. return amsContractTruckPriceMapper.updateDCodd();
  707. }
  708. @Override
  709. public int updateDCnew() {
  710. return amsContractTruckPriceMapper.updateDCnew();
  711. }
  712. }