PayController.java 150 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306
  1. package com.platform.yijia.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.alibaba.fastjson.parser.Feature;
  5. import com.google.gson.Gson;
  6. import com.platform.yijia.config.YiJiaRequest;
  7. import com.platform.yijia.param.request.*;
  8. import com.platform.yijia.pojo.*;
  9. import com.platform.yijia.service.*;
  10. import com.platform.yijia.utils.*;
  11. import com.platform.yijia.utils.redis.RedisCacheUtil;
  12. import com.platform.yijia.utils.weixinapp.WeiXinUserUtil;
  13. import com.platform.yijia.utils.weixinapp.WxPushUtil;
  14. import com.saobei.open.sdk.DefaultSaobeiApiClient;
  15. import com.saobei.open.sdk.model.requst.trade.SaobeiMiniPayRequest;
  16. import com.saobei.open.sdk.model.response.trade.SaobeiMiniPayResponse;
  17. import lombok.SneakyThrows;
  18. import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
  19. import org.apache.commons.lang3.StringUtils;
  20. import org.slf4j.Logger;
  21. import org.slf4j.LoggerFactory;
  22. import org.springframework.beans.factory.annotation.Value;
  23. import org.springframework.stereotype.Controller;
  24. import org.springframework.transaction.annotation.Transactional;
  25. import org.springframework.web.bind.annotation.*;
  26. import javax.annotation.Resource;
  27. import java.math.BigDecimal;
  28. import java.math.BigInteger;
  29. import java.math.RoundingMode;
  30. import java.sql.Timestamp;
  31. import java.text.ParseException;
  32. import java.text.SimpleDateFormat;
  33. import java.util.*;
  34. @Controller
  35. @YiJiaRequest()
  36. @CrossOrigin
  37. public class PayController {
  38. private static Logger logger =(Logger) LoggerFactory.getLogger(PayController.class);
  39. @Resource
  40. private PayOrderService payOrderService;
  41. @Resource
  42. private AppUserInfoService appUserInfoService;
  43. @Resource
  44. private StationOilGunService stationOilGunService;
  45. @Resource
  46. private CustomerGradeServices customerGradeServices;
  47. @Resource
  48. private StationService stationService;
  49. @Resource
  50. private CustomerPointsService customerPointsService;
  51. @Resource
  52. private IntegralRuleService integralRuleService;
  53. @Resource
  54. private CustomerPointsRecordService customerPointsRecordService;
  55. @Resource
  56. private WxPushUtil wxPushUtil;
  57. @Resource
  58. private GzhNewsTemplateService gzhNewsTemplateService;
  59. @Resource
  60. private CustomerManagerService customerManagerService;
  61. @Resource
  62. private CouponService couponService;
  63. @Value("${yijia.path.global-prefix}")
  64. private String globalPrefix;
  65. @Value("${yijia.domainName}")
  66. private String domainName;
  67. /***
  68. * 微信子商户支付接口
  69. * @param weChatPaySetRequest
  70. * @return
  71. */
  72. @RequestMapping(value = "/weChatPaySet", consumes = "application/json", method = RequestMethod.POST)
  73. @ResponseBody
  74. public String weChatPaySet(@RequestBody WeChatPaySetRequest weChatPaySetRequest){
  75. Gson gson = new Gson();
  76. ResultData resultData = null; //返回结果
  77. try {
  78. String type = weChatPaySetRequest.getType(); //获取配置类型
  79. JSONObject reqData = new JSONObject(); //微信子商户支付参数配置
  80. reqData.put("mno", weChatPaySetRequest.getMno()); //商编
  81. reqData.put("subMchIdsubMchId", weChatPaySetRequest.getSubMchIdsubMchId()); //获取微信子商号
  82. if(type != null && type !=""){
  83. reqData.put("type", type);
  84. //根据类型设置必传参数
  85. switch (type){
  86. case "01": //支付Appid
  87. reqData.put("accountType", weChatPaySetRequest.getAccountType()); // 支付Appid类型 配置类型为01时必传
  88. reqData.put("subAppid", weChatPaySetRequest.getSubAppid()); // 支付Appid 配置类型为01,02时必传
  89. break;
  90. case "02": //关注Appid
  91. reqData.put("subAppid", weChatPaySetRequest.getSubAppid()); // 支付Appid 配置类型为01,02时必传
  92. reqData.put("subscribeAppid", weChatPaySetRequest.getSubscribeAppid()); // 推荐关注公众号Appid 配置类型为02时与推荐关注 小程序Appid二选一
  93. reqData.put("receiptAppid", weChatPaySetRequest.getReceiptAppid()); // 推荐关注小程序Appid 配置类型为02时与推荐关注 公众号Appid二选一
  94. break;
  95. case "03": //jsapi授权目录
  96. reqData.put("jsapiPath", weChatPaySetRequest.getJsapiPath()); // jsapi授权目录 配置类型为03时必传
  97. break;
  98. }
  99. }
  100. String sxfPay = SXFPaySign.getSXFPay(reqData); //封装传参信息,增加公共信息,增加业务信息
  101. logger.debug("参数信息:"+ sxfPay);
  102. System.out.println("req:" + sxfPay);
  103. //此处不要改变reqData里面值的顺序用LinkedHashMap
  104. HashMap reqMap = JSON.parseObject(sxfPay, LinkedHashMap.class, Feature.OrderedField);
  105. //组装加密串
  106. String signContent = RSASignature.getOrderContent(reqMap);
  107. System.out.println("拼接后的参数:" + signContent);
  108. logger.debug("拼接后的参数:"+signContent);
  109. //sign
  110. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  111. reqMap.put("sign", sign);
  112. String reqStr = JSON.toJSONString(reqMap);
  113. System.out.println("请求参数:" + reqMap);
  114. System.out.println("请求参数:" + reqStr);
  115. //String url = "https://openapi-test.tianquetech.com/merchant/weChatPaySet/addConf"; //测试环境
  116. String url = "https://openapi.tianquetech.com/merchant/weChatPaySet/addConf"; //生产环境
  117. //访问第三方接口
  118. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  119. System.out.println("返回信息:" + resultJson);
  120. // logger.debug("返回信息:"+resultJson);
  121. //不要对reqData排序 所以用LinkedHashMap
  122. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  123. if ("0000".equals(result.get("code"))) {
  124. //验签
  125. String signResult = result.get("sign").toString();
  126. result.remove("sign");
  127. String resultStr = RSASignature.getOrderContent(result);
  128. System.out.println(resultStr);
  129. //sign
  130. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  131. System.out.println("resultSign:" + resultSign);
  132. //组装加密串
  133. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  134. System.out.println("===================验签成功==============");
  135. }
  136. }
  137. resultData=ResultData.success(result);
  138. } catch (Exception e) {
  139. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"支付失败");
  140. e.printStackTrace();
  141. }
  142. return gson.toJson(resultData);
  143. }
  144. /**
  145. * 支付接口,前台上传支付信息,支付数据落地生产订单,调用随行付支付接口
  146. * @param
  147. * @return
  148. */
  149. @RequestMapping(value = "/getJhPayInfo", consumes = "application/json", method = RequestMethod.POST)
  150. @ResponseBody
  151. @Transactional
  152. public String getJhPayInfo(@RequestBody PayInfoRequest payInfoRequest){
  153. Gson gson =new Gson();
  154. ResultData resultData =null;
  155. String openId = payInfoRequest.getOpenId(); //用户openId
  156. String userType=payInfoRequest.getUserType();//用户登录类型 1 公众号。2 小程序
  157. String ordNo = payInfoRequest.getOrdNo();
  158. AppUserInfo appUserInfo =new AppUserInfo();
  159. //订单类型 是小程序还是公众号
  160. appUserInfo.setUserType(userType);
  161. if(userType.equals("1")){
  162. //1 是微信
  163. appUserInfo.setMinaOpenid(openId);
  164. }else if(userType.equals("2")){
  165. //2是支付宝
  166. appUserInfo.setALiId(openId);
  167. }
  168. //appUserInfo.setStationId(stationInfos.getGroupId());
  169. StationInfo stationInfo = new StationInfo();
  170. stationInfo.setStationId(Integer.valueOf(payInfoRequest.getStationId()));
  171. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  172. appUserInfo.setStationId(stationInfos.getGroupId());
  173. AppUserInfo appUserInfos =appUserInfoService.getAppUserInfo(appUserInfo);
  174. if(appUserInfos!=null){
  175. //调用聚合支付
  176. try{
  177. //根据订单号查询订单信息
  178. PayOrder payOrder=payOrderService.selectOrderInfoByOrdNo(ordNo);
  179. if(payOrder!=null ){
  180. if(payOrder.getStatus() !=null && payOrder.getStatus().equals("0")){
  181. //是否开启优惠券功能
  182. if(stationInfos.getCouponEnabledFlag() !=null && stationInfos.getCouponEnabledFlag().equals("1")){
  183. if(StringUtils.isNotBlank(payInfoRequest.getId()) && !payInfoRequest.getId().equals("undefined")){
  184. String id = payInfoRequest.getId();
  185. logger.info("优惠券ID:" + id);
  186. UserCoupon userCoupon = new UserCoupon();
  187. userCoupon.setId(Integer.valueOf(id));
  188. UserCoupon ucResult = couponService.selectUserCouponInfo(userCoupon);
  189. if(ucResult !=null){
  190. PayOrder p =new PayOrder();
  191. BigDecimal couponAmt = ucResult.getCouponAmt(); //优惠券优惠参数
  192. String couponType = ucResult.getCouponType(); //优惠券类型
  193. Double amt = payOrder.getAmt();
  194. Double discountAmt = payOrder.getDiscountAmt();
  195. Double receivableAmt = payOrder.getReceivableAmt();
  196. BigDecimal amtNew = new BigDecimal(amt.toString());
  197. BigDecimal discountAmtNew = new BigDecimal(discountAmt.toString());
  198. switch (couponType){
  199. case "1":
  200. amtNew = new BigDecimal(amt.toString()).subtract(couponAmt);
  201. discountAmtNew = new BigDecimal(discountAmt.toString()).add(couponAmt);
  202. break;
  203. case "2":
  204. //amtNew;
  205. BigDecimal divide = new BigDecimal(amt.toString()).multiply(couponAmt).divide(new BigDecimal("100"));
  206. discountAmtNew = discountAmtNew.add(divide);
  207. amtNew = amtNew.subtract(divide);
  208. break;
  209. }
  210. //优惠方案选择
  211. String discountSetting = stationInfos.getDiscountSetting();
  212. if(discountSetting!=null && discountSetting.equals("0")){
  213. //为0时,表示无营销方案,只有等级
  214. if(!ucResult.getIsGradeFlag().equals("1")){
  215. //表示该优惠券与等级不叠加
  216. switch (couponType){
  217. case "1":
  218. amtNew = new BigDecimal(receivableAmt.toString()).subtract(couponAmt);
  219. discountAmtNew = couponAmt;
  220. break;
  221. case "2":
  222. amtNew = new BigDecimal(receivableAmt.toString()).multiply(couponAmt).divide(new BigDecimal("100"));
  223. discountAmtNew = new BigDecimal(receivableAmt.toString()).subtract(amtNew);
  224. break;
  225. }
  226. }
  227. }else {
  228. //不为0时,表示有营销方案
  229. if(!ucResult.getIsMarketFlag().equals("1")){
  230. //表示该优惠券与营销方案不叠加
  231. //表示该优惠券与等级不叠加
  232. switch (couponType){
  233. case "1":
  234. amtNew = new BigDecimal(receivableAmt.toString()).subtract(couponAmt);
  235. discountAmtNew = couponAmt;
  236. break;
  237. case "2":
  238. amtNew = new BigDecimal(receivableAmt.toString()).multiply(couponAmt).divide(new BigDecimal("100"));
  239. discountAmtNew = new BigDecimal(receivableAmt.toString()).subtract(amtNew);
  240. break;
  241. }
  242. }
  243. }
  244. amtNew = amtNew.signum() == -1 ? new BigDecimal("0.01") : amtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  245. discountAmtNew = discountAmtNew.signum() == -1 ? new BigDecimal("0.01") : discountAmtNew.setScale(2,BigDecimal.ROUND_HALF_UP);
  246. p.setAmt(Double.valueOf(amtNew.toString()));
  247. p.setDiscountAmt(Double.valueOf(discountAmtNew.toString()));
  248. p.setDiscountCoupon(id);
  249. p.setOrderNo(ordNo);
  250. payOrderService.getUpdatePayOrder(p);
  251. logger.info("优惠券更新完成!");
  252. }
  253. }
  254. }
  255. //将业务参数存放在 JSON 对象中
  256. JSONObject reqData = new JSONObject();
  257. PayOrder payOrderNew=payOrderService.selectOrderInfoByOrdNo(ordNo);
  258. logger.info("使用优惠券后的金额:" + payOrderNew.getAmt());
  259. reqData.put("ordNo", payOrder.getOrderNo()); //商户订单号
  260. //reqData.put("subMechId", ""); //子商户号
  261. reqData.put("amt", payOrderNew.getAmt()); //订单总金额
  262. //reqData.put("amt", "0.01");
  263. //reqData.put("discountAmt", ""); //参与优惠金额
  264. //reqData.put("unDiscountAmt", ""); //不参与优惠金额
  265. Map<String, String> stationAppIdAndAppSecret = stationService.getStationAppIdAndAppSecret(Integer.valueOf(payInfoRequest.getStationId()));
  266. if(stationAppIdAndAppSecret !=null && stationAppIdAndAppSecret.containsKey("appId") && stationAppIdAndAppSecret.containsKey("mno")){
  267. if(userType.equals("1")){
  268. reqData.put("subAppid", stationAppIdAndAppSecret.get("appId")); //微信小程序
  269. logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("appId"));
  270. }else if(userType.equals("2")){
  271. reqData.put("subAppid", stationAppIdAndAppSecret.get("aliAppId")); //支付宝小程序
  272. logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("aliAppId"));
  273. }
  274. reqData.put("mno", stationAppIdAndAppSecret.get("mno")); //商户编号
  275. logger.info("商户编号:"+ stationAppIdAndAppSecret.get("mno"));
  276. }
  277. if(userType.equals("1")){
  278. //1 是微信小程序
  279. reqData.put("payType", "WECHAT"); //支付渠道 WECHAT:微信;ALIPAY:支付宝;UNIONPAY:银联
  280. reqData.put("payWay", "03"); //支付方式 02 公众号/服 务窗/js支付 03 小程序
  281. reqData.put("userId", appUserInfos.getMinaOpenid()); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
  282. }else if(userType.equals("2")){
  283. //2 是支付宝
  284. reqData.put("payType", "ALIPAY"); //支付渠道 WECHAT:微信;ALIPAY:支付宝;UNIONPAY:银联
  285. reqData.put("payWay", "03"); //支付方式 02 公众号/服 务窗/js支付 03 小程序
  286. reqData.put("userId", appUserInfos.getALiId()); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
  287. }
  288. //reqData.put("timeExpire", "10"); //订单失效时间, 以分钟为单位
  289. //reqData.put("limitPay", "00"); //限制卡类型: 00-全部 01-限定不能使 用信用卡支付 默认值 00
  290. reqData.put("subject", payOrder.getOilName() + " - " +payOrder.getStationName()); //订单标题
  291. //reqData.put("hbFqNum", "6"); //花呗分期数,仅可上送 6 或 12
  292. reqData.put("tradeSource", "01"); //交易来源 01服务商,02收银台,03硬件
  293. reqData.put("trmIp", "172.16.2.1");//商家ip地址
  294. // reqData.put("customerIp", ""); //持卡人ip地址,银联js支付时必传
  295. //reqData.put("outFrontUrl", ""); //js 支付,前台 成功通知地址
  296. reqData.put("outFrontFailUrl", ""); //js 支付,前台 事变通知地址
  297. //globalPrefix
  298. String notifyUrl = "https://"+domainName+"/"+globalPrefix+"/getCallback";
  299. logger.info("随行付调用回调地址:" + notifyUrl);
  300. //reqData.put("notifyUrl", "https://www.huijy.net/api/getCallback"); //回调地址
  301. reqData.put("notifyUrl", notifyUrl); //回调地址
  302. //reqData.put("needReceipt", "00"); //电子发票功能 微信开具电子 发票使用
  303. //reqData.put("ledgerAccountFlag", "00"); //是否做分账 分账交易使 用;00:做; 01:不做;不传默认为不做分账
  304. //reqData.put("ledgerAccountEffectTime", "00"); //分账有效时间 单位为天;是 否做分账选择 00 时该字段必传
  305. // reqData.put("ruleId", "00"); //同 步 分 账 规 则 id
  306. //是否开启分账
  307. if(stationAppIdAndAppSecret.containsKey("mnoStatus") && stationAppIdAndAppSecret.get("mnoStatus").equals("1")){
  308. if(stationAppIdAndAppSecret.containsKey("mnoArray") && stationAppIdAndAppSecret.containsKey("mnoProportion")){
  309. logger.info("该商户号使用分账分账");
  310. //分账商户号
  311. //商户号
  312. List<Map<String, Object>> fusruleId = new ArrayList<>();
  313. String mnoArray = stationAppIdAndAppSecret.get("mnoArray");
  314. String[] mnoArraySplit = mnoArray.split(",");
  315. List<String> mnoArrayList = Arrays.asList(mnoArraySplit);
  316. //比例
  317. String mnoProportion = stationAppIdAndAppSecret.get("mnoProportion");
  318. String[] mnoProportionSplit = mnoProportion.split(":");
  319. List<String> mnoProportionList = Arrays.asList(mnoProportionSplit);
  320. for (int i=0; i<mnoArrayList.size(); i++){
  321. for (int y=0; y<mnoProportionList.size()-1; y++){
  322. String mno = mnoArrayList.get(i);
  323. String mnoPro = mnoProportionList.get(y);
  324. //本单金额
  325. String amt = payOrder.getAmt().toString();
  326. BigDecimal allotValue = new BigDecimal(amt).multiply(new BigDecimal(mnoPro)).divide(new BigDecimal("10")).setScale(2, BigDecimal.ROUND_HALF_UP);
  327. Map<String, Object> m = new HashMap<>();
  328. m.put("mno", mno);
  329. m.put("allotValue", allotValue);
  330. //map.put(allotValue.toString(), mno);
  331. fusruleId.add(m);
  332. }
  333. }
  334. logger.info("fusruleId 分账规则:" + fusruleId.toString());
  335. reqData.put("fusruleId", fusruleId); //同步分账规则
  336. }
  337. }
  338. // reqData.put("fusruleId", "00"); //同步分账规则
  339. //reqData.put("ylTrmNo", ""); //银联终端号
  340. //reqData.put("terminalId", ""); //TQ机具编号
  341. //reqData.put("deviceNo ", "1111"); //设备号
  342. // reqData.put("identityFlag", ""); //是否是实名支付
  343. // reqData.put("buyerIdType", "IDCARD"); //证件类型
  344. // reqData.put("buyerIdNo", "410523198701054018"); //证件号
  345. // reqData.put("buyerName", "张三"); //买家姓名
  346. // reqData.put("mobileNum", ""); //手机号
  347. // reqData.put("extend", ""); //备用
  348. String req= SXFPaySign.getSXFPay(reqData);
  349. logger.debug("参数信息:"+req);
  350. System.out.println("req:" + req);
  351. //此处不要改变reqData里面值的顺序用LinkedHashMap
  352. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  353. //组装加密串
  354. String signContent = RSASignature.getOrderContent(reqMap);
  355. System.out.println("拼接后的参数:" + signContent);
  356. logger.debug("拼接后的参数:"+signContent);
  357. //sign
  358. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  359. System.out.println("============签名:" + sign);
  360. reqMap.put("sign", sign);
  361. String reqStr = JSON.toJSONString(reqMap);
  362. System.out.println("请求参数:" + reqMap);
  363. System.out.println("请求参数:" + reqStr);
  364. //调用第三方接口地址
  365. //String url = "https://openapi-test.tianquetech.com/order/jsapiScan";//测试地址
  366. String url = "https://openapi.suixingpay.com/order/jsapiScan";//生产地址
  367. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  368. System.out.println("返回信息:" + resultJson);
  369. // logger.debug("返回信息:"+resultJson);
  370. //不要对reqData排序 所以用LinkedHashMap
  371. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  372. if ("0000".equals(result.get("code"))) {
  373. //验签
  374. String signResult = result.get("sign").toString();
  375. result.remove("sign");
  376. String resultStr = RSASignature.getOrderContent(result);
  377. System.out.println("resultStr: " + resultStr);
  378. //sign
  379. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  380. System.out.println("resultSign: " + resultSign);
  381. //组装加密串
  382. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  383. System.out.println("===================验签成功==============");
  384. }
  385. }
  386. resultData=ResultData.success(result);
  387. }else {
  388. resultData=ResultData.error(CodeMsg.ALREADY_PAY);
  389. }
  390. }else {
  391. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"未查询到订单");
  392. }
  393. }catch (Exception e){
  394. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"订单支付失败");
  395. e.printStackTrace();
  396. }
  397. }else{
  398. //返回失败支付失败信息
  399. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  400. }
  401. return gson.toJson(resultData);
  402. }
  403. /**
  404. * 新修订支付通道:传参payChannelType 来区分使用随行付还是云闪付 用户充值电子会员卡(储蓄卡)拉起支付接口
  405. * @param
  406. * @return
  407. */
  408. @RequestMapping(value = "/getPayChannelInfo", consumes = "application/json", method = RequestMethod.POST)
  409. @ResponseBody
  410. public String getPayChannelInfo(@RequestBody PayInfoRequest payInfoRequest){
  411. Gson gson =new Gson();
  412. ResultData resultData =null;
  413. String openId = payInfoRequest.getOpenId(); //用户openId
  414. String userType=payInfoRequest.getUserType();//用户登录类型 1 公众号。2 小程序
  415. String ordNo = payInfoRequest.getOrdNo();
  416. AppUserInfo appUserInfo =new AppUserInfo();
  417. //订单类型 是小程序还是公众号
  418. appUserInfo.setUserType(userType);
  419. if(userType.equals("1")){
  420. //1 是微信
  421. appUserInfo.setMinaOpenid(openId);
  422. }else if(userType.equals("2")){
  423. //2是支付宝
  424. appUserInfo.setALiId(openId);
  425. }
  426. //appUserInfo.setStationId(stationInfos.getGroupId());
  427. StationInfo stationInfo = new StationInfo();
  428. stationInfo.setStationId(Integer.valueOf(payInfoRequest.getStationId()));
  429. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  430. appUserInfo.setStationId(stationInfos.getGroupId());
  431. AppUserInfo appUserInfos =appUserInfoService.getAppUserInfo(appUserInfo);
  432. if(appUserInfos!=null){
  433. //调用聚合支付
  434. try{
  435. //根据订单号查询订单信息
  436. PayOrder payOrder=payOrderService.selectOrderInfoByOrdNo(ordNo);
  437. if(payOrder!=null ){
  438. if(payOrder.getStatus() !=null && payOrder.getStatus().equals("0")){
  439. if(payInfoRequest.getPayChannelType() !=null && payInfoRequest.getPayChannelType().equals("2")){
  440. /******************************************************云闪付支付***********************************************************/
  441. //云闪付支付方式
  442. Map<String, String> staPayChannelInfo = stationService.getStationAppIdAndAppSecret(Integer.valueOf(payInfoRequest.getStationId()));
  443. if(staPayChannelInfo !=null && staPayChannelInfo.containsKey("merchantNo") && staPayChannelInfo.containsKey("terminalId")
  444. && staPayChannelInfo.containsKey("yunKey") && staPayChannelInfo.containsKey("appId")) {
  445. //秘钥
  446. String yunKey = staPayChannelInfo.get("yunKey"); //23570b46a955484d92038f6a18d2b9d6
  447. logger.info("==============================云闪付 小程序支付油品 拉起支付 ** 开始 **============================================");
  448. DefaultSaobeiApiClient defaultSaobeiApiClient = new DefaultSaobeiApiClient(yunKey); //2ef428f4f76c414282e831baea9e4b0e
  449. SaobeiMiniPayRequest requst = new SaobeiMiniPayRequest();
  450. requst.setPay_ver("100");
  451. requst.setPay_type("010");
  452. requst.setService_id("015");
  453. requst.setMerchant_no(staPayChannelInfo.get("merchantNo")); //商户号 845104816000034
  454. requst.setTerminal_id(staPayChannelInfo.get("terminalId")); //终端号 18241101
  455. requst.setTerminal_trace(payOrder.getOrderNo()); //订单号 202003252204310000 6683315853083916109905
  456. requst.setTerminal_time(new SimpleDateFormat("yyyyMMddhhmmss").format(new Date())); //"20200325220431"
  457. //云闪付单位为分
  458. BigDecimal totalFee = new BigDecimal(payOrder.getAmt().toString()).multiply(new BigDecimal("100")).setScale(0, BigDecimal.ROUND_DOWN);
  459. logger.info("该订单金额:" + payOrder.getAmt().toString()+"; 拉起云闪付上送金额(单位:分):" + totalFee.toString());
  460. requst.setTotal_fee(totalFee.toString());
  461. requst.setOpen_id(payInfoRequest.getOpenId()); // oRwjv4iHjSUgxNxOJOQ_60Ln7cno obnG9jhDLvom5fGwuhYysmQTW4qQ
  462. //订单内容
  463. String orderBody = payOrder.getOilName()+ " - " + payOrder.getOilGun() + "号枪 - " +payOrder.getStationName();
  464. requst.setOrder_body(orderBody);
  465. //回调地址
  466. String notifyUrl = "https://" + this.domainName + "/" + this.globalPrefix + "/getYunPayCallback";
  467. logger.info("回调地址:" + notifyUrl);
  468. requst.setNotify_url(notifyUrl);
  469. //小程序appId
  470. requst.setSub_appid(staPayChannelInfo.get("appId")); // wxe1135cd390b38a54 wxe568c727d466aef9 智慧易加公众号:wxc8189d3b3a7283e0
  471. logger.info("请求报文:" + JSON.toJSONString(requst));
  472. SaobeiMiniPayResponse response = (SaobeiMiniPayResponse) defaultSaobeiApiClient.execute(requst);
  473. logger.info("返回报文:" + JSON.toJSONString(response));
  474. //返回前端字段
  475. Map<String, Object> reqData = new HashMap<>();
  476. //Map<String, Object> resultMap = new HashMap<>();
  477. if(response !=null && response.getResult_code().equals("01")){
  478. reqData.put("timeStamp", response.getTimeStamp());
  479. reqData.put("payPackage", response.getPackage_str());
  480. reqData.put("signType", response.getSignType());
  481. reqData.put("paySign", response.getPaySign());
  482. reqData.put("return_msg", response.getReturn_msg());
  483. reqData.put("merchant_name", response.getMerchant_name());
  484. reqData.put("total_fee", response.getTotal_fee());
  485. reqData.put("terminal_time", response.getTerminal_time());
  486. reqData.put("terminal_trace", response.getTerminal_trace());
  487. reqData.put("code", response.getResult_code());
  488. }else if(response !=null && response.getResult_code().equals("02")){
  489. reqData.put("code", response.getResult_code());
  490. reqData.put("return_msg", response.getReturn_msg());
  491. }else {
  492. //自己定义
  493. reqData.put("code", "03");
  494. reqData.put("return_msg", "当前支付系统参数配置错误请检查!");
  495. }
  496. //resultMap.put("respData", reqData);
  497. logger.info("云闪付返回给前端字段:" + JSON.toJSONString(reqData));
  498. resultData = ResultData.success(reqData);
  499. logger.info("==============================云闪付 小程序支付油品 拉起支付 ** 结束 **============================================");
  500. }else {
  501. resultData = ResultData.error(CodeMsg.STATION_NULL_INFO);
  502. }
  503. }else{
  504. /******************************************************随行付支付***********************************************************/
  505. //将业务参数存放在 JSON 对象中
  506. JSONObject reqData = new JSONObject();
  507. reqData.put("ordNo", payOrder.getOrderNo()); //商户订单号
  508. //reqData.put("subMechId", ""); //子商户号
  509. reqData.put("amt", payOrder.getAmt()); //订单总金额
  510. //reqData.put("amt", "0.01");
  511. //reqData.put("discountAmt", ""); //参与优惠金额
  512. //reqData.put("unDiscountAmt", ""); //不参与优惠金额
  513. Map<String, String> stationAppIdAndAppSecret = stationService.getStationAppIdAndAppSecret(Integer.valueOf(payInfoRequest.getStationId()));
  514. if(stationAppIdAndAppSecret !=null && stationAppIdAndAppSecret.containsKey("appId") && stationAppIdAndAppSecret.containsKey("mno")){
  515. if(userType.equals("1")){
  516. reqData.put("subAppid", stationAppIdAndAppSecret.get("appId")); //微信小程序
  517. logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("appId"));
  518. }else if(userType.equals("2")){
  519. reqData.put("subAppid", stationAppIdAndAppSecret.get("aliAppId")); //支付宝小程序
  520. logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("aliAppId"));
  521. }
  522. reqData.put("mno", stationAppIdAndAppSecret.get("mno")); //商户编号
  523. logger.info("商户编号:"+ stationAppIdAndAppSecret.get("mno"));
  524. }
  525. if(userType.equals("1")){
  526. //1 是微信小程序
  527. reqData.put("payType", "WECHAT"); //支付渠道 WECHAT:微信;ALIPAY:支付宝;UNIONPAY:银联
  528. reqData.put("payWay", "03"); //支付方式 02 公众号/服 务窗/js支付 03 小程序
  529. reqData.put("userId", appUserInfos.getMinaOpenid()); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
  530. }else if(userType.equals("2")){
  531. //2 是支付宝
  532. reqData.put("payType", "ALIPAY"); //支付渠道 WECHAT:微信;ALIPAY:支付宝;UNIONPAY:银联
  533. reqData.put("payWay", "03"); //支付方式 02 公众号/服 务窗/js支付 03 小程序
  534. reqData.put("userId", appUserInfos.getALiId()); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
  535. }
  536. //reqData.put("timeExpire", "10"); //订单失效时间, 以分钟为单位
  537. //reqData.put("limitPay", "00"); //限制卡类型: 00-全部 01-限定不能使 用信用卡支付 默认值 00
  538. reqData.put("subject", payOrder.getOilName() + " - " +payOrder.getStationName()); //订单标题
  539. //reqData.put("hbFqNum", "6"); //花呗分期数,仅可上送 6 或 12
  540. reqData.put("tradeSource", "01"); //交易来源 01服务商,02收银台,03硬件
  541. reqData.put("trmIp", "172.16.2.1");//商家ip地址
  542. // reqData.put("customerIp", ""); //持卡人ip地址,银联js支付时必传
  543. //reqData.put("outFrontUrl", ""); //js 支付,前台 成功通知地址
  544. reqData.put("outFrontFailUrl", ""); //js 支付,前台 事变通知地址
  545. //globalPrefix
  546. String notifyUrl = "https://"+domainName+"/"+globalPrefix+"/getCallback";
  547. logger.info("随行付调用回调地址:" + notifyUrl);
  548. //reqData.put("notifyUrl", "https://www.huijy.net/api/getCallback"); //回调地址
  549. reqData.put("notifyUrl", notifyUrl); //回调地址
  550. //reqData.put("needReceipt", "00"); //电子发票功能 微信开具电子 发票使用
  551. //reqData.put("ledgerAccountFlag", "00"); //是否做分账 分账交易使 用;00:做; 01:不做;不传默认为不做分账
  552. //reqData.put("ledgerAccountEffectTime", "00"); //分账有效时间 单位为天;是 否做分账选择 00 时该字段必传
  553. // reqData.put("ruleId", "00"); //同 步 分 账 规 则 id
  554. // reqData.put("fusruleId", "00"); //同步分账规则
  555. //reqData.put("ylTrmNo", ""); //银联终端号
  556. //reqData.put("terminalId", ""); //TQ机具编号
  557. //reqData.put("deviceNo ", "1111"); //设备号
  558. // reqData.put("identityFlag", ""); //是否是实名支付
  559. // reqData.put("buyerIdType", "IDCARD"); //证件类型
  560. // reqData.put("buyerIdNo", "410523198701054018"); //证件号
  561. // reqData.put("buyerName", "张三"); //买家姓名
  562. // reqData.put("mobileNum", ""); //手机号
  563. // reqData.put("extend", ""); //备用
  564. String req= SXFPaySign.getSXFPay(reqData);
  565. logger.debug("参数信息:"+req);
  566. System.out.println("req:" + req);
  567. //此处不要改变reqData里面值的顺序用LinkedHashMap
  568. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  569. //组装加密串
  570. String signContent = RSASignature.getOrderContent(reqMap);
  571. System.out.println("拼接后的参数:" + signContent);
  572. logger.debug("拼接后的参数:"+signContent);
  573. //sign
  574. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  575. System.out.println("============签名:" + sign);
  576. reqMap.put("sign", sign);
  577. String reqStr = JSON.toJSONString(reqMap);
  578. System.out.println("请求参数:" + reqMap);
  579. System.out.println("请求参数:" + reqStr);
  580. //调用第三方接口地址
  581. //String url = "https://openapi-test.tianquetech.com/order/jsapiScan";//测试地址
  582. String url = "https://openapi.suixingpay.com/order/jsapiScan";//生产地址
  583. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  584. System.out.println("返回信息:" + resultJson);
  585. // logger.debug("返回信息:"+resultJson);
  586. //不要对reqData排序 所以用LinkedHashMap
  587. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  588. Map<String, Object> r = new HashMap<>(); //返回前端参数
  589. if ("0000".equals(result.get("code"))) {
  590. //验签
  591. String signResult = result.get("sign").toString();
  592. result.remove("sign");
  593. String resultStr = RSASignature.getOrderContent(result);
  594. System.out.println("resultStr: " + resultStr);
  595. //sign
  596. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  597. System.out.println("resultSign: " + resultSign);
  598. //组装加密串
  599. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  600. System.out.println("===================验签成功==============");
  601. logger.info("随行付返回字段:" +result);
  602. r.put("code", result.get("code"));
  603. r.put("msg", result.get("msg"));
  604. //net.sf.json.JSONObject result = location.getJSONObject("result").getJSONObject("addressComponent");
  605. JSONObject respData = (JSONObject)result.get("respData");
  606. r.put("payTimeStamp", respData.get("payTimeStamp"));
  607. r.put("ordNo", respData.get("ordNo"));
  608. r.put("payPackage", respData.get("payPackage"));
  609. r.put("bizMsg", respData.get("bizMsg"));
  610. r.put("paySign", respData.get("paySign"));
  611. r.put("bizCode", respData.get("bizCode"));
  612. r.put("payAppId", respData.get("payAppId"));
  613. r.put("sxfUuid", respData.get("sxfUuid"));
  614. r.put("paynonceStr", respData.get("paynonceStr"));
  615. r.put("paySignType", respData.get("paySignType"));
  616. r.put("uuid", respData.get("uuid"));
  617. r.put("orgId", result.get("orgId"));
  618. r.put("signType", result.get("signType"));
  619. r.put("reqId", result.get("reqId"));
  620. }
  621. }else {
  622. r.put("code", result.get("code"));
  623. r.put("msg", result.get("msg"));
  624. }
  625. logger.info("随行付支付时系统返回前端参数字段:" +r);
  626. resultData=ResultData.success(r);
  627. }
  628. }else {
  629. resultData=ResultData.error(CodeMsg.ALREADY_PAY);
  630. }
  631. }else {
  632. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"未查询到订单");
  633. }
  634. }catch (Exception e){
  635. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"订单支付失败");
  636. e.printStackTrace();
  637. }
  638. }else{
  639. //返回失败支付失败信息
  640. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  641. }
  642. return gson.toJson(resultData);
  643. }
  644. /**
  645. * 验证商户信息查询
  646. */
  647. @RequestMapping(value = "/getJhPayMnoInfo", method = RequestMethod.GET)
  648. @ResponseBody
  649. public String getJhPayMnoInfo(@RequestParam String mno){
  650. try {
  651. JSONObject reqData = new JSONObject();
  652. reqData.put("mno", mno); //商户编号
  653. String req = SXFPaySign.getSXFPay(reqData);
  654. logger.debug("参数信息:" + req);
  655. System.out.println("req:" + req);
  656. //此处不要改变reqData里面值的顺序用LinkedHashMap
  657. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  658. //组装加密串
  659. String signContent = RSASignature.getOrderContent(reqMap);
  660. System.out.println("拼接后的参数:" + signContent);
  661. logger.debug("拼接后的参数:" + signContent);
  662. //sign
  663. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  664. System.out.println("============签名:" + sign);
  665. reqMap.put("sign", sign);
  666. String reqStr = JSON.toJSONString(reqMap);
  667. System.out.println("请求参数:" + reqMap);
  668. System.out.println("请求参数:" + reqStr);
  669. //调用第三方接口地址
  670. //String url = "https://openapi-test.tianquetech.com/merchant/merchantInfoQuery";//测试地址
  671. String url = "https://openapi.tianquetech.com/merchant/merchantInfoQuery";//生产地址
  672. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  673. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  674. if ("0000".equals(result.get("code"))) {
  675. // //验签
  676. // String signResult = result.get("sign").toString();
  677. // result.remove("sign");
  678. // String resultStr = RSASignature.getOrderContent(result);
  679. // System.out.println(resultStr);
  680. // //sign
  681. // String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  682. // System.out.println("resultSign:" + resultSign);
  683. // //组装加密串
  684. // if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  685. // System.out.println("===================验签成功==============");
  686. // }
  687. }
  688. }catch (Exception e){
  689. e.printStackTrace();
  690. }
  691. return "";
  692. }
  693. /**
  694. * 关单接口
  695. */
  696. @RequestMapping(value = "/getPayOrderClose", consumes = "application/json", method = RequestMethod.POST)
  697. @ResponseBody
  698. public String getPayOrderClose(@RequestBody PayCloseRequestParamter payCloseRequestParamter) {
  699. String results="";
  700. Gson gson =new Gson();
  701. String mno=payCloseRequestParamter.getMno();
  702. String origOrderNo=payCloseRequestParamter.getOrigOrderNo();
  703. String origUuid=payCloseRequestParamter.getOrigUuid();
  704. String token=payCloseRequestParamter.getToken();
  705. String userType=payCloseRequestParamter.getUserType();
  706. boolean flag =appUserInfoService.selectAppUserInfo(token,userType);
  707. ResultData resultData =null;
  708. if(flag){
  709. try {
  710. JSONObject reqData = new JSONObject();
  711. reqData.put("mno",mno); //商户编号
  712. reqData.put("origOrderNo",origOrderNo);//系统商户订单号
  713. reqData.put("origUuid", origUuid);//随行付订单号
  714. String req= SXFPaySign.getSXFPay(reqData);
  715. //此处不要改变reqData里面值的顺序用LinkedHashMap
  716. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  717. //组装加密串
  718. String signContent = RSASignature.getOrderContent(reqMap);
  719. System.out.println("拼接后的参数:" + signContent);
  720. //sign
  721. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  722. System.out.println("============签名:" + sign);
  723. reqMap.put("sign", sign);
  724. String reqStr = JSON.toJSONString(reqMap);
  725. System.out.println("请求参数:" + reqMap);
  726. System.out.println("请求参数:" + reqStr);
  727. //调用第三方接口地址
  728. // String url = "https://openapi-test.tianquetech.com/query/close";//测试地址
  729. String url = "https://openapi.tianquetech.com/query/close";//生产地址
  730. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  731. System.out.println("返回信息:" + resultJson);
  732. //不要对reqData排序 所以用LinkedHashMap
  733. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  734. if ("0000".equals(result.get("code"))) {
  735. //验签
  736. String signResult = result.get("sign").toString();
  737. result.remove("sign");
  738. String resultStr = RSASignature.getOrderContent(result);
  739. System.out.println(resultStr);
  740. //sign
  741. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent,SXFPaySign.privateKey));
  742. System.out.println("resultSign:" + resultSign);
  743. //组装加密串
  744. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  745. System.out.println("===================验签成功==============");
  746. }
  747. }
  748. resultData=ResultData.success(result);
  749. }catch (Exception e){
  750. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"关闭订单失败");
  751. e.printStackTrace();
  752. }
  753. }else{
  754. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  755. }
  756. return gson.toJson(resultData);
  757. }
  758. /**
  759. * 异步回调通知
  760. */
  761. @RequestMapping(value = "/getCallback", consumes = "application/json", method = RequestMethod.POST)
  762. @ResponseBody
  763. @Transactional
  764. public JSONObject getCallback(@RequestBody JSONObject request) throws ParseException {
  765. logger.info("-------------------------------回调开始----------------------------------------------");
  766. logger.info("回调返回过来的参数"+request);
  767. // logger.info("ordNo信息:" + request.get("ordNo").toString());
  768. // logger.info("sign信息:" + request.get("sign").toString());
  769. Gson gson =new Gson();
  770. String sxfUuid=request.get("sxfUuid").toString(); //随行付落单号
  771. String payWay=request.get("payWay").toString(); //随行付交易方式
  772. String payTime=request.get("payTime").toString(); //随行付交易时间
  773. String uuid=request.get("uuid").toString(); //随行付交易流水号
  774. String mno=request.get("mno").toString();//发起交易的商户编号
  775. String ordNo=request.get("ordNo").toString();//商户生成的订单号
  776. String amt=request.get("amt").toString();//金额
  777. String buyerId=request.get("buyerId").toString();//用户登录
  778. String transactionId=request.get("transactionId").toString();
  779. String drType=request.get("drType").toString();//借贷记标识 1-借,2-贷,3-其他
  780. String payType=request.get("payType").toString();//对订单的描述,取值范围:WECHAT:微信,ALIPAY:支付宝,UNIONPAY:
  781. String payBank=request.get("payBank").toString();//付款银行银行编码,例如 ICBC
  782. String pointAmount=request.get("pointAmount").toString();//代金券金额
  783. String totalOffstAmt=request.get("totalOffstAmt").toString();//消 费 者 付 款金额
  784. String settleAmt=request.get("settleAmt").toString();//商家入账金额
  785. String timeStamp=request.get("timeStamp").toString();//响应时间
  786. String sign=request.get("sign").toString();//签名
  787. String bizCode=request.get("bizCode").toString();//业务返回码
  788. String bizMsg=request.get("bizMsg").toString();//业 务 返 回 信息
  789. String openid=request.get("openid").toString();//微 信 或 支 付宝身份id()opendid userid
  790. String channelId=request.get("channelId").toString();//渠道商户号
  791. String subMechId=request.get("subMechId").toString();//子商户号
  792. String finishTime=request.get("finishTime").toString();//交易完成时间
  793. String clearDt=request.get("clearDt").toString();
  794. String settlementBatchNo=request.get("settlementBatchNo").toString();
  795. //String origOrdNo=request.get("origOrdNo").toString();//反交易退款异步通知
  796. //String origUuid=request.get("origUuid").toString();//token
  797. //String scene=request.get("scene").toString();//用户登录
  798. //String buyerAccount=request.get("buyerAccount").toString();//
  799. //String realRefundAmount=request.get("realRefundAmount").toString();//商家出账金额
  800. //String recFeeAmt=request.get("recFeeAmt").toString();//交易手续费
  801. //String recFeeRate=request.get("recFeeRate").toString();//交易手续费率
  802. //String refBuyerAmt=request.get("refBuyerAmt").toString();//消 费 者 到 账金额
  803. //String extend = extend=request.get("extend").toString();//备用
  804. //将业务参数存放在 JSON 对象中
  805. JSONObject reqData = new JSONObject();
  806. //支付场景
  807. if(request.containsKey("scene") && request.get("scene") !=null){
  808. String scene = request.get("scene").toString();
  809. reqData.put("scene", scene);
  810. }
  811. //消 费 者 到 账金额
  812. if(request.containsKey("refBuyerAmt") && request.get("refBuyerAmt") !=null){
  813. String refBuyerAmt = request.get("refBuyerAmt").toString();
  814. reqData.put("refBuyerAmt", refBuyerAmt);
  815. }
  816. //buyerAccount 支付宝买家登录账号 掩码;示例:135***1234
  817. if(request.containsKey("buyerAccount") && request.get("buyerAccount") !=null){
  818. String buyerAccount = request.get("buyerAccount").toString();
  819. reqData.put("buyerAccount", buyerAccount);
  820. }
  821. //备用
  822. if(request.containsKey("extend") && request.get("extend") !=null){
  823. String extend = request.get("extend").toString();
  824. reqData.put("extend", extend);
  825. }
  826. //优惠券参数
  827. if(request.containsKey("promotionDetail") && request.get("promotionDetail") !=null){
  828. String promotionDetail = request.get("promotionDetail").toString();
  829. reqData.put("promotionDetail", promotionDetail);
  830. }
  831. //商家出账金额
  832. if(request.containsKey("realRefundAmount") && request.get("realRefundAmount") !=null){
  833. String realRefundAmount = request.get("realRefundAmount").toString();
  834. reqData.put("realRefundAmount", realRefundAmount);
  835. }
  836. //szltFlag
  837. if(request.containsKey("szltFlag") && request.get("szltFlag") !=null){
  838. String szltFlag = request.get("szltFlag").toString();
  839. reqData.put("szltFlag", szltFlag);
  840. }
  841. //recFeeAmt
  842. if(request.containsKey("recFeeAmt") && request.get("recFeeAmt") !=null){
  843. String recFeeAmt = request.get("recFeeAmt").toString();
  844. reqData.put("recFeeAmt", recFeeAmt);
  845. }
  846. //szltRecfeeAmt
  847. if(request.containsKey("szltRecfeeAmt") && request.get("szltRecfeeAmt") !=null){
  848. String szltRecfeeAmt = request.get("szltRecfeeAmt").toString();
  849. reqData.put("szltRecfeeAmt", szltRecfeeAmt);
  850. }
  851. reqData.put("sxfUuid",sxfUuid);
  852. reqData.put("payWay",payWay);
  853. reqData.put("payTime",payTime);
  854. reqData.put("uuid",uuid);
  855. reqData.put("mno",mno);
  856. reqData.put("ordNo",ordNo);
  857. reqData.put("amt",amt);
  858. reqData.put("buyerId",buyerId);
  859. reqData.put("transactionId",transactionId);
  860. reqData.put("drType",drType);
  861. reqData.put("payType",payType);
  862. reqData.put("payBank",payBank);
  863. reqData.put("pointAmount",pointAmount);
  864. reqData.put("totalOffstAmt",totalOffstAmt);
  865. reqData.put("settleAmt",settleAmt);
  866. reqData.put("timeStamp",timeStamp);
  867. reqData.put("bizCode",bizCode);
  868. reqData.put("bizMsg",bizMsg);
  869. reqData.put("openid",openid);
  870. reqData.put("channelId",channelId);
  871. reqData.put("subMechId",subMechId);
  872. reqData.put("finishTime",finishTime);
  873. reqData.put("clearDt",clearDt);
  874. reqData.put("settlementBatchNo",settlementBatchNo);
  875. //reqData.put("realRefundAmount",realRefundAmount);
  876. //reqData.put("recFeeAmt",recFeeAmt);
  877. //reqData.put("recFeeRate",recFeeRate);
  878. //reqData.put("buyerAccount",buyerAccount);
  879. //reqData.put("origOrdNo",origOrdNo);
  880. //reqData.put("origUuid",origUuid);
  881. //reqData.put("scene",scene);
  882. //reqData.put("refBuyerAmt",refBuyerAmt);
  883. //reqData.put("extend",extend);
  884. //根据回调信息,先进行验签,验签后修改状态
  885. logger.info("打印参数信息"+gson.toJson(reqData));
  886. //不要对reqData排序 所以用LinkedHashMap
  887. HashMap<String, Object> result = JSON.parseObject(gson.toJson(reqData), LinkedHashMap.class, Feature.OrderedField);
  888. //验签
  889. String resultStr = RSASignature.getOrderContent(result);
  890. JSONObject req = new JSONObject();
  891. System.out.println(resultStr);
  892. if (RSASignature.doCheck(resultStr, sign, SXFPaySign.sxfPublic)) {
  893. req.put("code","success");
  894. req.put("msg","成功");
  895. logger.info("验签成功");
  896. //验签成功,修改订单状态
  897. List<PayOrder> list = payOrderService.getPayOrderList(ordNo);
  898. //logger.info("根据订单号,查询订单"+gson.toJson(list));
  899. if (list != null && list.size() == 1) {
  900. String status = list.get(0).getStatus();
  901. //状态为未支付 0 修改状态为1已支付
  902. if (status.equals("0")) {
  903. PayOrder payOrder = new PayOrder();
  904. payOrder.setOrderNo(ordNo);
  905. payOrder.setStatus("1");
  906. if(payType.equals("WECHAT")){ //WECHAT:微信,ALIPAY:支付宝,UNIONPAY:
  907. payOrder.setPayType("wx");
  908. }else if(payType.equals("ALIPAY")){
  909. payOrder.setPayType("zfb");
  910. }
  911. payOrder.setWxAmt(Double.valueOf(amt));
  912. payOrder.setDzkAmt(Double.valueOf("0"));
  913. payOrder.setPayDate(new Timestamp(new Date().getTime())); //支付时间
  914. payOrder.setReceivedAmt(Double.valueOf(settleAmt)); //settleAmt商家入账金额
  915. //修改订单状态
  916. int count = payOrderService.getUpdatePayOrder(payOrder);
  917. if(count == 1){
  918. //将用户消费的信息插入顾客表: 以手机号 油品名称 油站id为条件插入且存入 加油升数、实收金额、油站名称 根据订单号查询用户手机号
  919. Map<String, Object> infoMap = payOrderService.getOrderInfoAndUserInfoByOrderNo(payOrder); //获取该订单手机号、加油升数、实收金额、油站名称
  920. logger.info("根据订单查询用户手机号等订单信息"+ infoMap.toString());
  921. //手机号必须有
  922. if(infoMap != null && infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null ){
  923. int integral =0;
  924. StationInfo stationInfo = new StationInfo();
  925. stationInfo.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  926. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  927. if(stationInfos.getIsLngFlagGroup() !=null && stationInfos.getIsLngFlagGroup().equals("1")){
  928. //等于1表示次要业务:LNG集团平台加气(可能会出现); 插入油站余额记录
  929. StationBalanceChange stationBalanceChange = new StationBalanceChange();
  930. stationBalanceChange.setStationId(stationInfos.getStationId());
  931. stationBalanceChange.setAmt(Double.valueOf(infoMap.get("sellAmt").toString()));
  932. stationBalanceChange.setCreateTime(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(infoMap.get("payDate").toString()));
  933. stationBalanceChange.setType("-");
  934. stationBalanceChange.setOrderNo(ordNo);
  935. //生成记录
  936. payOrderService.insertStationBalanceExchange(stationBalanceChange);
  937. StationInfo s = new StationInfo();
  938. BigDecimal subtract = new BigDecimal(String.valueOf(stationInfos.getBalance())).subtract(new BigDecimal(infoMap.get("sellAmt").toString()));
  939. s.setBalance(subtract.doubleValue());
  940. s.setStationId(stationInfos.getStationId());
  941. //更新油站余额
  942. stationService.updateStationBalance(s);
  943. logger.info("LNG加气平台支付更新余额完成!");
  944. }else {
  945. if(stationInfos.getCouponEnabledFlag() !=null && stationInfos.getCouponEnabledFlag().equals("1")){
  946. //discountCoupon
  947. if(infoMap.containsKey("discountCoupon") && infoMap.get("discountCoupon") !=null && infoMap.get("discountCoupon").toString() !=""){
  948. UserCoupon userCoupon = new UserCoupon();
  949. userCoupon.setCouponIsUsed("1");
  950. String discountCoupon = infoMap.get("discountCoupon").toString();
  951. userCoupon.setId(Integer.valueOf(discountCoupon));
  952. userCoupon.setCreateTime(new Date());
  953. userCoupon.setVerificationTime(new Date());
  954. userCoupon.setMobilePhone(infoMap.get("mobilePhone").toString());
  955. couponService.updateCouponUserInfo(userCoupon);
  956. //更新该优惠券的使用数量
  957. UserCoupon u = new UserCoupon();
  958. u.setId(Integer.valueOf(discountCoupon));
  959. UserCoupon userCouponInfo = couponService.selectUserCouponInfo(u);
  960. Coupon coupon_up = new Coupon();
  961. coupon_up.setCouponId(userCouponInfo.getCouponId());
  962. Integer couponUseNum = userCouponInfo.getCouponUseNum();
  963. couponUseNum = couponUseNum + 1;
  964. coupon_up.setCouponCumulativeNum(couponUseNum);
  965. couponService.updateCouponInfo(coupon_up);
  966. //主动领取优惠券
  967. this.drawCoupon(infoMap);
  968. }
  969. }
  970. //当前系统主要业务逻辑
  971. CustomerManage customerManage = this.insertCustomerManage(infoMap); //插入客户积分返回要插入客户的信息
  972. CalculateIntegral calculateIntegral = new CalculateIntegral();
  973. calculateIntegral.setOrderNo(ordNo);
  974. if(infoMap.containsKey("consumer") && infoMap.get("consumer") !=null){
  975. calculateIntegral.setNickName(infoMap.get("consumer").toString());
  976. }else {
  977. calculateIntegral.setNickName("");
  978. }
  979. calculateIntegral.setGroupId(Integer.valueOf(infoMap.get("groupId").toString())); //集团ID
  980. calculateIntegral.setCustomerGrade(customerManage.getGrade()); //客户等级
  981. calculateIntegral.setIntegralRuleFlag(stationInfos.getIntegralRuleFlagGroup()); //是否共享积分规则
  982. calculateIntegral.setOpenId(infoMap.get("minaOpenid").toString()); //客户小程序ID
  983. if(infoMap.containsKey("blogOpenid") && StringUtils.isNotBlank(infoMap.get("blogOpenid").toString())){
  984. calculateIntegral.setBlogOpenid(infoMap.get("blogOpenid").toString());
  985. }
  986. calculateIntegral.setStationId(Integer.valueOf(infoMap.get("stationId").toString())); //油站ID
  987. calculateIntegral.setStationName(infoMap.get("stationName").toString()); //油站名称
  988. calculateIntegral.setAmt(new BigDecimal(infoMap.get("amt").toString())); //实收金额
  989. calculateIntegral.setOilType(infoMap.get("oilType").toString()); //订单类型
  990. calculateIntegral.setOilName(infoMap.get("oilName").toString()); //油品名称
  991. calculateIntegral.setOilLiters(new BigDecimal(infoMap.get("orderLiters").toString())); //加油升数
  992. calculateIntegral.setUnionId(infoMap.get("unionId").toString()); //客户unionId
  993. calculateIntegral.setNickName(infoMap.get("consumer").toString()); //客户昵称
  994. calculateIntegral.setMobilePhone(infoMap.get("mobilePhone").toString()); //客户手机号
  995. calculateIntegral.setReceivableAmt(new BigDecimal(infoMap.get("receivableAmt").toString())); //应收金额
  996. CustomerPoints customerPoints;
  997. //计算积分
  998. CalculateIntegral calculateIntegralInfos;
  999. if(stationInfos.getIntegralRuleFlagGroup().equals("1")){ //表示积分共享
  1000. if(stationInfos.getIntegralFlagGroup().equals("1")){ //集团开启积分功能
  1001. //calculateIntegral.setGroupId(stationInfos.getGroupId());
  1002. calculateIntegralInfos = this.calculateIntegral(calculateIntegral);
  1003. //插入客户所得积分
  1004. customerPoints = this.insertUserIntegral(calculateIntegralInfos);
  1005. integral =calculateIntegralInfos.getIntegral();
  1006. //推送积分
  1007. this.pushIntegral(customerPoints, calculateIntegral);
  1008. }
  1009. }else {
  1010. if(stationInfos.getIntegralFlag().equals("1")){
  1011. //calculateIntegral.setStationId(stationInfos.getStationId());
  1012. calculateIntegralInfos = this.calculateIntegral(calculateIntegral);
  1013. //插入客户所得积分
  1014. customerPoints = this.insertUserIntegral(calculateIntegralInfos);
  1015. //推送积分
  1016. integral =calculateIntegralInfos.getIntegral();
  1017. this.pushIntegral(customerPoints, calculateIntegral);
  1018. }
  1019. }
  1020. }
  1021. //获取油枪绑定的POS机信息
  1022. StationDeviceManager stationDeviceManager = new StationDeviceManager();
  1023. stationDeviceManager.setGunNo(infoMap.get("oilGun").toString());
  1024. stationDeviceManager.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  1025. List<StationDeviceManager> stationDeviceManagerList = stationService.getStationDeviceManagerList(stationDeviceManager);
  1026. if(stationDeviceManagerList !=null && stationDeviceManagerList.size() >0){
  1027. if(stationDeviceManagerList.get(0).getDeviceType() !=null && stationDeviceManagerList.get(0).getDeviceType() !=""){
  1028. switch (stationDeviceManagerList.get(0).getDeviceType()){
  1029. case "1":
  1030. logger.info("小票机打印方式");
  1031. infoMap.put("sn", stationDeviceManagerList.get(0).getDeviceNo());
  1032. infoMap.put("printSetting", stationInfos.getPrintSetting());
  1033. infoMap.put("isLngFlagGroup", stationInfos.getIsLngFlagGroup());
  1034. this.printReceipt(infoMap);
  1035. break;
  1036. case "2":
  1037. logger.info("POS机打印方式");
  1038. payOrder.setIntegral(String.valueOf(integral));
  1039. payOrder.setPrintSetting(stationInfos.getPrintSetting());
  1040. payOrder.setIsLngFlagGroup(stationInfos.getIsLngFlagGroup());
  1041. if(stationInfos.getIsLngFlagGroup() !=null && stationInfos.getIsLngFlagGroup().equals("1")){
  1042. payOrder.setSellAmt(Double.valueOf(infoMap.get("sellAmt").toString()));
  1043. }
  1044. if(stationDeviceManagerList.get(0).getPosFanoutExchange() !=null && stationDeviceManagerList.get(0).getPosQueue() !=null){
  1045. logger.info("POS设备交换机信息:" + stationDeviceManagerList.get(0).getPosFanoutExchange());
  1046. payOrder.setPosFanoutExchange(stationDeviceManagerList.get(0).getPosFanoutExchange());
  1047. payOrder.setPosQueue(stationDeviceManagerList.get(0).getPosQueue());
  1048. payOrder.setDeviceNo(stationDeviceManagerList.get(0).getDeviceNo());
  1049. this.posPrintReceipt(payOrder);
  1050. }
  1051. break;
  1052. }
  1053. }
  1054. }
  1055. //logger.info("小票打印方式:" + stationInfo.getPrintDeviceType());
  1056. // if(stationInfos !=null && stationInfos.getPrintDeviceType() !=null){
  1057. // switch (stationInfos.getPrintDeviceType()){
  1058. // case "1": //小票机打印
  1059. // logger.info("小票机打印");
  1060. // Map map = new HashMap();
  1061. // map.put("stationId", infoMap.get("stationId").toString());
  1062. // map.put("oilGunNo", infoMap.get("oilGun").toString());
  1063. // map.put("deviceType", stationInfos.getPrintDeviceType());
  1064. // List<Map> listDevices = stationOilGunService.getPrinterSnByStationIdAndOilGunNoList(map);
  1065. // infoMap.put("sn", listDevices.get(0).get("printerSn").toString());
  1066. // infoMap.put("printSetting", stationInfos.getPrintSetting());
  1067. // this.printReceipt(infoMap);
  1068. // break;
  1069. // case "2": //POS机打印
  1070. // logger.info("POS机打印");
  1071. // payOrder.setIntegral(String.valueOf(integral));
  1072. // payOrder.setPrintSetting(stationInfos.getPrintSetting());
  1073. // this.posPrintReceipt(payOrder);
  1074. // break;
  1075. // }
  1076. // }
  1077. }else{
  1078. logger.info("该用户无手机号!");
  1079. }
  1080. }else {
  1081. logger.info("更新订单状态失败!");
  1082. }
  1083. }
  1084. }else {
  1085. logger.info("该订单不存在!");
  1086. }
  1087. }else {
  1088. logger.info("验签失败");
  1089. req.put("code","fail");
  1090. req.put("msg","失败");
  1091. }
  1092. logger.info("返回随行付参数信息:"+req.toString());
  1093. return req;
  1094. }
  1095. /***
  1096. * 小程序云闪付扫呗回调
  1097. * @param params
  1098. * @return
  1099. */
  1100. @RequestMapping(value = "/getYunPayCallback", consumes = "text/xml", method = RequestMethod.POST)
  1101. @ResponseBody
  1102. @Transactional
  1103. public net.sf.json.JSONObject getYunPayCallback(@RequestBody String params) throws ParseException {
  1104. logger.info("=============================云闪付(扫呗) 小程序支付完成 回调接口 ** 开始 ** ===============================================");
  1105. net.sf.json.JSONObject result = new net.sf.json.JSONObject(); //返回
  1106. YunPayCallBack yunPayCallBack = JSON.parseObject(params, YunPayCallBack.class);
  1107. logger.info("云闪付扫呗 小程序支付 回调接口返回参数:" + params);
  1108. //logger.info("云闪付扫呗调用回调接口状态码:" + yunPayCallBack.getResult_code());
  1109. if(yunPayCallBack.getResult_code() !=null && yunPayCallBack.getResult_code().equals("01")){
  1110. logger.info("-------------------------云闪付回调成功-------------------------- ");
  1111. //返给云闪付状态码
  1112. result.put("return_code", "01");
  1113. result.put("return_msg", "success");
  1114. //业务逻辑
  1115. String ordNo = yunPayCallBack.getTerminal_trace();
  1116. List<PayOrder> list = payOrderService.getPayOrderList(ordNo);
  1117. //logger.info("根据订单号,查询订单"+gson.toJson(list));
  1118. if (list != null && list.size() == 1) {
  1119. String status = list.get(0).getStatus();
  1120. if(status !=null && status.equals("0")){
  1121. PayOrder payOrder = new PayOrder();
  1122. payOrder.setOrderNo(ordNo);
  1123. payOrder.setStatus("1");
  1124. if(yunPayCallBack.getPay_type().equals("010")){ //WECHAT:微信,ALIPAY:支付宝,UNIONPAY:
  1125. payOrder.setPayType("wx");
  1126. }else if(yunPayCallBack.getPay_type().equals("020")){
  1127. payOrder.setPayType("zfb");
  1128. }
  1129. payOrder.setWxAmt(Double.valueOf(yunPayCallBack.getTotal_fee()));
  1130. payOrder.setDzkAmt(Double.valueOf("0"));
  1131. payOrder.setPayDate(new Timestamp(new Date().getTime())); //支付时间
  1132. payOrder.setReceivedAmt(Double.valueOf(yunPayCallBack.getTotal_fee())); //settleAmt商家入账金额
  1133. payOrder.setReceivedAmt((new BigDecimal(yunPayCallBack.getTotal_fee()).divide(new BigDecimal("100")).doubleValue())); //settleAmt商家入账金额
  1134. //修改订单状态
  1135. int count = payOrderService.getUpdatePayOrder(payOrder);
  1136. if(count == 1){
  1137. Map<String, Object> infoMap = payOrderService.getOrderInfoAndUserInfoByOrderNo(payOrder); //获取该订单手机号、加油升数、实收金额、油站名称
  1138. logger.info("根据订单查询用户手机号等订单信息"+ infoMap.toString());
  1139. //手机号必须有
  1140. if(infoMap != null && infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null ){
  1141. int integral =0;
  1142. StationInfo stationInfo = new StationInfo();
  1143. stationInfo.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  1144. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  1145. if(stationInfos.getIsLngFlagGroup() !=null && stationInfos.getIsLngFlagGroup().equals("1")){
  1146. //等于1表示次要业务:LNG集团平台加气(可能会出现); 插入油站余额记录
  1147. StationBalanceChange stationBalanceChange = new StationBalanceChange();
  1148. stationBalanceChange.setStationId(stationInfos.getStationId());
  1149. stationBalanceChange.setAmt(Double.valueOf(infoMap.get("sellAmt").toString()));
  1150. stationBalanceChange.setCreateTime(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(infoMap.get("payDate").toString()));
  1151. stationBalanceChange.setType("-");
  1152. stationBalanceChange.setOrderNo(ordNo);
  1153. //生成记录
  1154. payOrderService.insertStationBalanceExchange(stationBalanceChange);
  1155. StationInfo s = new StationInfo();
  1156. BigDecimal subtract = new BigDecimal(String.valueOf(stationInfos.getBalance())).subtract(new BigDecimal(infoMap.get("sellAmt").toString()));
  1157. s.setBalance(subtract.doubleValue());
  1158. s.setStationId(stationInfos.getStationId());
  1159. //更新油站余额
  1160. stationService.updateStationBalance(s);
  1161. logger.info("LNG加气平台支付更新余额完成!");
  1162. }else {
  1163. if(stationInfos.getCouponEnabledFlag() !=null && stationInfos.getCouponEnabledFlag().equals("1")){
  1164. //discountCoupon
  1165. if(infoMap.containsKey("discountCoupon") && infoMap.get("discountCoupon") !=null && infoMap.get("discountCoupon").toString() !=""){
  1166. UserCoupon userCoupon = new UserCoupon();
  1167. userCoupon.setCouponIsUsed("2");
  1168. String discountCoupon = infoMap.get("discountCoupon").toString();
  1169. userCoupon.setId(Integer.valueOf(discountCoupon));
  1170. userCoupon.setCreateTime(new Date());
  1171. userCoupon.setVerificationTime(new Date());
  1172. couponService.updateCouponUserInfo(userCoupon);
  1173. //更新该优惠券的使用数量
  1174. UserCoupon u = new UserCoupon();
  1175. u.setId(Integer.valueOf(discountCoupon));
  1176. UserCoupon userCouponInfo = couponService.selectUserCouponInfo(u);
  1177. Coupon coupon_up = new Coupon();
  1178. coupon_up.setCouponId(userCouponInfo.getCouponId());
  1179. Integer couponUseNum = userCouponInfo.getCouponUseNum();
  1180. couponUseNum = couponUseNum + 1;
  1181. coupon_up.setCouponCumulativeNum(couponUseNum);
  1182. couponService.updateCouponInfo(coupon_up);
  1183. //主动领取优惠券
  1184. this.drawCoupon(infoMap);
  1185. }
  1186. }
  1187. //当前系统主要业务逻辑
  1188. CustomerManage customerManage = this.insertCustomerManage(infoMap); //插入客户积分返回要插入客户的信息
  1189. CalculateIntegral calculateIntegral = new CalculateIntegral();
  1190. calculateIntegral.setOrderNo(ordNo);
  1191. if(infoMap.containsKey("consumer") && infoMap.get("consumer") !=null){
  1192. calculateIntegral.setNickName(infoMap.get("consumer").toString());
  1193. }else {
  1194. calculateIntegral.setNickName("");
  1195. }
  1196. calculateIntegral.setGroupId(Integer.valueOf(infoMap.get("groupId").toString())); //集团ID
  1197. calculateIntegral.setCustomerGrade(customerManage.getGrade()); //客户等级
  1198. calculateIntegral.setIntegralRuleFlag(stationInfos.getIntegralRuleFlagGroup()); //是否共享积分规则
  1199. calculateIntegral.setOpenId(infoMap.get("minaOpenid").toString()); //客户小程序ID
  1200. if(infoMap.containsKey("blogOpenid") && StringUtils.isNotBlank(infoMap.get("blogOpenid").toString())){
  1201. calculateIntegral.setBlogOpenid(infoMap.get("blogOpenid").toString());
  1202. }
  1203. calculateIntegral.setStationId(Integer.valueOf(infoMap.get("stationId").toString())); //油站ID
  1204. calculateIntegral.setStationName(infoMap.get("stationName").toString()); //油站名称
  1205. calculateIntegral.setAmt(new BigDecimal(infoMap.get("amt").toString())); //实收金额
  1206. calculateIntegral.setOilType(infoMap.get("oilType").toString()); //订单类型
  1207. calculateIntegral.setOilName(infoMap.get("oilName").toString()); //油品名称
  1208. calculateIntegral.setOilLiters(new BigDecimal(infoMap.get("orderLiters").toString())); //加油升数
  1209. calculateIntegral.setUnionId(infoMap.get("unionId").toString()); //客户unionId
  1210. calculateIntegral.setNickName(infoMap.get("consumer").toString()); //客户昵称
  1211. calculateIntegral.setMobilePhone(infoMap.get("mobilePhone").toString()); //客户手机号
  1212. calculateIntegral.setReceivableAmt(new BigDecimal(infoMap.get("receivableAmt").toString())); //应收金额
  1213. CustomerPoints customerPoints;
  1214. //计算积分
  1215. CalculateIntegral calculateIntegralInfos;
  1216. if(stationInfos.getIntegralRuleFlagGroup().equals("1")){ //表示积分共享
  1217. if(stationInfos.getIntegralFlagGroup().equals("1")){ //集团开启积分功能
  1218. //calculateIntegral.setGroupId(stationInfos.getGroupId());
  1219. calculateIntegralInfos = this.calculateIntegral(calculateIntegral);
  1220. //插入客户所得积分
  1221. customerPoints = this.insertUserIntegral(calculateIntegralInfos);
  1222. integral =calculateIntegralInfos.getIntegral();
  1223. //推送积分
  1224. this.pushIntegral(customerPoints, calculateIntegral);
  1225. }
  1226. }else {
  1227. if(stationInfos.getIntegralFlag().equals("1")){
  1228. //calculateIntegral.setStationId(stationInfos.getStationId());
  1229. calculateIntegralInfos = this.calculateIntegral(calculateIntegral);
  1230. //插入客户所得积分
  1231. customerPoints = this.insertUserIntegral(calculateIntegralInfos);
  1232. //推送积分
  1233. integral =calculateIntegralInfos.getIntegral();
  1234. this.pushIntegral(customerPoints, calculateIntegral);
  1235. }
  1236. }
  1237. }
  1238. //获取油枪绑定的POS机信息
  1239. StationDeviceManager stationDeviceManager = new StationDeviceManager();
  1240. stationDeviceManager.setGunNo(infoMap.get("oilGun").toString());
  1241. stationDeviceManager.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  1242. List<StationDeviceManager> stationDeviceManagerList = stationService.getStationDeviceManagerList(stationDeviceManager);
  1243. if(stationDeviceManagerList !=null && stationDeviceManagerList.size() >0){
  1244. if(stationDeviceManagerList.get(0).getDeviceType() !=null && stationDeviceManagerList.get(0).getDeviceType() !=""){
  1245. switch (stationDeviceManagerList.get(0).getDeviceType()){
  1246. case "1":
  1247. logger.info("小票机打印方式");
  1248. infoMap.put("sn", stationDeviceManagerList.get(0).getDeviceNo());
  1249. infoMap.put("printSetting", stationInfos.getPrintSetting());
  1250. infoMap.put("isLngFlagGroup", stationInfos.getIsLngFlagGroup());
  1251. this.printReceipt(infoMap);
  1252. break;
  1253. case "2":
  1254. logger.info("POS机打印方式");
  1255. payOrder.setIntegral(String.valueOf(integral));
  1256. payOrder.setPrintSetting(stationInfos.getPrintSetting());
  1257. payOrder.setIsLngFlagGroup(stationInfos.getIsLngFlagGroup());
  1258. if(stationInfos.getIsLngFlagGroup() !=null && stationInfos.getIsLngFlagGroup().equals("1")){
  1259. payOrder.setSellAmt(Double.valueOf(infoMap.get("sellAmt").toString()));
  1260. }
  1261. if(stationDeviceManagerList.get(0).getPosFanoutExchange() !=null && stationDeviceManagerList.get(0).getPosQueue() !=null){
  1262. logger.info("POS设备交换机信息:" + stationDeviceManagerList.get(0).getPosFanoutExchange());
  1263. payOrder.setPosFanoutExchange(stationDeviceManagerList.get(0).getPosFanoutExchange());
  1264. payOrder.setPosQueue(stationDeviceManagerList.get(0).getPosQueue());
  1265. payOrder.setDeviceNo(stationDeviceManagerList.get(0).getDeviceNo());
  1266. this.posPrintReceipt(payOrder);
  1267. }
  1268. break;
  1269. }
  1270. }
  1271. }
  1272. }
  1273. }
  1274. }
  1275. }
  1276. }else {
  1277. result.put("return_code", "02");
  1278. result.put("return_msg", "fail");
  1279. }
  1280. logger.info("返给云闪付结果信息:" + result);
  1281. logger.info(" =======================================云闪付(扫呗) 小程序支付完成 回调接口 ** 结束 ** ===============================================");
  1282. return result;
  1283. }
  1284. //主动领取
  1285. public void drawCoupon(Map infoMap){
  1286. //按照应付来主动发放
  1287. //查询该油站是否有主动发放
  1288. BigDecimal receivableAmt = new BigDecimal(infoMap.get("receivableAmt").toString());
  1289. Integer stationId = Integer.valueOf(infoMap.get("stationId").toString());
  1290. String unionId = infoMap.get("unionId").toString();
  1291. Coupon coupon = new Coupon();
  1292. coupon.setStationId(stationId);
  1293. coupon.setIssueType("1");
  1294. List<Coupon> couponList = couponService.selectStaGrantCouponList(coupon);;
  1295. if(couponList !=null && couponList.size()>0){
  1296. //获取该油站已主动发放的优惠券
  1297. for(Coupon c: couponList){
  1298. if(!(receivableAmt.compareTo(c.getDiscountThresholdAmt()) == -1)){
  1299. Integer couponHoldNum = c.getCouponHoldNum(); //持有张数
  1300. Integer couponReceiveNum = c.getCouponReceiveNum(); //最多领取张数
  1301. Integer couponNum = c.getCouponNum(); //改模板最大数量
  1302. String couponIssueId = c.getCouponIssueId(); //领取方式的ID
  1303. Integer couponId = c.getCouponId(); //优惠券模板ID
  1304. Integer couponCumulativeNum = c.getCouponCumulativeNum(); //当前优惠券已领取的数量
  1305. UserCoupon u = new UserCoupon();
  1306. u.setUnionId(unionId);
  1307. u.setStationId(stationId);
  1308. u.setCouponIsUsed("0");
  1309. int userCouponCount = couponService.selectUserCouponCount(u);
  1310. u.setCouponIsUsed("1");
  1311. int userCouponCountUsed = couponService.selectUserCouponCount(u);
  1312. if(couponNum >0){
  1313. if(userCouponCount < couponHoldNum){
  1314. if(userCouponCountUsed < couponReceiveNum){
  1315. UserCoupon userCouponParam = new UserCoupon();
  1316. userCouponParam.setCouponIsUsed("0"); //是否使用:0、未使用;1、已使用;
  1317. long currentTimeMillis = System.currentTimeMillis();
  1318. String s = stationId + Long.toString(currentTimeMillis) + Math.round((Math.random() + 1) * 1000);
  1319. String s1 = CryptUtil.useMD5(s);
  1320. userCouponParam.setCouponNo(s1); //优惠券编码
  1321. userCouponParam.setUnionId(unionId); //用户unionId
  1322. userCouponParam.setIssueId(couponIssueId); //领取方式ID
  1323. userCouponParam.setCouponId(c.getCouponId()); //优惠券模板ID
  1324. userCouponParam.setStationId(stationId); //油站ID
  1325. userCouponParam.setCouponIsEffective("1"); //优惠券是否有效
  1326. userCouponParam.setGetCouponTime(new Date()); //优惠券领取时间
  1327. String effectiveTimeType = c.getEffectiveTimeType();
  1328. //'有效时间类型: 1,固定时间;2,领取后x天内有效'
  1329. switch (effectiveTimeType) {
  1330. case "1":
  1331. userCouponParam.setCouponEffectiveTime(c.getEffectiveTimeEnd()); //优惠券有效期截止时间
  1332. break;
  1333. case "2":
  1334. Calendar calendar = Calendar.getInstance();
  1335. calendar.setTime(userCouponParam.getGetCouponTime());
  1336. calendar.add(Calendar.DATE, c.getEffectiveDayNum()); //领取后多少天有效
  1337. userCouponParam.setCouponEffectiveTime(calendar.getTime()); //优惠券有效期截止时间
  1338. break;
  1339. }
  1340. couponService.addUserCoupon(userCouponParam);
  1341. //更新该优惠券的领取数量
  1342. Coupon coupon_up = new Coupon();
  1343. coupon_up.setCouponId(couponId);
  1344. couponCumulativeNum = couponCumulativeNum + 1;
  1345. coupon_up.setCouponCumulativeNum(couponCumulativeNum);
  1346. couponService.updateCouponInfo(coupon_up);
  1347. }
  1348. }
  1349. }
  1350. }
  1351. }
  1352. }
  1353. }
  1354. //领取后优惠券推送告知用户
  1355. //插入客户信息
  1356. public CustomerManage insertCustomerManage(Map infoMap) throws ParseException {
  1357. CustomerManage customerManage = new CustomerManage(); //存放客户信息
  1358. customerManage.setGroupId(Integer.valueOf(infoMap.get("groupId").toString()));
  1359. customerManage.setUnionId(infoMap.get("unionId").toString());
  1360. customerManage.setMinaUserId(Integer.valueOf(infoMap.get("consumerId").toString()));
  1361. customerManage.setPhoneNumber(infoMap.get("mobilePhone").toString());
  1362. customerManage.setCustomerName(infoMap.get("consumer").toString());
  1363. customerManage.setRegtime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(infoMap.get("registeDate").toString()));
  1364. customerManage.setStationId(Integer.valueOf(infoMap.get("stationId").toString())); //油站ID
  1365. customerManage.setOilName(infoMap.get("oilName").toString()); //油品名称
  1366. CustomerManage c = new CustomerManage(); //存放客户信息
  1367. c.setUnionId(infoMap.get("unionId").toString());
  1368. c.setStationId(Integer.valueOf(infoMap.get("stationId").toString())); //油站ID
  1369. c.setOilName(infoMap.get("oilName").toString()); //油品名称
  1370. CustomerManage existCustomer = customerManagerService.getCustomerManageInfo(c); //已存在用户信息 existCustomer
  1371. //判断该用户是否已存在
  1372. if(existCustomer != null){ //存在该用户时更新
  1373. if(existCustomer.getAmt() !=null){
  1374. customerManage.setAmt(existCustomer.getAmt().add(BigDecimal.valueOf((Double) infoMap.get("amt"))));//存入金额 累加原来金额
  1375. }else {
  1376. customerManage.setAmt(BigDecimal.valueOf((Double) infoMap.get("amt")));
  1377. }
  1378. //此处用于更新没有会员ID的用户
  1379. if(!StringUtils.isNotBlank(existCustomer.getMemberId())){
  1380. String customerId=infoMap.get("groupId").toString()+infoMap.get("stationId").toString()+System.nanoTime();
  1381. customerManage.setMemberId(customerId);
  1382. }
  1383. if(infoMap.containsKey("orderType") && infoMap.get("orderType").equals("1")) {
  1384. if (existCustomer.getLiters() != null) {
  1385. customerManage.setLiters(existCustomer.getLiters().add(BigDecimal.valueOf((Double) infoMap.get("orderLiters"))));//存入升数 累加原来升数
  1386. } else {
  1387. customerManage.setLiters(BigDecimal.valueOf((Double) infoMap.get("orderLiters")));
  1388. }
  1389. }
  1390. logger.info("存在客户 更新时手机号参数: " + customerManage.getPhoneNumber());
  1391. //直降时存入等级名称和等级ID
  1392. List<Map> customerGradeInfo = customerGradeServices.getCustomerGradeListOrderByDesc(infoMap); //直降
  1393. logger.info("该站直降等级信息:"+ customerGradeInfo);
  1394. for (Map m: customerGradeInfo){
  1395. if(Double.valueOf(customerManage.getAmt().toString()) >= Double.valueOf(m.get("memberConditStart").toString())){
  1396. customerManage.setGrade(m.get("id").toString()); //存入等级ID
  1397. break;
  1398. }
  1399. }
  1400. logger.info("直降等级信息是否存入客户表:"+ "直降ID:"+ customerManage.getGrade());
  1401. customerManagerService.updateCustomerInfo(customerManage);
  1402. }else{ //该客户不存在时插入
  1403. //直降时存入等级名称和等级ID
  1404. List<Map> customerGradeInfo = customerGradeServices.getCustomerGradeList(infoMap); //直降
  1405. logger.info("该站直降等级信息:"+ customerGradeInfo);
  1406. if(customerGradeInfo !=null && customerGradeInfo.size() >0){
  1407. customerManage.setGrade(customerGradeInfo.get(0).get("id").toString()); //存入等级ID
  1408. }
  1409. logger.info("直降等级信息是否存入客户表:"+ "直降ID:"+ customerManage.getGrade());
  1410. customerManage.setAmt(BigDecimal.valueOf((Double) infoMap.get("amt"))); //存入金额
  1411. if(infoMap.containsKey("orderType") && infoMap.get("orderType").equals("1")){
  1412. customerManage.setLiters(BigDecimal.valueOf((Double) infoMap.get("orderLiters"))); //存入升数
  1413. }
  1414. logger.info("不存在客户 新增时参数: " + customerManage.toString());
  1415. String memberId=infoMap.get("groupId").toString()+infoMap.get("stationId").toString()+System.nanoTime(); //客户会员号
  1416. CustomerManage cm = new CustomerManage();
  1417. cm.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  1418. cm.setPhoneNumber(infoMap.get("mobilePhone").toString());
  1419. List<CustomerManage> customerManageInfoList = customerManagerService.getCustomerManageInfoList(cm);
  1420. if(customerManageInfoList !=null && customerManageInfoList.size()>0){
  1421. if(StringUtils.isNotBlank(customerManageInfoList.get(0).getMemberId())){
  1422. customerManage.setMemberId(customerManageInfoList.get(0).getMemberId());
  1423. }else {
  1424. customerManage.setMemberId(memberId);
  1425. }
  1426. }else {
  1427. customerManage.setMemberId(memberId);
  1428. }
  1429. customerManagerService.insertCustomerInfo(customerManage);
  1430. }
  1431. return customerManage;
  1432. }
  1433. //POS机打印小票
  1434. public void posPrintReceipt(PayOrder payOrder){
  1435. Map<String, Object> infoMap = payOrderService.getOrderInfoAndUserInfoByOrderNo(payOrder);
  1436. Map<String, Object> m = new HashMap<>();
  1437. if(payOrder.getTransactionId() !=null){
  1438. m.put("transactionId", payOrder.getTransactionId());
  1439. }
  1440. if(payOrder.getIntegral() !=null){
  1441. m.put("integral", payOrder.getIntegral());
  1442. }
  1443. if(infoMap !=null && infoMap.containsKey("oilPersonnel") && infoMap.get("oilPersonnel") !=null){
  1444. m.put("oilPersonnel", infoMap.get("oilPersonnel").toString());
  1445. }
  1446. if(infoMap !=null && infoMap.containsKey("orderNo") && infoMap.get("orderNo") !=null){
  1447. m.put("orderNo", infoMap.get("orderNo").toString());
  1448. }
  1449. //if(infoMap !=null && infoMap.containsKey("amt") && infoMap.get("amt") !=null){
  1450. if(payOrder.getIsLngFlagGroup() !=null && payOrder.getIsLngFlagGroup().equals("1")){
  1451. m.put("amt", infoMap.get("sellAmt").toString());
  1452. m.put("discountAmt", infoMap.get("sellDiscountAmt").toString());
  1453. }else {
  1454. m.put("amt", infoMap.get("amt").toString());
  1455. m.put("discountAmt", infoMap.get("discountAmt").toString());
  1456. }
  1457. //}
  1458. if(infoMap !=null && infoMap.containsKey("receivableAmt") && infoMap.get("receivableAmt") !=null){
  1459. m.put("receivableAmt", infoMap.get("receivableAmt").toString());
  1460. }
  1461. // if(infoMap !=null && infoMap.containsKey("discountAmt") && infoMap.get("discountAmt") !=null){
  1462. // m.put("discountAmt", infoMap.get("discountAmt").toString());
  1463. // }
  1464. if(infoMap !=null && infoMap.containsKey("oilName") && infoMap.get("oilName") !=null){
  1465. m.put("oilName", infoMap.get("oilName").toString());
  1466. }
  1467. if(infoMap !=null && infoMap.containsKey("oilGun") && infoMap.get("oilGun") !=null){
  1468. m.put("oilGun", infoMap.get("oilGun").toString());
  1469. }
  1470. if(infoMap !=null && infoMap.containsKey("createdDate") && infoMap.get("createdDate") !=null){
  1471. //格式化日期
  1472. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1473. String createdDate = sdf.format(infoMap.get("createdDate"));
  1474. m.put("createdDate", createdDate);
  1475. }
  1476. if(infoMap !=null && infoMap.containsKey("payDate") && infoMap.get("payDate") !=null){
  1477. //格式化日期
  1478. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1479. String payDate = sdf.format(infoMap.get("payDate"));
  1480. m.put("payDate", payDate);
  1481. }
  1482. if(infoMap !=null && infoMap.containsKey("payType") && infoMap.get("payType") !=null){
  1483. String payType = "";
  1484. if(infoMap.get("payType").equals("wx")){
  1485. payType ="微信";
  1486. }
  1487. if(infoMap.get("payType").equals("dzk")){
  1488. payType ="电子卡";
  1489. }
  1490. m.put("payType", payType);
  1491. }
  1492. if(infoMap !=null && infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null){
  1493. String phone =infoMap.get("mobilePhone")+"";
  1494. //手机号中间四位****代替
  1495. phone = phone.substring(0, 3) + "****" + phone.substring(7, phone.length());
  1496. m.put("mobilePhone", phone);
  1497. }
  1498. if(infoMap !=null && infoMap.containsKey("orderLiters") && infoMap.get("orderLiters") !=null){
  1499. m.put("orderLiters", infoMap.get("orderLiters").toString());
  1500. }
  1501. if(infoMap !=null && infoMap.containsKey("stationName") && infoMap.get("stationName") !=null){
  1502. m.put("stationName", infoMap.get("stationName").toString());
  1503. }
  1504. if(infoMap !=null && infoMap.containsKey("oilPirce") && infoMap.get("oilPirce") !=null){
  1505. m.put("oilPirce", infoMap.get("oilPirce").toString());
  1506. }
  1507. if(infoMap !=null && infoMap.containsKey("stationId") && infoMap.get("stationId") !=null){
  1508. m.put("stationId", infoMap.get("stationId").toString());
  1509. }
  1510. // if(infoMap !=null && infoMap.containsKey("orderType") && infoMap.get("orderType") !=null){
  1511. // m.put("orderType", infoMap.get("orderType").toString());
  1512. // }
  1513. if(infoMap !=null && infoMap.containsKey("oilType") && infoMap.get("oilType") !=null){
  1514. if(infoMap.get("oilType").equals("3")){
  1515. m.put("orderType", "noOil");
  1516. }else {
  1517. m.put("orderType", "oil");
  1518. }
  1519. }
  1520. logger.info("要推送的订单的信息:" +m.toString());
  1521. //定义推送格式
  1522. Map<String, Object> params = new HashMap<>();
  1523. params.put("messageTitle", "pos");
  1524. params.put("messageType", "sys");
  1525. //获取油枪绑定的POS机信息
  1526. // StationDeviceManager stationDeviceManager = new StationDeviceManager();
  1527. // stationDeviceManager.setDeviceType("2");
  1528. // stationDeviceManager.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  1529. // stationDeviceManager.setGunNo(infoMap.get("oilGun").toString());
  1530. // StationDeviceManager stationDeviceManagerInfo = stationService.getStationDeviceManager(stationDeviceManager);
  1531. // if(stationDeviceManagerInfo !=null && stationDeviceManagerInfo.getPosFanoutExchange() !=null && stationDeviceManagerInfo.getPosQueue() !=null){
  1532. params.put("posFanoutExchange", payOrder.getPosFanoutExchange());
  1533. params.put("posQueue", payOrder.getPosQueue());
  1534. params.put("tusn", payOrder.getDeviceNo());
  1535. params.put("printSetting", payOrder.getPrintSetting()); //小票打印方式
  1536. List<Map<String, Object>> list = new ArrayList<>();
  1537. list.add(m);
  1538. Map<String, Object> map = new HashMap<>();
  1539. map.put("contentData", list);
  1540. params.put("messageContent", map);
  1541. logger.info("开始推送消息:" +JSONObject.toJSONString(params));
  1542. String resultString = PosPrinterUtil.sendPosPrintDirectMessage(params);
  1543. JSONObject jsonObject = JSONObject.parseObject(resultString);
  1544. if(jsonObject.containsKey("code") && jsonObject.get("code").toString().equals("200")){
  1545. //如果打印成功 添加小票数量
  1546. PayOrder p = new PayOrder();
  1547. p.setPrintCount(1);
  1548. p.setOrderNo(infoMap.get("orderNo").toString());
  1549. payOrderService.getUpdatePayOrder(p);
  1550. }
  1551. //}
  1552. }
  1553. //打印机打印小票
  1554. public void printReceipt(Map infoMap) {
  1555. //打印机打印小票
  1556. String content1;
  1557. String content2;
  1558. String orderNoP = "";
  1559. String createdDateP ="";
  1560. String payDateP ="";
  1561. String oilGunP= "";
  1562. String receiptNameP="";
  1563. String stationNameP ="";
  1564. String oilNameP ="";
  1565. String orderLitersP ="";
  1566. String oilPirceP ="";
  1567. String receivableAmtP = "";
  1568. String discountAmtP = "";
  1569. String amtP = "";
  1570. String mobilePhoneP = "";
  1571. String payWayP = "";
  1572. String oilPersonnelP = "";
  1573. String sn; //打印机编号
  1574. if(StringUtils.isNotBlank(infoMap.get("oilPersonnel").toString())){
  1575. oilPersonnelP =infoMap.get("oilPersonnel").toString();
  1576. }
  1577. if(StringUtils.isNotBlank(infoMap.get("orderNo").toString())){
  1578. orderNoP =infoMap.get("orderNo").toString();
  1579. }
  1580. if(infoMap.containsKey("createdDate") && infoMap.get("createdDate") !=null ){
  1581. //格式化日期
  1582. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1583. createdDateP =sdf.format(infoMap.get("createdDate"));
  1584. }
  1585. if(infoMap.containsKey("payDate") && infoMap.get("payDate") !=null ){
  1586. //格式化日期
  1587. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1588. payDateP =sdf.format(infoMap.get("payDate"));
  1589. }
  1590. if(infoMap.containsKey("oilGun") && infoMap.get("oilGun") !=null ){
  1591. oilGunP =infoMap.get("oilGun").toString();
  1592. }
  1593. if(infoMap.containsKey("stationName") && infoMap.get("stationName") !=null ){
  1594. stationNameP =infoMap.get("stationName").toString();
  1595. }
  1596. if(infoMap.containsKey("oilName") && infoMap.get("oilName") !=null ){
  1597. oilNameP =infoMap.get("oilName").toString();
  1598. }
  1599. if(infoMap.containsKey("oilType") && !infoMap.get("oilType").equals("3")) {
  1600. //加油升数
  1601. if (infoMap.containsKey("orderLiters") && infoMap.get("orderLiters") != null) {
  1602. orderLitersP = infoMap.get("orderLiters") + "";
  1603. }
  1604. //油价
  1605. if (infoMap.containsKey("oilPirce") && infoMap.get("oilPirce") != null) {
  1606. oilPirceP = infoMap.get("oilPirce") + "";
  1607. }
  1608. if(infoMap.containsKey("isLngFlagGroup") && infoMap.get("isLngFlagGroup") !=null && infoMap.get("isLngFlagGroup").toString().equals("1")){
  1609. discountAmtP =infoMap.get("sellDiscountAmt")+"";
  1610. }else {
  1611. discountAmtP =infoMap.get("discountAmt")+"";
  1612. }
  1613. receiptNameP = "油品订单";
  1614. }else {
  1615. orderLitersP ="0.00";
  1616. oilPirceP = "0.00";
  1617. discountAmtP ="0.00";
  1618. receivableAmtP=infoMap.get("amt")+"";
  1619. receiptNameP = "非油品订单";
  1620. }
  1621. if(infoMap.containsKey("receivableAmt") && infoMap.get("receivableAmt") !=null ){
  1622. receivableAmtP =infoMap.get("receivableAmt")+"";
  1623. }
  1624. if(infoMap.containsKey("isLngFlagGroup") && infoMap.get("isLngFlagGroup") !=null && infoMap.get("isLngFlagGroup").toString().equals("1")){
  1625. amtP =infoMap.get("sellAmt")+"";
  1626. }else {
  1627. amtP =infoMap.get("amt")+"";
  1628. }
  1629. if(infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null ){
  1630. String phone =infoMap.get("mobilePhone")+"";
  1631. //手机号中间四位****代替
  1632. mobilePhoneP = phone.substring(0, 3) + "****" + phone.substring(7, phone.length());
  1633. }
  1634. if(infoMap.containsKey("payType") && infoMap.get("payType") !=null ){
  1635. if(infoMap.get("payType").equals("wx")){
  1636. payWayP ="微信";
  1637. }else {
  1638. payWayP ="电子卡";
  1639. }
  1640. }
  1641. content1 = "<CB>"+receiptNameP+"--顾客联</CB><BR>";
  1642. content1 += "<BR>";
  1643. content1 += "--------------------------------<BR>";
  1644. content1 += "<BR>";
  1645. content1 += "<BOLD><B>原价: "+receivableAmtP+" 元</B></BOLD><BR>";
  1646. content1 += "订单号:"+orderNoP+" <BR>";
  1647. content1 += "支付方式: "+payWayP+" <BR>";
  1648. content1 += "下单时间:"+createdDateP+" <BR>";
  1649. content1 += "付款时间:"+payDateP+" <BR>";
  1650. content1 += "油站:"+stationNameP+" <BR>";
  1651. content1 += "油枪:"+oilGunP+"号枪<BR>";
  1652. content1 += "加油员:"+oilPersonnelP+"<BR>";
  1653. if(infoMap.containsKey("oilType") && !infoMap.get("oilType").toString().equals("3")){
  1654. content1 += "油品: "+oilNameP+" <BR>";
  1655. content1 += "油量: "+orderLitersP+" 升<BR>";
  1656. content1 += "单价: "+oilPirceP+" L/元<BR>";
  1657. }
  1658. if(infoMap.containsKey("oilType") && !infoMap.get("oilType").toString().equals("3")){
  1659. content1 += "优惠: "+discountAmtP+" 元<BR>";
  1660. }
  1661. content1 += "支付: "+amtP+" 元<BR>";
  1662. content1 += "手机号: "+mobilePhoneP+" <BR>";
  1663. content1 += "加油员:"+oilPersonnelP+"<BR>";
  1664. content1 += "<BR>";
  1665. //content1 += "--------------------------------<BR>";
  1666. //content1 += "<BR>";
  1667. content2 = "<CB>"+receiptNameP+"--商户联</CB><BR>";
  1668. content2 += "<BR>";
  1669. content2 += "--------------------------------<BR>";
  1670. content2 += "<BR>";
  1671. content2 += "<BOLD><B>原价: "+receivableAmtP+" 元</B></BOLD><BR>";
  1672. content2 += "订单号:"+orderNoP+" <BR>";
  1673. content2 += "支付方式: "+payWayP+" <BR>";
  1674. content2 += "下单时间:"+createdDateP+" <BR>";
  1675. content2 += "付款时间:"+payDateP+" <BR>";
  1676. content2 += "油站:"+stationNameP+" <BR>";
  1677. content2 += "油枪:"+oilGunP+"号枪<BR>";
  1678. if(infoMap.containsKey("oilType") && !infoMap.get("oilType").toString().equals("3")){
  1679. content2 += "油品: "+oilNameP+" <BR>";
  1680. content2 += "油量: "+orderLitersP+" 升<BR>";
  1681. content2 += "单价: "+oilPirceP+" L/元<BR>";
  1682. }
  1683. if(infoMap.containsKey("oilType") && !infoMap.get("oilType").toString().equals("3")){
  1684. content2 += "优惠: "+discountAmtP+" 元<BR>";
  1685. }
  1686. content2 += "支付: "+amtP+" 元<BR>";
  1687. content2 += "手机号: "+mobilePhoneP+" <BR>";
  1688. content2 += "加油员:"+oilPersonnelP+"<BR>";
  1689. content2 += "<BR>";
  1690. //获取打印机编号
  1691. //sn = "921611605"; //测试打印机 sn:921611605 key:72338zma
  1692. sn = infoMap.get("sn").toString();
  1693. //开始打印
  1694. String printInfo=""; //打印信息
  1695. if(infoMap.containsKey("printSetting") && infoMap.get("printSetting").toString()!= null && infoMap.get("printSetting").toString()!=""){
  1696. switch (infoMap.get("printSetting").toString()){
  1697. case "1": //1 客户联
  1698. printInfo = FeiEPrinterUtil.printReceipt(sn, content1);
  1699. break;
  1700. case "2": //2 商户联
  1701. printInfo = FeiEPrinterUtil.printReceipt(sn, content2);
  1702. break;
  1703. case "3": //3商户联和客户联
  1704. printInfo = FeiEPrinterUtil.printReceipt(sn, content1 + content2);
  1705. break;
  1706. }
  1707. }
  1708. JSONObject jsonObject = JSONObject.parseObject(printInfo);
  1709. if(jsonObject != null && jsonObject.getString("msg").equals("ok")){
  1710. logger.info("打印成功:" + jsonObject.toString());
  1711. //如果打印成功 添加小票数量
  1712. PayOrder p = new PayOrder();
  1713. p.setPrintCount(1);
  1714. p.setOrderNo(infoMap.get("orderNo").toString());
  1715. payOrderService.getUpdatePayOrder(p);
  1716. }
  1717. }
  1718. //计算积分
  1719. public CalculateIntegral calculateIntegral(CalculateIntegral calculateIntegral){
  1720. int integral =0;
  1721. IntegralRule integralRule = new IntegralRule();
  1722. integralRule.setStationId(calculateIntegral.getStationId());
  1723. //获取油站的积分规则是否共享
  1724. String integralRuleFlag = calculateIntegral.getIntegralRuleFlag();
  1725. if(StringUtils.isNotBlank(integralRuleFlag) && integralRuleFlag.equals("1")){
  1726. //如果共享则先根据集团ID查询集团规则
  1727. integralRule.setStationId(calculateIntegral.getGroupId());
  1728. }
  1729. integralRule.setOilName(calculateIntegral.getOilName());
  1730. //获取该油站的积分规则
  1731. List<IntegralRule> integralRuleList = integralRuleService.getIntegralRule(integralRule);
  1732. if(integralRuleList !=null && integralRuleList.size() >0){
  1733. logger.info("该油站积分规则信息:" + integralRuleList.toString());
  1734. Date emptyDate = integralRuleList.get(0).getEmptyDate();
  1735. //积分规则有效时间 为null时 表示永久有效
  1736. if(emptyDate ==null || emptyDate.compareTo(new Date()) == 1 || emptyDate.compareTo(new Date()) == 0){
  1737. List<IntegralRuleDetail> integralRuleDetailList = integralRuleList.get(0).getIntegralRuleDetailList();
  1738. String currentTime = null; //当前时间
  1739. String datePickerTime=null; //活动时间
  1740. String[] datePickerTimeArray ={};
  1741. String integralActivity = integralRuleList.get(0).getIntegralActivity();
  1742. String integralProportion =null;
  1743. if(integralActivity !=null && integralActivity.equals("1")){
  1744. datePickerTime = integralRuleList.get(0).getDatePickerTime();
  1745. integralProportion = integralRuleList.get(0).getIntegralProportion();
  1746. if(datePickerTime.contains(",")){
  1747. datePickerTimeArray = datePickerTime.split(",");
  1748. }else {
  1749. datePickerTimeArray= new String[1];
  1750. datePickerTimeArray[0] = datePickerTime;
  1751. }
  1752. }
  1753. if(integralRuleDetailList !=null && integralRuleDetailList.size() >0){
  1754. Calendar calendar = Calendar.getInstance();
  1755. calendar.setTime(new Date()); //获取当前时间
  1756. for (IntegralRuleDetail integralRuleDetail : integralRuleDetailList){
  1757. if(!StringUtils.isNotBlank(integralRuleDetail.getRuleType()) && !StringUtils.isNotBlank(integralRuleDetail.getGread())){
  1758. //等级和规则类型null为时表示非油品, 没有按照实收,应收,加油升数
  1759. if (calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==1 || calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==0){
  1760. BigDecimal divide = null;
  1761. BigDecimal multiply = null;
  1762. divide = calculateIntegral.getReceivableAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1763. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1764. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1765. String datePicker = integralRuleList.get(0).getDatePicker(); //获取日期类型
  1766. switch (datePicker){
  1767. case "1": // 1.按周来
  1768. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1769. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1770. currentTime = String.valueOf(day_Week);
  1771. break;
  1772. case "2": // 2.每月的 多少号
  1773. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1774. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1775. currentTime = String.valueOf(day_month); //当前时间
  1776. break;
  1777. case "3": // 3.固定日期
  1778. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1779. break;
  1780. }
  1781. for (String s : datePickerTimeArray){
  1782. if(s.equals(currentTime)){
  1783. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1784. break;
  1785. }
  1786. }
  1787. }
  1788. integral = multiply.intValue();
  1789. logger.info("本次客户所得积分:" + integral);
  1790. break;
  1791. }
  1792. }else if (StringUtils.isNotBlank(integralRuleDetail.getGread()) && integralRuleDetail.getRuleType().equals("1")){ //按照实收金额
  1793. if(calculateIntegral.getAmt().compareTo(integralRuleDetail.getRuleTerms()) == 1 || calculateIntegral.getAmt().compareTo(integralRuleDetail.getRuleTerms()) == 0){
  1794. BigDecimal divide = null;
  1795. BigDecimal multiply = null;
  1796. if(integralRuleDetail.getGread().equals("0")){ //等级为0时,表示所有人
  1797. divide = calculateIntegral.getAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1798. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1799. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1800. String datePicker = integralRuleList.get(0).getDatePicker();
  1801. switch (datePicker){
  1802. case "1": // 1.按周来
  1803. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1804. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1805. currentTime = String.valueOf(day_Week);
  1806. break;
  1807. case "2": // 2.每月的多少号
  1808. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1809. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1810. currentTime = String.valueOf(day_month); //当前时间
  1811. break;
  1812. case "3": // 3.固定日期
  1813. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  1814. break;
  1815. }
  1816. for (String s : datePickerTimeArray){
  1817. if(s.equals(currentTime)){
  1818. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1819. break;
  1820. }
  1821. }
  1822. }
  1823. integral =multiply.intValue();
  1824. logger.info("本次客户所得积分:" + integral);
  1825. break;
  1826. }else if(integralRuleDetail.getGread().equals(calculateIntegral.getCustomerGrade())){ //如果等级相同
  1827. divide = calculateIntegral.getAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1828. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1829. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1830. String datePicker = integralRuleList.get(0).getDatePicker();
  1831. switch (datePicker){
  1832. case "1": // 1.按周来
  1833. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1834. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1835. currentTime = String.valueOf(day_Week);
  1836. break;
  1837. case "2": // 2.每月的多少号
  1838. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1839. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1840. currentTime = String.valueOf(day_month); //当前时间
  1841. break;
  1842. case "3": // 3.固定日期
  1843. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  1844. break;
  1845. }
  1846. for (String s : datePickerTimeArray){
  1847. if(s.equals(currentTime)){
  1848. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1849. break;
  1850. }
  1851. }
  1852. }
  1853. integral =multiply.intValue();
  1854. logger.info("本次客户所得积分:" + integral);
  1855. break;
  1856. }
  1857. }
  1858. }else if(StringUtils.isNotBlank(integralRuleDetail.getGread()) && integralRuleDetail.getRuleType().equals("2")){ //按应收金额
  1859. if(calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==1 || calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==0){
  1860. BigDecimal divide = null;
  1861. BigDecimal multiply = null;
  1862. if(integralRuleDetail.getGread().equals("0")){
  1863. divide = calculateIntegral.getReceivableAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1864. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1865. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1866. String datePicker = integralRuleList.get(0).getDatePicker();
  1867. switch (datePicker){
  1868. case "1": // 1.按周来
  1869. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1870. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1871. currentTime = String.valueOf(day_Week);
  1872. break;
  1873. case "2": // 2.每月的 多少号
  1874. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1875. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1876. currentTime = String.valueOf(day_month); //当前时间
  1877. break;
  1878. case "3": // 3.固定日期
  1879. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1880. break;
  1881. }
  1882. for (String s : datePickerTimeArray){
  1883. if(s.equals(currentTime)){
  1884. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1885. break;
  1886. }
  1887. }
  1888. }
  1889. integral = multiply.intValue();
  1890. logger.info("本次客户所得积分:" + integral);
  1891. break;
  1892. }else if(integralRuleDetail.getGread().equals(calculateIntegral.getCustomerGrade())){
  1893. divide = calculateIntegral.getReceivableAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1894. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1895. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1896. String datePicker = integralRuleList.get(0).getDatePicker();
  1897. switch (datePicker){
  1898. case "1": // 1.按周来
  1899. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1900. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1901. currentTime = String.valueOf(day_Week);
  1902. break;
  1903. case "2": // 2.每月的 多少号
  1904. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1905. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1906. currentTime = String.valueOf(day_month); //当前时间
  1907. break;
  1908. case "3": // 3.固定日期
  1909. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1910. break;
  1911. }
  1912. for (String s : datePickerTimeArray){
  1913. if(s.equals(currentTime)){
  1914. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1915. break;
  1916. }
  1917. }
  1918. }
  1919. integral = multiply.intValue();
  1920. logger.info("本次客户所得积分:" + integral);
  1921. break;
  1922. }
  1923. }
  1924. }else if(integralRuleDetail.getRuleType().equals("3")){ //按照加油升数
  1925. if(calculateIntegral.getOilLiters().compareTo(integralRuleDetail.getRuleTerms()) ==1 || calculateIntegral.getOilLiters().compareTo(integralRuleDetail.getRuleTerms()) ==0){
  1926. BigDecimal divide = null;
  1927. BigDecimal multiply = null;
  1928. if(integralRuleDetail.getGread().equals("0")){
  1929. divide = calculateIntegral.getOilLiters().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1930. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1931. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1932. String datePicker = integralRuleList.get(0).getDatePicker();
  1933. switch (datePicker){
  1934. case "1": // 1.按周来
  1935. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1936. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1937. currentTime = String.valueOf(day_Week);
  1938. break;
  1939. case "2": // 2.每月的 多少号
  1940. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1941. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1942. currentTime = String.valueOf(day_month); //当前时间
  1943. break;
  1944. case "3": // 3.固定日期
  1945. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1946. break;
  1947. }
  1948. for (String s : datePickerTimeArray){
  1949. if(s.equals(currentTime)){
  1950. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1951. break;
  1952. }
  1953. }
  1954. }
  1955. integral =multiply.intValue();
  1956. logger.info("本次客户所得积分:" + integral);
  1957. break;
  1958. }else if(integralRuleDetail.getGread().equals(calculateIntegral.getCustomerGrade())){
  1959. divide = calculateIntegral.getOilLiters().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1960. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1961. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1962. String datePicker = integralRuleList.get(0).getDatePicker();
  1963. switch (datePicker){
  1964. case "1": // 1.按周来
  1965. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1966. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1967. currentTime = String.valueOf(day_Week);
  1968. break;
  1969. case "2": // 2.每月的 多少号
  1970. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1971. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1972. currentTime = String.valueOf(day_month); //当前时间
  1973. break;
  1974. case "3": // 3.固定日期
  1975. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1976. break;
  1977. }
  1978. for (String s : datePickerTimeArray){
  1979. if(s.equals(currentTime)){
  1980. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1981. break;
  1982. }
  1983. }
  1984. }
  1985. integral =multiply.intValue();
  1986. logger.info("本次客户所得积分:" + integral);
  1987. break;
  1988. }
  1989. }
  1990. }
  1991. }
  1992. }
  1993. }
  1994. calculateIntegral.setIntegral(integral);
  1995. }
  1996. return calculateIntegral;
  1997. }
  1998. //插入用户积分信息或者更新用户积分信息
  1999. public CustomerPoints insertUserIntegral(CalculateIntegral calculateIntegral){
  2000. CustomerPoints customerPoints = new CustomerPoints();
  2001. customerPoints.setRecentlyPoints(calculateIntegral.getIntegral()); //用户当前所获得的积分
  2002. customerPoints.setStationId(calculateIntegral.getStationId()); //油站ID
  2003. if(StringUtils.isNotBlank(calculateIntegral.getIntegralRuleFlag()) && calculateIntegral.getIntegralRuleFlag().equals("1")){
  2004. customerPoints.setStationId(calculateIntegral.getGroupId());
  2005. }
  2006. customerPoints.setMinaOpenId(calculateIntegral.getOpenId()); //用户小程序ID
  2007. customerPoints.setCustomerName(calculateIntegral.getNickName());
  2008. if(calculateIntegral.getBlogOpenid() !=null){
  2009. customerPoints.setBlogOpenId(calculateIntegral.getBlogOpenid());
  2010. }
  2011. customerPoints.setUnionId(calculateIntegral.getUnionId()); //用户unionId
  2012. //获取客户积分信息
  2013. CustomerPoints customerPointsInfo = customerPointsService.getCustomerPointsInfoByUnionId(customerPoints);
  2014. if(customerPointsInfo !=null){
  2015. logger.info("当前存在客户:"+ customerPointsInfo.getMinaOpenId());
  2016. logger.info("当前客户原有剩余积分:"+ customerPointsInfo.getPoints().toString());
  2017. CustomerPointsRecord customerPointsRecord = new CustomerPointsRecord();
  2018. customerPointsRecord.setCreateTime(new Date());
  2019. customerPointsRecord.setCustomerName(calculateIntegral.getNickName());
  2020. customerPointsRecord.setStationName(calculateIntegral.getStationName());
  2021. customerPointsRecord.setStationId(calculateIntegral.getStationId());
  2022. customerPointsRecord.setRecordType("+");
  2023. customerPointsRecord.setUnionId(customerPointsInfo.getUnionId());
  2024. customerPointsRecord.setIntegral(calculateIntegral.getIntegral());
  2025. customerPointsRecord.setOrderNo(calculateIntegral.getOrderNo());
  2026. //插入客户记录表
  2027. customerPointsRecordService.insertCustomerPointsRecordInfo(customerPointsRecord);
  2028. //如果已存在客户则 客户余额积分= 当前客户已有积分 + 本次所得积分
  2029. BigDecimal surplusIntegral =new BigDecimal(customerPointsInfo.getPoints()).add(new BigDecimal(calculateIntegral.getIntegral()));
  2030. customerPoints.setPoints(surplusIntegral.intValue());
  2031. logger.info("本次加油后客户应有总积分:"+ customerPoints.getPoints().toString());
  2032. //用户已累积积分
  2033. BigDecimal add = new BigDecimal(customerPointsInfo.getAccumulatePoints()).add(new BigDecimal(calculateIntegral.getIntegral()));
  2034. customerPoints.setAccumulatePoints(add.intValue());
  2035. customerPoints.setRecentConsumptionDate(new Date());
  2036. //更新客户积分
  2037. customerPointsService.updateCustomerPointsInfo(customerPoints);
  2038. logger.info("更新客户积分信息成功!");
  2039. }else {
  2040. logger.info("当前系统不存在该客户积分信息");
  2041. CustomerPointsRecord customerPointsRecord = new CustomerPointsRecord();
  2042. customerPointsRecord.setCreateTime(new Date());
  2043. customerPointsRecord.setCustomerName(calculateIntegral.getNickName());
  2044. customerPointsRecord.setStationName(calculateIntegral.getStationName());
  2045. customerPointsRecord.setStationId(calculateIntegral.getStationId());
  2046. customerPointsRecord.setRecordType("+");
  2047. customerPointsRecord.setUnionId(calculateIntegral.getUnionId());
  2048. customerPointsRecord.setIntegral(calculateIntegral.getIntegral());
  2049. customerPointsRecord.setOrderNo(calculateIntegral.getOrderNo());
  2050. customerPointsRecordService.insertCustomerPointsRecordInfo(customerPointsRecord);
  2051. customerPoints.setUnionId(calculateIntegral.getUnionId());
  2052. customerPoints.setPoints(calculateIntegral.getIntegral());
  2053. customerPoints.setConsumptionPoints(0);
  2054. customerPoints.setMobilePhone(calculateIntegral.getMobilePhone());
  2055. customerPoints.setCustomerName(calculateIntegral.getNickName());
  2056. customerPoints.setStationName(calculateIntegral.getStationName());
  2057. customerPoints.setAccumulatePoints(calculateIntegral.getIntegral());
  2058. customerPoints.setInvalidPoints(0);
  2059. customerPoints.setRecentConsumptionDate(new Date());
  2060. customerPoints.setCreateTime(new Date());
  2061. //新增客户积分
  2062. customerPointsService.insertCustomerPointsInfo(customerPoints);
  2063. logger.info("新增客户积分信息成功!");
  2064. }
  2065. return customerPoints;
  2066. }
  2067. //公众号推送积分
  2068. public void pushIntegral(CustomerPoints customerPoints, CalculateIntegral calculateIntegral){
  2069. String gzhAppId ="";
  2070. String gzhAppSecret ="";
  2071. String stationName = ""; //油站名称
  2072. logger.info("客户小程序openId:" + customerPoints.getMinaOpenId());
  2073. logger.info("客户公众号openId:" + calculateIntegral.getBlogOpenid());
  2074. logger.info("客户所加油的油站ID:" + calculateIntegral.getStationId());
  2075. if(calculateIntegral.getStationId() !=null){
  2076. Map<String, String> m = stationService.getStationAppIdAndAppSecret(calculateIntegral.getStationId());
  2077. if(m !=null && m.containsKey("stationName") && m.containsKey("gzhAppId") && m.containsKey("gzhAppSecret")){
  2078. stationName = m.get("stationName");
  2079. gzhAppId = m.get("gzhAppId");
  2080. gzhAppSecret = m.get("gzhAppSecret");
  2081. }
  2082. //String blogOpenId = customerPoints.getBlogOpenId(); //公众号openId
  2083. if(calculateIntegral.getBlogOpenid() !=null){
  2084. //推送模板
  2085. List<WxMpTemplateData> wxMpTemplate = new ArrayList<>();
  2086. wxMpTemplate.add(new WxMpTemplateData("first","尊敬的"+calculateIntegral.getNickName()+",您好:\n" + "您在"+stationName+"的积分最新交易信息如下"));
  2087. wxMpTemplate.add(new WxMpTemplateData("time", new SimpleDateFormat("yyyy年MM月dd日HH时mm分").format(new Date())));
  2088. wxMpTemplate.add(new WxMpTemplateData("type", "增加"));
  2089. wxMpTemplate.add(new WxMpTemplateData("Point", String.valueOf(customerPoints.getRecentlyPoints())));
  2090. wxMpTemplate.add(new WxMpTemplateData("From", stationName));
  2091. wxMpTemplate.add(new WxMpTemplateData("remark",
  2092. "截止至" + new SimpleDateFormat(" yyyy年MM月dd日HH时mm分").format(new Date())+",您在"+stationName+"的可用积分为 "+customerPoints.getPoints().toString()+" 分"));
  2093. GzhNewsTemplate gzhNewsTemplate = new GzhNewsTemplate();
  2094. gzhNewsTemplate.setStationId(calculateIntegral.getStationId());
  2095. gzhNewsTemplate.setTemplateType("1");
  2096. GzhNewsTemplate gzhNewsTemplateInfo = gzhNewsTemplateService.getGzhNewsTemplate(gzhNewsTemplate);
  2097. if(gzhNewsTemplateInfo !=null && gzhNewsTemplateInfo.getTemplateId() !=null){
  2098. wxPushUtil.push(gzhAppId, gzhAppSecret, gzhNewsTemplateInfo.getTemplateId(), calculateIntegral.getBlogOpenid(), wxMpTemplate);
  2099. }
  2100. }
  2101. }
  2102. }
  2103. //
  2104. @RequestMapping(value = "/posPrintReceiptCeshi", consumes = "application/json", method = RequestMethod.POST)
  2105. @ResponseBody
  2106. public String posPrintReceiptCeshi(@RequestBody PayOrder payOrder){
  2107. Gson gson =new Gson();
  2108. //返回结果集
  2109. ResultData resultData = null;
  2110. Map<String, Object> infoMap = payOrderService.getOrderInfoAndUserInfoByOrderNo(payOrder);
  2111. Map<String, Object> m = new HashMap<>();
  2112. if(payOrder.getTransactionId() !=null){
  2113. m.put("transactionId", payOrder.getTransactionId());
  2114. }
  2115. if(payOrder.getIntegral() !=null){
  2116. m.put("integral", payOrder.getIntegral());
  2117. }
  2118. if(infoMap !=null && infoMap.containsKey("orderNo") && infoMap.get("orderNo") !=null){
  2119. m.put("orderNo", infoMap.get("orderNo").toString());
  2120. }
  2121. if(infoMap !=null && infoMap.containsKey("amt") && infoMap.get("amt") !=null){
  2122. m.put("amt", infoMap.get("amt").toString());
  2123. }
  2124. if(infoMap !=null && infoMap.containsKey("receivableAmt") && infoMap.get("receivableAmt") !=null){
  2125. m.put("receivableAmt", infoMap.get("receivableAmt").toString());
  2126. }
  2127. if(infoMap !=null && infoMap.containsKey("discountAmt") && infoMap.get("discountAmt") !=null){
  2128. m.put("discountAmt", infoMap.get("discountAmt").toString());
  2129. }
  2130. if(infoMap !=null && infoMap.containsKey("oilName") && infoMap.get("oilName") !=null){
  2131. m.put("oilName", infoMap.get("oilName").toString());
  2132. }
  2133. if(infoMap !=null && infoMap.containsKey("oilGun") && infoMap.get("oilGun") !=null){
  2134. m.put("oilGun", infoMap.get("oilGun").toString());
  2135. }
  2136. if(infoMap !=null && infoMap.containsKey("createdDate") && infoMap.get("createdDate") !=null){
  2137. //格式化日期
  2138. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  2139. String createdDate = sdf.format(infoMap.get("createdDate"));
  2140. m.put("createdDate", createdDate);
  2141. }
  2142. if(infoMap !=null && infoMap.containsKey("payDate") && infoMap.get("payDate") !=null){
  2143. //格式化日期
  2144. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  2145. String payDate = sdf.format(infoMap.get("payDate"));
  2146. m.put("payDate", payDate);
  2147. }
  2148. if(infoMap !=null && infoMap.containsKey("payType") && infoMap.get("payType") !=null){
  2149. String payType = "";
  2150. if(infoMap.get("payType").equals("wx")){
  2151. payType ="微信";
  2152. }
  2153. if(infoMap.get("payType").equals("dzk")){
  2154. payType ="电子卡";
  2155. }
  2156. m.put("payType", payType);
  2157. }
  2158. if(infoMap !=null && infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null){
  2159. String phone =infoMap.get("mobilePhone")+"";
  2160. //手机号中间四位****代替
  2161. phone = phone.substring(0, 3) + "****" + phone.substring(7, phone.length());
  2162. m.put("mobilePhone", phone);
  2163. }
  2164. if(infoMap !=null && infoMap.containsKey("orderLiters") && infoMap.get("orderLiters") !=null){
  2165. m.put("orderLiters", infoMap.get("orderLiters").toString());
  2166. }
  2167. if(infoMap !=null && infoMap.containsKey("stationName") && infoMap.get("stationName") !=null){
  2168. m.put("stationName", infoMap.get("stationName").toString());
  2169. }
  2170. if(infoMap !=null && infoMap.containsKey("oilPirce") && infoMap.get("oilPirce") !=null){
  2171. m.put("oilPirce", infoMap.get("oilPirce").toString());
  2172. }
  2173. if(infoMap !=null && infoMap.containsKey("stationId") && infoMap.get("stationId") !=null){
  2174. m.put("stationId", infoMap.get("stationId").toString());
  2175. }
  2176. // if(infoMap !=null && infoMap.containsKey("orderType") && infoMap.get("orderType") !=null){
  2177. // m.put("orderType", infoMap.get("orderType").toString());
  2178. // }
  2179. if(infoMap !=null && infoMap.containsKey("oilType") && infoMap.get("oilType") !=null){
  2180. if(infoMap.get("oilType").equals("3")){
  2181. m.put("orderType", "noOil");
  2182. }else {
  2183. m.put("orderType", "oil");
  2184. }
  2185. }
  2186. logger.info("要推送的订单的信息:" +m.toString());
  2187. //定义推送格式
  2188. Map<String, Object> params = new HashMap<>();
  2189. params.put("messageTitle", "pos");
  2190. params.put("messageType", "sys");
  2191. //获取油枪绑定的POS机信息
  2192. StationDeviceManager stationDeviceManager = new StationDeviceManager();
  2193. stationDeviceManager.setDeviceType("2");
  2194. stationDeviceManager.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  2195. stationDeviceManager.setGunNo(infoMap.get("oilGun").toString());
  2196. StationDeviceManager stationDeviceManagerInfo = stationService.getStationDeviceManager(stationDeviceManager);
  2197. if(stationDeviceManagerInfo !=null && stationDeviceManagerInfo.getPosFanoutExchange() !=null && stationDeviceManagerInfo.getPosQueue() !=null){
  2198. params.put("posFanoutExchange", stationDeviceManagerInfo.getPosFanoutExchange());
  2199. params.put("posQueue", stationDeviceManagerInfo.getPosQueue());
  2200. params.put("tusn", stationDeviceManagerInfo.getDeviceNo());
  2201. params.put("printSetting", payOrder.getPrintSetting()); //小票打印方式
  2202. List<Map<String, Object>> list = new ArrayList<>();
  2203. list.add(m);
  2204. Map<String, Object> map = new HashMap<>();
  2205. map.put("contentData", list);
  2206. params.put("messageContent", map);
  2207. logger.info("开始推送消息:" +JSONObject.toJSONString(params));
  2208. String resultString = PosPrinterUtil.sendPosPrintDirectMessage(params);
  2209. JSONObject jsonObject = JSONObject.parseObject(resultString);
  2210. if(jsonObject.containsKey("code") && jsonObject.get("code").toString().equals("200")){
  2211. //如果打印成功 添加小票数量
  2212. PayOrder p = new PayOrder();
  2213. p.setPrintCount(1);
  2214. p.setOrderNo(infoMap.get("orderNo").toString());
  2215. payOrderService.getUpdatePayOrder(p);
  2216. }
  2217. }
  2218. return gson.toJson(resultData);
  2219. }
  2220. }