fs-danaus
2023-03-28 7edaee1fa63cc39a026743dfe469313afd8fa16f
提交 | 用户 | age
a6a76f 1 package com.yc.api.controller;
F 2
3 import com.abc.pay.client.Base64;
4 import com.abc.pay.client.Constants;
5 import com.abc.pay.client.JSON;
6 import com.abc.pay.client.ebus.PaymentRequest;
7 import com.abc.pay.client.ebus.PaymentResult;
8 import com.abc.pay.client.ebus.QueryOrderRequest;
b1f69b 9 import com.yc.abc.utils.AbcMerchantConfig;
a6a76f 10 import com.yc.action.BaseAction;
6b5cd5 11 import com.yc.action.grid.GTGrid;
a6a76f 12 import com.yc.action.panval.PanelCommitAction;
3d9f25 13 import com.yc.api.bean.MatGroupEntity;
F 14 import com.yc.api.bean.ProducParmBean;
15 import com.yc.api.bean.T120330;
a6a76f 16 import com.yc.api.service.LuJiangNanServiceIfc;
F 17 import com.yc.api.service.QrServiceIfc;
18 import com.yc.entity.DataSourceEntity;
19 import com.yc.exception.ApplicationException;
20 import com.yc.exception.CallBackMessage;
21 import com.yc.factory.FactoryBean;
22 import com.yc.multiData.MultiDataSource;
23 import com.yc.multiData.SpObserver;
24 import com.yc.sdk.shopping.entity.MatCodeEntity;
25 import com.yc.sdk.shopping.service.*;
26 import com.yc.sdk.shopping.service.PrepaidDeposit.PrepaidDepositIfc;
27 import com.yc.sdk.shopping.service.imagedata.ShoppingImageDataIfc;
28 import com.yc.sdk.shopping.service.share.ShareIfc;
3dbec0 29 import com.yc.sdk.shopping.util.SettingKey;
a6a76f 30 import com.yc.service.build.type.T_22_Ifc;
F 31 import com.yc.utils.SessionKey;
32 import org.apache.commons.lang3.StringUtils;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35 import org.springframework.beans.factory.annotation.Autowired;
36 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
37 import org.springframework.web.bind.annotation.*;
38 import org.springframework.web.context.request.async.WebAsyncTask;
39
40 import javax.servlet.http.HttpServletRequest;
41 import javax.servlet.http.HttpServletResponse;
6b5cd5 42 import javax.servlet.http.HttpSession;
a6a76f 43 import java.math.BigDecimal;
F 44 import java.time.LocalDate;
45 import java.time.LocalTime;
46 import java.time.format.DateTimeFormatter;
47 import java.util.*;
48 import java.util.concurrent.Callable;
49 import java.util.concurrent.TimeUnit;
50 import java.util.stream.Collectors;
51
52
53 /**
54  * 卤江南
55  */
56 @RestController
57 public class LuJiangNanController extends BaseAction {
58     protected final Logger log = LoggerFactory.getLogger(this.getClass());
59
60     @Autowired
61     ShoppingImageDataIfc imgData;
62     @Autowired
63     SettingIfc settingIfc;
64
65     // 价格
66     @Autowired
67     MatPriceIfc matPriceIfc;
68
69     // 货币
70     @Autowired
71     CurrencyIfc currencyIfc;
72
73     // 商品资料
74     @Autowired
75     MatCodeIfc matCodeIfc;
76
77     // 商品附加图片信息
78     @Autowired
79     MatCodeImageIfc matCodeImageIfc;
80
81     // 商品选项
82     @Autowired
83     MatOptionIfc matOptionIfc;
84
85
86     // 消费积份
87     @Autowired
88     MatPointsIfc matPointsIfc;
89
90     // 商品促销活动关联表
91     @Autowired
92     MatDiscountIfc matDiscountIfc;
93
94     // 选项
95     @Autowired
96     MatComponentIfc matComponentIfc;
97
98     // 显示分享信息
99     @Autowired
100     ShareIfc shareIfc;
101
102     // 选项属性
103     @Autowired
104     MatAttrIfc matAttrIfc;
105     //优惠劵
106     @Autowired
107     CouponIfc couponIfc;
108
109     //预付订金分组
110     @Autowired
111     PrepaidDepositIfc prepaidDepositIfc;
112
113     @Autowired
114     T_22_Ifc t22ifc;
115     @Autowired
116     LuJiangNanServiceIfc luJiangNanServiceIfc;
117     @Autowired
118     QrServiceIfc qrServiceIfc;
119     @Autowired
120     ThreadPoolTaskExecutor threadPoolExecutor;
121 //---------------下单模块-------------------------------
bfe31e 122 private class ProductCallable implements Callable<Object> {
F 123     ProducParmBean producParmBean;
124     HttpServletRequest request;
125     String dbid;
126     LuJiangNanServiceIfc luJiangNanServiceIfc;
127     ShoppingImageDataIfc imgData;
128     int actionType=0;//1,取分类 2,取列表
a6a76f 129
bfe31e 130
F 131     public ProductCallable(HttpServletRequest request,ProducParmBean producParmBean,String dbid, LuJiangNanServiceIfc luJiangNanServiceIfc,ShoppingImageDataIfc imgData,int actionType) {
132         this.producParmBean = producParmBean;
133         this.dbid = dbid;
134         this.luJiangNanServiceIfc = luJiangNanServiceIfc;
135         this.actionType=actionType;
136         this.request=request;
137         this.imgData=imgData;
138     }
139
140     @Override
141     public Object call() throws Exception {
142         CallBackMessage callBackMessage = new CallBackMessage();
143         try {
144             SpObserver.setDBtoInstance("_" + dbid);
145
146             Map nodes = new HashMap();
147             List<MatCodeEntity> matCodeEntityList=new ArrayList<>();
6b5cd5 148             GTGrid gtGrid =(GTGrid)FactoryBean.getBean("GTGrid");
F 149             final HttpSession session = request.getSession();
3dbec0 150             String hostUrl = SettingKey.getHostUrlForImage(request);
F 151
6b5cd5 152             //数据组权限
3dbec0 153             switch (actionType) {
bfe31e 154                 case 1:
6b5cd5 155                     final String dataGroupInfo = gtGrid.getDataGroupInfo(110501, session.getAttribute(SessionKey.USERCODE) + "", 0, session);
3dbec0 156                     final List<MatGroupEntity> groups = luJiangNanServiceIfc.getMatGroups(dataGroupInfo);
bfe31e 157                     List<Map> groupList = new ArrayList();
F 158                     String matgourpId = null;
3dbec0 159                     List<MatGroupEntity> mainGroup = groups.stream().filter(x -> (
F 160                             x.getParentRowid() == null || x.getParentRowid().equals(""))
161                     ).collect(Collectors.toList());
162                     if (mainGroup != null && mainGroup.size() > 0) {
163                         for (MatGroupEntity matGroupEntity : mainGroup) {
164                             Map matGroup = new HashMap();
165                             //1级分类
166                             matGroup.put("MatGroupName", matGroupEntity.getMatGroupName());
167                             matGroup.put("MatGroup", matGroupEntity.getMatGroup());
168                             if (matgourpId == null) {
169                                 matgourpId = matGroupEntity.getMatGroup();
170                             }
171                             //2级分类
172
173                             List<MatGroupEntity> subMatGroupList = groups.stream().filter(x -> (
3d9f25 174                                     matGroupEntity.getRowid().equals(x.getParentRowid())
3dbec0 175                             )).collect(Collectors.toList());
F 176                             List<Map> subList = new ArrayList<>();
177                             if(subMatGroupList!=null&&subMatGroupList.size()>0) {
178                                 subMatGroupList.stream().forEach(x -> {
179                                     Map subMap = new HashMap();
180                                     subMap.put("SubMatGroupName", x.getMatGroupName());
181                                     subMap.put("SubMatGroup", x.getMatGroup());
182                                     subList.add(subMap);
183                                 });
184                             }
185                             matGroup.put("subList", subList);
186                             groupList.add(matGroup);
bfe31e 187                         }
3dbec0 188                         ProducParmBean parmBean = new ProducParmBean();
F 189                         parmBean.setMatGroup(matgourpId);
190 //                    final String dataGroupInfoByMatGroup = gtGrid.getDataGroupInfo(110503, session.getAttribute(SessionKey.USERCODE) + "", 0, session);
191                         parmBean.setAppSalesOrderMatCodeList(Integer.parseInt(String.valueOf(request.getSession().getAttribute(SessionKey.APP_SALESORDER_MATCODE_LIST))));
192                         matCodeEntityList = luJiangNanServiceIfc.getMatCodesByMatGroup(parmBean, request.getSession().getAttribute(SessionKey.USERCODE) + "", dataGroupInfo);
193                         //用PhotoPathUrl代替PhotoPath输出图片Url
194 //                    matCodeEntityList.stream().map(x -> {
195 //                        x.setPhotoPath(imgData.getImageUrl(x.getPhotoPath(), 120,
196 //                                120, false,
197 //                                false, request));
198 //                        return x;
199 //                    }).collect(Collectors.toList());
200                         matCodeEntityList.stream().forEach(x -> {
201                             x.setPhotoPath(SettingKey.getUrl(hostUrl, x.getPhotoPathUrl(), dbid+"",null));
202                             x.setPhotoPathUrl(SettingKey.getUrl(hostUrl, x.getPhotoPathUrl(), dbid+"",null));
203                         });
204                         nodes.put("nodes", groupList);
205                         nodes.put("data", matCodeEntityList);
206                         //控制 下单列表 的“样式”  , AppSalesOrderStyle  :  0.商城图文式,  1.表格式(卤江南样式)
207                         nodes.put("appSalesOrderStyle", request.getSession().getAttribute(SessionKey.APP_SALESORDER_STYLE));
208                         callBackMessage.setInfo(nodes);
209                     }
210                         break;
211                         case 2:
212                             final String dataGroupInfoByMatGroup2 = gtGrid.getDataGroupInfo(110503, session.getAttribute(SessionKey.USERCODE) + "", 0, session);
213                             final Object appSalesorderMatcodeList = session.getAttribute(SessionKey.APP_SALESORDER_MATCODE_LIST);
214                             int appSalesorderMatcodeInt = 0;
215                             if (appSalesorderMatcodeList != null) {
216                                 appSalesorderMatcodeInt = Integer.parseInt(String.valueOf(appSalesorderMatcodeList));
217                             }
218                             producParmBean.setAppSalesOrderMatCodeList(appSalesorderMatcodeInt);
219                             matCodeEntityList = luJiangNanServiceIfc.getMatCodesByMatGroup(this.producParmBean, session.getAttribute(SessionKey.USERCODE) + "", dataGroupInfoByMatGroup2);
220                             //用PhotoPathUrl代替PhotoPath输出图片Url
221                     matCodeEntityList.stream().forEach(x -> {
222                         x.setPhotoPath(SettingKey.getUrl(hostUrl, x.getPhotoPathUrl(), dbid+"",null));
223                         x.setPhotoPathUrl(SettingKey.getUrl(hostUrl, x.getPhotoPathUrl(), dbid+"",null));
224                     });
225                             callBackMessage.setInfo(matCodeEntityList);
226                             break;
bfe31e 227                     }
F 228
229             callBackMessage.sendSuccessMessageByDefault();
230             return callBackMessage.toJSONObject();
231         } catch (Exception ex) {
232             callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
233             return callBackMessage.toJSONObject();
234         } finally {
235             SpObserver.setDBtoInstance();
236         }
237     }
238 }
a6a76f 239     /**
F 240      * 商品分类显示
241      *
242      * @param request
243      * @param response
244      */
245     @RequestMapping(value = "/lujn/matGroups.do", method = RequestMethod.GET)
246     @CrossOrigin
247     public @ResponseBody
bfe31e 248     WebAsyncTask matGroups(HttpServletRequest request, HttpServletResponse response) {
F 249         Callable<Object> callable = new ProductCallable(request, null, request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + "",luJiangNanServiceIfc,imgData,1);
250         //定义超时45秒
251         WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(45), threadPoolExecutor, callable);
252         asyncTask.onCompletion(
253                 () -> log.info("执行成功")
254         );
255         asyncTask.onError(
256                 (Callable<Object>) () -> {
257                     CallBackMessage callBackMessage = new CallBackMessage();
258                     log.info("执行出错");
259                     callBackMessage.sendErrorMessage("操作出错");
260                     return callBackMessage.toJSONObject();
a6a76f 261                 }
bfe31e 262         );
F 263         asyncTask.onTimeout(
264                 (Callable<Object>) () -> {
265                     CallBackMessage callBackMessage = new CallBackMessage();
266                     log.info("执行超时");
267                     callBackMessage.sendErrorMessage("服务器繁忙,正在排队处理,请不要重复提交", -1003);
268                     return callBackMessage.toJSONObject();
269                 }
270         );
271         return asyncTask;
272
273
a6a76f 274     }
F 275
276     /**
277      * 商品列表显示
278      *
279      * @param request
280      * @param response
281      */
282     @RequestMapping(value = "/lujn/productList.do", method = RequestMethod.POST)
283     @CrossOrigin
284     public @ResponseBody
bfe31e 285     WebAsyncTask productList(@RequestBody ProducParmBean producParmBean, HttpServletRequest request, HttpServletResponse response) {
F 286         Callable<Object> callable = new ProductCallable(request, producParmBean, request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + "",luJiangNanServiceIfc,imgData,2);
287         //定义超时45秒
288         WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(45), threadPoolExecutor, callable);
289         asyncTask.onCompletion(
290                 () -> log.info("执行成功")
291         );
292         asyncTask.onError(
293                 (Callable<Object>) () -> {
294                     CallBackMessage callBackMessage = new CallBackMessage();
295                     log.info("执行出错");
296                     callBackMessage.sendErrorMessage("操作出错");
297                     return callBackMessage.toJSONObject();
298                 }
299         );
300         asyncTask.onTimeout(
301                 (Callable<Object>) () -> {
302                     CallBackMessage callBackMessage = new CallBackMessage();
303                     log.info("执行超时");
304                     callBackMessage.sendErrorMessage("服务器繁忙,正在排队处理,请不要重复提交", -1003);
305                     return callBackMessage.toJSONObject();
306                 }
307         );
308         return asyncTask;
a6a76f 309     }
F 310
311     private class T120201Callable implements Callable<Object> {
312         List<MatCodeEntity> matCodeEntities;
313         String cltCode;
314         String dbid;
315         LuJiangNanServiceIfc luJiangNanServiceIfc;
316
317         public T120201Callable(List<MatCodeEntity> matCodeEntities, String cltCode, String dbid, LuJiangNanServiceIfc luJiangNanServiceIfc) {
318             this.matCodeEntities = matCodeEntities;
319             this.cltCode = cltCode;
320             this.dbid = dbid;
321             this.luJiangNanServiceIfc = luJiangNanServiceIfc;
322         }
323
324         @Override
325         public Object call() throws Exception {
326             CallBackMessage callBackMessage = new CallBackMessage();
327             long startTime = System.currentTimeMillis();
328             try {
329                 SpObserver.setDBtoInstance("_" + dbid);
330                 if (matCodeEntities == null || matCodeEntities.size() == 0) {
331                     throw new ApplicationException("没有商品,不能下单");
332                 }
333                 Map map = luJiangNanServiceIfc.save120201(matCodeEntities, cltCode);
334                 log.info("cltCode:" + cltCode + "-客户:" + cltCode + "下单花费:" + (System.currentTimeMillis() - startTime));
335                 callBackMessage.setInfo(map);
336                 callBackMessage.sendSuccessMessageByDefault();
337                 return callBackMessage.toJSONObject();
338             } catch (Exception ex) {
339                 log.info("cltCode:" + cltCode + "-客户下单出错:" + cltCode + "花费:" + (System.currentTimeMillis() - startTime));
340                 callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
341                 return callBackMessage.toJSONObject();
342             } finally {
343                 SpObserver.setDBtoInstance();
344                 log.info("---------------------end:" + cltCode + "-----------------");
345             }
346         }
347     }
348
349     /**
350      * 异步模式,保存订单
351      *
352      * @param request
353      */
354     @RequestMapping(value = "/lujn/save120201.do", method = RequestMethod.POST)
355     @CrossOrigin
356     public @ResponseBody
357     WebAsyncTask save120201(@RequestBody List<MatCodeEntity> matCodeEntities, HttpServletRequest request) {
358         String cltCode = request.getSession().getAttribute(SessionKey.HRCODE) + "";
359         log.info("---------------------start:" + cltCode + "-----------------");
360         Callable<Object> callable = new T120201Callable(matCodeEntities, cltCode, request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + "", luJiangNanServiceIfc);
361         //定义超时45秒
362         WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(45), threadPoolExecutor, callable);
363         asyncTask.onCompletion(
364                 () -> log.info("执行成功")
365         );
366         asyncTask.onError(
367                 (Callable<Object>) () -> {
368                     CallBackMessage callBackMessage = new CallBackMessage();
369                     log.info("执行出错");
370                     callBackMessage.sendErrorMessage("执行出错,请重新下单");
371                     return callBackMessage.toJSONObject();
372                 }
373         );
374         asyncTask.onTimeout(
375                 (Callable<Object>) () -> {
376                     CallBackMessage callBackMessage = new CallBackMessage();
377                     log.info("执行超时");
378                     callBackMessage.sendErrorMessage("服务器繁忙,正在排队处理,请不要重复提交,稍后请在【销售管理】-【销售订单】-【查询订单进度表】中查看结果", -1003);
379                     return callBackMessage.toJSONObject();
380                 }
381         );
382         return asyncTask;
383     }
384
385
386     //-----------------支付模块------------------
387
388     /**
389      * 单笔支付查询
390      * 查询120330
391      *
392      * @param request
393      */
394     @RequestMapping(value = "/lujn/queryOrder.do")
395     @CrossOrigin
396     public @ResponseBody
397     WebAsyncTask queryOrder(String docCode, HttpServletRequest request,HttpServletResponse response) {
398         boolean isAppPost=request.getHeader("x-app-type")==null?false:true;
399         //---web端调用
400         if (!isAppPost) {
401             CallBackMessage callBackMessage = new CallBackMessage();
402             try {
403                 DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap(request);
404                 SpObserver.setDBtoInstance("_" + dataSourceEntity.getDbId());//切换数据源
405                 //获取 参数集 map
406                 Map<String, String>  map = t22ifc.getParamMap(request);
407                 docCode=map.get("docCode");
408             } catch (Exception e) {
409                 e.printStackTrace();
410                 this.print(response, callBackMessage.sendErrorMessage(e.getCause() != null ? e.getCause().getMessage() : e.getMessage()));
411                 return null;
412             } finally {
413                 SpObserver.setDBtoInstance();
414             }
415         }
416         Callable<Object> callable = new QueryOrderCallable(docCode, request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + "", luJiangNanServiceIfc,isAppPost);
417         //定义超时45秒
418         WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(45), threadPoolExecutor, callable);
419
420         asyncTask.onError(
421                 (Callable<Object>) () -> {
422                     CallBackMessage callBackMessage = new CallBackMessage();
423                     callBackMessage.sendErrorMessage("执行出错,请重新提交");
424                     return callBackMessage.toJSONObject();
425                 }
426         );
427         asyncTask.onTimeout(
428                 (Callable<Object>) () -> {
429                     CallBackMessage callBackMessage = new CallBackMessage();
430                     callBackMessage.sendErrorMessage("服务器繁忙,请稍候查询", -1003);
431                     return callBackMessage.toJSONObject();
432                 }
433         );
434         return asyncTask;
435     }
436
437     private class QueryOrderCallable implements Callable<Object> {
438
439         String orderNo;
440         String dbid;
441         LuJiangNanServiceIfc luJiangNanServiceIfc;
442 boolean isAppCall;
443         public QueryOrderCallable(String orderNo, String dbid, LuJiangNanServiceIfc luJiangNanServiceIfc,boolean isAppCall) {
444             this.orderNo = orderNo;
445             this.dbid = dbid;
446             this.luJiangNanServiceIfc = luJiangNanServiceIfc;
447             this.isAppCall=isAppCall;
448         }
449
450         @Override
451         public Object call() throws Exception {
452             CallBackMessage callBackMessage = new CallBackMessage();
453             try {
454                 SpObserver.setDBtoInstance("_" + dbid);
455                 QueryOrderRequest tQueryRequest = new QueryOrderRequest();
456                 tQueryRequest.queryRequest.put("PayTypeID", Constants.PAY_TYPE_DIRECTPAY);    //设定交易类型
457                 tQueryRequest.queryRequest.put("OrderNo", orderNo);    //设定订单编号 (必要信息)
458                 tQueryRequest.queryRequest.put("QueryDetail", "1");//设定查询方式
459                 JSON json = tQueryRequest.postRequest();
460                 String ReturnCode = json.GetKeyValue("ReturnCode");
461                 String ErrorMessage = json.GetKeyValue("ErrorMessage");
462                 //成功
463                 if (ReturnCode.equals("0000")) {
464                     String orderInfo = json.GetKeyValue("Order");
465                     Base64 tBase64 = new Base64();
466                     String orderDetail = new String(tBase64.decode(orderInfo));
467                     json.setJsonString(orderDetail);
468                     //支付成功才写执行
469                     if ("04".equalsIgnoreCase(json.GetKeyValue("Status"))) {
470                         //--插入日志表
471                         luJiangNanServiceIfc.save150172LogByQuery(json);
472                         luJiangNanServiceIfc.save150171ByQueryOrder(json);
473                     }
474                     Map info = new HashMap();
475                     info.put("code", json.GetKeyValue("Status"));
476                     info.put("status", getOrderStatus(json.GetKeyValue("Status")));
477                     callBackMessage.setInfo(info);
478                     callBackMessage.sendSuccessMessageByDefault();
479                     if(isAppCall) {
480                         return callBackMessage.toJSONObject();
481                     }else {
482                         return callBackMessage.print();
483                     }
484                 } else {
485                     throw new ApplicationException(ReturnCode + "-" + ErrorMessage);
486                 }
487             } catch (Exception ex) {
488                 callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
489                 if(isAppCall) {
490                     return callBackMessage.toJSONObject();
491                 }else {
492                     return callBackMessage.print();
493                 }
494             } finally {
495                 SpObserver.setDBtoInstance();
496             }
497         }
498     }
499
500     /**
501      * 01:未支付
502      * 02:无回应
503      * 03:微信和支付宝支付成功
504      * 04:选择微信、支付宝支付时,表示农行清算成功;
505      * 选择我行支付通道支付时,表示农行支付成功
506      * 05:已退款
507      * 07:授权确认成功
508      * 00:授权已取消
509      * 99:失败
510      */
511     private String getOrderStatus(String status) {
512         switch (status) {
513             case "01":
514                 return "未支付";
515             case "02":
516                 return "无回应";
517             case "03":
518                 return "微信和支付宝支付成功";
519             case "04":
520                 return "支付成功";
521             case "05":
522                 return "已退款";
523             case "07":
524                 return "授权确认成功";
525             case "00":
526                 return "授权已取消";
527             default:
528                 return "失败";
529         }
530
531     }
532
533     /**
534      * 支付通知结果
535      *
536      * @param request
537      */
538     @RequestMapping(value = "/lujn/orderPayCallback.do")
539     @CrossOrigin
540     public @ResponseBody
541     WebAsyncTask orderPayCallback(HttpServletRequest request) {
542         Callable<Object> callable = new OrderPayCallable(request.getParameter("MSG"), luJiangNanServiceIfc);
543         //定义超时45秒
544         WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(45), threadPoolExecutor, callable);
545
546         asyncTask.onError(
547                 (Callable<Object>) () -> {
548                     CallBackMessage callBackMessage = new CallBackMessage();
549                     callBackMessage.sendErrorMessage("执行出错,请重新提交");
550                     return callBackMessage.toJSONObject();
551                 }
552         );
553         asyncTask.onTimeout(
554                 (Callable<Object>) () -> {
555                     CallBackMessage callBackMessage = new CallBackMessage();
556                     callBackMessage.sendErrorMessage("服务器繁忙,请不要重复提交,稍候在支付结果中查询结果", -1003);
557                     return callBackMessage.toJSONObject();
558                 }
559         );
560         return asyncTask;
561     }
562
563     private class OrderPayCallable implements Callable<Object> {
564
565         String msg;
566         LuJiangNanServiceIfc luJiangNanServiceIfc;
567
568         public OrderPayCallable(String msg, LuJiangNanServiceIfc luJiangNanServiceIfc) {
569             this.msg = msg;
570             this.luJiangNanServiceIfc = luJiangNanServiceIfc;
571         }
572
573         @Override
574         public Object call() throws Exception {
575             CallBackMessage callBackMessage = new CallBackMessage();
576             PaymentResult paymentResult = null;
577             try {
578                 log.info("msg:" + msg);
579                 paymentResult = new PaymentResult(msg);
580                 log.info("orderNo:" + paymentResult.getValue("OrderNo"));
581                 log.info("ResponseMessage:" + paymentResult.getResponseMessage());
582             } catch (Exception e) {
583                 e.printStackTrace();
584                 log.info("PaymentResultErrorMessage:" + e.getCause() != null ? e.getCause().getMessage() : e.getMessage());
585                 throw new ApplicationException(e.getCause() != null ? e.getCause().getMessage() : e.getMessage());
586             }
587             try {
588                 SpObserver.setDBtoInstance("_" + paymentResult.getValue("MerchantRemarks"));
589                 //--插入日志表
590                 luJiangNanServiceIfc.save150172Log(paymentResult);
591                 //保存支付结果日志及执行150171确认过账
592                 luJiangNanServiceIfc.save150171ByCallBack(paymentResult);
593                 log.info("执行完成150171过账");
594                 callBackMessage.sendSuccessMessageByDefault();
595                 return callBackMessage.toJSONObject();
596             } catch (Exception ex) {
597                 ex.printStackTrace();
598                 log.info("ErrorMessage:" + ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
599                 throw ex;
600                 // callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
601                 //return callBackMessage.toJSONObject();
602             } finally {
603                 SpObserver.setDBtoInstance();
604             }
605         }
606     }
607
608     /**
609      * 未支付提示
610      * 查询120330
611      *
612      * @param request
613      */
614     @RequestMapping(value = "/lujn/nodify120330.do", method = RequestMethod.GET)
615     @CrossOrigin
616     public @ResponseBody
617     WebAsyncTask nodify120330(HttpServletRequest request) {
618         String cltCode = request.getSession().getAttribute(SessionKey.HRCODE) + "";
619         Callable<Object> callable = new Notify120330ListCallable(cltCode, request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + "", luJiangNanServiceIfc);
620         //定义超时45秒
621         WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(45), threadPoolExecutor, callable);
622
623         asyncTask.onError(
624                 (Callable<Object>) () -> {
625                     CallBackMessage callBackMessage = new CallBackMessage();
626                     callBackMessage.sendErrorMessage("执行出错,请重新提交");
627                     return callBackMessage.toJSONObject();
628                 }
629         );
630         asyncTask.onTimeout(
631                 (Callable<Object>) () -> {
632                     CallBackMessage callBackMessage = new CallBackMessage();
633                     callBackMessage.sendErrorMessage("服务器繁忙,请稍候再查询", -1003);
634                     return callBackMessage.toJSONObject();
635                 }
636         );
637         return asyncTask;
638     }
639
640     private class Notify120330ListCallable implements Callable<Object> {
641
642         String cltCode;
643         String dbid;
644         LuJiangNanServiceIfc luJiangNanServiceIfc;
645
646         public Notify120330ListCallable(String cltCode, String dbid, LuJiangNanServiceIfc luJiangNanServiceIfc) {
647             this.cltCode = cltCode;
648             this.dbid = dbid;
649             this.luJiangNanServiceIfc = luJiangNanServiceIfc;
650         }
651
652         @Override
653         public Object call() throws Exception {
654             CallBackMessage callBackMessage = new CallBackMessage();
655             try {
656                 SpObserver.setDBtoInstance("_" + dbid);
657
658                 String msg = luJiangNanServiceIfc.notify120330(cltCode);
659                 Map info = new HashMap();
660                 info.put("msg", msg);
661                 callBackMessage.setInfo(info);
662                 callBackMessage.sendSuccessMessageByDefault();
663                 return callBackMessage.toJSONObject();
664             } catch (Exception ex) {
665                 callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
666                 return callBackMessage.toJSONObject();
667             } finally {
668                 SpObserver.setDBtoInstance();
669             }
670         }
671     }
672
673     /**
674      * 询结单列表
675      * 查询120330
676      *
677      * @param request
678      */
679     @RequestMapping(value = "/lujn/get120330List.do", method = RequestMethod.GET)
680     @CrossOrigin
681     public @ResponseBody
7832d6 682     WebAsyncTask get120330List(Integer pageIndex, Integer pageSize, Integer isPay,Integer isNew, HttpServletRequest request) {
a6a76f 683         String cltCode = request.getSession().getAttribute(SessionKey.HRCODE) + "";
7832d6 684         Callable<Object> callable = new Get120330ListCallable(isPay, pageIndex, pageSize, cltCode, request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + "", luJiangNanServiceIfc,isNew);
a6a76f 685         //定义超时45秒
F 686         WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(45), threadPoolExecutor, callable);
687
688         asyncTask.onError(
689                 (Callable<Object>) () -> {
690                     CallBackMessage callBackMessage = new CallBackMessage();
691                     callBackMessage.sendErrorMessage("执行出错,请重新提交");
692                     return callBackMessage.toJSONObject();
693                 }
694         );
695         asyncTask.onTimeout(
696                 (Callable<Object>) () -> {
697                     CallBackMessage callBackMessage = new CallBackMessage();
698                     callBackMessage.sendErrorMessage("执行超时,请重新提交");
699                     return callBackMessage.toJSONObject();
700                 }
701         );
702         return asyncTask;
703     }
704
705     private class Get120330ListCallable implements Callable<Object> {
706         Integer pageIndex;
707         Integer isPay;
7832d6 708         Integer isNew;
a6a76f 709         Integer pageSize;
F 710         String cltCode;
711         String dbid;
712         LuJiangNanServiceIfc luJiangNanServiceIfc;
713
7832d6 714         public Get120330ListCallable(Integer isPay, Integer pageIndex, Integer pageSize, String cltCode, String dbid, LuJiangNanServiceIfc luJiangNanServiceIfc,Integer isNew) {
a6a76f 715             this.pageIndex = pageIndex;
F 716             this.isPay = isPay;
717             this.pageSize = pageSize;
718             this.cltCode = cltCode;
719             this.dbid = dbid;
720             this.luJiangNanServiceIfc = luJiangNanServiceIfc;
7832d6 721             this.isNew=isNew;
a6a76f 722         }
F 723
724         @Override
725         public Object call() throws Exception {
726             CallBackMessage callBackMessage = new CallBackMessage();
727             try {
728                 SpObserver.setDBtoInstance("_" + dbid);
729
730                 List<Map<String, Object>> list = null;
731                 if (isPay != null && isPay == 1) {
732                     //已支付
7832d6 733                     list = luJiangNanServiceIfc.get120330ListByPaid(pageIndex, pageSize, cltCode,isNew);
a6a76f 734                 } else {
F 735                     //未支付
7832d6 736                     list = luJiangNanServiceIfc.get120330List(pageIndex, pageSize, cltCode,isNew);
a6a76f 737                 }
F 738                 callBackMessage.setInfo(list);
739                 callBackMessage.sendSuccessMessageByDefault();
740                 return callBackMessage.toJSONObject();
741             } catch (Exception ex) {
742                 callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
743                 return callBackMessage.toJSONObject();
744             } finally {
745                 SpObserver.setDBtoInstance();
746             }
747         }
748     }
749
750     /**
751      * app下单
752      * 查询120330取得支付金额,发送订单请求到农行支付平台,返回支付信息返回给app,以便app发起支付请求
753      *
754      * @param request
755      */
756     @RequestMapping(value = "/lujn/post120330.do", method = RequestMethod.POST)
757     @CrossOrigin
758     public @ResponseBody
759     WebAsyncTask post120330(@RequestBody List<T120330> list, HttpServletRequest request) {
760         String cltCode = request.getSession().getAttribute(SessionKey.HRCODE) + "";
761         String userName = request.getSession().getAttribute(SessionKey.USER_NAME) + "";
762         Map<String, String> env = this.initEnv(request, 150171, null, false);
763         Callable<Object> callable = new T150171Callable(list, cltCode, request.getSession().getAttribute(SessionKey.DATA_BASE_ID) + "", luJiangNanServiceIfc, userName, env);
764         //定义超时45秒, 改为600秒,Modified by Johns Wang,2021-02-10
765         WebAsyncTask asyncTask = new WebAsyncTask(TimeUnit.SECONDS.toMillis(600), threadPoolExecutor, callable);
766         asyncTask.onCompletion(
767                 () -> log.info("执行成功")
768         );
769         asyncTask.onError(
770                 (Callable<Object>) () -> {
771                     CallBackMessage callBackMessage = new CallBackMessage();
772                     log.info("执行出错");
773                     callBackMessage.sendErrorMessage("执行出错,请重新提交");
774                     return callBackMessage.toJSONObject();
775                 }
776         );
777         asyncTask.onTimeout(
778                 (Callable<Object>) () -> {
779                     CallBackMessage callBackMessage = new CallBackMessage();
780                     log.info("执行超时");
781                     callBackMessage.sendErrorMessage("服务器繁忙,请不要重复提交", -1003);
782                     return callBackMessage.toJSONObject();
783                 }
784         );
785         return asyncTask;
786     }
787
788     private class T150171Callable implements Callable<Object> {
789         List<T120330> list;
790         String cltCode;
791         String userName;
792         String dbid;
793         Map<String, String> env;
794         LuJiangNanServiceIfc luJiangNanServiceIfc;
795
796         public T150171Callable(List<T120330> list, String cltCode, String dbid, LuJiangNanServiceIfc luJiangNanServiceIfc, String userName, Map<String, String> env) {
797             this.list = list;
798             this.cltCode = cltCode;
799             this.dbid = dbid;
800             this.userName = userName;
801             this.env = env;
802             this.luJiangNanServiceIfc = luJiangNanServiceIfc;
803         }
804
805         @Override
806         public Object call() throws Exception {
807             CallBackMessage callBackMessage = new CallBackMessage();
808             T120330 t120330 = new T120330();
809             try {
810                 SpObserver.setDBtoInstance("_" + dbid);
811                 if (list == null || list.size() == 0) {
812                     throw new ApplicationException("没有需要支付的订单");
813                 }
814                 //1-------------------生成门店付款单 150171
7832d6 815                     Map map =null;
7edaee 816                 if(list.get(0).getFormid()!=null&&list.get(0).getFormid().intValue()==120340){
7832d6 817                     //加盟费支付
F 818                     map = luJiangNanServiceIfc.save150171V2(list, cltCode);
819                 }else {
820                     //货款支付
821                     map = luJiangNanServiceIfc.save150171(list, cltCode);
822                 }
a6a76f 823                 t120330.setDocCode(map.get("docCode") + "");
F 824                 if (map.get("amount") == null || "".equals(map.get("amount"))) {
825                     throw new ApplicationException(map.get("docCode") + "-订单金额不能为空");
826                 }
827                 t120330.setAmount(new BigDecimal(map.get("amount") + ""));
828                 t120330.setDbid(Integer.parseInt(dbid));
b1f69b 829                 t120330.setMerchantID(map.get("merchantID") + "");
a6a76f 830                 //2--------------------生成支付平台需要的请求对象
b1f69b 831                 //log.info("t120330:"+ com.alibaba.fastjson.JSON.toJSONString(t120330));
a6a76f 832                 JSON json = postOrder(t120330);
F 833                 String ReturnCode = json.GetKeyValue("ReturnCode");
834                 String ErrorMessage = json.GetKeyValue("ErrorMessage");
835                 String paymentURL = json.GetKeyValue("PaymentURL");
836                 log.info("ReturnCode   = [" + ReturnCode + "]");
837                 log.info("ErrorMessage = [" + ErrorMessage + "]");
838                 log.info("PaymentURL-->" + json.GetKeyValue("PaymentURL"));
839                 //成功
840                 if ("0000".equals(ReturnCode)) {
841                     //3---------------------把返回的信息返回给app端,发起支付请求
842                     //---解析PaymentURL,获得支付token
843                     Map info = new HashMap();
844                     info.put("token", paymentURL.split("TOKEN=")[1]);
845                     info.put("orderNo", json.GetKeyValue("OrderNo"));
846                     info.put("amount", t120330.getAmount().setScale(2, BigDecimal.ROUND_HALF_UP));
847                     callBackMessage.setInfo(info);
848                     callBackMessage.sendSuccessMessageByDefault();
849                     return callBackMessage.toJSONObject();
850                 } else {
851                     //出错
852                     throw new ApplicationException(ReturnCode + "-" + ErrorMessage);
853                 }
854             } catch (Exception ex) {
855                 ex.printStackTrace();
856                 //删除新建的单
857                 if (StringUtils.isNotBlank(t120330.getDocCode())) {
858                     env.put("@doccode", t120330.getDocCode());
859                     PanelCommitAction panelCommitAction = (PanelCommitAction) FactoryBean.getBean("panelCommitAction");
860                     panelCommitAction.PostDeleteDocSql("150171", t120330.getDocCode(), "0", dbid, "5", userName, cltCode, null, env);
861                 }
862                 callBackMessage.sendErrorMessage(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage());
863                 return callBackMessage.toJSONObject();
864             } finally {
865                 SpObserver.setDBtoInstance();
866             }
867         }
868     }
869
870     /**
871      * 向农行发送订单请求,把订单提交到网上支付平台,成功后导向支付界面,然后发起支付操作
872      *
873      * @return
874      */
875     private JSON postOrder(T120330 t120330) {
876
877         //订单日期和时间
878         LocalDate localDate = LocalDate.now();
879         String date = localDate.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
880         LocalTime localTime = LocalTime.now();
881         String time = localTime.format(DateTimeFormatter.ofPattern("HH:mm:ss"));
882         String docCode = t120330.getDocCode();
883         //todo 订单金额
884         BigDecimal orderAmount = t120330.getAmount().setScale(2, BigDecimal.ROUND_HALF_UP);
885         //1、生成订单对象
886         PaymentRequest tPaymentRequest = new PaymentRequest();
887
888         tPaymentRequest.dicOrder.put("PayTypeID", Constants.PAY_TYPE_DIRECTPAY);                   //设定交易类型
889         tPaymentRequest.dicOrder.put("OrderDate", date);                  //设定订单日期 (必要信息 - YYYY/MM/DD)
890         tPaymentRequest.dicOrder.put("OrderTime", time);                   //设定订单时间 (必要信息 - HH:MM:SS)
891         tPaymentRequest.dicOrder.put("OrderNo", docCode);                       //设定订单编号 (必要信息)
892         tPaymentRequest.dicOrder.put("CurrencyCode", "156");             //设定交易币种
ef47cf 893         tPaymentRequest.dicOrder.put("OrderAmount", orderAmount.toString());      //设定交易金额
a6a76f 894         tPaymentRequest.dicOrder.put("InstallmentMark", "0");       // 分期标识
F 895         tPaymentRequest.dicOrder.put("CommodityType", "0202");           // 设置商品种类
896 //2、订单明细
897         LinkedHashMap orderitem = new LinkedHashMap();
898         orderitem.put("ProductName", docCode);//商品名称
899         tPaymentRequest.orderitems.put(1, orderitem);
900 //3、生成支付请求对象
901         tPaymentRequest.dicRequest.put("PaymentType", Constants.PAY_TYPE_ALL);            //设定支付类型
902         tPaymentRequest.dicRequest.put("PaymentLinkType", Constants.PAY_LINK_TYPE_MOBILE);    //设定支付接入方式
903         tPaymentRequest.dicRequest.put("NotifyType", Constants.NOTIFY_TYPE_SERVER);              //设定通知方式
904         tPaymentRequest.dicRequest.put("MerchantRemarks", t120330.getDbid());           // 附言,这里保存数据源id,方便回调支付结果通知时获得对应的数据源id
905         //--测试环境
906         //tPaymentRequest.dicRequest.put("ResultNotifyURL", "http://ljn.onbus.cn:9010/lujn/orderPayCallback.do");    //设定通知URL地址
907         tPaymentRequest.dicRequest.put("ResultNotifyURL", "https://ljn.onbus.cn/lujn/orderPayCallback.do");    //设定通知URL地址
908         tPaymentRequest.dicRequest.put("IsBreakAccount", Constants.IsBreakAccount_NO);      //设定交易是否分账、交易是否支持向二级商户入账
909         // System.out.println(GridUtils.toJson(tPaymentRequest));
b1f69b 910         //---根据MerchantID取得配置文件TrustMerchant.properties中所在的index位置,传给农行执行
F 911         JSON json = tPaymentRequest.extendPostRequest(getMerchantIDIndex(t120330.getDbid(), t120330.getMerchantID()));
a6a76f 912         return json;
F 913     }
914
b1f69b 915     /**
F 916      * 根据商户号查找在配置文件所有的位置index
917      * @param merchantID
918      * @return
919      */
920     private  int getMerchantIDIndex(Integer dbid,String merchantID){
921     //商户证书列表
922     String merchantStr = AbcMerchantConfig.get("MerchantID");
923     if(StringUtils.isBlank(merchantStr)){
924         throw new ApplicationException("TrustMerchant.properties中商户号MerchantID配置项不能为空");
925     }
926     final String[] merchantList = merchantStr.split(",");
927     int index=0;//商户号的位置
928         if(merchantList!=null&&merchantList.length>0) {
929             for (int i = 0; i < merchantList.length; i++) {
930                 //根据商户id定位对应的位置
931                 if (merchantList[i].trim().equalsIgnoreCase(merchantID)) {
932                     index = i + 1;
933                     break;
934                 }
935             }
936         }
937     if(index==0){
938         final DataSourceEntity dataSourceMap = MultiDataSource.getDataSourceMap(dbid + "");
939         throw new ApplicationException(dataSourceMap.getSystemID()+"-商户证书找不到,请检查配置文件");
940     }
941     return index;
942 }
a6a76f 943
F 944 }