PayOrderController.java 130 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022
  1. package com.platform.yijia.controller;
  2. import com.google.gson.Gson;
  3. import com.google.gson.GsonBuilder;
  4. import com.platform.yijia.config.YiJiaRequest;
  5. import com.platform.yijia.dao.PayOrderMapper;
  6. import com.platform.yijia.param.request.PayOrderRequest;
  7. import com.platform.yijia.pojo.*;
  8. import com.platform.yijia.service.*;
  9. import com.platform.yijia.utils.CodeMsg;
  10. import com.platform.yijia.utils.ResultData;
  11. import org.apache.commons.lang3.StringUtils;
  12. import org.omg.CORBA.CODESET_INCOMPATIBLE;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;
  15. import org.springframework.stereotype.Controller;
  16. import org.springframework.transaction.annotation.Transactional;
  17. import org.springframework.web.bind.annotation.*;
  18. import javax.annotation.Resource;
  19. import java.math.BigDecimal;
  20. import java.math.BigInteger;
  21. import java.sql.Timestamp;
  22. import java.text.SimpleDateFormat;
  23. import java.util.*;
  24. @Controller
  25. @YiJiaRequest()
  26. @CrossOrigin
  27. public class PayOrderController {
  28. private static Logger logger =(Logger) LoggerFactory.getLogger(PayOrderController.class);
  29. @Resource
  30. private PayOrderService payOrderService;
  31. @Resource
  32. private AppUserInfoService appUserInfoService;
  33. @Resource
  34. private StationService stationService;
  35. @Resource
  36. private CustomerGradeServices customerGradeServices;
  37. @Resource
  38. private PayOrderMapper payOrderMapper;
  39. @Resource
  40. private ElectronicMembershipCardService electronicMembershipCardService;
  41. @Resource
  42. private CustomerManagerService customerManagerService;
  43. @Resource
  44. private SysDictDataService sysDictDataService;
  45. @Resource
  46. private LabelService labelService;
  47. @Resource
  48. private StationOilGunService stationOilGunService;
  49. @Resource
  50. private CouponService couponService;
  51. //小程序支付生成订单
  52. @RequestMapping(value = "/AddPayOrderInfoNew", consumes = "application/json", method = RequestMethod.POST)
  53. @ResponseBody
  54. @Transactional
  55. public String AddPayOrderInfoNew(@RequestBody PayOrderRequest payOrderRequest){
  56. logger.info("生成订单前端传来参数油站ID:"+payOrderRequest.getStationId()+"; 用户openId:"+ payOrderRequest.getOpenId() +"; 加油员ID:" +payOrderRequest.getPersonnelId()+ ";");
  57. Gson gson =new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
  58. ResultData resultData =null;
  59. AppUserInfo appUserInfo =new AppUserInfo(); //查询客户信息传递参数
  60. PayOrder payOrder = new PayOrder(); //生成订单参数
  61. if(StringUtils.isNotBlank(payOrderRequest.getUserType()) && StringUtils.isNotBlank(payOrderRequest.getOpenId()) && StringUtils.isNotBlank(payOrderRequest.getOilName()) &&
  62. StringUtils.isNotBlank(payOrderRequest.getOilGun()) && payOrderRequest.getReceivableAmt() !=null ){
  63. appUserInfo.setUserType(payOrderRequest.getUserType());
  64. switch (payOrderRequest.getUserType()){
  65. case "1": //小程序
  66. appUserInfo.setMinaOpenid(payOrderRequest.getOpenId());
  67. break;
  68. case "2": //支付宝公众号
  69. appUserInfo.setALiId(payOrderRequest.getOpenId());
  70. break;
  71. }
  72. StationInfo stationInfo = new StationInfo();
  73. stationInfo.setStationId(payOrderRequest.getStationId());
  74. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  75. Map<String ,Object> resultMap = new HashMap<>(); //返回结果集
  76. if(stationInfos !=null){
  77. payOrder.setStationName(stationInfos.getStationName());
  78. //获取油站图片和名称
  79. resultMap.put("stationPic", stationInfos.getStationPic());
  80. resultMap.put("stationName", stationInfos.getStationName());
  81. appUserInfo.setStationId(stationInfos.getGroupId());
  82. AppUserInfo appUserInfos = appUserInfoService.getAppUserInfo(appUserInfo);
  83. if(appUserInfos !=null) {
  84. //payOrderRequest存放参数原因:用于其他方法形参
  85. payOrderRequest.setCardEnabledFlagGroup(stationInfos.getCardEnabledFlagGroup()); //集团是否开启电子卡
  86. payOrderRequest.setCardRuleFlagGroup(stationInfos.getCardRuleFlagGroup()); //集团是否共享
  87. payOrderRequest.setIntegralFlagGroup(stationInfos.getIntegralFlagGroup()); //集团是否启用积分功能
  88. payOrderRequest.setIntegralRuleFlagGroup(stationInfos.getIntegralRuleFlagGroup()); //集团是否共享
  89. payOrderRequest.setCustomerPhone(appUserInfos.getMobilePhone()); //客户手机号; 注:此处存放手机号用于获取客户信息参数查询
  90. payOrderRequest.setUnionId(appUserInfos.getUnionId()); //客户UnionId;注:此处存放unionId用于获取客户电子卡参数查询
  91. payOrderRequest.setCustomerName(appUserInfos.getBlogNickName()); //昵称
  92. payOrderRequest.setGroupId(stationInfos.getGroupId()); //集团ID
  93. payOrderRequest.setLabelFlag(stationInfos.getLabelFlag()); //油站是否开启标签功能
  94. payOrderRequest.setIsLngFlagGroup(stationInfos.getIsLngFlagGroup()); //该集团是否为LNG第三方平台商:0,否;1,是;
  95. payOrder.setConsumer(appUserInfos.getBlogNickName()); //昵称
  96. payOrder.setConsumerId(appUserInfos.getUserId()); //用户id
  97. Random random = new Random();
  98. String result = "";
  99. for (int i = 0; i < 6; i++) {
  100. result += random.nextInt(10);
  101. }
  102. String ordNo = System.nanoTime() + result;
  103. payOrder.setOrderNo(ordNo); //订单号
  104. logger.info("生成的订单号:" + ordNo);
  105. payOrder.setDiscountCouponAmt(payOrderRequest.getDiscountCouponAmt()); //优惠劵金额
  106. payOrder.setDiscountCoupon(payOrderRequest.getDiscountCoupon()); //优惠券
  107. payOrder.setCarNo(payOrderRequest.getCarNo()); //车牌号、
  108. payOrder.setCustomerGrade(payOrderRequest.getCustomerGrade()); //客户电话
  109. payOrder.setMemberNo(payOrderRequest.getMemberNo()); //会员卡号
  110. payOrder.setMemberAmt(payOrderRequest.getMemberAmt()); //会员支付金额
  111. payOrder.setScore(payOrderRequest.getScore()); //积分
  112. payOrder.setStationId(payOrderRequest.getStationId()); //油站id
  113. payOrder.setStatus("0"); //创建订单 未支付状态 0
  114. payOrder.setCreatedDate(new Timestamp(new Date().getTime())); //创建时间
  115. payOrder.setOrderType(payOrderRequest.getOrderType()); //订单类型
  116. payOrder.setOilGun(payOrderRequest.getOilGun()); //油枪号
  117. payOrder.setReceivableAmt(Double.valueOf(payOrderRequest.getReceivableAmt())); //订单应收金额
  118. String oilName = payOrderRequest.getOilName();
  119. //获取该油品所属哪一类
  120. Oil oil = new Oil();
  121. oil.setOilName(oilName);
  122. oil.setDictType("oil_name");
  123. Oil oilInfo = sysDictDataService.selectOilType(oil);
  124. payOrder.setOilType(oilInfo.getOilsType()); //油品类型
  125. String oilsType = oilInfo.getOilsType(); //获取订单类型
  126. logger.info("订单油品类型:" + oilsType);
  127. payOrderRequest.setCardOilsType(oilInfo.getOilsType()); //电子卡类型;注:用于获取客户电子卡参数查询
  128. payOrder.setOilName(oilName); //油品名称
  129. PayOrderResultInfo payOrderResultInfo = this.calculateAmt(payOrderRequest); //计算订单金额 价格 加油升数 等等
  130. if(oilsType.equals("3")){ //订单类型是油品时计算
  131. payOrder.setOrderType("2");
  132. payOrder.setAmt(Double.valueOf(payOrderRequest.getReceivableAmt())); //非油品金额
  133. payOrder.setDiscountAmt(Double.valueOf(0)); //优惠金额
  134. payOrder.setOilPirce(payOrderRequest.getReceivableAmt()); //非油品价格
  135. payOrder.setOrderLiters("0");
  136. resultMap.put("oilsCardFlag", "0");
  137. resultMap.put("discountAmt", "0"); //优惠价格
  138. resultMap.put("amt", payOrderRequest.getReceivableAmt()); //实收价格
  139. resultMap.put("receivableAmt", payOrderRequest.getReceivableAmt()); //应收价格
  140. resultMap.put("oilLiters", "0");
  141. resultMap.put("discountPrice", "0");
  142. resultMap.put("ordNo", ordNo);
  143. //logger.info("返回前端的结果:" +resultMap.toString());
  144. //payOrderMapper.insertSelective(payOrder);
  145. }else {
  146. //PayOrderResultInfo payOrderResultInfo = this.calculateAmt(payOrderRequest); //计算订单金额 价格 加油升数 等等
  147. payOrder.setOilPirce(payOrderResultInfo.getOilPrice());
  148. payOrder.setOrderLiters(payOrderResultInfo.getOilLiters());
  149. payOrder.setDiscountAmt(Double.valueOf(payOrderResultInfo.getDiscountAmt()));
  150. payOrder.setAmt(Double.valueOf(payOrderResultInfo.getAmt()));
  151. payOrder.setOrderType("1");
  152. resultMap.put("discountPrice", payOrderResultInfo.getDiscountPrice());
  153. if(payOrderResultInfo.getCardEnabledFlag() !=null && payOrderResultInfo.getCardEnabledFlag().equals("1")){
  154. payOrder.setDzkAmt(Double.valueOf(payOrderResultInfo.getDzkAmt()));
  155. //如果电子卡支付的金额与应收金额相同,则优惠价格有原有价格相同
  156. // if(new BigDecimal(payOrderRequest.getReceivableAmt()).compareTo(new BigDecimal(payOrderResultInfo.getDzkAmt())) ==0){
  157. // resultMap.put("discountPrice", payOrderResultInfo.getOilPrice());
  158. // }
  159. //payOrder.setDiscountAmt(Double.valueOf(payOrderResultInfo.getDzkDiscountAmt()));
  160. }
  161. resultMap.put("dzkDiscountPrice", payOrderResultInfo.getDzkDiscountPrice());
  162. resultMap.put("cardEnabledFlag", payOrderResultInfo.getCardEnabledFlag());
  163. resultMap.put("oilsCardFlag", payOrderResultInfo.getOilsCardFlag());
  164. resultMap.put("discountAmt", payOrderResultInfo.getDiscountAmt()); //优惠金额
  165. resultMap.put("amt", payOrderResultInfo.getAmt()); //实收价格
  166. if(payOrderRequest.getIsLngFlagGroup() !=null && payOrderRequest.getIsLngFlagGroup().equals("1")){
  167. payOrder.setSellAmt(Double.valueOf(payOrderResultInfo.getSellAmt()));
  168. payOrder.setSellDiscountAmt(Double.valueOf(payOrderResultInfo.getSellDiscountAmt()));
  169. payOrder.setSellOilPrice(Double.valueOf(payOrderResultInfo.getSellPrice()));
  170. payOrder.setDriverDiscountAmt(Double.valueOf(payOrderResultInfo.getDriverDiscountAmt()));
  171. resultMap.put("driverDiscountAmt", payOrderResultInfo.getDriverDiscountAmt());
  172. resultMap.put("sellDiscountAmt", payOrderResultInfo.getSellDiscountAmt());
  173. }
  174. payOrder.setDriverOilPrice(Double.valueOf(payOrderResultInfo.getDiscountPrice()));
  175. if(payOrderResultInfo.getCardEnabledFlag().equals("1")){
  176. payOrder.setDriverOilPrice(Double.valueOf(payOrderResultInfo.getDzkDiscountPrice()));
  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. //该油站是否开启优惠券功能
  189. if(stationInfos.getCouponEnabledFlag() == null){
  190. resultMap.put("couponEnabledFlag", "0");
  191. }else {
  192. resultMap.put("couponEnabledFlag", stationInfos.getCouponEnabledFlag());
  193. }
  194. //获取用户的优惠券
  195. if(stationInfos.getCouponEnabledFlag() !=null && stationInfos.getCouponEnabledFlag().equals("1")){
  196. Integer stationId = payOrderRequest.getStationId();
  197. //集团下
  198. if(stationInfos.getCouponFlag() !=null && stationInfos.getCouponFlag().equals("1")){
  199. stationId=stationInfos.getGroupId();
  200. }
  201. //设置了扫码后支付成功后的领取
  202. String couponIssueId = ""; //领取方式ID
  203. resultMap.put("couponIssueId", couponIssueId);
  204. List<CouponIssue> couponIssueList = this.getCouponIssue(stationId);
  205. if(couponIssueList !=null && couponIssueList.size()>0){
  206. couponIssueId = this.getCouponIssue(stationId).get(0).getCouponIssueId();
  207. if(StringUtils.isNotBlank(couponIssueId)){
  208. resultMap.put("couponIssueId", couponIssueId);
  209. }
  210. }
  211. List<UserCoupon> userCouponsList = new ArrayList<>(); //用户的优惠券
  212. resultMap.put("userCouponsList", userCouponsList);
  213. //userCouponsList = this.getUserCoupon(appUserInfos.getUnionId(), stationId);
  214. userCouponsList = payOrderResultInfo.getUserCouponsList();
  215. if(userCouponsList !=null && userCouponsList.size()>0){
  216. resultMap.put("userCouponsList", userCouponsList);
  217. }
  218. }
  219. //根据油站和油枪获取加油员
  220. if (payOrderRequest.getPersonnelId() != null && payOrderRequest.getPersonnelId() != "" && !payOrderRequest.getPersonnelId().equals("undefined")) {
  221. //表示为一人一码:一个加油员一个码
  222. Map<String, Object> params = new HashMap<>();
  223. params.put("personnelId", payOrderRequest.getPersonnelId());
  224. params.put("stationId", payOrderRequest.getStationId());
  225. List<Map<String, Object>> list = stationOilGunService.selectOilGunByPersonalId(params);
  226. if (list != null && list.size() > 0) {
  227. if(list.get(0).containsKey("personnelName") && list.get(0).get("personnelName") !=null && list.get(0).get("personnelName").toString() !=""){
  228. payOrder.setOilPersonnel(list.get(0).get("personnelName").toString());
  229. payOrder.setOilPersonnelId(list.get(0).get("personnelId").toString());
  230. payOrderMapper.insertSelective(payOrder);
  231. resultData = ResultData.success(resultMap);
  232. }else {
  233. resultData = ResultData.error(CodeMsg.NO_PERSONNAL);
  234. }
  235. } else {
  236. resultData = ResultData.error(CodeMsg.NO_PERSONNAL);
  237. }
  238. } else {
  239. //resultData = ResultData.error(CodeMsg.NO_PERSONNAL);
  240. //根据油站和油枪获取加油员
  241. HashMap<String, Object> params = new HashMap<>();
  242. params.put("oliGunNo", payOrderRequest.getOilGun());
  243. params.put("stationId", payOrderRequest.getStationId());
  244. List<Map> mapResultList = payOrderMapper.selectPersonelName(params); //使用list原因:一个枪号对应多个加油员场景
  245. logger.info("加油员信息:"+ mapResultList.toString());
  246. if(mapResultList != null && mapResultList.size() > 0){
  247. String oilPersonnel = "";
  248. String oilPersonnelId ="";
  249. for (Map per : mapResultList){
  250. if(per.containsKey("personnelName") && per.get("personnelName").toString() !=null && per.get("personnelName").toString() !=""){
  251. oilPersonnel += per.get("personnelName").toString() +",";
  252. oilPersonnelId += per.get("personnelId").toString() +",";
  253. }
  254. }
  255. if(oilPersonnel !=""){
  256. payOrder.setOilPersonnel(oilPersonnel.substring(0, oilPersonnel.length()-1)); //加油员
  257. payOrder.setOilPersonnelId(oilPersonnelId.substring(0, oilPersonnelId.length()-1));
  258. }
  259. // payOrder.setOilPersonnel(mapResultList.get(0).get("").toString()); //加油员
  260. // payOrder.setOilPersonnelId(oilPersonnelId.substring(0, oilPersonnelId.length()-1));
  261. payOrderMapper.insertSelective(payOrder);
  262. logger.info("返回前端的结果:" +resultMap.toString());
  263. resultData = ResultData.success(resultMap);
  264. }else {
  265. resultData = ResultData.error(CodeMsg.NO_PERSONNAL);
  266. }
  267. }
  268. }else {
  269. //登录人验证失败
  270. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  271. }
  272. }else {
  273. resultData = ResultData.error(CodeMsg.REQUEST_FAIL);
  274. }
  275. }else {
  276. resultData = ResultData.error(CodeMsg.REQUEST_FAIL);
  277. }
  278. return gson.toJson(resultData);
  279. }
  280. //根据营销方案计算订单金额
  281. public PayOrderResultInfo calculateAmt(PayOrderRequest payOrderRequest){
  282. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  283. Integer stationId = payOrderRequest.getStationId(); //油站ID
  284. BigDecimal receivableAmt = new BigDecimal(payOrderRequest.getReceivableAmt()); //应收金额 用户输入的金额
  285. String oilName = payOrderRequest.getOilName(); //油品名称
  286. String openId = payOrderRequest.getOpenId(); //用户的openId
  287. String userPhone = payOrderRequest.getCustomerPhone(); //用户手机号
  288. String customerName = payOrderRequest.getCustomerName(); //用户手机号
  289. Map<String, Object> map = new HashMap<>();
  290. map.put("oilName", oilName);
  291. map.put("stationId", stationId);
  292. //获取油站油品价格 优惠方案 是否开启电子卡
  293. Map<String, Object> result = stationService.selectStationOilPriceAndDiscountSetting(map);
  294. String oilPrice = result.get("oilPrice").toString(); //油站油品价格
  295. String discountSetting = result.get("discountSetting").toString(); //优惠方案
  296. String cardEnabledFlag = result.get("cardEnabledFlag").toString(); //是否开启电子卡
  297. String cardRuleFlag = result.get("cardRuleFlag").toString(); //是否共享电子卡储值规则
  298. String groupId = payOrderRequest.getGroupId().toString(); //集团ID
  299. Map<String ,Object> params = new HashMap<String, Object>();
  300. params.put("stationId", stationId);
  301. params.put("oilName", oilName);
  302. params.put("receivableAmt", receivableAmt);
  303. params.put("oilPrice", oilPrice);
  304. params.put("mobilePhone", payOrderRequest.getCustomerPhone());
  305. params.put("minaOpenid", openId);
  306. params.put("cardEnabledFlag", cardEnabledFlag);
  307. params.put("cardRuleFlag", cardRuleFlag);
  308. params.put("groupId", groupId);
  309. params.put("unionId", payOrderRequest.getUnionId());
  310. params.put("cardOilsType", payOrderRequest.getCardOilsType());
  311. params.put("customerName", customerName);
  312. params.put("userPhone", userPhone);
  313. params.put("integralRuleFlagGroup", payOrderRequest.getIntegralRuleFlagGroup()); // integralRuleFlagGroup; //集团积分规则是否共享
  314. params.put("integralFlagGroup", payOrderRequest.getIntegralFlagGroup()); // integralFlagGroup; //集团是否开启积分功能
  315. params.put("cardRuleFlagGroup", payOrderRequest.getCardRuleFlagGroup()); // cardRuleFlagGroup; //集团是否共享电子卡充值规则
  316. params.put("cardEnabledFlagGroup", payOrderRequest.getCardEnabledFlagGroup()); // cardEnabledFlagGroup; //集团是否开启电子卡
  317. if(payOrderRequest.getIsLngFlagGroup() !=null && payOrderRequest.getIsLngFlagGroup().equals("1")){
  318. // isLngFlagGroup 表示该集团是否为LNG平台加气:0,否;1,是;
  319. // settlementType:结算价类型(1.直降,2.折扣); settlementPrice:结算价; driverPrice:司机价;
  320. if(result.containsKey("settlementType") && result.get("settlementType") !=null && result.get("settlementType").toString() !=""){
  321. params.put("settlementType", result.get("settlementType").toString());
  322. }
  323. if(result.containsKey("settlementPrice") && result.get("settlementPrice") !=null && result.get("settlementPrice").toString() !=""){
  324. params.put("settlementPrice", result.get("settlementPrice").toString());
  325. }
  326. //driverPriceType 司机价类型(1.直降,2.折扣);
  327. if(result.containsKey("driverPriceType") && result.get("driverPriceType") !=null && result.get("driverPriceType").toString() !=""){
  328. params.put("driverPriceType", result.get("driverPriceType").toString());
  329. }
  330. if(result.containsKey("driverPrice") && result.get("driverPrice") !=null && result.get("driverPrice").toString() !=""){
  331. params.put("driverPrice", result.get("driverPrice").toString());
  332. }
  333. payOrderResultInfo = this.calculateLngGroupStaDiscount(params);
  334. }else {
  335. CustomerLabel customerLabel = new CustomerLabel();
  336. customerLabel.setPhone(payOrderRequest.getCustomerPhone());
  337. customerLabel.setStationId(payOrderRequest.getStationId());
  338. //扫码进标签优惠:一码一签
  339. if(payOrderRequest.getLabelId() !=null){
  340. //如果前端传来labelId,则表示一码一签;
  341. params.put("labelId", payOrderRequest.getLabelId());
  342. payOrderResultInfo = this.calculateLabelDiscount(params);
  343. //是否强制将该扫码用户拉入此标签:0、否;1、是;
  344. if(payOrderResultInfo.getIsAddLabel() !=null && payOrderResultInfo.getIsAddLabel().equals("1")){
  345. CustomerLabel customerLabel_info = labelService.getCustomerLabel(customerLabel);
  346. if(customerLabel_info !=null){
  347. customerLabel.setUpdateTime(new Date());
  348. customerLabel.setLabelId(payOrderRequest.getLabelId());
  349. labelService.updateCustomerLabel(customerLabel);
  350. }else {
  351. customerLabel.setCreateTime(new Date());
  352. customerLabel.setDelFlag("0");
  353. customerLabel.setLabelId(payOrderRequest.getLabelId());
  354. labelService.insertCustomerLabel(customerLabel);
  355. }
  356. }
  357. }else {
  358. /*
  359. * ***********************************************************************************************************************
  360. * 说明: payOrderResultInfo.setAllDiscountType (计算优惠券时所自定义的参数区别优惠方案): 1、表示等级优惠;2、表示营销优惠;3、标签优惠;
  361. * ***********************************************************************************************************************
  362. */
  363. //按照正常优惠计算
  364. CustomerLabel customerLabelInfo = labelService.getCustomerLabel(customerLabel); //获取该用户是否在标签组内
  365. if(payOrderRequest.getLabelFlag() !=null && payOrderRequest.getLabelFlag().equals("1") && customerLabelInfo !=null){
  366. //表示此用户为标签用户,计算标签用户优惠
  367. params.put("labelId", customerLabelInfo.getLabelId());
  368. payOrderResultInfo = this.calculateLabelDiscount(params);
  369. payOrderResultInfo.setOilName(params.get("oilName").toString());
  370. payOrderResultInfo.setUnionId(params.get("unionId").toString());
  371. payOrderResultInfo.setStationId(Integer.valueOf(params.get("stationId").toString()));
  372. payOrderResultInfo.setAllDiscountType("3");
  373. payOrderResultInfo.setUserCouponsList(this.getUserCouponAscList(payOrderResultInfo));
  374. }else {
  375. //不为标签用户时
  376. switch (discountSetting){
  377. case "0": //不执营销方案时 计算等级优惠
  378. payOrderResultInfo = this.calculateGradeDiscount(params);
  379. payOrderResultInfo.setOilName(params.get("oilName").toString());
  380. payOrderResultInfo.setUnionId(params.get("unionId").toString());
  381. payOrderResultInfo.setStationId(Integer.valueOf(params.get("stationId").toString()));
  382. payOrderResultInfo.setAllDiscountType("1");
  383. break;
  384. case "1": //满减方案
  385. payOrderResultInfo = this.calculateManJianDiscount(params);
  386. payOrderResultInfo.setOilName(params.get("oilName").toString());
  387. payOrderResultInfo.setUnionId(params.get("unionId").toString());
  388. payOrderResultInfo.setStationId(Integer.valueOf(params.get("stationId").toString()));
  389. payOrderResultInfo.setAllDiscountType("2");
  390. break;
  391. case "2": //立减方案
  392. payOrderResultInfo = this.calculateLiJianDiscount(params);
  393. payOrderResultInfo.setOilName(params.get("oilName").toString());
  394. payOrderResultInfo.setUnionId(params.get("unionId").toString());
  395. payOrderResultInfo.setStationId(Integer.valueOf(params.get("stationId").toString()));
  396. payOrderResultInfo.setAllDiscountType("2");
  397. break;
  398. case "3": //独立直降
  399. payOrderResultInfo = this.calculateZhiJiangDiscount(params);
  400. payOrderResultInfo.setOilName(params.get("oilName").toString());
  401. payOrderResultInfo.setUnionId(params.get("unionId").toString());
  402. payOrderResultInfo.setStationId(Integer.valueOf(params.get("stationId").toString()));
  403. payOrderResultInfo.setAllDiscountType("2");
  404. break;
  405. case "4": //计算阶梯直降
  406. payOrderResultInfo = this.calculateJieTiZhiJiangDiscount(params);
  407. payOrderResultInfo.setOilName(params.get("oilName").toString());
  408. payOrderResultInfo.setUnionId(params.get("unionId").toString());
  409. payOrderResultInfo.setStationId(Integer.valueOf(params.get("stationId").toString()));
  410. payOrderResultInfo.setAllDiscountType("2");
  411. break;
  412. }
  413. //优惠券计算
  414. payOrderResultInfo.setUserCouponsList(this.getUserCouponAscList(payOrderResultInfo));
  415. }
  416. }
  417. }
  418. return payOrderResultInfo;
  419. }
  420. //计算集团下站点LNG平台加气
  421. public PayOrderResultInfo calculateLngGroupStaDiscount(Map<String ,Object> params){
  422. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  423. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  424. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  425. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  426. BigDecimal discountAmt = new BigDecimal(0); //油站销售价后优惠金额
  427. BigDecimal sellDiscountAmt = new BigDecimal(0); //油站销售价后优惠金额
  428. BigDecimal dzkDiscountAmt = new BigDecimal(0); //电子卡优惠金额
  429. BigDecimal amt = receivableAmt; //司机价后支付金额
  430. BigDecimal sellAmt = new BigDecimal(0); //油站结算价支付金额
  431. BigDecimal discountPrice = oilPrice; //司机销售价
  432. BigDecimal sellPrice = discountPrice; //油站销售价
  433. BigDecimal driverDiscountAmt = new BigDecimal("0"); //司机价优惠金额
  434. //加油升数
  435. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  436. // if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  437. // oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  438. // }
  439. // settlementType:结算价类型(1.直降,2.折扣); settlementPrice:结算价; driverPrice:司机价;
  440. if(params.containsKey("settlementType") && params.get("settlementType") !=null && params.get("settlementType").toString() !=""){
  441. String settlementType = params.get("settlementType").toString();
  442. switch (settlementType){
  443. case "1": //直降
  444. //优惠价(销售价)
  445. if(params.containsKey("settlementPrice") && params.get("settlementPrice").toString() !=null && params.get("settlementPrice").toString() !=""){
  446. sellPrice = oilPrice.subtract(new BigDecimal(params.get("settlementPrice").toString()));
  447. sellAmt = sellPrice.multiply(oilLiters); //优惠价实付金额
  448. sellDiscountAmt = receivableAmt.subtract(sellAmt);
  449. if(oilLiters.compareTo(new BigDecimal("1.00")) == -1){
  450. sellPrice = oilPrice;
  451. sellDiscountAmt = oilLiters.multiply(new BigDecimal(params.get("settlementPrice").toString()));
  452. sellAmt = receivableAmt.subtract(sellDiscountAmt);
  453. }
  454. }
  455. break;
  456. case "2": //折扣
  457. //优惠价(销售价)
  458. if(params.containsKey("settlementPrice") && params.get("settlementPrice").toString() !=null && params.get("settlementPrice").toString() !=""){
  459. sellPrice = oilPrice.multiply(new BigDecimal(params.get("settlementPrice").toString())).divide(new BigDecimal("100"));
  460. sellAmt =sellPrice.multiply(oilLiters);
  461. sellDiscountAmt = receivableAmt.subtract(sellAmt);
  462. //sellDiscountAmt = sellDiscountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  463. }
  464. break;
  465. }
  466. }
  467. //driverPriceType: 司机价类型(1.直降,2.折扣);
  468. if(params.containsKey("driverPriceType") && params.get("driverPriceType") !=null && params.get("driverPriceType").toString() !=""){
  469. String driverPriceType = params.get("driverPriceType").toString();
  470. switch (driverPriceType){
  471. case "1":
  472. if(params.containsKey("driverPrice") && params.get("driverPrice").toString() !=null && params.get("driverPrice").toString() !=""){
  473. //司机价
  474. discountPrice = sellPrice.subtract(new BigDecimal(params.get("driverPrice").toString()));
  475. amt = discountPrice.multiply(oilLiters);
  476. discountAmt = receivableAmt.subtract(amt);
  477. if(oilLiters.compareTo(new BigDecimal("1.00")) == -1){
  478. discountPrice = sellPrice;
  479. discountAmt = oilLiters.multiply(new BigDecimal(params.get("driverPrice").toString()));
  480. amt = receivableAmt.subtract(discountAmt);
  481. }
  482. driverDiscountAmt = discountAmt.subtract(sellDiscountAmt);
  483. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  484. discountPrice = discountPrice.setScale(2, BigDecimal.ROUND_HALF_UP);
  485. }
  486. break;
  487. case "2": //折扣
  488. if(params.containsKey("driverPrice") && params.get("driverPrice").toString() !=null && params.get("driverPrice").toString() !=""){
  489. //司机价
  490. discountPrice = sellPrice.multiply(new BigDecimal(params.get("driverPrice").toString())).divide(new BigDecimal("100"));
  491. amt = sellAmt.multiply(new BigDecimal(params.get("driverPrice").toString())).divide(new BigDecimal("100"));
  492. discountAmt = receivableAmt.subtract(amt);
  493. driverDiscountAmt = discountAmt.subtract(sellDiscountAmt);
  494. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  495. discountPrice = discountPrice.setScale(2, BigDecimal.ROUND_HALF_UP);
  496. }
  497. break;
  498. }
  499. }
  500. sellAmt =sellAmt.signum() == -1 ? new BigDecimal("0.01"): sellAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  501. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt.setScale(2, BigDecimal.ROUND_HALF_UP);
  502. if(oilLiters.toString().equals("0.00")){
  503. amt = new BigDecimal("0.01");
  504. sellAmt = new BigDecimal("0.01");
  505. driverDiscountAmt = new BigDecimal("0.00");
  506. discountAmt = new BigDecimal("0.00");
  507. sellDiscountAmt = new BigDecimal("0.00");
  508. }
  509. payOrderResultInfo.setReceivableAmt(receivableAmt.toString()); //应收金额
  510. //oilLiters = oilLiters.setScale(2,BigDecimal.ROUND_HALF_UP);
  511. payOrderResultInfo.setOilLiters(oilLiters.toString()); //加油升数
  512. payOrderResultInfo.setOilPrice(oilPrice.toString()); //油机价
  513. payOrderResultInfo.setAmt(amt.toString()); //司机价后时候金额
  514. payOrderResultInfo.setDiscountPrice(discountPrice.toString()); //司机价
  515. payOrderResultInfo.setDiscountAmt(discountAmt.toString()); //司机价后优惠总金额
  516. driverDiscountAmt = driverDiscountAmt.setScale(2,BigDecimal.ROUND_HALF_UP);
  517. payOrderResultInfo.setDriverDiscountAmt(driverDiscountAmt.toString()); //司机价后优惠金额
  518. payOrderResultInfo.setSellAmt(sellAmt.toString()); //销售价后支付金额
  519. sellPrice = sellPrice.setScale(2, BigDecimal.ROUND_HALF_UP); //销售价
  520. payOrderResultInfo.setSellPrice(sellPrice.toString()); //销售价
  521. sellDiscountAmt = sellDiscountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  522. payOrderResultInfo.setSellDiscountAmt(sellDiscountAmt.toString()); //销售价后优惠金额
  523. //LNG加气平台没有电子卡功能:此下参数无用用作填充参数值 0:代表否;4:代表LNG油品
  524. payOrderResultInfo.setDzkAmt(amt.toString()); //电子卡支付金额
  525. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString()); //电子卡优惠金额
  526. payOrderResultInfo.setBalance("0");
  527. String oilName = params.get("oilName").toString();
  528. // Oil oil = new Oil();
  529. // oil.setDictType("oil_name");
  530. // oil.setOilName(oilName);
  531. // Oil oilInfo = sysDictDataService.selectOilType(oil);
  532. //params.put("cardOilsType", payOrderRequest.getCardOilsType());
  533. String cardOilsType = params.get("cardOilsType").toString();
  534. payOrderResultInfo.setCardOilsType(cardOilsType);
  535. payOrderResultInfo.setOilsCardFlag("0");
  536. payOrderResultInfo.setCardEnabledFlag("0");
  537. return payOrderResultInfo;
  538. }
  539. //计算标签用户优惠
  540. public PayOrderResultInfo calculateLabelDiscount(Map<String ,Object> params){
  541. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  542. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  543. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  544. BigDecimal discountAmt = new BigDecimal(0); //标签方案优惠金额
  545. BigDecimal dzkDiscountAmt = new BigDecimal(0); //电子卡优惠金额
  546. BigDecimal amt = receivableAmt;
  547. BigDecimal discountPrice = oilPrice;
  548. //加油升数
  549. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  550. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  551. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  552. }
  553. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  554. //获取该油站的标签规则
  555. LabelRule labelRule = new LabelRule();
  556. labelRule.setStationId(Integer.valueOf(params.get("stationId").toString())); //油站ID
  557. //labelRule.setOilName(params.get("oilName").toString()); //oilName
  558. labelRule.setDelFlag("0");
  559. labelRule.setLabelId(Integer.valueOf(params.get("labelId").toString()));//
  560. List<LabelRule> labelRuleList = labelService.getLabelRuleList(labelRule);
  561. if(labelRuleList !=null && labelRuleList.size()> 0){
  562. payOrderResultInfo.setIsAddLabel(labelRuleList.get(0).getIsAddLabel()); //'是否强制将该扫码用户拉入此标签:0、否;1、是
  563. payOrderResultInfo.setLabelCreateBy(labelRuleList.get(0).getCreateBy()); //标签创建人
  564. payOrderResultInfo.setLabelUpdateBy(labelRuleList.get(0).getUpdateBy()); //标签更新人
  565. payOrderResultInfo.setLabelCreateTime(labelRuleList.get(0).getCreateTime()); //标签创建时间
  566. //获取该油品的优惠明细
  567. labelRule.setOilName(params.get("oilName").toString());
  568. labelRule.setDelFlagDetail("0");
  569. List<LabelRule> labelRuleList_oilName = labelService.getLabelRuleList(labelRule);
  570. if(labelRuleList_oilName !=null && labelRuleList_oilName.size() >0){
  571. List<LabelRuleDetail> labelRuleDetailList = labelRuleList_oilName.get(0).getLabelRuleDetailList();
  572. if(labelRuleDetailList !=null && labelRuleDetailList.size() ==1){
  573. BigDecimal discountAmt_B = new BigDecimal(labelRuleDetailList.get(0).getDiscountAmt()); //满足享受优惠条件(满多少升、满多少元)
  574. String discountTerm = labelRuleDetailList.get(0).getDiscountTerm();
  575. switch (discountTerm){
  576. case "1": //按加油升数
  577. if(oilLiters.compareTo(discountAmt_B) ==1 || oilLiters.compareTo(discountAmt_B) ==0 ){
  578. discountPrice = oilPrice.subtract(new BigDecimal(labelRuleDetailList.get(0).getDiscountLitersAmt()));
  579. if(oilPrice.compareTo(discountPrice) == 0){
  580. amt = receivableAmt;
  581. discountAmt = new BigDecimal("0.00");
  582. }else {
  583. amt = discountPrice.multiply(oilLiters);
  584. discountAmt = receivableAmt.subtract(amt);
  585. }
  586. //discountAmt = oilLiters.multiply(new BigDecimal(labelRuleDetailList.get(0).getDiscountLitersAmt()));
  587. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  588. }
  589. break;
  590. case "2": //按加油金额
  591. if(receivableAmt.compareTo(discountAmt_B) ==1 || receivableAmt.compareTo(discountAmt_B) ==0 ){
  592. discountPrice = oilPrice.subtract(new BigDecimal(labelRuleDetailList.get(0).getDiscountLitersAmt()));
  593. if(oilPrice.compareTo(discountPrice) == 0){
  594. amt = receivableAmt;
  595. discountAmt = new BigDecimal("0.00");
  596. }else {
  597. amt = discountPrice.multiply(oilLiters);
  598. discountAmt = receivableAmt.subtract(amt);
  599. }
  600. // amt = discountPrice.multiply(oilLiters);
  601. // discountAmt = receivableAmt.subtract(amt);
  602. //discountAmt = oilLiters.multiply(new BigDecimal(labelRuleDetailList.get(0).getDiscountLitersAmt()));
  603. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  604. }
  605. break;
  606. }
  607. dzkDiscountAmt = discountAmt; //赋值电子卡优惠金额
  608. }
  609. }
  610. }
  611. //amt = receivableAmt.subtract(discountAmt); //应收金额
  612. amt = amt.setScale(2, BigDecimal.ROUND_HALF_UP);
  613. if(amt.toString().equals("0.00")){
  614. amt = new BigDecimal("0.01");
  615. }
  616. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  617. //discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  618. payOrderResultInfo.setAmt(amt.toString());
  619. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  620. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  621. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  622. payOrderResultInfo.setOilLiters(oilLiters.toString());
  623. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  624. payOrderResultInfo.setOilPrice(oilPrice.toString());
  625. payOrderResultInfo.setDzkAmt(amt.toString());
  626. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString());
  627. payOrderResultInfo.setOilsCardFlag("0");
  628. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  629. //表示开启共享
  630. if(params.get("cardEnabledFlagGroup").toString().equals("1")){ //表示开启电子卡功能
  631. payOrderResultInfo.setCardEnabledFlag("1");
  632. }else {
  633. payOrderResultInfo.setCardEnabledFlag("0");
  634. }
  635. }else {
  636. //不共享,则查看油站电子卡是否开启
  637. if(params.get("cardEnabledFlag").toString().equals("1")){
  638. payOrderResultInfo.setCardEnabledFlag("1");
  639. }else {
  640. payOrderResultInfo.setCardEnabledFlag("0");
  641. }
  642. }
  643. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  644. if(payOrderResultInfo.getCardEnabledFlag().equals("1")){
  645. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  646. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  647. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  648. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  649. }
  650. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  651. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  652. String isLabel = cardRechargeSettingList.get(0).getIsLabel(); //标签用户支付时是否享受标签优惠
  653. if(isLabel.equals("1")){
  654. //电子卡支付金额 = 应收金额 - 标签优惠金额
  655. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt);
  656. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt; //如果为负数,则默认设置0.01元
  657. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  658. BigDecimal dzkDiscountAmtSum = dzkDiscountAmt; //电子卡总优惠金额
  659. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmtSum.toString());
  660. }else {
  661. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  662. payOrderResultInfo.setDzkDiscountAmt("0");
  663. }
  664. }
  665. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  666. customerElectronicCard.setStationId(Integer.valueOf(params.get("stationId").toString()));
  667. customerElectronicCard.setCardOilsType(params.get("cardOilsType").toString());
  668. customerElectronicCard.setUnionId(params.get("unionId").toString());
  669. customerElectronicCard.setMobilePhone(params.get("userPhone").toString());
  670. customerElectronicCard.setCustomerName(params.get("customerName").toString());
  671. //查询客户余额和卡的类型
  672. Map<String, String> map = this.selectCardBalance(customerElectronicCard, params);
  673. payOrderResultInfo.setBalance(map.get("balance"));
  674. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  675. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  676. payOrderResultInfo.setDzkDiscountPrice(oilPrice.toString());
  677. }
  678. return payOrderResultInfo;
  679. }
  680. //计算阶梯直降
  681. public PayOrderResultInfo calculateJieTiZhiJiangDiscount(Map<String ,Object> params){
  682. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo(); //计算结果存放值
  683. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  684. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  685. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  686. BigDecimal discountAmt = new BigDecimal(0); //营销方案优惠金额
  687. BigDecimal amt = receivableAmt;
  688. BigDecimal discountPrice = oilPrice;
  689. BigDecimal gradeDiscountAmt = new BigDecimal(0); //等级优惠金额
  690. BigDecimal gradeDiscountPriceAmt = new BigDecimal(0); //等级优惠价格
  691. BigDecimal dzkGradeDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需等级优惠金额值
  692. BigDecimal dzkDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需营销优惠金额值
  693. //加油升数
  694. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  695. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  696. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  697. }
  698. //计算等级优惠
  699. PayOrderResultInfo payOrderResultInfoGrade = this.calculateGradeDiscount(params);
  700. gradeDiscountAmt = new BigDecimal(payOrderResultInfoGrade.getDiscountAmt());
  701. gradeDiscountPriceAmt = new BigDecimal(payOrderResultInfoGrade.getGradeDiscountPriceAmt());
  702. dzkGradeDiscountAmt = gradeDiscountAmt; //同时给电子卡赋值等级优惠金额
  703. params.put("discountPlanType", "4");
  704. List<Map> customerMarkertPlanList = customerGradeServices.getCustomerMarkertPlanList(params);
  705. if(customerMarkertPlanList !=null && customerMarkertPlanList.size() >0){
  706. for(Map m : customerMarkertPlanList){
  707. BigDecimal discountAmt_b = new BigDecimal(m.get("discountAmt").toString()); //条件金额
  708. BigDecimal gasoilDiscountAmt_b = new BigDecimal(m.get("gasoilDiscountAmt").toString());
  709. String discountTerm = m.get("discountTerm").toString();
  710. if(discountTerm.equals("1")){
  711. if(oilLiters.compareTo(discountAmt_b) ==1 || oilLiters.compareTo(discountAmt_b) ==0){
  712. discountPrice = oilPrice.subtract(gasoilDiscountAmt_b);
  713. amt = discountPrice.multiply(oilLiters);
  714. discountAmt = receivableAmt.subtract(amt);
  715. //discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  716. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  717. dzkDiscountAmt = discountAmt; //赋值电子卡优惠金额
  718. String vipDiscountyPlus = m.get("vipDiscountyPlus").toString();
  719. //该营销方案是否叠加等级优惠
  720. if(vipDiscountyPlus.equals("1")){
  721. //如果叠加等级优惠
  722. discountPrice = discountPrice.subtract(gradeDiscountPriceAmt);
  723. discountAmt = discountAmt.add(gradeDiscountAmt);
  724. amt = receivableAmt.subtract(discountAmt);
  725. }
  726. break;
  727. }
  728. }else if(discountTerm.equals("2")){
  729. if(receivableAmt.compareTo(discountAmt_b) ==1 || receivableAmt.compareTo(discountAmt_b) ==0){
  730. discountPrice = oilPrice.subtract(gasoilDiscountAmt_b);
  731. amt = discountPrice.multiply(oilLiters);
  732. discountAmt = receivableAmt.subtract(amt);
  733. //discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  734. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  735. dzkDiscountAmt = discountAmt; //赋值电子卡优惠金额
  736. String vipDiscountyPlus = m.get("vipDiscountyPlus").toString();
  737. //该营销方案是否叠加等级优惠
  738. if(vipDiscountyPlus.equals("1")){
  739. //如果叠加等级优惠
  740. discountPrice = discountPrice.subtract(gradeDiscountPriceAmt);
  741. discountAmt = discountAmt.add(gradeDiscountAmt);
  742. amt = receivableAmt.subtract(discountAmt);
  743. }
  744. break;
  745. }
  746. }
  747. }
  748. }
  749. //amt = receivableAmt.subtract(discountAmt); //应收金额
  750. amt = amt.setScale(2, BigDecimal.ROUND_HALF_UP);
  751. if(amt.toString().equals("0.00")){
  752. amt = new BigDecimal("0.01");
  753. }
  754. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  755. //discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  756. payOrderResultInfo.setAmt(amt.toString());
  757. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  758. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  759. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  760. payOrderResultInfo.setOilLiters(oilLiters.toString());
  761. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  762. payOrderResultInfo.setOilPrice(oilPrice.toString());
  763. payOrderResultInfo.setDzkAmt(amt.toString());
  764. payOrderResultInfo.setOilsCardFlag("0");
  765. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  766. //表示开启共享
  767. if(params.get("cardEnabledFlagGroup").toString().equals("1")){ //表示开启电子卡功能
  768. payOrderResultInfo.setCardEnabledFlag("1");
  769. }else {
  770. payOrderResultInfo.setCardEnabledFlag("0");
  771. }
  772. }else {
  773. //不共享,则查看油站电子卡是否开启
  774. if(params.get("cardEnabledFlag").toString().equals("1")){
  775. payOrderResultInfo.setCardEnabledFlag("1");
  776. }else {
  777. payOrderResultInfo.setCardEnabledFlag("0");
  778. }
  779. }
  780. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  781. if(payOrderResultInfo.getCardEnabledFlag().equals("1")){
  782. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  783. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  784. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  785. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  786. }
  787. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  788. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  789. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting(); //是否叠加等级方案
  790. String isMarket = cardRechargeSettingList.get(0).getIsMarket(); //等候否叠加营销方案
  791. if(isMarket.equals("1")){
  792. if(isGradeSetting.equals("1")){
  793. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt).subtract(dzkGradeDiscountAmt);
  794. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  795. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  796. BigDecimal dzkDiscountAmtSum = dzkDiscountAmt.add(dzkGradeDiscountAmt); //电子卡优惠金额
  797. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmtSum.toString());
  798. }else {
  799. //如果电子卡设置执行营销方案不执行等级优惠 则 电子卡支付金额 =实收金额-营销优惠金额
  800. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt);
  801. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  802. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  803. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString());
  804. }
  805. }else {
  806. if(isGradeSetting.equals("1")){
  807. //如果电子卡设置不执行营销方案执行等级优惠 则 电子卡支付金额 =应收金额-等级优惠金额
  808. BigDecimal dzkAmt = receivableAmt.subtract(dzkGradeDiscountAmt);
  809. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  810. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  811. payOrderResultInfo.setDzkDiscountAmt(dzkGradeDiscountAmt.toString());
  812. }else {
  813. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  814. payOrderResultInfo.setDzkDiscountAmt("0");
  815. }
  816. }
  817. }
  818. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  819. customerElectronicCard.setStationId(Integer.valueOf(params.get("stationId").toString()));
  820. customerElectronicCard.setCardOilsType(params.get("cardOilsType").toString());
  821. customerElectronicCard.setUnionId(params.get("unionId").toString());
  822. customerElectronicCard.setMobilePhone(params.get("userPhone").toString());
  823. customerElectronicCard.setCustomerName(params.get("customerName").toString());
  824. //查询客户余额和卡的类型
  825. Map<String, String> map = this.selectCardBalance(customerElectronicCard, params);
  826. payOrderResultInfo.setBalance(map.get("balance"));
  827. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  828. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  829. payOrderResultInfo.setDzkDiscountPrice(oilPrice.toString());
  830. String dzkAmt = payOrderResultInfo.getDzkAmt();
  831. if(oilLiters.toString().equals("0.00")){
  832. payOrderResultInfo.setDzkDiscountPrice(oilPrice.toString());
  833. }else {
  834. BigDecimal dzkDiscountPrice = new BigDecimal(dzkAmt).divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  835. payOrderResultInfo.setDzkDiscountPrice(dzkDiscountPrice.toString());
  836. }
  837. }
  838. return payOrderResultInfo;
  839. }
  840. //计算独立直降
  841. public PayOrderResultInfo calculateZhiJiangDiscount(Map<String ,Object> params){
  842. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  843. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  844. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  845. BigDecimal discountAmt = new BigDecimal(0); //营销方案优惠金额
  846. BigDecimal amt = receivableAmt;
  847. BigDecimal discountPrice = oilPrice;
  848. BigDecimal gradeDiscountAmt = new BigDecimal(0); //等级优惠金额
  849. BigDecimal gradeDiscountPriceAmt = new BigDecimal("0");
  850. BigDecimal dzkGradeDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需等级优惠金额值
  851. BigDecimal dzkDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需营销优惠金额值
  852. //加油升数
  853. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  854. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  855. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  856. }
  857. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo(); //计算结果存放值
  858. //计算等级优惠
  859. PayOrderResultInfo payOrderResultInfoGrade = this.calculateGradeDiscount(params);
  860. gradeDiscountAmt = new BigDecimal(payOrderResultInfoGrade.getDiscountAmt());
  861. gradeDiscountPriceAmt = new BigDecimal(payOrderResultInfoGrade.getGradeDiscountPriceAmt());
  862. dzkGradeDiscountAmt = gradeDiscountAmt; //同时给电子卡赋值等级优惠金额
  863. params.put("discountPlanType", "3");
  864. List<Map> customerMarkertPlanList = customerGradeServices.getCustomerMarkertPlanList(params);
  865. if(customerMarkertPlanList !=null && customerMarkertPlanList.size() >0){
  866. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("discountAmt").toString()); //条件金额
  867. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("gasoilDiscountAmt").toString());
  868. String discountTerm = customerMarkertPlanList.get(0).get("discountTerm").toString();
  869. String discountSettingFlag;
  870. switch (discountTerm){
  871. case "1": //按加油升数
  872. if(oilLiters.compareTo(discountAmt_b) ==1 || oilLiters.compareTo(discountAmt_b) ==0){
  873. discountPrice = oilPrice.subtract(gasoilDiscountAmt_b);
  874. amt = discountPrice.multiply(oilLiters);
  875. discountAmt = receivableAmt.subtract(amt);
  876. // discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  877. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  878. //会员活动是否开启:1是;0否'
  879. if(customerMarkertPlanList.get(0).containsKey("discountSettingFlag") && customerMarkertPlanList.get(0).get("discountSettingFlag").toString() !="") {
  880. discountSettingFlag = customerMarkertPlanList.get(0).get("discountSettingFlag").toString();
  881. if (discountSettingFlag != null && discountSettingFlag.equals("1")) {
  882. String discountType = customerMarkertPlanList.get(0).get("discountType").toString(); //会员日周期类型设置
  883. String discountDate = customerMarkertPlanList.get(0).get("discountDate").toString(); //按固定日期
  884. String discountActivityAmt = customerMarkertPlanList.get(0).get("discountActivityAmt").toString(); //会员日优惠金额
  885. if (StringUtils.isNotBlank(discountType) && StringUtils.isNotBlank(discountDate) && StringUtils.isNotBlank(discountActivityAmt)) {
  886. //当前时间是否是活动会员日
  887. boolean b = isActivityDay(discountType, discountDate);
  888. if (b) {
  889. discountPrice = oilPrice.subtract(new BigDecimal(discountActivityAmt));
  890. amt = discountPrice.multiply(oilLiters);
  891. discountAmt = receivableAmt.subtract(amt);
  892. //discountAmt = oilLiters.multiply(new BigDecimal(discountActivityAmt));
  893. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  894. }
  895. }
  896. }
  897. }
  898. }
  899. break;
  900. case "2": //按加油金额
  901. if(receivableAmt.compareTo(discountAmt_b) ==1 || receivableAmt.compareTo(discountAmt_b) ==0){
  902. discountPrice = oilPrice.subtract(gasoilDiscountAmt_b);
  903. amt = discountPrice.multiply(oilLiters);
  904. discountAmt = receivableAmt.subtract(amt);
  905. //discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  906. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  907. //会员活动是否开启:1是;0否'
  908. if(customerMarkertPlanList.get(0).containsKey("discountSettingFlag") && customerMarkertPlanList.get(0).get("discountSettingFlag").toString() !="") {
  909. discountSettingFlag = customerMarkertPlanList.get(0).get("discountSettingFlag").toString();
  910. if (discountSettingFlag != null && discountSettingFlag.equals("1")) {
  911. String discountType = customerMarkertPlanList.get(0).get("discountType").toString(); //会员日周期类型设置
  912. String discountDate = customerMarkertPlanList.get(0).get("discountDate").toString(); //按固定日期
  913. String discountActivityAmt = customerMarkertPlanList.get(0).get("discountActivityAmt").toString(); //会员日优惠金额
  914. if (StringUtils.isNotBlank(discountType) && StringUtils.isNotBlank(discountDate) && StringUtils.isNotBlank(discountActivityAmt)) {
  915. //当前时间是否是活动会员日
  916. boolean b = isActivityDay(discountType, discountDate);
  917. if (b) {
  918. discountPrice = oilPrice.subtract(new BigDecimal(discountActivityAmt));
  919. amt = discountPrice.multiply(oilLiters);
  920. discountAmt = receivableAmt.subtract(amt);
  921. //discountAmt = oilLiters.multiply(new BigDecimal(discountActivityAmt));
  922. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  923. }
  924. }
  925. }
  926. }
  927. }
  928. break;
  929. }
  930. dzkDiscountAmt = discountAmt; //赋值电子卡优惠金额
  931. String vipDiscountyPlus = customerMarkertPlanList.get(0).get("vipDiscountyPlus").toString();
  932. //该营销方案是否叠加等级优惠
  933. if(vipDiscountyPlus.equals("1")){
  934. //如果叠加等级优惠
  935. discountPrice = discountPrice.subtract(gradeDiscountPriceAmt);
  936. discountAmt = discountAmt.add(gradeDiscountAmt);
  937. amt = receivableAmt.subtract(discountAmt);
  938. }
  939. }
  940. // amt = receivableAmt.subtract(discountAmt); //应收金额
  941. amt = amt.setScale(2, BigDecimal.ROUND_HALF_UP);
  942. if(amt.toString().equals("0.00")){
  943. amt = new BigDecimal("0.01");
  944. }
  945. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  946. //discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  947. payOrderResultInfo.setAmt(amt.toString());
  948. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  949. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  950. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  951. payOrderResultInfo.setOilLiters(oilLiters.toString());
  952. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  953. payOrderResultInfo.setOilPrice(oilPrice.toString());
  954. payOrderResultInfo.setDzkAmt(amt.toString());
  955. payOrderResultInfo.setOilsCardFlag("0");
  956. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  957. //表示开启共享
  958. if(params.get("cardEnabledFlagGroup").toString().equals("1")){ //表示开启电子卡功能
  959. payOrderResultInfo.setCardEnabledFlag("1");
  960. }else {
  961. payOrderResultInfo.setCardEnabledFlag("0");
  962. }
  963. }else {
  964. //不共享,则查看油站电子卡是否开启
  965. if(params.get("cardEnabledFlag").toString().equals("1")){
  966. payOrderResultInfo.setCardEnabledFlag("1");
  967. }else {
  968. payOrderResultInfo.setCardEnabledFlag("0");
  969. }
  970. }
  971. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  972. if(payOrderResultInfo.getCardEnabledFlag().equals("1")){
  973. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  974. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  975. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  976. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  977. }
  978. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  979. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  980. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting(); //是否叠加等级方案
  981. String isMarket = cardRechargeSettingList.get(0).getIsMarket(); //等候否叠加营销方案
  982. if(isMarket.equals("1")){
  983. if(isGradeSetting.equals("1")){
  984. //都叠加 电子卡支付金额 = 应收金额 - 营销优惠金额 - 等级优惠金额
  985. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt).subtract(dzkGradeDiscountAmt);
  986. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt; //如果为负数,则默认设置0.01元
  987. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  988. BigDecimal dzkDiscountAmtSum = dzkDiscountAmt.add(dzkGradeDiscountAmt); //电子卡总优惠金额
  989. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmtSum.toString());
  990. }else {
  991. //叠加营销方案不叠加等级优惠: 电子卡支付金额 =实收金额-营销优惠金额
  992. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt);
  993. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  994. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  995. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString());
  996. }
  997. }else {
  998. if(isGradeSetting.equals("1")){
  999. //不叠加营销方案叠加等级优惠:电子卡支付金额 =应收金额-等级优惠金额
  1000. BigDecimal dzkAmt = receivableAmt.subtract(dzkGradeDiscountAmt);
  1001. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  1002. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  1003. payOrderResultInfo.setDzkDiscountAmt(dzkGradeDiscountAmt.toString());
  1004. }else {
  1005. //都不叠加: 电子卡支付金额 = 应收金额
  1006. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  1007. payOrderResultInfo.setDzkDiscountAmt("0");
  1008. }
  1009. }
  1010. }
  1011. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  1012. customerElectronicCard.setStationId(Integer.valueOf(params.get("stationId").toString()));
  1013. customerElectronicCard.setCardOilsType(params.get("cardOilsType").toString());
  1014. customerElectronicCard.setUnionId(params.get("unionId").toString());
  1015. customerElectronicCard.setMobilePhone(params.get("userPhone").toString());
  1016. customerElectronicCard.setCustomerName(params.get("customerName").toString());
  1017. //查询客户余额和卡的类型
  1018. Map<String, String> map = this.selectCardBalance(customerElectronicCard, params);
  1019. payOrderResultInfo.setBalance(map.get("balance"));
  1020. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  1021. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  1022. String dzkAmt = payOrderResultInfo.getDzkAmt();
  1023. payOrderResultInfo.setDzkDiscountPrice(oilPrice.toString());
  1024. if(oilLiters.toString().equals("0.00")){
  1025. payOrderResultInfo.setDzkDiscountPrice(oilPrice.toString());
  1026. }else {
  1027. BigDecimal dzkDiscountPrice = new BigDecimal(dzkAmt).divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  1028. payOrderResultInfo.setDzkDiscountPrice(dzkDiscountPrice.toString());
  1029. }
  1030. }
  1031. return payOrderResultInfo;
  1032. }
  1033. //计算立减
  1034. public PayOrderResultInfo calculateLiJianDiscount(Map<String ,Object> params){
  1035. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  1036. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  1037. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  1038. BigDecimal discountAmt = new BigDecimal(0); //优惠金额
  1039. BigDecimal amt = receivableAmt;
  1040. BigDecimal discountPrice = oilPrice;
  1041. BigDecimal gradeDiscountAmt = new BigDecimal(0); //等级优惠金额
  1042. BigDecimal dzkGradeDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需等级优惠金额值
  1043. BigDecimal dzkDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需营销优惠金额值
  1044. //加油升数
  1045. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  1046. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  1047. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  1048. }
  1049. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  1050. //计算等级优惠
  1051. PayOrderResultInfo payOrderResultInfoGrade = this.calculateGradeDiscount(params);
  1052. gradeDiscountAmt = new BigDecimal(payOrderResultInfoGrade.getDiscountAmt());
  1053. dzkGradeDiscountAmt = gradeDiscountAmt; //同时给电子卡赋值等级优惠金额
  1054. params.put("discountPlanType", "2");
  1055. List<Map> customerMarkertPlanList = customerGradeServices.getCustomerMarkertPlanList(params);
  1056. if(customerMarkertPlanList !=null && customerMarkertPlanList.size() >0){
  1057. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("discountAmt").toString()); //条件金额
  1058. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("gasoilDiscountAmt").toString()); //享受的优惠
  1059. if(receivableAmt.compareTo(discountAmt_b) == 1 || receivableAmt.compareTo(discountAmt_b) == 0){
  1060. discountAmt = gasoilDiscountAmt_b;
  1061. //会员活动是否开启:1是;0否'
  1062. if(customerMarkertPlanList.get(0).containsKey("discountSettingFlag") && customerMarkertPlanList.get(0).get("discountSettingFlag").toString() !="") {
  1063. String discountSettingFlag = customerMarkertPlanList.get(0).get("discountSettingFlag").toString();
  1064. if (discountSettingFlag != null && discountSettingFlag.equals("1")) {
  1065. String discountType = customerMarkertPlanList.get(0).get("discountType").toString(); //会员日周期类型设置
  1066. String discountDate = customerMarkertPlanList.get(0).get("discountDate").toString(); //按固定日期
  1067. String discountActivityAmt = customerMarkertPlanList.get(0).get("discountActivityAmt").toString(); //会员日优惠金额
  1068. if (StringUtils.isNotBlank(discountType) && StringUtils.isNotBlank(discountDate) && StringUtils.isNotBlank(discountActivityAmt)) {
  1069. //当前时间是否是会员日
  1070. boolean b = isActivityDay(discountType, discountDate);
  1071. if (b) {
  1072. discountAmt = new BigDecimal(discountActivityAmt);
  1073. }
  1074. }
  1075. }
  1076. }
  1077. }
  1078. dzkDiscountAmt = discountAmt;
  1079. String vipDiscountyPlus = customerMarkertPlanList.get(0).get("vipDiscountyPlus").toString();
  1080. if(vipDiscountyPlus.equals("1")){
  1081. //如果叠加等级优惠
  1082. discountAmt = discountAmt.add(gradeDiscountAmt);
  1083. }
  1084. }
  1085. amt = receivableAmt.subtract(discountAmt); //应收金额
  1086. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  1087. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  1088. payOrderResultInfo.setAmt(amt.toString());
  1089. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  1090. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  1091. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  1092. payOrderResultInfo.setOilLiters(oilLiters.toString());
  1093. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  1094. payOrderResultInfo.setOilPrice(oilPrice.toString());
  1095. payOrderResultInfo.setDzkAmt(amt.toString());
  1096. payOrderResultInfo.setOilsCardFlag("0");
  1097. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  1098. //表示开启共享
  1099. if(params.get("cardEnabledFlagGroup").toString().equals("1")){ //表示开启电子卡功能
  1100. payOrderResultInfo.setCardEnabledFlag("1");
  1101. }else {
  1102. payOrderResultInfo.setCardEnabledFlag("0");
  1103. }
  1104. }else {
  1105. //不共享,则查看油站电子卡是否开启
  1106. if(params.get("cardEnabledFlag").toString().equals("1")){
  1107. payOrderResultInfo.setCardEnabledFlag("1");
  1108. }else {
  1109. payOrderResultInfo.setCardEnabledFlag("0");
  1110. }
  1111. }
  1112. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  1113. if(payOrderResultInfo.getCardEnabledFlag().equals("1")){
  1114. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  1115. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  1116. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  1117. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  1118. }
  1119. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  1120. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  1121. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting(); //是否叠加等级方案
  1122. String isMarket = cardRechargeSettingList.get(0).getIsMarket(); //等候否叠加营销方案
  1123. if(isMarket.equals("1")){
  1124. if(isGradeSetting.equals("1")){
  1125. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt).subtract(dzkGradeDiscountAmt);
  1126. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  1127. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  1128. BigDecimal dzkDiscountAmtSum = dzkDiscountAmt.add(dzkGradeDiscountAmt); //电子卡优惠金额
  1129. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmtSum.toString());
  1130. }else {
  1131. //如果电子卡设置执行营销方案不执行等级优惠 则 电子卡支付金额 =实收金额-营销优惠金额
  1132. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt);
  1133. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  1134. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  1135. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString());
  1136. }
  1137. }else {
  1138. if(isGradeSetting.equals("1")){
  1139. //如果电子卡设置不执行营销方案执行等级优惠 则 电子卡支付金额 =应收金额-等级优惠金额
  1140. BigDecimal dzkAmt = receivableAmt.subtract(dzkGradeDiscountAmt);
  1141. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  1142. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  1143. payOrderResultInfo.setDzkDiscountAmt(dzkGradeDiscountAmt.toString());
  1144. }else {
  1145. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  1146. payOrderResultInfo.setDzkDiscountAmt("0");
  1147. }
  1148. }
  1149. }
  1150. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  1151. customerElectronicCard.setStationId(Integer.valueOf(params.get("stationId").toString()));
  1152. customerElectronicCard.setCardOilsType(params.get("cardOilsType").toString());
  1153. customerElectronicCard.setUnionId(params.get("unionId").toString());
  1154. customerElectronicCard.setMobilePhone(params.get("userPhone").toString());
  1155. customerElectronicCard.setCustomerName(params.get("customerName").toString());
  1156. //查询客户余额和卡的类型
  1157. Map<String, String> map = this.selectCardBalance(customerElectronicCard, params);
  1158. payOrderResultInfo.setBalance(map.get("balance"));
  1159. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  1160. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  1161. String dzkAmt = payOrderResultInfo.getDzkAmt();
  1162. payOrderResultInfo.setDzkDiscountPrice(oilPrice.toString());
  1163. if(oilLiters.toString().equals("0.00")){
  1164. payOrderResultInfo.setDzkDiscountPrice(oilPrice.toString());
  1165. }else {
  1166. BigDecimal dzkDiscountPrice = new BigDecimal(dzkAmt).divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  1167. payOrderResultInfo.setDzkDiscountPrice(dzkDiscountPrice.toString());
  1168. }
  1169. }
  1170. return payOrderResultInfo;
  1171. }
  1172. //计算满减
  1173. public PayOrderResultInfo calculateManJianDiscount(Map<String ,Object> params){
  1174. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  1175. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  1176. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  1177. BigDecimal discountAmt = new BigDecimal(0); //优惠金额
  1178. BigDecimal amt = receivableAmt;
  1179. BigDecimal discountPrice = oilPrice;
  1180. BigDecimal gradeDiscountAmt = new BigDecimal(0); //等级优惠金额
  1181. BigDecimal dzkGradeDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需等级优惠金额值
  1182. BigDecimal dzkDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需营销优惠金额值
  1183. //加油升数
  1184. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  1185. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  1186. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  1187. }
  1188. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  1189. //计算等级优惠
  1190. PayOrderResultInfo payOrderResultInfoGrade = this.calculateGradeDiscount(params);
  1191. gradeDiscountAmt = new BigDecimal(payOrderResultInfoGrade.getDiscountAmt());
  1192. dzkGradeDiscountAmt = gradeDiscountAmt;
  1193. params.put("discountPlanType", "1");
  1194. List<Map> customerMarkertPlanList = customerGradeServices.getCustomerMarkertPlanList(params);
  1195. if(customerMarkertPlanList !=null && customerMarkertPlanList.size() >0){
  1196. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("discountAmt").toString()); //条件金额
  1197. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("gasoilDiscountAmt").toString()); //享受的优惠
  1198. if(receivableAmt.compareTo(discountAmt_b) == 1 || receivableAmt.compareTo(discountAmt_b) == 0){
  1199. discountAmt = receivableAmt.divide(discountAmt_b, 2, BigDecimal.ROUND_HALF_UP).multiply(gasoilDiscountAmt_b); //优惠金额
  1200. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  1201. //会员活动是否开启:1是;0否'
  1202. if(customerMarkertPlanList.get(0).containsKey("discountSettingFlag") && customerMarkertPlanList.get(0).get("discountSettingFlag").toString() !=""){
  1203. String discountSettingFlag = customerMarkertPlanList.get(0).get("discountSettingFlag").toString();
  1204. if(discountSettingFlag !=null && discountSettingFlag.equals("1")){
  1205. String discountType = customerMarkertPlanList.get(0).get("discountType").toString(); //会员日周期类型设置
  1206. String discountDate = customerMarkertPlanList.get(0).get("discountDate").toString(); //按固定日期
  1207. String discountActivityAmt = customerMarkertPlanList.get(0).get("discountActivityAmt").toString(); //会员日优惠金额
  1208. //当前时间是否是会员日
  1209. if(StringUtils.isNotBlank(discountType) && StringUtils.isNotBlank(discountDate) && StringUtils.isNotBlank(discountActivityAmt)){
  1210. boolean b = isActivityDay(discountType, discountDate);
  1211. if(b){
  1212. discountAmt = receivableAmt.divide(discountAmt_b, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(discountActivityAmt)); //优惠金额
  1213. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  1214. }
  1215. }
  1216. }
  1217. }
  1218. }
  1219. dzkDiscountAmt = discountAmt;
  1220. //是否共享会员等级优惠叠加: 1 代表是; 2 代表否;
  1221. String vipDiscountyPlus = customerMarkertPlanList.get(0).get("vipDiscountyPlus").toString();
  1222. if(vipDiscountyPlus.equals("1")){
  1223. //如果叠加等级优惠
  1224. discountAmt = discountAmt.add(gradeDiscountAmt);
  1225. }
  1226. }
  1227. amt = receivableAmt.subtract(discountAmt); //应收金额
  1228. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  1229. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  1230. payOrderResultInfo.setAmt(amt.toString());
  1231. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  1232. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  1233. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  1234. payOrderResultInfo.setOilLiters(oilLiters.toString());
  1235. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  1236. payOrderResultInfo.setOilPrice(oilPrice.toString());
  1237. payOrderResultInfo.setDzkAmt(amt.toString());
  1238. payOrderResultInfo.setOilsCardFlag("0");
  1239. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  1240. //表示开启共享
  1241. if(params.get("cardEnabledFlagGroup").toString().equals("1")){ //表示开启电子卡功能
  1242. payOrderResultInfo.setCardEnabledFlag("1");
  1243. }else {
  1244. payOrderResultInfo.setCardEnabledFlag("0");
  1245. }
  1246. }else {
  1247. //不共享,则查看油站电子卡是否开启
  1248. if(params.get("cardEnabledFlag").toString().equals("1")){
  1249. payOrderResultInfo.setCardEnabledFlag("1");
  1250. }else {
  1251. payOrderResultInfo.setCardEnabledFlag("0");
  1252. }
  1253. }
  1254. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  1255. if(payOrderResultInfo.getCardEnabledFlag().equals("1")){
  1256. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  1257. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  1258. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  1259. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  1260. }
  1261. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  1262. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  1263. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting(); //是否叠加等级方案
  1264. String isMarket = cardRechargeSettingList.get(0).getIsMarket(); //等候否叠加营销方案
  1265. if(isMarket.equals("1")){
  1266. if(isGradeSetting.equals("1")){
  1267. //如果电子卡设置执行营销方案不执行等级优惠 则 电子卡支付金额 =实收金额-营销优惠-等级优惠金额
  1268. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt).subtract(dzkGradeDiscountAmt);
  1269. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  1270. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  1271. BigDecimal dzkDiscountAmtSum = dzkDiscountAmt.add(dzkGradeDiscountAmt); //电子卡优惠金额
  1272. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmtSum.toString());
  1273. }else {
  1274. //如果电子卡设置执行营销方案不执行等级优惠 则 电子卡支付金额 =实收金额-营销优惠金额
  1275. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt);
  1276. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  1277. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  1278. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString());
  1279. }
  1280. }else {
  1281. if(isGradeSetting.equals("1")){
  1282. //如果电子卡设置不执行营销方案执行等级优惠 则 电子卡支付金额 =应收金额-等级优惠金额
  1283. BigDecimal dzkAmt = receivableAmt.subtract(dzkGradeDiscountAmt);
  1284. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  1285. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  1286. payOrderResultInfo.setDzkDiscountAmt(dzkGradeDiscountAmt.toString());
  1287. }else {
  1288. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  1289. payOrderResultInfo.setDzkDiscountAmt("0");
  1290. }
  1291. }
  1292. }
  1293. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  1294. customerElectronicCard.setStationId(Integer.valueOf(params.get("stationId").toString()));
  1295. customerElectronicCard.setCardOilsType(params.get("cardOilsType").toString());
  1296. customerElectronicCard.setUnionId(params.get("unionId").toString());
  1297. customerElectronicCard.setMobilePhone(params.get("userPhone").toString());
  1298. customerElectronicCard.setCustomerName(params.get("customerName").toString());
  1299. //查询客户余额和卡的类型
  1300. Map<String, String> map = this.selectCardBalance(customerElectronicCard, params);
  1301. payOrderResultInfo.setBalance(map.get("balance"));
  1302. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  1303. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  1304. String dzkAmt = payOrderResultInfo.getDzkAmt();
  1305. payOrderResultInfo.setDzkDiscountPrice(oilPrice.toString());
  1306. if(oilLiters.toString().equals("0.00")){
  1307. payOrderResultInfo.setDzkDiscountPrice(oilPrice.toString());
  1308. }else {
  1309. BigDecimal dzkDiscountPrice = new BigDecimal(dzkAmt).divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  1310. payOrderResultInfo.setDzkDiscountPrice(dzkDiscountPrice.toString());
  1311. }
  1312. }
  1313. return payOrderResultInfo;
  1314. }
  1315. //计算等级优惠
  1316. public PayOrderResultInfo calculateGradeDiscount(Map<String ,Object> params){
  1317. String oilName = params.get("oilName").toString();
  1318. String stationId = params.get("stationId").toString();
  1319. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  1320. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  1321. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  1322. BigDecimal discountAmt = new BigDecimal(0); //优惠金额
  1323. BigDecimal dzkDiscountAmt = discountAmt; //优惠金额
  1324. BigDecimal amt = receivableAmt;
  1325. BigDecimal discountPrice = oilPrice;
  1326. BigDecimal gradeDiscountPriceAmt = new BigDecimal("0"); //价格优惠金额
  1327. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  1328. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  1329. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  1330. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  1331. }
  1332. //当前客户是否已存在当前油站客户信息中
  1333. CustomerManage customerManage = new CustomerManage();
  1334. //customerManage.setPhoneNumber(params.get("mobilePhone").toString());
  1335. customerManage.setUnionId(params.get("unionId").toString());
  1336. customerManage.setOilName(oilName);
  1337. customerManage.setStationId(Integer.valueOf(stationId));
  1338. CustomerManage customerManageInfo = customerManagerService.getCustomerManageInfo(customerManage);
  1339. if(customerManageInfo !=null){
  1340. //当前客户所加油的订单已存在等级时
  1341. double amtSum = customerManageInfo.getAmt().doubleValue(); //当前客户已累计的金额
  1342. List<Map> cList = customerGradeServices.getCustomerGradeListOrderByDesc(params); //获取油站的等级优惠方案 倒叙查询规则
  1343. if(cList !=null && cList.size() >0){ //当前油站设置等级方案时
  1344. for(Map m : cList){
  1345. if(amtSum >= Double.valueOf(m.get("memberConditStart").toString())){
  1346. discountPrice = oilPrice.subtract(new BigDecimal(m.get("discountAmt").toString()));
  1347. gradeDiscountPriceAmt = new BigDecimal(m.get("discountAmt").toString());
  1348. discountAmt = oilLiters.multiply(new BigDecimal(m.get("discountAmt").toString()));
  1349. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  1350. break;
  1351. }
  1352. }
  1353. }
  1354. }else {
  1355. //当前客户所加油的订单不存在等级时
  1356. List<Map> customerGradeList = customerGradeServices.getCustomerGradeList(params); //升序查询 取第一条
  1357. if(customerGradeList !=null && customerGradeList.size() >0){
  1358. discountPrice = oilPrice.subtract(new BigDecimal(customerGradeList.get(0).get("discountAmt").toString()));
  1359. gradeDiscountPriceAmt = new BigDecimal(customerGradeList.get(0).get("discountAmt").toString());
  1360. discountAmt = oilLiters.multiply(new BigDecimal(customerGradeList.get(0).get("discountAmt").toString()));
  1361. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  1362. }
  1363. }
  1364. amt = receivableAmt.subtract(discountAmt); //应收金额
  1365. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  1366. //discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  1367. payOrderResultInfo.setGradeDiscountPriceAmt(gradeDiscountPriceAmt.toString());
  1368. payOrderResultInfo.setAmt(amt.toString());
  1369. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  1370. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  1371. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  1372. payOrderResultInfo.setOilLiters(oilLiters.toString());
  1373. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  1374. payOrderResultInfo.setOilPrice(oilPrice.toString());
  1375. payOrderResultInfo.setDzkAmt(amt.toString());
  1376. payOrderResultInfo.setOilsCardFlag("0");
  1377. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  1378. //表示开启共享
  1379. if(params.get("cardEnabledFlagGroup").toString().equals("1")){ //表示开启电子卡功能
  1380. payOrderResultInfo.setCardEnabledFlag("1");
  1381. }else {
  1382. payOrderResultInfo.setCardEnabledFlag("0");
  1383. }
  1384. }else {
  1385. //不共享,则查看油站电子卡是否开启
  1386. if(params.get("cardEnabledFlag").toString().equals("1")){
  1387. payOrderResultInfo.setCardEnabledFlag("1");
  1388. }else {
  1389. payOrderResultInfo.setCardEnabledFlag("0");
  1390. }
  1391. }
  1392. //电子卡功能是否开启
  1393. logger.info("油站是否开启电子会员卡功能: " +payOrderResultInfo.getCardEnabledFlag());
  1394. if(payOrderResultInfo.getCardEnabledFlag().equals("1")){
  1395. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  1396. payOrderResultInfo.setDzkDiscountAmt("0");
  1397. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  1398. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  1399. if(params.get("cardRuleFlagGroup").toString().equals("1")){
  1400. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  1401. }
  1402. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  1403. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  1404. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting();
  1405. if(isGradeSetting.equals("1")){
  1406. payOrderResultInfo.setDzkAmt(amt.toString());
  1407. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  1408. }
  1409. }
  1410. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  1411. customerElectronicCard.setStationId(Integer.valueOf(params.get("stationId").toString()));
  1412. customerElectronicCard.setCardOilsType(params.get("cardOilsType").toString());
  1413. customerElectronicCard.setUnionId(params.get("unionId").toString());
  1414. customerElectronicCard.setMobilePhone(params.get("userPhone").toString());
  1415. customerElectronicCard.setCustomerName(params.get("customerName").toString());
  1416. //查询客户余额和卡的类型
  1417. Map<String, String> map = this.selectCardBalance(customerElectronicCard, params);
  1418. payOrderResultInfo.setBalance(map.get("balance"));
  1419. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  1420. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  1421. String dzkAmt = payOrderResultInfo.getDzkAmt();
  1422. payOrderResultInfo.setDzkDiscountPrice(oilPrice.toString());
  1423. if(oilLiters.toString().equals("0.00")){
  1424. payOrderResultInfo.setDzkDiscountPrice(oilPrice.toString());
  1425. }else {
  1426. BigDecimal dzkDiscountPrice = new BigDecimal(dzkAmt).divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  1427. payOrderResultInfo.setDzkDiscountPrice(dzkDiscountPrice.toString());
  1428. }
  1429. }
  1430. return payOrderResultInfo;
  1431. }
  1432. //获取客户所拥有的优惠券并计算支付金额
  1433. public List<UserCoupon> getUserCouponAscList(PayOrderResultInfo p){
  1434. Integer stationId = p.getStationId();
  1435. String unionId = p.getUnionId();
  1436. List<UserCoupon> userCouponsList = new ArrayList<>();
  1437. StationInfo stationInfo = new StationInfo();
  1438. stationInfo.setStationId(stationId);
  1439. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  1440. if(stationInfos !=null && stationInfos.getCouponEnabledFlag() !=null && stationInfos.getCouponEnabledFlag().equals("1")){
  1441. UserCoupon userCoupon = new UserCoupon();
  1442. userCoupon.setStationId(stationId);
  1443. if(stationInfos.getCouponFlag() !=null && stationInfos.getCouponFlag().equals("1")){
  1444. userCoupon.setStationId(stationInfos.getGroupId());
  1445. }
  1446. userCoupon.setUnionId(unionId);
  1447. userCoupon.setCouponIsUsed("0");
  1448. userCoupon.setExpireFlag("0"); // SQL 条件判断 过期标志: 1 代表使用的优惠券已过期查询参数; 0 代表未过期有效的优惠券
  1449. userCoupon.setNoVerificationVerFlag("0"); //SQL 条件判断 查询没有异业券的参数标识: 0代表只有加油券 1代表只有异业券
  1450. userCoupon.setCurrentTime(new Date());
  1451. userCoupon.setOilName(p.getOilName());
  1452. userCouponsList = couponService.selectUserCoupons(userCoupon);
  1453. //循环计算优惠券金额 并排序
  1454. if(userCouponsList !=null && userCouponsList.size()>0){
  1455. for (UserCoupon uc: userCouponsList){
  1456. String status = uc.getStatus();
  1457. if(status !=null && status.equals("1")){
  1458. //返回前端使用优惠券后的计算金额计算后
  1459. CouponReckonAmt couponReckonAmt = new CouponReckonAmt();
  1460. //couponReckonAmt.setAmt();
  1461. String amt = p.getAmt();
  1462. String discountAmt = p.getDiscountAmt();
  1463. String oilPrice = p.getOilPrice();
  1464. String discountPrice = p.getDiscountPrice();
  1465. String dzkAmt = p.getDzkAmt();
  1466. String dzkDiscountAmt = p.getDzkDiscountAmt();
  1467. String oilLiters = p.getOilLiters();
  1468. couponReckonAmt.setAmt(amt);
  1469. couponReckonAmt.setDiscountAmt(discountAmt);
  1470. couponReckonAmt.setOilPrice(oilPrice);
  1471. couponReckonAmt.setDiscountPrice(discountPrice);
  1472. couponReckonAmt.setDzkAmt(dzkAmt);
  1473. couponReckonAmt.setDzkDiscountAmt(dzkDiscountAmt);
  1474. couponReckonAmt.setOilLiters(oilLiters);
  1475. //优惠券时间类型
  1476. String availableControl = uc.getAvailableControl();
  1477. BigDecimal couponThresholdAmt = uc.getCouponThresholdAmt();
  1478. String oilName = p.getOilName();
  1479. String oilNames = uc.getOilName();
  1480. //判断该油品是否能用该张张优惠券
  1481. boolean contains = oilNames.contains(oilName);
  1482. if(contains){
  1483. BigDecimal receivableAmt = new BigDecimal(p.getReceivableAmt());
  1484. //应收金额大于优惠券门槛金额
  1485. if(!(receivableAmt.compareTo(couponThresholdAmt) == -1)){
  1486. switch (availableControl){
  1487. case "0":
  1488. couponReckonAmt = this.calCouponDiscount(couponReckonAmt, uc, p);
  1489. break;
  1490. case "1":
  1491. boolean activityDay_1 = this.isActivityDay("1", uc.getCycleDays());
  1492. if(activityDay_1)
  1493. //指定每周几
  1494. couponReckonAmt = this.calCouponDiscount(couponReckonAmt, uc, p);
  1495. break;
  1496. case "2":
  1497. boolean activityDay_2 = this.isActivityDay("2", uc.getCycleDays());
  1498. if(activityDay_2)
  1499. //指定每月的几号
  1500. couponReckonAmt = this.calCouponDiscount(couponReckonAmt, uc, p);
  1501. break;
  1502. case "3":
  1503. boolean activityDay_3 = this.isActivityDay("3", uc.getAppointedDays());
  1504. if (activityDay_3)
  1505. //指定日
  1506. couponReckonAmt = this.calCouponDiscount(couponReckonAmt, uc, p);
  1507. break;
  1508. }
  1509. }
  1510. }
  1511. uc.setCouponNo(""); //隐藏优惠券核销码
  1512. uc.setCouponReckonAmt(couponReckonAmt);
  1513. }
  1514. }
  1515. //根据支付金额大小进行优惠券排序
  1516. userCouponsList.sort((((o1, o2) -> o1.getCouponReckonAmt().getAmt().compareTo(o2.getCouponReckonAmt().getAmt()))));
  1517. }
  1518. }
  1519. return userCouponsList;
  1520. }
  1521. /*
  1522. * //计算使用优惠券后金额
  1523. * @param c //返回前端使用优惠券后的计算
  1524. * @param uc //用户所持有该张优惠券的信息
  1525. * @return
  1526. */
  1527. public CouponReckonAmt calCouponDiscount(CouponReckonAmt c, UserCoupon uc, PayOrderResultInfo p){
  1528. CouponReckonAmt couponReckonAmt = c;
  1529. String amt = c.getAmt();
  1530. String discountAmt = c.getDiscountAmt();
  1531. String dzkAmt = c.getDzkAmt();
  1532. String dzkDiscountAmt = c.getDzkDiscountAmt();
  1533. String oilLiters = c.getOilLiters();
  1534. String discountPrice = c.getDiscountPrice();
  1535. BigDecimal couponAmt = uc.getCouponAmt();
  1536. String receivableAmt = p.getReceivableAmt();
  1537. String dzkDiscountPrice = p.getDzkDiscountPrice();
  1538. BigDecimal dzkAmtNew = new BigDecimal(dzkAmt);
  1539. BigDecimal amtNew = new BigDecimal(amt);
  1540. BigDecimal discountPriceNew = new BigDecimal(discountPrice);
  1541. BigDecimal discountAmtNew = new BigDecimal(discountAmt);
  1542. BigDecimal dzkDiscountAmtNew = new BigDecimal(dzkDiscountAmt);
  1543. BigDecimal dzkDiscountPriceNew = new BigDecimal(dzkDiscountPrice);
  1544. //表示等级叠加
  1545. if("1".equals(p.getAllDiscountType())){
  1546. if("1".equals(uc.getIsGradeFlag())){
  1547. switch (uc.getCouponType()){
  1548. case "1":
  1549. amtNew = new BigDecimal(amt).subtract(couponAmt);
  1550. amtNew = amtNew.signum() == -1 ? new BigDecimal("0.01") : amtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  1551. if(!oilLiters.equals("0.00")){
  1552. discountPriceNew = amtNew.divide(new BigDecimal(oilLiters), 2, BigDecimal.ROUND_HALF_UP);
  1553. }
  1554. couponReckonAmt.setDiscountPrice(discountPriceNew.toString());
  1555. discountAmtNew = discountAmtNew.add(couponAmt);
  1556. couponReckonAmt.setDiscountAmt(discountAmtNew.toString());
  1557. couponReckonAmt.setAmt(amtNew.toString());
  1558. break;
  1559. case "2":
  1560. BigDecimal zheKouAmt = new BigDecimal(amt).multiply(couponAmt).divide(new BigDecimal("100"));
  1561. discountAmtNew = discountAmtNew.add(zheKouAmt);
  1562. amtNew = amtNew.subtract(zheKouAmt);
  1563. amtNew = amtNew.signum() == -1 ? new BigDecimal("0.01") : amtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  1564. if(!oilLiters.equals("0.00")){
  1565. discountPriceNew = amtNew.divide(new BigDecimal(oilLiters), 2, BigDecimal.ROUND_HALF_UP);
  1566. }
  1567. discountAmtNew = discountAmtNew.setScale(2, BigDecimal.ROUND_HALF_UP);
  1568. couponReckonAmt.setDiscountAmt(discountAmtNew.toString());
  1569. couponReckonAmt.setDiscountPrice(discountPriceNew.toString());
  1570. couponReckonAmt.setAmt(amtNew.toString());
  1571. break;
  1572. }
  1573. }else {
  1574. //表示不叠加 则只使用优惠券
  1575. switch (uc.getCouponType()){
  1576. case "1":
  1577. amtNew = new BigDecimal(receivableAmt).subtract(couponAmt);
  1578. amtNew = amtNew.signum() == -1 ? new BigDecimal("0.01") : amtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  1579. if(!oilLiters.equals("0.00")){
  1580. discountPriceNew = amtNew.divide(new BigDecimal(oilLiters), 2, BigDecimal.ROUND_HALF_UP);
  1581. }
  1582. couponReckonAmt.setDiscountPrice(discountPriceNew.toString());
  1583. discountAmtNew = new BigDecimal("0.00");
  1584. discountAmtNew = discountAmtNew.add(couponAmt);
  1585. couponReckonAmt.setDiscountAmt(discountAmtNew.toString());
  1586. couponReckonAmt.setAmt(amtNew.toString());
  1587. break;
  1588. case "2":
  1589. //优惠券折扣金额
  1590. BigDecimal zheKouAmt = new BigDecimal(receivableAmt).multiply(couponAmt).divide(new BigDecimal("100"));
  1591. discountAmtNew = new BigDecimal("0.00");
  1592. discountAmtNew = discountAmtNew.add(zheKouAmt);
  1593. amtNew = amtNew.subtract(discountAmtNew);
  1594. amtNew = amtNew.signum() == -1 ? new BigDecimal("0.01") : amtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  1595. if(!oilLiters.equals("0.00")){
  1596. discountPriceNew = amtNew.divide(new BigDecimal(oilLiters), 2, BigDecimal.ROUND_HALF_UP);
  1597. }
  1598. discountAmtNew = discountAmtNew.setScale(2, BigDecimal.ROUND_HALF_UP);
  1599. couponReckonAmt.setDiscountAmt(discountAmtNew.toString());
  1600. couponReckonAmt.setDiscountPrice(discountPriceNew.toString());
  1601. couponReckonAmt.setAmt(amtNew.toString());
  1602. break;
  1603. }
  1604. }
  1605. }
  1606. //表示营销叠加
  1607. if("2".equals(p.getAllDiscountType())){
  1608. if("1".equals(uc.getIsMarketFlag())){
  1609. switch (uc.getCouponType()){
  1610. case "1":
  1611. amtNew = new BigDecimal(amt).subtract(couponAmt);
  1612. amtNew = amtNew.signum() == -1 ? new BigDecimal("0.01") : amtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  1613. if(!oilLiters.equals("0.00")){
  1614. discountPriceNew = amtNew.divide(new BigDecimal(oilLiters), 2, BigDecimal.ROUND_HALF_UP);
  1615. }
  1616. couponReckonAmt.setDiscountPrice(discountPriceNew.toString());
  1617. discountAmtNew = discountAmtNew.add(couponAmt);
  1618. couponReckonAmt.setDiscountAmt(discountAmtNew.toString());
  1619. couponReckonAmt.setAmt(amtNew.toString());
  1620. break;
  1621. case "2":
  1622. BigDecimal zheKouAmt = new BigDecimal(amt).multiply(couponAmt).divide(new BigDecimal("100"));
  1623. discountAmtNew = discountAmtNew.add(zheKouAmt);
  1624. amtNew = amtNew.subtract(zheKouAmt);
  1625. amtNew = amtNew.signum() == -1 ? new BigDecimal("0.01") : amtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  1626. if(!oilLiters.equals("0.00")){
  1627. discountPriceNew = amtNew.divide(new BigDecimal(oilLiters), 2, BigDecimal.ROUND_HALF_UP);
  1628. }
  1629. discountAmtNew = discountAmtNew.setScale(2, BigDecimal.ROUND_HALF_UP);
  1630. couponReckonAmt.setDiscountAmt(discountAmtNew.toString());
  1631. couponReckonAmt.setDiscountPrice(discountPriceNew.toString());
  1632. couponReckonAmt.setAmt(amtNew.toString());
  1633. break;
  1634. }
  1635. }else {
  1636. //不叠加营销
  1637. switch (uc.getCouponType()){
  1638. case "1":
  1639. //优惠券后的优惠金额
  1640. amtNew = new BigDecimal(receivableAmt).subtract(couponAmt);
  1641. amtNew = amtNew.signum() == -1 ? new BigDecimal("0.01") : amtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  1642. //优惠券后的优惠价格
  1643. if(!oilLiters.equals("0.00")){
  1644. discountPriceNew = amtNew.divide(new BigDecimal(oilLiters), 2, BigDecimal.ROUND_HALF_UP);
  1645. }
  1646. discountAmtNew = new BigDecimal("0.00");
  1647. discountAmtNew = discountAmtNew.add(couponAmt);
  1648. couponReckonAmt.setDiscountAmt(discountAmtNew.toString());
  1649. couponReckonAmt.setDiscountPrice(discountPriceNew.toString());
  1650. couponReckonAmt.setAmt(amtNew.toString());
  1651. break;
  1652. case "2":
  1653. //优惠券后的优惠金额
  1654. BigDecimal zheKouAmt = new BigDecimal(receivableAmt).multiply(couponAmt).divide(new BigDecimal("100"));
  1655. discountAmtNew = new BigDecimal("0.00");
  1656. discountAmtNew = discountAmtNew.add(zheKouAmt);
  1657. amtNew = amtNew.subtract(discountAmtNew);
  1658. amtNew = amtNew.signum() == -1 ? new BigDecimal("0.01") : amtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  1659. //优惠券后的优惠价格
  1660. if(!oilLiters.equals("0.00")){
  1661. discountPriceNew = amtNew.divide(new BigDecimal(oilLiters), 2, BigDecimal.ROUND_HALF_UP);
  1662. }
  1663. discountAmtNew = discountAmtNew.setScale(2, BigDecimal.ROUND_HALF_UP);
  1664. couponReckonAmt.setDiscountAmt(discountAmtNew.toString());
  1665. couponReckonAmt.setDiscountPrice(discountPriceNew.toString());
  1666. couponReckonAmt.setAmt(amtNew.toString());
  1667. break;
  1668. }
  1669. }
  1670. }
  1671. //表示标签叠加
  1672. if("3".equals(p.getAllDiscountType())){
  1673. if("1".equals(uc.getIsLabelFlag())){
  1674. switch (uc.getCouponType()){
  1675. case "1":
  1676. amtNew = new BigDecimal(amt).subtract(couponAmt);
  1677. amtNew = amtNew.signum() == -1 ? new BigDecimal("0.01") : amtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  1678. if(!oilLiters.equals("0.00")){
  1679. discountPriceNew = amtNew.divide(new BigDecimal(oilLiters), 2, BigDecimal.ROUND_HALF_UP);
  1680. }
  1681. couponReckonAmt.setDiscountPrice(discountPriceNew.toString());
  1682. discountAmtNew = discountAmtNew.add(couponAmt);
  1683. couponReckonAmt.setDiscountAmt(discountAmtNew.toString());
  1684. couponReckonAmt.setAmt(amtNew.toString());
  1685. break;
  1686. case "2":
  1687. BigDecimal zheKouAmt = new BigDecimal(amt).multiply(couponAmt).divide(new BigDecimal("100"));
  1688. discountAmtNew = discountAmtNew.add(zheKouAmt);
  1689. amtNew = amtNew.subtract(zheKouAmt);
  1690. amtNew = amtNew.signum() == -1 ? new BigDecimal("0.01") : amtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  1691. if(!oilLiters.equals("0.00")){
  1692. discountPriceNew = amtNew.divide(new BigDecimal(oilLiters), 2, BigDecimal.ROUND_HALF_UP);
  1693. }
  1694. discountAmtNew = discountAmtNew.setScale(2, BigDecimal.ROUND_HALF_UP);
  1695. couponReckonAmt.setDiscountAmt(discountAmtNew.toString());
  1696. couponReckonAmt.setDiscountPrice(discountPriceNew.toString());
  1697. couponReckonAmt.setAmt(amtNew.toString());
  1698. break;
  1699. }
  1700. }else {
  1701. switch (uc.getCouponType()){
  1702. case "1":
  1703. //优惠券后的优惠金额
  1704. amtNew = new BigDecimal(receivableAmt).subtract(couponAmt);
  1705. amtNew = amtNew.signum() == -1 ? new BigDecimal("0.01") : amtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  1706. //优惠券后的优惠价格
  1707. if(!oilLiters.equals("0.00")){
  1708. discountPriceNew = amtNew.divide(new BigDecimal(oilLiters), 2, BigDecimal.ROUND_HALF_UP);
  1709. }
  1710. discountAmtNew = new BigDecimal("0.00");
  1711. discountAmtNew = discountAmtNew.add(couponAmt);
  1712. couponReckonAmt.setDiscountAmt(discountAmtNew.toString());
  1713. couponReckonAmt.setDiscountPrice(discountPriceNew.toString());
  1714. couponReckonAmt.setAmt(amtNew.toString());
  1715. break;
  1716. case "2":
  1717. //优惠券后的优惠金额
  1718. BigDecimal zheKouAmt = new BigDecimal(receivableAmt).multiply(couponAmt).divide(new BigDecimal("100"));
  1719. discountAmtNew = new BigDecimal("0.00");
  1720. discountAmtNew = discountAmtNew.add(zheKouAmt);
  1721. amtNew = amtNew.subtract(discountAmtNew);
  1722. amtNew = amtNew.signum() == -1 ? new BigDecimal("0.01") : amtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  1723. //优惠券后的优惠价格
  1724. if(!oilLiters.equals("0.00")){
  1725. discountPriceNew = amtNew.divide(new BigDecimal(oilLiters), 2, BigDecimal.ROUND_HALF_UP);
  1726. }
  1727. discountAmtNew = discountAmtNew.setScale(2, BigDecimal.ROUND_HALF_UP);
  1728. couponReckonAmt.setDiscountAmt(discountAmtNew.toString());
  1729. couponReckonAmt.setDiscountPrice(discountPriceNew.toString());
  1730. couponReckonAmt.setAmt(amtNew.toString());
  1731. break;
  1732. }
  1733. }
  1734. }
  1735. //表示电子卡
  1736. if("1".equals(p.getCardEnabledFlag())) {
  1737. if ("1".equals(uc.getIsCardFlag())) {
  1738. switch (uc.getCouponType()){
  1739. case "1":
  1740. //与电子卡共享
  1741. dzkAmtNew = new BigDecimal(dzkAmt).subtract(couponAmt);
  1742. dzkAmtNew = dzkAmtNew.signum() == -1 ? new BigDecimal("0.01") : dzkAmtNew.setScale(2, BigDecimal.ROUND_HALF_UP);
  1743. dzkDiscountAmtNew = dzkDiscountAmtNew.add(couponAmt);
  1744. couponReckonAmt.setDzkDiscountAmt(dzkDiscountAmtNew.toString());
  1745. couponReckonAmt.setDzkAmt(dzkAmtNew.toString());
  1746. if(!oilLiters.equals("0.00")){
  1747. dzkDiscountPriceNew = dzkAmtNew.divide(new BigDecimal(oilLiters), 2 ,BigDecimal.ROUND_HALF_UP);
  1748. }
  1749. couponReckonAmt.setDzkDiscountPrice(dzkDiscountPriceNew.toString());
  1750. break;
  1751. case "2":
  1752. //与电子卡共享
  1753. BigDecimal zheKouDzkAmt = new BigDecimal(dzkAmt).multiply(couponAmt).divide(new BigDecimal("100"));
  1754. dzkDiscountAmtNew = dzkDiscountAmtNew.add(zheKouDzkAmt);
  1755. dzkAmtNew = dzkAmtNew.subtract(zheKouDzkAmt);
  1756. dzkAmtNew = dzkAmtNew.signum() == -1 ? new BigDecimal("0.01") : dzkAmtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  1757. dzkDiscountAmtNew = dzkDiscountAmtNew.setScale(2, BigDecimal.ROUND_HALF_UP);
  1758. couponReckonAmt.setDzkDiscountAmt(dzkDiscountAmtNew.toString());
  1759. couponReckonAmt.setDzkAmt(dzkAmtNew.toString());
  1760. if(!oilLiters.equals("0.00")){
  1761. dzkDiscountPriceNew = dzkAmtNew.divide(new BigDecimal(oilLiters), 2 ,BigDecimal.ROUND_HALF_UP);
  1762. }
  1763. couponReckonAmt.setDzkDiscountPrice(dzkDiscountPriceNew.toString());
  1764. break;
  1765. }
  1766. }else {
  1767. switch (uc.getCouponType()){
  1768. case "1":
  1769. //与电子卡共享
  1770. dzkAmtNew = new BigDecimal(receivableAmt).subtract(couponAmt);
  1771. dzkAmtNew = dzkAmtNew.signum() == -1 ? new BigDecimal("0.01") : dzkAmtNew.setScale(2, BigDecimal.ROUND_HALF_UP);
  1772. dzkDiscountAmtNew = new BigDecimal("0.00");
  1773. dzkDiscountAmtNew = dzkDiscountAmtNew.add(couponAmt);
  1774. couponReckonAmt.setDzkDiscountAmt(dzkDiscountAmtNew.toString());
  1775. couponReckonAmt.setDzkAmt(dzkAmtNew.toString());
  1776. if(!oilLiters.equals("0.00")){
  1777. dzkDiscountPriceNew = dzkAmtNew.divide(new BigDecimal(oilLiters), 2 ,BigDecimal.ROUND_HALF_UP);
  1778. }
  1779. couponReckonAmt.setDzkDiscountPrice(dzkDiscountPriceNew.toString());
  1780. break;
  1781. case "2":
  1782. BigDecimal zheKouDzkAmt = new BigDecimal(receivableAmt).multiply(couponAmt).divide(new BigDecimal("100"));
  1783. dzkDiscountAmtNew = new BigDecimal("0.00");
  1784. dzkDiscountAmtNew = dzkDiscountAmtNew.add(zheKouDzkAmt);
  1785. dzkAmtNew = dzkAmtNew.subtract(dzkDiscountAmtNew);
  1786. dzkAmtNew = dzkAmtNew.signum() == -1 ? new BigDecimal("0.01") : dzkAmtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  1787. dzkDiscountAmtNew = dzkDiscountAmtNew.setScale(2, BigDecimal.ROUND_HALF_UP);
  1788. couponReckonAmt.setDzkDiscountAmt(dzkDiscountAmtNew.toString());
  1789. couponReckonAmt.setDzkAmt(dzkAmtNew.toString());
  1790. if(!oilLiters.equals("0.00")){
  1791. dzkDiscountPriceNew = dzkAmtNew.divide(new BigDecimal(oilLiters), 2 ,BigDecimal.ROUND_HALF_UP);
  1792. }
  1793. couponReckonAmt.setDzkDiscountPrice(dzkDiscountPriceNew.toString());
  1794. break;
  1795. }
  1796. }
  1797. }
  1798. return couponReckonAmt;
  1799. }
  1800. /*
  1801. * 获取领取方式
  1802. * @param stationId
  1803. * @return
  1804. */
  1805. public List<CouponIssue> getCouponIssue(Integer stationId){
  1806. CouponIssue c = new CouponIssue();
  1807. c.setStationId(stationId);
  1808. c.setIssueType("3");
  1809. c.setStatus("1");
  1810. List<CouponIssue> couponIssuesList = couponService.selectCouponIssueList(c);
  1811. return couponIssuesList;
  1812. }
  1813. /*
  1814. * 查询用户电子会员卡余额
  1815. * @param card
  1816. * @param params
  1817. * @return
  1818. */
  1819. public Map<String, String> selectCardBalance(CustomerElectronicCard card, Map params) {
  1820. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  1821. customerElectronicCard.setCardOilsType(card.getCardOilsType());
  1822. customerElectronicCard.setStationId(card.getStationId());
  1823. customerElectronicCard.setUnionId(card.getUnionId());
  1824. BigDecimal balance = new BigDecimal(0);
  1825. String cardOilsType1 ="";
  1826. Map<String, String> result = new HashMap<>();
  1827. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  1828. customerCardSetting.setStationId(card.getStationId());
  1829. if(params.get("cardRuleFlagGroup").equals("1")){ //
  1830. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  1831. customerElectronicCard.setStationId(Integer.valueOf(params.get("groupId").toString()));
  1832. }
  1833. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  1834. if(cardRechargeSettingList !=null && cardRechargeSettingList.size()>0){
  1835. String cardOilsTypeExist = cardRechargeSettingList.get(0).getCardOilsType();
  1836. String[] split = cardOilsTypeExist.split(",");
  1837. List<String> strings = Arrays.asList(split);
  1838. if(strings.contains(card.getCardOilsType())){
  1839. CustomerElectronicCard electronicCardInfo = electronicMembershipCardService.getElectronicCardInfoByUnionId(customerElectronicCard);
  1840. if(electronicCardInfo !=null){
  1841. //已存在卡
  1842. balance = electronicCardInfo.getAmt();
  1843. cardOilsType1 = electronicCardInfo.getCardOilsType();
  1844. result.put("balance",balance.toString());
  1845. result.put("oilsCardFlag", "1");
  1846. result.put("cardOilsType",cardOilsType1);
  1847. }else {
  1848. //如果油站已开启该卡,用户没有卡
  1849. String currentTime = String.valueOf(System.currentTimeMillis());
  1850. String customerNo = card.getStationId() + currentTime;
  1851. customerElectronicCard.setCustomerNo(customerNo);
  1852. customerElectronicCard.setAmt(new BigDecimal(0));
  1853. customerElectronicCard.setCreateTime(new Date());
  1854. customerElectronicCard.setCustomerName(card.getCustomerName());
  1855. customerElectronicCard.setMobilePhone(card.getMobilePhone());
  1856. electronicMembershipCardService.insetElectronicCard(customerElectronicCard);
  1857. CustomerElectronicCard electronicCardInfoNew = electronicMembershipCardService.getElectronicCardInfoByUnionId(customerElectronicCard);
  1858. balance = electronicCardInfoNew.getAmt();
  1859. result.put("balance",balance.toString());
  1860. result.put("oilsCardFlag", "1");
  1861. result.put("cardOilsType",electronicCardInfoNew.getCardOilsType());
  1862. }
  1863. }else {
  1864. result.put("oilsCardFlag", "0");
  1865. }
  1866. }else {
  1867. result.put("oilsCardFlag", "0");
  1868. }
  1869. return result;
  1870. }
  1871. /*
  1872. * 营销方案活动日优惠
  1873. * @param discountType 活动日时间类型
  1874. * @param discountDate 活动日时间字符串,格式:1,2,3,4,5
  1875. * @return
  1876. */
  1877. public boolean isActivityDay(String discountType, String discountDate){
  1878. boolean boo= false;
  1879. if(discountDate !=null && discountDate !=""){
  1880. String currentTime = null; //当前时间
  1881. String[] discountDateArray = discountDate.split(",");
  1882. Calendar calendar = Calendar.getInstance();
  1883. calendar.setTime(new Date()); //获取当前时间
  1884. switch (discountType){
  1885. case "1": // 1.按周来
  1886. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1887. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1888. currentTime = String.valueOf(day_Week);
  1889. break;
  1890. case "2": // 2.每月的 多少号
  1891. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1892. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1893. currentTime = String.valueOf(day_month); //当前时间
  1894. break;
  1895. case "3": // 3.固定日期
  1896. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1897. break;
  1898. }
  1899. //活动日优惠金额
  1900. for (String s : discountDateArray){
  1901. if(s.equals(currentTime)){
  1902. boo = true;
  1903. break;
  1904. }
  1905. }
  1906. }
  1907. return boo;
  1908. }
  1909. /*
  1910. * 根据订单号获取订单信息
  1911. * produces="application/json;charset=UTF-8",consumes = "application/json",
  1912. * @RequestBody String orderno
  1913. * @param
  1914. * @return
  1915. */
  1916. @RequestMapping(value = "/selectOrderInfoByOrdNo", method = RequestMethod.GET)
  1917. @ResponseBody
  1918. public String getPayOrderList(@RequestParam String orderNo){
  1919. Gson gson =new Gson();
  1920. ResultData resultData =null;
  1921. if(StringUtils.isNotBlank(orderNo)){
  1922. PayOrder payOrder = payOrderService.selectOrderInfoByOrdNo(orderNo);
  1923. resultData = ResultData.success(payOrder);
  1924. }else {
  1925. resultData=ResultData.error(CodeMsg.SEARCH_FAIL);
  1926. }
  1927. return gson.toJson(resultData);
  1928. }
  1929. /*
  1930. * 根据用户openId和用户类型userType查询用户订单
  1931. * @param openId
  1932. * @param userType
  1933. * @return
  1934. */
  1935. @RequestMapping(value = "/getOrderListByOpenIdAndUserType", method = RequestMethod.GET)
  1936. @ResponseBody
  1937. public String getOrderListByOpenIdAndUserType(@RequestParam("openId") String openId){
  1938. Gson gson =new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
  1939. ResultData resultData =null;
  1940. if(StringUtils.isNotBlank(openId)){
  1941. AppUserInfo appUserInfo = new AppUserInfo();
  1942. appUserInfo.setMinaOpenid(openId);
  1943. // switch (userType){
  1944. // case "1":
  1945. // appUserInfo.setMinaOpenid(openId);
  1946. // break;
  1947. // case "2":
  1948. // appUserInfo.setALiId(openId);
  1949. // break;
  1950. // }
  1951. List<PayOrder> payOrderList = payOrderService.getOrderListByOpenIdAndUserType(appUserInfo);
  1952. resultData=ResultData.success(payOrderList);
  1953. }else {
  1954. resultData=ResultData.error(CodeMsg.SEARCH_FAIL);
  1955. }
  1956. return gson.toJson(resultData);
  1957. }
  1958. }