PayController.java 92 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518
  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 lombok.SneakyThrows;
  15. import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
  16. import org.apache.commons.lang3.StringUtils;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19. import org.springframework.beans.factory.annotation.Value;
  20. import org.springframework.stereotype.Controller;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import org.springframework.web.bind.annotation.*;
  23. import javax.annotation.Resource;
  24. import java.math.BigDecimal;
  25. import java.math.RoundingMode;
  26. import java.sql.Timestamp;
  27. import java.text.ParseException;
  28. import java.text.SimpleDateFormat;
  29. import java.util.*;
  30. @Controller
  31. @YiJiaRequest()
  32. @CrossOrigin
  33. public class PayController {
  34. private static Logger logger =(Logger) LoggerFactory.getLogger(PayController.class);
  35. @Resource
  36. private PayOrderService payOrderService;
  37. @Resource
  38. private AppUserInfoService appUserInfoService;
  39. @Resource
  40. private StationOilGunService stationOilGunService;
  41. @Resource
  42. private CustomerGradeServices customerGradeServices;
  43. @Resource
  44. private StationService stationService;
  45. @Resource
  46. private CustomerPointsService customerPointsService;
  47. @Resource
  48. private IntegralRuleService integralRuleService;
  49. @Resource
  50. private CustomerPointsRecordService customerPointsRecordService;
  51. @Resource
  52. private WxPushUtil wxPushUtil;
  53. @Resource
  54. private GzhNewsTemplateService gzhNewsTemplateService;
  55. @Resource
  56. private CustomerManagerService customerManagerService;
  57. @Value("${yijia.path.global-prefix}")
  58. private String globalPrefix;
  59. @Value("${yijia.domainName}")
  60. private String domainName;
  61. /***
  62. * 微信子商户支付接口
  63. * @param weChatPaySetRequest
  64. * @return
  65. */
  66. @RequestMapping(value = "/weChatPaySet", consumes = "application/json", method = RequestMethod.POST)
  67. @ResponseBody
  68. public String weChatPaySet(@RequestBody WeChatPaySetRequest weChatPaySetRequest){
  69. Gson gson = new Gson();
  70. ResultData resultData = null; //返回结果
  71. try {
  72. String type = weChatPaySetRequest.getType(); //获取配置类型
  73. JSONObject reqData = new JSONObject(); //微信子商户支付参数配置
  74. reqData.put("mno", weChatPaySetRequest.getMno()); //商编
  75. reqData.put("subMchIdsubMchId", weChatPaySetRequest.getSubMchIdsubMchId()); //获取微信子商号
  76. if(type != null && type !=""){
  77. reqData.put("type", type);
  78. //根据类型设置必传参数
  79. switch (type){
  80. case "01": //支付Appid
  81. reqData.put("accountType", weChatPaySetRequest.getAccountType()); // 支付Appid类型 配置类型为01时必传
  82. reqData.put("subAppid", weChatPaySetRequest.getSubAppid()); // 支付Appid 配置类型为01,02时必传
  83. break;
  84. case "02": //关注Appid
  85. reqData.put("subAppid", weChatPaySetRequest.getSubAppid()); // 支付Appid 配置类型为01,02时必传
  86. reqData.put("subscribeAppid", weChatPaySetRequest.getSubscribeAppid()); // 推荐关注公众号Appid 配置类型为02时与推荐关注 小程序Appid二选一
  87. reqData.put("receiptAppid", weChatPaySetRequest.getReceiptAppid()); // 推荐关注小程序Appid 配置类型为02时与推荐关注 公众号Appid二选一
  88. break;
  89. case "03": //jsapi授权目录
  90. reqData.put("jsapiPath", weChatPaySetRequest.getJsapiPath()); // jsapi授权目录 配置类型为03时必传
  91. break;
  92. }
  93. }
  94. String sxfPay = SXFPaySign.getSXFPay(reqData); //封装传参信息,增加公共信息,增加业务信息
  95. logger.debug("参数信息:"+ sxfPay);
  96. System.out.println("req:" + sxfPay);
  97. //此处不要改变reqData里面值的顺序用LinkedHashMap
  98. HashMap reqMap = JSON.parseObject(sxfPay, LinkedHashMap.class, Feature.OrderedField);
  99. //组装加密串
  100. String signContent = RSASignature.getOrderContent(reqMap);
  101. System.out.println("拼接后的参数:" + signContent);
  102. logger.debug("拼接后的参数:"+signContent);
  103. //sign
  104. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  105. reqMap.put("sign", sign);
  106. String reqStr = JSON.toJSONString(reqMap);
  107. System.out.println("请求参数:" + reqMap);
  108. System.out.println("请求参数:" + reqStr);
  109. //String url = "https://openapi-test.tianquetech.com/merchant/weChatPaySet/addConf"; //测试环境
  110. String url = "https://openapi.tianquetech.com/merchant/weChatPaySet/addConf"; //生产环境
  111. //访问第三方接口
  112. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  113. System.out.println("返回信息:" + resultJson);
  114. // logger.debug("返回信息:"+resultJson);
  115. //不要对reqData排序 所以用LinkedHashMap
  116. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  117. if ("0000".equals(result.get("code"))) {
  118. //验签
  119. String signResult = result.get("sign").toString();
  120. result.remove("sign");
  121. String resultStr = RSASignature.getOrderContent(result);
  122. System.out.println(resultStr);
  123. //sign
  124. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  125. System.out.println("resultSign:" + resultSign);
  126. //组装加密串
  127. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  128. System.out.println("===================验签成功==============");
  129. }
  130. }
  131. resultData=ResultData.success(result);
  132. } catch (Exception e) {
  133. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"支付失败");
  134. e.printStackTrace();
  135. }
  136. return gson.toJson(resultData);
  137. }
  138. /**
  139. * 支付接口,前台上传支付信息,支付数据落地生产订单,调用随行付支付接口
  140. * @param
  141. * @return
  142. */
  143. @RequestMapping(value = "/getJhPayInfo", consumes = "application/json", method = RequestMethod.POST)
  144. @ResponseBody
  145. public String getJhPayInfo(@RequestBody PayInfoRequest payInfoRequest){
  146. Gson gson =new Gson();
  147. ResultData resultData =null;
  148. String openId = payInfoRequest.getOpenId(); //用户openId
  149. String userType=payInfoRequest.getUserType();//用户登录类型 1 公众号。2 小程序
  150. String ordNo = payInfoRequest.getOrdNo();
  151. AppUserInfo appUserInfo =new AppUserInfo();
  152. //订单类型 是小程序还是公众号
  153. appUserInfo.setUserType(userType);
  154. if(userType.equals("1")){
  155. //1 是微信
  156. appUserInfo.setMinaOpenid(openId);
  157. }else if(userType.equals("2")){
  158. //2是支付宝
  159. appUserInfo.setALiId(openId);
  160. }
  161. //appUserInfo.setStationId(stationInfos.getGroupId());
  162. StationInfo stationInfo = new StationInfo();
  163. stationInfo.setStationId(Integer.valueOf(payInfoRequest.getStationId()));
  164. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  165. appUserInfo.setStationId(stationInfos.getGroupId());
  166. AppUserInfo appUserInfos =appUserInfoService.getAppUserInfo(appUserInfo);
  167. if(appUserInfos!=null){
  168. //调用聚合支付
  169. try{
  170. //根据订单号查询订单信息
  171. PayOrder payOrder=payOrderService.selectOrderInfoByOrdNo(ordNo);
  172. if(payOrder!=null ){
  173. if(payOrder.getStatus() !=null && payOrder.getStatus().equals("0")){
  174. //将业务参数存放在 JSON 对象中
  175. JSONObject reqData = new JSONObject();
  176. reqData.put("ordNo", payOrder.getOrderNo()); //商户订单号
  177. //reqData.put("subMechId", ""); //子商户号
  178. reqData.put("amt", payOrder.getAmt()); //订单总金额
  179. //reqData.put("amt", "0.01");
  180. //reqData.put("discountAmt", ""); //参与优惠金额
  181. //reqData.put("unDiscountAmt", ""); //不参与优惠金额
  182. Map<String, String> stationAppIdAndAppSecret = stationService.getStationAppIdAndAppSecret(Integer.valueOf(payInfoRequest.getStationId()));
  183. if(stationAppIdAndAppSecret !=null && stationAppIdAndAppSecret.containsKey("appId") && stationAppIdAndAppSecret.containsKey("mno")){
  184. if(userType.equals("1")){
  185. reqData.put("subAppid", stationAppIdAndAppSecret.get("appId")); //微信小程序
  186. logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("appId"));
  187. }else if(userType.equals("2")){
  188. reqData.put("subAppid", stationAppIdAndAppSecret.get("aliAppId")); //支付宝小程序
  189. logger.info("支付子商户:"+ stationAppIdAndAppSecret.get("aliAppId"));
  190. }
  191. reqData.put("mno", stationAppIdAndAppSecret.get("mno")); //商户编号
  192. logger.info("商户编号:"+ stationAppIdAndAppSecret.get("mno"));
  193. }
  194. if(userType.equals("1")){
  195. //1 是微信小程序
  196. reqData.put("payType", "WECHAT"); //支付渠道 WECHAT:微信;ALIPAY:支付宝;UNIONPAY:银联
  197. reqData.put("payWay", "03"); //支付方式 02 公众号/服 务窗/js支付 03 小程序
  198. reqData.put("userId", appUserInfos.getMinaOpenid()); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
  199. }else if(userType.equals("2")){
  200. //2 是支付宝
  201. reqData.put("payType", "ALIPAY"); //支付渠道 WECHAT:微信;ALIPAY:支付宝;UNIONPAY:银联
  202. reqData.put("payWay", "03"); //支付方式 02 公众号/服 务窗/js支付 03 小程序
  203. reqData.put("userId", appUserInfos.getALiId()); //用户号 微信:openid; 支付宝:userid;银联:userid;微信&支付宝必传,银联js为非必传
  204. }
  205. //reqData.put("timeExpire", "10"); //订单失效时间, 以分钟为单位
  206. //reqData.put("limitPay", "00"); //限制卡类型: 00-全部 01-限定不能使 用信用卡支付 默认值 00
  207. reqData.put("subject", payOrder.getOilName() + " - " +payOrder.getStationName()); //订单标题
  208. //reqData.put("hbFqNum", "6"); //花呗分期数,仅可上送 6 或 12
  209. reqData.put("tradeSource", "01"); //交易来源 01服务商,02收银台,03硬件
  210. reqData.put("trmIp", "172.16.2.1");//商家ip地址
  211. // reqData.put("customerIp", ""); //持卡人ip地址,银联js支付时必传
  212. //reqData.put("outFrontUrl", ""); //js 支付,前台 成功通知地址
  213. reqData.put("outFrontFailUrl", ""); //js 支付,前台 事变通知地址
  214. //globalPrefix
  215. String notifyUrl = "https://"+domainName+"/"+globalPrefix+"/getCallback";
  216. //reqData.put("notifyUrl", "https://www.huijy.net/api/getCallback"); //回调地址
  217. reqData.put("notifyUrl", notifyUrl); //回调地址
  218. //reqData.put("needReceipt", "00"); //电子发票功能 微信开具电子 发票使用
  219. //reqData.put("ledgerAccountFlag", "00"); //是否做分账 分账交易使 用;00:做; 01:不做;不传默认为不做分账
  220. //reqData.put("ledgerAccountEffectTime", "00"); //分账有效时间 单位为天;是 否做分账选择 00 时该字段必传
  221. // reqData.put("ruleId", "00"); //同 步 分 账 规 则 id
  222. // reqData.put("fusruleId", "00"); //同步分账规则
  223. //reqData.put("ylTrmNo", ""); //银联终端号
  224. //reqData.put("terminalId", ""); //TQ机具编号
  225. //reqData.put("deviceNo ", "1111"); //设备号
  226. // reqData.put("identityFlag", ""); //是否是实名支付
  227. // reqData.put("buyerIdType", "IDCARD"); //证件类型
  228. // reqData.put("buyerIdNo", "410523198701054018"); //证件号
  229. // reqData.put("buyerName", "张三"); //买家姓名
  230. // reqData.put("mobileNum", ""); //手机号
  231. // reqData.put("extend", ""); //备用
  232. String req= SXFPaySign.getSXFPay(reqData);
  233. logger.debug("参数信息:"+req);
  234. System.out.println("req:" + req);
  235. //此处不要改变reqData里面值的顺序用LinkedHashMap
  236. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  237. //组装加密串
  238. String signContent = RSASignature.getOrderContent(reqMap);
  239. System.out.println("拼接后的参数:" + signContent);
  240. logger.debug("拼接后的参数:"+signContent);
  241. //sign
  242. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  243. System.out.println("============签名:" + sign);
  244. reqMap.put("sign", sign);
  245. String reqStr = JSON.toJSONString(reqMap);
  246. System.out.println("请求参数:" + reqMap);
  247. System.out.println("请求参数:" + reqStr);
  248. //调用第三方接口地址
  249. //String url = "https://openapi-test.tianquetech.com/order/jsapiScan";//测试地址
  250. String url = "https://openapi.suixingpay.com/order/jsapiScan";//生产地址
  251. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  252. System.out.println("返回信息:" + resultJson);
  253. // logger.debug("返回信息:"+resultJson);
  254. //不要对reqData排序 所以用LinkedHashMap
  255. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  256. if ("0000".equals(result.get("code"))) {
  257. //验签
  258. String signResult = result.get("sign").toString();
  259. result.remove("sign");
  260. String resultStr = RSASignature.getOrderContent(result);
  261. System.out.println("resultStr: " + resultStr);
  262. //sign
  263. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  264. System.out.println("resultSign: " + resultSign);
  265. //组装加密串
  266. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  267. System.out.println("===================验签成功==============");
  268. }
  269. }
  270. resultData=ResultData.success(result);
  271. }else {
  272. resultData=ResultData.error(CodeMsg.ALREADY_PAY);
  273. }
  274. }else {
  275. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"未查询到订单");
  276. }
  277. }catch (Exception e){
  278. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"订单支付失败");
  279. e.printStackTrace();
  280. }
  281. }else{
  282. //返回失败支付失败信息
  283. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  284. }
  285. return gson.toJson(resultData);
  286. }
  287. /**
  288. * 验证商户信息查询
  289. */
  290. @RequestMapping(value = "/getJhPayMnoInfo", method = RequestMethod.GET)
  291. @ResponseBody
  292. public String getJhPayMnoInfo(@RequestParam String mno){
  293. try {
  294. JSONObject reqData = new JSONObject();
  295. reqData.put("mno", mno); //商户编号
  296. String req = SXFPaySign.getSXFPay(reqData);
  297. logger.debug("参数信息:" + req);
  298. System.out.println("req:" + req);
  299. //此处不要改变reqData里面值的顺序用LinkedHashMap
  300. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  301. //组装加密串
  302. String signContent = RSASignature.getOrderContent(reqMap);
  303. System.out.println("拼接后的参数:" + signContent);
  304. logger.debug("拼接后的参数:" + signContent);
  305. //sign
  306. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  307. System.out.println("============签名:" + sign);
  308. reqMap.put("sign", sign);
  309. String reqStr = JSON.toJSONString(reqMap);
  310. System.out.println("请求参数:" + reqMap);
  311. System.out.println("请求参数:" + reqStr);
  312. //调用第三方接口地址
  313. //String url = "https://openapi-test.tianquetech.com/merchant/merchantInfoQuery";//测试地址
  314. String url = "https://openapi.tianquetech.com/merchant/merchantInfoQuery";//生产地址
  315. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  316. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  317. if ("0000".equals(result.get("code"))) {
  318. // //验签
  319. // String signResult = result.get("sign").toString();
  320. // result.remove("sign");
  321. // String resultStr = RSASignature.getOrderContent(result);
  322. // System.out.println(resultStr);
  323. // //sign
  324. // String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  325. // System.out.println("resultSign:" + resultSign);
  326. // //组装加密串
  327. // if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  328. // System.out.println("===================验签成功==============");
  329. // }
  330. }
  331. }catch (Exception e){
  332. e.printStackTrace();
  333. }
  334. return "";
  335. }
  336. /**
  337. * 关单接口
  338. */
  339. @RequestMapping(value = "/getPayOrderClose", consumes = "application/json", method = RequestMethod.POST)
  340. @ResponseBody
  341. public String getPayOrderClose(@RequestBody PayCloseRequestParamter payCloseRequestParamter) {
  342. String results="";
  343. Gson gson =new Gson();
  344. String mno=payCloseRequestParamter.getMno();
  345. String origOrderNo=payCloseRequestParamter.getOrigOrderNo();
  346. String origUuid=payCloseRequestParamter.getOrigUuid();
  347. String token=payCloseRequestParamter.getToken();
  348. String userType=payCloseRequestParamter.getUserType();
  349. boolean flag =appUserInfoService.selectAppUserInfo(token,userType);
  350. ResultData resultData =null;
  351. if(flag){
  352. try {
  353. JSONObject reqData = new JSONObject();
  354. reqData.put("mno",mno); //商户编号
  355. reqData.put("origOrderNo",origOrderNo);//系统商户订单号
  356. reqData.put("origUuid", origUuid);//随行付订单号
  357. String req= SXFPaySign.getSXFPay(reqData);
  358. //此处不要改变reqData里面值的顺序用LinkedHashMap
  359. HashMap reqMap = JSON.parseObject(req, LinkedHashMap.class, Feature.OrderedField);
  360. //组装加密串
  361. String signContent = RSASignature.getOrderContent(reqMap);
  362. System.out.println("拼接后的参数:" + signContent);
  363. //sign
  364. String sign = RSASignature.encryptBASE64(RSASignature.sign(signContent, SXFPaySign.privateKey));
  365. System.out.println("============签名:" + sign);
  366. reqMap.put("sign", sign);
  367. String reqStr = JSON.toJSONString(reqMap);
  368. System.out.println("请求参数:" + reqMap);
  369. System.out.println("请求参数:" + reqStr);
  370. //调用第三方接口地址
  371. // String url = "https://openapi-test.tianquetech.com/query/close";//测试地址
  372. String url = "https://openapi.tianquetech.com/query/close";//生产地址
  373. String resultJson = HttpUtils.connectPostUrl(url, reqStr);
  374. System.out.println("返回信息:" + resultJson);
  375. //不要对reqData排序 所以用LinkedHashMap
  376. HashMap<String, Object> result = JSON.parseObject(resultJson, LinkedHashMap.class, Feature.OrderedField);
  377. if ("0000".equals(result.get("code"))) {
  378. //验签
  379. String signResult = result.get("sign").toString();
  380. result.remove("sign");
  381. String resultStr = RSASignature.getOrderContent(result);
  382. System.out.println(resultStr);
  383. //sign
  384. String resultSign = RSASignature.encryptBASE64(RSASignature.sign(signContent,SXFPaySign.privateKey));
  385. System.out.println("resultSign:" + resultSign);
  386. //组装加密串
  387. if (RSASignature.doCheck(resultStr, signResult, SXFPaySign.sxfPublic)) {
  388. System.out.println("===================验签成功==============");
  389. }
  390. }
  391. resultData=ResultData.success(result);
  392. }catch (Exception e){
  393. resultData=ResultData.error(CodeMsg.YEWU_FAIL,"关闭订单失败");
  394. e.printStackTrace();
  395. }
  396. }else{
  397. resultData=ResultData.error(CodeMsg.USER_NOT_EXSIST);
  398. }
  399. return gson.toJson(resultData);
  400. }
  401. /**
  402. * 异步回调通知
  403. */
  404. @RequestMapping(value = "/getCallback", consumes = "application/json", method = RequestMethod.POST)
  405. @ResponseBody
  406. @Transactional
  407. public void getCallback(@RequestBody JSONObject request) throws ParseException {
  408. logger.info("-------------------------------回调开始----------------------------------------------");
  409. logger.info("回调返回过来的参数"+request);
  410. logger.info("ordNo信息:" + request.get("ordNo").toString());
  411. logger.info("sign信息:" + request.get("sign").toString());
  412. Gson gson =new Gson();
  413. String sxfUuid=request.get("sxfUuid").toString(); //随行付落单号
  414. String payWay=request.get("payWay").toString(); //随行付交易方式
  415. String payTime=request.get("payTime").toString(); //随行付交易时间
  416. String uuid=request.get("uuid").toString(); //随行付交易流水号
  417. String mno=request.get("mno").toString();//发起交易的商户编号
  418. String ordNo=request.get("ordNo").toString();//商户生成的订单号
  419. String amt=request.get("amt").toString();//金额
  420. String buyerId=request.get("buyerId").toString();//用户登录
  421. String transactionId=request.get("transactionId").toString();
  422. String drType=request.get("drType").toString();//借贷记标识 1-借,2-贷,3-其他
  423. String payType=request.get("payType").toString();//对订单的描述,取值范围:WECHAT:微信,ALIPAY:支付宝,UNIONPAY:
  424. String payBank=request.get("payBank").toString();//付款银行银行编码,例如 ICBC
  425. String pointAmount=request.get("pointAmount").toString();//代金券金额
  426. String totalOffstAmt=request.get("totalOffstAmt").toString();//消 费 者 付 款金额
  427. String settleAmt=request.get("settleAmt").toString();//商家入账金额
  428. String timeStamp=request.get("timeStamp").toString();//响应时间
  429. String sign=request.get("sign").toString();//签名
  430. String bizCode=request.get("bizCode").toString();//业务返回码
  431. String bizMsg=request.get("bizMsg").toString();//业 务 返 回 信息
  432. String openid=request.get("openid").toString();//微 信 或 支 付宝身份id()opendid userid
  433. String channelId=request.get("channelId").toString();//渠道商户号
  434. String subMechId=request.get("subMechId").toString();//子商户号
  435. String finishTime=request.get("finishTime").toString();//交易完成时间
  436. String clearDt=request.get("clearDt").toString();
  437. String settlementBatchNo=request.get("settlementBatchNo").toString();
  438. //String origOrdNo=request.get("origOrdNo").toString();//反交易退款异步通知
  439. //String origUuid=request.get("origUuid").toString();//token
  440. //String scene=request.get("scene").toString();//用户登录
  441. //String buyerAccount=request.get("buyerAccount").toString();//
  442. //String realRefundAmount=request.get("realRefundAmount").toString();//商家出账金额
  443. //String recFeeAmt=request.get("recFeeAmt").toString();//交易手续费
  444. //String recFeeRate=request.get("recFeeRate").toString();//交易手续费率
  445. //String refBuyerAmt=request.get("refBuyerAmt").toString();//消 费 者 到 账金额
  446. //String extend = extend=request.get("extend").toString();//备用
  447. //将业务参数存放在 JSON 对象中
  448. JSONObject reqData = new JSONObject();
  449. //支付场景
  450. if(request.containsKey("scene") && request.get("scene") !=null){
  451. String scene = request.get("scene").toString();
  452. reqData.put("scene", scene);
  453. }
  454. //消 费 者 到 账金额
  455. if(request.containsKey("refBuyerAmt") && request.get("refBuyerAmt") !=null){
  456. String refBuyerAmt = request.get("refBuyerAmt").toString();
  457. reqData.put("refBuyerAmt", refBuyerAmt);
  458. }
  459. //buyerAccount 支付宝买家登录账号 掩码;示例:135***1234
  460. if(request.containsKey("buyerAccount") && request.get("buyerAccount") !=null){
  461. String buyerAccount = request.get("buyerAccount").toString();
  462. reqData.put("buyerAccount", buyerAccount);
  463. }
  464. //备用
  465. if(request.containsKey("extend") && request.get("extend") !=null){
  466. String extend = request.get("extend").toString();
  467. reqData.put("extend", extend);
  468. }
  469. //优惠券参数
  470. if(request.containsKey("promotionDetail") && request.get("promotionDetail") !=null){
  471. String promotionDetail = request.get("promotionDetail").toString();
  472. reqData.put("promotionDetail", promotionDetail);
  473. }
  474. //商家出账金额
  475. if(request.containsKey("realRefundAmount") && request.get("realRefundAmount") !=null){
  476. String realRefundAmount = request.get("realRefundAmount").toString();
  477. reqData.put("realRefundAmount", realRefundAmount);
  478. }
  479. //szltFlag
  480. if(request.containsKey("szltFlag") && request.get("szltFlag") !=null){
  481. String szltFlag = request.get("szltFlag").toString();
  482. reqData.put("szltFlag", szltFlag);
  483. }
  484. //recFeeAmt
  485. if(request.containsKey("recFeeAmt") && request.get("recFeeAmt") !=null){
  486. String recFeeAmt = request.get("recFeeAmt").toString();
  487. reqData.put("recFeeAmt", recFeeAmt);
  488. }
  489. //szltRecfeeAmt
  490. if(request.containsKey("szltRecfeeAmt") && request.get("szltRecfeeAmt") !=null){
  491. String szltRecfeeAmt = request.get("szltRecfeeAmt").toString();
  492. reqData.put("szltRecfeeAmt", szltRecfeeAmt);
  493. }
  494. reqData.put("sxfUuid",sxfUuid);
  495. reqData.put("payWay",payWay);
  496. reqData.put("payTime",payTime);
  497. reqData.put("uuid",uuid);
  498. reqData.put("mno",mno);
  499. reqData.put("ordNo",ordNo);
  500. reqData.put("amt",amt);
  501. reqData.put("buyerId",buyerId);
  502. reqData.put("transactionId",transactionId);
  503. reqData.put("drType",drType);
  504. reqData.put("payType",payType);
  505. reqData.put("payBank",payBank);
  506. reqData.put("pointAmount",pointAmount);
  507. reqData.put("totalOffstAmt",totalOffstAmt);
  508. reqData.put("settleAmt",settleAmt);
  509. reqData.put("timeStamp",timeStamp);
  510. reqData.put("bizCode",bizCode);
  511. reqData.put("bizMsg",bizMsg);
  512. reqData.put("openid",openid);
  513. reqData.put("channelId",channelId);
  514. reqData.put("subMechId",subMechId);
  515. reqData.put("finishTime",finishTime);
  516. reqData.put("clearDt",clearDt);
  517. reqData.put("settlementBatchNo",settlementBatchNo);
  518. //reqData.put("realRefundAmount",realRefundAmount);
  519. //reqData.put("recFeeAmt",recFeeAmt);
  520. //reqData.put("recFeeRate",recFeeRate);
  521. //reqData.put("buyerAccount",buyerAccount);
  522. //reqData.put("origOrdNo",origOrdNo);
  523. //reqData.put("origUuid",origUuid);
  524. //reqData.put("scene",scene);
  525. //reqData.put("refBuyerAmt",refBuyerAmt);
  526. //reqData.put("extend",extend);
  527. //根据回调信息,先进行验签,验签后修改状态
  528. logger.info("打印参数信息"+gson.toJson(reqData));
  529. //不要对reqData排序 所以用LinkedHashMap
  530. HashMap<String, Object> result = JSON.parseObject(gson.toJson(reqData), LinkedHashMap.class, Feature.OrderedField);
  531. //验签
  532. String resultStr = RSASignature.getOrderContent(result);
  533. JSONObject req = new JSONObject();
  534. System.out.println(resultStr);
  535. if (RSASignature.doCheck(resultStr, sign, SXFPaySign.sxfPublic)) {
  536. logger.info("验签成功");
  537. req.put("code","success");
  538. req.put("msg","修改订单状态成功");
  539. logger.info("返回随行付参数信息:"+req.toString());
  540. //验签成功,修改订单状态
  541. List<PayOrder> list = payOrderService.getPayOrderList(ordNo);
  542. logger.info("根据订单号,查询订单"+gson.toJson(list));
  543. if (list != null && list.size() == 1) {
  544. String status = list.get(0).getStatus();
  545. //状态为未支付 0 修改状态为1已支付
  546. if (status.equals("0")) {
  547. PayOrder payOrder = new PayOrder();
  548. payOrder.setOrderNo(ordNo);
  549. payOrder.setStatus("1");
  550. if(payType.equals("WECHAT")){ //WECHAT:微信,ALIPAY:支付宝,UNIONPAY:
  551. payOrder.setPayType("wx");
  552. }else if(payType.equals("ALIPAY")){
  553. payOrder.setPayType("zfb");
  554. }
  555. payOrder.setWxAmt(Double.valueOf(amt));
  556. payOrder.setPayDate(new Timestamp(new Date().getTime())); //支付时间
  557. payOrder.setReceivedAmt(Double.valueOf(settleAmt)); //settleAmt商家入账金额
  558. //修改订单状态
  559. int count = payOrderService.getUpdatePayOrder(payOrder);
  560. if(count == 1){
  561. //将用户消费的信息插入顾客表: 以手机号 油品名称 油站id为条件插入且存入 加油升数、实收金额、油站名称 根据订单号查询用户手机号
  562. Map<String, Object> infoMap = payOrderService.getOrderInfoAndUserInfoByOrderNo(payOrder); //获取该订单手机号、加油升数、实收金额、油站名称
  563. logger.info("根据订单查询用户手机号等订单信息"+ infoMap.toString());
  564. //手机号必须有
  565. if(infoMap != null && infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null ){
  566. CustomerManage customerManage = this.insertCustomerManage(infoMap); //插入客户积分返回要插入客户的信息
  567. StationInfo stationInfo = new StationInfo();
  568. stationInfo.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  569. StationInfo stationInfos = stationService.selectStationInfo(stationInfo);
  570. int integral =0;
  571. CalculateIntegral calculateIntegral = new CalculateIntegral();
  572. calculateIntegral.setOrderNo(ordNo);
  573. if(infoMap.containsKey("consumer") && infoMap.get("consumer") !=null){
  574. calculateIntegral.setNickName(infoMap.get("consumer").toString());
  575. }else {
  576. calculateIntegral.setNickName("");
  577. }
  578. calculateIntegral.setGroupId(Integer.valueOf(infoMap.get("groupId").toString())); //集团ID
  579. calculateIntegral.setCustomerGrade(customerManage.getGrade()); //客户等级
  580. calculateIntegral.setIntegralRuleFlag(stationInfos.getIntegralRuleFlagGroup()); //是否共享积分规则
  581. calculateIntegral.setOpenId(infoMap.get("minaOpenid").toString()); //客户小程序ID
  582. if(infoMap.containsKey("blogOpenid") && StringUtils.isNotBlank(infoMap.get("blogOpenid").toString())){
  583. calculateIntegral.setBlogOpenid(infoMap.get("blogOpenid").toString());
  584. }
  585. calculateIntegral.setStationId(Integer.valueOf(infoMap.get("stationId").toString())); //油站ID
  586. calculateIntegral.setStationName(infoMap.get("stationName").toString()); //油站名称
  587. calculateIntegral.setAmt(new BigDecimal(infoMap.get("amt").toString())); //实收金额
  588. calculateIntegral.setOilType(infoMap.get("oilType").toString()); //订单类型
  589. calculateIntegral.setOilName(infoMap.get("oilName").toString()); //油品名称
  590. calculateIntegral.setOilLiters(new BigDecimal(infoMap.get("orderLiters").toString())); //加油升数
  591. calculateIntegral.setUnionId(infoMap.get("unionId").toString()); //客户unionId
  592. calculateIntegral.setNickName(infoMap.get("consumer").toString()); //客户昵称
  593. calculateIntegral.setMobilePhone(infoMap.get("mobilePhone").toString()); //客户手机号
  594. calculateIntegral.setReceivableAmt(new BigDecimal(infoMap.get("receivableAmt").toString())); //应收金额
  595. CustomerPoints customerPoints;
  596. //计算积分
  597. CalculateIntegral calculateIntegralInfos;
  598. if(stationInfos.getIntegralRuleFlagGroup().equals("1")){ //表示积分共享
  599. if(stationInfos.getIntegralFlagGroup().equals("1")){ //集团开启积分功能
  600. //calculateIntegral.setGroupId(stationInfos.getGroupId());
  601. calculateIntegralInfos = this.calculateIntegral(calculateIntegral);
  602. //插入客户所得积分
  603. customerPoints = this.insertUserIntegral(calculateIntegralInfos);
  604. integral =calculateIntegralInfos.getIntegral();
  605. //推送积分
  606. this.pushIntegral(customerPoints, calculateIntegral);
  607. }
  608. }else {
  609. if(stationInfos.getIntegralFlag().equals("1")){
  610. //calculateIntegral.setStationId(stationInfos.getStationId());
  611. calculateIntegralInfos = this.calculateIntegral(calculateIntegral);
  612. //插入客户所得积分
  613. customerPoints = this.insertUserIntegral(calculateIntegralInfos);
  614. //推送积分
  615. integral =calculateIntegralInfos.getIntegral();
  616. this.pushIntegral(customerPoints, calculateIntegral);
  617. }
  618. }
  619. //logger.info("小票打印方式:" + stationInfo.getPrintDeviceType());
  620. if(stationInfos !=null && stationInfos.getPrintDeviceType() !=null){
  621. switch (stationInfos.getPrintDeviceType()){
  622. case "1": //小票机打印
  623. logger.info("小票机打印");
  624. Map map = new HashMap();
  625. map.put("stationId", infoMap.get("stationId").toString());
  626. map.put("oilGunNo", infoMap.get("oilGun").toString());
  627. map.put("deviceType", stationInfos.getPrintDeviceType());
  628. List<Map> listDevices = stationOilGunService.getPrinterSnByStationIdAndOilGunNoList(map);
  629. infoMap.put("sn", listDevices.get(0).get("printerSn").toString());
  630. infoMap.put("printSetting", stationInfos.getPrintSetting());
  631. this.printReceipt(infoMap);
  632. break;
  633. case "2": //POS机打印
  634. logger.info("POS机打印");
  635. payOrder.setIntegral(String.valueOf(integral));
  636. payOrder.setPrintSetting(stationInfos.getPrintSetting());
  637. this.posPrintReceipt(payOrder);
  638. break;
  639. }
  640. }
  641. }else{
  642. logger.info("该用户无手机号!");
  643. }
  644. }
  645. }
  646. }
  647. }else {
  648. logger.info("验签失败");
  649. req.put("code","fail");
  650. req.put("msg","失败");
  651. }
  652. }
  653. //插入客户信息
  654. public CustomerManage insertCustomerManage(Map infoMap) throws ParseException {
  655. CustomerManage customerManage = new CustomerManage(); //存放客户信息
  656. customerManage.setGroupId(Integer.valueOf(infoMap.get("groupId").toString()));
  657. customerManage.setUnionId(infoMap.get("unionId").toString());
  658. customerManage.setMinaUserId(Integer.valueOf(infoMap.get("consumerId").toString()));
  659. customerManage.setPhoneNumber(infoMap.get("mobilePhone").toString());
  660. customerManage.setCustomerName(infoMap.get("consumer").toString());
  661. customerManage.setRegtime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(infoMap.get("registeDate").toString()));
  662. customerManage.setStationId(Integer.valueOf(infoMap.get("stationId").toString())); //油站ID
  663. customerManage.setOilName(infoMap.get("oilName").toString()); //油品名称
  664. CustomerManage existCustomer = customerManagerService.getCustomerManageInfo(customerManage); //已存在用户信息 existCustomer
  665. //判断该用户是否已存在
  666. if(existCustomer != null){ //存在该用户时更新
  667. if(existCustomer.getAmt() !=null){
  668. customerManage.setAmt(existCustomer.getAmt().add(BigDecimal.valueOf((Double) infoMap.get("amt"))));//存入金额 累加原来金额
  669. }else {
  670. customerManage.setAmt(BigDecimal.valueOf((Double) infoMap.get("amt")));
  671. }
  672. //此处用于更新没有会员ID的用户
  673. if(!StringUtils.isNotBlank(existCustomer.getMemberId())){
  674. String customerId=infoMap.get("groupId").toString()+infoMap.get("stationId").toString()+System.nanoTime();
  675. customerManage.setMemberId(customerId);
  676. }
  677. if(infoMap.containsKey("orderType") && infoMap.get("orderType").equals("1")) {
  678. if (existCustomer.getLiters() != null) {
  679. customerManage.setLiters(existCustomer.getLiters().add(BigDecimal.valueOf((Double) infoMap.get("orderLiters"))));//存入升数 累加原来升数
  680. } else {
  681. customerManage.setLiters(BigDecimal.valueOf((Double) infoMap.get("orderLiters")));
  682. }
  683. }
  684. logger.info("存在客户 更新时手机号参数: " + customerManage.getPhoneNumber());
  685. //直降时存入等级名称和等级ID
  686. List<Map> customerGradeInfo = customerGradeServices.getCustomerGradeListOrderByDesc(infoMap); //直降
  687. logger.info("该站直降等级信息:"+ customerGradeInfo);
  688. for (Map m: customerGradeInfo){
  689. if(Double.valueOf(customerManage.getAmt().toString()) >= Double.valueOf(m.get("memberConditStart").toString())){
  690. customerManage.setGrade(m.get("id").toString()); //存入等级ID
  691. break;
  692. }
  693. }
  694. logger.info("直降等级信息是否存入客户表:"+ "直降ID:"+ customerManage.getGrade());
  695. customerManagerService.updateCustomerInfo(customerManage);
  696. }else{ //该客户不存在时插入
  697. //直降时存入等级名称和等级ID
  698. List<Map> customerGradeInfo = customerGradeServices.getCustomerGradeList(infoMap); //直降
  699. logger.info("该站直降等级信息:"+ customerGradeInfo);
  700. if(customerGradeInfo !=null && customerGradeInfo.size() >0){
  701. customerManage.setGrade(customerGradeInfo.get(0).get("id").toString()); //存入等级ID
  702. }
  703. logger.info("直降等级信息是否存入客户表:"+ "直降ID:"+ customerManage.getGrade());
  704. customerManage.setAmt(BigDecimal.valueOf((Double) infoMap.get("amt"))); //存入金额
  705. if(infoMap.containsKey("orderType") && infoMap.get("orderType").equals("1")){
  706. customerManage.setLiters(BigDecimal.valueOf((Double) infoMap.get("orderLiters"))); //存入升数
  707. }
  708. logger.info("不存在客户 新增时参数: " + customerManage.toString());
  709. String memberId=infoMap.get("groupId").toString()+infoMap.get("stationId").toString()+System.nanoTime(); //客户会员号
  710. CustomerManage cm = new CustomerManage();
  711. cm.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  712. cm.setPhoneNumber(infoMap.get("mobilePhone").toString());
  713. List<CustomerManage> customerManageInfoList = customerManagerService.getCustomerManageInfoList(cm);
  714. if(customerManageInfoList !=null && customerManageInfoList.size()>0){
  715. if(StringUtils.isNotBlank(customerManageInfoList.get(0).getMemberId())){
  716. customerManage.setMemberId(customerManageInfoList.get(0).getMemberId());
  717. }else {
  718. customerManage.setMemberId(memberId);
  719. }
  720. }else {
  721. customerManage.setMemberId(memberId);
  722. }
  723. customerManagerService.insertCustomerInfo(customerManage);
  724. }
  725. return customerManage;
  726. }
  727. //POS机打印小票
  728. public void posPrintReceipt(PayOrder payOrder){
  729. Map<String, Object> infoMap = payOrderService.getOrderInfoAndUserInfoByOrderNo(payOrder);
  730. Map<String, Object> m = new HashMap<>();
  731. if(payOrder.getTransactionId() !=null){
  732. m.put("transactionId", payOrder.getTransactionId());
  733. }
  734. if(payOrder.getIntegral() !=null){
  735. m.put("integral", payOrder.getIntegral());
  736. }
  737. if(infoMap !=null && infoMap.containsKey("orderNo") && infoMap.get("orderNo") !=null){
  738. m.put("orderNo", infoMap.get("orderNo").toString());
  739. }
  740. if(infoMap !=null && infoMap.containsKey("amt") && infoMap.get("amt") !=null){
  741. m.put("amt", infoMap.get("amt").toString());
  742. }
  743. if(infoMap !=null && infoMap.containsKey("receivableAmt") && infoMap.get("receivableAmt") !=null){
  744. m.put("receivableAmt", infoMap.get("receivableAmt").toString());
  745. }
  746. if(infoMap !=null && infoMap.containsKey("discountAmt") && infoMap.get("discountAmt") !=null){
  747. m.put("discountAmt", infoMap.get("discountAmt").toString());
  748. }
  749. if(infoMap !=null && infoMap.containsKey("oilName") && infoMap.get("oilName") !=null){
  750. m.put("oilName", infoMap.get("oilName").toString());
  751. }
  752. if(infoMap !=null && infoMap.containsKey("oilGun") && infoMap.get("oilGun") !=null){
  753. m.put("oilGun", infoMap.get("oilGun").toString());
  754. }
  755. if(infoMap !=null && infoMap.containsKey("createdDate") && infoMap.get("createdDate") !=null){
  756. //格式化日期
  757. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  758. String createdDate = sdf.format(infoMap.get("createdDate"));
  759. m.put("createdDate", createdDate);
  760. }
  761. if(infoMap !=null && infoMap.containsKey("payDate") && infoMap.get("payDate") !=null){
  762. //格式化日期
  763. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  764. String payDate = sdf.format(infoMap.get("payDate"));
  765. m.put("payDate", payDate);
  766. }
  767. if(infoMap !=null && infoMap.containsKey("payType") && infoMap.get("payType") !=null){
  768. String payType = "";
  769. if(infoMap.get("payType").equals("wx")){
  770. payType ="微信";
  771. }
  772. if(infoMap.get("payType").equals("dzk")){
  773. payType ="电子卡";
  774. }
  775. m.put("payType", payType);
  776. }
  777. if(infoMap !=null && infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null){
  778. String phone =infoMap.get("mobilePhone")+"";
  779. //手机号中间四位****代替
  780. phone = phone.substring(0, 3) + "****" + phone.substring(7, phone.length());
  781. m.put("mobilePhone", phone);
  782. }
  783. if(infoMap !=null && infoMap.containsKey("orderLiters") && infoMap.get("orderLiters") !=null){
  784. m.put("orderLiters", infoMap.get("orderLiters").toString());
  785. }
  786. if(infoMap !=null && infoMap.containsKey("stationName") && infoMap.get("stationName") !=null){
  787. m.put("stationName", infoMap.get("stationName").toString());
  788. }
  789. if(infoMap !=null && infoMap.containsKey("oilPirce") && infoMap.get("oilPirce") !=null){
  790. m.put("oilPirce", infoMap.get("oilPirce").toString());
  791. }
  792. if(infoMap !=null && infoMap.containsKey("stationId") && infoMap.get("stationId") !=null){
  793. m.put("stationId", infoMap.get("stationId").toString());
  794. }
  795. // if(infoMap !=null && infoMap.containsKey("orderType") && infoMap.get("orderType") !=null){
  796. // m.put("orderType", infoMap.get("orderType").toString());
  797. // }
  798. if(infoMap !=null && infoMap.containsKey("oilType") && infoMap.get("oilType") !=null){
  799. if(infoMap.get("oilType").equals("3")){
  800. m.put("orderType", "noOil");
  801. }else {
  802. m.put("orderType", "oil");
  803. }
  804. }
  805. logger.info("要推送的订单的信息:" +m.toString());
  806. //定义推送格式
  807. Map<String, Object> params = new HashMap<>();
  808. params.put("messageTitle", "pos");
  809. params.put("messageType", "sys");
  810. //获取油枪绑定的POS机信息
  811. StationDeviceManager stationDeviceManager = new StationDeviceManager();
  812. stationDeviceManager.setDeviceType("2");
  813. stationDeviceManager.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  814. stationDeviceManager.setGunNo(infoMap.get("oilGun").toString());
  815. StationDeviceManager stationDeviceManagerInfo = stationService.getStationDeviceManager(stationDeviceManager);
  816. if(stationDeviceManagerInfo !=null && stationDeviceManagerInfo.getPosFanoutExchange() !=null && stationDeviceManagerInfo.getPosQueue() !=null){
  817. params.put("posFanoutExchange", stationDeviceManagerInfo.getPosFanoutExchange());
  818. params.put("posQueue", stationDeviceManagerInfo.getPosQueue());
  819. params.put("tusn", stationDeviceManagerInfo.getDeviceNo());
  820. params.put("printSetting", payOrder.getPrintSetting()); //小票打印方式
  821. List<Map<String, Object>> list = new ArrayList<>();
  822. list.add(m);
  823. Map<String, Object> map = new HashMap<>();
  824. map.put("contentData", list);
  825. params.put("messageContent", map);
  826. logger.info("开始推送消息:" +JSONObject.toJSONString(params));
  827. String resultString = PosPrinterUtil.sendPosPrintDirectMessage(params);
  828. JSONObject jsonObject = JSONObject.parseObject(resultString);
  829. if(jsonObject.containsKey("code") && jsonObject.get("code").toString().equals("200")){
  830. //如果打印成功 添加小票数量
  831. PayOrder p = new PayOrder();
  832. p.setPrintCount(1);
  833. p.setOrderNo(infoMap.get("orderNo").toString());
  834. payOrderService.getUpdatePayOrder(p);
  835. }
  836. }
  837. }
  838. //打印机打印小票
  839. public void printReceipt(Map infoMap) {
  840. //打印机打印小票
  841. String content1;
  842. String content2;
  843. String orderNoP = "";
  844. String createdDateP ="";
  845. String stationNameP ="";
  846. String oilNameP ="";
  847. String orderLitersP ="";
  848. String oilPirceP ="";
  849. String receivableAmtP = "";
  850. String discountAmtP = "";
  851. String amtP = "";
  852. String mobilePhoneP = "";
  853. String payWayP = "";
  854. String sn; //打印机编号
  855. if(StringUtils.isNotBlank(infoMap.get("orderNo").toString())){
  856. orderNoP =infoMap.get("orderNo").toString();
  857. }
  858. if(infoMap.containsKey("createdDate") && infoMap.get("createdDate") !=null ){
  859. //格式化日期
  860. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  861. createdDateP =sdf.format(infoMap.get("createdDate"));
  862. }
  863. if(infoMap.containsKey("stationName") && infoMap.get("stationName") !=null ){
  864. stationNameP =infoMap.get("stationName").toString();
  865. }
  866. if(infoMap.containsKey("oilName") && infoMap.get("oilName") !=null ){
  867. oilNameP =infoMap.get("oilName").toString();
  868. }
  869. if(infoMap.containsKey("oilType") && infoMap.get("oilType").equals("1")) {
  870. //加油升数
  871. if (infoMap.containsKey("orderLiters") && infoMap.get("orderLiters") != null) {
  872. orderLitersP = infoMap.get("orderLiters") + "";
  873. }
  874. //油价
  875. if (infoMap.containsKey("oilPirce") && infoMap.get("oilPirce") != null) {
  876. oilPirceP = infoMap.get("oilPirce") + "";
  877. }
  878. if(infoMap.containsKey("discountAmt") && infoMap.get("discountAmt") !=null ){
  879. discountAmtP =infoMap.get("discountAmt")+"";
  880. }
  881. }else if(infoMap.containsKey("oilType") && infoMap.get("oilType").equals("2")) {
  882. orderLitersP ="0.00";
  883. oilPirceP = "0.00";
  884. discountAmtP ="0.00";
  885. receivableAmtP=infoMap.get("amt")+"";
  886. }
  887. if(infoMap.containsKey("receivableAmt") && infoMap.get("receivableAmt") !=null ){
  888. receivableAmtP =infoMap.get("receivableAmt")+"";
  889. }
  890. if(infoMap.containsKey("amt") && infoMap.get("amt") !=null ){
  891. amtP =infoMap.get("amt")+"";
  892. }
  893. if(infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null ){
  894. String phone =infoMap.get("mobilePhone")+"";
  895. //手机号中间四位****代替
  896. mobilePhoneP = phone.substring(0, 3) + "****" + phone.substring(7, phone.length());
  897. }
  898. if(infoMap.containsKey("payWay") && infoMap.get("payWay") !=null ){
  899. if(infoMap.get("payWay").equals("02") || infoMap.get("payWay").equals("03")){
  900. payWayP ="微信";
  901. }
  902. }
  903. content1 = "<CB>支付小票--顾客联</CB><BR>";
  904. content1 += "订单号:"+orderNoP+" <BR>";
  905. content1 += "时间:"+createdDateP+" <BR>";
  906. content1 += "油站:"+stationNameP+" <BR>";
  907. if(infoMap.containsKey("oilType") && infoMap.get("oilType").toString().equals("1")){
  908. content1 += "油品: "+oilNameP+" <BR>";
  909. content1 += "油量: "+orderLitersP+" 升<BR>";
  910. content1 += "单价: "+oilPirceP+" L/元<BR>";
  911. }
  912. content1 += "<BOLD><B>原价: "+receivableAmtP+" 元</B></BOLD><BR>";
  913. if(infoMap.containsKey("oilType") && infoMap.get("oilType").toString().equals("1")){
  914. content1 += "优惠: "+discountAmtP+" 元<BR>";
  915. }
  916. content1 += "支付: "+amtP+" 元<BR>";
  917. content1 += "支付方式: "+payWayP+" <BR>";
  918. content1 += "<BR>";
  919. //content1 += "--------------------------------<BR>";
  920. content1 += "<BR>";
  921. content2 = "<CB>支付小票--商户联</CB><BR>";
  922. content2 += "订单号:"+orderNoP+" <BR>";
  923. content2 += "时间:"+createdDateP+"<BR>";
  924. content2 += "油站:"+stationNameP+" <BR>";
  925. if(infoMap.containsKey("oilType") && infoMap.get("oilType").toString().equals("1")){
  926. content2 += "油品: "+oilNameP+" <BR>";
  927. content2 += "油量: "+orderLitersP+" 升<BR>";
  928. content2 += "单价: "+oilPirceP+" L/元<BR>";
  929. }
  930. content2 += "<BOLD><B>原价: "+receivableAmtP+" 元</B></BOLD><BR>";
  931. if(infoMap.containsKey("oilType") && infoMap.get("oilType").toString().equals("1")){
  932. content2 += "优惠: "+discountAmtP+" 元<BR>";
  933. }
  934. content2 += "支付: "+amtP+" 元<BR>";
  935. content2 += "手机号: "+mobilePhoneP+" <BR>";
  936. content2 += "支付方式: "+payWayP+" <BR>";
  937. content2 += "<BR>";
  938. //获取打印机编号
  939. //sn = "921611605"; //测试打印机 sn:921611605 key:72338zma
  940. sn = infoMap.get("sn").toString();
  941. //开始打印
  942. String printInfo=""; //打印信息
  943. if(infoMap.containsKey("printSetting") && infoMap.get("printSetting").toString()!= null && infoMap.get("printSetting").toString()!=""){
  944. switch (infoMap.get("printSetting").toString()){
  945. case "1": //1 客户联
  946. printInfo = FeiEPrinterUtil.printReceipt(sn, content1);
  947. break;
  948. case "2": //2 商户联
  949. printInfo = FeiEPrinterUtil.printReceipt(sn, content2);
  950. break;
  951. case "3": //3商户联和客户联
  952. printInfo = FeiEPrinterUtil.printReceipt(sn, content1 + content2);
  953. break;
  954. }
  955. }
  956. JSONObject jsonObject = JSONObject.parseObject(printInfo);
  957. if(jsonObject != null && jsonObject.getString("msg").equals("ok")){
  958. logger.info("打印成功:" + jsonObject.toString());
  959. //如果打印成功 添加小票数量
  960. PayOrder p = new PayOrder();
  961. p.setPrintCount(1);
  962. p.setOrderNo(infoMap.get("orderNo").toString());
  963. payOrderService.getUpdatePayOrder(p);
  964. }
  965. }
  966. //计算积分
  967. public CalculateIntegral calculateIntegral(CalculateIntegral calculateIntegral){
  968. int integral =0;
  969. IntegralRule integralRule = new IntegralRule();
  970. integralRule.setStationId(calculateIntegral.getStationId());
  971. //获取油站的积分规则是否共享
  972. String integralRuleFlag = calculateIntegral.getIntegralRuleFlag();
  973. if(StringUtils.isNotBlank(integralRuleFlag) && integralRuleFlag.equals("1")){
  974. //如果共享则先根据集团ID查询集团规则
  975. integralRule.setStationId(calculateIntegral.getGroupId());
  976. }
  977. integralRule.setOilName(calculateIntegral.getOilName());
  978. //获取该油站的积分规则
  979. List<IntegralRule> integralRuleList = integralRuleService.getIntegralRule(integralRule);
  980. if(integralRuleList !=null && integralRuleList.size() >0){
  981. logger.info("该油站积分规则信息:" + integralRuleList.toString());
  982. Date emptyDate = integralRuleList.get(0).getEmptyDate();
  983. //积分规则有效时间 为null时 表示永久有效
  984. if(emptyDate ==null || emptyDate.compareTo(new Date()) == 1 || emptyDate.compareTo(new Date()) == 0){
  985. List<IntegralRuleDetail> integralRuleDetailList = integralRuleList.get(0).getIntegralRuleDetailList();
  986. String currentTime = null; //当前时间
  987. String datePickerTime=null; //活动时间
  988. String[] datePickerTimeArray ={};
  989. String integralActivity = integralRuleList.get(0).getIntegralActivity();
  990. String integralProportion =null;
  991. if(integralActivity !=null && integralActivity.equals("1")){
  992. datePickerTime = integralRuleList.get(0).getDatePickerTime();
  993. integralProportion = integralRuleList.get(0).getIntegralProportion();
  994. if(datePickerTime.contains(",")){
  995. datePickerTimeArray = datePickerTime.split(",");
  996. }else {
  997. datePickerTimeArray= new String[1];
  998. datePickerTimeArray[0] = datePickerTime;
  999. }
  1000. }
  1001. if(integralRuleDetailList !=null && integralRuleDetailList.size() >0){
  1002. Calendar calendar = Calendar.getInstance();
  1003. calendar.setTime(new Date()); //获取当前时间
  1004. for (IntegralRuleDetail integralRuleDetail : integralRuleDetailList){
  1005. if(!StringUtils.isNotBlank(integralRuleDetail.getRuleType()) && !StringUtils.isNotBlank(integralRuleDetail.getGread())){
  1006. //等级和规则类型null为时表示非油品, 没有按照实收,应收,加油升数
  1007. if (calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==1 || calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==0){
  1008. BigDecimal divide = null;
  1009. BigDecimal multiply = null;
  1010. divide = calculateIntegral.getReceivableAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1011. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1012. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1013. String datePicker = integralRuleList.get(0).getDatePicker(); //获取日期类型
  1014. switch (datePicker){
  1015. case "1": // 1.按周来
  1016. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1017. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1018. currentTime = String.valueOf(day_Week);
  1019. break;
  1020. case "2": // 2.每月的 多少号
  1021. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1022. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1023. currentTime = String.valueOf(day_month); //当前时间
  1024. break;
  1025. case "3": // 3.固定日期
  1026. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1027. break;
  1028. }
  1029. for (String s : datePickerTimeArray){
  1030. if(s.equals(currentTime)){
  1031. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1032. break;
  1033. }
  1034. }
  1035. }
  1036. integral = multiply.intValue();
  1037. logger.info("本次客户所得积分:" + integral);
  1038. break;
  1039. }
  1040. }else if (StringUtils.isNotBlank(integralRuleDetail.getGread()) && integralRuleDetail.getRuleType().equals("1")){ //按照实收金额
  1041. if(calculateIntegral.getAmt().compareTo(integralRuleDetail.getRuleTerms()) == 1 || calculateIntegral.getAmt().compareTo(integralRuleDetail.getRuleTerms()) == 0){
  1042. BigDecimal divide = null;
  1043. BigDecimal multiply = null;
  1044. if(integralRuleDetail.getGread().equals("0")){ //等级为0时,表示所有人
  1045. divide = calculateIntegral.getAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1046. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1047. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1048. String datePicker = integralRuleList.get(0).getDatePicker();
  1049. switch (datePicker){
  1050. case "1": // 1.按周来
  1051. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1052. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1053. currentTime = String.valueOf(day_Week);
  1054. break;
  1055. case "2": // 2.每月的多少号
  1056. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1057. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1058. currentTime = String.valueOf(day_month); //当前时间
  1059. break;
  1060. case "3": // 3.固定日期
  1061. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  1062. break;
  1063. }
  1064. for (String s : datePickerTimeArray){
  1065. if(s.equals(currentTime)){
  1066. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1067. break;
  1068. }
  1069. }
  1070. }
  1071. integral =multiply.intValue();
  1072. logger.info("本次客户所得积分:" + integral);
  1073. break;
  1074. }else if(integralRuleDetail.getGread().equals(calculateIntegral.getCustomerGrade())){ //如果等级相同
  1075. divide = calculateIntegral.getAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1076. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1077. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1078. String datePicker = integralRuleList.get(0).getDatePicker();
  1079. switch (datePicker){
  1080. case "1": // 1.按周来
  1081. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1082. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1083. currentTime = String.valueOf(day_Week);
  1084. break;
  1085. case "2": // 2.每月的多少号
  1086. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1087. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1088. currentTime = String.valueOf(day_month); //当前时间
  1089. break;
  1090. case "3": // 3.固定日期
  1091. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  1092. break;
  1093. }
  1094. for (String s : datePickerTimeArray){
  1095. if(s.equals(currentTime)){
  1096. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1097. break;
  1098. }
  1099. }
  1100. }
  1101. integral =multiply.intValue();
  1102. logger.info("本次客户所得积分:" + integral);
  1103. break;
  1104. }
  1105. }
  1106. }else if(StringUtils.isNotBlank(integralRuleDetail.getGread()) && integralRuleDetail.getRuleType().equals("2")){ //按应收金额
  1107. if(calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==1 || calculateIntegral.getReceivableAmt().compareTo(integralRuleDetail.getRuleTerms()) ==0){
  1108. BigDecimal divide = null;
  1109. BigDecimal multiply = null;
  1110. if(integralRuleDetail.getGread().equals("0")){
  1111. divide = calculateIntegral.getReceivableAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1112. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1113. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1114. String datePicker = integralRuleList.get(0).getDatePicker();
  1115. switch (datePicker){
  1116. case "1": // 1.按周来
  1117. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1118. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1119. currentTime = String.valueOf(day_Week);
  1120. break;
  1121. case "2": // 2.每月的 多少号
  1122. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1123. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1124. currentTime = String.valueOf(day_month); //当前时间
  1125. break;
  1126. case "3": // 3.固定日期
  1127. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1128. break;
  1129. }
  1130. for (String s : datePickerTimeArray){
  1131. if(s.equals(currentTime)){
  1132. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1133. break;
  1134. }
  1135. }
  1136. }
  1137. integral = multiply.intValue();
  1138. logger.info("本次客户所得积分:" + integral);
  1139. break;
  1140. }else if(integralRuleDetail.getGread().equals(calculateIntegral.getCustomerGrade())){
  1141. divide = calculateIntegral.getReceivableAmt().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1142. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1143. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1144. String datePicker = integralRuleList.get(0).getDatePicker();
  1145. switch (datePicker){
  1146. case "1": // 1.按周来
  1147. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1148. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1149. currentTime = String.valueOf(day_Week);
  1150. break;
  1151. case "2": // 2.每月的 多少号
  1152. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1153. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1154. currentTime = String.valueOf(day_month); //当前时间
  1155. break;
  1156. case "3": // 3.固定日期
  1157. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1158. break;
  1159. }
  1160. for (String s : datePickerTimeArray){
  1161. if(s.equals(currentTime)){
  1162. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1163. break;
  1164. }
  1165. }
  1166. }
  1167. integral = multiply.intValue();
  1168. logger.info("本次客户所得积分:" + integral);
  1169. break;
  1170. }
  1171. }
  1172. }else if(integralRuleDetail.getRuleType().equals("3")){ //按照加油升数
  1173. if(calculateIntegral.getOilLiters().compareTo(integralRuleDetail.getRuleTerms()) ==1 || calculateIntegral.getOilLiters().compareTo(integralRuleDetail.getRuleTerms()) ==0){
  1174. BigDecimal divide = null;
  1175. BigDecimal multiply = null;
  1176. if(integralRuleDetail.getGread().equals("0")){
  1177. divide = calculateIntegral.getOilLiters().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1178. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1179. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1180. String datePicker = integralRuleList.get(0).getDatePicker();
  1181. switch (datePicker){
  1182. case "1": // 1.按周来
  1183. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1184. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1185. currentTime = String.valueOf(day_Week);
  1186. break;
  1187. case "2": // 2.每月的 多少号
  1188. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1189. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1190. currentTime = String.valueOf(day_month); //当前时间
  1191. break;
  1192. case "3": // 3.固定日期
  1193. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1194. break;
  1195. }
  1196. for (String s : datePickerTimeArray){
  1197. if(s.equals(currentTime)){
  1198. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1199. break;
  1200. }
  1201. }
  1202. }
  1203. integral =multiply.intValue();
  1204. logger.info("本次客户所得积分:" + integral);
  1205. break;
  1206. }else if(integralRuleDetail.getGread().equals(calculateIntegral.getCustomerGrade())){
  1207. divide = calculateIntegral.getOilLiters().divide(integralRuleDetail.getSaleAmt(), 0, BigDecimal.ROUND_DOWN);
  1208. multiply = divide.multiply(integralRuleDetail.getIntegral());
  1209. if(integralActivity !=null && integralActivity.equals("1") && datePickerTimeArray !=null && integralProportion !=null){
  1210. String datePicker = integralRuleList.get(0).getDatePicker();
  1211. switch (datePicker){
  1212. case "1": // 1.按周来
  1213. int day_Week = calendar.get(Calendar.DAY_OF_WEEK);
  1214. day_Week= day_Week-1; //减一原因:数据库存的下标从零开始
  1215. currentTime = String.valueOf(day_Week);
  1216. break;
  1217. case "2": // 2.每月的 多少号
  1218. int day_month = calendar.get(Calendar.DAY_OF_MONTH);
  1219. day_month = day_month-1; //减一原因:数据库存的下标从零开始
  1220. currentTime = String.valueOf(day_month); //当前时间
  1221. break;
  1222. case "3": // 3.固定日期
  1223. currentTime =new SimpleDateFormat("yyyy-MM-dd").format(new Date()); //当前时间
  1224. break;
  1225. }
  1226. for (String s : datePickerTimeArray){
  1227. if(s.equals(currentTime)){
  1228. multiply = multiply.multiply(new BigDecimal(integralProportion));
  1229. break;
  1230. }
  1231. }
  1232. }
  1233. integral =multiply.intValue();
  1234. logger.info("本次客户所得积分:" + integral);
  1235. break;
  1236. }
  1237. }
  1238. }
  1239. }
  1240. }
  1241. }
  1242. calculateIntegral.setIntegral(integral);
  1243. }
  1244. return calculateIntegral;
  1245. }
  1246. //插入用户积分信息或者更新用户积分信息
  1247. public CustomerPoints insertUserIntegral(CalculateIntegral calculateIntegral){
  1248. CustomerPoints customerPoints = new CustomerPoints();
  1249. customerPoints.setRecentlyPoints(calculateIntegral.getIntegral()); //用户当前所获得的积分
  1250. customerPoints.setStationId(calculateIntegral.getStationId()); //油站ID
  1251. if(StringUtils.isNotBlank(calculateIntegral.getIntegralRuleFlag()) && calculateIntegral.getIntegralRuleFlag().equals("1")){
  1252. customerPoints.setStationId(calculateIntegral.getGroupId());
  1253. }
  1254. customerPoints.setMinaOpenId(calculateIntegral.getOpenId()); //用户小程序ID
  1255. customerPoints.setCustomerName(calculateIntegral.getNickName());
  1256. if(calculateIntegral.getBlogOpenid() !=null){
  1257. customerPoints.setBlogOpenId(calculateIntegral.getBlogOpenid());
  1258. }
  1259. customerPoints.setUnionId(calculateIntegral.getUnionId()); //用户unionId
  1260. //获取客户积分信息
  1261. CustomerPoints customerPointsInfo = customerPointsService.getCustomerPointsInfoByUnionId(customerPoints);
  1262. if(customerPointsInfo !=null){
  1263. logger.info("当前存在客户:"+ customerPointsInfo.getMinaOpenId());
  1264. logger.info("当前客户原有剩余积分:"+ customerPointsInfo.getPoints().toString());
  1265. CustomerPointsRecord customerPointsRecord = new CustomerPointsRecord();
  1266. customerPointsRecord.setCreateTime(new Date());
  1267. customerPointsRecord.setCustomerName(calculateIntegral.getNickName());
  1268. customerPointsRecord.setStationName(calculateIntegral.getStationName());
  1269. customerPointsRecord.setStationId(calculateIntegral.getStationId());
  1270. customerPointsRecord.setRecordType("+");
  1271. customerPointsRecord.setUnionId(customerPointsInfo.getUnionId());
  1272. customerPointsRecord.setIntegral(calculateIntegral.getIntegral());
  1273. customerPointsRecord.setOrderNo(calculateIntegral.getOrderNo());
  1274. //插入客户记录表
  1275. customerPointsRecordService.insertCustomerPointsRecordInfo(customerPointsRecord);
  1276. //如果已存在客户则 客户余额积分= 当前客户已有积分 + 本次所得积分
  1277. BigDecimal surplusIntegral =new BigDecimal(customerPointsInfo.getPoints()).add(new BigDecimal(calculateIntegral.getIntegral()));
  1278. customerPoints.setPoints(surplusIntegral.intValue());
  1279. logger.info("本次加油后客户应有总积分:"+ customerPoints.getPoints().toString());
  1280. //用户已累积积分
  1281. BigDecimal add = new BigDecimal(customerPointsInfo.getAccumulatePoints()).add(new BigDecimal(calculateIntegral.getIntegral()));
  1282. customerPoints.setAccumulatePoints(add.intValue());
  1283. customerPoints.setRecentConsumptionDate(new Date());
  1284. //更新客户积分
  1285. customerPointsService.updateCustomerPointsInfo(customerPoints);
  1286. logger.info("更新客户积分信息成功!");
  1287. }else {
  1288. logger.info("当前系统不存在该客户积分信息");
  1289. CustomerPointsRecord customerPointsRecord = new CustomerPointsRecord();
  1290. customerPointsRecord.setCreateTime(new Date());
  1291. customerPointsRecord.setCustomerName(calculateIntegral.getNickName());
  1292. customerPointsRecord.setStationName(calculateIntegral.getStationName());
  1293. customerPointsRecord.setStationId(calculateIntegral.getStationId());
  1294. customerPointsRecord.setRecordType("+");
  1295. customerPointsRecord.setUnionId(calculateIntegral.getUnionId());
  1296. customerPointsRecord.setIntegral(calculateIntegral.getIntegral());
  1297. customerPointsRecord.setOrderNo(calculateIntegral.getOrderNo());
  1298. customerPointsRecordService.insertCustomerPointsRecordInfo(customerPointsRecord);
  1299. customerPoints.setUnionId(calculateIntegral.getUnionId());
  1300. customerPoints.setPoints(calculateIntegral.getIntegral());
  1301. customerPoints.setConsumptionPoints(0);
  1302. customerPoints.setMobilePhone(calculateIntegral.getMobilePhone());
  1303. customerPoints.setCustomerName(calculateIntegral.getNickName());
  1304. customerPoints.setStationName(calculateIntegral.getStationName());
  1305. customerPoints.setAccumulatePoints(calculateIntegral.getIntegral());
  1306. customerPoints.setInvalidPoints(0);
  1307. customerPoints.setRecentConsumptionDate(new Date());
  1308. customerPoints.setCreateTime(new Date());
  1309. //新增客户积分
  1310. customerPointsService.insertCustomerPointsInfo(customerPoints);
  1311. logger.info("新增客户积分信息成功!");
  1312. }
  1313. return customerPoints;
  1314. }
  1315. //公众号推送积分
  1316. public void pushIntegral(CustomerPoints customerPoints, CalculateIntegral calculateIntegral){
  1317. String gzhAppId ="";
  1318. String gzhAppSecret ="";
  1319. String stationName = ""; //油站名称
  1320. logger.info("客户小程序openId:" + customerPoints.getMinaOpenId());
  1321. logger.info("客户公众号openId:" + calculateIntegral.getBlogOpenid());
  1322. logger.info("客户所加油的油站ID:" + calculateIntegral.getStationId());
  1323. if(calculateIntegral.getStationId() !=null){
  1324. Map<String, String> m = stationService.getStationAppIdAndAppSecret(calculateIntegral.getStationId());
  1325. if(m !=null && m.containsKey("stationName") && m.containsKey("gzhAppId") && m.containsKey("gzhAppSecret")){
  1326. stationName = m.get("stationName");
  1327. gzhAppId = m.get("gzhAppId");
  1328. gzhAppSecret = m.get("gzhAppSecret");
  1329. }
  1330. //String blogOpenId = customerPoints.getBlogOpenId(); //公众号openId
  1331. if(calculateIntegral.getBlogOpenid() !=null){
  1332. //推送模板
  1333. List<WxMpTemplateData> wxMpTemplate = new ArrayList<>();
  1334. wxMpTemplate.add(new WxMpTemplateData("first","尊敬的"+calculateIntegral.getNickName()+",您好:\n" + "您在"+stationName+"的积分最新交易信息如下"));
  1335. wxMpTemplate.add(new WxMpTemplateData("time", new SimpleDateFormat("yyyy年MM月dd日HH时mm分").format(new Date())));
  1336. wxMpTemplate.add(new WxMpTemplateData("type", "增加"));
  1337. wxMpTemplate.add(new WxMpTemplateData("Point", String.valueOf(customerPoints.getRecentlyPoints())));
  1338. wxMpTemplate.add(new WxMpTemplateData("From", stationName));
  1339. wxMpTemplate.add(new WxMpTemplateData("remark",
  1340. "截止至" + new SimpleDateFormat(" yyyy年MM月dd日HH时mm分").format(new Date())+",您在"+stationName+"的可用积分为 "+customerPoints.getPoints().toString()+" 分"));
  1341. GzhNewsTemplate gzhNewsTemplate = new GzhNewsTemplate();
  1342. gzhNewsTemplate.setStationId(calculateIntegral.getStationId());
  1343. gzhNewsTemplate.setTemplateType("1");
  1344. GzhNewsTemplate gzhNewsTemplateInfo = gzhNewsTemplateService.getGzhNewsTemplate(gzhNewsTemplate);
  1345. if(gzhNewsTemplateInfo !=null && gzhNewsTemplateInfo.getTemplateId() !=null){
  1346. wxPushUtil.push(gzhAppId, gzhAppSecret, gzhNewsTemplateInfo.getTemplateId(), calculateIntegral.getBlogOpenid(), wxMpTemplate);
  1347. }
  1348. }
  1349. }
  1350. }
  1351. @RequestMapping(value = "/posPrintReceiptCeshi", consumes = "application/json", method = RequestMethod.POST)
  1352. @ResponseBody
  1353. public String posPrintReceiptCeshi(@RequestBody PayOrder payOrder){
  1354. Gson gson =new Gson();
  1355. //返回结果集
  1356. ResultData resultData = null;
  1357. Map<String, Object> infoMap = payOrderService.getOrderInfoAndUserInfoByOrderNo(payOrder);
  1358. Map<String, Object> m = new HashMap<>();
  1359. if(payOrder.getTransactionId() !=null){
  1360. m.put("transactionId", payOrder.getTransactionId());
  1361. }
  1362. if(payOrder.getIntegral() !=null){
  1363. m.put("integral", payOrder.getIntegral());
  1364. }
  1365. if(infoMap !=null && infoMap.containsKey("orderNo") && infoMap.get("orderNo") !=null){
  1366. m.put("orderNo", infoMap.get("orderNo").toString());
  1367. }
  1368. if(infoMap !=null && infoMap.containsKey("amt") && infoMap.get("amt") !=null){
  1369. m.put("amt", infoMap.get("amt").toString());
  1370. }
  1371. if(infoMap !=null && infoMap.containsKey("receivableAmt") && infoMap.get("receivableAmt") !=null){
  1372. m.put("receivableAmt", infoMap.get("receivableAmt").toString());
  1373. }
  1374. if(infoMap !=null && infoMap.containsKey("discountAmt") && infoMap.get("discountAmt") !=null){
  1375. m.put("discountAmt", infoMap.get("discountAmt").toString());
  1376. }
  1377. if(infoMap !=null && infoMap.containsKey("oilName") && infoMap.get("oilName") !=null){
  1378. m.put("oilName", infoMap.get("oilName").toString());
  1379. }
  1380. if(infoMap !=null && infoMap.containsKey("oilGun") && infoMap.get("oilGun") !=null){
  1381. m.put("oilGun", infoMap.get("oilGun").toString());
  1382. }
  1383. if(infoMap !=null && infoMap.containsKey("createdDate") && infoMap.get("createdDate") !=null){
  1384. //格式化日期
  1385. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1386. String createdDate = sdf.format(infoMap.get("createdDate"));
  1387. m.put("createdDate", createdDate);
  1388. }
  1389. if(infoMap !=null && infoMap.containsKey("payDate") && infoMap.get("payDate") !=null){
  1390. //格式化日期
  1391. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  1392. String payDate = sdf.format(infoMap.get("payDate"));
  1393. m.put("payDate", payDate);
  1394. }
  1395. if(infoMap !=null && infoMap.containsKey("payType") && infoMap.get("payType") !=null){
  1396. String payType = "";
  1397. if(infoMap.get("payType").equals("wx")){
  1398. payType ="微信";
  1399. }
  1400. if(infoMap.get("payType").equals("dzk")){
  1401. payType ="电子卡";
  1402. }
  1403. m.put("payType", payType);
  1404. }
  1405. if(infoMap !=null && infoMap.containsKey("mobilePhone") && infoMap.get("mobilePhone") !=null){
  1406. String phone =infoMap.get("mobilePhone")+"";
  1407. //手机号中间四位****代替
  1408. phone = phone.substring(0, 3) + "****" + phone.substring(7, phone.length());
  1409. m.put("mobilePhone", phone);
  1410. }
  1411. if(infoMap !=null && infoMap.containsKey("orderLiters") && infoMap.get("orderLiters") !=null){
  1412. m.put("orderLiters", infoMap.get("orderLiters").toString());
  1413. }
  1414. if(infoMap !=null && infoMap.containsKey("stationName") && infoMap.get("stationName") !=null){
  1415. m.put("stationName", infoMap.get("stationName").toString());
  1416. }
  1417. if(infoMap !=null && infoMap.containsKey("oilPirce") && infoMap.get("oilPirce") !=null){
  1418. m.put("oilPirce", infoMap.get("oilPirce").toString());
  1419. }
  1420. if(infoMap !=null && infoMap.containsKey("stationId") && infoMap.get("stationId") !=null){
  1421. m.put("stationId", infoMap.get("stationId").toString());
  1422. }
  1423. // if(infoMap !=null && infoMap.containsKey("orderType") && infoMap.get("orderType") !=null){
  1424. // m.put("orderType", infoMap.get("orderType").toString());
  1425. // }
  1426. if(infoMap !=null && infoMap.containsKey("oilType") && infoMap.get("oilType") !=null){
  1427. if(infoMap.get("oilType").equals("3")){
  1428. m.put("orderType", "noOil");
  1429. }else {
  1430. m.put("orderType", "oil");
  1431. }
  1432. }
  1433. logger.info("要推送的订单的信息:" +m.toString());
  1434. //定义推送格式
  1435. Map<String, Object> params = new HashMap<>();
  1436. params.put("messageTitle", "pos");
  1437. params.put("messageType", "sys");
  1438. //获取油枪绑定的POS机信息
  1439. StationDeviceManager stationDeviceManager = new StationDeviceManager();
  1440. stationDeviceManager.setDeviceType("2");
  1441. stationDeviceManager.setStationId(Integer.valueOf(infoMap.get("stationId").toString()));
  1442. stationDeviceManager.setGunNo(infoMap.get("oilGun").toString());
  1443. StationDeviceManager stationDeviceManagerInfo = stationService.getStationDeviceManager(stationDeviceManager);
  1444. if(stationDeviceManagerInfo !=null && stationDeviceManagerInfo.getPosFanoutExchange() !=null && stationDeviceManagerInfo.getPosQueue() !=null){
  1445. params.put("posFanoutExchange", stationDeviceManagerInfo.getPosFanoutExchange());
  1446. params.put("posQueue", stationDeviceManagerInfo.getPosQueue());
  1447. params.put("tusn", stationDeviceManagerInfo.getDeviceNo());
  1448. params.put("printSetting", payOrder.getPrintSetting()); //小票打印方式
  1449. List<Map<String, Object>> list = new ArrayList<>();
  1450. list.add(m);
  1451. Map<String, Object> map = new HashMap<>();
  1452. map.put("contentData", list);
  1453. params.put("messageContent", map);
  1454. logger.info("开始推送消息:" +JSONObject.toJSONString(params));
  1455. String resultString = PosPrinterUtil.sendPosPrintDirectMessage(params);
  1456. JSONObject jsonObject = JSONObject.parseObject(resultString);
  1457. if(jsonObject.containsKey("code") && jsonObject.get("code").toString().equals("200")){
  1458. //如果打印成功 添加小票数量
  1459. PayOrder p = new PayOrder();
  1460. p.setPrintCount(1);
  1461. p.setOrderNo(infoMap.get("orderNo").toString());
  1462. payOrderService.getUpdatePayOrder(p);
  1463. }
  1464. }
  1465. return gson.toJson(resultData);
  1466. }
  1467. }