PayOrderController.java 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831
  1. package com.platform.yijia.controller;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.google.gson.Gson;
  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 com.platform.yijia.utils.weixinapp.WxPushUtil;
  11. import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
  12. import org.apache.commons.lang3.StringUtils;
  13. import org.apache.ibatis.javassist.util.HotSwapAgent;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16. import org.springframework.stereotype.Controller;
  17. import org.springframework.transaction.annotation.Transactional;
  18. import org.springframework.web.bind.annotation.*;
  19. import javax.annotation.Resource;
  20. import javax.naming.ldap.HasControls;
  21. import java.math.BigDecimal;
  22. import java.text.SimpleDateFormat;
  23. import java.util.*;
  24. @Controller
  25. @RequestMapping("/demo")
  26. public class PayOrderController {
  27. private static Logger logger =(Logger) LoggerFactory.getLogger(PayOrderController.class);
  28. @Resource
  29. private PayOrderService payOrderService;
  30. @Resource
  31. private AppUserInfoService appUserInfoService;
  32. @Resource
  33. private StationService stationService;
  34. @Resource
  35. private CustomerGradeServices customerGradeServices;
  36. @Resource
  37. private PayOrderMapper payOrderMapper;
  38. @Resource
  39. private ElectronicMembershipCardService electronicMembershipCardService;
  40. @Resource
  41. private WxPushUtil wxPushUtil;
  42. @Resource
  43. private IntegralRuleService integralRuleService;
  44. @Resource
  45. private CustomerPointsService customerPointsService;
  46. @Resource
  47. private CustomerPointsRecordService customerPointsRecordService;
  48. @Resource
  49. private GzhNewsTemplateService gzhNewsTemplateService;
  50. @Resource
  51. private CustomerManagerService customerManagerService;
  52. //一键支付,生成订单
  53. @RequestMapping(value = "/AddPayOrderInfo", consumes = "application/json", method = RequestMethod.POST)
  54. @ResponseBody
  55. public String AddPayOrderInfo(@RequestBody PayOrderRequest payOrderRequest){
  56. logger.info("获取订单前端传来参数openID:"+ payOrderRequest.getOpenId());
  57. logger.info("获取订单前端传来参数userType:"+ payOrderRequest.getUserType());
  58. Gson gson =new Gson();
  59. ResultData resultData =null;
  60. //根据token 和登录类型 身份验证
  61. AppUserInfo appUserInfo =new AppUserInfo();
  62. //订单类型 是小程序还是公众号
  63. appUserInfo.setUserType(payOrderRequest.getUserType());
  64. if(payOrderRequest.getUserType().equals("1")){
  65. //1 是公众号
  66. appUserInfo.setBlogOpenid(payOrderRequest.getOpenId());
  67. }else if(payOrderRequest.getUserType().equals("2")){
  68. //2是小程序
  69. appUserInfo.setMinaOpenid(payOrderRequest.getOpenId());
  70. }
  71. List<AppUserInfo> appUserInfoList =appUserInfoService.Authentication(appUserInfo);
  72. //判断登录人员是否验证成功
  73. if(appUserInfoList!=null&&appUserInfoList.size()>0){
  74. PayOrder payOrder=new PayOrder();
  75. payOrder.setConsumer(appUserInfoList.get(0).getBlogNickName()); //昵称
  76. payOrder.setConsumerId(appUserInfoList.get(0).getUserId()); //用户id
  77. //添加订单信息,返回订单号
  78. String ordNo =payOrderService.AddPayOrderInfo(payOrderRequest, payOrder);
  79. if(ordNo.equals("0")){
  80. resultData=ResultData.error(CodeMsg.CHECK_DATA);
  81. }else if(ordNo.equals("1")){
  82. resultData=ResultData.error(CodeMsg.PARAMS_NUll);
  83. }else {
  84. resultData=ResultData.success(ordNo);
  85. }
  86. }else{
  87. //登录人验证失败
  88. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  89. }
  90. return gson.toJson(resultData);
  91. }
  92. //小程序支付生成订单
  93. @RequestMapping(value = "/AddPayOrderInfoNew", consumes = "application/json", method = RequestMethod.POST)
  94. @ResponseBody
  95. @Transactional
  96. public String AddPayOrderInfoNew(@RequestBody PayOrderRequest payOrderRequest){
  97. logger.info("获取订单前端传来参数openId:"+ payOrderRequest.getOpenId());
  98. logger.info("获取订单前端传来参数userType:"+ payOrderRequest.getUserType());
  99. Gson gson =new Gson();
  100. ResultData resultData =null;
  101. AppUserInfo appUserInfo =new AppUserInfo();
  102. appUserInfo.setUserType(payOrderRequest.getUserType()); //订单类型 是小程序还是公众号
  103. if(payOrderRequest.getUserType().equals("1")){
  104. appUserInfo.setBlogOpenid(payOrderRequest.getOpenId()); //1 是公众号
  105. }else if(payOrderRequest.getUserType().equals("2")){
  106. appUserInfo.setMinaOpenid(payOrderRequest.getOpenId()); //2是小程序
  107. }
  108. List<AppUserInfo> appUserInfoList =appUserInfoService.Authentication(appUserInfo);
  109. Map<String ,Object> resultMap = new HashMap<>(); //返回结果集
  110. //判断登录人员是否验证成功
  111. if(appUserInfoList!=null && appUserInfoList.size()>0){
  112. PayOrder payOrder = new PayOrder();
  113. payOrder.setConsumer(appUserInfoList.get(0).getBlogNickName()); //昵称
  114. payOrder.setConsumerId(appUserInfoList.get(0).getUserId()); //用户id
  115. Random random = new Random();
  116. String result="";
  117. for(int i=0;i<6;i++){
  118. result+=random.nextInt(10);
  119. }
  120. String ordNo=System.nanoTime()+result;
  121. payOrder.setOrderNo(ordNo); //订单号
  122. logger.info("生成的订单号:" + ordNo);
  123. payOrder.setDiscountCouponAmt(payOrderRequest.getDiscountCouponAmt()); //优惠劵金额
  124. payOrder.setDiscountCoupon(payOrderRequest.getDiscountCoupon()); //优惠券
  125. payOrder.setCarNo(payOrderRequest.getCarNo()); //车牌号、
  126. payOrder.setCustomerGrade(payOrderRequest.getCustomerGrade()); //客户电话
  127. payOrder.setMemberNo(payOrderRequest.getMemberNo()); //会员卡号
  128. payOrder.setMemberAmt(payOrderRequest.getMemberAmt()); //会员支付金额
  129. //payOrder.setPrintCount(payOrderRequest.getPrintCount()); //小票数量
  130. payOrder.setScore(payOrderRequest.getScore()); //积分
  131. payOrder.setStationId(payOrderRequest.getStationId()); //油站id
  132. payOrder.setStatus("0"); //创建订单 未支付状态 0
  133. if(StringUtils.isNotBlank(payOrderRequest.getUserType())){
  134. String userType = payOrderRequest.getUserType(); //支付方式:02公众号,03小程序',
  135. switch (userType){
  136. case "1":
  137. payOrder.setPayWay("02");
  138. break;
  139. case "2":
  140. payOrder.setPayWay("03");
  141. break;
  142. }
  143. }
  144. payOrder.setCreatedDate(new Date()); //创建时间
  145. payOrder.setOrderType(payOrderRequest.getOrderType()); //订单类型
  146. payOrder.setOilGun(payOrderRequest.getOilGun()); //油枪号
  147. //根据油站和油枪获取加油员和油品价格 油站名称
  148. HashMap<String, Object> params = new HashMap<>();
  149. params.put("oliGunNo", payOrderRequest.getOilGun());
  150. params.put("stationId", payOrderRequest.getStationId());
  151. String oilPersonnel = "";
  152. //使用list原因:一个枪号对应多个加油员场景
  153. List<Map> mapResultList = payOrderMapper.selectPersonelName(params);
  154. if(mapResultList != null && mapResultList.size() > 0){
  155. for (Map per : mapResultList){
  156. if(per.containsKey("personelName") && per.get("personelName").toString() !=null && per.get("personelName").toString() !=""){
  157. oilPersonnel += per.get("personelName").toString() +",";
  158. }
  159. }
  160. if(oilPersonnel !=""){
  161. payOrder.setOilPersonnel(oilPersonnel.substring(0, oilPersonnel.length()-1)); //加油员
  162. }
  163. if(mapResultList.get(0).containsKey("stationName") && mapResultList.get(0).get("stationName").toString() !="" && mapResultList.get(0).get("stationName").toString() !=null ){
  164. payOrder.setStationName(mapResultList.get(0).get("stationName").toString()); //油站名称
  165. }
  166. }
  167. String orderType = payOrderRequest.getOrderType(); //获取订单类型
  168. if(orderType.equals("1")){ //订单类型是油品时计算
  169. resultMap = this.calculateAmt(payOrderRequest); //计算油价 加油升数 优惠金额 实收金额 优惠价格
  170. payOrder.setOilPirce(resultMap.get("oilPrice").toString());
  171. payOrder.setOrderLiters(resultMap.get("oilLiters").toString());
  172. payOrder.setDiscountAmt(Double.valueOf(resultMap.get("discountAmt").toString()));
  173. payOrder.setAmt(Double.valueOf(resultMap.get("amt").toString()));
  174. }
  175. payOrder.setReceivableAmt(payOrderRequest.getReceivableAmt()); //订单应收金额
  176. String oilName =payOrderRequest.getOilName();
  177. payOrder.setOilName(oilName); //油品名称
  178. switch (oilName){ //根据油品名称存储油品类型 1.柴油 2 汽油
  179. case "92#":
  180. payOrder.setOilType("1");
  181. break;
  182. case "95#":
  183. payOrder.setOilType("1");
  184. break;
  185. case "97#":
  186. payOrder.setOilType("1");
  187. break;
  188. case "0#":
  189. payOrder.setOilType("2");
  190. break;
  191. case "-10#":
  192. payOrder.setOilType("2");
  193. break;
  194. case "-20#":
  195. payOrder.setOilType("2");
  196. break;
  197. }
  198. payOrder.setOilType(orderType);
  199. String stationCardEnabledFlag = electronicMembershipCardService.getStationCardEnabledFlag(payOrderRequest.getStationId());
  200. //查询油站是否开启电子会员卡功能
  201. if(stationCardEnabledFlag.equals("1")){
  202. String balance = this.selectCardBalance(payOrderRequest.getStationId(), oilName, appUserInfoList.get(0).getUnionId());
  203. resultMap.put("balance", balance);
  204. }
  205. StationInfo stationInfo = new StationInfo();
  206. stationInfo.setStationId(payOrderRequest.getStationId());
  207. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  208. if(stationInfos !=null){
  209. //获取油站图片和名称
  210. resultMap.put("stationPic", stationInfos.getStationPic());
  211. resultMap.put("stationName", stationInfos.getStationName());
  212. }
  213. //payOrder.setPayType("wx"); //支付类型
  214. switch (orderType){
  215. case "1": //油品
  216. payOrderMapper.insertSelective(payOrder);
  217. resultMap.put("ordNo", ordNo);
  218. break;
  219. case "2": //非油品
  220. Map<String, String> m = stationService.getStationAppIdAndAppSecret(payOrderRequest.getStationId());
  221. if(m.containsKey("stationName") && m.get("stationName") !=null){
  222. payOrder.setStationName(m.get("stationName"));
  223. }
  224. payOrder.setAmt(Double.valueOf(payOrderRequest.getReceivableAmt())); //非油品金额
  225. payOrder.setDiscountAmt(Double.valueOf(0)); //优惠金额
  226. payOrder.setOilPirce(payOrderRequest.getReceivableAmt().toString()); //非油品价格
  227. payOrder.setOrderLiters("0");
  228. resultMap.put("discountAmt", "0"); //优惠价格
  229. resultMap.put("amt", payOrderRequest.getReceivableAmt()); //实收价格
  230. resultMap.put("receivableAmt", payOrderRequest.getReceivableAmt()); //应收价格
  231. resultMap.put("oilLiters", "0");
  232. resultMap.put("discountPrice", "0");
  233. payOrderMapper.insertSelective(payOrder);
  234. resultMap.put("ordNo", ordNo);
  235. break;
  236. }
  237. resultData = ResultData.success(resultMap);
  238. }else{
  239. //登录人验证失败
  240. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  241. }
  242. return gson.toJson(resultData);
  243. }
  244. //查询用户电子会员卡余额
  245. public String selectCardBalance(Integer stationId, String oilName, String unionId) {
  246. String cardOilsType ="";
  247. switch (oilName){ //根据油品名称存储电子卡油品类型 1.柴油 2 汽油
  248. case "92#":
  249. cardOilsType ="1";
  250. break;
  251. case "95#":
  252. cardOilsType ="1";
  253. break;
  254. case "97#":
  255. cardOilsType ="1";
  256. break;
  257. case "0#":
  258. cardOilsType ="2";
  259. break;
  260. case "-10#":
  261. cardOilsType ="2";
  262. break;
  263. case "-20#":
  264. cardOilsType ="2";
  265. break;
  266. }
  267. CustomerElectronicCard customerElectronicCard = new CustomerElectronicCard();
  268. customerElectronicCard.setCardOilsType(cardOilsType);
  269. customerElectronicCard.setStationId(stationId);
  270. customerElectronicCard.setUnionId(unionId);
  271. CustomerElectronicCard electronicCardInfo = electronicMembershipCardService.getElectronicCardInfoByUnionId(customerElectronicCard);
  272. BigDecimal balance = null;
  273. if(electronicCardInfo !=null){
  274. balance = electronicCardInfo.getAmt();
  275. }
  276. return balance.toString();
  277. }
  278. /***
  279. * 计算订单金额
  280. * @return
  281. */
  282. public Map<String ,Object> calculateAmt(PayOrderRequest payOrderRequest){
  283. Map<String ,Object> resultMap = new HashMap<>();
  284. if(payOrderRequest.getReceivableAmt() !=null){ //应收金额
  285. Double receivableAmt = payOrderRequest.getReceivableAmt(); //应收金额 用户输入的金额
  286. Integer stationId = payOrderRequest.getStationId(); //油站ID
  287. //String oilGun = payOrderRequest.getOilGun(); //油枪号
  288. String oilName = payOrderRequest.getOilName(); //油品名称
  289. String openId = payOrderRequest.getOpenId(); //用户的openId
  290. String mobilePhone = payOrderRequest.getCustomerPhone(); //客户手机号
  291. //获取油品价格
  292. StationOilPrice stationOilPrice = new StationOilPrice();
  293. stationOilPrice.setStationId(stationId);
  294. stationOilPrice.setOilName(oilName);
  295. StationOilPrice oilPriceInfo = stationService.getStationOilPrice(stationOilPrice);
  296. String oilPrice = oilPriceInfo.getOilPrice();
  297. String stationNanme = oilPriceInfo.getStationNanme();
  298. BigDecimal oilLiters = null;
  299. BigDecimal discountAmt =null;
  300. BigDecimal discountPrice = null;
  301. BigDecimal amt = null;
  302. //resultMap.put("stationName", stationNanme);
  303. resultMap.put("oilPrice", oilPrice); //油品价格
  304. resultMap.put("receivableAmt", receivableAmt); //应收价格
  305. //该油站的优惠方式
  306. String stationDiscountWay = stationService.getStationDiscountWay(stationId.toString());
  307. Map<String ,Object> params = new HashMap<String, Object>();
  308. params.put("stationId", stationId);
  309. params.put("oilName", oilName);
  310. BigDecimal receivableAmt_b = new BigDecimal(receivableAmt); //传入的应收金额
  311. switch (stationDiscountWay){
  312. case "1": //1.等级直降
  313. //查询等级直降的优惠方式
  314. params.put("mobilePhone", mobilePhone);
  315. params.put("minaOpenid", openId);
  316. //查询客户等级信息
  317. List<Map<String, Object>> customerGradeInfo = customerGradeServices.getCustomerGradeInfo(params);
  318. if(customerGradeInfo != null && customerGradeInfo.size() >0){ //已存在客户等级信息
  319. //使用客户已存在的等级计算优惠
  320. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP);
  321. discountAmt = oilLiters.multiply(new BigDecimal(customerGradeInfo.get(0).get("gasoilDiscountLitre").toString()));
  322. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  323. amt = receivableAmt_b.subtract(discountAmt);
  324. discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  325. resultMap.put("discountAmt", discountAmt.doubleValue());
  326. resultMap.put("amt", amt.doubleValue());
  327. resultMap.put("oilLiters", oilLiters.doubleValue());
  328. resultMap.put("discountPrice", discountPrice.doubleValue());
  329. }else {
  330. //不存在客户等级信息时,查询油站的客户等级直降优惠(查询结果根据会员成长值条件做升序查询)
  331. List<Map> customerGradeList = customerGradeServices.getCustomerGradeList(params);
  332. //如果存在
  333. if(customerGradeList !=null && customerGradeList.size() >0){
  334. //用户第一次购买 取等级最低初始会员的优惠条件计算
  335. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_HALF_UP); //加油升数
  336. discountAmt = oilLiters.multiply(new BigDecimal(customerGradeList.get(0).get("gasoilDiscountLitre").toString()));
  337. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  338. amt = receivableAmt_b.subtract(discountAmt);
  339. discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP);
  340. resultMap.put("discountAmt", discountAmt.doubleValue());
  341. resultMap.put("amt", amt.doubleValue());
  342. resultMap.put("oilLiters", oilLiters.doubleValue());
  343. resultMap.put("discountPrice", discountPrice.doubleValue());
  344. }else {
  345. //不存在
  346. resultMap.put("discountAmt", 0);
  347. resultMap.put("amt", receivableAmt.doubleValue());
  348. oilLiters = new BigDecimal(receivableAmt).divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_HALF_UP);
  349. resultMap.put("oilLiters", oilLiters.doubleValue());
  350. resultMap.put("discountPrice", oilPrice);
  351. }
  352. }
  353. break;
  354. case "2": //2.满减
  355. params.put("discountPlanType", "1");
  356. //营销方案
  357. List<Map> customerMarkertPlanList_1 = customerGradeServices.getCustomerMarkertPlanList(params);
  358. //有优惠规则
  359. if(customerMarkertPlanList_1 !=null && customerMarkertPlanList_1.size() >0){
  360. boolean flag = true;
  361. for (Map m : customerMarkertPlanList_1){
  362. //如果当前应收金额大于条件金额
  363. BigDecimal discountAmt_b = new BigDecimal(m.get("discountAmt").toString()); //条件金额
  364. if(receivableAmt_b.compareTo(discountAmt_b) ==1 || receivableAmt_b.compareTo(discountAmt_b) ==0){
  365. BigDecimal gasoilDiscountAmt_b = new BigDecimal(m.get("gasoilDiscountAmt").toString()); //每满多少优惠多少的金额
  366. discountAmt = receivableAmt_b.divide(discountAmt_b, 2, BigDecimal.ROUND_HALF_UP).multiply(gasoilDiscountAmt_b); //优惠金额
  367. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  368. amt = receivableAmt_b.subtract(discountAmt); //实收金额
  369. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP); //加油升数
  370. discountPrice = amt.divide(oilLiters); //优惠价格
  371. resultMap.put("discountAmt", discountAmt.doubleValue());
  372. resultMap.put("amt", amt.doubleValue());
  373. resultMap.put("oilLiters", oilLiters.doubleValue());
  374. resultMap.put("discountPrice", discountPrice.doubleValue());
  375. flag = false;
  376. break;
  377. }
  378. }
  379. if(flag){
  380. resultMap.put("discountAmt", 0);
  381. resultMap.put("amt", receivableAmt.doubleValue());
  382. oilLiters = new BigDecimal(receivableAmt).divide(new BigDecimal(oilPrice),2, BigDecimal.ROUND_HALF_UP);
  383. resultMap.put("oilLiters", oilLiters.doubleValue());
  384. resultMap.put("discountPrice", oilPrice);
  385. }
  386. }else {
  387. //没有优惠规则
  388. resultMap.put("discountAmt", 0);
  389. resultMap.put("amt", receivableAmt.doubleValue());
  390. oilLiters = new BigDecimal(receivableAmt).divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_HALF_UP);
  391. resultMap.put("oilLiters", oilLiters.doubleValue());
  392. resultMap.put("discountPrice", oilPrice);
  393. }
  394. break;
  395. case "3": //3.立减
  396. params.put("discountPlanType", "2");
  397. //营销方案
  398. List<Map> customerMarkertPlanList_2 = customerGradeServices.getCustomerMarkertPlanList(params);
  399. if(customerMarkertPlanList_2 !=null && customerMarkertPlanList_2.size() >0){
  400. boolean flag = true;
  401. for (Map m : customerMarkertPlanList_2){
  402. //如果当前应收金额大于条件金额
  403. BigDecimal discountAmt_b = new BigDecimal(m.get("discountAmt").toString()); //条件金额
  404. if(receivableAmt_b.compareTo(discountAmt_b) ==1 || receivableAmt_b.compareTo(discountAmt_b) ==0){
  405. BigDecimal gasoilDiscountAmt_b = new BigDecimal(m.get("gasoilDiscountAmt").toString()); //每满多少优惠多少的金额
  406. discountAmt = gasoilDiscountAmt_b; //优惠金额
  407. amt = receivableAmt_b.subtract(gasoilDiscountAmt_b); //实收金额
  408. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_HALF_UP); //加油升数
  409. discountPrice = amt.divide(oilLiters); //优惠价格
  410. resultMap.put("discountAmt", discountAmt.doubleValue());
  411. resultMap.put("amt", amt.doubleValue());
  412. resultMap.put("oilLiters", oilLiters.doubleValue());
  413. resultMap.put("discountPrice", discountPrice.doubleValue());
  414. flag = false;
  415. break;
  416. }
  417. }
  418. if(flag){ //用户加油金额不符合优惠条件
  419. resultMap.put("discountAmt", 0);
  420. resultMap.put("amt", receivableAmt.doubleValue());
  421. oilLiters = new BigDecimal(receivableAmt).divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_HALF_UP);
  422. resultMap.put("oilLiters", oilLiters.doubleValue());
  423. resultMap.put("discountPrice", oilPrice);
  424. }
  425. }else {
  426. //没有优惠规则
  427. resultMap.put("discountAmt", 0);
  428. resultMap.put("amt", receivableAmt.doubleValue());
  429. oilLiters = new BigDecimal(receivableAmt).divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_HALF_UP);
  430. resultMap.put("oilLiters", oilLiters.doubleValue());
  431. resultMap.put("discountPrice", oilPrice);
  432. }
  433. break;
  434. case "4": //4.独立直降
  435. params.put("discountPlanType", "3");
  436. //营销方案
  437. List<Map> customerMarkertPlanList_3 = customerGradeServices.getCustomerMarkertPlanList(params);
  438. if(customerMarkertPlanList_3 !=null && customerMarkertPlanList_3.size() >0){
  439. boolean flag= true;
  440. for(Map m : customerMarkertPlanList_3){
  441. BigDecimal discountAmt_b = new BigDecimal(m.get("discountAmt").toString()); //条件金额
  442. BigDecimal gasoilDiscountAmt_b = new BigDecimal(m.get("gasoilDiscountAmt").toString());
  443. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_HALF_UP); //加油升数
  444. if(m.get("discountTerm").toString().equals("1")){ //按升数优惠
  445. if(oilLiters.compareTo(discountAmt_b) ==1 || oilLiters.compareTo(discountAmt_b) ==0){
  446. //计算
  447. discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  448. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  449. amt = receivableAmt_b.subtract(discountAmt);
  450. discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  451. resultMap.put("discountAmt", discountAmt.doubleValue());
  452. resultMap.put("amt", amt.doubleValue());
  453. resultMap.put("oilLiters", oilLiters.doubleValue());
  454. resultMap.put("discountPrice", discountPrice.doubleValue());
  455. flag =false;
  456. break;
  457. }
  458. }else if(m.get("discountTerm").toString().equals("2")){ //按金额优惠
  459. if(receivableAmt_b.compareTo(discountAmt_b) ==1 || receivableAmt_b.compareTo(discountAmt_b) ==0){
  460. discountAmt = oilLiters.multiply(gasoilDiscountAmt_b);
  461. discountAmt = discountAmt.setScale(2, BigDecimal.ROUND_HALF_UP);
  462. amt = receivableAmt_b.subtract(discountAmt);
  463. discountPrice = amt.divide(oilLiters, 2, BigDecimal.ROUND_HALF_UP); //优惠价格
  464. resultMap.put("discountAmt", discountAmt.doubleValue());
  465. resultMap.put("amt", amt.doubleValue());
  466. resultMap.put("oilLiters", oilLiters.doubleValue());
  467. resultMap.put("discountPrice", discountPrice.doubleValue());
  468. flag =false;
  469. break;
  470. }
  471. }
  472. }
  473. if(flag){
  474. resultMap.put("discountAmt", 0);
  475. resultMap.put("amt", receivableAmt.doubleValue());
  476. oilLiters = new BigDecimal(receivableAmt).divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_HALF_UP);
  477. resultMap.put("oilLiters", oilLiters.doubleValue());
  478. resultMap.put("discountPrice", oilPrice);
  479. }
  480. }else {
  481. //没有优惠规则
  482. resultMap.put("discountAmt", 0);
  483. resultMap.put("amt", receivableAmt.doubleValue());
  484. oilLiters = receivableAmt_b.divide(new BigDecimal(oilPrice), 2, BigDecimal.ROUND_HALF_UP);
  485. resultMap.put("oilLiters", oilLiters.doubleValue());
  486. resultMap.put("discountPrice", oilPrice);
  487. }
  488. break;
  489. }
  490. //resultData = ResultData.success(resultMap);
  491. }
  492. return resultMap;
  493. }
  494. /**
  495. * 计算消费生成积分
  496. */
  497. public void calculateIntegralAndPushIntegral(CalculateIntegral calculateIntegral, CustomerManage customerManage){
  498. int integral =0;
  499. //获取该油站的优惠方式
  500. String discountPlanType = stationService.getStationDiscountWay(calculateIntegral.getStationId().toString());
  501. IntegralRule integralRule = new IntegralRule();
  502. integralRule.setStationId(calculateIntegral.getStationId());
  503. integralRule.setEmptyDate(new Date());
  504. integralRule.setOilName(calculateIntegral.getOilName());
  505. integralRule.setOilType(calculateIntegral.getOilType());
  506. //获取该油站的积分规则
  507. List<IntegralRule> integralRuleList = integralRuleService.getIntegralRule(integralRule);
  508. if(integralRuleList !=null && integralRuleList.size() >0){
  509. List<IntegralRuleDetail> integralRuleDetailList = integralRuleList.get(0).getIntegralRuleDetailList();
  510. String currentTime = null;
  511. String datePickerTime=null; //活动时间
  512. String[] datePickerTimeArray ={};
  513. String integralActivity = integralRuleList.get(0).getIntegralActivity();
  514. String integralProportion =null;
  515. if(integralActivity.equals("1")){
  516. datePickerTime = integralRuleList.get(0).getDatePickerTime();
  517. integralProportion = integralRuleList.get(0).getIntegralProportion();
  518. if(datePickerTime.contains(",")){
  519. datePickerTimeArray = datePickerTime.split(",");
  520. }else {
  521. datePickerTimeArray= new String[1];
  522. datePickerTimeArray[0] = datePickerTime;
  523. }
  524. }
  525. if(integralRuleDetailList !=null && integralRuleDetailList.size() >0){
  526. Calendar calendar = Calendar.getInstance();
  527. calendar.setTime(new Date()); //获取当前时间
  528. for (IntegralRuleDetail integralRuleDetail : integralRuleDetailList){
  529. if(integralRuleDetail.getOilType().equals("1")){ //油品
  530. if (integralRuleDetail.getRuleType().equals("1")){ //按照实收金额
  531. if(calculateIntegral.getAmt().compareTo(integralRuleDetail.getRuleTerms()) == 1 || calculateIntegral.getAmt().compareTo(integralRuleDetail.getRuleTerms()) == 0){
  532. BigDecimal divide = null;
  533. BigDecimal multiply = null;
  534. //判断油站配置的优惠类型
  535. if(discountPlanType.equals("1") && integralRuleDetail.getGread() !=null && customerManage.getGrade().equals(integralRuleDetail.getGread())){ //等级直降
  536. divide = calculateIntegral.getAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_HALF_DOWN);
  537. multiply = divide.multiply(integralRuleDetail.getIntegral());
  538. }else {
  539. divide = calculateIntegral.getAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_HALF_DOWN);
  540. multiply = divide.multiply(integralRuleDetail.getIntegral());
  541. }
  542. if(integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  543. String datePicker = integralRuleList.get(0).getDatePicker();
  544. switch (datePicker){
  545. case "1": // 1.按周来
  546. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  547. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  548. currentTime = String.valueOf(day_Week);
  549. break;
  550. case "2": // 2.每月的多少号
  551. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  552. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  553. currentTime = String.valueOf(day_month); //当前时间
  554. break;
  555. case "3": // 3.固定日期
  556. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  557. break;
  558. }
  559. for (String s : datePickerTimeArray){
  560. if(s.equals(currentTime)){
  561. multiply = multiply.multiply(new BigDecimal(integralProportion));
  562. break;
  563. }
  564. }
  565. }
  566. integral =multiply.intValue();
  567. break;
  568. }
  569. }else if (integralRuleDetail.getRuleType().equals("2")){ //按应收金额
  570. if(calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==1 || calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==0){
  571. BigDecimal divide = null;
  572. BigDecimal multiply = null;
  573. //判断油站配置的优惠类型
  574. if(discountPlanType.equals("1") && integralRuleDetail.getGread() !=null && customerManage.getGrade().equals(integralRuleDetail.getGread())){ //等级直降
  575. divide = calculateIntegral.getReceivableAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_HALF_DOWN);
  576. multiply = divide.multiply(integralRuleDetail.getIntegral());
  577. }else {
  578. divide = calculateIntegral.getReceivableAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_HALF_DOWN);
  579. multiply = divide.multiply(integralRuleDetail.getIntegral());
  580. }
  581. if(integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  582. String datePicker = integralRuleList.get(0).getDatePicker();
  583. switch (datePicker){
  584. case "1": // 1.按周来
  585. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  586. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  587. currentTime = String.valueOf(day_Week);
  588. break;
  589. case "2": // 2.每月的多少号
  590. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  591. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  592. currentTime = String.valueOf(day_month); //当前时间
  593. break;
  594. case "3": // 3.固定日期
  595. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  596. break;
  597. }
  598. for (String s : datePickerTimeArray){
  599. if(s.equals(currentTime)){
  600. multiply = multiply.multiply(new BigDecimal(integralProportion));
  601. break;
  602. }
  603. }
  604. }
  605. integral = multiply.intValue();
  606. break;
  607. }
  608. }else if (integralRuleDetail.getRuleType().equals("3")){ //按照加油升数
  609. if(calculateIntegral.getOilLiters().compareTo(integralRuleDetail.getRuleTerms()) ==1 || calculateIntegral.getOilLiters().compareTo(integralRuleDetail.getRuleTerms()) ==0){
  610. BigDecimal divide = null;
  611. BigDecimal multiply = null;
  612. //判断油站配置的优惠类型
  613. if(discountPlanType.equals("1") && integralRuleDetail.getGread() !=null && customerManage.getGrade().equals(integralRuleDetail.getGread())){ //等级直降
  614. divide = calculateIntegral.getOilLiters().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_HALF_DOWN);
  615. multiply = divide.multiply(integralRuleDetail.getIntegral());
  616. }else {
  617. divide = calculateIntegral.getOilLiters().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_HALF_DOWN);
  618. multiply = divide.multiply(integralRuleDetail.getIntegral());
  619. }
  620. if(integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  621. String datePicker = integralRuleList.get(0).getDatePicker();
  622. switch (datePicker){
  623. case "1": // 1.按周来
  624. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  625. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  626. currentTime = String.valueOf(day_Week);
  627. break;
  628. case "2": // 2.每月的多少号
  629. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  630. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  631. currentTime = String.valueOf(day_month); //当前时间
  632. break;
  633. case "3": // 3.固定日期
  634. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  635. break;
  636. }
  637. for (String s : datePickerTimeArray){
  638. if(s.equals(currentTime)){
  639. multiply = multiply.multiply(new BigDecimal(integralProportion));
  640. break;
  641. }
  642. }
  643. }
  644. integral =multiply.intValue();
  645. break;
  646. }
  647. }
  648. }else if (integralRuleDetail.getOilType().equals("2")){ //非油品
  649. if (calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==1 || calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==0){
  650. BigDecimal divide = null;
  651. BigDecimal multiply = null;
  652. //判断油站配置的优惠类型
  653. if(discountPlanType.equals("1") && integralRuleDetail.getGread() !=null && customerManage.getGrade().equals(integralRuleDetail.getGread())){ //等级直降
  654. divide = calculateIntegral.getReceivableAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_HALF_DOWN);
  655. multiply = divide.multiply(integralRuleDetail.getIntegral());
  656. }else {
  657. divide = calculateIntegral.getReceivableAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_HALF_DOWN);
  658. multiply = divide.multiply(integralRuleDetail.getIntegral());
  659. }
  660. if(integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  661. String datePicker = integralRuleList.get(0).getDatePicker();
  662. switch (datePicker){
  663. case "1": // 1.按周来
  664. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  665. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  666. currentTime = String.valueOf(day_Week);
  667. break;
  668. case "2": // 2.每月的多少号
  669. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  670. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  671. currentTime = String.valueOf(day_month); //当前时间
  672. break;
  673. case "3": // 3.固定日期
  674. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  675. break;
  676. }
  677. for (String s : datePickerTimeArray){
  678. if(s.equals(currentTime)){
  679. multiply = multiply.multiply(new BigDecimal(integralProportion));
  680. break;
  681. }
  682. }
  683. }
  684. integral = multiply.intValue();
  685. break;
  686. }
  687. }
  688. }
  689. }
  690. calculateIntegral.setIntegral(integral);
  691. this.pushIntegral(calculateIntegral);
  692. }
  693. }
  694. /*
  695. * 公众号推送积分
  696. * @param stationId 油站ID
  697. * @param integral 本次所得积分
  698. * @param openId 小程序用户openID
  699. */
  700. public void pushIntegral(CalculateIntegral calculateIntegral){
  701. Integer stationId = calculateIntegral.getStationId();
  702. int integral = calculateIntegral.getIntegral();
  703. String openId = calculateIntegral.getOpenId();
  704. String unionId = calculateIntegral.getUnionId();
  705. String gzhAppId ="";
  706. String gzhAppSecret ="";
  707. String stationName = ""; //油站名称
  708. BigDecimal surplusIntegral=null;
  709. String customerName =null;
  710. if(StringUtils.isNotBlank(openId)){
  711. Map<String, String> m = stationService.getStationAppIdAndAppSecret(stationId);
  712. if(m !=null && m.containsKey("stationName") && m.containsKey("gzhAppId") && m.containsKey("gzhAppSecret")){
  713. stationName = m.get("stationName");
  714. gzhAppId = m.get("gzhAppId");
  715. gzhAppSecret = m.get("gzhAppSecret");
  716. }
  717. CustomerPoints customerPoints = new CustomerPoints();
  718. customerPoints.setStationId(stationId);
  719. customerPoints.setMinaOpenId(openId);
  720. customerPoints.setUnionId(unionId);
  721. CustomerPoints customerPointsInfo = customerPointsService.getCustomerPointsInfoByUnionId(customerPoints);
  722. if(customerPointsInfo !=null){
  723. customerName =customerPointsInfo.getCustomerName();
  724. surplusIntegral =new BigDecimal(customerPointsInfo.getPoints()).add(new BigDecimal(integral));
  725. CustomerPointsRecord customerPointsRecord = new CustomerPointsRecord();
  726. customerPointsRecord.setCreateTime(new Date());
  727. customerPointsRecord.setCustomerName(customerName);
  728. customerPointsRecord.setStationName(stationName);
  729. customerPointsRecord.setStationId(stationId);
  730. customerPointsRecord.setRecordType("+");
  731. customerPointsRecord.setUnionId(customerPointsInfo.getUnionId());
  732. customerPointsRecord.setIntegral(integral);
  733. customerPointsRecordService.insertCustomerPointsRecordInfo(customerPointsRecord);
  734. customerPoints.setUnionId(customerPointsInfo.getUnionId());
  735. customerPoints.setPoints(surplusIntegral.intValue());
  736. //更新客户积分
  737. customerPointsService.updateCustomerPointsInfo(customerPoints);
  738. String blogOpenId = customerPointsInfo.getBlogOpenId(); //公众号openId
  739. if(blogOpenId !=null){
  740. //推送模板
  741. List<WxMpTemplateData> wxMpTemplate = new ArrayList<>();
  742. wxMpTemplate.add(new WxMpTemplateData("first","尊敬的"+customerName+",您好:\n" + "您在"+stationName+"的积分最新交易信息如下"));
  743. wxMpTemplate.add(new WxMpTemplateData("time", new SimpleDateFormat("yyyy年MM月dd日HH时mm分").format(new Date())));
  744. wxMpTemplate.add(new WxMpTemplateData("type", "增加"));
  745. wxMpTemplate.add(new WxMpTemplateData("Point", String.valueOf(integral)));
  746. wxMpTemplate.add(new WxMpTemplateData("From", stationName));
  747. wxMpTemplate.add(new WxMpTemplateData("remark",
  748. "截止至" + new SimpleDateFormat(" yyyy年MM月dd日HH时mm分").format(new Date())+",您在"+stationName+"的可用积分为 "+surplusIntegral.toString()+" 分"));
  749. GzhNewsTemplate gzhNewsTemplate = new GzhNewsTemplate();
  750. gzhNewsTemplate.setStationId(stationId);
  751. gzhNewsTemplate.setTemplateType("1");
  752. GzhNewsTemplate gzhNewsTemplateInfo = gzhNewsTemplateService.getGzhNewsTemplate(gzhNewsTemplate);
  753. if(gzhNewsTemplateInfo !=null && gzhNewsTemplateInfo.getTemplateId() !=null){
  754. wxPushUtil.push(gzhAppId, gzhAppSecret, gzhNewsTemplateInfo.getTemplateId(), blogOpenId, wxMpTemplate);
  755. }
  756. }
  757. }
  758. }
  759. }
  760. /**
  761. * 根据订单号获取订单信息
  762. * produces="application/json;charset=UTF-8",consumes = "application/json",
  763. * @RequestBody String orderno
  764. * @param
  765. * @return
  766. */
  767. @RequestMapping(value = "/getPayOrderList", method = RequestMethod.GET)
  768. @ResponseBody
  769. public String getPayOrderList(@RequestParam String orderNo,String openId,String userType){
  770. Gson gson =new Gson();
  771. ResultData resultData =null;
  772. //根据token 和 usertype来判断用户是否存在
  773. boolean flag = appUserInfoService.selectAppUserInfo(openId,userType);
  774. if(flag){
  775. if(StringUtils.isNotBlank(orderNo)){
  776. PayOrderRequest payOrderRequest =new PayOrderRequest();
  777. payOrderRequest.setOrderNo(orderNo);
  778. List<PayOrder> payOrderList = payOrderService.getPayOrderList(payOrderRequest.getOrderNo());
  779. resultData=ResultData.success(payOrderList);
  780. }else {
  781. resultData=ResultData.error(CodeMsg.SEARCH_FAIL);
  782. }
  783. }else{
  784. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  785. }
  786. return gson.toJson(resultData);
  787. }
  788. /*
  789. * 根据用户openId和用户类型userType查询用户订单
  790. * @param openId
  791. * @param userType
  792. * @return
  793. */
  794. @RequestMapping(value = "/getOrderListByOpenIdAndUserType", method = RequestMethod.GET)
  795. @ResponseBody
  796. public String getOrderListByOpenIdAndUserType(@RequestParam("openId") String openId, @RequestParam("userType") String userType){
  797. Gson gson =new Gson();
  798. ResultData resultData =null;
  799. if(StringUtils.isNotBlank(openId) && StringUtils.isNotBlank(userType)){
  800. AppUserInfo appUserInfo = new AppUserInfo();
  801. switch (userType){
  802. case "1":
  803. appUserInfo.setBlogOpenid(openId);
  804. break;
  805. case "2":
  806. appUserInfo.setMinaOpenid(openId);
  807. break;
  808. }
  809. List<PayOrder> payOrderList = payOrderService.getOrderListByOpenIdAndUserType(appUserInfo);
  810. resultData=ResultData.success(payOrderList);
  811. }else {
  812. resultData=ResultData.error(CodeMsg.SEARCH_FAIL);
  813. }
  814. return gson.toJson(resultData);
  815. }
  816. }