PayOrderController.java 60 KB

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