PayOrderController.java 84 KB

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