PayOrderController.java 73 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081
  1. package com.platform.yijia.controller;
  2. import com.google.gson.Gson;
  3. import com.platform.yijia.config.YiJiaRequest;
  4. import com.platform.yijia.dao.PayOrderMapper;
  5. import com.platform.yijia.param.request.PayOrderRequest;
  6. import com.platform.yijia.pojo.*;
  7. import com.platform.yijia.service.*;
  8. import com.platform.yijia.utils.CodeMsg;
  9. import com.platform.yijia.utils.ResultData;
  10. import org.apache.commons.lang3.StringUtils;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.stereotype.Controller;
  14. import org.springframework.transaction.annotation.Transactional;
  15. import org.springframework.web.bind.annotation.*;
  16. import javax.annotation.Resource;
  17. import java.math.BigDecimal;
  18. import java.sql.Timestamp;
  19. import java.util.*;
  20. @Controller
  21. @YiJiaRequest()
  22. public class PayOrderController {
  23. private static Logger logger =(Logger) LoggerFactory.getLogger(PayOrderController.class);
  24. @Resource
  25. private PayOrderService payOrderService;
  26. @Resource
  27. private AppUserInfoService appUserInfoService;
  28. @Resource
  29. private StationService stationService;
  30. @Resource
  31. private CustomerGradeServices customerGradeServices;
  32. @Resource
  33. private PayOrderMapper payOrderMapper;
  34. @Resource
  35. private ElectronicMembershipCardService electronicMembershipCardService;
  36. @Resource
  37. private CustomerManagerService customerManagerService;
  38. @Resource
  39. private SysDictDataService sysDictDataService;
  40. //小程序支付生成订单
  41. @RequestMapping(value = "/AddPayOrderInfoNew", consumes = "application/json", method = RequestMethod.POST)
  42. @ResponseBody
  43. @Transactional
  44. public String AddPayOrderInfoNew(@RequestBody PayOrderRequest payOrderRequest){
  45. logger.info("获取订单前端传来参数openId:"+ payOrderRequest.getOpenId());
  46. Gson gson =new Gson();
  47. ResultData resultData =null;
  48. AppUserInfo appUserInfo =new AppUserInfo(); //查询客户信息传递参数
  49. PayOrder payOrder = new PayOrder(); //生成订单参数
  50. if(StringUtils.isNotBlank(payOrderRequest.getUserType()) && StringUtils.isNotBlank(payOrderRequest.getOpenId()) && StringUtils.isNotBlank(payOrderRequest.getOilName()) &&
  51. StringUtils.isNotBlank(payOrderRequest.getOilGun()) && payOrderRequest.getReceivableAmt() !=null && StringUtils.isNotBlank(payOrderRequest.getOrderType())){
  52. appUserInfo.setUserType(payOrderRequest.getUserType());
  53. switch (payOrderRequest.getUserType()){
  54. case "1": //小程序
  55. appUserInfo.setMinaOpenid(payOrderRequest.getOpenId());
  56. break;
  57. case "2": //支付宝公众号
  58. appUserInfo.setALiId(payOrderRequest.getOpenId());
  59. break;
  60. }
  61. AppUserInfo appUserInfos = appUserInfoService.getAppUserInfo(appUserInfo);
  62. Map<String ,Object> resultMap = new HashMap<>(); //返回结果集
  63. if(appUserInfos !=null){
  64. payOrderRequest.setCustomerPhone(appUserInfos.getMobilePhone()); //客户手机号; 注:此处存放手机号用于获取客户信息参数查询
  65. payOrderRequest.setUnionId(appUserInfos.getUnionId()); //客户UnionId;注:此处存放unionId用于获取客户电子卡参数查询
  66. payOrder.setConsumer(appUserInfos.getBlogNickName()); //昵称
  67. payOrder.setConsumerId(appUserInfos.getUserId()); //用户id
  68. Random random = new Random();
  69. String result="";
  70. for(int i=0;i<6;i++){
  71. result+=random.nextInt(10);
  72. }
  73. String ordNo=System.nanoTime()+result;
  74. payOrder.setOrderNo(ordNo); //订单号
  75. logger.info("生成的订单号:" + ordNo);
  76. payOrder.setDiscountCouponAmt(payOrderRequest.getDiscountCouponAmt()); //优惠劵金额
  77. payOrder.setDiscountCoupon(payOrderRequest.getDiscountCoupon()); //优惠券
  78. payOrder.setCarNo(payOrderRequest.getCarNo()); //车牌号、
  79. payOrder.setCustomerGrade(payOrderRequest.getCustomerGrade()); //客户电话
  80. payOrder.setMemberNo(payOrderRequest.getMemberNo()); //会员卡号
  81. payOrder.setMemberAmt(payOrderRequest.getMemberAmt()); //会员支付金额
  82. payOrder.setScore(payOrderRequest.getScore()); //积分
  83. payOrder.setStationId(payOrderRequest.getStationId()); //油站id
  84. payOrder.setStatus("0"); //创建订单 未支付状态 0
  85. payOrder.setCreatedDate(new Timestamp(new Date().getTime())); //创建时间
  86. payOrder.setOrderType(payOrderRequest.getOrderType()); //订单类型
  87. payOrder.setOilGun(payOrderRequest.getOilGun()); //油枪号
  88. payOrder.setReceivableAmt(payOrderRequest.getReceivableAmt()); //订单应收金额
  89. String oilName =payOrderRequest.getOilName();
  90. //获取该油品所属哪一类
  91. Oil oil = new Oil();
  92. oil.setOilName(oilName);
  93. Oil oilInfo = sysDictDataService.selectOilType(oil);
  94. payOrder.setOilType(oilInfo.getOilsType()); //油品类型
  95. payOrderRequest.setCardOilsType(oilInfo.getOilsType()); //电子卡类型;注:用于获取客户电子卡参数查询
  96. payOrder.setOilName(oilName); //油品名称
  97. StationInfo stationInfo = new StationInfo();
  98. stationInfo.setStationId(payOrderRequest.getStationId());
  99. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  100. if(stationInfos !=null){
  101. payOrder.setStationName(stationInfos.getStationName());
  102. //获取油站图片和名称
  103. resultMap.put("stationPic", stationInfos.getStationPic());
  104. resultMap.put("stationName", stationInfos.getStationName());
  105. }
  106. //根据油站和油枪获取加油员
  107. HashMap<String, Object> params = new HashMap<>();
  108. params.put("oliGunNo", payOrderRequest.getOilGun());
  109. params.put("stationId", payOrderRequest.getStationId());
  110. List<Map> mapResultList = payOrderMapper.selectPersonelName(params); //使用list原因:一个枪号对应多个加油员场景
  111. logger.info("加油员信息:"+ mapResultList.toString());
  112. if(mapResultList != null && mapResultList.size() > 0){
  113. String oilPersonnel = "";
  114. for (Map per : mapResultList){
  115. if(per.containsKey("personelName") && per.get("personelName").toString() !=null && per.get("personelName").toString() !=""){
  116. oilPersonnel += per.get("personelName").toString() +",";
  117. }
  118. }
  119. if(oilPersonnel !=""){
  120. payOrder.setOilPersonnel(oilPersonnel.substring(0, oilPersonnel.length()-1)); //加油员
  121. }
  122. }else {
  123. payOrder.setOilPersonnel("");
  124. }
  125. String orderType = payOrderRequest.getOrderType(); //获取订单类型
  126. logger.info("订单类型:" + orderType);
  127. if(orderType.equals("1")){ //订单类型是油品时计算
  128. PayOrderResultInfo payOrderResultInfo = this.calculateAmt(payOrderRequest); //计算订单金额 价格 加油升数 等等
  129. payOrder.setOilPirce(payOrderResultInfo.getOilPrice());
  130. payOrder.setOrderLiters(payOrderResultInfo.getOilLiters());
  131. payOrder.setDiscountAmt(Double.valueOf(payOrderResultInfo.getDiscountAmt()));
  132. payOrder.setAmt(Double.valueOf(payOrderResultInfo.getAmt()));
  133. resultMap.put("discountAmt", payOrderResultInfo.getDiscountAmt()); //优惠价格
  134. resultMap.put("amt", payOrderResultInfo.getAmt()); //实收价格
  135. resultMap.put("receivableAmt", payOrderResultInfo.getReceivableAmt()); //应收价格
  136. resultMap.put("oilLiters", payOrderResultInfo.getOilLiters());
  137. resultMap.put("discountPrice", payOrderResultInfo.getDiscountPrice());
  138. resultMap.put("amt_dzk", payOrderResultInfo.getDzkAmt());
  139. resultMap.put("balance", payOrderResultInfo.getBalance()); //电子卡余额
  140. resultMap.put("cardOilsType", payOrderResultInfo.getCardOilsType()); //电子卡类型1.汽油; 2.柴油
  141. resultMap.put("ordNo", ordNo);
  142. logger.info("返回前端的结果:" +resultMap.toString());
  143. payOrderMapper.insertSelective(payOrder);
  144. }else {
  145. payOrder.setAmt(Double.valueOf(payOrderRequest.getReceivableAmt())); //非油品金额
  146. payOrder.setDiscountAmt(Double.valueOf(0)); //优惠金额
  147. payOrder.setOilPirce(payOrderRequest.getReceivableAmt().toString()); //非油品价格
  148. payOrder.setOrderLiters("0");
  149. resultMap.put("discountAmt", "0"); //优惠价格
  150. resultMap.put("amt", payOrderRequest.getReceivableAmt()); //实收价格
  151. resultMap.put("receivableAmt", payOrderRequest.getReceivableAmt()); //应收价格
  152. resultMap.put("oilLiters", "0");
  153. resultMap.put("discountPrice", "0");
  154. resultMap.put("ordNo", ordNo);
  155. payOrderMapper.insertSelective(payOrder);
  156. }
  157. resultData = ResultData.success(resultMap);
  158. }else {
  159. //登录人验证失败
  160. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  161. }
  162. }else {
  163. resultData = ResultData.error(CodeMsg.REQUEST_FAIL);
  164. }
  165. return gson.toJson(resultData);
  166. }
  167. //根据营销方案计算订单金额
  168. public PayOrderResultInfo calculateAmt(PayOrderRequest payOrderRequest){
  169. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  170. Integer stationId = payOrderRequest.getStationId(); //油站ID
  171. BigDecimal receivableAmt = new BigDecimal(payOrderRequest.getReceivableAmt()); //应收金额 用户输入的金额
  172. String oilName = payOrderRequest.getOilName(); //油品名称
  173. String openId = payOrderRequest.getOpenId(); //用户的openId
  174. Map<String, Object> map = new HashMap<>();
  175. map.put("oilName", oilName);
  176. map.put("stationId", stationId);
  177. Map<String, Object> result = stationService.selectStationOilPriceAndDiscountSetting(map);
  178. String oilPrice = result.get("oilPrice").toString();
  179. String discountSetting = result.get("discountSetting").toString();
  180. String cardEnabledFlag = result.get("cardEnabledFlag").toString();
  181. Map<String ,Object> params = new HashMap<String, Object>();
  182. params.put("stationId", stationId);
  183. params.put("oilName", oilName);
  184. params.put("receivableAmt", receivableAmt);
  185. params.put("oilPrice", oilPrice);
  186. params.put("mobilePhone", payOrderRequest.getCustomerPhone());
  187. params.put("minaOpenid", openId);
  188. params.put("cardEnabledFlag", cardEnabledFlag);
  189. params.put("unionId", payOrderRequest.getUnionId());
  190. params.put("cardOilsType", payOrderRequest.getCardOilsType());
  191. switch (discountSetting){
  192. case "0": //不执营销方案时 计算等级优惠
  193. payOrderResultInfo = this.calculateGradeDiscount(params);
  194. break;
  195. case "1": //满减方案
  196. payOrderResultInfo = this.calculateManJianDiscount(params);
  197. break;
  198. case "2": //立减方案
  199. payOrderResultInfo = this.calculateLiJianDiscount(params);
  200. break;
  201. case "3": //独立直降
  202. payOrderResultInfo = this.calculateZhiJiangDiscount(params);
  203. break;
  204. }
  205. return payOrderResultInfo;
  206. }
  207. //计算直降
  208. public PayOrderResultInfo calculateZhiJiangDiscount(Map<String ,Object> params){
  209. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  210. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  211. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  212. BigDecimal discountAmt = new BigDecimal(0); //优惠金额
  213. BigDecimal amt = new BigDecimal(0);
  214. BigDecimal discountPrice = oilPrice;
  215. BigDecimal gradeDiscountAmt = new BigDecimal(0); //等级优惠金额
  216. //加油升数
  217. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  218. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  219. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  220. }
  221. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  222. params.put("discountPlanType", "3");
  223. List<Map> customerMarkertPlanList = customerGradeServices.getCustomerMarkertPlanList(params);
  224. if(customerMarkertPlanList !=null && customerMarkertPlanList.size() >0){
  225. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("discountAmt").toString()); //条件金额
  226. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("gasoilDiscountAmt").toString());
  227. String discountTerm = customerMarkertPlanList.get(0).get("discountTerm").toString();
  228. switch (discountTerm){
  229. case "1": //按加油升数
  230. if(oilLiters.compareTo(discountAmt_b) ==1 || oilLiters.compareTo(discountAmt_b) ==0){
  231. discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  232. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  233. }
  234. break;
  235. case "2": //按加油金额
  236. if(receivableAmt.compareTo(discountAmt_b) ==1 || receivableAmt.compareTo(discountAmt_b) ==0){
  237. discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  238. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  239. }
  240. break;
  241. }
  242. String vipDiscountyPlus = customerMarkertPlanList.get(0).get("vipDiscountyPlus").toString();
  243. if(vipDiscountyPlus.equals("1")){
  244. PayOrderResultInfo payOrderResultInfoGrade = this.calculateGradeDiscount(params);
  245. discountAmt = discountAmt.add(new BigDecimal(payOrderResultInfoGrade.getDiscountAmt()));
  246. }
  247. }
  248. amt = receivableAmt.subtract(discountAmt); //应收金额
  249. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  250. payOrderResultInfo.setAmt(amt.toString());
  251. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  252. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  253. payOrderResultInfo.setOilLiters(oilLiters.toString());
  254. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  255. payOrderResultInfo.setOilPrice(oilPrice.toString());
  256. payOrderResultInfo.setDzkAmt(amt.toString());
  257. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  258. if(params.get("cardEnabledFlag").toString().equals("1")){
  259. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  260. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  261. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  262. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  263. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting(); //是否叠加等级方案
  264. String isMarket = cardRechargeSettingList.get(0).getIsMarket(); //等候否叠加营销方案
  265. if(isMarket.equals("1")){
  266. if(isGradeSetting.equals("1")){
  267. payOrderResultInfo.setDzkAmt(amt.toString());
  268. }else {
  269. //如果电子卡设置执行营销方案不执行等级优惠 则 电子卡支付金额 =实收金额+等级优惠金额
  270. BigDecimal subtract = amt.add(gradeDiscountAmt);
  271. payOrderResultInfo.setDzkAmt(subtract.toString());
  272. }
  273. }else {
  274. if(isGradeSetting.equals("1")){
  275. //如果电子卡设置不执行营销方案执行等级优惠 则 电子卡支付金额 =应收金额-等级优惠金额
  276. BigDecimal subtract = receivableAmt.subtract(gradeDiscountAmt);
  277. payOrderResultInfo.setDzkAmt(subtract.toString());
  278. }else {
  279. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  280. }
  281. }
  282. }
  283. //查询客户余额和卡的类型
  284. Map<String, String> map = this.selectCardBalance(Integer.valueOf(params.get("stationId").toString()), params.get("cardOilsType").toString(), params.get("unionId").toString());
  285. payOrderResultInfo.setBalance(map.get("balance"));
  286. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  287. }
  288. return payOrderResultInfo;
  289. }
  290. //计算立减
  291. public PayOrderResultInfo calculateLiJianDiscount(Map<String ,Object> params){
  292. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  293. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  294. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  295. BigDecimal discountAmt = new BigDecimal(0); //优惠金额
  296. BigDecimal amt = new BigDecimal(0);
  297. BigDecimal discountPrice = oilPrice;
  298. BigDecimal gradeDiscountAmt = new BigDecimal(0); //等级优惠金额
  299. //加油升数
  300. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  301. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  302. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  303. }
  304. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  305. params.put("discountPlanType", "2");
  306. List<Map> customerMarkertPlanList = customerGradeServices.getCustomerMarkertPlanList(params);
  307. if(customerMarkertPlanList !=null && customerMarkertPlanList.size() >0){
  308. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("discountAmt").toString()); //条件金额
  309. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("gasoilDiscountAmt").toString()); //享受的优惠
  310. if(receivableAmt.compareTo(discountAmt_b) == 1 || receivableAmt.compareTo(discountAmt_b) == 0){
  311. discountAmt = gasoilDiscountAmt_b;
  312. }
  313. String vipDiscountyPlus = customerMarkertPlanList.get(0).get("vipDiscountyPlus").toString();
  314. if(vipDiscountyPlus.equals("1")){
  315. PayOrderResultInfo payOrderResultInfoGrade = this.calculateGradeDiscount(params);
  316. gradeDiscountAmt = new BigDecimal(payOrderResultInfoGrade.getDiscountAmt());
  317. discountAmt = discountAmt.add(gradeDiscountAmt);
  318. }
  319. }
  320. amt = receivableAmt.subtract(discountAmt); //应收金额
  321. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  322. payOrderResultInfo.setAmt(amt.toString());
  323. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  324. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  325. payOrderResultInfo.setOilLiters(oilLiters.toString());
  326. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  327. payOrderResultInfo.setOilPrice(oilPrice.toString());
  328. payOrderResultInfo.setDzkAmt(amt.toString());
  329. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  330. if(params.get("cardEnabledFlag").toString().equals("1")){
  331. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  332. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  333. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  334. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  335. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting(); //是否叠加等级方案
  336. String isMarket = cardRechargeSettingList.get(0).getIsMarket(); //等候否叠加营销方案
  337. if(isMarket.equals("1")){
  338. if(isGradeSetting.equals("1")){
  339. payOrderResultInfo.setDzkAmt(amt.toString());
  340. }else {
  341. //如果电子卡设置执行营销方案不执行等级优惠 则 电子卡支付金额 =实收金额+等级优惠金额
  342. BigDecimal subtract = amt.add(gradeDiscountAmt);
  343. payOrderResultInfo.setDzkAmt(subtract.toString());
  344. }
  345. }else {
  346. if(isGradeSetting.equals("1")){
  347. //如果电子卡设置不执行营销方案执行等级优惠 则 电子卡支付金额 =应收金额-等级优惠金额
  348. BigDecimal subtract = receivableAmt.subtract(gradeDiscountAmt);
  349. payOrderResultInfo.setDzkAmt(subtract.toString());
  350. }else {
  351. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  352. }
  353. }
  354. }
  355. //查询客户余额和卡的类型
  356. Map<String, String> map = this.selectCardBalance(Integer.valueOf(params.get("stationId").toString()), params.get("cardOilsType").toString(), params.get("unionId").toString());
  357. payOrderResultInfo.setBalance(map.get("balance"));
  358. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  359. }
  360. return payOrderResultInfo;
  361. }
  362. //计算满减
  363. public PayOrderResultInfo calculateManJianDiscount(Map<String ,Object> params){
  364. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  365. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  366. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  367. BigDecimal discountAmt = new BigDecimal(0); //优惠金额
  368. BigDecimal amt = new BigDecimal(0);
  369. BigDecimal discountPrice = oilPrice;
  370. BigDecimal gradeDiscountAmt = new BigDecimal(0); //等级优惠金额
  371. //加油升数
  372. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  373. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  374. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  375. }
  376. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  377. params.put("discountPlanType", "1");
  378. List<Map> customerMarkertPlanList = customerGradeServices.getCustomerMarkertPlanList(params);
  379. if(customerMarkertPlanList !=null && customerMarkertPlanList.size() >0){
  380. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("discountAmt").toString()); //条件金额
  381. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("gasoilDiscountAmt").toString()); //享受的优惠
  382. if(receivableAmt.compareTo(discountAmt_b) == 1 || receivableAmt.compareTo(discountAmt_b) == 0){
  383. discountAmt = receivableAmt.divide(discountAmt_b, 2, BigDecimal.ROUND_HALF_UP).multiply(gasoilDiscountAmt_b); //优惠金额
  384. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  385. }
  386. //是否共享会员等级优惠叠加: 1 代表是; 2 代表否;
  387. String vipDiscountyPlus = customerMarkertPlanList.get(0).get("vipDiscountyPlus").toString();
  388. if(vipDiscountyPlus.equals("1")){
  389. PayOrderResultInfo payOrderResultInfoGrade = this.calculateGradeDiscount(params);
  390. discountAmt = discountAmt.add(new BigDecimal(payOrderResultInfoGrade.getDiscountAmt()));
  391. }
  392. }
  393. amt = receivableAmt.subtract(discountAmt); //应收金额
  394. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  395. payOrderResultInfo.setAmt(amt.toString());
  396. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  397. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  398. payOrderResultInfo.setOilLiters(oilLiters.toString());
  399. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  400. payOrderResultInfo.setOilPrice(oilPrice.toString());
  401. payOrderResultInfo.setDzkAmt(amt.toString());
  402. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  403. if(params.get("cardEnabledFlag").toString().equals("1")){
  404. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  405. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  406. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  407. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  408. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting(); //是否叠加等级方案
  409. String isMarket = cardRechargeSettingList.get(0).getIsMarket(); //等候否叠加营销方案
  410. if(isMarket.equals("1")){
  411. if(isGradeSetting.equals("1")){
  412. payOrderResultInfo.setDzkAmt(amt.toString());
  413. }else {
  414. //如果电子卡设置执行营销方案不执行等级优惠 则 电子卡支付金额 =实收金额+等级优惠金额
  415. BigDecimal subtract = amt.add(gradeDiscountAmt);
  416. payOrderResultInfo.setDzkAmt(subtract.toString());
  417. }
  418. }else {
  419. if(isGradeSetting.equals("1")){
  420. //如果电子卡设置不执行营销方案执行等级优惠 则 电子卡支付金额 =应收金额-等级优惠金额
  421. BigDecimal subtract = receivableAmt.subtract(gradeDiscountAmt);
  422. payOrderResultInfo.setDzkAmt(subtract.toString());
  423. }else {
  424. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  425. }
  426. }
  427. }
  428. //查询客户余额和卡的类型
  429. Map<String, String> map = this.selectCardBalance(Integer.valueOf(params.get("stationId").toString()), params.get("cardOilsType").toString(), params.get("unionId").toString());
  430. payOrderResultInfo.setBalance(map.get("balance"));
  431. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  432. }
  433. return payOrderResultInfo;
  434. }
  435. //计算等级优惠
  436. public PayOrderResultInfo calculateGradeDiscount(Map<String ,Object> params){
  437. String oilName = params.get("oilName").toString();
  438. String stationId = params.get("stationId").toString();
  439. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  440. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  441. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  442. BigDecimal discountAmt = new BigDecimal(0); //优惠金额
  443. BigDecimal amt = new BigDecimal(0);
  444. BigDecimal discountPrice = oilPrice;
  445. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  446. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  447. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  448. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  449. }
  450. //当前客户是否已存在当前油站客户信息中
  451. CustomerManage customerManage = new CustomerManage();
  452. customerManage.setPhoneNumber(params.get("mobilePhone").toString());
  453. customerManage.setOilName(oilName);
  454. customerManage.setStationId(Integer.valueOf(stationId));
  455. CustomerManage customerManageInfo = customerManagerService.getCustomerManageInfo(customerManage);
  456. if(customerManageInfo !=null){
  457. //当前客户所加油的订单已存在等级时
  458. double amtSum = customerManageInfo.getAmt().doubleValue(); //当前客户已累计的金额
  459. List<Map> cList = customerGradeServices.getCustomerGradeListOrderByDesc(params); //获取油站的等级优惠方案 倒叙查询规则
  460. if(cList !=null && cList.size() >0){ //当前油站设置等级方案时
  461. for(Map m : cList){
  462. if(amtSum >= Double.valueOf(m.get("memberConditStart").toString())){
  463. discountAmt = oilLiters.multiply(new BigDecimal(m.get("discountAmt").toString()));
  464. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  465. break;
  466. }
  467. }
  468. }
  469. }else {
  470. //当前客户所加油的订单不存在等级时
  471. List<Map> customerGradeList = customerGradeServices.getCustomerGradeList(params); //升序查询 取第一条
  472. if(customerGradeList !=null && customerGradeList.size() >0){
  473. discountAmt = oilLiters.multiply(new BigDecimal(customerGradeList.get(0).get("discountAmt").toString()));
  474. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  475. }
  476. }
  477. amt = receivableAmt.subtract(discountAmt); //应收金额
  478. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  479. payOrderResultInfo.setAmt(amt.toString());
  480. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  481. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  482. payOrderResultInfo.setOilLiters(oilLiters.toString());
  483. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  484. payOrderResultInfo.setOilPrice(oilPrice.toString());
  485. payOrderResultInfo.setDzkAmt(amt.toString());
  486. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  487. if(params.get("cardEnabledFlag").toString().equals("1")){
  488. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  489. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  490. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  491. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  492. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting();
  493. if(isGradeSetting.equals("1")){
  494. payOrderResultInfo.setDzkAmt(amt.toString());
  495. }
  496. }
  497. //查询客户余额和卡的类型
  498. Map<String, String> map = this.selectCardBalance(Integer.valueOf(params.get("stationId").toString()), params.get("cardOilsType").toString(), params.get("unionId").toString());
  499. payOrderResultInfo.setBalance(map.get("balance"));
  500. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  501. }
  502. return payOrderResultInfo;
  503. }
  504. //查询用户电子会员卡余额
  505. public Map<String, String> selectCardBalance(Integer stationId, String cardOilsType, String unionId) {
  506. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  507. customerElectronicCard.setCardOilsType(cardOilsType);
  508. customerElectronicCard.setStationId(stationId);
  509. customerElectronicCard.setUnionId(unionId);
  510. CustomerElectronicCard electronicCardInfo = electronicMembershipCardService.getElectronicCardInfoByUnionId(customerElectronicCard);
  511. BigDecimal balance = null;
  512. String cardOilsType1 ="";
  513. Map<String, String> result = new HashMap<>();
  514. if(electronicCardInfo !=null){
  515. balance = electronicCardInfo.getAmt();
  516. cardOilsType1 = electronicCardInfo.getCardOilsType();
  517. result.put("balance",balance.toString());
  518. result.put("cardOilsType",cardOilsType1);
  519. }
  520. return result;
  521. }
  522. /*
  523. * ===========================计算订单金额======================================
  524. * 第一次修订时间:2021年4月20日15:31:30
  525. * 修订标题:修订优惠计算
  526. * 修订内容 :
  527. * 修改为目前只有三种优惠:根据立减、满减、独立直降;
  528. * 注释:优惠为 1 是:表示不走满减、立减、独立直降优惠,只走等级直降的优惠;
  529. * 条件规则:
  530. * 一,优先满减(只有一档,不存在多档!)、立减(只有一档,不存在多档!)、独立直降(只有一档)
  531. * 二,若用户消费门槛 >= 优惠门槛,且启用优惠叠加时,则计算优惠规则和等级优惠规则;
  532. * 若用户消费门槛 >= 优惠门槛,且不启用优惠叠加时,则只计算优惠规则;
  533. * 若用户消费门槛 < 优惠门槛,且启用优惠叠加时,则只计算等级规则;
  534. * 若用户消费门槛 < 优惠门槛,且不启用优惠叠加时,则只计算等级规则;
  535. *
  536. * ===========================================================================
  537. */
  538. public Map<String ,Object> calculateAmtNew(PayOrderRequest payOrderRequest){
  539. Map<String ,Object> resultMap = new HashMap<>();
  540. if(payOrderRequest.getReceivableAmt() !=null){ //应收金额
  541. Double receivableAmt = payOrderRequest.getReceivableAmt(); //应收金额 用户输入的金额
  542. Integer stationId = payOrderRequest.getStationId(); //油站ID
  543. //String oilGun = payOrderRequest.getOilGun(); //油枪号
  544. String oilName = payOrderRequest.getOilName(); //油品名称
  545. String openId = payOrderRequest.getOpenId(); //用户的openId
  546. String mobilePhone = payOrderRequest.getCustomerPhone(); //客户手机号
  547. //获取油品价格
  548. StationOilPrice stationOilPrice = new StationOilPrice();
  549. stationOilPrice.setStationId(stationId);
  550. stationOilPrice.setOilName(oilName);
  551. StationOilPrice oilPriceInfo = stationService.getStationOilPrice(stationOilPrice);
  552. String oilPrice = oilPriceInfo.getOilPrice();
  553. //String stationNanme = oilPriceInfo.getStationNanme();
  554. BigDecimal oilLiters = new BigDecimal(0);
  555. BigDecimal discountAmt =new BigDecimal(0);
  556. BigDecimal discountPrice = null;
  557. BigDecimal amt = null;
  558. //resultMap.put("stationName", stationNanme);
  559. resultMap.put("oilPrice", oilPrice); //油品价格
  560. resultMap.put("receivableAmt", receivableAmt); //应收价格
  561. //该油站的优惠方式
  562. String stationDiscountWay = stationService.getStationDiscountWay(stationId.toString());
  563. Map<String ,Object> params = new HashMap<String, Object>();
  564. params.put("stationId", stationId);
  565. params.put("oilName", oilName);
  566. params.put("receivableAmt", receivableAmt);
  567. params.put("oilPrice", oilPrice);
  568. params.put("mobilePhone", mobilePhone);
  569. params.put("minaOpenid", openId);
  570. BigDecimal receivableAmt_b = new BigDecimal(receivableAmt); //传入的应收金额
  571. switch (stationDiscountWay){
  572. case "1": //1.等级直降
  573. //查询等级直降的优惠方式
  574. //查询客户等级信息
  575. List<Map<String, Object>> customerGradeInfo = customerGradeServices.getCustomerGradeInfo(params);
  576. if(customerGradeInfo != null && customerGradeInfo.size() >0){ //已存在客户等级信息
  577. //使用客户已存在的等级计算优惠
  578. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP); //加油升数
  579. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  580. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP);
  581. }
  582. if(customerGradeInfo.get(0).containsKey("gasoilDiscountLitre")){ //表示可以查到客户在当前油站的等级信息,油站等级体系没有删除
  583. if(customerGradeInfo.get(0).get("gasoilDiscountLitre") !=null){
  584. discountAmt = oilLiters.multiply(new BigDecimal(customerGradeInfo.get(0).get("gasoilDiscountLitre").toString()));
  585. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  586. }else {
  587. discountAmt =new BigDecimal("0.00");
  588. }
  589. }else {
  590. //如果存在客户等级,但油站修改等级体系,客户等级已超出等级体系时
  591. List<Map> cList = customerGradeServices.getCustomerGradeListOrderByDesc(params);
  592. if(cList !=null && cList.size() >0){
  593. CustomerManage customerManage = new CustomerManage();
  594. customerManage.setStationId(Integer.valueOf(params.get("stationId").toString())); //油站ID
  595. customerManage.setOilName(params.get("oilName").toString()); //油品名称
  596. customerManage.setPhoneNumber(params.get("mobilePhone").toString());
  597. customerManage.setMinaOpenid(params.get("minaOpenid").toString());
  598. CustomerManage existCustomer = customerManagerService.getCustomerManageInfo(customerManage); //已存在用户信息 existCustomer
  599. for(Map m : cList){
  600. if(Double.valueOf(existCustomer.getAmt().toString()) >= Double.valueOf(m.get("memberConditStart").toString())){
  601. discountAmt = oilLiters.multiply(new BigDecimal(cList.get(0).get("gasoilDiscountLitre").toString()));
  602. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  603. break;
  604. }
  605. }
  606. }
  607. }
  608. amt = receivableAmt_b.subtract(discountAmt);
  609. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  610. resultMap.put("discountAmt", discountAmt.doubleValue());
  611. resultMap.put("amt", amt.doubleValue());
  612. resultMap.put("oilLiters", oilLiters.doubleValue());
  613. resultMap.put("discountPrice", discountPrice.doubleValue());
  614. }else {
  615. //不存在客户等级信息时,查询油站的客户等级直降优惠(查询结果根据会员成长值条件做升序查询)
  616. List<Map> customerGradeList = customerGradeServices.getCustomerGradeList(params);
  617. //如果存在
  618. if(customerGradeList !=null && customerGradeList.size() >0){
  619. //用户第一次购买 取等级最低初始会员的优惠条件计算
  620. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP); //加油升数
  621. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  622. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP);
  623. }
  624. if(customerGradeList.get(0).get("gasoilDiscountLitre") !=null){
  625. discountAmt = oilLiters.multiply(new BigDecimal(customerGradeList.get(0).get("gasoilDiscountLitre").toString()));
  626. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  627. }else {
  628. discountAmt =new BigDecimal("0.00");
  629. }
  630. amt = receivableAmt_b.subtract(discountAmt);
  631. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  632. resultMap.put("discountAmt", discountAmt.doubleValue());
  633. resultMap.put("amt", amt.doubleValue());
  634. resultMap.put("oilLiters", oilLiters.doubleValue());
  635. resultMap.put("discountPrice", discountPrice.doubleValue());
  636. }else {
  637. //不存在
  638. resultMap.put("discountAmt", 0);
  639. resultMap.put("amt", receivableAmt.doubleValue());
  640. oilLiters = new BigDecimal(receivableAmt).divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_UP);
  641. resultMap.put("oilLiters", oilLiters.doubleValue());
  642. resultMap.put("discountPrice", oilPrice);
  643. }
  644. }
  645. break;
  646. case "2": //2.满减
  647. params.put("discountPlanType", "1");
  648. //营销方案
  649. List<Map> customerMarkertPlanList_1 = customerGradeServices.getCustomerMarkertPlanList(params);
  650. //有优惠规则
  651. if(customerMarkertPlanList_1 !=null && customerMarkertPlanList_1.size() >0){
  652. //是否共享会员优惠叠加: 1 代表是; 2 代表否;
  653. String vipDiscountyPlus = customerMarkertPlanList_1.get(0).get("vipDiscountyPlus").toString();
  654. //如果当前应收金额大于条件金额
  655. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList_1.get(0).get("discountAmt").toString()); //条件金额
  656. if(receivableAmt_b.compareTo(discountAmt_b) ==1 || receivableAmt_b.compareTo(discountAmt_b) ==0){
  657. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList_1.get(0).get("gasoilDiscountAmt").toString()); //每满多少优惠多少的金额
  658. discountAmt = receivableAmt_b.divide(discountAmt_b, 2, BigDecimal.ROUND_HALF_UP).multiply(gasoilDiscountAmt_b); //优惠金额
  659. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  660. amt = receivableAmt_b.subtract(discountAmt); //实收金额
  661. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP); //加油升数
  662. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  663. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP);
  664. }
  665. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  666. switch (vipDiscountyPlus){
  667. case "1":
  668. Map<String, Object> map = this.calcuteDengJiZhiJiang(params);
  669. discountAmt = discountAmt.add(new BigDecimal(map.get("discountAmt").toString()));
  670. amt = receivableAmt_b.subtract(discountAmt);
  671. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  672. resultMap.put("discountAmt", discountAmt.doubleValue());
  673. resultMap.put("amt", amt.doubleValue());
  674. resultMap.put("oilLiters", oilLiters.doubleValue());
  675. resultMap.put("discountPrice", discountPrice.doubleValue());
  676. break;
  677. case "2":
  678. resultMap.put("discountAmt", discountAmt.doubleValue());
  679. resultMap.put("amt", amt.doubleValue());
  680. resultMap.put("oilLiters", oilLiters.doubleValue());
  681. resultMap.put("discountPrice", discountPrice.doubleValue());
  682. break;
  683. }
  684. }else{
  685. switch (vipDiscountyPlus){
  686. case "1":
  687. Map<String, Object> map = this.calcuteDengJiZhiJiang(params);
  688. discountAmt = discountAmt.add(new BigDecimal(map.get("discountAmt").toString()));
  689. oilLiters = new BigDecimal(map.get("oilLiters").toString());
  690. amt = receivableAmt_b.subtract(discountAmt);
  691. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  692. resultMap.put("discountAmt", discountAmt.doubleValue());
  693. resultMap.put("amt", amt.doubleValue());
  694. resultMap.put("oilLiters", oilLiters.doubleValue());
  695. resultMap.put("discountPrice", discountPrice.doubleValue());
  696. break;
  697. case "2":
  698. resultMap.put("discountAmt", 0);
  699. resultMap.put("amt", receivableAmt.doubleValue());
  700. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP); //加油升数
  701. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  702. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP);
  703. }
  704. resultMap.put("oilLiters", oilLiters.doubleValue());
  705. resultMap.put("discountPrice", oilPrice);
  706. break;
  707. }
  708. }
  709. }else {
  710. //用户没有设置优惠规则时
  711. Map<String, Object> map = this.calcuteDengJiZhiJiang(params);
  712. resultMap.put("discountAmt", map.get("discountAmt").toString());
  713. resultMap.put("amt", map.get("amt").toString());
  714. resultMap.put("oilLiters", map.get("oilLiters").toString());
  715. resultMap.put("discountPrice", map.get("discountPrice").toString());
  716. }
  717. break;
  718. case "3": //3.立减
  719. params.put("discountPlanType", "2");
  720. //营销方案
  721. List<Map> customerMarkertPlanList_2 = customerGradeServices.getCustomerMarkertPlanList(params);
  722. if(customerMarkertPlanList_2 !=null && customerMarkertPlanList_2.size() >0){
  723. //是否共享会员优惠叠加: 1 代表是; 2 代表否;
  724. String vipDiscountyPlus = customerMarkertPlanList_2.get(0).get("vipDiscountyPlus").toString();
  725. //如果当前应收金额大于条件金额
  726. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList_2.get(0).get("discountAmt").toString()); //条件金额
  727. if(receivableAmt_b.compareTo(discountAmt_b) ==1 || receivableAmt_b.compareTo(discountAmt_b) ==0){
  728. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList_2.get(0).get("gasoilDiscountAmt").toString()); //满多少优惠多少的金额
  729. discountAmt = gasoilDiscountAmt_b; //优惠金额
  730. amt = receivableAmt_b.subtract(gasoilDiscountAmt_b); //实收金额
  731. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP); //加油升数
  732. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  733. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP);
  734. }
  735. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_UP);
  736. switch (vipDiscountyPlus){
  737. case "1":
  738. Map<String, Object> map = this.calcuteDengJiZhiJiang(params);
  739. discountAmt = discountAmt.add(new BigDecimal(map.get("discountAmt").toString()));
  740. amt = receivableAmt_b.subtract(discountAmt);
  741. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  742. //discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_UP);
  743. resultMap.put("discountAmt", discountAmt.doubleValue());
  744. resultMap.put("amt", amt.doubleValue());
  745. resultMap.put("oilLiters", oilLiters.doubleValue());
  746. resultMap.put("discountPrice", discountPrice.doubleValue());
  747. break;
  748. case "2":
  749. resultMap.put("discountAmt", discountAmt.doubleValue());
  750. resultMap.put("amt", amt.doubleValue());
  751. resultMap.put("oilLiters", oilLiters.doubleValue());
  752. resultMap.put("discountPrice", discountPrice.doubleValue());
  753. break;
  754. }
  755. }else {
  756. //不满足优惠条件
  757. switch (vipDiscountyPlus) {
  758. case "1":
  759. Map<String, Object> map = this.calcuteDengJiZhiJiang(params);
  760. discountAmt = discountAmt.add(new BigDecimal(map.get("discountAmt").toString()));
  761. oilLiters = new BigDecimal(map.get("oilLiters").toString());
  762. amt = receivableAmt_b.subtract(discountAmt);
  763. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  764. //discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_UP);
  765. resultMap.put("discountAmt", discountAmt.doubleValue());
  766. resultMap.put("amt", amt.doubleValue());
  767. resultMap.put("oilLiters", oilLiters.doubleValue());
  768. resultMap.put("discountPrice", discountPrice.doubleValue());
  769. break;
  770. case "2":
  771. resultMap.put("discountAmt", 0);
  772. resultMap.put("amt", receivableAmt.doubleValue());
  773. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP); //加油升数
  774. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  775. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP);
  776. }
  777. resultMap.put("oilLiters", oilLiters.doubleValue());
  778. resultMap.put("discountPrice", oilPrice);
  779. break;
  780. }
  781. }
  782. }else {
  783. //用户没有设置优惠规则时
  784. Map<String, Object> map = this.calcuteDengJiZhiJiang(params);
  785. resultMap.put("discountAmt", map.get("discountAmt").toString());
  786. resultMap.put("amt", map.get("amt").toString());
  787. resultMap.put("oilLiters", map.get("oilLiters").toString());
  788. resultMap.put("discountPrice", map.get("discountPrice").toString());
  789. }
  790. break;
  791. case "4": //4.独立直降
  792. params.put("discountPlanType", "3");
  793. //营销方案
  794. List<Map> customerMarkertPlanList_3 = customerGradeServices.getCustomerMarkertPlanList(params);
  795. if(customerMarkertPlanList_3 !=null && customerMarkertPlanList_3.size() >0){
  796. //是否共享会员优惠叠加: 1 代表是; 2 代表否;
  797. String vipDiscountyPlus_4 = customerMarkertPlanList_3.get(0).get("vipDiscountyPlus").toString();
  798. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList_3.get(0).get("discountAmt").toString()); //条件金额
  799. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList_3.get(0).get("gasoilDiscountAmt").toString());
  800. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP); //加油升数
  801. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  802. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP);
  803. }
  804. if(customerMarkertPlanList_3.get(0).get("discountTerm").toString().equals("1")){ //按升数优惠
  805. if(oilLiters.compareTo(discountAmt_b) ==1 || oilLiters.compareTo(discountAmt_b) ==0){
  806. //计算
  807. discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  808. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  809. amt = receivableAmt_b.subtract(discountAmt);
  810. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  811. //discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_UP); //优惠价格
  812. if(vipDiscountyPlus_4.equals("1")){
  813. Map<String, Object> map = this.calcuteDengJiZhiJiang(params);
  814. discountAmt = discountAmt.add(new BigDecimal(map.get("discountAmt").toString()));
  815. amt = receivableAmt_b.subtract(discountAmt);
  816. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  817. //discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_UP);
  818. }
  819. resultMap.put("discountAmt", discountAmt.doubleValue());
  820. resultMap.put("amt", amt.doubleValue());
  821. resultMap.put("oilLiters", oilLiters.doubleValue());
  822. resultMap.put("discountPrice", discountPrice.doubleValue());
  823. break;
  824. }else {
  825. //不满足优惠条件
  826. switch (vipDiscountyPlus_4) {
  827. case "1":
  828. Map<String, Object> map = this.calcuteDengJiZhiJiang(params);
  829. discountAmt = discountAmt.add(new BigDecimal(map.get("discountAmt").toString()));
  830. oilLiters = new BigDecimal(map.get("oilLiters").toString());
  831. amt = receivableAmt_b.subtract(discountAmt);
  832. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  833. resultMap.put("discountAmt", discountAmt.doubleValue());
  834. resultMap.put("amt", amt.doubleValue());
  835. resultMap.put("oilLiters", oilLiters.doubleValue());
  836. resultMap.put("discountPrice", discountPrice.doubleValue());
  837. break;
  838. case "2":
  839. resultMap.put("discountAmt", 0);
  840. resultMap.put("amt", receivableAmt.doubleValue());
  841. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP); //加油升数
  842. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  843. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP);
  844. }
  845. resultMap.put("oilLiters", oilLiters.doubleValue());
  846. resultMap.put("discountPrice", oilPrice);
  847. break;
  848. }
  849. }
  850. }else if(customerMarkertPlanList_3.get(0).get("discountTerm").toString().equals("2")){ //按金额优惠
  851. if(receivableAmt_b.compareTo(discountAmt_b) ==1 || receivableAmt_b.compareTo(discountAmt_b) ==0){
  852. discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  853. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  854. amt = receivableAmt_b.subtract(discountAmt);
  855. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  856. //是否共享会员优惠叠加
  857. if(vipDiscountyPlus_4.equals("1")){
  858. Map<String, Object> map = this.calcuteDengJiZhiJiang(params);
  859. discountAmt = discountAmt.add(new BigDecimal(map.get("discountAmt").toString()));
  860. amt = receivableAmt_b.subtract(discountAmt);
  861. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  862. //discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_UP);
  863. }
  864. resultMap.put("discountAmt", discountAmt.doubleValue());
  865. resultMap.put("amt", amt.doubleValue());
  866. resultMap.put("oilLiters", oilLiters.doubleValue());
  867. resultMap.put("discountPrice", discountPrice.doubleValue());
  868. break;
  869. }else {
  870. //不满足优惠条件
  871. switch (vipDiscountyPlus_4) {
  872. case "1":
  873. Map<String, Object> map = this.calcuteDengJiZhiJiang(params);
  874. discountAmt = discountAmt.add(new BigDecimal(map.get("discountAmt").toString()));
  875. oilLiters = new BigDecimal(map.get("oilLiters").toString());
  876. amt = receivableAmt_b.subtract(discountAmt);
  877. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  878. resultMap.put("discountAmt", discountAmt.doubleValue());
  879. resultMap.put("amt", amt.doubleValue());
  880. resultMap.put("oilLiters", oilLiters.doubleValue());
  881. resultMap.put("discountPrice", discountPrice.doubleValue());
  882. break;
  883. case "2":
  884. resultMap.put("discountAmt", 0);
  885. resultMap.put("amt", receivableAmt.doubleValue());
  886. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP); //加油升数
  887. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  888. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP);
  889. }
  890. resultMap.put("oilLiters", oilLiters.doubleValue());
  891. resultMap.put("discountPrice", oilPrice);
  892. break;
  893. }
  894. }
  895. }
  896. }else {
  897. //没有设置优惠条件时
  898. Map<String, Object> map = this.calcuteDengJiZhiJiang(params);
  899. resultMap.put("discountAmt", map.get("discountAmt").toString());
  900. resultMap.put("amt", map.get("amt").toString());
  901. resultMap.put("oilLiters", map.get("oilLiters").toString());
  902. resultMap.put("discountPrice", map.get("discountPrice").toString());
  903. }
  904. break;
  905. }
  906. }
  907. return resultMap;
  908. }
  909. //计算
  910. //计算等级直降
  911. public Map<String, Object> calcuteDengJiZhiJiang(Map params){
  912. Double receivableAmt = Double.valueOf(params.get("receivableAmt").toString());
  913. Map<String, Object> resultMap = new HashMap();
  914. BigDecimal oilLiters = null;
  915. BigDecimal discountAmt =new BigDecimal(0);
  916. BigDecimal discountPrice = null;
  917. BigDecimal amt = null;
  918. BigDecimal receivableAmt_b = new BigDecimal(receivableAmt); //传入的应收金额
  919. String oilPrice = params.get("oilPrice").toString();
  920. List<Map<String, Object>> customerGradeInfo = customerGradeServices.getCustomerGradeInfo(params);
  921. if(customerGradeInfo != null && customerGradeInfo.size() >0){ //已存在客户等级信息
  922. //使用客户已存在的等级计算优惠
  923. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP); //加油升数
  924. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  925. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP);
  926. }
  927. if(customerGradeInfo.get(0).containsKey("gasoilDiscountLitre")){
  928. if(customerGradeInfo.get(0).get("gasoilDiscountLitre") !=null){
  929. discountAmt = oilLiters.multiply(new BigDecimal(customerGradeInfo.get(0).get("gasoilDiscountLitre").toString()));
  930. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  931. }else {
  932. discountAmt =new BigDecimal("0.00");
  933. }
  934. }else {
  935. //如果存在客户等级,但油站修改等级体系,客户等级已超出等级体系时
  936. List<Map> cList = customerGradeServices.getCustomerGradeListOrderByDesc(params);
  937. if(cList !=null && cList.size() >0){
  938. CustomerManage customerManage = new CustomerManage();
  939. customerManage.setStationId(Integer.valueOf(params.get("stationId").toString())); //油站ID
  940. customerManage.setOilName(params.get("oilName").toString()); //油品名称
  941. customerManage.setPhoneNumber(params.get("mobilePhone").toString());
  942. customerManage.setMinaOpenid(params.get("minaOpenid").toString());
  943. CustomerManage existCustomer = customerManagerService.getCustomerManageInfo(customerManage); //已存在用户信息 existCustomer
  944. for(Map m : cList){
  945. if(Double.valueOf(existCustomer.getAmt().toString()) >= Double.valueOf(m.get("memberConditStart").toString())){
  946. discountAmt = oilLiters.multiply(new BigDecimal(cList.get(0).get("gasoilDiscountLitre").toString()));
  947. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  948. break;
  949. }
  950. }
  951. }
  952. }
  953. amt = receivableAmt_b.subtract(discountAmt);
  954. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  955. //discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_UP);
  956. resultMap.put("discountAmt", discountAmt.doubleValue());
  957. resultMap.put("amt", amt.doubleValue());
  958. resultMap.put("oilLiters", oilLiters.doubleValue());
  959. resultMap.put("discountPrice", discountPrice.doubleValue());
  960. }else {
  961. //不存在客户等级信息时,查询油站的客户等级直降优惠(查询结果根据会员成长值条件做升序查询)
  962. List<Map> customerGradeList = customerGradeServices.getCustomerGradeList(params);
  963. //如果存在
  964. if(customerGradeList !=null && customerGradeList.size() >0){
  965. //用户第一次购买 取等级最低初始会员的优惠条件计算
  966. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP); //加油升数
  967. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  968. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP);
  969. }
  970. if(customerGradeList.get(0).get("gasoilDiscountLitre") !=null){
  971. discountAmt = oilLiters.multiply(new BigDecimal(customerGradeList.get(0).get("gasoilDiscountLitre").toString()));
  972. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  973. }else {
  974. discountAmt =new BigDecimal("0.00");
  975. }
  976. amt = receivableAmt_b.subtract(discountAmt);
  977. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? new BigDecimal(oilPrice) : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  978. //discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_UP);
  979. resultMap.put("discountAmt", discountAmt.doubleValue());
  980. resultMap.put("amt", amt.doubleValue());
  981. resultMap.put("oilLiters", oilLiters.doubleValue());
  982. resultMap.put("discountPrice", discountPrice.doubleValue());
  983. }else {
  984. //不存在
  985. resultMap.put("discountAmt", 0);
  986. resultMap.put("amt", receivableAmt.doubleValue());
  987. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP); //加油升数
  988. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  989. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_UP);
  990. }
  991. resultMap.put("oilLiters", oilLiters.doubleValue());
  992. resultMap.put("discountPrice", oilPrice);
  993. }
  994. }
  995. return resultMap;
  996. }
  997. /**
  998. * 根据订单号获取订单信息
  999. * produces="application/json;charset=UTF-8",consumes = "application/json",
  1000. * @RequestBody String orderno
  1001. * @param
  1002. * @return
  1003. */
  1004. @RequestMapping(value = "/getPayOrderList", method = RequestMethod.GET)
  1005. @ResponseBody
  1006. public String getPayOrderList(@RequestParam String orderNo,String openId,String userType){
  1007. Gson gson =new Gson();
  1008. ResultData resultData =null;
  1009. //根据token 和 usertype来判断用户是否存在
  1010. boolean flag = appUserInfoService.selectAppUserInfo(openId,userType);
  1011. if(flag){
  1012. if(StringUtils.isNotBlank(orderNo)){
  1013. PayOrderRequest payOrderRequest =new PayOrderRequest();
  1014. payOrderRequest.setOrderNo(orderNo);
  1015. List<PayOrder> payOrderList = payOrderService.getPayOrderList(payOrderRequest.getOrderNo());
  1016. resultData=ResultData.success(payOrderList);
  1017. }else {
  1018. resultData=ResultData.error(CodeMsg.SEARCH_FAIL);
  1019. }
  1020. }else{
  1021. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  1022. }
  1023. return gson.toJson(resultData);
  1024. }
  1025. /*
  1026. * 根据用户openId和用户类型userType查询用户订单
  1027. * @param openId
  1028. * @param userType
  1029. * @return
  1030. */
  1031. @RequestMapping(value = "/getOrderListByOpenIdAndUserType", method = RequestMethod.GET)
  1032. @ResponseBody
  1033. public String getOrderListByOpenIdAndUserType(@RequestParam("openId") String openId, @RequestParam("userType") String userType){
  1034. Gson gson =new Gson();
  1035. ResultData resultData =null;
  1036. if(StringUtils.isNotBlank(openId) && StringUtils.isNotBlank(userType)){
  1037. AppUserInfo appUserInfo = new AppUserInfo();
  1038. switch (userType){
  1039. case "1":
  1040. appUserInfo.setBlogOpenid(openId);
  1041. break;
  1042. case "2":
  1043. appUserInfo.setMinaOpenid(openId);
  1044. break;
  1045. }
  1046. List<PayOrder> payOrderList = payOrderService.getOrderListByOpenIdAndUserType(appUserInfo);
  1047. resultData=ResultData.success(payOrderList);
  1048. }else {
  1049. resultData=ResultData.error(CodeMsg.SEARCH_FAIL);
  1050. }
  1051. return gson.toJson(resultData);
  1052. }
  1053. }