PayOrderController.java 89 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374
  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.text.SimpleDateFormat;
  20. import java.util.*;
  21. @Controller
  22. @YiJiaRequest()
  23. @CrossOrigin
  24. public class PayOrderController {
  25. private static Logger logger =(Logger) LoggerFactory.getLogger(PayOrderController.class);
  26. @Resource
  27. private PayOrderService payOrderService;
  28. @Resource
  29. private AppUserInfoService appUserInfoService;
  30. @Resource
  31. private StationService stationService;
  32. @Resource
  33. private CustomerGradeServices customerGradeServices;
  34. @Resource
  35. private PayOrderMapper payOrderMapper;
  36. @Resource
  37. private ElectronicMembershipCardService electronicMembershipCardService;
  38. @Resource
  39. private CustomerManagerService customerManagerService;
  40. @Resource
  41. private SysDictDataService sysDictDataService;
  42. @Resource
  43. private LabelService labelService;
  44. @Resource
  45. private StationOilGunService stationOilGunService;
  46. //小程序支付生成订单
  47. @RequestMapping(value = "/AddPayOrderInfoNew", consumes = "application/json", method = RequestMethod.POST)
  48. @ResponseBody
  49. @Transactional
  50. public String AddPayOrderInfoNew(@RequestBody PayOrderRequest payOrderRequest){
  51. logger.info("获取订单前端传来参数openId:"+ payOrderRequest.getOpenId());
  52. Gson gson =new Gson();
  53. ResultData resultData =null;
  54. AppUserInfo appUserInfo =new AppUserInfo(); //查询客户信息传递参数
  55. PayOrder payOrder = new PayOrder(); //生成订单参数
  56. if(StringUtils.isNotBlank(payOrderRequest.getUserType()) && StringUtils.isNotBlank(payOrderRequest.getOpenId()) && StringUtils.isNotBlank(payOrderRequest.getOilName()) &&
  57. StringUtils.isNotBlank(payOrderRequest.getOilGun()) && payOrderRequest.getReceivableAmt() !=null ){
  58. appUserInfo.setUserType(payOrderRequest.getUserType());
  59. switch (payOrderRequest.getUserType()){
  60. case "1": //小程序
  61. appUserInfo.setMinaOpenid(payOrderRequest.getOpenId());
  62. break;
  63. case "2": //支付宝公众号
  64. appUserInfo.setALiId(payOrderRequest.getOpenId());
  65. break;
  66. }
  67. StationInfo stationInfo = new StationInfo();
  68. stationInfo.setStationId(payOrderRequest.getStationId());
  69. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  70. Map<String ,Object> resultMap = new HashMap<>(); //返回结果集
  71. if(stationInfos !=null){
  72. payOrder.setStationName(stationInfos.getStationName());
  73. //获取油站图片和名称
  74. resultMap.put("stationPic", stationInfos.getStationPic());
  75. resultMap.put("stationName", stationInfos.getStationName());
  76. appUserInfo.setStationId(stationInfos.getGroupId());
  77. AppUserInfo appUserInfos = appUserInfoService.getAppUserInfo(appUserInfo);
  78. if(appUserInfos !=null) {
  79. //payOrderRequest存放参数原因:用于其他方法形参
  80. payOrderRequest.setCardEnabledFlagGroup(stationInfos.getCardEnabledFlagGroup()); //集团是否开启电子卡
  81. payOrderRequest.setCardRuleFlagGroup(stationInfos.getCardRuleFlagGroup()); //集团是否共享
  82. payOrderRequest.setIntegralFlagGroup(stationInfos.getIntegralFlagGroup()); //集团是否启用积分功能
  83. payOrderRequest.setIntegralRuleFlagGroup(stationInfos.getIntegralRuleFlagGroup()); //集团是否共享
  84. payOrderRequest.setCustomerPhone(appUserInfos.getMobilePhone()); //客户手机号; 注:此处存放手机号用于获取客户信息参数查询
  85. payOrderRequest.setUnionId(appUserInfos.getUnionId()); //客户UnionId;注:此处存放unionId用于获取客户电子卡参数查询
  86. payOrderRequest.setCustomerName(appUserInfos.getBlogNickName()); //昵称
  87. payOrderRequest.setGroupId(stationInfos.getGroupId()); //集团ID
  88. payOrderRequest.setLabelFlag(stationInfos.getLabelFlag()); //油站是否开启标签功能
  89. payOrderRequest.setIsLngFlagGroup(stationInfos.getIsLngFlagGroup()); //该集团是否为LNG第三方平台商:0,否;1,是;
  90. payOrder.setConsumer(appUserInfos.getBlogNickName()); //昵称
  91. payOrder.setConsumerId(appUserInfos.getUserId()); //用户id
  92. Random random = new Random();
  93. String result = "";
  94. for (int i = 0; i < 6; i++) {
  95. result += random.nextInt(10);
  96. }
  97. String ordNo = System.nanoTime() + result;
  98. payOrder.setOrderNo(ordNo); //订单号
  99. logger.info("生成的订单号:" + ordNo);
  100. payOrder.setDiscountCouponAmt(payOrderRequest.getDiscountCouponAmt()); //优惠劵金额
  101. payOrder.setDiscountCoupon(payOrderRequest.getDiscountCoupon()); //优惠券
  102. payOrder.setCarNo(payOrderRequest.getCarNo()); //车牌号、
  103. payOrder.setCustomerGrade(payOrderRequest.getCustomerGrade()); //客户电话
  104. payOrder.setMemberNo(payOrderRequest.getMemberNo()); //会员卡号
  105. payOrder.setMemberAmt(payOrderRequest.getMemberAmt()); //会员支付金额
  106. payOrder.setScore(payOrderRequest.getScore()); //积分
  107. payOrder.setStationId(payOrderRequest.getStationId()); //油站id
  108. payOrder.setStatus("0"); //创建订单 未支付状态 0
  109. payOrder.setCreatedDate(new Timestamp(new Date().getTime())); //创建时间
  110. payOrder.setOrderType(payOrderRequest.getOrderType()); //订单类型
  111. payOrder.setOilGun(payOrderRequest.getOilGun()); //油枪号
  112. payOrder.setReceivableAmt(Double.valueOf(payOrderRequest.getReceivableAmt())); //订单应收金额
  113. String oilName = payOrderRequest.getOilName();
  114. //获取该油品所属哪一类
  115. Oil oil = new Oil();
  116. oil.setOilName(oilName);
  117. oil.setDictType("oil_name");
  118. Oil oilInfo = sysDictDataService.selectOilType(oil);
  119. payOrder.setOilType(oilInfo.getOilsType()); //油品类型
  120. String oilsType = oilInfo.getOilsType(); //获取订单类型
  121. logger.info("订单油品类型:" + oilsType);
  122. payOrderRequest.setCardOilsType(oilInfo.getOilsType()); //电子卡类型;注:用于获取客户电子卡参数查询
  123. payOrder.setOilName(oilName); //油品名称
  124. //根据油站和油枪获取加油员
  125. if (payOrderRequest.getPersonnelId() != null) {
  126. Map<String, Object> params = new HashMap<>();
  127. params.put("personnelId", payOrderRequest.getPersonnelId());
  128. List<Map<String, Object>> list = stationOilGunService.selectOilGunByPersonalId(params);
  129. if (list != null && list.size() > 0) {
  130. payOrder.setOilPersonnel(list.get(0).get("personnelName").toString());
  131. } else {
  132. payOrder.setOilPersonnel("--");
  133. }
  134. } else {
  135. //根据油站和油枪获取加油员
  136. HashMap<String, Object> params = new HashMap<>();
  137. params.put("oliGunNo", payOrderRequest.getOilGun());
  138. params.put("stationId", payOrderRequest.getStationId());
  139. List<Map> mapResultList = payOrderMapper.selectPersonelName(params); //使用list原因:一个枪号对应多个加油员场景
  140. logger.info("加油员信息:"+ mapResultList.toString());
  141. if(mapResultList != null && mapResultList.size() > 0){
  142. String oilPersonnel = "";
  143. for (Map per : mapResultList){
  144. if(per.containsKey("personnelName") && per.get("personnelName").toString() !=null && per.get("personnelName").toString() !=""){
  145. oilPersonnel += per.get("personnelName").toString() +",";
  146. }
  147. }
  148. if(oilPersonnel !=""){
  149. payOrder.setOilPersonnel(oilPersonnel.substring(0, oilPersonnel.length()-1)); //加油员
  150. }
  151. }else {
  152. payOrder.setOilPersonnel("--");
  153. }
  154. }
  155. if(oilsType.equals("3")){ //订单类型是油品时计算
  156. payOrder.setOrderType("2");
  157. payOrder.setAmt(Double.valueOf(payOrderRequest.getReceivableAmt())); //非油品金额
  158. payOrder.setDiscountAmt(Double.valueOf(0)); //优惠金额
  159. payOrder.setOilPirce(payOrderRequest.getReceivableAmt()); //非油品价格
  160. payOrder.setOrderLiters("0");
  161. resultMap.put("oilsCardFlag", "0");
  162. resultMap.put("discountAmt", "0"); //优惠价格
  163. resultMap.put("amt", payOrderRequest.getReceivableAmt()); //实收价格
  164. resultMap.put("receivableAmt", payOrderRequest.getReceivableAmt()); //应收价格
  165. resultMap.put("oilLiters", "0");
  166. resultMap.put("discountPrice", "0");
  167. resultMap.put("ordNo", ordNo);
  168. payOrderMapper.insertSelective(payOrder);
  169. }else {
  170. PayOrderResultInfo payOrderResultInfo = this.calculateAmt(payOrderRequest); //计算订单金额 价格 加油升数 等等
  171. payOrder.setOilPirce(payOrderResultInfo.getOilPrice());
  172. payOrder.setOrderLiters(payOrderResultInfo.getOilLiters());
  173. payOrder.setDiscountAmt(Double.valueOf(payOrderResultInfo.getDiscountAmt()));
  174. payOrder.setAmt(Double.valueOf(payOrderResultInfo.getAmt()));
  175. payOrder.setOrderType("1");
  176. if(payOrderResultInfo.getCardEnabledFlag() !=null && payOrderResultInfo.getCardEnabledFlag().equals("1")){
  177. payOrder.setDzkAmt(Double.valueOf(payOrderResultInfo.getDzkAmt()));
  178. payOrder.setDiscountAmt(Double.valueOf(payOrderResultInfo.getDzkDiscountAmt()));
  179. }
  180. resultMap.put("cardEnabledFlag", payOrderResultInfo.getCardEnabledFlag());
  181. resultMap.put("oilsCardFlag", payOrderResultInfo.getOilsCardFlag());
  182. resultMap.put("discountAmt", payOrderResultInfo.getDiscountAmt()); //优惠金额
  183. resultMap.put("amt", payOrderResultInfo.getAmt()); //实收价格
  184. resultMap.put("discountPrice", payOrderResultInfo.getDiscountPrice());
  185. if(payOrderRequest.getIsLngFlagGroup() !=null && payOrderRequest.getIsLngFlagGroup().equals("1")){
  186. payOrder.setSellAmt(Double.valueOf(payOrderResultInfo.getSellAmt()));
  187. payOrder.setSellDiscountAmt(Double.valueOf(payOrderResultInfo.getSellDiscountAmt()));
  188. payOrder.setSellOilPrice(Double.valueOf(payOrderResultInfo.getSellPrice()));
  189. payOrder.setDriverOilPrice(Double.valueOf(payOrderResultInfo.getDiscountPrice()));
  190. //resultMap.put("discountPrice", payOrderResultInfo.getDiscountPrice());
  191. }
  192. resultMap.put("receivableAmt", payOrderResultInfo.getReceivableAmt()); //应收价格
  193. resultMap.put("oilLiters", payOrderResultInfo.getOilLiters());
  194. resultMap.put("amt_dzk", payOrderResultInfo.getDzkAmt());
  195. resultMap.put("discountAmt_dzk", payOrderResultInfo.getDzkDiscountAmt()); //电子卡优惠金额
  196. resultMap.put("balance", payOrderResultInfo.getBalance()); //电子卡余额
  197. resultMap.put("cardOilsType", payOrderResultInfo.getCardOilsType()); //电子卡类型1.汽油; 2.柴油
  198. resultMap.put("ordNo", ordNo);
  199. logger.info("返回前端的结果:" +resultMap.toString());
  200. payOrderMapper.insertSelective(payOrder);
  201. }
  202. resultData = ResultData.success(resultMap);
  203. }else {
  204. //登录人验证失败
  205. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  206. }
  207. }else {
  208. resultData = ResultData.error(CodeMsg.REQUEST_FAIL);
  209. }
  210. }else {
  211. resultData = ResultData.error(CodeMsg.REQUEST_FAIL);
  212. }
  213. return gson.toJson(resultData);
  214. }
  215. //根据营销方案计算订单金额
  216. public PayOrderResultInfo calculateAmt(PayOrderRequest payOrderRequest){
  217. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  218. Integer stationId = payOrderRequest.getStationId(); //油站ID
  219. BigDecimal receivableAmt = new BigDecimal(payOrderRequest.getReceivableAmt()); //应收金额 用户输入的金额
  220. String oilName = payOrderRequest.getOilName(); //油品名称
  221. String openId = payOrderRequest.getOpenId(); //用户的openId
  222. String userPhone = payOrderRequest.getCustomerPhone(); //用户手机号
  223. String customerName = payOrderRequest.getCustomerName(); //用户手机号
  224. Map<String, Object> map = new HashMap<>();
  225. map.put("oilName", oilName);
  226. map.put("stationId", stationId);
  227. //获取油站油品价格 优惠方案 是否开启电子卡
  228. Map<String, Object> result = stationService.selectStationOilPriceAndDiscountSetting(map);
  229. String oilPrice = result.get("oilPrice").toString(); //油站油品价格
  230. String discountSetting = result.get("discountSetting").toString(); //优惠方案
  231. String cardEnabledFlag = result.get("cardEnabledFlag").toString(); //是否开启电子卡
  232. String cardRuleFlag = result.get("cardRuleFlag").toString(); //是否共享电子卡储值规则
  233. String groupId = payOrderRequest.getGroupId().toString(); //集团ID
  234. Map<String ,Object> params = new HashMap<String, Object>();
  235. params.put("stationId", stationId);
  236. params.put("oilName", oilName);
  237. params.put("receivableAmt", receivableAmt);
  238. params.put("oilPrice", oilPrice);
  239. params.put("mobilePhone", payOrderRequest.getCustomerPhone());
  240. params.put("minaOpenid", openId);
  241. params.put("cardEnabledFlag", cardEnabledFlag);
  242. params.put("cardRuleFlag", cardRuleFlag);
  243. params.put("groupId", groupId);
  244. params.put("unionId", payOrderRequest.getUnionId());
  245. params.put("cardOilsType", payOrderRequest.getCardOilsType());
  246. params.put("customerName", customerName);
  247. params.put("userPhone", userPhone);
  248. params.put("integralRuleFlagGroup", payOrderRequest.getIntegralRuleFlagGroup()); // integralRuleFlagGroup; //集团积分规则是否共享
  249. params.put("integralFlagGroup", payOrderRequest.getIntegralFlagGroup()); // integralFlagGroup; //集团是否开启积分功能
  250. params.put("cardRuleFlagGroup", payOrderRequest.getCardRuleFlagGroup()); // cardRuleFlagGroup; //集团是否共享电子卡充值规则
  251. params.put("cardEnabledFlagGroup", payOrderRequest.getCardEnabledFlagGroup()); // cardEnabledFlagGroup; //集团是否开启电子卡
  252. if(payOrderRequest.getIsLngFlagGroup() !=null && payOrderRequest.getIsLngFlagGroup().equals("1")){
  253. // isLngFlagGroup 表示该集团是否为LNG平台加气:0,否;1,是;
  254. // settlementType:结算价类型(1.直降,2.折扣); settlementPrice:结算价; driverPrice:司机价;
  255. if(result.containsKey("settlementType") && result.get("settlementType") !=null && result.get("settlementType").toString() !=""){
  256. params.put("settlementType", result.get("settlementType").toString());
  257. }
  258. if(result.containsKey("settlementPrice") && result.get("settlementPrice") !=null && result.get("settlementPrice").toString() !=""){
  259. params.put("settlementPrice", result.get("settlementPrice").toString());
  260. }
  261. if(result.containsKey("driverPrice") && result.get("driverPrice") !=null && result.get("driverPrice").toString() !=""){
  262. params.put("driverPrice", result.get("driverPrice").toString());
  263. }
  264. payOrderResultInfo = this.calculateLngGroupStaDiscount(params);
  265. }else {
  266. CustomerLabel customerLabel = new CustomerLabel();
  267. customerLabel.setPhone(payOrderRequest.getCustomerPhone());
  268. customerLabel.setStationId(payOrderRequest.getStationId());
  269. //扫码进标签优惠:一码一签
  270. if(payOrderRequest.getLabelId() !=null){
  271. //如果前端传来labelId,则表示一码一签;
  272. params.put("labelId", payOrderRequest.getLabelId());
  273. payOrderResultInfo = this.calculateLabelDiscount(params);
  274. //是否强制将该扫码用户拉入此标签:0、否;1、是;
  275. if(payOrderResultInfo.getIsAddLabel() !=null && payOrderResultInfo.getIsAddLabel().equals("1")){
  276. labelService.updateCustomerLabel(customerLabel);
  277. }
  278. }else {
  279. //按照正常优惠计算
  280. CustomerLabel customerLabelInfo = labelService.getCustomerLabel(customerLabel); //获取该用户是否在标签组内
  281. if(payOrderRequest.getLabelFlag() !=null && payOrderRequest.getLabelFlag().equals("1") && customerLabelInfo !=null){
  282. //表示此用户为标签用户,计算标签用户优惠
  283. params.put("labelId", customerLabelInfo.getLabelId());
  284. payOrderResultInfo = this.calculateLabelDiscount(params);
  285. }else {
  286. //不为标签用户时
  287. switch (discountSetting){
  288. case "0": //不执营销方案时 计算等级优惠
  289. payOrderResultInfo = this.calculateGradeDiscount(params);
  290. break;
  291. case "1": //满减方案
  292. payOrderResultInfo = this.calculateManJianDiscount(params);
  293. break;
  294. case "2": //立减方案
  295. payOrderResultInfo = this.calculateLiJianDiscount(params);
  296. break;
  297. case "3": //独立直降
  298. payOrderResultInfo = this.calculateZhiJiangDiscount(params);
  299. break;
  300. case "4": //计算阶梯直降
  301. payOrderResultInfo = this.calculateJieTiZhiJiangDiscount(params);
  302. break;
  303. }
  304. }
  305. }
  306. }
  307. return payOrderResultInfo;
  308. }
  309. //计算集团下站点LNG平台加气
  310. public PayOrderResultInfo calculateLngGroupStaDiscount(Map<String ,Object> params){
  311. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  312. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  313. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  314. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  315. BigDecimal discountAmt = new BigDecimal(0); //油站销售价后优惠金额
  316. BigDecimal sellDiscountAmt = new BigDecimal(0); //油站销售价后优惠金额
  317. BigDecimal dzkDiscountAmt = new BigDecimal(0); //电子卡优惠金额
  318. BigDecimal amt = receivableAmt; //司机价后支付金额
  319. BigDecimal sellAmt = new BigDecimal(0); //油站结算价支付金额
  320. BigDecimal discountPrice = oilPrice; //司机销售价
  321. BigDecimal sellPrice = discountPrice; //油站销售价
  322. BigDecimal sellSumAmt = amt; //销售价支付金额
  323. BigDecimal sellSumDiscount = new BigDecimal("0"); //销售价优惠金额
  324. //加油升数
  325. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  326. // if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  327. // oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  328. // }
  329. // settlementType:结算价类型(1.直降,2.折扣); settlementPrice:结算价; driverPrice:司机价;
  330. if(params.containsKey("settlementType") && params.get("settlementType") !=null && params.get("settlementType").toString() !=""){
  331. String settlementType = params.get("settlementType").toString();
  332. switch (settlementType){
  333. case "1": //直降
  334. //优惠价(销售价)
  335. if(params.containsKey("settlementPrice") && params.get("settlementPrice").toString() !=null && params.get("settlementPrice").toString() !=""){
  336. sellPrice = oilPrice.subtract(new BigDecimal(params.get("settlementPrice").toString()));
  337. sellAmt = sellPrice.multiply(oilLiters); //优惠价实付金额
  338. sellDiscountAmt = receivableAmt.subtract(sellAmt);
  339. sellDiscountAmt = sellDiscountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  340. sellSumAmt = sellAmt; //优惠价实付金额
  341. sellSumDiscount = sellDiscountAmt; //优惠价优惠金额
  342. }
  343. break;
  344. case "2": //折扣
  345. //优惠价(销售价)
  346. if(params.containsKey("settlementPrice") && params.get("settlementPrice").toString() !=null && params.get("settlementPrice").toString() !=""){
  347. sellPrice = oilPrice.multiply(new BigDecimal(params.get("settlementPrice").toString())).divide(new BigDecimal("100"));
  348. sellAmt =sellPrice.multiply(oilLiters);
  349. sellDiscountAmt = receivableAmt.subtract(sellAmt);
  350. sellDiscountAmt = sellDiscountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  351. sellSumAmt = sellAmt;
  352. sellSumDiscount = sellDiscountAmt;
  353. }
  354. break;
  355. }
  356. }
  357. if(params.containsKey("driverPrice") && params.get("driverPrice").toString() !=null && params.get("driverPrice").toString() !=""){
  358. //司机价
  359. discountPrice = sellPrice.multiply(new BigDecimal(params.get("driverPrice").toString())).divide(new BigDecimal("100"));
  360. //amt = oilLiters.toString().equals("0.00")? new BigDecimal("0.01") : discountPrice.multiply(oilLiters);
  361. amt = sellSumAmt.multiply(new BigDecimal(params.get("driverPrice").toString())).divide(new BigDecimal("100"));
  362. //amt = discountPrice.multiply(oilLiters); //二次折扣优惠金额
  363. //amt.setScale(2, BigDecimal.ROUND_HALF_UP);
  364. discountAmt = receivableAmt.subtract(amt);
  365. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  366. discountPrice = discountPrice.setScale(2, BigDecimal.ROUND_HALF_UP);
  367. }
  368. //sellAmt = receivableAmt.subtract(sellDiscountAmt); //销售价实收金额 = 应收金额-销售价优惠金额
  369. sellAmt =sellAmt.signum() == -1 ? new BigDecimal("0.01"): sellAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  370. //amt = receivableAmt.subtract(discountAmt).subtract(sellDiscountAmt); //司机价实收金额 = 应收金额-司机价优惠金额-销售价优惠金额
  371. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt.setScale(2, BigDecimal.ROUND_HALF_UP);
  372. payOrderResultInfo.setReceivableAmt(receivableAmt.toString()); //应收金额
  373. payOrderResultInfo.setOilLiters(oilLiters.toString()); //加油升数
  374. payOrderResultInfo.setOilPrice(oilPrice.toString()); //油机价
  375. payOrderResultInfo.setAmt(amt.toString()); //司机价后时候金额
  376. payOrderResultInfo.setDiscountPrice(discountPrice.toString()); //司机价
  377. payOrderResultInfo.setDiscountAmt(discountAmt.toString()); //司机价后优惠金额
  378. payOrderResultInfo.setSellAmt(sellSumAmt.toString()); //销售价后支付金额
  379. sellPrice.setScale(2, BigDecimal.ROUND_HALF_UP); //销售价
  380. payOrderResultInfo.setSellPrice(sellPrice.toString()); //销售价
  381. payOrderResultInfo.setSellDiscountAmt(sellSumDiscount.toString()); //销售价后优惠金额
  382. //LNG加气平台没有电子卡功能:此下参数无用用作填充参数值 0:代表否;4:代表LNG油品
  383. payOrderResultInfo.setDzkAmt(amt.toString()); //电子卡支付金额
  384. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString()); //电子卡优惠金额
  385. payOrderResultInfo.setBalance("0");
  386. payOrderResultInfo.setCardOilsType("4");
  387. payOrderResultInfo.setOilsCardFlag("0");
  388. payOrderResultInfo.setCardEnabledFlag("0");
  389. return payOrderResultInfo;
  390. }
  391. //计算标签用户优惠
  392. public PayOrderResultInfo calculateLabelDiscount(Map<String ,Object> params){
  393. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  394. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  395. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  396. BigDecimal discountAmt = new BigDecimal(0); //标签方案优惠金额
  397. BigDecimal dzkDiscountAmt = new BigDecimal(0); //电子卡优惠金额
  398. BigDecimal amt = new BigDecimal(0);
  399. BigDecimal discountPrice = oilPrice;
  400. //加油升数
  401. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  402. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  403. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  404. }
  405. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  406. //获取该油站的标签规则
  407. LabelRule labelRule = new LabelRule();
  408. labelRule.setStationId(Integer.valueOf(params.get("stationId").toString())); //油站ID
  409. labelRule.setOilName(params.get("oilName").toString()); //oilName
  410. labelRule.setLabelId(Integer.valueOf(params.get("labelId").toString()));//
  411. List<LabelRule> labelRuleList = labelService.getLabelRuleList(labelRule);
  412. if(labelRuleList !=null && labelRuleList.size()> 0){
  413. payOrderResultInfo.setIsAddLabel(labelRuleList.get(0).getIsAddLabel()); //'是否强制将该扫码用户拉入此标签:0、否;1、是
  414. //获取该油品的优惠明细
  415. List<LabelRuleDetail> labelRuleDetailList = labelRuleList.get(0).getLabelRuleDetailList();
  416. if(labelRuleDetailList !=null && labelRuleDetailList.size() ==1){
  417. BigDecimal discountAmt_B = new BigDecimal(labelRuleDetailList.get(0).getDiscountAmt()); //满足享受优惠条件(满多少升、满多少元)
  418. String discountTerm = labelRuleDetailList.get(0).getDiscountTerm();
  419. switch (discountTerm){
  420. case "1": //按加油升数
  421. if(oilLiters.compareTo(discountAmt_B) ==1 || oilLiters.compareTo(discountAmt_B) ==0 ){
  422. discountPrice = oilPrice.subtract(new BigDecimal(labelRuleDetailList.get(0).getDiscountLitersAmt()));
  423. discountAmt = oilLiters.multiply(new BigDecimal(labelRuleDetailList.get(0).getDiscountLitersAmt()));
  424. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  425. }
  426. break;
  427. case "2": //按加油金额
  428. if(receivableAmt.compareTo(discountAmt_B) ==1 || receivableAmt.compareTo(discountAmt_B) ==0 ){
  429. discountPrice = oilPrice.subtract(new BigDecimal(labelRuleDetailList.get(0).getDiscountLitersAmt()));
  430. discountAmt = oilLiters.multiply(new BigDecimal(labelRuleDetailList.get(0).getDiscountLitersAmt()));
  431. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  432. }
  433. break;
  434. }
  435. dzkDiscountAmt = discountAmt; //赋值电子卡优惠金额
  436. }
  437. }
  438. amt = receivableAmt.subtract(discountAmt); //应收金额
  439. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  440. //discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  441. payOrderResultInfo.setAmt(amt.toString());
  442. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  443. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  444. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  445. payOrderResultInfo.setOilLiters(oilLiters.toString());
  446. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  447. payOrderResultInfo.setOilPrice(oilPrice.toString());
  448. payOrderResultInfo.setDzkAmt(amt.toString());
  449. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString());
  450. payOrderResultInfo.setOilsCardFlag("0");
  451. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  452. //表示开启共享
  453. if(params.get("cardEnabledFlagGroup").toString().equals("1")){ //表示开启电子卡功能
  454. payOrderResultInfo.setCardEnabledFlag("1");
  455. }else {
  456. payOrderResultInfo.setCardEnabledFlag("0");
  457. }
  458. }else {
  459. //不共享,则查看油站电子卡是否开启
  460. if(params.get("cardEnabledFlag").toString().equals("1")){
  461. payOrderResultInfo.setCardEnabledFlag("1");
  462. }else {
  463. payOrderResultInfo.setCardEnabledFlag("0");
  464. }
  465. }
  466. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  467. if(payOrderResultInfo.getCardEnabledFlag().equals("1")){
  468. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  469. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  470. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  471. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  472. }
  473. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  474. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  475. String isLabel = cardRechargeSettingList.get(0).getIsLabel(); //标签用户支付时是否享受标签优惠
  476. if(isLabel.equals("1")){
  477. //电子卡支付金额 = 应收金额 - 标签优惠金额
  478. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt);
  479. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt; //如果为负数,则默认设置0.01元
  480. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  481. BigDecimal dzkDiscountAmtSum = dzkDiscountAmt; //电子卡总优惠金额
  482. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmtSum.toString());
  483. }else {
  484. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  485. payOrderResultInfo.setDzkDiscountAmt("0");
  486. }
  487. }
  488. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  489. customerElectronicCard.setStationId(Integer.valueOf(params.get("stationId").toString()));
  490. customerElectronicCard.setCardOilsType(params.get("cardOilsType").toString());
  491. customerElectronicCard.setUnionId(params.get("unionId").toString());
  492. customerElectronicCard.setMobilePhone(params.get("userPhone").toString());
  493. customerElectronicCard.setCustomerName(params.get("customerName").toString());
  494. //查询客户余额和卡的类型
  495. Map<String, String> map = this.selectCardBalance(customerElectronicCard, params);
  496. payOrderResultInfo.setBalance(map.get("balance"));
  497. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  498. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  499. }
  500. return payOrderResultInfo;
  501. }
  502. //计算阶梯直降
  503. public PayOrderResultInfo calculateJieTiZhiJiangDiscount(Map<String ,Object> params){
  504. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo(); //计算结果存放值
  505. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  506. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  507. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  508. BigDecimal discountAmt = new BigDecimal(0); //营销方案优惠金额
  509. BigDecimal amt = new BigDecimal(0);
  510. BigDecimal discountPrice = oilPrice;
  511. BigDecimal gradeDiscountAmt = new BigDecimal(0); //等级优惠金额
  512. BigDecimal gradeDiscountPriceAmt = new BigDecimal(0); //等级优惠价格
  513. BigDecimal dzkGradeDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需等级优惠金额值
  514. BigDecimal dzkDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需营销优惠金额值
  515. //加油升数
  516. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  517. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  518. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  519. }
  520. //计算等级优惠
  521. PayOrderResultInfo payOrderResultInfoGrade = this.calculateGradeDiscount(params);
  522. gradeDiscountAmt = new BigDecimal(payOrderResultInfoGrade.getDiscountAmt());
  523. gradeDiscountPriceAmt = new BigDecimal(payOrderResultInfoGrade.getGradeDiscountPriceAmt());
  524. dzkGradeDiscountAmt = gradeDiscountAmt; //同时给电子卡赋值等级优惠金额
  525. params.put("discountPlanType", "4");
  526. List<Map> customerMarkertPlanList = customerGradeServices.getCustomerMarkertPlanList(params);
  527. if(customerMarkertPlanList !=null && customerMarkertPlanList.size() >0){
  528. for(Map m : customerMarkertPlanList){
  529. BigDecimal discountAmt_b = new BigDecimal(m.get("discountAmt").toString()); //条件金额
  530. BigDecimal gasoilDiscountAmt_b = new BigDecimal(m.get("gasoilDiscountAmt").toString());
  531. String discountTerm = m.get("discountTerm").toString();
  532. if(discountTerm.equals("1")){
  533. if(oilLiters.compareTo(discountAmt_b) ==1 || oilLiters.compareTo(discountAmt_b) ==0){
  534. discountPrice = oilPrice.subtract(gasoilDiscountAmt_b);
  535. discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  536. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  537. dzkDiscountAmt = discountAmt; //赋值电子卡优惠金额
  538. String vipDiscountyPlus = m.get("vipDiscountyPlus").toString();
  539. //该营销方案是否叠加等级优惠
  540. if(vipDiscountyPlus.equals("1")){
  541. //如果叠加等级优惠
  542. discountPrice = discountPrice.subtract(gradeDiscountPriceAmt);
  543. discountAmt = discountAmt.add(gradeDiscountAmt);
  544. }
  545. break;
  546. }
  547. }else if(discountTerm.equals("2")){
  548. if(receivableAmt.compareTo(discountAmt_b) ==1 || receivableAmt.compareTo(discountAmt_b) ==0){
  549. discountPrice = oilPrice.subtract(gasoilDiscountAmt_b);
  550. discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  551. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  552. dzkDiscountAmt = discountAmt; //赋值电子卡优惠金额
  553. String vipDiscountyPlus = m.get("vipDiscountyPlus").toString();
  554. //该营销方案是否叠加等级优惠
  555. if(vipDiscountyPlus.equals("1")){
  556. //如果叠加等级优惠
  557. discountPrice = discountPrice.subtract(gradeDiscountPriceAmt);
  558. discountAmt = discountAmt.add(gradeDiscountAmt);
  559. }
  560. break;
  561. }
  562. }
  563. }
  564. }
  565. amt = receivableAmt.subtract(discountAmt); //应收金额
  566. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  567. //discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  568. payOrderResultInfo.setAmt(amt.toString());
  569. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  570. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  571. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  572. payOrderResultInfo.setOilLiters(oilLiters.toString());
  573. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  574. payOrderResultInfo.setOilPrice(oilPrice.toString());
  575. payOrderResultInfo.setDzkAmt(amt.toString());
  576. payOrderResultInfo.setOilsCardFlag("0");
  577. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  578. //表示开启共享
  579. if(params.get("cardEnabledFlagGroup").toString().equals("1")){ //表示开启电子卡功能
  580. payOrderResultInfo.setCardEnabledFlag("1");
  581. }else {
  582. payOrderResultInfo.setCardEnabledFlag("0");
  583. }
  584. }else {
  585. //不共享,则查看油站电子卡是否开启
  586. if(params.get("cardEnabledFlag").toString().equals("1")){
  587. payOrderResultInfo.setCardEnabledFlag("1");
  588. }else {
  589. payOrderResultInfo.setCardEnabledFlag("0");
  590. }
  591. }
  592. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  593. if(payOrderResultInfo.getCardEnabledFlag().equals("1")){
  594. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  595. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  596. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  597. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  598. }
  599. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  600. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  601. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting(); //是否叠加等级方案
  602. String isMarket = cardRechargeSettingList.get(0).getIsMarket(); //等候否叠加营销方案
  603. if(isMarket.equals("1")){
  604. if(isGradeSetting.equals("1")){
  605. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt).subtract(dzkGradeDiscountAmt);
  606. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  607. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  608. BigDecimal dzkDiscountAmtSum = dzkDiscountAmt.add(dzkGradeDiscountAmt); //电子卡优惠金额
  609. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmtSum.toString());
  610. }else {
  611. //如果电子卡设置执行营销方案不执行等级优惠 则 电子卡支付金额 =实收金额-营销优惠金额
  612. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt);
  613. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  614. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  615. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString());
  616. }
  617. }else {
  618. if(isGradeSetting.equals("1")){
  619. //如果电子卡设置不执行营销方案执行等级优惠 则 电子卡支付金额 =应收金额-等级优惠金额
  620. BigDecimal dzkAmt = receivableAmt.subtract(dzkGradeDiscountAmt);
  621. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  622. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  623. payOrderResultInfo.setDzkDiscountAmt(dzkGradeDiscountAmt.toString());
  624. }else {
  625. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  626. payOrderResultInfo.setDzkDiscountAmt("0");
  627. }
  628. }
  629. }
  630. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  631. customerElectronicCard.setStationId(Integer.valueOf(params.get("stationId").toString()));
  632. customerElectronicCard.setCardOilsType(params.get("cardOilsType").toString());
  633. customerElectronicCard.setUnionId(params.get("unionId").toString());
  634. customerElectronicCard.setMobilePhone(params.get("userPhone").toString());
  635. customerElectronicCard.setCustomerName(params.get("customerName").toString());
  636. //查询客户余额和卡的类型
  637. Map<String, String> map = this.selectCardBalance(customerElectronicCard, params);
  638. payOrderResultInfo.setBalance(map.get("balance"));
  639. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  640. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  641. }
  642. return payOrderResultInfo;
  643. }
  644. //计算独立直降
  645. public PayOrderResultInfo calculateZhiJiangDiscount(Map<String ,Object> params){
  646. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  647. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  648. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  649. BigDecimal discountAmt = new BigDecimal(0); //营销方案优惠金额
  650. BigDecimal amt = new BigDecimal(0);
  651. BigDecimal discountPrice = oilPrice;
  652. BigDecimal gradeDiscountAmt = new BigDecimal(0); //等级优惠金额
  653. BigDecimal gradeDiscountPriceAmt = new BigDecimal("0");
  654. BigDecimal dzkGradeDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需等级优惠金额值
  655. BigDecimal dzkDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需营销优惠金额值
  656. //加油升数
  657. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  658. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  659. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  660. }
  661. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo(); //计算结果存放值
  662. //计算等级优惠
  663. PayOrderResultInfo payOrderResultInfoGrade = this.calculateGradeDiscount(params);
  664. gradeDiscountAmt = new BigDecimal(payOrderResultInfoGrade.getDiscountAmt());
  665. gradeDiscountPriceAmt = new BigDecimal(payOrderResultInfoGrade.getGradeDiscountPriceAmt());
  666. dzkGradeDiscountAmt = gradeDiscountAmt; //同时给电子卡赋值等级优惠金额
  667. params.put("discountPlanType", "3");
  668. List<Map> customerMarkertPlanList = customerGradeServices.getCustomerMarkertPlanList(params);
  669. if(customerMarkertPlanList !=null && customerMarkertPlanList.size() >0){
  670. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("discountAmt").toString()); //条件金额
  671. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("gasoilDiscountAmt").toString());
  672. String discountTerm = customerMarkertPlanList.get(0).get("discountTerm").toString();
  673. String discountSettingFlag;
  674. switch (discountTerm){
  675. case "1": //按加油升数
  676. if(oilLiters.compareTo(discountAmt_b) ==1 || oilLiters.compareTo(discountAmt_b) ==0){
  677. discountPrice = oilPrice.subtract(gasoilDiscountAmt_b);
  678. discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  679. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  680. //会员活动是否开启:1是;0否'
  681. if(customerMarkertPlanList.get(0).containsKey("discountSettingFlag") && customerMarkertPlanList.get(0).get("discountSettingFlag").toString() !="") {
  682. discountSettingFlag = customerMarkertPlanList.get(0).get("discountSettingFlag").toString();
  683. if (discountSettingFlag != null && discountSettingFlag.equals("1")) {
  684. String discountType = customerMarkertPlanList.get(0).get("discountType").toString(); //会员日周期类型设置
  685. String discountDate = customerMarkertPlanList.get(0).get("discountDate").toString(); //按固定日期
  686. String discountActivityAmt = customerMarkertPlanList.get(0).get("discountActivityAmt").toString(); //会员日优惠金额
  687. if (StringUtils.isNotBlank(discountType) && StringUtils.isNotBlank(discountDate) && StringUtils.isNotBlank(discountActivityAmt)) {
  688. //当前时间是否是活动会员日
  689. boolean b = isActivityDay(discountType, discountDate);
  690. if (b) {
  691. discountPrice = oilPrice.subtract(new BigDecimal(discountActivityAmt));
  692. discountAmt = oilLiters.multiply(new BigDecimal(discountActivityAmt));
  693. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  694. }
  695. }
  696. }
  697. }
  698. }
  699. break;
  700. case "2": //按加油金额
  701. if(receivableAmt.compareTo(discountAmt_b) ==1 || receivableAmt.compareTo(discountAmt_b) ==0){
  702. discountPrice = oilPrice.subtract(gasoilDiscountAmt_b);
  703. discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  704. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  705. //会员活动是否开启:1是;0否'
  706. if(customerMarkertPlanList.get(0).containsKey("discountSettingFlag") && customerMarkertPlanList.get(0).get("discountSettingFlag").toString() !="") {
  707. discountSettingFlag = customerMarkertPlanList.get(0).get("discountSettingFlag").toString();
  708. if (discountSettingFlag != null && discountSettingFlag.equals("1")) {
  709. String discountType = customerMarkertPlanList.get(0).get("discountType").toString(); //会员日周期类型设置
  710. String discountDate = customerMarkertPlanList.get(0).get("discountDate").toString(); //按固定日期
  711. String discountActivityAmt = customerMarkertPlanList.get(0).get("discountActivityAmt").toString(); //会员日优惠金额
  712. if (StringUtils.isNotBlank(discountType) && StringUtils.isNotBlank(discountDate) && StringUtils.isNotBlank(discountActivityAmt)) {
  713. //当前时间是否是活动会员日
  714. boolean b = isActivityDay(discountType, discountDate);
  715. if (b) {
  716. discountPrice = oilPrice.subtract(new BigDecimal(discountActivityAmt));
  717. discountAmt = oilLiters.multiply(new BigDecimal(discountActivityAmt));
  718. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  719. }
  720. }
  721. }
  722. }
  723. }
  724. break;
  725. }
  726. dzkDiscountAmt = discountAmt; //赋值电子卡优惠金额
  727. String vipDiscountyPlus = customerMarkertPlanList.get(0).get("vipDiscountyPlus").toString();
  728. //该营销方案是否叠加等级优惠
  729. if(vipDiscountyPlus.equals("1")){
  730. //如果叠加等级优惠
  731. discountPrice = discountPrice.subtract(gradeDiscountPriceAmt);
  732. discountAmt = discountAmt.add(gradeDiscountAmt);
  733. }
  734. }
  735. amt = receivableAmt.subtract(discountAmt); //应收金额
  736. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  737. //discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  738. payOrderResultInfo.setAmt(amt.toString());
  739. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  740. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  741. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  742. payOrderResultInfo.setOilLiters(oilLiters.toString());
  743. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  744. payOrderResultInfo.setOilPrice(oilPrice.toString());
  745. payOrderResultInfo.setDzkAmt(amt.toString());
  746. payOrderResultInfo.setOilsCardFlag("0");
  747. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  748. //表示开启共享
  749. if(params.get("cardEnabledFlagGroup").toString().equals("1")){ //表示开启电子卡功能
  750. payOrderResultInfo.setCardEnabledFlag("1");
  751. }else {
  752. payOrderResultInfo.setCardEnabledFlag("0");
  753. }
  754. }else {
  755. //不共享,则查看油站电子卡是否开启
  756. if(params.get("cardEnabledFlag").toString().equals("1")){
  757. payOrderResultInfo.setCardEnabledFlag("1");
  758. }else {
  759. payOrderResultInfo.setCardEnabledFlag("0");
  760. }
  761. }
  762. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  763. if(payOrderResultInfo.getCardEnabledFlag().equals("1")){
  764. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  765. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  766. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  767. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  768. }
  769. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  770. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  771. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting(); //是否叠加等级方案
  772. String isMarket = cardRechargeSettingList.get(0).getIsMarket(); //等候否叠加营销方案
  773. if(isMarket.equals("1")){
  774. if(isGradeSetting.equals("1")){
  775. //都叠加 电子卡支付金额 = 应收金额 - 营销优惠金额 - 等级优惠金额
  776. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt).subtract(dzkGradeDiscountAmt);
  777. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt; //如果为负数,则默认设置0.01元
  778. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  779. BigDecimal dzkDiscountAmtSum = dzkDiscountAmt.add(dzkGradeDiscountAmt); //电子卡总优惠金额
  780. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmtSum.toString());
  781. }else {
  782. //叠加营销方案不叠加等级优惠: 电子卡支付金额 =实收金额-营销优惠金额
  783. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt);
  784. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  785. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  786. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString());
  787. }
  788. }else {
  789. if(isGradeSetting.equals("1")){
  790. //不叠加营销方案叠加等级优惠:电子卡支付金额 =应收金额-等级优惠金额
  791. BigDecimal dzkAmt = receivableAmt.subtract(dzkGradeDiscountAmt);
  792. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  793. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  794. payOrderResultInfo.setDzkDiscountAmt(dzkGradeDiscountAmt.toString());
  795. }else {
  796. //都不叠加: 电子卡支付金额 = 应收金额
  797. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  798. payOrderResultInfo.setDzkDiscountAmt("0");
  799. }
  800. }
  801. }
  802. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  803. customerElectronicCard.setStationId(Integer.valueOf(params.get("stationId").toString()));
  804. customerElectronicCard.setCardOilsType(params.get("cardOilsType").toString());
  805. customerElectronicCard.setUnionId(params.get("unionId").toString());
  806. customerElectronicCard.setMobilePhone(params.get("userPhone").toString());
  807. customerElectronicCard.setCustomerName(params.get("customerName").toString());
  808. //查询客户余额和卡的类型
  809. Map<String, String> map = this.selectCardBalance(customerElectronicCard, params);
  810. payOrderResultInfo.setBalance(map.get("balance"));
  811. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  812. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  813. }
  814. return payOrderResultInfo;
  815. }
  816. //计算立减
  817. public PayOrderResultInfo calculateLiJianDiscount(Map<String ,Object> params){
  818. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  819. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  820. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  821. BigDecimal discountAmt = new BigDecimal(0); //优惠金额
  822. BigDecimal amt = new BigDecimal(0);
  823. BigDecimal discountPrice = oilPrice;
  824. BigDecimal gradeDiscountAmt = new BigDecimal(0); //等级优惠金额
  825. BigDecimal dzkGradeDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需等级优惠金额值
  826. BigDecimal dzkDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需营销优惠金额值
  827. //加油升数
  828. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  829. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  830. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  831. }
  832. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  833. //计算等级优惠
  834. PayOrderResultInfo payOrderResultInfoGrade = this.calculateGradeDiscount(params);
  835. gradeDiscountAmt = new BigDecimal(payOrderResultInfoGrade.getDiscountAmt());
  836. dzkGradeDiscountAmt = gradeDiscountAmt; //同时给电子卡赋值等级优惠金额
  837. params.put("discountPlanType", "2");
  838. List<Map> customerMarkertPlanList = customerGradeServices.getCustomerMarkertPlanList(params);
  839. if(customerMarkertPlanList !=null && customerMarkertPlanList.size() >0){
  840. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("discountAmt").toString()); //条件金额
  841. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("gasoilDiscountAmt").toString()); //享受的优惠
  842. if(receivableAmt.compareTo(discountAmt_b) == 1 || receivableAmt.compareTo(discountAmt_b) == 0){
  843. discountAmt = gasoilDiscountAmt_b;
  844. //会员活动是否开启:1是;0否'
  845. if(customerMarkertPlanList.get(0).containsKey("discountSettingFlag") && customerMarkertPlanList.get(0).get("discountSettingFlag").toString() !="") {
  846. String discountSettingFlag = customerMarkertPlanList.get(0).get("discountSettingFlag").toString();
  847. if (discountSettingFlag != null && discountSettingFlag.equals("1")) {
  848. String discountType = customerMarkertPlanList.get(0).get("discountType").toString(); //会员日周期类型设置
  849. String discountDate = customerMarkertPlanList.get(0).get("discountDate").toString(); //按固定日期
  850. String discountActivityAmt = customerMarkertPlanList.get(0).get("discountActivityAmt").toString(); //会员日优惠金额
  851. if (StringUtils.isNotBlank(discountType) && StringUtils.isNotBlank(discountDate) && StringUtils.isNotBlank(discountActivityAmt)) {
  852. //当前时间是否是会员日
  853. boolean b = isActivityDay(discountType, discountDate);
  854. if (b) {
  855. discountAmt = new BigDecimal(discountActivityAmt);
  856. }
  857. }
  858. }
  859. }
  860. }
  861. dzkDiscountAmt = discountAmt;
  862. String vipDiscountyPlus = customerMarkertPlanList.get(0).get("vipDiscountyPlus").toString();
  863. if(vipDiscountyPlus.equals("1")){
  864. //如果叠加等级优惠
  865. discountAmt = discountAmt.add(gradeDiscountAmt);
  866. }
  867. }
  868. amt = receivableAmt.subtract(discountAmt); //应收金额
  869. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  870. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  871. payOrderResultInfo.setAmt(amt.toString());
  872. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  873. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  874. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  875. payOrderResultInfo.setOilLiters(oilLiters.toString());
  876. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  877. payOrderResultInfo.setOilPrice(oilPrice.toString());
  878. payOrderResultInfo.setDzkAmt(amt.toString());
  879. payOrderResultInfo.setOilsCardFlag("0");
  880. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  881. //表示开启共享
  882. if(params.get("cardEnabledFlagGroup").toString().equals("1")){ //表示开启电子卡功能
  883. payOrderResultInfo.setCardEnabledFlag("1");
  884. }else {
  885. payOrderResultInfo.setCardEnabledFlag("0");
  886. }
  887. }else {
  888. //不共享,则查看油站电子卡是否开启
  889. if(params.get("cardEnabledFlag").toString().equals("1")){
  890. payOrderResultInfo.setCardEnabledFlag("1");
  891. }else {
  892. payOrderResultInfo.setCardEnabledFlag("0");
  893. }
  894. }
  895. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  896. if(payOrderResultInfo.getCardEnabledFlag().equals("1")){
  897. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  898. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  899. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  900. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  901. }
  902. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  903. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  904. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting(); //是否叠加等级方案
  905. String isMarket = cardRechargeSettingList.get(0).getIsMarket(); //等候否叠加营销方案
  906. if(isMarket.equals("1")){
  907. if(isGradeSetting.equals("1")){
  908. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt).subtract(dzkGradeDiscountAmt);
  909. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  910. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  911. BigDecimal dzkDiscountAmtSum = dzkDiscountAmt.add(dzkGradeDiscountAmt); //电子卡优惠金额
  912. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmtSum.toString());
  913. }else {
  914. //如果电子卡设置执行营销方案不执行等级优惠 则 电子卡支付金额 =实收金额-营销优惠金额
  915. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt);
  916. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  917. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  918. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString());
  919. }
  920. }else {
  921. if(isGradeSetting.equals("1")){
  922. //如果电子卡设置不执行营销方案执行等级优惠 则 电子卡支付金额 =应收金额-等级优惠金额
  923. BigDecimal dzkAmt = receivableAmt.subtract(dzkGradeDiscountAmt);
  924. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  925. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  926. payOrderResultInfo.setDzkDiscountAmt(dzkGradeDiscountAmt.toString());
  927. }else {
  928. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  929. payOrderResultInfo.setDzkDiscountAmt("0");
  930. }
  931. }
  932. }
  933. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  934. customerElectronicCard.setStationId(Integer.valueOf(params.get("stationId").toString()));
  935. customerElectronicCard.setCardOilsType(params.get("cardOilsType").toString());
  936. customerElectronicCard.setUnionId(params.get("unionId").toString());
  937. customerElectronicCard.setMobilePhone(params.get("userPhone").toString());
  938. customerElectronicCard.setCustomerName(params.get("customerName").toString());
  939. //查询客户余额和卡的类型
  940. Map<String, String> map = this.selectCardBalance(customerElectronicCard, params);
  941. payOrderResultInfo.setBalance(map.get("balance"));
  942. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  943. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  944. }
  945. return payOrderResultInfo;
  946. }
  947. //计算满减
  948. public PayOrderResultInfo calculateManJianDiscount(Map<String ,Object> params){
  949. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  950. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  951. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  952. BigDecimal discountAmt = new BigDecimal(0); //优惠金额
  953. BigDecimal amt = new BigDecimal(0);
  954. BigDecimal discountPrice = oilPrice;
  955. BigDecimal gradeDiscountAmt = new BigDecimal(0); //等级优惠金额
  956. BigDecimal dzkGradeDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需等级优惠金额值
  957. BigDecimal dzkDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需营销优惠金额值
  958. //加油升数
  959. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  960. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  961. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  962. }
  963. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  964. //计算等级优惠
  965. PayOrderResultInfo payOrderResultInfoGrade = this.calculateGradeDiscount(params);
  966. gradeDiscountAmt = new BigDecimal(payOrderResultInfoGrade.getDiscountAmt());
  967. dzkGradeDiscountAmt = gradeDiscountAmt;
  968. params.put("discountPlanType", "1");
  969. List<Map> customerMarkertPlanList = customerGradeServices.getCustomerMarkertPlanList(params);
  970. if(customerMarkertPlanList !=null && customerMarkertPlanList.size() >0){
  971. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("discountAmt").toString()); //条件金额
  972. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("gasoilDiscountAmt").toString()); //享受的优惠
  973. if(receivableAmt.compareTo(discountAmt_b) == 1 || receivableAmt.compareTo(discountAmt_b) == 0){
  974. discountAmt = receivableAmt.divide(discountAmt_b, 2, BigDecimal.ROUND_HALF_UP).multiply(gasoilDiscountAmt_b); //优惠金额
  975. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  976. //会员活动是否开启:1是;0否'
  977. if(customerMarkertPlanList.get(0).containsKey("discountSettingFlag") && customerMarkertPlanList.get(0).get("discountSettingFlag").toString() !=""){
  978. String discountSettingFlag = customerMarkertPlanList.get(0).get("discountSettingFlag").toString();
  979. if(discountSettingFlag !=null && discountSettingFlag.equals("1")){
  980. String discountType = customerMarkertPlanList.get(0).get("discountType").toString(); //会员日周期类型设置
  981. String discountDate = customerMarkertPlanList.get(0).get("discountDate").toString(); //按固定日期
  982. String discountActivityAmt = customerMarkertPlanList.get(0).get("discountActivityAmt").toString(); //会员日优惠金额
  983. //当前时间是否是会员日
  984. if(StringUtils.isNotBlank(discountType) && StringUtils.isNotBlank(discountDate) && StringUtils.isNotBlank(discountActivityAmt)){
  985. boolean b = isActivityDay(discountType, discountDate);
  986. if(b){
  987. discountAmt = receivableAmt.divide(discountAmt_b, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(discountActivityAmt)); //优惠金额
  988. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  989. }
  990. }
  991. }
  992. }
  993. }
  994. dzkDiscountAmt = discountAmt;
  995. //是否共享会员等级优惠叠加: 1 代表是; 2 代表否;
  996. String vipDiscountyPlus = customerMarkertPlanList.get(0).get("vipDiscountyPlus").toString();
  997. if(vipDiscountyPlus.equals("1")){
  998. //如果叠加等级优惠
  999. discountAmt = discountAmt.add(gradeDiscountAmt);
  1000. }
  1001. }
  1002. amt = receivableAmt.subtract(discountAmt); //应收金额
  1003. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  1004. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  1005. payOrderResultInfo.setAmt(amt.toString());
  1006. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  1007. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  1008. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  1009. payOrderResultInfo.setOilLiters(oilLiters.toString());
  1010. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  1011. payOrderResultInfo.setOilPrice(oilPrice.toString());
  1012. payOrderResultInfo.setDzkAmt(amt.toString());
  1013. payOrderResultInfo.setOilsCardFlag("0");
  1014. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  1015. //表示开启共享
  1016. if(params.get("cardEnabledFlagGroup").toString().equals("1")){ //表示开启电子卡功能
  1017. payOrderResultInfo.setCardEnabledFlag("1");
  1018. }else {
  1019. payOrderResultInfo.setCardEnabledFlag("0");
  1020. }
  1021. }else {
  1022. //不共享,则查看油站电子卡是否开启
  1023. if(params.get("cardEnabledFlag").toString().equals("1")){
  1024. payOrderResultInfo.setCardEnabledFlag("1");
  1025. }else {
  1026. payOrderResultInfo.setCardEnabledFlag("0");
  1027. }
  1028. }
  1029. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  1030. if(payOrderResultInfo.getCardEnabledFlag().equals("1")){
  1031. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  1032. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  1033. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  1034. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  1035. }
  1036. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  1037. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  1038. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting(); //是否叠加等级方案
  1039. String isMarket = cardRechargeSettingList.get(0).getIsMarket(); //等候否叠加营销方案
  1040. if(isMarket.equals("1")){
  1041. if(isGradeSetting.equals("1")){
  1042. //如果电子卡设置执行营销方案不执行等级优惠 则 电子卡支付金额 =实收金额-营销优惠-等级优惠金额
  1043. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt).subtract(dzkGradeDiscountAmt);
  1044. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  1045. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  1046. BigDecimal dzkDiscountAmtSum = dzkDiscountAmt.add(dzkGradeDiscountAmt); //电子卡优惠金额
  1047. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmtSum.toString());
  1048. }else {
  1049. //如果电子卡设置执行营销方案不执行等级优惠 则 电子卡支付金额 =实收金额-营销优惠金额
  1050. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt);
  1051. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  1052. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  1053. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString());
  1054. }
  1055. }else {
  1056. if(isGradeSetting.equals("1")){
  1057. //如果电子卡设置不执行营销方案执行等级优惠 则 电子卡支付金额 =应收金额-等级优惠金额
  1058. BigDecimal dzkAmt = receivableAmt.subtract(dzkGradeDiscountAmt);
  1059. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  1060. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  1061. payOrderResultInfo.setDzkDiscountAmt(dzkGradeDiscountAmt.toString());
  1062. }else {
  1063. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  1064. payOrderResultInfo.setDzkDiscountAmt("0");
  1065. }
  1066. }
  1067. }
  1068. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  1069. customerElectronicCard.setStationId(Integer.valueOf(params.get("stationId").toString()));
  1070. customerElectronicCard.setCardOilsType(params.get("cardOilsType").toString());
  1071. customerElectronicCard.setUnionId(params.get("unionId").toString());
  1072. customerElectronicCard.setMobilePhone(params.get("userPhone").toString());
  1073. customerElectronicCard.setCustomerName(params.get("customerName").toString());
  1074. //查询客户余额和卡的类型
  1075. Map<String, String> map = this.selectCardBalance(customerElectronicCard, params);
  1076. payOrderResultInfo.setBalance(map.get("balance"));
  1077. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  1078. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  1079. }
  1080. return payOrderResultInfo;
  1081. }
  1082. //计算等级优惠
  1083. public PayOrderResultInfo calculateGradeDiscount(Map<String ,Object> params){
  1084. String oilName = params.get("oilName").toString();
  1085. String stationId = params.get("stationId").toString();
  1086. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  1087. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  1088. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  1089. BigDecimal discountAmt = new BigDecimal(0); //优惠金额
  1090. BigDecimal dzkDiscountAmt = discountAmt; //优惠金额
  1091. BigDecimal amt = new BigDecimal(0);
  1092. BigDecimal discountPrice = oilPrice;
  1093. BigDecimal gradeDiscountPriceAmt = new BigDecimal("0"); //价格优惠金额
  1094. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  1095. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  1096. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  1097. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  1098. }
  1099. //当前客户是否已存在当前油站客户信息中
  1100. CustomerManage customerManage = new CustomerManage();
  1101. //customerManage.setPhoneNumber(params.get("mobilePhone").toString());
  1102. customerManage.setUnionId(params.get("unionId").toString());
  1103. customerManage.setOilName(oilName);
  1104. customerManage.setStationId(Integer.valueOf(stationId));
  1105. CustomerManage customerManageInfo = customerManagerService.getCustomerManageInfo(customerManage);
  1106. if(customerManageInfo !=null){
  1107. //当前客户所加油的订单已存在等级时
  1108. double amtSum = customerManageInfo.getAmt().doubleValue(); //当前客户已累计的金额
  1109. List<Map> cList = customerGradeServices.getCustomerGradeListOrderByDesc(params); //获取油站的等级优惠方案 倒叙查询规则
  1110. if(cList !=null && cList.size() >0){ //当前油站设置等级方案时
  1111. for(Map m : cList){
  1112. if(amtSum >= Double.valueOf(m.get("memberConditStart").toString())){
  1113. discountPrice = oilPrice.subtract(new BigDecimal(m.get("discountAmt").toString()));
  1114. gradeDiscountPriceAmt = new BigDecimal(m.get("discountAmt").toString());
  1115. discountAmt = oilLiters.multiply(new BigDecimal(m.get("discountAmt").toString()));
  1116. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  1117. break;
  1118. }
  1119. }
  1120. }
  1121. }else {
  1122. //当前客户所加油的订单不存在等级时
  1123. List<Map> customerGradeList = customerGradeServices.getCustomerGradeList(params); //升序查询 取第一条
  1124. if(customerGradeList !=null && customerGradeList.size() >0){
  1125. discountPrice = oilPrice.subtract(new BigDecimal(customerGradeList.get(0).get("discountAmt").toString()));
  1126. gradeDiscountPriceAmt = new BigDecimal(customerGradeList.get(0).get("discountAmt").toString());
  1127. discountAmt = oilLiters.multiply(new BigDecimal(customerGradeList.get(0).get("discountAmt").toString()));
  1128. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  1129. }
  1130. }
  1131. amt = receivableAmt.subtract(discountAmt); //应收金额
  1132. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  1133. //discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  1134. payOrderResultInfo.setGradeDiscountPriceAmt(gradeDiscountPriceAmt.toString());
  1135. payOrderResultInfo.setAmt(amt.toString());
  1136. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  1137. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  1138. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  1139. payOrderResultInfo.setOilLiters(oilLiters.toString());
  1140. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  1141. payOrderResultInfo.setOilPrice(oilPrice.toString());
  1142. payOrderResultInfo.setDzkAmt(amt.toString());
  1143. payOrderResultInfo.setOilsCardFlag("0");
  1144. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  1145. //表示开启共享
  1146. if(params.get("cardEnabledFlagGroup").toString().equals("1")){ //表示开启电子卡功能
  1147. payOrderResultInfo.setCardEnabledFlag("1");
  1148. }else {
  1149. payOrderResultInfo.setCardEnabledFlag("0");
  1150. }
  1151. }else {
  1152. //不共享,则查看油站电子卡是否开启
  1153. if(params.get("cardEnabledFlag").toString().equals("1")){
  1154. payOrderResultInfo.setCardEnabledFlag("1");
  1155. }else {
  1156. payOrderResultInfo.setCardEnabledFlag("0");
  1157. }
  1158. }
  1159. //电子卡功能是否开启
  1160. logger.info("油站是否开启电子会员卡功能: " +payOrderResultInfo.getCardEnabledFlag());
  1161. if(payOrderResultInfo.getCardEnabledFlag().equals("1")){
  1162. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  1163. payOrderResultInfo.setDzkDiscountAmt("0");
  1164. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  1165. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  1166. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  1167. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  1168. }
  1169. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  1170. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  1171. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting();
  1172. if(isGradeSetting.equals("1")){
  1173. payOrderResultInfo.setDzkAmt(amt.toString());
  1174. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  1175. }
  1176. }
  1177. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  1178. customerElectronicCard.setStationId(Integer.valueOf(params.get("stationId").toString()));
  1179. customerElectronicCard.setCardOilsType(params.get("cardOilsType").toString());
  1180. customerElectronicCard.setUnionId(params.get("unionId").toString());
  1181. customerElectronicCard.setMobilePhone(params.get("userPhone").toString());
  1182. customerElectronicCard.setCustomerName(params.get("customerName").toString());
  1183. //查询客户余额和卡的类型
  1184. Map<String, String> map = this.selectCardBalance(customerElectronicCard, params);
  1185. payOrderResultInfo.setBalance(map.get("balance"));
  1186. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  1187. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  1188. }
  1189. return payOrderResultInfo;
  1190. }
  1191. //查询用户电子会员卡余额
  1192. public Map<String, String> selectCardBalance(CustomerElectronicCard card, Map params) {
  1193. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  1194. customerElectronicCard.setCardOilsType(card.getCardOilsType());
  1195. customerElectronicCard.setStationId(card.getStationId());
  1196. customerElectronicCard.setUnionId(card.getUnionId());
  1197. BigDecimal balance = new BigDecimal(0);
  1198. String cardOilsType1 ="";
  1199. Map<String, String> result = new HashMap<>();
  1200. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  1201. customerCardSetting.setStationId(card.getStationId());
  1202. if(params.get("cardRuleFlagGroup").equals("1")){ //
  1203. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  1204. customerElectronicCard.setStationId(Integer.valueOf(params.get("groupId").toString()));
  1205. }
  1206. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  1207. if(cardRechargeSettingList !=null && cardRechargeSettingList.size()>0){
  1208. String cardOilsTypeExist = cardRechargeSettingList.get(0).getCardOilsType();
  1209. String[] split = cardOilsTypeExist.split(",");
  1210. List<String> strings = Arrays.asList(split);
  1211. if(strings.contains(card.getCardOilsType())){
  1212. CustomerElectronicCard electronicCardInfo = electronicMembershipCardService.getElectronicCardInfoByUnionId(customerElectronicCard);
  1213. if(electronicCardInfo !=null){
  1214. //已存在卡
  1215. balance = electronicCardInfo.getAmt();
  1216. cardOilsType1 = electronicCardInfo.getCardOilsType();
  1217. result.put("balance",balance.toString());
  1218. result.put("oilsCardFlag", "1");
  1219. result.put("cardOilsType",cardOilsType1);
  1220. }else {
  1221. //如果油站已开启该卡,用户没有卡
  1222. String currentTime = String.valueOf(System.currentTimeMillis());
  1223. String customerNo = card.getStationId() + currentTime;
  1224. customerElectronicCard.setCustomerNo(customerNo);
  1225. customerElectronicCard.setAmt(new BigDecimal(0));
  1226. customerElectronicCard.setCreateTime(new Date());
  1227. customerElectronicCard.setCustomerName(card.getCustomerName());
  1228. customerElectronicCard.setMobilePhone(card.getMobilePhone());
  1229. electronicMembershipCardService.insetElectronicCard(customerElectronicCard);
  1230. CustomerElectronicCard electronicCardInfoNew = electronicMembershipCardService.getElectronicCardInfoByUnionId(customerElectronicCard);
  1231. balance = electronicCardInfoNew.getAmt();
  1232. result.put("balance",balance.toString());
  1233. result.put("oilsCardFlag", "1");
  1234. result.put("cardOilsType",electronicCardInfoNew.getCardOilsType());
  1235. }
  1236. }else {
  1237. result.put("oilsCardFlag", "0");
  1238. }
  1239. }else {
  1240. result.put("oilsCardFlag", "0");
  1241. }
  1242. return result;
  1243. }
  1244. /***
  1245. * //营销方案活动日优惠
  1246. * @param discountType 活动日时间类型
  1247. * @param discountDate 活动日时间字符串,格式:1,2,3,4
  1248. * @return
  1249. */
  1250. public boolean isActivityDay(String discountType, String discountDate){
  1251. boolean boo= false;
  1252. if(discountDate !=null && discountDate !=""){
  1253. String currentTime = null; //当前时间
  1254. String[] discountDateArray = discountDate.split(",");
  1255. Calendar calendar = Calendar.getInstance();
  1256. calendar.setTime(new Date()); //获取当前时间
  1257. switch (discountType){
  1258. case "1": // 1.按周来
  1259. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1260. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1261. currentTime = String.valueOf(day_Week);
  1262. break;
  1263. case "2": // 2.每月的 多少号
  1264. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1265. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1266. currentTime = String.valueOf(day_month); //当前时间
  1267. break;
  1268. case "3": // 3.固定日期
  1269. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1270. break;
  1271. }
  1272. //活动日优惠金额
  1273. for (String s : discountDateArray){
  1274. if(s.equals(currentTime)){
  1275. boo = true;
  1276. break;
  1277. }
  1278. }
  1279. }
  1280. return boo;
  1281. }
  1282. /**
  1283. * 根据订单号获取订单信息
  1284. * produces="application/json;charset=UTF-8",consumes = "application/json",
  1285. * @RequestBody String orderno
  1286. * @param
  1287. * @return
  1288. */
  1289. @RequestMapping(value = "/selectOrderInfoByOrdNo", method = RequestMethod.GET)
  1290. @ResponseBody
  1291. public String getPayOrderList(@RequestParam String orderNo){
  1292. Gson gson =new Gson();
  1293. ResultData resultData =null;
  1294. if(StringUtils.isNotBlank(orderNo)){
  1295. PayOrder payOrder = payOrderService.selectOrderInfoByOrdNo(orderNo);
  1296. resultData = ResultData.success(payOrder);
  1297. }else {
  1298. resultData=ResultData.error(CodeMsg.SEARCH_FAIL);
  1299. }
  1300. return gson.toJson(resultData);
  1301. }
  1302. /*
  1303. * 根据用户openId和用户类型userType查询用户订单
  1304. * @param openId
  1305. * @param userType
  1306. * @return
  1307. */
  1308. @RequestMapping(value = "/getOrderListByOpenIdAndUserType", method = RequestMethod.GET)
  1309. @ResponseBody
  1310. public String getOrderListByOpenIdAndUserType(@RequestParam("openId") String openId, @RequestParam("userType") String userType){
  1311. Gson gson =new Gson();
  1312. ResultData resultData =null;
  1313. if(StringUtils.isNotBlank(openId) && StringUtils.isNotBlank(userType)){
  1314. AppUserInfo appUserInfo = new AppUserInfo();
  1315. switch (userType){
  1316. case "1":
  1317. appUserInfo.setBlogOpenid(openId);
  1318. break;
  1319. case "2":
  1320. appUserInfo.setALiId(openId);
  1321. break;
  1322. }
  1323. List<PayOrder> payOrderList = payOrderService.getOrderListByOpenIdAndUserType(appUserInfo);
  1324. resultData=ResultData.success(payOrderList);
  1325. }else {
  1326. resultData=ResultData.error(CodeMsg.SEARCH_FAIL);
  1327. }
  1328. return gson.toJson(resultData);
  1329. }
  1330. }