PayOrderController.java 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  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. //小程序支付生成订单
  42. @RequestMapping(value = "/AddPayOrderInfoNew", consumes = "application/json", method = RequestMethod.POST)
  43. @ResponseBody
  44. @Transactional
  45. public String AddPayOrderInfoNew(@RequestBody PayOrderRequest payOrderRequest){
  46. logger.info("获取订单前端传来参数openId:"+ payOrderRequest.getOpenId());
  47. Gson gson =new Gson();
  48. ResultData resultData =null;
  49. AppUserInfo appUserInfo =new AppUserInfo(); //查询客户信息传递参数
  50. PayOrder payOrder = new PayOrder(); //生成订单参数
  51. if(StringUtils.isNotBlank(payOrderRequest.getUserType()) && StringUtils.isNotBlank(payOrderRequest.getOpenId()) && StringUtils.isNotBlank(payOrderRequest.getOilName()) &&
  52. StringUtils.isNotBlank(payOrderRequest.getOilGun()) && payOrderRequest.getReceivableAmt() !=null){
  53. appUserInfo.setUserType(payOrderRequest.getUserType());
  54. switch (payOrderRequest.getUserType()){
  55. case "1": //小程序
  56. appUserInfo.setMinaOpenid(payOrderRequest.getOpenId());
  57. break;
  58. case "2": //支付宝公众号
  59. appUserInfo.setALiId(payOrderRequest.getOpenId());
  60. break;
  61. }
  62. StationInfo stationInfo = new StationInfo();
  63. stationInfo.setStationId(payOrderRequest.getStationId());
  64. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  65. Map<String ,Object> resultMap = new HashMap<>(); //返回结果集
  66. if(stationInfos !=null){
  67. payOrder.setStationName(stationInfos.getStationName());
  68. //获取油站图片和名称
  69. resultMap.put("stationPic", stationInfos.getStationPic());
  70. resultMap.put("stationName", stationInfos.getStationName());
  71. AppUserInfo appUserInfos = appUserInfoService.getAppUserInfo(appUserInfo);
  72. if(appUserInfos !=null){
  73. payOrderRequest.setCustomerPhone(appUserInfos.getMobilePhone()); //客户手机号; 注:此处存放手机号用于获取客户信息参数查询
  74. payOrderRequest.setUnionId(appUserInfos.getUnionId()); //客户UnionId;注:此处存放unionId用于获取客户电子卡参数查询
  75. payOrder.setConsumer(appUserInfos.getBlogNickName()); //昵称
  76. payOrder.setConsumerId(appUserInfos.getUserId()); //用户id
  77. Random random = new Random();
  78. String result="";
  79. for(int i=0;i<6;i++){
  80. result+=random.nextInt(10);
  81. }
  82. String ordNo=System.nanoTime()+result;
  83. payOrder.setOrderNo(ordNo); //订单号
  84. logger.info("生成的订单号:" + ordNo);
  85. payOrder.setDiscountCouponAmt(payOrderRequest.getDiscountCouponAmt()); //优惠劵金额
  86. payOrder.setDiscountCoupon(payOrderRequest.getDiscountCoupon()); //优惠券
  87. payOrder.setCarNo(payOrderRequest.getCarNo()); //车牌号、
  88. payOrder.setCustomerGrade(payOrderRequest.getCustomerGrade()); //客户电话
  89. payOrder.setMemberNo(payOrderRequest.getMemberNo()); //会员卡号
  90. payOrder.setMemberAmt(payOrderRequest.getMemberAmt()); //会员支付金额
  91. payOrder.setScore(payOrderRequest.getScore()); //积分
  92. payOrder.setStationId(payOrderRequest.getStationId()); //油站id
  93. payOrder.setStatus("0"); //创建订单 未支付状态 0
  94. payOrder.setCreatedDate(new Timestamp(new Date().getTime())); //创建时间
  95. payOrder.setOrderType(payOrderRequest.getOrderType()); //订单类型
  96. payOrder.setOilGun(payOrderRequest.getOilGun()); //油枪号
  97. payOrder.setReceivableAmt(Double.valueOf(payOrderRequest.getReceivableAmt())); //订单应收金额
  98. String oilName =payOrderRequest.getOilName();
  99. //获取该油品所属哪一类
  100. Oil oil = new Oil();
  101. oil.setOilName(oilName);
  102. oil.setDictType("oil_name");
  103. Oil oilInfo = sysDictDataService.selectOilType(oil);
  104. payOrder.setOilType(oilInfo.getOilsType()); //油品类型
  105. String oilsType = oilInfo.getOilsType(); //获取订单类型
  106. logger.info("订单油品类型:" + oilsType);
  107. payOrderRequest.setCardOilsType(oilInfo.getOilsType()); //电子卡类型;注:用于获取客户电子卡参数查询
  108. payOrder.setOilName(oilName); //油品名称
  109. //根据油站和油枪获取加油员
  110. HashMap<String, Object> params = new HashMap<>();
  111. params.put("oliGunNo", payOrderRequest.getOilGun());
  112. params.put("stationId", payOrderRequest.getStationId());
  113. List<Map> mapResultList = payOrderMapper.selectPersonelName(params); //使用list原因:一个枪号对应多个加油员场景
  114. logger.info("加油员信息:"+ mapResultList.toString());
  115. if(mapResultList != null && mapResultList.size() > 0){
  116. String oilPersonnel = "";
  117. for (Map per : mapResultList){
  118. if(per.containsKey("personelName") && per.get("personelName").toString() !=null && per.get("personelName").toString() !=""){
  119. oilPersonnel += per.get("personelName").toString() +",";
  120. }
  121. }
  122. if(oilPersonnel !=""){
  123. payOrder.setOilPersonnel(oilPersonnel.substring(0, oilPersonnel.length()-1)); //加油员
  124. }
  125. }else {
  126. payOrder.setOilPersonnel("");
  127. }
  128. if(oilsType.equals("3")){ //订单类型是油品时计算
  129. payOrder.setOrderType("2");
  130. payOrder.setAmt(Double.valueOf(payOrderRequest.getReceivableAmt())); //非油品金额
  131. payOrder.setDiscountAmt(Double.valueOf(0)); //优惠金额
  132. payOrder.setOilPirce(payOrderRequest.getReceivableAmt()); //非油品价格
  133. payOrder.setOrderLiters("0");
  134. resultMap.put("oilsCardFlag", "0");
  135. resultMap.put("discountAmt", "0"); //优惠价格
  136. resultMap.put("amt", payOrderRequest.getReceivableAmt()); //实收价格
  137. resultMap.put("receivableAmt", payOrderRequest.getReceivableAmt()); //应收价格
  138. resultMap.put("oilLiters", "0");
  139. resultMap.put("discountPrice", "0");
  140. resultMap.put("ordNo", ordNo);
  141. payOrderMapper.insertSelective(payOrder);
  142. }else {
  143. PayOrderResultInfo payOrderResultInfo = this.calculateAmt(payOrderRequest); //计算订单金额 价格 加油升数 等等
  144. payOrder.setOilPirce(payOrderResultInfo.getOilPrice());
  145. payOrder.setOrderLiters(payOrderResultInfo.getOilLiters());
  146. payOrder.setDiscountAmt(Double.valueOf(payOrderResultInfo.getDiscountAmt()));
  147. payOrder.setAmt(Double.valueOf(payOrderResultInfo.getAmt()));
  148. payOrder.setOrderType("1");
  149. resultMap.put("cardEnabledFlag", payOrderResultInfo.getCardEnabledFlag());
  150. resultMap.put("oilsCardFlag", payOrderResultInfo.getOilsCardFlag());
  151. resultMap.put("discountAmt", payOrderResultInfo.getDiscountAmt()); //优惠价格
  152. resultMap.put("amt", payOrderResultInfo.getAmt()); //实收价格
  153. resultMap.put("receivableAmt", payOrderResultInfo.getReceivableAmt()); //应收价格
  154. resultMap.put("oilLiters", payOrderResultInfo.getOilLiters());
  155. resultMap.put("discountPrice", payOrderResultInfo.getDiscountPrice());
  156. resultMap.put("amt_dzk", payOrderResultInfo.getDzkAmt());
  157. resultMap.put("discountAmt_dzk", payOrderResultInfo.getDzkDiscountAmt()); //电子卡优惠金额
  158. resultMap.put("balance", payOrderResultInfo.getBalance()); //电子卡余额
  159. resultMap.put("cardOilsType", payOrderResultInfo.getCardOilsType()); //电子卡类型1.汽油; 2.柴油
  160. resultMap.put("ordNo", ordNo);
  161. logger.info("返回前端的结果:" +resultMap.toString());
  162. payOrderMapper.insertSelective(payOrder);
  163. }
  164. resultData = ResultData.success(resultMap);
  165. }else {
  166. //登录人验证失败
  167. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  168. }
  169. }else {
  170. resultData = ResultData.error(CodeMsg.REQUEST_FAIL);
  171. }
  172. }else {
  173. resultData = ResultData.error(CodeMsg.REQUEST_FAIL);
  174. }
  175. return gson.toJson(resultData);
  176. }
  177. //根据营销方案计算订单金额
  178. public PayOrderResultInfo calculateAmt(PayOrderRequest payOrderRequest){
  179. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  180. Integer stationId = payOrderRequest.getStationId(); //油站ID
  181. BigDecimal receivableAmt = new BigDecimal(payOrderRequest.getReceivableAmt()); //应收金额 用户输入的金额
  182. String oilName = payOrderRequest.getOilName(); //油品名称
  183. String openId = payOrderRequest.getOpenId(); //用户的openId
  184. Map<String, Object> map = new HashMap<>();
  185. map.put("oilName", oilName);
  186. map.put("stationId", stationId);
  187. //获取油站油品价格 优惠方案 是否开启电子卡
  188. Map<String, Object> result = stationService.selectStationOilPriceAndDiscountSetting(map);
  189. String oilPrice = result.get("oilPrice").toString(); //油站油品价格
  190. String discountSetting = result.get("discountSetting").toString(); //优惠方案
  191. String cardEnabledFlag = result.get("cardEnabledFlag").toString(); //是否开启电子卡
  192. String cardRuleFlag = result.get("cardRuleFlag").toString(); //是否共享电子卡储值规则
  193. String groupId = result.get("groupId").toString(); //是否共享电子卡储值规则
  194. Map<String ,Object> params = new HashMap<String, Object>();
  195. params.put("stationId", stationId);
  196. params.put("oilName", oilName);
  197. params.put("receivableAmt", receivableAmt);
  198. params.put("oilPrice", oilPrice);
  199. params.put("mobilePhone", payOrderRequest.getCustomerPhone());
  200. params.put("minaOpenid", openId);
  201. params.put("cardEnabledFlag", cardEnabledFlag);
  202. params.put("cardRuleFlag", cardRuleFlag);
  203. params.put("groupId", groupId);
  204. params.put("unionId", payOrderRequest.getUnionId());
  205. params.put("cardOilsType", payOrderRequest.getCardOilsType());
  206. switch (discountSetting){
  207. case "0": //不执营销方案时 计算等级优惠
  208. payOrderResultInfo = this.calculateGradeDiscount(params);
  209. break;
  210. case "1": //满减方案
  211. payOrderResultInfo = this.calculateManJianDiscount(params);
  212. break;
  213. case "2": //立减方案
  214. payOrderResultInfo = this.calculateLiJianDiscount(params);
  215. break;
  216. case "3": //独立直降
  217. payOrderResultInfo = this.calculateZhiJiangDiscount(params);
  218. break;
  219. }
  220. return payOrderResultInfo;
  221. }
  222. //计算独立直降
  223. public PayOrderResultInfo calculateZhiJiangDiscount(Map<String ,Object> params){
  224. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  225. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  226. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  227. BigDecimal discountAmt = new BigDecimal(0); //营销方案优惠金额
  228. BigDecimal amt = new BigDecimal(0);
  229. BigDecimal discountPrice = oilPrice;
  230. BigDecimal gradeDiscountAmt = new BigDecimal(0); //等级优惠金额
  231. BigDecimal dzkGradeDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需等级优惠金额值
  232. BigDecimal dzkDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需营销优惠金额值
  233. //加油升数
  234. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  235. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  236. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  237. }
  238. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo(); //计算结果存放值
  239. //计算等级优惠
  240. PayOrderResultInfo payOrderResultInfoGrade = this.calculateGradeDiscount(params);
  241. gradeDiscountAmt = new BigDecimal(payOrderResultInfoGrade.getDiscountAmt());
  242. dzkGradeDiscountAmt = gradeDiscountAmt; //同时给电子卡赋值等级优惠金额
  243. params.put("discountPlanType", "3");
  244. List<Map> customerMarkertPlanList = customerGradeServices.getCustomerMarkertPlanList(params);
  245. if(customerMarkertPlanList !=null && customerMarkertPlanList.size() >0){
  246. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("discountAmt").toString()); //条件金额
  247. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("gasoilDiscountAmt").toString());
  248. String discountTerm = customerMarkertPlanList.get(0).get("discountTerm").toString();
  249. switch (discountTerm){
  250. case "1": //按加油升数
  251. if(oilLiters.compareTo(discountAmt_b) ==1 || oilLiters.compareTo(discountAmt_b) ==0){
  252. discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  253. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  254. }
  255. break;
  256. case "2": //按加油金额
  257. if(receivableAmt.compareTo(discountAmt_b) ==1 || receivableAmt.compareTo(discountAmt_b) ==0){
  258. discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  259. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  260. }
  261. break;
  262. }
  263. dzkDiscountAmt = discountAmt; //赋值电子卡优惠金额
  264. String vipDiscountyPlus = customerMarkertPlanList.get(0).get("vipDiscountyPlus").toString();
  265. //该营销方案是否叠加等级优惠
  266. if(vipDiscountyPlus.equals("1")){
  267. //如果叠加等级优惠
  268. discountAmt = discountAmt.add(gradeDiscountAmt);
  269. }
  270. }
  271. amt = receivableAmt.subtract(discountAmt); //应收金额
  272. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  273. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  274. payOrderResultInfo.setAmt(amt.toString());
  275. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  276. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  277. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  278. payOrderResultInfo.setOilLiters(oilLiters.toString());
  279. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  280. payOrderResultInfo.setOilPrice(oilPrice.toString());
  281. payOrderResultInfo.setDzkAmt(amt.toString());
  282. payOrderResultInfo.setOilsCardFlag("0");
  283. payOrderResultInfo.setCardEnabledFlag(params.get("cardEnabledFlag").toString());
  284. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  285. if(params.get("cardEnabledFlag").toString().equals("1")){
  286. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  287. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  288. if(params.get("cardRuleFlag").toString().equals("1")){
  289. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  290. }
  291. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  292. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  293. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting(); //是否叠加等级方案
  294. String isMarket = cardRechargeSettingList.get(0).getIsMarket(); //等候否叠加营销方案
  295. if(isMarket.equals("1")){
  296. if(isGradeSetting.equals("1")){
  297. //都叠加 电子卡支付金额 = 应收金额 - 营销优惠金额 - 等级优惠金额
  298. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt).subtract(dzkGradeDiscountAmt);
  299. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt; //如果为负数,则默认设置0.01元
  300. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  301. BigDecimal dzkDiscountAmtSum = dzkDiscountAmt.add(dzkGradeDiscountAmt); //电子卡总优惠金额
  302. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmtSum.toString());
  303. }else {
  304. //叠加营销方案不叠加等级优惠: 电子卡支付金额 =实收金额-营销优惠金额
  305. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt);
  306. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  307. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  308. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString());
  309. }
  310. }else {
  311. if(isGradeSetting.equals("1")){
  312. //不叠加营销方案叠加等级优惠:电子卡支付金额 =应收金额-等级优惠金额
  313. BigDecimal dzkAmt = receivableAmt.subtract(dzkGradeDiscountAmt);
  314. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  315. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  316. payOrderResultInfo.setDzkDiscountAmt(dzkGradeDiscountAmt.toString());
  317. }else {
  318. //都不叠加: 电子卡支付金额 = 应收金额
  319. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  320. payOrderResultInfo.setDzkDiscountAmt("0");
  321. }
  322. }
  323. }
  324. //查询客户余额和卡的类型
  325. Map<String, String> map = this.selectCardBalance(Integer.valueOf(params.get("stationId").toString()), params.get("cardOilsType").toString(), params.get("unionId").toString());
  326. payOrderResultInfo.setBalance(map.get("balance"));
  327. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  328. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  329. }
  330. return payOrderResultInfo;
  331. }
  332. //计算立减
  333. public PayOrderResultInfo calculateLiJianDiscount(Map<String ,Object> params){
  334. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  335. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  336. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  337. BigDecimal discountAmt = new BigDecimal(0); //优惠金额
  338. BigDecimal amt = new BigDecimal(0);
  339. BigDecimal discountPrice = oilPrice;
  340. BigDecimal gradeDiscountAmt = new BigDecimal(0); //等级优惠金额
  341. BigDecimal dzkGradeDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需等级优惠金额值
  342. BigDecimal dzkDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需营销优惠金额值
  343. //加油升数
  344. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  345. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  346. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  347. }
  348. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  349. //计算等级优惠
  350. PayOrderResultInfo payOrderResultInfoGrade = this.calculateGradeDiscount(params);
  351. gradeDiscountAmt = new BigDecimal(payOrderResultInfoGrade.getDiscountAmt());
  352. dzkGradeDiscountAmt = gradeDiscountAmt; //同时给电子卡赋值等级优惠金额
  353. params.put("discountPlanType", "2");
  354. List<Map> customerMarkertPlanList = customerGradeServices.getCustomerMarkertPlanList(params);
  355. if(customerMarkertPlanList !=null && customerMarkertPlanList.size() >0){
  356. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("discountAmt").toString()); //条件金额
  357. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("gasoilDiscountAmt").toString()); //享受的优惠
  358. if(receivableAmt.compareTo(discountAmt_b) == 1 || receivableAmt.compareTo(discountAmt_b) == 0){
  359. discountAmt = gasoilDiscountAmt_b;
  360. }
  361. dzkDiscountAmt = discountAmt;
  362. String vipDiscountyPlus = customerMarkertPlanList.get(0).get("vipDiscountyPlus").toString();
  363. if(vipDiscountyPlus.equals("1")){
  364. //如果叠加等级优惠
  365. discountAmt = discountAmt.add(gradeDiscountAmt);
  366. }
  367. }
  368. amt = receivableAmt.subtract(discountAmt); //应收金额
  369. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  370. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  371. payOrderResultInfo.setAmt(amt.toString());
  372. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  373. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  374. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  375. payOrderResultInfo.setOilLiters(oilLiters.toString());
  376. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  377. payOrderResultInfo.setOilPrice(oilPrice.toString());
  378. payOrderResultInfo.setDzkAmt(amt.toString());
  379. payOrderResultInfo.setOilsCardFlag("0");
  380. payOrderResultInfo.setCardEnabledFlag(params.get("cardEnabledFlag").toString());
  381. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  382. if(params.get("cardEnabledFlag").toString().equals("1")){
  383. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  384. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  385. if(params.get("cardRuleFlag").toString().equals("1")){
  386. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  387. }
  388. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  389. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  390. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting(); //是否叠加等级方案
  391. String isMarket = cardRechargeSettingList.get(0).getIsMarket(); //等候否叠加营销方案
  392. if(isMarket.equals("1")){
  393. if(isGradeSetting.equals("1")){
  394. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt).subtract(dzkGradeDiscountAmt);
  395. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  396. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  397. BigDecimal dzkDiscountAmtSum = dzkDiscountAmt.add(dzkGradeDiscountAmt); //电子卡优惠金额
  398. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmtSum.toString());
  399. }else {
  400. //如果电子卡设置执行营销方案不执行等级优惠 则 电子卡支付金额 =实收金额-营销优惠金额
  401. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt);
  402. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  403. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  404. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString());
  405. }
  406. }else {
  407. if(isGradeSetting.equals("1")){
  408. //如果电子卡设置不执行营销方案执行等级优惠 则 电子卡支付金额 =应收金额-等级优惠金额
  409. BigDecimal dzkAmt = receivableAmt.subtract(dzkGradeDiscountAmt);
  410. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  411. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  412. payOrderResultInfo.setDzkDiscountAmt(dzkGradeDiscountAmt.toString());
  413. }else {
  414. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  415. payOrderResultInfo.setDzkDiscountAmt("0");
  416. }
  417. }
  418. }
  419. //查询客户余额和卡的类型
  420. Map<String, String> map = this.selectCardBalance(Integer.valueOf(params.get("stationId").toString()), params.get("cardOilsType").toString(), params.get("unionId").toString());
  421. payOrderResultInfo.setBalance(map.get("balance"));
  422. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  423. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  424. }
  425. return payOrderResultInfo;
  426. }
  427. //计算满减
  428. public PayOrderResultInfo calculateManJianDiscount(Map<String ,Object> params){
  429. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  430. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  431. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  432. BigDecimal discountAmt = new BigDecimal(0); //优惠金额
  433. BigDecimal amt = new BigDecimal(0);
  434. BigDecimal discountPrice = oilPrice;
  435. BigDecimal gradeDiscountAmt = new BigDecimal(0); //等级优惠金额
  436. BigDecimal dzkGradeDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需等级优惠金额值
  437. BigDecimal dzkDiscountAmt = new BigDecimal(0); //计算电子卡金额时所需营销优惠金额值
  438. //加油升数
  439. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  440. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  441. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  442. }
  443. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  444. //计算等级优惠
  445. PayOrderResultInfo payOrderResultInfoGrade = this.calculateGradeDiscount(params);
  446. gradeDiscountAmt = new BigDecimal(payOrderResultInfoGrade.getDiscountAmt());
  447. dzkGradeDiscountAmt = gradeDiscountAmt;
  448. params.put("discountPlanType", "1");
  449. List<Map> customerMarkertPlanList = customerGradeServices.getCustomerMarkertPlanList(params);
  450. if(customerMarkertPlanList !=null && customerMarkertPlanList.size() >0){
  451. BigDecimal discountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("discountAmt").toString()); //条件金额
  452. BigDecimal gasoilDiscountAmt_b = new BigDecimal(customerMarkertPlanList.get(0).get("gasoilDiscountAmt").toString()); //享受的优惠
  453. if(receivableAmt.compareTo(discountAmt_b) == 1 || receivableAmt.compareTo(discountAmt_b) == 0){
  454. discountAmt = receivableAmt.divide(discountAmt_b, 2, BigDecimal.ROUND_HALF_UP).multiply(gasoilDiscountAmt_b); //优惠金额
  455. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  456. }
  457. dzkDiscountAmt = discountAmt;
  458. //是否共享会员等级优惠叠加: 1 代表是; 2 代表否;
  459. String vipDiscountyPlus = customerMarkertPlanList.get(0).get("vipDiscountyPlus").toString();
  460. if(vipDiscountyPlus.equals("1")){
  461. //如果叠加等级优惠
  462. discountAmt = discountAmt.add(gradeDiscountAmt);
  463. }
  464. }
  465. amt = receivableAmt.subtract(discountAmt); //应收金额
  466. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  467. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  468. payOrderResultInfo.setAmt(amt.toString());
  469. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  470. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  471. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  472. payOrderResultInfo.setOilLiters(oilLiters.toString());
  473. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  474. payOrderResultInfo.setOilPrice(oilPrice.toString());
  475. payOrderResultInfo.setDzkAmt(amt.toString());
  476. payOrderResultInfo.setOilsCardFlag("0");
  477. payOrderResultInfo.setCardEnabledFlag(params.get("cardEnabledFlag").toString());
  478. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  479. if(params.get("cardEnabledFlag").toString().equals("1")){
  480. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  481. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  482. if(params.get("cardRuleFlag").toString().equals("1")){
  483. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  484. }
  485. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  486. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  487. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting(); //是否叠加等级方案
  488. String isMarket = cardRechargeSettingList.get(0).getIsMarket(); //等候否叠加营销方案
  489. if(isMarket.equals("1")){
  490. if(isGradeSetting.equals("1")){
  491. //如果电子卡设置执行营销方案不执行等级优惠 则 电子卡支付金额 =实收金额-营销优惠-等级优惠金额
  492. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt).subtract(dzkGradeDiscountAmt);
  493. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  494. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  495. BigDecimal dzkDiscountAmtSum = dzkDiscountAmt.add(dzkGradeDiscountAmt); //电子卡优惠金额
  496. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmtSum.toString());
  497. }else {
  498. //如果电子卡设置执行营销方案不执行等级优惠 则 电子卡支付金额 =实收金额-营销优惠金额
  499. BigDecimal dzkAmt = receivableAmt.subtract(dzkDiscountAmt);
  500. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  501. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  502. payOrderResultInfo.setDzkDiscountAmt(dzkDiscountAmt.toString());
  503. }
  504. }else {
  505. if(isGradeSetting.equals("1")){
  506. //如果电子卡设置不执行营销方案执行等级优惠 则 电子卡支付金额 =应收金额-等级优惠金额
  507. BigDecimal dzkAmt = receivableAmt.subtract(dzkGradeDiscountAmt);
  508. dzkAmt =dzkAmt.signum() == -1 ? new BigDecimal("0.01"): dzkAmt;
  509. payOrderResultInfo.setDzkAmt(dzkAmt.toString());
  510. payOrderResultInfo.setDzkDiscountAmt(dzkGradeDiscountAmt.toString());
  511. }else {
  512. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  513. payOrderResultInfo.setDzkDiscountAmt("0");
  514. }
  515. }
  516. }
  517. //查询客户余额和卡的类型
  518. Map<String, String> map = this.selectCardBalance(Integer.valueOf(params.get("stationId").toString()), params.get("cardOilsType").toString(), params.get("unionId").toString());
  519. payOrderResultInfo.setBalance(map.get("balance"));
  520. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  521. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  522. }
  523. return payOrderResultInfo;
  524. }
  525. //计算等级优惠
  526. public PayOrderResultInfo calculateGradeDiscount(Map<String ,Object> params){
  527. String oilName = params.get("oilName").toString();
  528. String stationId = params.get("stationId").toString();
  529. BigDecimal oilPrice = new BigDecimal(params.get("oilPrice").toString()); //油品价格
  530. BigDecimal receivableAmt = new BigDecimal(params.get("receivableAmt").toString()); //应收金额
  531. BigDecimal oilLiters = new BigDecimal("0.00"); //加油升数
  532. BigDecimal discountAmt = new BigDecimal(0); //优惠金额
  533. BigDecimal dzkDiscountAmt = discountAmt; //优惠金额
  534. BigDecimal amt = new BigDecimal(0);
  535. BigDecimal discountPrice = oilPrice;
  536. PayOrderResultInfo payOrderResultInfo = new PayOrderResultInfo();
  537. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_HALF_UP);
  538. if(!oilLiters.toString().substring(oilLiters.toString().indexOf(".") + 1).equals("00")){
  539. oilLiters = receivableAmt.divide(oilPrice,2, BigDecimal.ROUND_UP);
  540. }
  541. //当前客户是否已存在当前油站客户信息中
  542. CustomerManage customerManage = new CustomerManage();
  543. customerManage.setPhoneNumber(params.get("mobilePhone").toString());
  544. customerManage.setOilName(oilName);
  545. customerManage.setStationId(Integer.valueOf(stationId));
  546. CustomerManage customerManageInfo = customerManagerService.getCustomerManageInfo(customerManage);
  547. if(customerManageInfo !=null){
  548. //当前客户所加油的订单已存在等级时
  549. double amtSum = customerManageInfo.getAmt().doubleValue(); //当前客户已累计的金额
  550. List<Map> cList = customerGradeServices.getCustomerGradeListOrderByDesc(params); //获取油站的等级优惠方案 倒叙查询规则
  551. if(cList !=null && cList.size() >0){ //当前油站设置等级方案时
  552. for(Map m : cList){
  553. if(amtSum >= Double.valueOf(m.get("memberConditStart").toString())){
  554. discountAmt = oilLiters.multiply(new BigDecimal(m.get("discountAmt").toString()));
  555. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  556. break;
  557. }
  558. }
  559. }
  560. }else {
  561. //当前客户所加油的订单不存在等级时
  562. List<Map> customerGradeList = customerGradeServices.getCustomerGradeList(params); //升序查询 取第一条
  563. if(customerGradeList !=null && customerGradeList.size() >0){
  564. discountAmt = oilLiters.multiply(new BigDecimal(customerGradeList.get(0).get("discountAmt").toString()));
  565. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  566. }
  567. }
  568. amt = receivableAmt.subtract(discountAmt); //应收金额
  569. amt =amt.signum() == -1 ? new BigDecimal("0.01"): amt;
  570. discountPrice = oilLiters.equals(new BigDecimal("0.00")) ? discountPrice : amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  571. payOrderResultInfo.setAmt(amt.toString());
  572. payOrderResultInfo.setDiscountAmt(discountAmt.toString());
  573. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  574. payOrderResultInfo.setDiscountPrice(discountPrice.toString());
  575. payOrderResultInfo.setOilLiters(oilLiters.toString());
  576. payOrderResultInfo.setReceivableAmt(receivableAmt.toString());
  577. payOrderResultInfo.setOilPrice(oilPrice.toString());
  578. payOrderResultInfo.setDzkAmt(amt.toString());
  579. payOrderResultInfo.setOilsCardFlag("0");
  580. payOrderResultInfo.setCardEnabledFlag(params.get("cardEnabledFlag").toString());
  581. //电子卡是否开启
  582. logger.info("油站是否开启电子会员卡功能: " +params.get("cardEnabledFlag").toString());
  583. if(params.get("cardEnabledFlag").toString().equals("1")){
  584. payOrderResultInfo.setDzkAmt(receivableAmt.toString());
  585. payOrderResultInfo.setDzkDiscountAmt("0");
  586. CustomerCardSetting customerCardSetting = new CustomerCardSetting();
  587. customerCardSetting.setStationId(Integer.valueOf(params.get("stationId").toString()));
  588. if(params.get("cardRuleFlag").toString().equals("1")){
  589. customerCardSetting.setStationId(Integer.valueOf(params.get("groupId").toString()));
  590. }
  591. List<CustomerCardSetting> cardRechargeSettingList = electronicMembershipCardService.getCardRechargeSettingList(customerCardSetting);
  592. if(cardRechargeSettingList !=null && cardRechargeSettingList.size() >0){
  593. String isGradeSetting = cardRechargeSettingList.get(0).getIsGradeSetting();
  594. if(isGradeSetting.equals("1")){
  595. payOrderResultInfo.setDzkAmt(amt.toString());
  596. payOrderResultInfo.setDzkDiscountAmt(discountAmt.toString());
  597. }
  598. }
  599. //查询客户余额和卡的类型
  600. Map<String, String> map = this.selectCardBalance(Integer.valueOf(params.get("stationId").toString()), params.get("cardOilsType").toString(), params.get("unionId").toString());
  601. payOrderResultInfo.setBalance(map.get("balance"));
  602. payOrderResultInfo.setOilsCardFlag(map.get("oilsCardFlag"));
  603. payOrderResultInfo.setCardOilsType(map.get("cardOilsType"));
  604. }
  605. return payOrderResultInfo;
  606. }
  607. //查询用户电子会员卡余额
  608. public Map<String, String> selectCardBalance(Integer stationId, String cardOilsType, String unionId) {
  609. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  610. customerElectronicCard.setCardOilsType(cardOilsType);
  611. customerElectronicCard.setStationId(stationId);
  612. customerElectronicCard.setUnionId(unionId);
  613. CustomerElectronicCard electronicCardInfo = electronicMembershipCardService.getElectronicCardInfoByUnionId(customerElectronicCard);
  614. BigDecimal balance = null;
  615. String cardOilsType1 ="";
  616. Map<String, String> result = new HashMap<>();
  617. if(electronicCardInfo !=null){
  618. balance = electronicCardInfo.getAmt();
  619. cardOilsType1 = electronicCardInfo.getCardOilsType();
  620. result.put("balance",balance.toString());
  621. result.put("oilsCardFlag", "1");
  622. result.put("cardOilsType",cardOilsType1);
  623. }else {
  624. result.put("oilsCardFlag", "0");
  625. }
  626. return result;
  627. }
  628. /**
  629. * 根据订单号获取订单信息
  630. * produces="application/json;charset=UTF-8",consumes = "application/json",
  631. * @RequestBody String orderno
  632. * @param
  633. * @return
  634. */
  635. @RequestMapping(value = "/selectOrderInfoByOrdNo", method = RequestMethod.GET)
  636. @ResponseBody
  637. public String getPayOrderList(@RequestParam String orderNo){
  638. Gson gson =new Gson();
  639. ResultData resultData =null;
  640. if(StringUtils.isNotBlank(orderNo)){
  641. PayOrder payOrder = payOrderService.selectOrderInfoByOrdNo(orderNo);
  642. resultData = ResultData.success(payOrder);
  643. }else {
  644. resultData=ResultData.error(CodeMsg.SEARCH_FAIL);
  645. }
  646. return gson.toJson(resultData);
  647. }
  648. /*
  649. * 根据用户openId和用户类型userType查询用户订单
  650. * @param openId
  651. * @param userType
  652. * @return
  653. */
  654. @RequestMapping(value = "/getOrderListByOpenIdAndUserType", method = RequestMethod.GET)
  655. @ResponseBody
  656. public String getOrderListByOpenIdAndUserType(@RequestParam("openId") String openId, @RequestParam("userType") String userType){
  657. Gson gson =new Gson();
  658. ResultData resultData =null;
  659. if(StringUtils.isNotBlank(openId) && StringUtils.isNotBlank(userType)){
  660. AppUserInfo appUserInfo = new AppUserInfo();
  661. switch (userType){
  662. case "1":
  663. appUserInfo.setBlogOpenid(openId);
  664. break;
  665. case "2":
  666. appUserInfo.setALiId(openId);
  667. break;
  668. }
  669. List<PayOrder> payOrderList = payOrderService.getOrderListByOpenIdAndUserType(appUserInfo);
  670. resultData=ResultData.success(payOrderList);
  671. }else {
  672. resultData=ResultData.error(CodeMsg.SEARCH_FAIL);
  673. }
  674. return gson.toJson(resultData);
  675. }
  676. }