PayOrderController.java 86 KB

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