#58 add useLink

Đã đóng
mangpiao muốn nhập 418 commit từ mangpiao/mp-server-test vào mangpiao/master-1119
74 tập tin đã thay đổi với 8257 bổ sung187 xóa
  1. 1 1
      .gitignore
  2. 2 1
      README.md
  3. 11 7
      mp-admin/src/main/java/com/qs/mp/handler/auth/SignInterceptor.java
  4. 3 0
      mp-admin/src/main/java/com/qs/mp/handler/auth/WebConfigurer.java
  5. 3 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelMgrController.java
  6. 93 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/callback/PayCallBackController.java
  7. 384 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/callback/YsPayCallBackController.java
  8. 3 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelController.java
  9. 168 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelWithdrawController.java
  10. 30 0
      mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java
  11. 1 1
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserChannelController.java
  12. 69 2
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java
  13. 78 3
      mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java
  14. 15 0
      mp-admin/src/main/resources/application-dev.yml
  15. 41 20
      mp-admin/src/main/resources/application-test.yml
  16. 20 5
      mp-admin/src/main/resources/application.yml
  17. 1 1
      mp-admin/src/main/resources/logback-8091.xml
  18. 1 1
      mp-admin/src/main/resources/logback-spring.xml
  19. 311 20
      mp-admin/src/test/java/com/qs/mp/task/MyTest.java
  20. 7 0
      mp-common/pom.xml
  21. 48 0
      mp-common/src/main/java/com/qs/mp/common/constant/Constants.java
  22. 17 0
      mp-common/src/main/java/com/qs/mp/common/constant/DivisionLogStatusConstants.java
  23. 17 0
      mp-common/src/main/java/com/qs/mp/common/constant/PayConstants.java
  24. 313 0
      mp-common/src/main/java/com/qs/mp/common/constant/SysCode.java
  25. 28 0
      mp-common/src/main/java/com/qs/mp/common/constant/YsPayMethodConstants.java
  26. 16 0
      mp-common/src/main/java/com/qs/mp/common/constant/YsServerApiConstants.java
  27. 6 1
      mp-common/src/main/java/com/qs/mp/common/enums/ChannelWithdrawStatusEnum.java
  28. 46 0
      mp-common/src/main/java/com/qs/mp/common/enums/DivisionStatusEnum.java
  29. 2 1
      mp-common/src/main/java/com/qs/mp/common/enums/TicketStatusEnum.java
  30. 52 0
      mp-common/src/main/java/com/qs/mp/common/enums/YsCallBizTypeEnum.java
  31. 91 91
      mp-common/src/main/java/com/qs/mp/common/pulsar/PulsarClientService.java
  32. 30 0
      mp-common/src/main/java/com/qs/mp/common/utils/KeyGenUtil.java
  33. 3 3
      mp-generator/src/main/java/com/qs/mp/generator/DbGenerator.java
  34. 13 13
      mp-quartz/src/main/java/com/qs/mp/quartz/task/OperateToolTask.java
  35. BIN
      mp-service/libs/dougong/dg-java-sdk-3.0.8.jar
  36. 9 1
      mp-service/pom.xml
  37. 1 0
      mp-service/src/main/java/com/qs/mp/admin/service/ITicketAwardsPrizeService.java
  38. 78 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelBank.java
  39. 23 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelBankCard.java
  40. 6 0
      mp-service/src/main/java/com/qs/mp/channel/domain/ChannelWithdraw.java
  41. 34 0
      mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelBankCardCreateParam.java
  42. 1 1
      mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelWithdrawParam.java
  43. 1 1
      mp-service/src/main/java/com/qs/mp/channel/domain/param/OrderPayParam.java
  44. 1 0
      mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelVO.java
  45. 13 0
      mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelBankMapper.java
  46. 16 0
      mp-service/src/main/java/com/qs/mp/channel/service/IChannelBankService.java
  47. 20 0
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelBankServiceImpl.java
  48. 0 2
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelTicketTransferServiceImpl.java
  49. 113 3
      mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelWithdrawServiceImpl.java
  50. 97 0
      mp-service/src/main/java/com/qs/mp/common/domain/YsCallLog.java
  51. 13 0
      mp-service/src/main/java/com/qs/mp/common/mapper/YsCallLogMapper.java
  52. 16 0
      mp-service/src/main/java/com/qs/mp/common/service/IYsCallLogService.java
  53. 20 0
      mp-service/src/main/java/com/qs/mp/common/service/impl/YsCallLogServiceImpl.java
  54. 96 0
      mp-service/src/main/java/com/qs/mp/pay/domain/DivisionLog.java
  55. 614 0
      mp-service/src/main/java/com/qs/mp/pay/domain/DougongPayRequestParam.java
  56. 6 2
      mp-service/src/main/java/com/qs/mp/pay/domain/PayOrder.java
  57. 436 0
      mp-service/src/main/java/com/qs/mp/pay/domain/PaymentConfig.java
  58. 2940 0
      mp-service/src/main/java/com/qs/mp/pay/domain/PaymentConfigExample.java
  59. 13 0
      mp-service/src/main/java/com/qs/mp/pay/mapper/DivisionLogMapper.java
  60. 33 0
      mp-service/src/main/java/com/qs/mp/pay/mapper/PaymentConfigMapper.java
  61. 16 0
      mp-service/src/main/java/com/qs/mp/pay/service/IDivisionLogService.java
  62. 4 0
      mp-service/src/main/java/com/qs/mp/pay/service/IPayOrderService.java
  63. 44 0
      mp-service/src/main/java/com/qs/mp/pay/service/IWalletService.java
  64. 20 0
      mp-service/src/main/java/com/qs/mp/pay/service/impl/DivisionLogServiceImpl.java
  65. 167 0
      mp-service/src/main/java/com/qs/mp/pay/service/impl/DougongPayApi.java
  66. 62 0
      mp-service/src/main/java/com/qs/mp/pay/service/impl/PayOrderServiceImpl.java
  67. 545 4
      mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java
  68. 1 0
      mp-service/src/main/java/com/qs/mp/system/mapper/SysUserRoleMapper.java
  69. 21 0
      mp-service/src/main/resources/mapper/channel/ChannelBankMapper.xml
  70. 22 0
      mp-service/src/main/resources/mapper/common/YsCallLogMapper.xml
  71. 23 0
      mp-service/src/main/resources/mapper/pay/DivisionLogMapper.xml
  72. 788 0
      mp-service/src/main/resources/mapper/pay/PaymentConfigMapper.xml
  73. 1 1
      mp-service/src/main/resources/mapper/system/SysUserRoleMapper.xml
  74. 19 0
      pom.xml

+ 1 - 1
.gitignore

@@ -38,7 +38,7 @@ mvnw.cmd
 .mtj.tmp/
 
 # Package Files #
-*.jar
+#*.jar
 *.war
 *.nar
 *.ear

+ 2 - 1
README.md

@@ -1 +1,2 @@
-云管铺
+云管铺
+

+ 11 - 7
mp-admin/src/main/java/com/qs/mp/handler/auth/SignInterceptor.java

@@ -64,6 +64,16 @@ public class SignInterceptor implements HandlerInterceptor {
 
         String method = request.getMethod();
         if ("post".equalsIgnoreCase(method)) {
+            if (request.getRequestURI().equals("/api/v1/mp/wx/urlschema/generate")
+                    || request.getRequestURI().equals("/api/v1/mp/wx/code/generate")
+                    || request.getRequestURI().equals("/api/v1/mp/open/link/wx/scheme")
+                    //支付接口放行
+                    || request.getRequestURI().equals("/service/notify/dg/orderCallback")) {
+                // 小程序跳转页面请求
+                LogUtil.debug(logger, "requestURI:" + request.getRequestURI());
+                return true;
+            }
+
             // 最后用RequestBody中获取token
             ServletRequest tempRequest = null;
             tempRequest = new BodyReaderHttpServletRequestWrapper(request);
@@ -72,13 +82,7 @@ public class SignInterceptor implements HandlerInterceptor {
             //进行sign验证
             String[] signs = request.getParameterValues("sign");
 
-            if (request.getRequestURI().equals("/api/v1/mp/wx/urlschema/generate")
-                || request.getRequestURI().equals("/api/v1/mp/wx/code/generate")
-                || request.getRequestURI().equals("/api/v1/mp/open/link/wx/scheme")) {
-                // 小程序跳转页面请求
-                LogUtil.debug(logger, "requestURI:" + request.getRequestURI());
-                return true;
-            }
+
             if(null == signs || signs.length == 0) {
                 logger.error("sign参数为空 request url:"+getRequestInfo(request));
                 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);

+ 3 - 0
mp-admin/src/main/java/com/qs/mp/handler/auth/WebConfigurer.java

@@ -33,6 +33,9 @@ public class WebConfigurer implements WebMvcConfigurer {
             "/service/notify/wxcallback",
             "/service/notify/payCallback",
             "/service/notify/alipayCallback",
+            "/service/notify/ysCallback",
+            "/service/notify/ysDivCallback",
+            "/service/notify/ysWithdrawCallback",
             "/captchaImage");
     }
 

+ 3 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelMgrController.java

@@ -17,6 +17,8 @@ import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.enums.BusinessType;
 import com.qs.mp.common.enums.ChannelRoleEnum;
 import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.system.domain.SysUser;
+import com.qs.mp.system.domain.SysUserRole;
 import com.qs.mp.system.service.ISysUserService;
 import com.qs.mp.user.service.IUserTicketOrderService;
 import com.qs.mp.web.controller.common.BaseApiController;
@@ -31,6 +33,7 @@ import java.util.Map;
 import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Component;

+ 93 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/callback/PayCallBackController.java

@@ -1,8 +1,14 @@
 package com.qs.mp.web.controller.api.callback;
 
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.google.common.collect.Maps;
+import com.qs.mp.common.constant.Constants;
+import com.qs.mp.common.constant.SysCode;
 import com.qs.mp.common.enums.PayOrderStatusEnum;
 import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.common.utils.WebhookService;
@@ -10,6 +16,9 @@ import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.pay.service.IPayOrderService;
 import com.qs.mp.pay.service.IWalletService;
 import java.io.IOException;
+import java.util.Date;
+import java.util.Map;
+import java.util.Objects;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import org.slf4j.Logger;
@@ -17,6 +26,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.RestController;
 
 /**
@@ -105,6 +115,89 @@ public class PayCallBackController {
     }
   }
 
+
+
+  @RequestMapping(value = "/dg/orderCallback")
+  @ResponseBody
+  public Map<String, Object> orderCallback(HttpServletResponse response, HttpServletRequest request) {
+    response.setHeader("Access-Control-Allow-Origin", "*");
+    Map<String, Object> params = Maps.newHashMap();
+    logger.info("web--orderCallback-->1::");
+
+    logger.info("斗拱 - 微信支付 回调请求参数::{},{}", response, request);
+    logger.info("斗拱 - 微信支付 回调请求参数::{},{}", JSONUtil.toJsonStr(response), JSONUtil.toJsonStr(request));
+    String respCode = request.getParameter("resp_code");
+    String respData = request.getParameter("resp_data");
+//        String transStat = request.getParameter("trans_stat");
+    String transAmt0 = org.apache.commons.lang3.StringUtils.isNotEmpty(request.getParameter("trans_amt")) ? request.getParameter("trans_amt") : "0";
+    logger.info("orderCallback::respCode::{},respData::{},transAmt::{}", respCode, respData,transAmt0);
+//        double transAmt = Double.parseDouble(transAmt0);
+
+    logger.info("dougong callback params decoding---->{}", respData);
+    JSONObject respDataInfoJson = JSONObject.parseObject(respData);
+    String huifuPayId = respDataInfoJson.getString("req_seq_id");
+    String huifuId = respDataInfoJson.getString("huifu_id");
+    String sysId = respDataInfoJson.getString("sys_id");
+    String transStat = respDataInfoJson.getString("trans_stat");
+    logger.info("dougong--callback--pasing--huifuPayId::{},huifuId::{},sysId::{},transStat::{}", huifuPayId,huifuId,sysId,transStat);
+    String tradesId = huifuPayId.contains("D") ? huifuPayId.split("D")[0] : huifuPayId;
+    params.put("tradesId", tradesId);
+    if (Objects.isNull(params.get("tradesId"))) {
+      return SysCode.fail("tradesId不能为空");
+    }
+//        String respCode = Objects.nonNull(params.get("respCode")) ? params.get("respCode").toString() : "";
+    if (org.apache.commons.lang3.StringUtils.isNotEmpty(respCode)) {
+      if (!SysCode.DOUGONG_ORDER_SUCCESS_CODE.equals(respCode) && (!SysCode.DOUGONG_PAY_SUCCESS_CODE.equals(respCode))) {
+        logger.info("斗拱回调状态:{},失败,订单号:{}", respCode, params.get("tradesId").toString());
+        return SysCode.fail("斗拱回调状态:[" + respCode + "],失败");
+      }
+
+      if(SysCode.DOUGONG_PAY_SUCCESS_CODE.equals(respCode) && SysCode.DOUGONG_PAY_TRANS_S.equals(transStat)){
+        logger.info("orderCallback--->{}", params.get("tradesId").toString());
+
+        try {
+          logger.info("orderCallback----------------->1");
+
+          PayOrder payOrder = payOrderService.getById(tradesId);
+          payOrder.setOrderId(tradesId);
+          payOrder.setOrderNo(huifuPayId);
+          payOrder.setCompleteDate(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,new Date()));
+          payOrder.setChannelNo(huifuId);
+          payOrder.setOrderStatus("1");
+
+          // 更新订单,单个事务处理
+          logger.info("支付回调消息更新成功 shopOrderNo:"+tradesId);
+          walletService.payOrderStatusHandle(payOrder);
+
+          // 订单支付状态单独保存
+          LambdaUpdateWrapper<PayOrder> updateWrapper = new LambdaUpdateWrapper<>();
+          updateWrapper.eq(PayOrder::getOrderStatus, PayOrderStatusEnum.WAIT.getValue());
+          updateWrapper.eq(PayOrder::getOrderId, tradesId);
+          boolean ret = payOrderService.update(payOrder, updateWrapper);
+          if (!ret) {
+            throw new ServiceException("支付订单更新失败,orderId:" + tradesId);
+          }
+          responseWrite(response,"success");
+
+          Map<String,Object> map = payOrderService.dougongPaySuccessCallBack(payOrder);
+          return map;
+
+        } catch (Exception e) {
+          logger.error("斗拱线下扫码订单回调失败:{}", e.getMessage());
+          e.printStackTrace();
+          return SysCode.fail("斗拱线下扫码订单回调失败:" + e.getMessage());
+        }
+      }
+    }
+
+    return SysCode.fail("斗拱线下扫码订单回调失败.订单:" + huifuPayId);
+
+  }
+
+
+
+
+
   private void responseWrite(HttpServletResponse response,String echostr){
     try {
       response.getWriter().write(echostr);

+ 384 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/callback/YsPayCallBackController.java

@@ -0,0 +1,384 @@
+package com.qs.mp.web.controller.api.callback;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.eptok.yspay.opensdkjava.common.Constants;
+import com.eptok.yspay.opensdkjava.fund.MercFundApi;
+import com.eptok.yspay.opensdkjava.orderpay.OrderQueryApi;
+import com.eptok.yspay.opensdkjava.pojo.vo.OnlineReqDataVo;
+import com.eptok.yspay.opensdkjava.util.DateUtil;
+import com.eptok.yspay.opensdkjava.util.YsOnlineSignUtils;
+import com.eptok.yspay.opensdkjava.util.YsfSignUtil;
+import com.qs.mp.channel.domain.ChannelWithdraw;
+import com.qs.mp.channel.service.IChannelWithdrawService;
+import com.qs.mp.common.constant.DivisionLogStatusConstants;
+import com.qs.mp.common.constant.YsServerApiConstants;
+import com.qs.mp.common.domain.YsCallLog;
+import com.qs.mp.common.enums.ChannelWithdrawStatusEnum;
+import com.qs.mp.common.enums.DivisionStatusEnum;
+import com.qs.mp.common.enums.PayOrderStatusEnum;
+import com.qs.mp.common.enums.YsCallBizTypeEnum;
+import com.qs.mp.common.service.IYsCallLogService;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.pay.domain.DivisionLog;
+import com.qs.mp.pay.domain.PayOrder;
+import com.qs.mp.pay.service.IDivisionLogService;
+import com.qs.mp.pay.service.IPayOrderService;
+import com.qs.mp.pay.service.IWalletService;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.bouncycastle.util.test.TestRandomBigInteger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 银盛支付回调控制类
+ *
+ * @author Evan
+ * @date 2023/3/28
+ */
+@RestController
+@RequestMapping("/service/notify")
+public class YsPayCallBackController {
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
+
+    @Value("${ys-pay.private-key-path}")
+    private String privateKeyPath;
+
+    @Value("${ys-pay.public-key-path}")
+    private String publicKeyPath;
+
+
+    @Value("${ys-pay.partner-id}")
+    private String partnerId;
+
+    @Value("${ys-pay.private-key-pass}")
+    private String privateKeyPass;
+
+    @Value("${ys-pay.div-notify-url}")
+    private String ysDivNotifyUrl;
+
+
+    @Autowired
+    private IPayOrderService payOrderService;
+
+    @Autowired
+    private IWalletService walletService;
+
+    @Autowired
+    private IYsCallLogService ysCallLogService;
+
+    @Autowired
+    private IDivisionLogService divisionLogService;
+
+    @Autowired
+    private IChannelWithdrawService channelWithdrawService;
+
+
+    @RequestMapping(value = "/ysCallback", method = RequestMethod.POST)
+    public void payCallback(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        Map<String, String[]> reqParams = request.getParameterMap();
+
+        Map<String, String> params = new HashMap<>();
+        for (String key : reqParams.keySet()) {
+            String[] values = reqParams.get(key);
+            String valueStr = "";
+            for (int i = 0; i < values.length; i++) {
+                valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
+            }
+            params.put(key, valueStr);
+        }
+        logger.info("Ys支付回调:{}", JSON.toJSONString(params));
+
+        String sign = params.get("sign");
+        boolean flag = YsOnlineSignUtils.rsaCheckContent(params, sign, Constants.CHARSET_UTF_8, publicKeyPath);
+        if (!flag) {
+            logger.error("ys支付回调-check sign error");
+            responseWrite(response, "fail");
+            return;
+        }
+        String tradeNo = params.get("out_trade_no");
+        String orderNo = params.get("trade_no");
+        String tradeStatus = params.get("trade_status");
+        String completeDate = params.get("notify_time");
+        int totalAmount = new BigDecimal(request.getParameter("total_amount")).multiply(new BigDecimal(100)).intValue();
+        logger.info("data: tradeNo:"+tradeNo +" orderNo:"+orderNo +" totalAmount:"+totalAmount+ "tradeStatus:"+tradeStatus);
+
+        if (StringUtils.isBlank(tradeNo) || StringUtils.isBlank(orderNo) || StringUtils.isBlank(tradeStatus)) {
+            logger.error("ys支付回调-参数错误");
+            responseWrite(response, "fail");
+            return;
+        }
+
+        PayOrder order = payOrderService.getOne(new LambdaQueryWrapper<PayOrder>()
+            .eq(PayOrder::getTradeNo, tradeNo));
+
+        YsCallLog payYsCallLog = ysCallLogService.getOne(new LambdaQueryWrapper<YsCallLog>()
+            .eq(YsCallLog::getBizId, order.getOrderId())
+            .eq(YsCallLog::getBizType, YsCallBizTypeEnum.ORDER_PAY));
+        if (payYsCallLog != null) {
+            ysCallLogService.update(new LambdaUpdateWrapper<YsCallLog>()
+                .set(YsCallLog::getCallbackJson, JSONObject.toJSONString(params))
+                .eq(YsCallLog::getId, payYsCallLog.getId()));
+        }
+
+        if (PayOrderStatusEnum.SUCCESS.getValue().equals(order.getOrderStatus())) {
+            logger.info("支付订单已成功,消息忽略,shopOrderNo:" + orderNo);
+            responseWrite(response,"true");
+        }
+
+
+        if (!"TRADE_SUCCESS".equals(tradeStatus)) {
+            logger.error("ys-非支付成功消息,忽略");
+            responseWrite(response,"fail");
+            return;
+        }
+
+        //回调金额与订单金额一致性校验
+        if(order.getTransactionAmount() != totalAmount){
+            logger.error("回调金额与订单金额不一致");
+            responseWrite(response,"fail");
+            return;
+        }
+
+
+        PayOrder payOrder = payOrderService.getById(order.getOrderId());
+        payOrder.setOrderNo(orderNo);
+        payOrder.setCompleteDate(completeDate);
+//        payOrder.setChannelNo(channelNo);
+        payOrder.setOrderStatus(PayOrderStatusEnum.SUCCESS.getValue());
+
+
+        try {
+            // 更新订单,单个事务处理
+            logger.info("ys支付回调消息更新成功 orderId:" + order.getOrderId());
+            walletService.payOrderStatusHandle(payOrder);
+
+            // 订单支付状态单独保存
+            LambdaUpdateWrapper<PayOrder> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(PayOrder::getOrderStatus, PayOrderStatusEnum.WAIT.getValue());
+            updateWrapper.eq(PayOrder::getOrderId, order.getOrderId());
+            boolean ret = payOrderService.update(payOrder, updateWrapper);
+            if (!ret) {
+                LogUtil.error(logger, "ys支付回调消息更新支付单状态失败 orderId:" + order.getOrderId());
+                responseWrite(response,"fail");
+            }
+        } catch (Exception e){
+            LogUtil.error(logger, e, "ys支付回调消息处理异常 orderId:" + order.getOrderId());
+            responseWrite(response,"fail");
+        }
+
+        // 调用分账登记接口
+        OnlineReqDataVo req = new OnlineReqDataVo();
+        req.setReqUrl(YsServerApiConstants.COMMON_API);
+        req.setNotifyUrl(ysDivNotifyUrl);
+        req.setPartnerId(partnerId);
+        req.setPrivateKeyFilePath(privateKeyPath);
+        req.setPrivateKeyPassword(privateKeyPass);
+        req.setYsPublicKeyFilePath(publicKeyPath);
+        // 分账登记业务参数
+        Map<String, Object> bizContent = new HashMap<>();
+        String divTradeNo = order.getTradeNo();
+        bizContent.put("out_trade_no", divTradeNo);
+        bizContent.put("payee_usercode", partnerId);
+        bizContent.put("total_amount", request.getParameter("total_amount"));
+        bizContent.put("is_divistion", "02");
+        bizContent.put("is_again_division", "N");
+        bizContent.put("division_mode", "01");
+        // 分账明细
+//        JSONArray divList = new JSONArray();
+//        JSONObject divObject = new JSONObject();
+//        divObject.put("division_mer_usercode", partnerId);
+//        divObject.put("div_ratio", "1");
+//        divObject.put("is_chargeFee", "02");
+//        divList.add(divObject);
+        //分账明细
+//        bizContent.put("div_list", divList);
+        req.setParamData(bizContent);
+        String result = null;
+        DivisionLog divisionLog = new DivisionLog();
+        divisionLog.setStatus(DivisionStatusEnum.INIT);
+        YsCallLog ysCallLog = new YsCallLog();
+        ysCallLog.setInterfaceId("ysepay.single.division.online.accept");
+        ysCallLog.setReqJson(JSONObject.toJSONString(req));
+        ysCallLog.setBizType(YsCallBizTypeEnum.DIVISION);
+        ysCallLog.setBizId(divTradeNo);
+        try{
+            logger.info("分账登记调用sdk接口addScanMerc请求入参为:"+ JSONObject.toJSONString(req));
+            result = MercFundApi.divisionOnlineAccept(req);
+            JSONObject resultJson = JSON.parseObject(result);
+            if (!"Success".equals(resultJson.get("msg"))) {
+                divisionLog.setStatus(DivisionStatusEnum.SUBMIT_FAIL);
+            }
+            ysCallLog.setResJson(result);
+            logger.info("分账登记调用addScanMerc出参为:"+ result);
+            //根据返回结果处理自己的业务逻辑,result内容详见接口文档
+        }catch (Exception e){
+            divisionLog.setStatus(DivisionStatusEnum.SUBMIT_FAIL);
+            logger.error("线上分账登记接口失败:"+ e.getMessage());
+        }
+        // 保存调用日志
+        ysCallLogService.save(ysCallLog);
+
+        // 保存分账登记记录
+        divisionLog.setTradeNo(divTradeNo);
+        divisionLog.setAmount(totalAmount);
+        divisionLog.setOrderNo(orderNo);
+        divisionLog.setBizId(payOrder.getOrderId());
+        boolean res = divisionLogService.save(divisionLog);
+        if (!res) {
+            logger.error("分账登记记录保存失败,orderNo:{}", orderNo);
+        }
+        responseWrite(response, "success");
+    }
+
+    /**
+     * 分账回调
+     * @param request
+     * @param response
+     * @throws Exception
+     */
+    @RequestMapping(value = "/ysDivCallback", method = RequestMethod.POST)
+    public void divCallback(HttpServletRequest request, HttpServletResponse response) {
+        Map<String, String[]> reqParams = request.getParameterMap();
+
+        Map<String, String> params = new HashMap<>();
+        for (String key : reqParams.keySet()) {
+            String[] values = reqParams.get(key);
+            String valueStr = "";
+            for (int i = 0; i < values.length; i++) {
+                valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
+            }
+            params.put(key, valueStr);
+        }
+
+        logger.info("分账回调的数据 = " + JSONObject.toJSONString(params));
+        String divTradeNo = params.get("out_trade_no");
+        String divisionStatusCode = params.get("division_status_code");
+        YsCallLog ysCallLog = ysCallLogService.getOne(new LambdaQueryWrapper<YsCallLog>()
+            .eq(YsCallLog::getBizId, divTradeNo)
+            .eq(YsCallLog::getBizType, YsCallBizTypeEnum.DIVISION));
+        if (ysCallLog != null) {
+            ysCallLogService.update(new LambdaUpdateWrapper<YsCallLog>()
+                .set(YsCallLog::getCallbackJson, JSONObject.toJSONString(params))
+                .eq(YsCallLog::getId, ysCallLog.getId()));
+        }
+        DivisionLog divisionLog = divisionLogService.getOne(
+            new LambdaQueryWrapper<DivisionLog>().eq(DivisionLog::getTradeNo, divTradeNo));
+
+        if ("00".equals(divisionStatusCode) || "02".equals(divisionStatusCode)) {
+            divisionLog.setStatus(DivisionStatusEnum.COMPLETE);
+        } else {
+            divisionLog.setStatus(DivisionStatusEnum.FAIL);
+        }
+
+        boolean res = divisionLogService.update(new LambdaUpdateWrapper<DivisionLog>()
+            .set(DivisionLog::getStatus, divisionLog.getStatus())
+            .eq(DivisionLog::getStatus, DivisionStatusEnum.INIT)
+            .eq(DivisionLog::getId, divisionLog.getId()));
+        if (!res) {
+            logger.error("更新分账状态失败,分账tradeNo:" + divTradeNo);
+        }
+
+        responseWrite(response, "success");
+    }
+
+    /**
+     * 提现回调
+     * @param request
+     * @param response
+     */
+    @RequestMapping(value = "/ysWithdrawCallback", method = RequestMethod.POST)
+    public void withdrawCallback(HttpServletRequest request, HttpServletResponse response) {
+        /*Map<String, String[]> reqParams = request.getParameterMap();
+
+        Map<String, String> params = new HashMap<>();
+        for (String key : reqParams.keySet()) {
+            String[] values = reqParams.get(key);
+            String valueStr = "";
+            for (int i = 0; i < values.length; i++) {
+                valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
+            }
+            params.put(key, valueStr);
+        }
+
+        logger.info("提现回调的数据 = " + JSONObject.toJSONString(params));
+        String tradeNo = params.get("out_trade_no");
+
+        ChannelWithdraw channelWithdraw = channelWithdrawService.getOne(new LambdaQueryWrapper<ChannelWithdraw>()
+            .eq(ChannelWithdraw::getTradeNo, tradeNo));
+        if (channelWithdraw == null) {
+            logger.error("提现记录不存在,不处理回调,tradeNo:" + tradeNo);
+            responseWrite(response, "fail");
+            return;
+        }
+
+        // 记录回调数据
+        // 类型,一般账户 和 待结算账户
+        YsCallLog ysCallLog = ysCallLogService.getOne(new LambdaQueryWrapper<YsCallLog>()
+            .eq(YsCallLog::getBizId, channelWithdraw.getId())
+            .eq(YsCallLog::getBizType, YsCallBizTypeEnum.WITHDRAW));
+        if (ysCallLog != null) {
+            ysCallLogService.update(new LambdaUpdateWrapper<YsCallLog>()
+                .set(YsCallLog::getCallbackJson, JSONObject.toJSONString(params))
+                .eq(YsCallLog::getId, ysCallLog.getId()));
+        }
+
+
+        if (!ChannelWithdrawStatusEnum.WITHDRAW_PROCESS.equals(channelWithdraw.getStatus())) {
+            logger.error("提现状态不是银盛提现处理中,不处理回调,tradeNo:" + tradeNo);
+            responseWrite(response, "fail");
+            return;
+        }
+
+        String tradeStatus = params.get("trade_status");
+        if (!"TRADE_SUCCESS".equals(tradeStatus)) {
+            logger.error("提现处理失败,tradeNo:{},desc:{}",tradeNo, params.get("trade_status_description"));
+            channelWithdrawService.update(new LambdaUpdateWrapper<ChannelWithdraw>()
+                .set(ChannelWithdraw::getStatus, ChannelWithdrawStatusEnum.YS_WITHDRAW_FAILED)
+                .eq(ChannelWithdraw::getId, channelWithdraw.getId())
+                .eq(ChannelWithdraw::getStatus, ChannelWithdrawStatusEnum.WITHDRAW_PROCESS));
+            responseWrite(response, "fail");
+            return;
+        }
+
+        // 处理提现成功后的逻辑
+        channelWithdrawService.verify(channelWithdraw, ChannelWithdrawStatusEnum.FINISHED,"");
+        // 提现成功,状态修改
+//        boolean res = channelWithdrawService.update(new LambdaUpdateWrapper<ChannelWithdraw>()
+//            .set(ChannelWithdraw::getStatus, ChannelWithdrawStatusEnum.FINISHED)
+//            .eq(ChannelWithdraw::getId, channelWithdraw.getId())
+//            .eq(ChannelWithdraw::getStatus, ChannelWithdrawStatusEnum.WITHDRAW_PROCESS));
+//        if (!res) {
+//            logger.error("更新提现记录状态失败,tradeNo:{}", tradeNo);
+//        }*/
+        responseWrite(response, "success");
+    }
+
+
+    private void responseWrite(HttpServletResponse response,String echostr){
+        try {
+            response.getWriter().write(echostr);
+            response.getWriter().flush();
+            response.getWriter().close();
+        } catch (IOException e) {
+            LogUtil.error(logger, e, "微信公众号设置url回调处理异常");
+        }
+    }
+}

+ 3 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelController.java

@@ -4,7 +4,10 @@ import com.alibaba.druid.sql.visitor.functions.If;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.param.TicketBoxQueryParam;
 import com.qs.mp.admin.domain.vo.TicketCntVO;
+import com.qs.mp.admin.service.ITicketBoxService;
 import com.qs.mp.admin.service.ITicketService;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.ChannelCommission;

+ 168 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/ChannelWithdrawController.java

@@ -10,12 +10,22 @@
 
 package com.qs.mp.web.controller.api.channel;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.parser.Feature;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.eptok.yspay.opensdkjava.fund.BankAuthorityApi;
+import com.eptok.yspay.opensdkjava.pojo.vo.OnlineReqDataVo;
+import com.eptok.yspay.opensdkjava.util.DateUtil;
+import com.eptok.yspay.opensdkjava.util.SrcDesUtil;
+import com.eptok.yspay.opensdkjava.util.YsOnlineSignUtils;
 import com.qs.mp.channel.domain.Channel;
+import com.qs.mp.channel.domain.ChannelBank;
 import com.qs.mp.channel.domain.ChannelBankCard;
 import com.qs.mp.channel.domain.ChannelCart;
 import com.qs.mp.channel.domain.ChannelWithdraw;
+import com.qs.mp.channel.domain.param.ChannelBankCardCreateParam;
 import com.qs.mp.channel.domain.param.ChannelCartParam;
 import com.qs.mp.channel.domain.param.ChannelWithdrawParam;
 import com.qs.mp.channel.domain.vo.ChannelCartVO;
@@ -24,24 +34,34 @@ import com.qs.mp.channel.service.IChannelBankCardService;
 import com.qs.mp.channel.service.IChannelCartService;
 import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.channel.service.IChannelWithdrawService;
+import com.qs.mp.common.constant.YsPayMethodConstants;
+import com.qs.mp.common.constant.YsServerApiConstants;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.domain.YsCallLog;
 import com.qs.mp.common.domain.param.BatchLongIdsParam;
 import com.qs.mp.common.enums.ChannelStatusEnum;
+import com.qs.mp.common.enums.YsCallBizTypeEnum;
+import com.qs.mp.common.service.IYsCallLogService;
 import com.qs.mp.common.utils.StringUtils;
+import com.qs.mp.common.utils.http.OkHttpUtil;
 import com.qs.mp.system.service.ISysConfigService;
 import com.qs.mp.utils.SecurityUtils;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiOperation;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import javax.validation.Valid;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -52,7 +72,6 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/api/v1/mp/channel")
 @Api(tags = "渠道提现接口")
-@AllArgsConstructor
 public class ChannelWithdrawController extends BaseApiController {
 
 
@@ -82,6 +101,151 @@ public class ChannelWithdrawController extends BaseApiController {
    */
   private final String FEE_RATE_DEFAULT_VALUE = "0.8";
 
+
+  @Value("${ys-pay.partner-id}")
+  private String partnerId;
+
+  @Value("${ys-pay.private-key-pass}")
+  private String privateKeyPass;
+
+  @Value("${ys-pay.private-key-path}")
+  private String privateKeyPath;
+
+  @Value("${ys-pay.public-key-path}")
+  private String publicKeyPath;
+
+  @Autowired
+  private IYsCallLogService ysCallLogService;
+
+//  @ApiOperation(value = "银行卡实名认证绑定")
+//  @PostMapping("/withdraw/bankCardAuth")
+//  public AjaxResult bankCardAuth(@Validated @RequestBody ChannelBankCardCreateParam param) {
+//    Long channelId = SecurityUtils.getLoginUser().getChannelId();
+//
+//    // 判断是否已经绑定过银行卡
+//    int count = channelBankCardService.count(new LambdaQueryWrapper<ChannelBankCard>()
+//        .eq(ChannelBankCard::getChannelId, channelId));
+//    if (count > 0) {
+//      return AjaxResult.error("已经绑定过银行卡");
+//    }
+//
+//
+//    OnlineReqDataVo req = new OnlineReqDataVo();
+//    //商户在银盛支付平台开设的用户号[商户号],接入时需要替换成自己的
+//    req.setPartnerId(partnerId);
+//    req.setReqUrl(YsServerApiConstants.OPEN_API);
+//    req.setPrivateKeyFilePath(privateKeyPath);
+//    req.setPrivateKeyPassword(privateKeyPass);
+//    req.setYsPublicKeyFilePath(publicKeyPath);
+//    //银行实名认证三要素下单业务参数
+//    Map<String, Object> bizContent = new HashMap<>();
+//    String tradeNo = DateUtil.getDateNowYmd() + DateUtil.getRandom(14);
+//    //商户生成的订单号,生成规则前8位必须为交易日期,如20180525,范围跨度支持包含当天在内的前后一天
+//    bizContent.put("out_trade_no", tradeNo);
+//    //商户日期(该参数做交易与查询时需要一致)该日期需在当日的前后一天时间范围之内
+//    bizContent.put("shopdate", DateUtil.getDateNowYmd());
+//    //实名认证姓名--请填写真实信息
+//    bizContent.put("bank_account_name", param.getUserName());
+//    //银行帐号,支持对公对私
+//    bizContent.put("bank_account_no", param.getCardNo());
+//    //证件号码,目前只支持身份证
+//    bizContent.put("id_card", param.getIdCard());
+//    req.setParamData(bizContent);
+//    String result = null;
+//    try{
+//      logger.info("银行实名认证三要素调用sdk接口addScanMerc请求入参为:"+ JSONObject.toJSONString(req));
+//      //根据返回结果处理自己的业务逻辑,result内容详见接口文档
+//      result = BankAuthorityApi.sendBankAuthThreePrecise(req);
+//    }catch (Exception e){
+//      logger.info("银行实名认证三要素失败:"+ e.getMessage());
+//    }
+//    logger.info("银行实名认证三要素result =" + result);
+//
+////    Map<String, String> mapData = new HashMap<>();
+////    mapData.put("partner_id", partnerId);
+////    mapData.put("method", YsPayMethodConstants.BANK_CARD_AUTH_METHOD);
+////    mapData.put("timestamp", DateUtil.getDateNow());
+////    mapData.put("sign_type", "RSA");
+////    mapData.put("charset", "utf-8");
+////    mapData.put("version", "3.0");
+////
+////    JSONObject json = new JSONObject();
+////    String tradeNo = DateUtil.getDateNowYmd() + DateUtil.getRandom(14);
+////    json.put("out_trade_no", tradeNo);
+////    json.put("shopdate", DateUtil.getDateNowYmd());
+////    json.put("bank_account_name", param.getUserName());
+////    json.put("bank_account_no", param.getCardNo());
+////    json.put("id_card", param.getIdCard());
+////    mapData.put("biz_content", json.toString());
+////    //参数签名
+////    try {
+////      String sign = YsOnlineSignUtils.sign(mapData, privateKeyPass, privateKeyPath);
+////      mapData.put("sign", sign);
+////      logger.info("认证信息签名成功,sign = " + sign);
+////    } catch (Exception e) {
+////      System.err.println("签名异常" + e);
+////    }
+////
+////    String result = null;
+////    try {
+////      logger.info("银行实名认证三要素调用sdk接口addScanMerc请求入参为:"+ JSONObject.toJSONString(mapData));
+////      result = OkHttpUtil.post("https://openapi.ysepay.com/gateway.do", mapData);
+////    } catch (Exception e) {
+////      logger.info("银行实名认证三要素失败:"+ e.getMessage());
+////
+////    }
+//
+//    // 解析结果
+////    JSONObject jsonObject = JSON.parseObject(result, Feature.OrderedField);
+////    // 加签内容
+////    String content = JSONObject.toJSONString(
+////        jsonObject.get("ysepay_authenticate_three_key_element_precise_response"),
+////        SerializerFeature.WriteMapNullValue);
+////    JSONObject contentJsonObject = JSON.parseObject(content);
+////
+////    // 校验结果
+////    String orderStatus = (String) contentJsonObject.get("order_status");
+////    if (StringUtils.isBlank(orderStatus) || !"SUCCESS".equals(orderStatus)) {
+////      return AjaxResult.error("绑卡认证失败,请核实信息正确性");
+////    }
+//
+//
+//    // 保存银行认证的请求记录
+//    YsCallLog ysCallLog = new YsCallLog();
+//    ysCallLog.setBizId(tradeNo);
+//    ysCallLog.setBizType(YsCallBizTypeEnum.BANK_CARD_AUTH);
+//    ysCallLog.setInterfaceId(YsPayMethodConstants.BANK_CARD_AUTH_METHOD);
+//    ysCallLog.setReqJson(JSONObject.toJSONString(bizContent));
+//    ysCallLog.setResJson(result);
+//    ysCallLogService.save(ysCallLog);
+//
+//    if (StringUtils.isBlank(result)) {
+//      logger.error("银行实名认证三要素失败,res为空,req =" + JSONObject.toJSONString(bizContent));
+//      return AjaxResult.error("认证失败");
+//    }
+//
+//    // 校验结果
+//    JSONObject response = JSONObject.parseObject(result);
+//    String orderStatus = (String) response.get("order_status");
+//    if (StringUtils.isBlank(orderStatus) || !"SUCCESS".equals(orderStatus)) {
+//      return AjaxResult.error("绑卡认证失败,请核实信息正确性");
+//    }
+//
+//    // 进行绑卡
+//    ChannelBankCard channelBankCard = new ChannelBankCard();
+//    channelBankCard.setChannelId(channelId);
+//    channelBankCard.setBankName(param.getBankName());
+////    channelBankCard.setIdCard(param.getIdCard());
+//    channelBankCard.setCardNo(param.getCardNo());
+//    channelBankCard.setUserName(param.getUserName());
+//    boolean res = channelBankCardService.save(channelBankCard);
+//    if (!res) {
+//      return AjaxResult.error("绑卡失败");
+//    }
+//    return AjaxResult.success();
+//  }
+
+
   /**
    * 渠道提现计算手续费
    */
@@ -99,6 +263,9 @@ public class ChannelWithdrawController extends BaseApiController {
     if (param.getMoney() > channel.getMoney() ) {
       return AjaxResult.error("提现金额超出了余额");
     }
+//    if (param.getMoney() < 500) {
+//      return AjaxResult.error("提现金额不能小于5元");
+//    }
     int feeAmt = new BigDecimal(param.getMoney()).multiply(feeRate)
         .divide(new BigDecimal(100), 0, RoundingMode.HALF_UP).intValue();
     ChannelWithdraw channelWithdraw = new ChannelWithdraw();

+ 30 - 0
mp-admin/src/main/java/com/qs/mp/web/controller/api/channel/mall/ChannelOrderController.java

@@ -12,6 +12,7 @@ import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.qs.mp.channel.domain.vo.ChannelOrderInfoVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderItemVO;
 import com.qs.mp.channel.service.IChannelOrderDetailService;
+import com.qs.mp.common.constant.Constants;
 import com.qs.mp.common.domain.DeliveryCompany;
 import com.qs.mp.common.enums.*;
 import com.qs.mp.common.service.IDeliveryCompanyService;
@@ -365,6 +366,35 @@ public class ChannelOrderController extends BaseApiController {
   }
 
 
+  /**
+   * 订单支付
+   */
+  @PostMapping("/dg/order/pay")
+  @ApiOperation(value = "订单支付" , notes = "在订单列表页面支付")
+  public AjaxResult dgPay(@Valid @RequestBody OrderPayParam param) {
+    Long userId = SecurityUtils.getLoginUser().getUserId();
+    SysUser sysUser = sysUserService.selectUserById(userId);
+    String channelOpenId = "";
+    if (StringUtils.isNotBlank(param.getOpenId())) {
+      channelOpenId = param.getOpenId();
+    } else {
+      channelOpenId = sysUser.getChannelOpenId();
+    }
+    if (StringUtils.isBlank(channelOpenId)) {
+      return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1005);
+    }
+    ChannelOrder channelOrder = channelOrderService.getById(param.getOrderId());
+    JSONObject jsonObject;
+    try {
+      jsonObject = walletService.dgWxPay(BizTypeEnum.CHANNEL_ORDER, param.getOrderId(), channelOpenId, channelOrder.getPayAmt(), channelOrder.getTitle(), AppSourceEnum.CHANNEL.getValue(), Constants.PAY_STYLE_WX);
+    }catch (ServiceException e) {
+      LogUtil.error(logger, e, "根据经销商采购订单创建支付单失败。userId:{0},orderId:{1}", new Object[]{userId, param.getOrderId()});
+      return AjaxResult.error(e.getMessage());
+    }
+    return AjaxResult.success(jsonObject);
+  }
+
+
 
   @PostMapping("/order/confirm")
   @ApiOperation("订单确认收货")

+ 1 - 1
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserChannelController.java

@@ -49,7 +49,7 @@ public class UserChannelController extends BaseApiController {
         try {
             channel = channelService.getById(qrCodeParam.getChannelId());
         } catch (Exception e) {
-            return AjaxResult.error("二维码查询失败");
+            return AjaxResult.error("门店'" + channel.getName() + "'二维码更新失败");
         }
         return AjaxResult.success("",channel.getQrCodePic());
     }

+ 69 - 2
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserDeliverOrderController.java

@@ -14,6 +14,8 @@ import com.qs.mp.admin.service.IGoodsService;
 import com.qs.mp.admin.service.IGoodsSkuService;
 import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.param.OrderPayParam;
+import com.qs.mp.common.constant.Constants;
+import com.qs.mp.common.constant.PayConstants;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.core.redis.RedisCache;
@@ -397,11 +399,11 @@ public class UserDeliverOrderController extends BaseApiController {
         Long userId = SecurityUtils.getLoginUser().getUserId();
         SysUser sysUser = sysUserService.selectUserById(userId);
         String openId = "";
-        if (param.getPayType() == 1) {
+        if (PayConstants.ALI_PAY_TYPE.equals(param.getPayType())) {
             if (StringUtils.isBlank(sysUser.getAliuserId())) {
                 return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1026);
             }
-        } else {
+        } else if (PayConstants.WX_PAY_TYPE.equals(param.getPayType())) {
             AppSourceEnum appSourceEnum = AppSourceEnum.getByValue(param.getAppSource());
             if (AppSourceEnum.MSDQ.equals(appSourceEnum)) {
                 if (StringUtils.isBlank(sysUser.getMsdqOpenId())) {
@@ -424,6 +426,10 @@ public class UserDeliverOrderController extends BaseApiController {
                 jsonObject = walletService.directAliPay(BizTypeEnum.DELIVER_ORDER, param.getOrderId(),
                     sysUser.getAliuserId(),
                     deliverOrder.getPayAmt(), "盲票--提货订单");
+            } else if (PayConstants.H5_PAY_TYPE.equals(param.getPayType())) {
+                // h5支付
+                jsonObject = walletService.h5Pay(BizTypeEnum.DELIVER_ORDER, param.getOrderId(),
+                    deliverOrder.getPayAmt(), "盲票--提货订单");
             } else {
                 // 微信支付
                 jsonObject = walletService.pay(BizTypeEnum.DELIVER_ORDER, param.getOrderId(), openId,
@@ -436,6 +442,67 @@ public class UserDeliverOrderController extends BaseApiController {
         return AjaxResult.success(jsonObject);
     }
 
+
+    @PostMapping("/dg/order/pay")
+    @ApiOperation(value = "订单支付", notes = "订单支付")
+    public AjaxResult dgpay(@Valid @RequestBody OrderPayParam param) {
+
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        SysUser sysUser = sysUserService.selectUserById(userId);
+        String openId = "";
+        //支付方式:1支付宝,2微信
+        Integer payType = param.getPayType();
+        if (payType == 1) {
+            if (StringUtils.isBlank(sysUser.getAliuserId())) {
+                return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1026);
+            }
+        } else {
+            AppSourceEnum appSourceEnum = AppSourceEnum.getByValue(param.getAppSource());
+            if (AppSourceEnum.MSDQ.equals(appSourceEnum)) {
+                if (StringUtils.isBlank(sysUser.getMsdqOpenId())) {
+                    return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1005);
+                }
+                openId = sysUser.getMsdqOpenId();
+            } else {
+                if (StringUtils.isBlank(sysUser.getOpenId())) {
+                    return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1005);
+                }
+                openId = sysUser.getOpenId();
+            }
+        }
+
+        //获取订单
+        UserDeliverOrder deliverOrder = userDeliverOrderService.getById(param.getOrderId());
+        //获取支付参数
+        //openid-->code
+        //支付方式:1支付宝,2微信
+
+        JSONObject jsonObject;
+        try {
+
+            if (param.getPayType() == 1) {
+                // 支付宝支付
+                jsonObject = walletService.dgAliPay(BizTypeEnum.DELIVER_ORDER, param.getOrderId(), sysUser.getAliuserId(),
+                        deliverOrder.getPayAmt(), "盲票--提货订单", Constants.PAY_STYLE_ALI, param.getAppSource());
+
+            } else {
+                // 微信支付
+                jsonObject = walletService.dgWxPay(BizTypeEnum.DELIVER_ORDER, param.getOrderId(), openId,
+                        deliverOrder.getPayAmt(), "盲票--提货订单", param.getAppSource(), Constants.PAY_STYLE_WX);
+
+            }
+
+        } catch (Exception e) {
+            LogUtil.error(logger, e, "根据提货单创建支付单失败。userId:{0},orderId:{1}",
+                    new Object[]{userId, param.getOrderId()});
+            return AjaxResult.error(e.getMessage());
+        }
+        return AjaxResult.success(jsonObject);
+
+    }
+
+
+
     @PostMapping("/order/confirm")
     @ApiOperation("订单确认收货")
     public AjaxResult confirm(@RequestBody UserDeliverOrder order) {

+ 78 - 3
mp-admin/src/main/java/com/qs/mp/web/controller/api/user/UserTicketOrderController.java

@@ -1,8 +1,11 @@
 package com.qs.mp.web.controller.api.user;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.RandomUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.google.common.collect.Maps;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.TicketBoxGoods;
@@ -17,6 +20,8 @@ import com.qs.mp.channel.domain.ChannelOrder;
 import com.qs.mp.channel.domain.param.OrderPayParam;
 import com.qs.mp.channel.domain.vo.PromoterVO;
 import com.qs.mp.channel.service.IPromoterUserService;
+import com.qs.mp.common.constant.Constants;
+import com.qs.mp.common.constant.PayConstants;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.core.redis.RedisCache;
@@ -47,6 +52,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import javax.validation.Valid;
@@ -282,11 +288,11 @@ public class UserTicketOrderController extends BaseApiController {
         Long userId = SecurityUtils.getLoginUser().getUserId();
         SysUser sysUser = sysUserService.selectUserById(userId);
         String openId = "";
-        if (param.getPayType() == 1) {
+        if (PayConstants.ALI_PAY_TYPE.equals(param.getPayType())) {
             if (StringUtils.isBlank(sysUser.getAliuserId())) {
                 return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1026);
             }
-        } else {
+        } else if (PayConstants.WX_PAY_TYPE.equals(param.getPayType())){
             AppSourceEnum appSourceEnum = AppSourceEnum.getByValue(param.getAppSource());
             if (AppSourceEnum.MSDQ.equals(appSourceEnum)) {
                 if (StringUtils.isBlank(sysUser.getMsdqOpenId())) {
@@ -304,10 +310,14 @@ public class UserTicketOrderController extends BaseApiController {
         UserTicketOrder ticketOrder = userTicketOrderService.getById(param.getOrderId());
         JSONObject jsonObject;
         try {
-            if (param.getPayType() == 1) {
+            if (PayConstants.ALI_PAY_TYPE.equals(param.getPayType())) {
                 // 支付宝支付
                 jsonObject = walletService.directAliPay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), sysUser.getAliuserId(),
                     ticketOrder.getPayAmt(), ticketOrder.getTitle());
+            } else if ((PayConstants.H5_PAY_TYPE.equals(param.getPayType()))) {
+                // H5支付
+                jsonObject = walletService.h5Pay(BizTypeEnum.TICKET_ORDER, param.getOrderId(),
+                    ticketOrder.getPayAmt(), ticketOrder.getTitle());
             } else {
                 // 微信支付
                 jsonObject = walletService.pay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), openId,
@@ -321,6 +331,71 @@ public class UserTicketOrderController extends BaseApiController {
         return AjaxResult.success(jsonObject);
     }
 
+    /**
+     * 斗拱订单支付
+     */
+    @PostMapping("/order/dg/pay")
+    @ApiOperation(value = "订单支付", notes = "在盲票页面支付")
+    public AjaxResult dgpay(@Valid @RequestBody OrderPayParam param) {
+
+        Long userId = SecurityUtils.getLoginUser().getUserId();
+        SysUser sysUser = sysUserService.selectUserById(userId);
+        String openId = "";
+        //支付方式:1支付宝,2微信
+        Integer payType = param.getPayType();
+        if (payType == 1) {
+            if (StringUtils.isBlank(sysUser.getAliuserId())) {
+                return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1026);
+            }
+        } else {
+            AppSourceEnum appSourceEnum = AppSourceEnum.getByValue(param.getAppSource());
+            if (AppSourceEnum.MSDQ.equals(appSourceEnum)) {
+                if (StringUtils.isBlank(sysUser.getMsdqOpenId())) {
+                    return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1005);
+                }
+                openId = sysUser.getMsdqOpenId();
+            } else {
+                if (StringUtils.isBlank(sysUser.getOpenId())) {
+                    return AjaxResult.error(ErrorCodeEnum.ERROR_CODE_1005);
+                }
+                openId = sysUser.getOpenId();
+            }
+        }
+
+        //获取订单
+        UserTicketOrder ticketOrder = userTicketOrderService.getById(param.getOrderId());
+        //获取支付参数
+        //openid-->code
+        //支付方式:1支付宝,2微信
+        //获取实际支付金额,需要判断是否0元订单的情况
+        Integer payAmt = ticketOrder.getPayAmt();
+
+
+        JSONObject jsonObject;
+        try {
+
+            if (param.getPayType() == 1) {
+                // 支付宝支付
+                jsonObject = walletService.dgAliPay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), sysUser.getAliuserId(),
+                        ticketOrder.getPayAmt(), ticketOrder.getTitle(), Constants.PAY_STYLE_ALI, param.getAppSource());
+
+            } else {
+                // 微信支付
+                jsonObject = walletService.dgWxPay(BizTypeEnum.TICKET_ORDER, param.getOrderId(), openId,
+                        ticketOrder.getPayAmt(), ticketOrder.getTitle(), param.getAppSource(), Constants.PAY_STYLE_WX);
+
+            }
+
+        } catch (Exception e) {
+            LogUtil.error(logger, e, "根据盲票购买订单创建支付单失败。userId:{0},orderId:{1}",
+                    new Object[]{userId, param.getOrderId()});
+            return AjaxResult.error(e.getMessage());
+        }
+        return AjaxResult.success(jsonObject);
+
+
+    }
+
     /**
      * 可用优惠券列表
      */

+ 15 - 0
mp-admin/src/main/resources/application-dev.yml

@@ -141,3 +141,18 @@ shipping:
     channel: 7
 bind:
     channelId: 2
+
+# 银盛支付配置
+ys-pay:
+    private-key-path: /Users/cup/WORK/data/ysPay/ysPayPre.pfx
+    public-key-path: /Users/cup/WORK/data/ysPay/businessgate.cer
+    # 支付完后跳转
+    return-url: https://test-mp-h5.quanshu123.com
+    # 支付回调地址
+    pay-notify-url: https://test-mp.quanshu123.com/service/notify/ysCallback
+    # 分账回调地址
+    div-notify-url: https://test-mp.quanshu123.com/service/notify/ysDivCallback
+    # 提现回调地址
+    withdraw-notify-url: https://test-mp.quanshu123.com/service/notify/ysWithdrawCallback
+
+

+ 41 - 20
mp-admin/src/main/resources/application-test.yml

@@ -1,10 +1,14 @@
 mp:
-  # 文件路径 示例( Windows配置D:/ygp/uploadPath,Linux配置 /home/ygp/uploadPath)
-  profile: /home/quanshu/mp-server
+  profile: /home/mangpiao/mp-server
 pay:
-  callbackUrl: https://test-mp.quanshu123.com/service/notify/payCallback
+  callbackUrl: https://mptest.kaimanghe.net/service/notify/dg/orderCallback
+  dgPay:
+    dougongMiniNoticeUrl: https://mptest.kaimanghe.net/service/notify/dg/orderCallback
+    dougongMiniRefundNoticeUrl: https://test-mp-adm.kaimanghe.net/test-api/service/notify/dgRefundCallback
+    dougongMerchantSubmitsBackPageUrl: https://test-mp-adm.kaimanghe.net/test-api/service/notify/dgMerchantSubmitsBackPageUrl
+    dougongMerchantSubmitsAsyncReceiveUrl: https://test-mp-adm.kaimanghe.net/test-api/service/notify/dgMerchantSubmitsAsyncReceiveUrl
 alipay:
-  callbackUrl: https://test-mp.quanshu123.com/service/notify/alipayCallback
+  callbackUrl: https://test-mp-adm.kaimanghe.net/test-api/service/notify/alipayCallback
 
 # 日志配置
 logging:
@@ -20,9 +24,9 @@ logging:
 # 数据源配置
 spring:
     redis:
-      host: 172.17.16.14
+      host: 43.143.93.199
       port: 6379
-      password: '@9(s2sWppxkess'
+      password: 1PQd[NOc$8pWGNJ
       # 连接超时时间(毫秒)
       timeout: 10000
       jedis:
@@ -41,9 +45,9 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://172.17.16.14:3306/mpdb_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                username: mptest
-                password: wan789*@dfhzHu518!dr2xosn
+                url: jdbc:mysql://43.143.93.199:3306/mpdb_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                username: root
+                password: mp@666888
             # 从库数据源
             slave:
                 # 从数据源开关/默认关闭
@@ -113,21 +117,22 @@ client:
 # cloud
 cloud:
   # 存储对象公开可访问
-  public-bucket-name: mp-public-test-1307117429
+  public-bucket-name: mp-public-test-1309783959
   # 存储对象公开不可访问,需要通过应用下载
-  private-bucket-name: mp-auth-test-1307117429
+  private-bucket-name: mp-auth-test-1309783959
 
-  accessKey: AKIDDF4dwzlGVTAmCMGvLVP4UfbHiuqVzFEw
-  secretKey: TgbFcjZ8HDse9ToujIabLo1yf5YqtfBX
+  accessKey: AKIDue8LHwKSJsBDySgdJjslNilY4JHyOXPz
+  secretKey: SdXAWbPwDDvMXR5SYOxtYw3sQhhQs2wZ
   region: ap-shanghai
 
-mq:
-  consumer-conn: true
-  service-url: http://pulsar-op4bzppa37m4.tdmq-pulsar.ap-sh.public.tencenttdmq.com:8080
-  auth-token: eyJrZXlJZCI6InB1bHNhci1vcDRienBwYTM3bTQiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJwdWxzYXItb3A0YnpwcGEzN200X21wLXNlcnZlci10ZXN0In0.GVeFHHSqIYqTeOtXItWOT-NfydCSNvvVVS2FlpFZNKY
-  topic-ticket-generate: pulsar-op4bzppa37m4/test-share/topic-ticket-generate
-  topic-ticket-pay: pulsar-op4bzppa37m4/test-share/topic-ticket-pay
-  consumer-topics: pulsar-op4bzppa37m4/test-share/topic-ticket-generate,pulsar-op4bzppa37m4/test-share/topic-ticket-pay
+# 注释mq
+#mq:
+#  consumer-conn: true
+#  service-url: http://pulsar-op4bzppa37m4.tdmq-pulsar.ap-sh.public.tencenttdmq.com:8080
+#  auth-token: eyJrZXlJZCI6InB1bHNhci1vcDRienBwYTM3bTQiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJwdWxzYXItb3A0YnpwcGEzN200X21wLXNlcnZlci10ZXN0In0.GVeFHHSqIYqTeOtXItWOT-NfydCSNvvVVS2FlpFZNKY
+#  topic-ticket-generate: pulsar-op4bzppa37m4/test-share/topic-ticket-generate
+#  topic-ticket-pay: pulsar-op4bzppa37m4/test-share/topic-ticket-pay
+#  consumer-topics: pulsar-op4bzppa37m4/test-share/topic-ticket-generate,pulsar-op4bzppa37m4/test-share/topic-ticket-pay
 
 
 # 小程序
@@ -145,3 +150,19 @@ shipping:
   channel: 7
 bind:
   channelId: 2
+
+
+# 银盛支付配置
+ys-pay:
+  private-key-path: /home/mangpiao/mp-server/data/ysPayPre.pfx
+  public-key-path: /home/mangpiao/mp-server/data/businessgate.cer
+  # 支付完后跳转
+  return-url: https://test-mp-adm.kaimanghe.net
+  # 回调地址
+  pay-notify-url: https://test-mp-adm.kaimanghe.net/service/notify/ysCallback
+  # 分账回调地址
+  div-notify-url: https://test-mp-adm.kaimanghe.net/service/notify/ysDivCallback
+  # 提现回调地址
+  withdraw-notify-url: https://test-mp-adm.kaimanghe.net/service/notify/ysWithdrawCallback
+
+

+ 20 - 5
mp-admin/src/main/resources/application.yml

@@ -30,7 +30,7 @@ spring:
     # 国际化资源文件路径
     basename: i18n/messages
   profiles:
-    active: dev
+    active: test
   # 文件上传
   servlet:
      multipart:
@@ -131,9 +131,11 @@ wx-channel:
   appSecret: 7708655ba65f04de2a42f23d20ab4134
 #用户端小程序appid和密钥
 wx-user:
-  appId: wx8533800e393dbd6b
+#  appId: wx8533800e393dbd6b
+  appId: wxffb4598e70b9f871
   #appId: wxb86cb7f459fc3675
-  appSecret: f7a104e09d6c2e55445be2a45c4ab551
+#  appSecret: f7a104e09d6c2e55445be2a45c4ab551
+  appSecret: 1c7ba0eed8c0287b8800b089e3c9d102
 #公众号appid
 wxgzh:
   appId: wxfe9785e665c741a2
@@ -153,11 +155,24 @@ pay:
   baseUrl: https://jlpays.kakapaypay.com
   user-shopNo: 1646882813774
   user-sign: 614140724fb74085be8aef8bebc538ed
-  channel-shopNo: 1647504328218
+  #channel-shopNo: 1647504328218  渠道商户号
+  channel-shopNo: 6666000137086360
   channel-sign: 0e0c00555fee4549b1a88af4d988415b
-  msdq-shopNo: 1657242588900
+  #msdq-shopNo: 1657242588900   商户号
+  msdq-shopNo: 6666000137501979
   msdq-sign: e39069383c6944a18abc0b03a4ad0217
 
+# 银盛支付配置
+ys-pay:
+  serverUrl: https://openapi.ysepay.com/gateway.do
+  # 商户号
+  partner-id: ecoloshare
+  private-key-pass: FAl9S8TmGB80
+  # 主收款商户号
+  master-seller-id: 0000400267870283
+  # 子商户号
+  child-seller-id: 0000400267870291
+
 #幸运数字加密密钥对
 rsa:
   private-key: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJsdnYuNQGwzutcBPzVXXP9oizi5nVMlI4IohcoLH5iV2dZ39XkcWMbjithn4FBe2Y7N7lougVCRtSyOCLc63vJ9V2w7NrqHnQVIOkse9XhiBNEpQy9PKEm1lM9lZZL6fya4UDaYzGZUD9qq7FzNBBvXwhlXP3Bj4uSodf1M4HmBAgMBAAECgYB43EJ9Ebo4lLXoANi3PzL+7v5LXJTwy+c260wTeUdNJLVvHljt3OBvV6w/ofBtrvnlAx/MtJ+dn2qDJMg1vHEpWPVwTvL+8cqih5RwD6TBG9WH4ERF1fb40Z5FD+muDHK5ubgZNGicPH7T0/L6GYrGCeF9PS6sP+FvdywE5xHKgQJBANI2cpqM8B4c+LC3yQEQDJFbid1EaJEWeX9pHglAn7HhAJgpVCPO3vLainZ9Y2mgyR9ZntWW46YmtRWEOha/Lp0CQQC85u9CE1JPJGyYhIPw8+VVvdWlXzOzYIxtuQjr7ryMMYJttXLbp2q30rCRICyzsmpR26s+GXFGgo5XusvRoS81AkEAwID8EmxeuDTvyWWEvWRlHfgmGGs9FyDtwrAQwYhcthjG4pF2bBRWNy/K/Rd2opSLmhoISrETaGSqEDo2t/38QQJAK69sXWeCfXL6+jqLGMoOm0mPgvMFTdJiJ23HNmi7ieBZPW3c5hdNgr1iv+0k6Vm1ZMDcVTwlCh1fNcKpKA2SkQJBAL0DAXA26tk6LUWdBkXp54dJV/nm4/NDN6KWB+Tu5kcqteW7qCqgBToWJsxv6wLIcd5T20875gns1Btt1Vsq9Ss=

+ 1 - 1
mp-admin/src/main/resources/logback-8091.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-	<property name="log.path" value="/home/quanshu/mp-server" />
+	<property name="log.path" value="/home/quanshu/mp-server"/>
     <!-- 日志输出格式 -->
     <!-- You can override this to have a custom pattern -->
 	<property name="CONSOLE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

+ 1 - 1
mp-admin/src/main/resources/logback-spring.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration>
     <!-- 日志存放路径 -->
-	<property name="log.path" value="/Users/Steven/Documents/logs" />
+	<property name="log.path" value="/Users/Cup/Documents/logs" />
     <!-- 日志输出格式 -->
     <!-- You can override this to have a custom pattern -->
 	<property name="CONSOLE_LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

+ 311 - 20
mp-admin/src/test/java/com/qs/mp/task/MyTest.java

@@ -9,8 +9,22 @@ import cn.hutool.crypto.SecureUtil;
 import cn.hutool.crypto.symmetric.DES;
 import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
 import cn.hutool.crypto.symmetric.SymmetricCrypto;
+import cn.hutool.http.HttpRequest;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.parser.Feature;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.eptok.yspay.opensdkjava.fund.BankAuthorityApi;
+import com.eptok.yspay.opensdkjava.fund.MercFundApi;
+import com.eptok.yspay.opensdkjava.pojo.vo.OnlineReqDataVo;
+import com.eptok.yspay.opensdkjava.util.Base64Utils;
+import com.eptok.yspay.opensdkjava.util.DateUtil;
+import com.eptok.yspay.opensdkjava.util.SrcDesUtil;
+import com.eptok.yspay.opensdkjava.util.YsOnlineSignUtils;
+import com.eptok.yspay.opensdkjava.util.YsfSignUtil;
 import com.qs.mp.admin.domain.Coupon;
 import com.qs.mp.admin.domain.CouponTicket;
 import com.qs.mp.admin.domain.GoodsCard;
@@ -19,17 +33,23 @@ import com.qs.mp.admin.service.ICouponChannelService;
 import com.qs.mp.admin.service.ICouponService;
 import com.qs.mp.admin.service.ICouponTicketService;
 import com.qs.mp.admin.service.IGoodsCardService;
+import com.qs.mp.common.constant.YsServerApiConstants;
 import com.qs.mp.common.core.redis.DistributedLocker;
 import com.qs.mp.common.core.redis.RedisCache;
+import com.qs.mp.common.domain.YsCallLog;
+import com.qs.mp.common.enums.DivisionStatusEnum;
 import com.qs.mp.common.enums.UserTypeEnum;
+import com.qs.mp.common.enums.YsCallBizTypeEnum;
 import com.qs.mp.common.utils.AESUtil;
 import com.qs.mp.common.utils.DateUtils;
 import com.qs.mp.common.utils.RSAUtil;
 import com.qs.mp.common.utils.WebhookService;
 import com.qs.mp.common.utils.html.EscapeUtil;
+import com.qs.mp.common.utils.http.OkHttpUtil;
 import com.qs.mp.common.utils.uuid.IdUtils;
 import com.qs.mp.common.utils.uuid.UUID;
 import com.qs.mp.framework.service.IWxSubscribeMessage;
+import com.qs.mp.pay.domain.DivisionLog;
 import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.quartz.task.DayStatTask;
 import com.qs.mp.quartz.task.MarketingTask;
@@ -38,13 +58,16 @@ import com.qs.mp.system.service.id.BizIdGenerator;
 import com.qs.mp.user.domain.MarketingUserCode;
 import com.qs.mp.user.service.IMarketingUserCodeService;
 import com.qs.mp.utils.SecurityUtils;
+import com.taobao.api.Constants;
 import java.util.concurrent.TimeUnit;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.http.client.methods.HttpRequestBase;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.test.context.SpringBootTest;
 
 import java.io.IOException;
@@ -57,6 +80,7 @@ import java.util.*;
  */
 @SpringBootTest
 public class MyTest {
+
     protected final Logger logger = LoggerFactory.getLogger(this.getClass());
 
 
@@ -102,11 +126,279 @@ public class MyTest {
     @Autowired
     private TicketOrderTask ticketOrderTask;
 
-    public static void main(String[] args) {
-        WebhookService.sendAlertDing("mayday,mayday,上上下下,左右左右,BABA");
+    @Value("${ys-pay.serverUrl}")
+    private String serverUrl;
+
+    @Value("${ys-pay.partner-id}")
+    private String partnerId;
+
+    @Value("${ys-pay.private-key-pass}")
+    private String privateKeyPass;
+
+    @Value("${ys-pay.private-key-path}")
+    private String privateKeyPath;
+
+    @Value("${ys-pay.public-key-path}")
+    private String publicKeyPath;
+
+
+    @Value("${ys-pay.withdraw-notify-url}")
+    private String ysWithdrawNotifyUrl;
+
+
+    /**
+     * 分账查询测试
+     */
+    @Test
+    void test22() {
+        // test232
+        OnlineReqDataVo req = new OnlineReqDataVo();
+
+        //请求路径,建议配置在项目的配置文件里面
+        String reqUrl = "https://commonapi.ysepay.com/gateway.do";
+
+        //银盛支付服务器主动通知商户网站里指定的页面http路径
+        String notifyUrl = "http://api.test.ysepay.net/atinterface/receive_return.htm";
+        req.setNotifyUrl(notifyUrl);
+
+        //商户在银盛支付平台开设的用户号[商户号],接入时需要替换成自己的
+        req.setPartnerId(partnerId);
+        req.setReqUrl(reqUrl);
+        req.setPrivateKeyFilePath(privateKeyPath);
+        req.setPrivateKeyPassword(privateKeyPass);
+        req.setYsPublicKeyFilePath(publicKeyPath);
+        //线上分账查询接口业务参数
+        Map<String, Object> bizContent = new HashMap<>();
+        bizContent.put("src_usercode", partnerId);//原交易发起方
+        bizContent.put("out_trade_no", "20230414176151484");//原订单号
+        bizContent.put("sys_flag", "DD");//可空。系统标志 DD:订单交易,DS:代收交易,默认是DD,订单交易
+        req.setParamData(bizContent);
+        String result = null;
+        try{
+            logger.info("线上分账查询调用sdk接口addScanMerc请求入参为:"+ JSONObject.toJSONString(req));
+            result = MercFundApi.divisionOnlineQuery(req);
+            System.out.println("result = " + result);
+            //根据返回结果处理自己的业务逻辑,result内容详见接口文档
+        }catch (Exception e){
+            logger.info("线上分账查询接口失败:"+ e.getMessage());
+        }
 
-        String decrypt = AESUtil.decrypt("75213771c6c781d62136e39180303be03f0a99761114c1264f116051a9e95108");
-        System.out.println("decrypt = " + decrypt);
+
+    }
+
+
+    /**
+     * 分账测试
+     */
+    @Test
+    void test21() {
+        // 调用分账登记接口
+        OnlineReqDataVo req = new OnlineReqDataVo();
+        req.setReqUrl(YsServerApiConstants.COMMON_API);
+        req.setNotifyUrl("https://test-mp.quanshu123.com/service/notify/ysDivCallback");
+        req.setPartnerId(partnerId);
+        req.setPrivateKeyFilePath(privateKeyPath);
+        req.setPrivateKeyPassword(privateKeyPass);
+        req.setYsPublicKeyFilePath(publicKeyPath);
+        // 分账登记业务参数
+        Map<String, Object> bizContent = new HashMap<>();
+        String divTradeNo = DateUtil.getDateNowYmd() + DateUtil.getRandom(14);
+        divTradeNo = "2023041335526144";
+        bizContent.put("out_trade_no", divTradeNo);
+        bizContent.put("payee_usercode", partnerId);
+        bizContent.put("total_amount", "0.10");
+        bizContent.put("is_divistion", "02");
+        bizContent.put("is_again_division", "N");
+        bizContent.put("division_mode", "01");
+        // 分账明细
+//        JSONArray divList = new JSONArray();
+//        JSONObject divObject = new JSONObject();
+//        divObject.put("division_mer_usercode", partnerId);
+//        divObject.put("div_ratio", "1");
+//        divObject.put("is_chargeFee", "02");
+//        divList.add(divObject);
+        //分账明细
+//        bizContent.put("div_list", divList);
+        req.setParamData(bizContent);
+        String result = null;
+        DivisionLog divisionLog = new DivisionLog();
+        divisionLog.setStatus(DivisionStatusEnum.INIT);
+        try{
+            logger.info("分账登记调用sdk接口addScanMerc请求入参为:"+ JSONObject.toJSONString(req));
+            result = MercFundApi.divisionOnlineAccept(req);
+            logger.info("分账登记调用addScanMerc出参为:"+ result);
+            //根据返回结果处理自己的业务逻辑,result内容详见接口文档
+        }catch (Exception e){
+            divisionLog.setStatus(DivisionStatusEnum.SUBMIT_FAIL);
+            logger.error("线上分账登记接口失败:"+ e.getMessage());
+        }
+    }
+
+    /**
+     * 提现测试方法
+     */
+    @Test
+    void test20() {
+
+
+
+        String tradeNo = DateUtil.getDateNowYmd() + DateUtil.getRandom(14);
+
+
+        OnlineReqDataVo req = new OnlineReqDataVo();
+        req.setReqUrl(YsServerApiConstants.COMMON_API);
+        req.setPrivateKeyFilePath(privateKeyPath);
+        req.setYsPublicKeyFilePath(publicKeyPath);
+        req.setPrivateKeyPassword(privateKeyPass);
+        req.setNotifyUrl(ysWithdrawNotifyUrl);
+        req.setPartnerId(partnerId);
+
+        //实时提现(一般户到银行卡)业务参数
+        Map<String, Object> bizContent = new HashMap<>();
+        //商户生成的订单号,生成规则前8位必须为交易日期,如20180525,范围跨度支持包含当天在内的前后一天
+        bizContent.put("out_trade_no", tradeNo);
+        //商户号
+        bizContent.put("merchant_usercode", partnerId);
+        //暂时只支持币种:CNY(人民币)
+        bizContent.put("currency", "CNY");
+        //提现的总金额。单位为:RMB Yuan。取值范围为[0.01,99999999.99],精确到小数点后两位。Number(10,2)指10位长度,2位精度
+        bizContent.put("total_amount", "0.04");
+        //订单说明
+        bizContent.put("subject", "提现了");
+        //商户日期(该参数做交易与查询时需要一致) 该日期需在当日的前后一天时间范围之内
+        bizContent.put("shopdate", DateUtil.getDateNowYmd());
+        //银行帐号
+        bizContent.put("bank_account_no", "6212260488888888888");
+        req.setParamData(bizContent);
+        String result = null;
+        try{
+            logger.info("实时提现(一般户到银行卡)调用sdk接口addScanMerc请求入参为:"+ JSONObject.toJSONString(req));
+            //根据返回结果处理自己的业务逻辑,result内容详见接口文档
+            result = MercFundApi.withdrawQuick(req);
+        }catch (Exception e){
+            logger.info("实时提现(一般户到银行卡)失败:"+ e.getMessage());
+        }
+
+        System.out.println("result = " + result);
+    }
+
+    @Test
+    void test19() {
+        // 调用接口校验
+        OnlineReqDataVo req = new OnlineReqDataVo();
+        req.setReqUrl(YsServerApiConstants.OPEN_API);
+        req.setPartnerId(partnerId);
+        req.setPrivateKeyFilePath(privateKeyPath);
+        req.setYsPublicKeyFilePath(publicKeyPath);
+        req.setPrivateKeyPassword(privateKeyPass);
+
+        //银行实名认证三要素下单业务参数
+        Map<String, Object> bizContent = new HashMap<>();
+        String tradeNo = DateUtil.getDateNowYmd() + DateUtil.getRandom(14);
+        //商户生成的订单号,生成规则前8位必须为交易日期,如20180525,范围跨度支持包含当天在内的前后一天
+        bizContent.put("out_trade_no", tradeNo);
+        //商户日期(该参数做交易与查询时需要一致)该日期需在当日的前后一天时间范围之内
+        bizContent.put("shopdate", DateUtil.getDateNowYmd());
+        //实名认证姓名--请填写真实信息
+        bizContent.put("bank_account_name", "张三");
+        //银行帐号,支持对公对私
+        bizContent.put("bank_account_no", "6212260488888888888");
+        //证件号码,目前只支持身份证
+        bizContent.put("id_card", "41022319940916602X");
+        req.setParamData(bizContent);
+
+        String result = null;
+        try {
+            logger.info("银行实名认证三要素调用sdk接口addScanMerc请求入参为:" + JSONObject.toJSONString(req));
+            //根据返回结果处理自己的业务逻辑,result内容详见接口文档
+            result = BankAuthorityApi.sendBankAuthThreePrecise(req);
+        } catch (Exception e) {
+            logger.info("银行实名认证三要素失败:" + e.getMessage());
+        }
+        System.out.println("result = " + result);
+    }
+
+    @Test
+    void test18() {
+        walletService.h5Pay(null, "0239021091224323", 100, "测试测试测试");
+    }
+
+    /**
+     * 实名认证方法
+     */
+    @Test
+    void test17() {
+        OnlineReqDataVo req = new OnlineReqDataVo();
+        //商户在银盛支付平台开设的用户号[商户号],接入时需要替换成自己的
+        req.setPartnerId(partnerId);
+        req.setReqUrl(YsServerApiConstants.OPEN_API);
+        req.setPrivateKeyFilePath(privateKeyPath);
+        req.setPrivateKeyPassword(privateKeyPass);
+        req.setYsPublicKeyFilePath(publicKeyPath);
+        //银行实名认证三要素下单业务参数
+        Map<String, Object> bizContent = new HashMap<>();
+        bizContent.put("out_trade_no", DateUtil.getDateNowYmd() + DateUtil.getRandom(6));//商户生成的订单号,生成规则前8位必须为交易日期,如20180525,范围跨度支持包含当天在内的前后一天
+        bizContent.put("shopdate", DateUtil.getDateNowYmd());//商户日期(该参数做交易与查询时需要一致)该日期需在当日的前后一天时间范围之内
+        bizContent.put("bank_account_name", "李四");//实名认证姓名--请填写真实信息
+        bizContent.put("bank_account_no", "6212260488888888888");//银行帐号,支持对公对私
+        bizContent.put("id_card","41022319940916602X");//证件号码,目前只支持身份证
+        req.setParamData(bizContent);
+        String result = null;
+        try{
+            logger.info("银行实名认证三要素调用sdk接口addScanMerc请求入参为:"+ JSONObject.toJSONString(req));
+            //根据返回结果处理自己的业务逻辑,result内容详见接口文档
+            result = BankAuthorityApi.sendBankAuthThreePrecise(req);
+        }catch (Exception e){
+            logger.info("银行实名认证三要素失败:"+ e.getMessage());
+        }
+        System.out.println("result = " + result);
+
+    }
+
+    /**
+     * 实名认证测试方法
+     * @throws Exception
+     */
+    @Test
+    void test16() throws Exception {
+
+        Map<String, String> mapData = new HashMap<>();
+        mapData.put("partner_id", partnerId);
+        mapData.put("method", "ysepay.authenticate.three.key.element.precise");
+        mapData.put("timestamp", DateUtil.getDateNow());
+        mapData.put("sign_type", "RSA");
+        mapData.put("charset", "utf-8");
+        mapData.put("version", "3.0");
+//        mapData.put("out_trade_no", "202003276843192280647119");
+
+        JSONObject json = new JSONObject();
+        json.put("out_trade_no", DateUtil.getDateNowYmd() + DateUtil.getRandom(6));
+        json.put("shopdate", DateUtil.getDateNowYmd());
+        json.put("bank_account_name", "蒋浩");
+        json.put("bank_account_no", "6212260488888888888");
+        json.put("id_card", SrcDesUtil.encryptData(partnerId, "331081199909124619"));
+        mapData.put("biz_content", json.toString());
+        //参数签名
+        try {
+            String sign = YsOnlineSignUtils.sign(mapData, privateKeyPass, privateKeyPath);
+            mapData.put("sign", sign);
+            System.out.println("sign = " + sign);
+        } catch (Exception e) {
+            System.err.println("签名异常" + e);
+        }
+
+        String result = OkHttpUtil.post("https://openapi.ysepay.com/gateway.do", mapData);
+
+        // 结果验签
+        JSONObject jsonObject = JSON.parseObject(result, Feature.OrderedField);
+        // 加签内容
+        String content = JSONObject.toJSONString(
+            jsonObject.get("ysepay_authenticate_three_key_element_precise_response"),
+            SerializerFeature.WriteMapNullValue);
+
+
+        System.out.println("返回" + result);
+        System.out.println("content = " + content);
 
     }
 
@@ -118,7 +410,7 @@ public class MyTest {
 
     @Test
     void test14() {
-        distributedLocker.tryLock("goods_card_lock_key_466",0,-1, TimeUnit.SECONDS);
+        distributedLocker.tryLock("goods_card_lock_key_466", 0, -1, TimeUnit.SECONDS);
     }
 
     @Test
@@ -145,9 +437,9 @@ public class MyTest {
 
 
     @Test
-    void test10(){
+    void test10() {
         for (int i = 0; i < 1; i++) {
-            couponService.distributeByMarketing(188L,"56");
+            couponService.distributeByMarketing(188L, "56");
         }
 
     }
@@ -162,7 +454,7 @@ public class MyTest {
     }
 
     @Test
-    void test8(){
+    void test8() {
         dayStatTask.stat("20220713");
     }
 
@@ -177,34 +469,34 @@ public class MyTest {
 
 
     @Test
-    void test6(){
+    void test6() {
 //        List<MarketingUserCode> userCodeList = marketingUserCodeService.list(new LambdaQueryWrapper<MarketingUserCode>()
 //                .select(MarketingUserCode::getUserId)
 //                .eq(MarketingUserCode::getMarketingId, 102)
 ////                .eq(MarketingUserCode::getUserType, UserTypeEnum.ORDINARY.getValue())
 //                .groupBy(MarketingUserCode::getUserId));
         List<MarketingUserCode> userCodeList = marketingUserCodeService.list(new LambdaQueryWrapper<MarketingUserCode>()
-                .select(MarketingUserCode::getUserId)
-                .eq(MarketingUserCode::getUserType, UserTypeEnum.ORDINARY.getValue())
-                .groupBy(MarketingUserCode::getUserId));
+            .select(MarketingUserCode::getUserId)
+            .eq(MarketingUserCode::getUserType, UserTypeEnum.ORDINARY.getValue())
+            .groupBy(MarketingUserCode::getUserId));
         userCodeList.forEach(System.out::println);
     }
 
     @Test
     void test5() {
-        Set<String> testSet =new HashSet<>();
+        Set<String> testSet = new HashSet<>();
         testSet.add("test1");
         testSet.add("test2");
         testSet.add("test3");
         testSet.add("test4");
-        redisCache.setCacheSet("testSet",testSet);
+        redisCache.setCacheSet("testSet", testSet);
         List<Object> list = new ArrayList<>();
         list.add("test1");
         list.add("test3");
         list.add("test5");
         list.add("test6");
         list.add("test7");
-        redisCache.removeSetValueByKey("testSet",list);
+        redisCache.removeSetValueByKey("testSet", list);
 
 
     }
@@ -223,7 +515,7 @@ public class MyTest {
 //        wxSubscribeMessage.sendMarketingHelp(188L, marketing);
 //        wxSubscribeMessage.sendMarketingHelp(79L, marketing);
     }
-    
+
     @Test
     void test2() throws IOException {
         marketingTask.lottery();
@@ -231,7 +523,7 @@ public class MyTest {
     }
 
     @Test
-    void test3(){
+    void test3() {
         for (int i = 0; i < 20; i++) {
             System.out.println("bizIdGenerator = " + bizIdGenerator.newId());
         }
@@ -239,10 +531,9 @@ public class MyTest {
     }
 
 
-
     @Test
-    void test1(){
-        walletService.refund("968527112497659906",10,"测试");
+    void test1() {
+        walletService.refund("968527112497659906", 10, "测试");
     }
 
 }

+ 7 - 0
mp-common/pom.xml

@@ -22,6 +22,13 @@
 
     <dependencies>
 
+        <!-- 盈盛支付sdk -->
+        <dependency>
+            <groupId>io.github.ysgatesdk</groupId>
+            <artifactId>yspay-opensdk-java</artifactId>
+            <version>1.0.1</version>
+        </dependency>
+
         <!--dingtalk-->
         <dependency>
             <groupId>com.aliyun</groupId>

+ 48 - 0
mp-common/src/main/java/com/qs/mp/common/constant/Constants.java

@@ -173,4 +173,52 @@ public class Constants
      * 红包默认图片
      */
     public static final String HONGBAO_PIC = "redPkg.png";
+
+    /**
+     * 支付方式:微信
+     */
+    public static final String PAY_STYLE_WX = "wx";
+
+    /**
+     * 斗拱--微信小程序
+     */
+    public static final String DOUGONG_TRADE_TYPE_MINIAPP = "T_MINIAPP";
+
+    /**
+     * 斗拱微信小程序支付
+     */
+    public static final String PAY_STYLE_WXMINI_DOUGONG = "micro_wxmini_dg";
+
+    /**
+     * 支付方式:支付宝
+     */
+    public static final String PAY_STYLE_ALI = "ali";
+
+    /**
+     * 斗拱--支付宝JS
+     */
+    public static final String DOUGONG_TRADE_TYPE_ALIJS = "A_JSAPI";
+
+    /**
+     * 斗拱支付宝小程序支付
+     */
+    public static final String PAY_STYLE_ALIMINI_DOUGONG = "micro_alimini_dg";
+
+    /**
+     * 斗拱--支付宝本地
+     */
+    public static final String DOUGONG_TRADE_TYPE_ALINATIVE = "A_NATIVE";
+
+    /**
+     * 斗拱下单成功
+     */
+    public static final String DOUGONG_ORDER_SUCCESS_CODE = "00000100";
+
+    /**
+     * 斗拱交易成功
+     */
+    public static final String DOUGONG_PAY_SUCCESS_CODE = "00000000";
+
+    public static final String DOUGONG_PAY_TRANS_S = "S";
+
 }

+ 17 - 0
mp-common/src/main/java/com/qs/mp/common/constant/DivisionLogStatusConstants.java

@@ -0,0 +1,17 @@
+package com.qs.mp.common.constant;
+
+/**
+ * 分账状态常量
+ * @author Evan
+ * @date 2023/3/29
+ */
+public class DivisionLogStatusConstants {
+
+    /** 初始化 */
+    public static int INIT = 0;
+    /** 成功 */
+    public static int SUCCESS = 1;
+    /** 失败 */
+    public static int FAIL = 2;
+
+}

+ 17 - 0
mp-common/src/main/java/com/qs/mp/common/constant/PayConstants.java

@@ -0,0 +1,17 @@
+package com.qs.mp.common.constant;
+
+/**
+ * 支付相关常量定义
+ * @author Evan
+ * @date 2023/3/27
+ */
+public class PayConstants {
+
+    /** 支付宝*/
+    public static Integer ALI_PAY_TYPE = 1;
+    /** 微信*/
+    public static Integer WX_PAY_TYPE = 2;
+    /** H5*/
+    public static Integer H5_PAY_TYPE = 3;
+
+}

+ 313 - 0
mp-common/src/main/java/com/qs/mp/common/constant/SysCode.java

@@ -0,0 +1,313 @@
+package com.qs.mp.common.constant;
+
+import com.google.common.collect.Maps;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SysCode {
+    public static final String CHARSET = "UTF-8";
+    public static final String IMAGE_FORMAT_JPG = "jpg";
+    public static final String IMAGE_FORMAT_PNG = "png";
+
+    public static final String ORDER_BY_ASC = "asc";
+    public static final String ORDER_BY_DESC = "desc";
+
+    public static final String DES = "DES";
+    public static final String AES = "AES";
+    public static final String SHA1 = "SHA1";
+    public static final String MD5 = "MD5";
+    public static final String FILE_SUFFIX_EXCEL_2003 = "xls";
+    public static final String FILE_SUFFIX_EXCEL_2007 = "xlsx";
+    public static final String REGEXP_DOT = "[.]";
+    public static final String supportedFiles = ".jpg,.jpeg,.png,.doc,.docx,.pdf,.xls,.xlsx,.rptdesign,.wmv,.mp3,.mp4,.avi,.rm,.3gp,.rar,.zip,.gzip,.7z";
+    public static final String FILE_PDF = "PDF";
+    public static final String FILE_HTML = "HTML";
+
+    public static final String CODE_KEY = "code";
+    public static final String MSG_KEY = "msg";
+    public static final String PARAMS_KEY = "paramsx";
+    public static final String BIZ_MSG_KEY = "biz_msg";
+    public static final String DATA_KEY = "data";
+    public static final String EXECUTED_FORMULA_KEY = "executed_formula";
+    public static final String HEADER_DATA_KEY = "headerData";//表头数据,目前仅用于excel读写场景
+    public static final String TOKEN_KEY = "userToken";//当前登录用户token
+    public static final String SCANNER_SCRIPT_KEY = "scannerScriptId";//当前扫码脚本id,即扫码枪提交的脚本id
+    public static final String PAGE_ID_KEY = "data";//页面(配置ID)
+    public static final String PAGE_CONFIG_TABLE = "0";//配置类型:表
+    public static final String PAGE_CONFIG_TREE = "1";//配置类型:树
+    public static final String PAGE_CONFIG_ASSIGNMENT = "2";//配置类型:赋值
+    public static final String PAGE_CONFIG_FORM = "3";//配置类型:表单
+    public static final String PAGE_CONFIG_FILTER_TREEE = "8";//配置类型:过滤树
+
+    public static final String USER_TYPE_WEB = "0";//用户类型:普通用户
+    public static final String USER_TYPE_SUPER = "1";//用户类型:管理用户
+    public static final String USER_TYPE_MES = "2";//用户类型:MES用户
+
+    public static final String PAGE_CONFIG_CLASSIFY_MAPPING_NONE = "0";//分类映射:0:无映射,1:分类ID,2:分类编号,3:分类名称
+    public static final String PAGE_CONFIG_CLASSIFY_MAPPING_ID = "1";//分类映射:0:无映射,1:分类ID,2:分类编号,3:分类名称
+    public static final String PAGE_CONFIG_CLASSIFY_MAPPING_NO = "2";//分类映射:0:无映射,1:分类ID,2:分类编号,3:分类名称
+    public static final String PAGE_CONFIG_CLASSIFY_MAPPING_NAME = "3";//分类映射:0:无映射,1:分类ID,2:分类编号,3:分类名称
+
+    public static final int OPER_SUCCESS = 10000;
+    public static final String OPER_SUCCESS_MSG = "操作成功";
+
+    public static final String SUCCESS = "SUCCESS";
+
+    public static final int OPER_FAIL = 20000;
+    public static final String OPER_FAIL_MSG = "操作失败";
+
+    public static final String FAIL = "FAIL";
+
+    public static final int OPER_FAIL_AND_EXPIRED = 20001;//操作失败,并提示软件已经到期
+
+    public static final int AUTH_FAIL_UNAUTHORIZED = 30000;
+    public static final String AUTH_FAIL_UNAUTHORIZED_MSG = "操作失败,用户无此访问权限";
+
+    public static final int AUTH_FAIL_EXPIRED = 30001;
+    public static final String AUTH_FAIL_EXPIRED_MSG = "操作失败,用户登录过期";
+
+    public static final int AUTH_FAIL_LOGIN_TAKEN = 30002;
+    public static final String AUTH_FAIL_LOGIN_TAKEN_MSG = "操作失败,当前用户已在其它设备登录";
+
+    public static final int AUTH_SUCCESS_WITH_TOKEN_REFRESH = 30003;
+    public static final String AUTH_SUCCESS_WITH_TOKEN_REFRESH_MSG = "操作成功,并刷新token";
+
+    public static final String REG_CODE_KEY = "regCode";//注册code
+    public static final String REG_MSG_KEY = "regMsg";//注册msg
+    public static final int REGISTRAION_SUCCESS = 10000;//软件注册状态正常
+    public static final int REGISTRAION_SUCCESS_EXPIRING = 10001;//软件注册状态正常,并提示软件即将到期
+    public static final int REGISTRAION_FAIL = 20000;//软件注册状态异常,并提示软件未注册
+    public static final int REGISTRAION_FAIL_EXPIRED = 20001;//软件注册状态异常,并提示软件注册已过期
+
+    public static final String OPER_FAIL_CLASSIFY_HAS_CHILDREN = "当前分类存在下一级分类,无法删除";
+    public static final String OPER_FAIL_CLASSIFY_HAS_DATA = "当前分类存数据,无法删除";
+    public static final String OPER_FAIL_PAGE_ID_NOT_EXISTS = "页面配置ID[pageId]不能为空";
+    public static final String OPER_FAIL_PAGE_CONFIG_DETAIL_ID_NOT_EXISTS = "页面配置项ID[pageConfigDetailId]不能为空";
+    public static final String OPER_FAIL_PAGE_CONFIG_PRIMARY_KEY_ID_NOT_EXISTS = "主键ID[id]不能为空";
+    public static final String OPER_FAIL_WEB_TABLE_NUM_NOT_EXISTS = "页面配置表序列[webTableNum]不能为空";
+    public static final String OPER_FAIL_TREE_NODE_ID_NOT_EXISTS = "通用树节点ID[treeNodeId]不能为空";
+    public static final String OPER_FAIL_TABLE_NAME_NOT_EXISTS = "表名称[tableName]不能为空";
+    public static final String OPER_FAIL_QUOTATION_CONFIG_ID_NOT_EXISTS = "报价配置标识[quotationConfigId]参数必须提供";
+
+    public static final String PAGE_CONFIG_DATASOURCE_TYPE_URL = "0";
+    public static final String PAGE_CONFIG_DATASOURCE_TYPE_SQL = "1";
+    public static final String PAGE_CONFIG_DATASOURCE_TYPE_CONSTANT = "2";
+
+    public static final String FORMULA_TYPE_BJ = "0";//报价公式
+    public static final String FORMULA_TYPE_CB = "1";//成本
+    public static final String FORMULA_TYPE_JJ = "2";//计件
+    public static final String FORMULA_TYPE_CN = "3";//产能
+    public static final String FORMULA_TYPE_XSTC = "4";//销售提成
+    public static final String FORMULA_TYPE_FS = "5";//防损
+    public static final String FORMULA_TYPE_YF = "6";//运费
+    public static final String FORMULA_TYPE_SL = "7";//算料
+    public static final String FORMULA_TYPE_FW = "8";//发外
+    public static final String FORMULA_TYPE_PCQS = "9";//排程取数
+
+    public static final String FORMULA_TYPE_COMMON = "0";//计算方案-通用模式
+    public static final String FORMULA_TYPE_EXPERT = "1";//计算方案-专家模式
+    public static final String FORMULA_TYPE_COMMON_YS = "00";//计算方案-通用模式-印刷工序
+    public static final String FORMULA_TYPE_COMMON_YH = "01";//计算方案-通用模式-后道工序
+    public static final String FORMULA_TYPE_COMMON_YH_CGJJ = "10";//计算方案-通用模式-后道工序-常规计价
+    public static final String FORMULA_TYPE_COMMON_YH_PFJJ = "11";//计算方案-通用模式-后道工序-平方计价
+
+    public static final String FIELD_CREATE_TIME = "create_time";//创建时间字段
+    public static final String FIELD_UPDATE_TIME = "update_time";//更新时间字段
+
+    public static final String FIELD_TYPE_VARCHAR = "VARCHAR";
+    public static final String FIELD_TYPE_STRING= "STRING";
+    public static final String FIELD_TYPE_DATETIME = "DATETIME";
+    public static final String FIELD_TYPE_DATE = "DATE";
+    public static final String FIELD_TYPE_BIT = "BIT";
+    public static final String FIELD_TYPE_INTEGER = "INT";
+    public static final String FIELD_TYPE_DECIMAL = "DECIMAL";
+    public static final String FIELD_TYPE_BOOLEAN = "BOOLEAN";
+    public static final String FIELD_TYPE_INT_UNSIGNED = "INT UNSIGNED";
+    public static final String FIELD_TYPE_DECIMAL_UNSIGNED = "DECIMAL UNSIGNED";
+    public static final String FIELD_TYPE_INT_TINY = "TINYINT";
+    public static final String FIELD_TYPE_INT_SMALL = "SMALLINT";
+    public static final String FIELD_TYPE_INT_MEDIUM = "MEDIUMINT";
+    public static final List<String> SKIPPED_FIELDS = Arrays.asList("create_time", "update_time","del_tag");
+    public static final List<String> SKIPPED_FIELDS0 = Arrays.asList("create_time", "update_time");
+
+    public static final String JAVA_TYPE_STRING = "java.lang.String";
+    public static final String JAVA_TYPE_INTEGER = "java.lang.Integer";
+
+
+
+    public static final String ENTITY_CLASS_PATH_PREFIX = "com.bluesx.erp.entity.";
+
+    public static final String ENV_KEY_PROFILE = "spring.profiles.active";
+    public static final String SYSTEM_PROFILE = "system.profiles.active";//docker环境下,上面那个环境变量无法直接读取
+    public static final String SYSTEM_ID = "system.id";
+
+    public static final String SCRIPT_ID = "script_";
+
+    public static final String DATEFORMAT0 = "yyyy-MM-dd HH:mm:ss";
+    public static final String DATEFORMAT_DATE = "yyyyMMdd";
+
+    //脚本dataList参数名
+    public static final String SCRIPT_DATALIST_KEY = "dataList";
+
+    public static final String SQL_OPER_TYPE = "sqlType";
+    public static final String SQL_OPER_INSERT = "insert";
+    public static final String SQL_OPER_UPDATE = "update";
+    //SQL操作影响到的表id,包括新增和更新的实际id
+    public static final String SQL_OPER_ID = "id";
+    //SQL操作影响到的表,实际key值为 id.tableName,遵循dataList的key结构
+    public static final String SQL_OPER_TABLE = "tableName";
+
+    public static final String CACHE_KEY_ALL_FORMULAS = "cached_formula";
+    public static final String CACHE_KEY_ALL_PARAMS = "cached_param";
+    public static final String CACHE_KEY_ALL_PAGE_CONFIG_DETAILS = "cached_page_config_detail";
+    public static final String CACHE_KEY_ALL_PAGE_CONFIG_TABLES = "cached_page_config_table";
+    public static final String CACHE_KEY_ALL_PAGE_CONFIG_OPERATIONS = "cached_page_config_operation";
+    public static final String CACHE_KEY_ALL_PAGE_CONFIG_UNFINISHEDS = "cached_page_config_unfinished";
+    public static final String CACHE_KEY_ALL_PAGE_CONFIG_INDEXS = "cached_page_config_index";
+    public static final String CACHE_KEY_ALL_PAGE_STYLES = "cached_page_styles";
+    public static final String CACHE_KEY_ALL_BASE_URLS = "cached_base_urls";
+
+    //权限节点类型:0页面,1表,2按钮 3未清  4权限字段 5菜单
+    public static final int PERMISSION_TYPE_NONE = -1;
+    public static final int PERMISSION_TYPE_PAGE = 0;
+    public static final int PERMISSION_TYPE_TABLE = 1;
+    public static final int PERMISSION_TYPE_BUTTON = 2;
+    public static final int PERMISSION_TYPE_UNFINISHED = 3;
+    public static final int PERMISSION_TYPE_AUTH_FIELD = 4;
+    public static final int PERMISSION_TYPE_MENU = 5;
+
+    public static final String TRAFFIC_MACHINE_ID_NOT_EXISTS = "TR0001";//traffic机器码不存在
+
+    //是否
+    public static final int YES = 1;
+    public static final int NO = 0;
+
+    public static final int TRUE = 1;
+    public static final int FALSE = 0;
+
+    public static final String SQL_OPER_AND = "AND";
+    public static final String SQL_OPER_OR = "OR";
+
+    public static final String SCRIPT_CACHE = "script_";
+
+    //默认分页条数
+    public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE;
+
+    public static final int TRADES_TIMEOUT_DAYS = 3;//订单id缓存时间: 30天
+
+    public static final String HUIFU_PAY_SUCCESS_CODE = "000000";//这个值是由汇付支付接口定义
+    public static final String DOUGONG_PAY_SUCCESS_CODE = "00000000";//斗拱交易成功
+    public static final String DOUGONG_ORDER_SUCCESS_CODE = "00000100";//斗拱下单成功
+    public static final String DOUGONG_PAY_PROCESSING_CODE = "00000100";//斗拱交易处理中
+    public static final String HUIFU_PAY_TRANS_S = "S";//这个值是由汇付支付接口定义,表示 交易状态:成功
+    public static final String DOUGONG_PAY_TRANS_S = "S";
+    public static final String HUIFU_PAY_TRANS_F = "F";//这个值是由汇付支付接口定义,表示 交易状态:失败
+    public static final String HUIFU_PAY_ACC_S = "S";//这个值是由汇付支付接口定义,表示 财务状态:成功
+    public static final String HUIFU_PAY_ACC_F = "F";//这个值是由汇付支付接口定义,表示 财务状态:失败
+    public static final String HUIFU_PAY_CALLBACK_TAG_PREFIX = "huifupay_callback_";//待回调订单key标志,拼接后在redis存取
+    public static final String DOUGONG_PAY_CALLBACK_TAG_PREFIX = "dougong_callback_";//待回调订单key标志,拼接后在redis存取
+    public static final String PAYMENT_DUPLICATE_CODE = "222";//重复支付状态码
+
+    public static final String FINAL_SUCCESS_KEY = "finalSuccess";
+
+    //http methods
+    public static final String HTTP_METHOD_OPTIONS = "OPTIONS";
+    public static final String HTTP_METHOD_GET = "GET";
+    public static final String HTTP_METHOD_POST = "POST";
+    public static final String AUTHORIZATION_HEADER = "Authorization";
+
+//    public static Map<String,String> JOB_CRON_DAYS = new ImmutableMap.Builder().put("每天","")
+
+    public static final String DEFAULT_EXPOR_FILE_NAME = "export-result";
+
+    public static final String PRODUCT_TYPE_LY_RECHARGE = "ly-recharge";//充值类商品(杭州老杨)
+    public static final String PRODUCT_TYPE_RECHARGE = "recharge";//充值类商品
+    public static final String PRODUCT_TYPE_CHUN = "chun";//chun.0x00.tech平台特定产品名
+
+    public static String birtLogPath(){
+        return "/var/log/java/es/";
+    }
+
+    public static Map<String,Object> map(){
+       return new HashMap<>();
+    }
+
+    public static Map<String,String> success(){
+        Map<String,String> result = Maps.newHashMap();
+        result.put(SysCode.CODE_KEY, String.valueOf(SysCode.OPER_SUCCESS));
+        result.put(SysCode.MSG_KEY, SysCode.OPER_SUCCESS_MSG);
+        result.put(SysCode.DATA_KEY, null);
+        return result;
+    }
+
+    public static Map<String,Object> success(String successMessage){
+        Map<String,Object> result = Maps.newHashMap();
+        result.put(SysCode.CODE_KEY, SysCode.OPER_SUCCESS);
+        if(StringUtils.isNotEmpty(successMessage)){
+            result.put(SysCode.MSG_KEY, successMessage);
+        }else{
+            result.put(SysCode.MSG_KEY, SysCode.OPER_SUCCESS_MSG);
+        }
+
+        result.put(SysCode.DATA_KEY, null);
+        return result;
+    }
+
+    public static Map<String,Object> success(String successMessage,Object data){
+        Map<String,Object> result = Maps.newHashMap();
+        result.put(SysCode.CODE_KEY, SysCode.OPER_SUCCESS);
+        if(StringUtils.isNotEmpty(successMessage)){
+            result.put(SysCode.MSG_KEY, successMessage);
+        }else{
+            result.put(SysCode.MSG_KEY, SysCode.OPER_SUCCESS_MSG);
+        }
+
+        result.put(SysCode.DATA_KEY, data);
+        return result;
+    }
+
+    public static Map<String,Object> fail(){
+        Map<String,Object> result = Maps.newHashMap();
+        result.put(SysCode.CODE_KEY,SysCode.OPER_FAIL);
+        result.put(SysCode.MSG_KEY,SysCode.OPER_FAIL_MSG);
+        result.put(SysCode.DATA_KEY, null);
+        return result;
+    }
+
+    public static Map<String,Object> fail(String failMessage){
+        Map<String,Object> result = Maps.newHashMap();
+        result.put(SysCode.CODE_KEY,SysCode.OPER_FAIL);
+        if(StringUtils.isNotEmpty(failMessage)){
+            result.put(SysCode.MSG_KEY, failMessage);
+        }else{
+            result.put(SysCode.MSG_KEY, SysCode.OPER_FAIL_MSG);
+        }
+        result.put(SysCode.DATA_KEY, null);
+        return result;
+    }
+
+    public static Map<String,Object> data(Object data){
+        Map<String,Object> result = Maps.newHashMap();
+        result.put(SysCode.CODE_KEY,SysCode.OPER_SUCCESS);
+        result.put(SysCode.DATA_KEY, data);
+        return result;
+    }
+
+    public static Map<String,Object> data(Object data,String message){
+        Map<String,Object> result = Maps.newHashMap();
+        result.put(SysCode.CODE_KEY,SysCode.OPER_SUCCESS);
+        result.put(SysCode.MSG_KEY,message);
+        result.put(SysCode.DATA_KEY, data);
+        return result;
+    }
+
+    public static void main(String[] args) {
+        String jsonStr = "[{\"conditon\":\"c1\",\"meet\":\"m1\",\"notMeet\":\"nm1\",\"children\":[{\"conditon\":\"c11\",\"meet\":\"m11\",\"notMeet\":\"nm11\"},{\"conditon\":\"c12\",\"meet\":\"m12\",\"notMeet\":\"nm12\"}]},{\"conditon\":\"c1\",\"meet\":\"m1\",\"notMeet\":\"nm1\"}]\n";
+//        List<Map<String,Object>> commonLines = JsonUtils.json2ListMap(jsonStr);
+    }
+}

+ 28 - 0
mp-common/src/main/java/com/qs/mp/common/constant/YsPayMethodConstants.java

@@ -0,0 +1,28 @@
+package com.qs.mp.common.constant;
+
+/**
+ * 银盛相关方法常量
+ * @author Evan
+ * @date 2023/3/28
+ */
+public class YsPayMethodConstants {
+
+    /** H5支付方法 */
+    public static String H5_PAY_METHOD = "ysepay.online.wap.directpay.createbyuser";
+
+
+    /** 分账登记方法 */
+    public static String DIVISION_SUBMIT_METHOD = "ysepay.single.division.online.accept";
+
+    public static String DIVISION_QUERY_METHOD = "ysepay.single.division.online.query";
+
+    public static String BANK_CARD_AUTH_METHOD = "ysepay.authenticate.three.key.element.precise";
+
+
+    /** 一般账户提现方法 */
+    public static String GENERAL_ACCOUNT_WITHDRAW_METHOD = "ysepay.merchant.withdraw.quick.accept";
+
+    /** 待结算账户提现方法 */
+    public static String SETTLED_ACCOUNT_WITHDRAW_METHOD = "ysepay.merchant.withdraw.d0.accept";
+
+}

+ 16 - 0
mp-common/src/main/java/com/qs/mp/common/constant/YsServerApiConstants.java

@@ -0,0 +1,16 @@
+package com.qs.mp.common.constant;
+
+/**
+ * 盈盛服务API地址常量
+ * @author Evan
+ * @date 2023/3/28
+ */
+public class YsServerApiConstants {
+
+    public static String OPEN_API = "https://openapi.ysepay.com/gateway.do";
+
+    public static String SEARCH_API = "https://search.ysepay.com/gateway.do";
+
+    public static String COMMON_API = "https://commonapi.ysepay.com/gateway.do";
+
+}

+ 6 - 1
mp-common/src/main/java/com/qs/mp/common/enums/ChannelWithdrawStatusEnum.java

@@ -15,7 +15,12 @@ public enum ChannelWithdrawStatusEnum implements IEnum<Integer> {
 
   WITHDRAWING(1, "待提现"),
   FINISHED(2, "已完成"),
-  FAILED(3, "提现失败");
+  FAILED(3, "提现失败"),
+
+  WITHDRAW_PROCESS(4,"提现处理中"),
+
+  YS_WITHDRAW_FAILED(5, "银盛提现失败"),
+  ;
 
 
   private final int value;

+ 46 - 0
mp-common/src/main/java/com/qs/mp/common/enums/DivisionStatusEnum.java

@@ -0,0 +1,46 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ * 分账状态枚举
+ * @author Evan
+ * @date 2023/3/30
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum DivisionStatusEnum implements IEnum<Integer> {
+
+    INIT(0,"初始化"),
+    COMPLETE(1,"完成"),
+    SUBMIT_FAIL(2,"登记失败"),
+    FAIL(3,"失败");
+
+
+    private final int value;
+    private final String desc;
+
+    DivisionStatusEnum(final int value, final String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+
+    /**
+     * 重写toString,单个转化成json
+     * @return
+     */
+    @Override
+    public String toString() {
+        JSONObject object = new JSONObject();
+        object.put("value",value);
+        object.put("desc", desc);
+        return object.toString();
+    }
+}

+ 2 - 1
mp-common/src/main/java/com/qs/mp/common/enums/TicketStatusEnum.java

@@ -14,7 +14,8 @@ import com.qs.mp.common.json.EnumValueDeserializer;
 public enum TicketStatusEnum implements IEnum<Integer> {
   NOT_PAY(1, "未付款"),
   ACTIVATED(2, "待兑奖"),
-  CASHED(3, "已兑奖"),;
+  CASHED(3, "已兑奖");
+//  STOP(5,"已停售");
 
   private final int value;
   private final String desc;

+ 52 - 0
mp-common/src/main/java/com/qs/mp/common/enums/YsCallBizTypeEnum.java

@@ -0,0 +1,52 @@
+package com.qs.mp.common.enums;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.annotation.JSONType;
+import com.baomidou.mybatisplus.annotation.IEnum;
+import com.qs.mp.common.json.EnumValueDeserializer;
+
+/**
+ * 盈盛调用业务类型枚举
+ * @author Evan
+ * @date 2023/3/30
+ */
+@JSONType(deserializer = EnumValueDeserializer.class)
+public enum YsCallBizTypeEnum implements IEnum<Integer> {
+
+    ORDER_PAY(1,"订单支付"),
+
+    DIVISION(2,"分账"),
+
+
+    BANK_CARD_AUTH(3, "银行实名认证三要素"),
+
+    WITHDRAW(4,"提现")
+
+    ;
+
+
+    private final int value;
+    private final String desc;
+
+    YsCallBizTypeEnum(final int value, final String desc) {
+        this.value = value;
+        this.desc = desc;
+    }
+
+    @Override
+    public Integer getValue() {
+        return value;
+    }
+
+    /**
+     * 重写toString,单个转化成json
+     * @return
+     */
+    @Override
+    public String toString() {
+        JSONObject object = new JSONObject();
+        object.put("value",value);
+        object.put("desc", desc);
+        return object.toString();
+    }
+}

+ 91 - 91
mp-common/src/main/java/com/qs/mp/common/pulsar/PulsarClientService.java

@@ -34,54 +34,54 @@ public class PulsarClientService {
   private PulsarClient client;
   private Consumer<byte[]> consumer;
 
-  @Value("${mq.service-url}")
-  private String serviceUrl;
+//  @Value("${mq.service-url}")
+//  private String serviceUrl;
 
-  @Value("${mq.auth-token}")
-  private String authToken;
+//  @Value("${mq.auth-token}")
+//  private String authToken;
 
-  @Value("${mq.topic-ticket-generate}")
-  private String topicTicketGenerate;
+//  @Value("${mq.topic-ticket-generate}")
+//  private String topicTicketGenerate;
 
-  @Value("${mq.topic-ticket-pay}")
-  private String topicTicketPay;
+//  @Value("${mq.topic-ticket-pay}")
+//  private String topicTicketPay;
 
-  @Value("${mq.consumer-conn}")
-  private boolean consumerConn;
+//  @Value("${mq.consumer-conn}")
+//  private boolean consumerConn;
 
-  @Value("${mq.consumer-topics}")
-  private String topics;
+//  @Value("${mq.consumer-topics}")
+//  private String topics;
 
   @Autowired
   private PulsarConsumer pulsarConsumer;
 
   private final ConcurrentHashMap<String, Producer<byte[]>> Producers = new ConcurrentHashMap<String, Producer<byte[]>>();
 
-  @PostConstruct
-  public void init() throws PulsarClientException {
-    client = PulsarClient.builder()
-        .serviceUrl(serviceUrl)//【集群管理】接入地址处复制
-        .authentication(AuthenticationFactory.token(authToken))
-        .build();
-
-    if (consumerConn) {
-      consumer = client.newConsumer()
-          .topic(topics.split(","))//topic完整路径,格式为persistent://集群(租户)ID/命名空间/Topic名称
-          .subscriptionName("mp")//需要现在控制台或者通过控制台API创建好一个订阅,此处填写订阅名
-          .subscriptionType(SubscriptionType.Exclusive)//声明消费模式为exclusive(独占)模式
-          .subscriptionInitialPosition(
-              SubscriptionInitialPosition.Earliest)//配置从最早开始消费,否则可能会消费不到历史消息
-          .subscribe();
-      new Thread(() -> {
-        try {
-          loop();
-        } catch (Exception e) {
-          logger.error("消费Pulsar数据异常,停止Pulsar连接:", e);
-          close();
-        }
-      }).start();
-    }
-  }
+//  @PostConstruct
+//  public void init() throws PulsarClientException {
+//    client = PulsarClient.builder()
+//        .serviceUrl(serviceUrl)//【集群管理】接入地址处复制
+//        .authentication(AuthenticationFactory.token(authToken))
+//        .build();
+
+//    if (consumerConn) {
+//      consumer = client.newConsumer()
+//          .topic(topics.split(","))//topic完整路径,格式为persistent://集群(租户)ID/命名空间/Topic名称
+//          .subscriptionName("mp")//需要现在控制台或者通过控制台API创建好一个订阅,此处填写订阅名
+//          .subscriptionType(SubscriptionType.Exclusive)//声明消费模式为exclusive(独占)模式
+//          .subscriptionInitialPosition(
+//              SubscriptionInitialPosition.Earliest)//配置从最早开始消费,否则可能会消费不到历史消息
+//          .subscribe();
+//      new Thread(() -> {
+//        try {
+//          loop();
+//        } catch (Exception e) {
+//          logger.error("消费Pulsar数据异常,停止Pulsar连接:", e);
+//          close();
+//        }
+//      }).start();
+//    }
+//  }
 
   private void loop() throws Exception {
     //消费消息
@@ -104,60 +104,60 @@ public class PulsarClientService {
     }
   }
 
-  /**
-   * @param mqTopicType
-   * @param data        内容为json格式
-   * @throws PulsarClientException
-   */
-  public void producer(MqTopicType mqTopicType, String data) throws PulsarClientException {
-    logger.info("start producer mq data:" + data);
-    String topic = "";
-    if (mqTopicType.getValue() == MqTopicType.ticket_generate.getValue()) {
-      topic = topicTicketGenerate; // 盲票生成
-    } else if (mqTopicType.getValue() == MqTopicType.ticket_pay.getValue()) {
-      topic = topicTicketPay; // 盲票付款成功
-    }
-    Producer<byte[]> producer = null;
-    if (Producers.containsKey(mqTopicType.getValue())) {
-      producer = Producers.get(mqTopicType.getValue());
-    } else {
-      producer = client.newProducer()
-          .topic(topic)//topic完整路径,格式为persistent://集群(租户)ID/命名空间/Topic名称
-          .enableBatching(true)
-          .create();
-      Producers.put(mqTopicType.getValue(), producer);
-    }
-
-    /*
-    producer.newMessage()//发送消息
-        .key(mqTopicType.getValue())
-        .value(data.getBytes())
-            .send();
-
-
-     */
-    CompletableFuture<MessageId> messageIdFuture = producer.newMessage()
-        .key(mqTopicType.getValue())
-        .value(data.getBytes())
-        .sendAsync();
-    Producer<byte[]> finalProducer = producer;
-    messageIdFuture.whenComplete(((messageId, throwable) -> {
-      if (null != throwable) {
-        logger.error("【消息投递异常,开始重试】mq data:" + data, throwable);
-        //todo 失败重试策略
-        try {
-          finalProducer.newMessage().deliverAfter(5, TimeUnit.SECONDS
-          ).key(mqTopicType.getValue()).value(data.getBytes()).send();
-        } catch (PulsarClientException e) {
-          logger.error("重试投递失败", e);
-          //todo 保存数据库,增加失败重试,通过体系化重试框架保证消息投递完整性
-        }
-      } else {
-        logger.info("【消息成功投递】");
-      }
-    }));
-
-  }
+//  /**
+//   * @param mqTopicType
+//   * @param data        内容为json格式
+//   * @throws PulsarClientException
+//   */
+//  public void producer(MqTopicType mqTopicType, String data) throws PulsarClientException {
+//    logger.info("start producer mq data:" + data);
+//    String topic = "";
+//    if (mqTopicType.getValue() == MqTopicType.ticket_generate.getValue()) {
+//      topic = topicTicketGenerate; // 盲票生成
+//    } else if (mqTopicType.getValue() == MqTopicType.ticket_pay.getValue()) {
+//      topic = topicTicketPay; // 盲票付款成功
+//    }
+//    Producer<byte[]> producer = null;
+//    if (Producers.containsKey(mqTopicType.getValue())) {
+//      producer = Producers.get(mqTopicType.getValue());
+//    } else {
+//      producer = client.newProducer()
+//          .topic(topic)//topic完整路径,格式为persistent://集群(租户)ID/命名空间/Topic名称
+//          .enableBatching(true)
+//          .create();
+//      Producers.put(mqTopicType.getValue(), producer);
+//    }
+//
+//    /*
+//    producer.newMessage()//发送消息
+//        .key(mqTopicType.getValue())
+//        .value(data.getBytes())
+//            .send();
+//
+//
+//     */
+//    CompletableFuture<MessageId> messageIdFuture = producer.newMessage()
+//        .key(mqTopicType.getValue())
+//        .value(data.getBytes())
+//        .sendAsync();
+//    Producer<byte[]> finalProducer = producer;
+//    messageIdFuture.whenComplete(((messageId, throwable) -> {
+//      if (null != throwable) {
+//        logger.error("【消息投递异常,开始重试】mq data:" + data, throwable);
+//        //todo 失败重试策略
+//        try {
+//          finalProducer.newMessage().deliverAfter(5, TimeUnit.SECONDS
+//          ).key(mqTopicType.getValue()).value(data.getBytes()).send();
+//        } catch (PulsarClientException e) {
+//          logger.error("重试投递失败", e);
+//          //todo 保存数据库,增加失败重试,通过体系化重试框架保证消息投递完整性
+//        }
+//      } else {
+//        logger.info("【消息成功投递】");
+//      }
+//    }));
+//
+//  }
 
   public void consumer() throws PulsarClientException {
 

+ 30 - 0
mp-common/src/main/java/com/qs/mp/common/utils/KeyGenUtil.java

@@ -0,0 +1,30 @@
+package com.qs.mp.common.utils;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.UUID;
+
+public class KeyGenUtil {
+    public static String newKey(){
+        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+        String prefix = format.format(Calendar.getInstance().getTime());
+        String rand = String.valueOf((int)(Math.random() * 1000000));
+        return prefix + rand;
+    }
+
+    public static String simpleUUID(){
+        return UUID.randomUUID().toString().replaceAll("-", "");
+    }
+
+    public static String simpleRandomSufix(){
+        return "-ran-" +UUID.randomUUID().toString().replaceAll("-","").substring(0,10);
+    }
+
+    public static String newKeyTimestamp() {
+        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+        return format.format(Calendar.getInstance().getTime());
+    }
+
+    public static void main(String[] args) {
+        System.out.println(simpleUUID());
+    }
+}

+ 3 - 3
mp-generator/src/main/java/com/qs/mp/generator/DbGenerator.java

@@ -49,13 +49,13 @@ public class DbGenerator {
      */
     private static final boolean REST_CONTROLLER_STYLE = true;
 
-    public static final String JDBC_MYSQL_URL = "jdbc:mysql://110.40.236.236:3306/mpdb_test?useUnicode=true&useSSL=false&characterEncoding=utf8";
+    public static final String JDBC_MYSQL_URL = "jdbc:mysql://43.143.93.199:3306/mpdb_test?useUnicode=true&useSSL=false&characterEncoding=utf8";
 
     public static final String JDBC_DRIVER_NAME = "com.mysql.cj.jdbc.Driver";
 
-    public static final String JDBC_USERNAME = "mptest";
+    public static final String JDBC_USERNAME = "root";
 
-    public static final String JDBC_PASSWORD = "wan789*@dfhzHu518!dr2xosn";
+    public static final String JDBC_PASSWORD = "mp@666888";
 
     public static void main(String[] args) {
         String moduleName = scanner("模块名");

+ 13 - 13
mp-quartz/src/main/java/com/qs/mp/quartz/task/OperateToolTask.java

@@ -21,8 +21,8 @@ public class OperateToolTask {
 
   protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
 
-  @Autowired
-  private PulsarClientService pulsarClientService;
+//  @Autowired
+//  private PulsarClientService pulsarClientService;
 
   @Autowired
   private IWalletService walletService;
@@ -30,17 +30,17 @@ public class OperateToolTask {
   /**
    * 重新发送消息
    */
-  public void resendTicketPayMsg(String orderId) {
-    LogUtil.info(logger, "...重新发送盲票支付消息任务开始...");
-
-    try {
-      pulsarClientService.producer(MqTopicType.ticket_pay, orderId);
-    } catch (Exception e) {
-      LogUtil.error(logger, e, "重新发送盲票支付消息异常。orderId:{0}", orderId);
-    }
-
-    LogUtil.info(logger, "...重新发送盲票支付消息任务结束...");
-  }
+//  public void resendTicketPayMsg(String orderId) {
+//    LogUtil.info(logger, "...重新发送盲票支付消息任务开始...");
+//
+//    try {
+//      pulsarClientService.producer(MqTopicType.ticket_pay, orderId);
+//    } catch (Exception e) {
+//      LogUtil.error(logger, e, "重新发送盲票支付消息异常。orderId:{0}", orderId);
+//    }
+//
+//    LogUtil.info(logger, "...重新发送盲票支付消息任务结束...");
+//  }
 
 
   /**

BIN
mp-service/libs/dougong/dg-java-sdk-3.0.8.jar


+ 9 - 1
mp-service/pom.xml

@@ -73,6 +73,14 @@
             <scope>compile</scope>
         </dependency>
 
+        <dependency>
+            <groupId>com.huifu.bspay.sdk</groupId>
+            <artifactId>dg-java-sdk</artifactId>
+            <version>3.0.8</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/libs/dougong/dg-java-sdk-3.0.8.jar</systemPath>
+        </dependency>
+
     </dependencies>
 
-</project>
+</project>

+ 1 - 0
mp-service/src/main/java/com/qs/mp/admin/service/ITicketAwardsPrizeService.java

@@ -9,6 +9,7 @@ import com.qs.mp.admin.domain.vo.TicketAwardsPrizeVO;
 import com.qs.mp.admin.domain.vo.TicketBoxGoodsListVO;
 
 import java.util.List;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>

+ 78 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelBank.java

@@ -0,0 +1,78 @@
+package com.qs.mp.channel.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+/**
+ * @describe 渠道银行卡表实体类
+ * @auther quanshu
+ * @create 2023-03-27 14:24:40
+ */
+@TableName("mp_channel_bank")
+@Data
+@ApiModel("渠道银行卡表实体类")
+public class ChannelBank implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 渠道id
+     */
+    @ApiModelProperty("渠道id")
+    @TableField("channel_id")
+    private Long channelId;
+
+    /**
+     * 银行卡号
+     */
+    @ApiModelProperty("银行卡号")
+    @TableField("bank_no")
+    private String bankNo;
+
+    /**
+     * 银行名称
+     */
+    @ApiModelProperty("银行名称")
+    @TableField("bank_name")
+    private String bankName;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+    /**
+     * 逻辑删除标识
+     */
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+
+}

+ 23 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelBankCard.java

@@ -3,7 +3,10 @@ package com.qs.mp.channel.domain;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import java.io.Serializable;
 import java.util.Date;
 import lombok.Data;
@@ -15,66 +18,86 @@ import lombok.Data;
  */
 @TableName("mp_channel_bank_card")
 @Data
+@ApiModel("渠道银行卡实体类")
 public class ChannelBankCard implements Serializable {
 
   private static final long serialVersionUID = 1L;
 
+  @ApiModelProperty("id")
   @TableId(value = "id" , type = IdType.AUTO)
   private Long id;
 
   /**
    * 渠道id
    */
+  @ApiModelProperty("渠道id")
   @TableField("channel_id")
   private Long channelId;
 
   /**
    * 持卡人
    */
+  @ApiModelProperty("持卡人名字")
   @TableField("user_name")
   private String userName;
 
+//  @ApiModelProperty("身份证号")
+//  @TableField("id_card")
+//  private String idCard;
+
   /**
    * 卡号
    */
+  @ApiModelProperty("卡号")
   @TableField("card_no")
   private String cardNo;
 
   /**
    * 银行卡所属银行
    */
+  @ApiModelProperty("所属银行")
   @TableField("bank_name")
   private String bankName;
 
   /**
    * 开户行
    */
+  @ApiModelProperty("开户行")
   @TableField("branch_name")
   private String branchName;
 
   /**
    * 预留手机号码
    */
+  @ApiModelProperty("预留手机号")
   @TableField("mobile")
   private String mobile;
 
   /**
    * 1默认
    */
+  @ApiModelProperty("1默认卡")
   @TableField("default_card")
   private Integer defaultCard;
 
   /**
    * 添加时间
    */
+  @ApiModelProperty("创建时间")
   @TableField("create_time")
   private Date createTime;
 
   /**
    * 修改时间
    */
+  @ApiModelProperty("更新时间")
   @TableField("update_time")
   private Date updateTime;
 
+//  @ApiModelProperty("逻辑删除")
+//  @TableLogic
+//  @TableField("is_deleted")
+//  private Integer isDeleted;
+
 
 }

+ 6 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/ChannelWithdraw.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.qs.mp.common.enums.ChannelWithdrawStatusEnum;
 import java.io.Serializable;
@@ -37,6 +38,10 @@ public class ChannelWithdraw implements Serializable {
   @TableField("channel_id")
   private Long channelId;
 
+//  @ApiModelProperty("提现交易单号")
+//  @TableField("trade_no")
+//  private String tradeNo;
+
   /**
    * 提现金额
    */
@@ -144,4 +149,5 @@ public class ChannelWithdraw implements Serializable {
   private Date updateTime;
 
 
+
 }

+ 34 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelBankCardCreateParam.java

@@ -0,0 +1,34 @@
+package com.qs.mp.channel.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import javax.validation.constraints.NotBlank;
+import lombok.Data;
+
+/**
+ * 渠道银行卡创建入参类
+ * @author Evan
+ * @date 2023/3/30
+ */
+@ApiModel("渠道银行卡创建入参类")
+@Data
+public class ChannelBankCardCreateParam {
+
+    @NotBlank(message = "姓名不内外空")
+    @ApiModelProperty("用户名称")
+    private String userName;
+
+    @NotBlank(message = "身份证号不能为空")
+    @ApiModelProperty("身份证号")
+    private String idCard;
+
+    @NotBlank(message = "银行名称不能为空")
+    @ApiModelProperty("银行名称")
+    private String bankName;
+
+    @NotBlank(message = "银行卡号不能为空")
+    @ApiModelProperty("银行卡号")
+    private String cardNo;
+
+
+}

+ 1 - 1
mp-service/src/main/java/com/qs/mp/channel/domain/param/ChannelWithdrawParam.java

@@ -34,7 +34,7 @@ public class ChannelWithdrawParam {
   @ApiModelProperty(value = "银行名",required=false)
   private String bankName;
 
-  @NotNull(message = "开户行不能为空")
+//  @NotNull(message = "开户行不能为空")
   @ApiModelProperty(value = "开户行",required=true)
   private String branchName;
 }

+ 1 - 1
mp-service/src/main/java/com/qs/mp/channel/domain/param/OrderPayParam.java

@@ -15,7 +15,7 @@ public class OrderPayParam {
 	private String orderId;
 
 	@NotNull(message = "支付方式不能为空")
-	@ApiModelProperty(value = "支付方式:1支付宝,2微信",required=true)
+	@ApiModelProperty(value = "支付方式:1支付宝,2微信,3-H5",required=true)
 	private Integer payType;
 
 

+ 1 - 0
mp-service/src/main/java/com/qs/mp/channel/domain/vo/ChannelVO.java

@@ -1,5 +1,6 @@
 package com.qs.mp.channel.domain.vo;
 
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.qs.mp.channel.domain.Channel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;

+ 13 - 0
mp-service/src/main/java/com/qs/mp/channel/mapper/ChannelBankMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.channel.mapper;
+
+import com.qs.mp.channel.domain.ChannelBank;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2023-03-27 14:24:40
+ * @describe 渠道银行卡表mapper类
+ */
+public interface ChannelBankMapper extends BaseMapper<ChannelBank> {
+
+}

+ 16 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelBankService.java

@@ -0,0 +1,16 @@
+package com.qs.mp.channel.service;
+
+import com.qs.mp.channel.domain.ChannelBank;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 渠道银行卡表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2023-03-27
+ */
+public interface IChannelBankService extends IService<ChannelBank> {
+
+}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelBankServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qs.mp.channel.service.impl;
+
+import com.qs.mp.channel.domain.ChannelBank;
+import com.qs.mp.channel.mapper.ChannelBankMapper;
+import com.qs.mp.channel.service.IChannelBankService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 渠道银行卡表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2023-03-27
+ */
+@Service
+public class ChannelBankServiceImpl extends ServiceImpl<ChannelBankMapper, ChannelBank> implements IChannelBankService {
+
+}

+ 0 - 2
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelTicketTransferServiceImpl.java

@@ -37,7 +37,6 @@ public class ChannelTicketTransferServiceImpl extends ServiceImpl<ChannelTicketT
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean transferTicket(Long transferChannelId, ChannelTicketTransferParam channelTicketTransferParam) {
-
         // 转让盲票
         ChannelTicketTransfer channelTicketTransfer = new ChannelTicketTransfer();
         channelTicketTransfer.setTransferChannelId(transferChannelId);
@@ -54,7 +53,6 @@ public class ChannelTicketTransferServiceImpl extends ServiceImpl<ChannelTicketT
                 .set(ChannelOrderDetail::getChannelId, channelTicketTransferParam.getChannelId())
                 .eq(ChannelOrderDetail::getPkgId, channelTicketTransferParam.getPkgId())
                 .eq(ChannelOrderDetail::getChannelId, transferChannelId));
-
         return true;
     }
 

+ 113 - 3
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelWithdrawServiceImpl.java

@@ -1,8 +1,12 @@
 package com.qs.mp.channel.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.eptok.yspay.opensdkjava.fund.MercFundApi;
+import com.eptok.yspay.opensdkjava.pojo.vo.OnlineReqDataVo;
+import com.eptok.yspay.opensdkjava.util.DateUtil;
 import com.qs.mp.channel.domain.Channel;
 import com.qs.mp.channel.domain.ChannelBankCard;
 import com.qs.mp.channel.domain.ChannelMoneyLog;
@@ -14,15 +18,26 @@ import com.qs.mp.channel.service.IChannelMoneyLogService;
 import com.qs.mp.channel.service.IChannelService;
 import com.qs.mp.channel.service.IChannelWithdrawService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qs.mp.common.constant.YsPayMethodConstants;
+import com.qs.mp.common.constant.YsServerApiConstants;
+import com.qs.mp.common.domain.YsCallLog;
 import com.qs.mp.common.enums.ChannelMoneyEnum;
 import com.qs.mp.common.enums.ChannelWithdrawStatusEnum;
+import com.qs.mp.common.enums.YsCallBizTypeEnum;
+import com.qs.mp.common.exception.ServiceException;
+import com.qs.mp.common.service.IYsCallLogService;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.WebhookService;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.Assert;
@@ -38,6 +53,31 @@ import org.springframework.util.Assert;
 @Service
 public class ChannelWithdrawServiceImpl extends ServiceImpl<ChannelWithdrawMapper, ChannelWithdraw> implements IChannelWithdrawService {
 
+  private final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
+
+
+  @Value("${ys-pay.private-key-path}")
+  private String privateKeyPath;
+
+  @Value("${ys-pay.public-key-path}")
+  private String publicKeyPath;
+
+
+  @Value("${ys-pay.partner-id}")
+  private String partnerId;
+
+  @Value("${ys-pay.private-key-pass}")
+  private String privateKeyPass;
+
+  @Value("${ys-pay.withdraw-notify-url}")
+  private String ysWithdrawNotifyUrl;
+
+  @Value(value = "${server.env}")
+  private String env;
+
+  @Autowired
+  private IYsCallLogService ysCallLogService;
+
   @Autowired
   private IChannelBankCardService channelBankCardService;
 
@@ -48,13 +88,15 @@ public class ChannelWithdrawServiceImpl extends ServiceImpl<ChannelWithdrawMappe
   private IChannelMoneyLogService channelMoneyLogService;
 
   @Override
-  @Transactional
+  @Transactional(rollbackFor = Exception.class)
   public boolean apply(Channel channel, ChannelWithdraw channelWithdraw) {
 
     // 更新用户的银行卡信息
     ChannelBankCard bankCard = channelBankCardService.getOne(new LambdaQueryWrapper<ChannelBankCard>()
         .eq(ChannelBankCard::getChannelId, channel.getChannelId()));
     if (null == bankCard) {
+//      throw new RuntimeException("请先绑定银行卡");
+//    }
       bankCard = new ChannelBankCard();
       bankCard.setChannelId(channel.getChannelId());
       bankCard.setCardNo(channelWithdraw.getCardNo());
@@ -105,7 +147,7 @@ public class ChannelWithdrawServiceImpl extends ServiceImpl<ChannelWithdrawMappe
   }
 
   @Override
-  @Transactional
+  @Transactional(rollbackFor = Exception.class)
   public boolean verify(ChannelWithdraw withdraw, ChannelWithdrawStatusEnum status, String verifyContent) {
     if (status == ChannelWithdrawStatusEnum.FINISHED) {
       boolean rtn = update(new LambdaUpdateWrapper<ChannelWithdraw>()
@@ -125,7 +167,75 @@ public class ChannelWithdrawServiceImpl extends ServiceImpl<ChannelWithdrawMappe
           .eq(Channel::getChannelId, withdraw.getChannelId())
           .eq(Channel::getFrozenMoney, channel.getFrozenMoney()));
       Assert.isTrue(updateRtn, "提现申请审核通过,更新账号冻结金额。channelId:" + channel.getChannelId());
-    } else if (status == ChannelWithdrawStatusEnum.FAILED) {
+    }
+    // 银盛提现接口调用
+    /*
+    else if (status == ChannelWithdrawStatusEnum.WITHDRAW_PROCESS) {
+      String tradeNo = DateUtil.getDateNowYmd() + DateUtil.getRandom(14);;
+
+      // 更新状态为提现处理中
+      boolean rtn = update(new LambdaUpdateWrapper<ChannelWithdraw>()
+          .set(ChannelWithdraw::getTradeNo, tradeNo)
+          .set(ChannelWithdraw::getStatus, status)
+          .eq(ChannelWithdraw::getId, withdraw.getId())
+          .in(ChannelWithdraw::getStatus, ChannelWithdrawStatusEnum.WITHDRAWING, ChannelWithdrawStatusEnum.YS_WITHDRAW_FAILED));
+      Assert.isTrue(rtn, "调用银盛提现接口失败。id:" + withdraw.getId());
+
+      // 调用银盛发起提现
+      OnlineReqDataVo req = new OnlineReqDataVo();
+
+      //银盛支付服务器主动通知商户网站里指定的页面http路径
+      req.setNotifyUrl(ysWithdrawNotifyUrl);
+
+      //商户在银盛支付平台开设的用户号[商户号],接入时需要替换成自己的
+      req.setPartnerId("hyfz_test2");
+      req.setReqUrl(YsServerApiConstants.COMMON_API);
+      req.setPrivateKeyFilePath(privateKeyPath);
+      req.setPrivateKeyPassword(privateKeyPass);
+      req.setYsPublicKeyFilePath(publicKeyPath);
+      //实时提现(一般户到银行卡)业务参数
+      Map<String, Object> bizContent = new HashMap<>();
+      //商户生成的订单号,生成规则前8位必须为交易日期,如20180525,范围跨度支持包含当天在内的前后一天
+      bizContent.put("out_trade_no", tradeNo);
+      //商户号
+      bizContent.put("merchant_usercode", partnerId);
+      //暂时只支持币种:CNY(人民币)
+      bizContent.put("currency", "CNY");
+      //提现的总金额。单位为:RMB Yuan。取值范围为[0.01,99999999.99],精确到小数点后两位。Number(10,2)指10位长度,2位精度
+      if ("prod".equals(env)) {
+        bizContent.put("total_amount", new BigDecimal(withdraw.getMoney()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString());
+      } else {
+        bizContent.put("total_amount", "1.00");
+      }
+      //订单说明
+      bizContent.put("subject", "提现");
+      //商户日期(该参数做交易与查询时需要一致) 该日期需在当日的前后一天时间范围之内
+      bizContent.put("shopdate", DateUtil.getDateNowYmd());
+      //银行帐号
+      bizContent.put("bank_account_no", withdraw.getCardNo());
+      req.setParamData(bizContent);
+      String result = null;
+
+      YsCallLog ysCallLog = new YsCallLog();
+      try{
+        logger.info("实时提现(一般户到银行卡)调用sdk接口addScanMerc请求入参为:"+ JSONObject.toJSONString(req));
+        //根据返回结果处理自己的业务逻辑,result内容详见接口文档
+        result = MercFundApi.withdrawQuick(req);
+        ysCallLog.setResJson(result);
+        logger.info("实时提现(一般户到银行卡)调用sdk接口addScanMerc请求出参为:"+ result);
+      }catch (Exception e){
+        logger.info("实时提现(一般户到银行卡)失败:"+ e.getMessage());
+        throw new ServiceException("调用银盛发起提现失败");
+      }
+
+      ysCallLog.setBizId(String.valueOf(withdraw.getId()));
+      ysCallLog.setBizType(YsCallBizTypeEnum.WITHDRAW);
+      ysCallLog.setInterfaceId(YsPayMethodConstants.GENERAL_ACCOUNT_WITHDRAW_METHOD);
+      ysCallLog.setReqJson(JSONObject.toJSONString(bizContent));
+      ysCallLogService.save(ysCallLog);
+      */
+
+     else if (status == ChannelWithdrawStatusEnum.FAILED) {
       boolean rtn = update(new LambdaUpdateWrapper<ChannelWithdraw>()
           .set(ChannelWithdraw::getStatus, status)
           .set(ChannelWithdraw::getVerifyContent, verifyContent)

+ 97 - 0
mp-service/src/main/java/com/qs/mp/common/domain/YsCallLog.java

@@ -0,0 +1,97 @@
+package com.qs.mp.common.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.qs.mp.common.enums.YsCallBizTypeEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+/**
+ * @describe 银盛调用日志表实体类
+ * @auther quanshu
+ * @create 2023-03-27 14:24:03
+ */
+@TableName("mp_ys_call_log")
+@Data
+@ApiModel("银盛调用日志实体类")
+public class YsCallLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 请求id
+     */
+    @ApiModelProperty("关联id")
+    @TableField("biz_id")
+    private String bizId;
+
+    @ApiModelProperty("关联业务")
+    @TableField("biz_Type")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private YsCallBizTypeEnum bizType;
+
+    /**
+     * 请求接口
+     */
+    @ApiModelProperty("请求接口")
+    @TableField("interface_id")
+    private String interfaceId;
+
+    /**
+     * 请求参数
+     */
+    @ApiModelProperty("请求参数")
+    @TableField("req_json")
+    private String reqJson;
+
+    /**
+     * 响应参数
+     */
+    @ApiModelProperty("响应参数")
+    @TableField("res_json")
+    private String resJson;
+
+    @ApiModelProperty("回调数据")
+    @TableField("callback_json")
+    private String callbackJson;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+    /**
+     * 逻辑删除标识
+     */
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/common/mapper/YsCallLogMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.common.mapper;
+
+import com.qs.mp.common.domain.YsCallLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2023-03-27 14:24:03
+ * @describe 银盛调用日志表mapper类
+ */
+public interface YsCallLogMapper extends BaseMapper<YsCallLog> {
+
+}

+ 16 - 0
mp-service/src/main/java/com/qs/mp/common/service/IYsCallLogService.java

@@ -0,0 +1,16 @@
+package com.qs.mp.common.service;
+
+import com.qs.mp.common.domain.YsCallLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 银盛调用日志表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2023-03-27
+ */
+public interface IYsCallLogService extends IService<YsCallLog> {
+
+}

+ 20 - 0
mp-service/src/main/java/com/qs/mp/common/service/impl/YsCallLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qs.mp.common.service.impl;
+
+import com.qs.mp.common.domain.YsCallLog;
+import com.qs.mp.common.mapper.YsCallLogMapper;
+import com.qs.mp.common.service.IYsCallLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 银盛调用日志表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2023-03-27
+ */
+@Service
+public class YsCallLogServiceImpl extends ServiceImpl<YsCallLogMapper, YsCallLog> implements IYsCallLogService {
+
+}

+ 96 - 0
mp-service/src/main/java/com/qs/mp/pay/domain/DivisionLog.java

@@ -0,0 +1,96 @@
+package com.qs.mp.pay.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.qs.mp.common.enums.DivisionStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+/**
+ * @describe 分账记录表实体类
+ * @auther quanshu
+ * @create 2023-03-27 14:24:26
+ */
+@TableName("mp_division_log")
+@Data
+@ApiModel("分账记录表实体类")
+public class DivisionLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 分账单号
+     */
+    @ApiModelProperty("分账单号")
+    @TableField("trade_no")
+    private String tradeNo;
+
+    /**
+     * 关联支付单号
+     */
+    @ApiModelProperty("关联支付单号")
+    @TableField("order_no")
+    private String orderNo;
+
+    /**
+     * 关联业务单号
+     */
+    @ApiModelProperty("关联业务单号")
+    @TableField("biz_id")
+    private String bizId;
+
+    /**
+     * 分账金额
+     */
+    @ApiModelProperty("分账金额")
+    @TableField("amount")
+    private Integer amount;
+
+    /**
+     * 状态:1初始化,2完成,3失败
+     */
+    @ApiModelProperty("状态:0初始化,1完成,2登记失败,3失败")
+    @TableField("status")
+    @JSONField(serialzeFeatures = SerializerFeature.WriteEnumUsingToString)
+    private DivisionStatusEnum status;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField("created_time")
+    private Date createdTime;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty("更新时间")
+    @TableField("updated_time")
+    private Date updatedTime;
+
+    /**
+     * 逻辑删除标识
+     */
+    @ApiModelProperty("逻辑删除标识")
+    @TableField("is_deleted")
+    @TableLogic
+    private Integer isDeleted;
+
+
+}

+ 614 - 0
mp-service/src/main/java/com/qs/mp/pay/domain/DougongPayRequestParam.java

@@ -0,0 +1,614 @@
+package com.qs.mp.pay.domain;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class DougongPayRequestParam {
+    //公众账号ID
+    private String appid;
+    //商户号
+    private String mchId;
+    //设备号
+    private String deviceInfo;
+    //随机字符串
+    private String nonceStr;
+    //签名
+    private String sign;
+    //签名类型
+    private String signType;
+    //商品描述
+    private String body;
+    //商品详情
+    private String detail;
+    //附加数据
+    private String attach;
+    //商户订单号
+    private String tradesOrderId;
+    //标价币种 默认人民币:CNY
+    private String feeType;
+    //标价金额 单位为分
+    private Integer totalFee;
+    //终端IP
+    private String spbillCreateIp;
+    //交易起始时间 格式为yyyyMMddHHmmss
+    private String timeStart;
+    //交易结束时间 格式为yyyyMMddHHmmss
+    private String timeExpire;
+    //商品标记
+    private String goodsTag;
+    //通知地址
+    private String notifyUrl;
+    //交易类型 JSAPI,NATIVE,APP
+    private String tradeType;
+    //商品ID
+    private String productId;
+    //指定支付方式
+    private String limitPay;
+    //用户标识
+    private String openid;
+
+    //子商户号
+    private String subMchId;
+
+    //子商户公众账号ID
+    private String subAppid;
+
+    //用户子标识
+    private String subOpenid;
+    /**
+     * 退款请求参数
+     */
+
+    //微信订单号
+    private String transactionId;
+    //商户退款单号
+    private String outRefundNo;
+    //退款金额
+    private Integer refundFee;
+    //货币种类
+    private String refundFeeType;
+    //操作员
+    private String opUserId;
+    //微信退款单号
+    private String refundId;
+    //对账单日期 格式:20140603
+    private String billDate;
+    //账单类型 ALL,返回当日所有订单信息,默认值
+    //COUNT,返回当日成功支付的订单
+    //REFUND,返回当日退款订单
+    private String billType;
+
+    /**
+     * 微信上报
+     */
+    //接口URL
+    private String interfaceUrl;
+    //接口耗时
+    private Integer executeTime;
+    //返回状态码
+    private String returnCode;
+    //业务结果
+    private String resultCode;
+    //访问接口IP
+    private String userIp;
+
+    //URL链接
+    private String shorturl;
+    //扫码支付授权码,设备读取用户微信中的条码或者二维码信息
+    private String authCode;
+    //退款资金来源仅针对老资金流商户使用
+    //REFUND_SOURCE_UNSETTLED_FUNDS---未结算资金退款(默认使用未结算资金退款)
+    //REFUND_SOURCE_RECHARGE_FUNDS---可用余额退款
+    private String refundAccount;
+
+    private String clientIp;
+    //场景信息//IOS移动应用
+    //{"h5_info": {"type":"IOS","app_name": "王者荣耀","bundle_id": "com.tencent.wzryIOS"}}
+
+    //安卓移动应用
+    //{"h5_info": {"type":"Android","app_name": "王者荣耀","package_name": "com.tencent.tmgp.sgame"}}
+
+    //WAP网站应用
+    //{"h5_info": {"type":"Wap","wap_url": "https://pay.qq.com","wap_name": "腾讯充值"}}
+    private String sceneInfo;
+
+    private String huifuTransDate;//汇付支付交易时间,实际上就是订单的汇付支付时间,格式按照要求必须为:yyyyMMdd
+
+    private String huifuOrdType;//汇付订单类型,1-支付订单2-退款订单
+
+    private String couponId;
+    private Integer discountMoney;
+    private Integer originalMoney;
+    private String merchantNo;
+    private String productType;
+
+    private Integer faceValue;
+
+    public String getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(String couponId) {
+        this.couponId = couponId;
+    }
+
+    public Integer getDiscountMoney() {
+        return discountMoney;
+    }
+
+    public void setDiscountMoney(Integer discountMoney) {
+        this.discountMoney = discountMoney;
+    }
+
+    public Integer getOriginalMoney() {
+        return originalMoney;
+    }
+
+    public void setOriginalMoney(Integer originalMoney) {
+        this.originalMoney = originalMoney;
+    }
+
+    public String getMerchantNo() {
+        return merchantNo;
+    }
+
+    public void setMerchantNo(String merchantNo) {
+        this.merchantNo = merchantNo;
+    }
+
+    public String getProductType() {
+        return productType;
+    }
+
+    public void setProductType(String productType) {
+        this.productType = productType;
+    }
+
+    public Integer getFaceValue() {
+        return faceValue;
+    }
+
+    public void setFaceValue(Integer faceValue) {
+        this.faceValue = faceValue;
+    }
+
+    public String getAppid() {
+        return appid;
+    }
+
+    public void setAppid(String appid) {
+        this.appid = appid;
+    }
+
+    public String getMchId() {
+        return mchId;
+    }
+
+    public void setMchId(String mchId) {
+        this.mchId = mchId;
+    }
+
+    public String getDeviceInfo() {
+        return deviceInfo;
+    }
+
+    public void setDeviceInfo(String deviceInfo) {
+        this.deviceInfo = deviceInfo;
+    }
+
+    public String getNonceStr() {
+        return nonceStr;
+    }
+
+    public void setNonceStr(String nonceStr) {
+        this.nonceStr = nonceStr;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+
+    public String getSignType() {
+        return signType;
+    }
+
+    public void setSignType(String signType) {
+        this.signType = signType;
+    }
+
+    public String getBody() {
+        return body;
+    }
+
+    public void setBody(String body) {
+        this.body = body;
+    }
+
+    public String getDetail() {
+        return detail;
+    }
+
+    public void setDetail(String detail) {
+        this.detail = detail;
+    }
+
+    public String getAttach() {
+        return attach;
+    }
+
+    public void setAttach(String attach) {
+        this.attach = attach;
+    }
+
+    public String getTradesOrderId() {
+        return tradesOrderId;
+    }
+
+    public void setTradesOrderId(String tradesOrderId) {
+        this.tradesOrderId = tradesOrderId;
+    }
+
+    public String getFeeType() {
+        return feeType;
+    }
+
+    public void setFeeType(String feeType) {
+        this.feeType = feeType;
+    }
+
+    public Integer getTotalFee() {
+        return totalFee;
+    }
+
+    public void setTotalFee(Integer totalFee) {
+        this.totalFee = totalFee;
+    }
+
+    public String getSpbillCreateIp() {
+        return spbillCreateIp;
+    }
+
+    public void setSpbillCreateIp(String spbillCreateIp) {
+        this.spbillCreateIp = spbillCreateIp;
+    }
+
+    public String getTimeStart() {
+        return timeStart;
+    }
+
+    public void setTimeStart(String timeStart) {
+        this.timeStart = timeStart;
+    }
+
+    public String getTimeExpire() {
+        return timeExpire;
+    }
+
+    public void setTimeExpire(String timeExpire) {
+        this.timeExpire = timeExpire;
+    }
+
+    public String getGoodsTag() {
+        return goodsTag;
+    }
+
+    public void setGoodsTag(String goodsTag) {
+        this.goodsTag = goodsTag;
+    }
+
+    public String getNotifyUrl() {
+        return notifyUrl;
+    }
+
+    public void setNotifyUrl(String notifyUrl) {
+        this.notifyUrl = notifyUrl;
+    }
+
+    public String getTradeType() {
+        return tradeType;
+    }
+
+    public void setTradeType(String tradeType) {
+        this.tradeType = tradeType;
+    }
+
+    public String getProductId() {
+        return productId;
+    }
+
+    public void setProductId(String productId) {
+        this.productId = productId;
+    }
+
+    public String getLimitPay() {
+        return limitPay;
+    }
+
+    public void setLimitPay(String limitPay) {
+        this.limitPay = limitPay;
+    }
+
+    public String getOpenid() {
+        return openid;
+    }
+
+    public void setOpenid(String openid) {
+        this.openid = openid;
+    }
+
+    public String getSubMchId() {
+        return subMchId;
+    }
+
+    public void setSubMchId(String subMchId) {
+        this.subMchId = subMchId;
+    }
+
+    public String getSubAppid() {
+        return subAppid;
+    }
+
+    public void setSubAppid(String subAppid) {
+        this.subAppid = subAppid;
+    }
+
+    public String getSubOpenid() {
+        return subOpenid;
+    }
+
+    public void setSubOpenid(String subOpenid) {
+        this.subOpenid = subOpenid;
+    }
+
+    public String getTransactionId() {
+        return transactionId;
+    }
+
+    public void setTransactionId(String transactionId) {
+        this.transactionId = transactionId;
+    }
+
+    public String getOutRefundNo() {
+        return outRefundNo;
+    }
+
+    public void setOutRefundNo(String outRefundNo) {
+        this.outRefundNo = outRefundNo;
+    }
+
+    public Integer getRefundFee() {
+        return refundFee;
+    }
+
+    public void setRefundFee(Integer refundFee) {
+        this.refundFee = refundFee;
+    }
+
+    public String getRefundFeeType() {
+        return refundFeeType;
+    }
+
+    public void setRefundFeeType(String refundFeeType) {
+        this.refundFeeType = refundFeeType;
+    }
+
+    public String getOpUserId() {
+        return opUserId;
+    }
+
+    public void setOpUserId(String opUserId) {
+        this.opUserId = opUserId;
+    }
+
+    public String getRefundId() {
+        return refundId;
+    }
+
+    public void setRefundId(String refundId) {
+        this.refundId = refundId;
+    }
+
+    public String getBillDate() {
+        return billDate;
+    }
+
+    public void setBillDate(String billDate) {
+        this.billDate = billDate;
+    }
+
+    public String getBillType() {
+        return billType;
+    }
+
+    public void setBillType(String billType) {
+        this.billType = billType;
+    }
+
+    public String getInterfaceUrl() {
+        return interfaceUrl;
+    }
+
+    public void setInterfaceUrl(String interfaceUrl) {
+        this.interfaceUrl = interfaceUrl;
+    }
+
+    public Integer getExecuteTime() {
+        return executeTime;
+    }
+
+    public void setExecuteTime(Integer executeTime) {
+        this.executeTime = executeTime;
+    }
+
+    public String getReturnCode() {
+        return returnCode;
+    }
+
+    public void setReturnCode(String returnCode) {
+        this.returnCode = returnCode;
+    }
+
+    public String getResultCode() {
+        return resultCode;
+    }
+
+    public void setResultCode(String resultCode) {
+        this.resultCode = resultCode;
+    }
+
+    public String getUserIp() {
+        return userIp;
+    }
+
+    public void setUserIp(String userIp) {
+        this.userIp = userIp;
+    }
+
+    public String getShorturl() {
+        return shorturl;
+    }
+
+    public void setShorturl(String shorturl) {
+        this.shorturl = shorturl;
+    }
+
+    public String getAuthCode() {
+        return authCode;
+    }
+
+    public void setAuthCode(String authCode) {
+        this.authCode = authCode;
+    }
+
+    public String getRefundAccount() {
+        return refundAccount;
+    }
+
+    public void setRefundAccount(String refundAccount) {
+        this.refundAccount = refundAccount;
+    }
+
+    public String getClientIp() {
+        return clientIp;
+    }
+
+    public void setClientIp(String clientIp) {
+        this.clientIp = clientIp;
+    }
+
+    public String getSceneInfo() {
+        return sceneInfo;
+    }
+
+    public void setSceneInfo(String sceneInfo) {
+        this.sceneInfo = sceneInfo;
+    }
+
+    public String getHuifuTransDate() {
+        return huifuTransDate;
+    }
+
+    public void setHuifuTransDate(String huifuTransDate) {
+        this.huifuTransDate = huifuTransDate;
+    }
+
+    public String getHuifuOrdType() {
+        return huifuOrdType;
+    }
+
+    public void setHuifuOrdType(String huifuOrdType) {
+        this.huifuOrdType = huifuOrdType;
+    }
+
+    public String getPayStyle() {
+        return payStyle;
+    }
+
+    public void setPayStyle(String payStyle) {
+        this.payStyle = payStyle;
+    }
+
+    public String getHuifuPayId() {
+        return huifuPayId;
+    }
+
+    public void setHuifuPayId(String huifuPayId) {
+        this.huifuPayId = huifuPayId;
+    }
+
+    public String getCcbPayId() {
+        return ccbPayId;
+    }
+
+    public void setCcbPayId(String ccbPayId) {
+        this.ccbPayId = ccbPayId;
+    }
+
+    private String payStyle;//支付方式:wx/wx_huifu/ali/ali_huifu
+
+    private String huifuPayId;//汇付支付单号,原始订单号+P+时间戳
+
+    private String ccbPayId;//建行支付单号,原始订单号+P+时间戳
+
+
+
+
+
+
+
+
+
+
+
+
+    @Override
+    public String toString() {
+        return "WxRequestParam{" +
+            "appid='" + appid + '\'' +
+            ", mch_id='" + mchId + '\'' +
+            ", deviceInfo='" + deviceInfo + '\'' +
+            ", nonceStr='" + nonceStr + '\'' +
+            ", sign='" + sign + '\'' +
+            ", signType='" + signType + '\'' +
+            ", body='" + body + '\'' +
+            ", detail='" + detail + '\'' +
+            ", attach='" + attach + '\'' +
+            ", outTradeNo='" + tradesOrderId + '\'' +
+            ", feeType='" + feeType + '\'' +
+            ", total_fee=" + totalFee +
+            ", spbillCreateIp='" + spbillCreateIp + '\'' +
+            ", timeStart='" + timeStart + '\'' +
+            ", timeExpire='" + timeExpire + '\'' +
+            ", goodsTag='" + goodsTag + '\'' +
+            ", notifyUrl='" + notifyUrl + '\'' +
+            ", tradeType='" + tradeType + '\'' +
+            ", productId='" + productId + '\'' +
+            ", limitPay='" + limitPay + '\'' +
+            ", openid='" + openid + '\'' +
+            ", subMchId='" + subMchId + '\'' +
+            ", subAppid='" + subAppid + '\'' +
+            ", subOpenid='" + subOpenid + '\'' +
+            ", transactionId='" + transactionId + '\'' +
+            ", outRefundNo='" + outRefundNo + '\'' +
+            ", refund_fee=" + refundFee +
+            ", refundFeeType='" + refundFeeType + '\'' +
+            ", opUserId='" + opUserId + '\'' +
+            ", refundId='" + refundId + '\'' +
+            ", billDate='" + billDate + '\'' +
+            ", billType='" + billType + '\'' +
+            ", interfaceUrl='" + interfaceUrl + '\'' +
+            ", executeTime=" + executeTime +
+            ", returnCode='" + returnCode + '\'' +
+            ", resultCode='" + resultCode + '\'' +
+            ", userIp='" + userIp + '\'' +
+            ", shorturl='" + shorturl + '\'' +
+            ", authCode='" + authCode + '\'' +
+            ", refundAccount='" + refundAccount + '\'' +
+            ", sceneInfo='" + sceneInfo + '\'' +
+            '}';
+    }
+}

+ 6 - 2
mp-service/src/main/java/com/qs/mp/pay/domain/PayOrder.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.qs.mp.common.enums.BizTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
 import java.io.Serializable;
 import java.util.Date;
 import lombok.Data;
@@ -26,6 +27,9 @@ public class PayOrder implements Serializable {
   @TableId(value = "order_id" , type = IdType.INPUT)
   private String orderId;
 
+  @ApiModelProperty("商户系统生成的订单号")
+  private String tradeNo;
+
   /**
    * 订单类型,1:渠道订单,2用户订单
    */
@@ -51,14 +55,14 @@ public class PayOrder implements Serializable {
   private String orderTime;
 
   /**
-   * 支付来源 1:支付宝  2:微信支付 5:云闪付
+   * 支付来源 1:支付宝  2:微信支付 5:云闪付,3银盛
    * 增加直连来源(2022.7) 10:支付宝直连
    */
   @TableField("pay_resource")
   private String payResource;
 
   /**
-   * 1004:支付宝CTB;1008:微信公众号(需要绑定支付目录)1014: 支付宝服务窗1016:云闪付CTB1017:微信小程序1019:支付宝小程序(请用1014编码)
+   * 1004:支付宝CTB;1008:微信公众号(需要绑定支付目录)1014: 支付宝服务窗1016:云闪付CTB1017:微信小程序1019:支付宝小程序(请用1014编码),1020:银盛H5
    *
    */
   @TableField("trans_type_code")

+ 436 - 0
mp-service/src/main/java/com/qs/mp/pay/domain/PaymentConfig.java

@@ -0,0 +1,436 @@
+package com.qs.mp.pay.domain;
+
+import java.util.Date;
+
+public class PaymentConfig {
+    private String id;
+
+    private Integer dataOrder;
+
+    private Date createTime;
+
+    private Date updateTime;
+
+    private String makePerson;
+
+    private String modifier;
+
+    private Date modifierTime;
+
+    private Integer locked;
+
+    private Integer delTag;
+
+    private Integer checkTag;
+
+    private String checkStatus;
+
+    private Date checkTime;
+
+    private String checkPerson;
+
+    private Integer printTag;
+
+    private Integer invalidTag;
+
+    private String menuId;
+
+    private String menuName;
+
+    private String remarks;
+
+    private String merchantId;
+
+    private String appId;
+
+    private String memberId;
+
+    private String aliPid;
+
+    private String storeId;
+
+    private String agentId;
+
+    private String agentName;
+
+    private Integer storeType;
+
+    private Integer paymentType;
+
+    private String merchantCode;
+
+    private String merchantCounterCode;
+
+    private String theBranchCode;
+
+    private String sysId;
+
+    private String huifuId;
+
+    private String merchantName;
+
+    private String storeName;
+
+    private Integer availableTag;
+
+    private String privateKeyDougong;
+
+    private String publicKeyHuifu;
+
+    private String appletId;
+
+    private String appletSecret;
+
+    private String wechatSecret;
+
+    private String dougongProductId;
+
+    private String hostName;
+
+    private String token;
+
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id == null ? null : id.trim();
+    }
+
+    public Integer getDataOrder() {
+        return dataOrder;
+    }
+
+    public void setDataOrder(Integer dataOrder) {
+        this.dataOrder = dataOrder;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getMakePerson() {
+        return makePerson;
+    }
+
+    public void setMakePerson(String makePerson) {
+        this.makePerson = makePerson == null ? null : makePerson.trim();
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier == null ? null : modifier.trim();
+    }
+
+    public Date getModifierTime() {
+        return modifierTime;
+    }
+
+    public void setModifierTime(Date modifierTime) {
+        this.modifierTime = modifierTime;
+    }
+
+    public Integer getLocked() {
+        return locked;
+    }
+
+    public void setLocked(Integer locked) {
+        this.locked = locked;
+    }
+
+    public Integer getDelTag() {
+        return delTag;
+    }
+
+    public void setDelTag(Integer delTag) {
+        this.delTag = delTag;
+    }
+
+    public Integer getCheckTag() {
+        return checkTag;
+    }
+
+    public void setCheckTag(Integer checkTag) {
+        this.checkTag = checkTag;
+    }
+
+    public String getCheckStatus() {
+        return checkStatus;
+    }
+
+    public void setCheckStatus(String checkStatus) {
+        this.checkStatus = checkStatus == null ? null : checkStatus.trim();
+    }
+
+    public Date getCheckTime() {
+        return checkTime;
+    }
+
+    public void setCheckTime(Date checkTime) {
+        this.checkTime = checkTime;
+    }
+
+    public String getCheckPerson() {
+        return checkPerson;
+    }
+
+    public void setCheckPerson(String checkPerson) {
+        this.checkPerson = checkPerson == null ? null : checkPerson.trim();
+    }
+
+    public Integer getPrintTag() {
+        return printTag;
+    }
+
+    public void setPrintTag(Integer printTag) {
+        this.printTag = printTag;
+    }
+
+    public Integer getInvalidTag() {
+        return invalidTag;
+    }
+
+    public void setInvalidTag(Integer invalidTag) {
+        this.invalidTag = invalidTag;
+    }
+
+    public String getMenuId() {
+        return menuId;
+    }
+
+    public void setMenuId(String menuId) {
+        this.menuId = menuId == null ? null : menuId.trim();
+    }
+
+    public String getMenuName() {
+        return menuName;
+    }
+
+    public void setMenuName(String menuName) {
+        this.menuName = menuName == null ? null : menuName.trim();
+    }
+
+    public String getRemarks() {
+        return remarks;
+    }
+
+    public void setRemarks(String remarks) {
+        this.remarks = remarks == null ? null : remarks.trim();
+    }
+
+    public String getMerchantId() {
+        return merchantId;
+    }
+
+    public void setMerchantId(String merchantId) {
+        this.merchantId = merchantId == null ? null : merchantId.trim();
+    }
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId == null ? null : appId.trim();
+    }
+
+    public String getMemberId() {
+        return memberId;
+    }
+
+    public void setMemberId(String memberId) {
+        this.memberId = memberId == null ? null : memberId.trim();
+    }
+
+    public String getAliPid() {
+        return aliPid;
+    }
+
+    public void setAliPid(String aliPid) {
+        this.aliPid = aliPid == null ? null : aliPid.trim();
+    }
+
+    public String getStoreId() {
+        return storeId;
+    }
+
+    public void setStoreId(String storeId) {
+        this.storeId = storeId == null ? null : storeId.trim();
+    }
+
+    public String getAgentId() {
+        return agentId;
+    }
+
+    public void setAgentId(String agentId) {
+        this.agentId = agentId == null ? null : agentId.trim();
+    }
+
+    public String getAgentName() {
+        return agentName;
+    }
+
+    public void setAgentName(String agentName) {
+        this.agentName = agentName == null ? null : agentName.trim();
+    }
+
+    public Integer getStoreType() {
+        return storeType;
+    }
+
+    public void setStoreType(Integer storeType) {
+        this.storeType = storeType;
+    }
+
+    public Integer getPaymentType() {
+        return paymentType;
+    }
+
+    public void setPaymentType(Integer paymentType) {
+        this.paymentType = paymentType;
+    }
+
+    public String getMerchantCode() {
+        return merchantCode;
+    }
+
+    public void setMerchantCode(String merchantCode) {
+        this.merchantCode = merchantCode == null ? null : merchantCode.trim();
+    }
+
+    public String getMerchantCounterCode() {
+        return merchantCounterCode;
+    }
+
+    public void setMerchantCounterCode(String merchantCounterCode) {
+        this.merchantCounterCode = merchantCounterCode == null ? null : merchantCounterCode.trim();
+    }
+
+    public String getTheBranchCode() {
+        return theBranchCode;
+    }
+
+    public void setTheBranchCode(String theBranchCode) {
+        this.theBranchCode = theBranchCode == null ? null : theBranchCode.trim();
+    }
+
+    public String getSysId() {
+        return sysId;
+    }
+
+    public void setSysId(String sysId) {
+        this.sysId = sysId == null ? null : sysId.trim();
+    }
+
+    public String getHuifuId() {
+        return huifuId;
+    }
+
+    public void setHuifuId(String huifuId) {
+        this.huifuId = huifuId == null ? null : huifuId.trim();
+    }
+
+    public String getMerchantName() {
+        return merchantName;
+    }
+
+    public void setMerchantName(String merchantName) {
+        this.merchantName = merchantName == null ? null : merchantName.trim();
+    }
+
+    public String getStoreName() {
+        return storeName;
+    }
+
+    public void setStoreName(String storeName) {
+        this.storeName = storeName == null ? null : storeName.trim();
+    }
+
+    public Integer getAvailableTag() {
+        return availableTag;
+    }
+
+    public void setAvailableTag(Integer availableTag) {
+        this.availableTag = availableTag;
+    }
+
+    public String getPrivateKeyDougong() {
+        return privateKeyDougong;
+    }
+
+    public void setPrivateKeyDougong(String privateKeyDougong) {
+        this.privateKeyDougong = privateKeyDougong == null ? null : privateKeyDougong.trim();
+    }
+
+    public String getPublicKeyHuifu() {
+        return publicKeyHuifu;
+    }
+
+    public void setPublicKeyHuifu(String publicKeyHuifu) {
+        this.publicKeyHuifu = publicKeyHuifu == null ? null : publicKeyHuifu.trim();
+    }
+
+    public String getAppletId() {
+        return appletId;
+    }
+
+    public void setAppletId(String appletId) {
+        this.appletId = appletId == null ? null : appletId.trim();
+    }
+
+    public String getAppletSecret() {
+        return appletSecret;
+    }
+
+    public void setAppletSecret(String appletSecret) {
+        this.appletSecret = appletSecret == null ? null : appletSecret.trim();
+    }
+
+    public String getWechatSecret() {
+        return wechatSecret;
+    }
+
+    public void setWechatSecret(String wechatSecret) {
+        this.wechatSecret = wechatSecret == null ? null : wechatSecret.trim();
+    }
+
+    public String getDougongProductId() {
+        return dougongProductId;
+    }
+
+    public void setDougongProductId(String dougongProductId) {
+        this.dougongProductId = dougongProductId == null ? null : dougongProductId.trim();
+    }
+
+    public String getHostName() {
+        return hostName;
+    }
+
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+}

+ 2940 - 0
mp-service/src/main/java/com/qs/mp/pay/domain/PaymentConfigExample.java

@@ -0,0 +1,2940 @@
+package com.qs.mp.pay.domain;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class PaymentConfigExample {
+    protected String orderByClause;
+
+    protected boolean distinct;
+
+    protected List<Criteria> oredCriteria;
+
+    public PaymentConfigExample() {
+        oredCriteria = new ArrayList<>();
+    }
+
+    public void setOrderByClause(String orderByClause) {
+        this.orderByClause = orderByClause;
+    }
+
+    public String getOrderByClause() {
+        return orderByClause;
+    }
+
+    public void setDistinct(boolean distinct) {
+        this.distinct = distinct;
+    }
+
+    public boolean isDistinct() {
+        return distinct;
+    }
+
+    public List<Criteria> getOredCriteria() {
+        return oredCriteria;
+    }
+
+    public void or(Criteria criteria) {
+        oredCriteria.add(criteria);
+    }
+
+    public Criteria or() {
+        Criteria criteria = createCriteriaInternal();
+        oredCriteria.add(criteria);
+        return criteria;
+    }
+
+    public Criteria createCriteria() {
+        Criteria criteria = createCriteriaInternal();
+        if (oredCriteria.size() == 0) {
+            oredCriteria.add(criteria);
+        }
+        return criteria;
+    }
+
+    protected Criteria createCriteriaInternal() {
+        Criteria criteria = new Criteria();
+        return criteria;
+    }
+
+    public void clear() {
+        oredCriteria.clear();
+        orderByClause = null;
+        distinct = false;
+    }
+
+    protected abstract static class GeneratedCriteria {
+        protected List<Criterion> criteria;
+
+        protected GeneratedCriteria() {
+            super();
+            criteria = new ArrayList<>();
+        }
+
+        public boolean isValid() {
+            return criteria.size() > 0;
+        }
+
+        public List<Criterion> getAllCriteria() {
+            return criteria;
+        }
+
+        public List<Criterion> getCriteria() {
+            return criteria;
+        }
+
+        protected void addCriterion(String condition) {
+            if (condition == null) {
+                throw new RuntimeException("Value for condition cannot be null");
+            }
+            criteria.add(new Criterion(condition));
+        }
+
+        protected void addCriterion(String condition, Object value, String property) {
+            if (value == null) {
+                throw new RuntimeException("Value for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value));
+        }
+
+        protected void addCriterion(String condition, Object value1, Object value2, String property) {
+            if (value1 == null || value2 == null) {
+                throw new RuntimeException("Between values for " + property + " cannot be null");
+            }
+            criteria.add(new Criterion(condition, value1, value2));
+        }
+
+        public Criteria andIdIsNull() {
+            addCriterion("id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIsNotNull() {
+            addCriterion("id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdEqualTo(String value) {
+            addCriterion("id =", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotEqualTo(String value) {
+            addCriterion("id <>", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThan(String value) {
+            addCriterion("id >", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdGreaterThanOrEqualTo(String value) {
+            addCriterion("id >=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThan(String value) {
+            addCriterion("id <", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLessThanOrEqualTo(String value) {
+            addCriterion("id <=", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdLike(String value) {
+            addCriterion("id like", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotLike(String value) {
+            addCriterion("id not like", value, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdIn(List<String> values) {
+            addCriterion("id in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotIn(List<String> values) {
+            addCriterion("id not in", values, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdBetween(String value1, String value2) {
+            addCriterion("id between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andIdNotBetween(String value1, String value2) {
+            addCriterion("id not between", value1, value2, "id");
+            return (Criteria) this;
+        }
+
+        public Criteria andDataOrderIsNull() {
+            addCriterion("data_order is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDataOrderIsNotNull() {
+            addCriterion("data_order is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDataOrderEqualTo(Integer value) {
+            addCriterion("data_order =", value, "dataOrder");
+            return (Criteria) this;
+        }
+
+        public Criteria andDataOrderNotEqualTo(Integer value) {
+            addCriterion("data_order <>", value, "dataOrder");
+            return (Criteria) this;
+        }
+
+        public Criteria andDataOrderGreaterThan(Integer value) {
+            addCriterion("data_order >", value, "dataOrder");
+            return (Criteria) this;
+        }
+
+        public Criteria andDataOrderGreaterThanOrEqualTo(Integer value) {
+            addCriterion("data_order >=", value, "dataOrder");
+            return (Criteria) this;
+        }
+
+        public Criteria andDataOrderLessThan(Integer value) {
+            addCriterion("data_order <", value, "dataOrder");
+            return (Criteria) this;
+        }
+
+        public Criteria andDataOrderLessThanOrEqualTo(Integer value) {
+            addCriterion("data_order <=", value, "dataOrder");
+            return (Criteria) this;
+        }
+
+        public Criteria andDataOrderIn(List<Integer> values) {
+            addCriterion("data_order in", values, "dataOrder");
+            return (Criteria) this;
+        }
+
+        public Criteria andDataOrderNotIn(List<Integer> values) {
+            addCriterion("data_order not in", values, "dataOrder");
+            return (Criteria) this;
+        }
+
+        public Criteria andDataOrderBetween(Integer value1, Integer value2) {
+            addCriterion("data_order between", value1, value2, "dataOrder");
+            return (Criteria) this;
+        }
+
+        public Criteria andDataOrderNotBetween(Integer value1, Integer value2) {
+            addCriterion("data_order not between", value1, value2, "dataOrder");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNull() {
+            addCriterion("create_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIsNotNull() {
+            addCriterion("create_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeEqualTo(Date value) {
+            addCriterion("create_time =", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotEqualTo(Date value) {
+            addCriterion("create_time <>", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThan(Date value) {
+            addCriterion("create_time >", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("create_time >=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThan(Date value) {
+            addCriterion("create_time <", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("create_time <=", value, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeIn(List<Date> values) {
+            addCriterion("create_time in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotIn(List<Date> values) {
+            addCriterion("create_time not in", values, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeBetween(Date value1, Date value2) {
+            addCriterion("create_time between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCreateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("create_time not between", value1, value2, "createTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNull() {
+            addCriterion("update_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIsNotNull() {
+            addCriterion("update_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeEqualTo(Date value) {
+            addCriterion("update_time =", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotEqualTo(Date value) {
+            addCriterion("update_time <>", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThan(Date value) {
+            addCriterion("update_time >", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("update_time >=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThan(Date value) {
+            addCriterion("update_time <", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeLessThanOrEqualTo(Date value) {
+            addCriterion("update_time <=", value, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeIn(List<Date> values) {
+            addCriterion("update_time in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotIn(List<Date> values) {
+            addCriterion("update_time not in", values, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeBetween(Date value1, Date value2) {
+            addCriterion("update_time between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andUpdateTimeNotBetween(Date value1, Date value2) {
+            addCriterion("update_time not between", value1, value2, "updateTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andMakePersonIsNull() {
+            addCriterion("make_person is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMakePersonIsNotNull() {
+            addCriterion("make_person is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMakePersonEqualTo(String value) {
+            addCriterion("make_person =", value, "makePerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andMakePersonNotEqualTo(String value) {
+            addCriterion("make_person <>", value, "makePerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andMakePersonGreaterThan(String value) {
+            addCriterion("make_person >", value, "makePerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andMakePersonGreaterThanOrEqualTo(String value) {
+            addCriterion("make_person >=", value, "makePerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andMakePersonLessThan(String value) {
+            addCriterion("make_person <", value, "makePerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andMakePersonLessThanOrEqualTo(String value) {
+            addCriterion("make_person <=", value, "makePerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andMakePersonLike(String value) {
+            addCriterion("make_person like", value, "makePerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andMakePersonNotLike(String value) {
+            addCriterion("make_person not like", value, "makePerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andMakePersonIn(List<String> values) {
+            addCriterion("make_person in", values, "makePerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andMakePersonNotIn(List<String> values) {
+            addCriterion("make_person not in", values, "makePerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andMakePersonBetween(String value1, String value2) {
+            addCriterion("make_person between", value1, value2, "makePerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andMakePersonNotBetween(String value1, String value2) {
+            addCriterion("make_person not between", value1, value2, "makePerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierIsNull() {
+            addCriterion("modifier is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierIsNotNull() {
+            addCriterion("modifier is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierEqualTo(String value) {
+            addCriterion("modifier =", value, "modifier");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierNotEqualTo(String value) {
+            addCriterion("modifier <>", value, "modifier");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierGreaterThan(String value) {
+            addCriterion("modifier >", value, "modifier");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierGreaterThanOrEqualTo(String value) {
+            addCriterion("modifier >=", value, "modifier");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierLessThan(String value) {
+            addCriterion("modifier <", value, "modifier");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierLessThanOrEqualTo(String value) {
+            addCriterion("modifier <=", value, "modifier");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierLike(String value) {
+            addCriterion("modifier like", value, "modifier");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierNotLike(String value) {
+            addCriterion("modifier not like", value, "modifier");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierIn(List<String> values) {
+            addCriterion("modifier in", values, "modifier");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierNotIn(List<String> values) {
+            addCriterion("modifier not in", values, "modifier");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierBetween(String value1, String value2) {
+            addCriterion("modifier between", value1, value2, "modifier");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierNotBetween(String value1, String value2) {
+            addCriterion("modifier not between", value1, value2, "modifier");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierTimeIsNull() {
+            addCriterion("modifier_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierTimeIsNotNull() {
+            addCriterion("modifier_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierTimeEqualTo(Date value) {
+            addCriterion("modifier_time =", value, "modifierTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierTimeNotEqualTo(Date value) {
+            addCriterion("modifier_time <>", value, "modifierTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierTimeGreaterThan(Date value) {
+            addCriterion("modifier_time >", value, "modifierTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("modifier_time >=", value, "modifierTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierTimeLessThan(Date value) {
+            addCriterion("modifier_time <", value, "modifierTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierTimeLessThanOrEqualTo(Date value) {
+            addCriterion("modifier_time <=", value, "modifierTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierTimeIn(List<Date> values) {
+            addCriterion("modifier_time in", values, "modifierTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierTimeNotIn(List<Date> values) {
+            addCriterion("modifier_time not in", values, "modifierTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierTimeBetween(Date value1, Date value2) {
+            addCriterion("modifier_time between", value1, value2, "modifierTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andModifierTimeNotBetween(Date value1, Date value2) {
+            addCriterion("modifier_time not between", value1, value2, "modifierTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andLockedIsNull() {
+            addCriterion("locked is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLockedIsNotNull() {
+            addCriterion("locked is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andLockedEqualTo(Integer value) {
+            addCriterion("locked =", value, "locked");
+            return (Criteria) this;
+        }
+
+        public Criteria andLockedNotEqualTo(Integer value) {
+            addCriterion("locked <>", value, "locked");
+            return (Criteria) this;
+        }
+
+        public Criteria andLockedGreaterThan(Integer value) {
+            addCriterion("locked >", value, "locked");
+            return (Criteria) this;
+        }
+
+        public Criteria andLockedGreaterThanOrEqualTo(Integer value) {
+            addCriterion("locked >=", value, "locked");
+            return (Criteria) this;
+        }
+
+        public Criteria andLockedLessThan(Integer value) {
+            addCriterion("locked <", value, "locked");
+            return (Criteria) this;
+        }
+
+        public Criteria andLockedLessThanOrEqualTo(Integer value) {
+            addCriterion("locked <=", value, "locked");
+            return (Criteria) this;
+        }
+
+        public Criteria andLockedIn(List<Integer> values) {
+            addCriterion("locked in", values, "locked");
+            return (Criteria) this;
+        }
+
+        public Criteria andLockedNotIn(List<Integer> values) {
+            addCriterion("locked not in", values, "locked");
+            return (Criteria) this;
+        }
+
+        public Criteria andLockedBetween(Integer value1, Integer value2) {
+            addCriterion("locked between", value1, value2, "locked");
+            return (Criteria) this;
+        }
+
+        public Criteria andLockedNotBetween(Integer value1, Integer value2) {
+            addCriterion("locked not between", value1, value2, "locked");
+            return (Criteria) this;
+        }
+
+        public Criteria andDelTagIsNull() {
+            addCriterion("del_tag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDelTagIsNotNull() {
+            addCriterion("del_tag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDelTagEqualTo(Integer value) {
+            addCriterion("del_tag =", value, "delTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDelTagNotEqualTo(Integer value) {
+            addCriterion("del_tag <>", value, "delTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDelTagGreaterThan(Integer value) {
+            addCriterion("del_tag >", value, "delTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDelTagGreaterThanOrEqualTo(Integer value) {
+            addCriterion("del_tag >=", value, "delTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDelTagLessThan(Integer value) {
+            addCriterion("del_tag <", value, "delTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDelTagLessThanOrEqualTo(Integer value) {
+            addCriterion("del_tag <=", value, "delTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDelTagIn(List<Integer> values) {
+            addCriterion("del_tag in", values, "delTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDelTagNotIn(List<Integer> values) {
+            addCriterion("del_tag not in", values, "delTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDelTagBetween(Integer value1, Integer value2) {
+            addCriterion("del_tag between", value1, value2, "delTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andDelTagNotBetween(Integer value1, Integer value2) {
+            addCriterion("del_tag not between", value1, value2, "delTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTagIsNull() {
+            addCriterion("check_tag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTagIsNotNull() {
+            addCriterion("check_tag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTagEqualTo(Integer value) {
+            addCriterion("check_tag =", value, "checkTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTagNotEqualTo(Integer value) {
+            addCriterion("check_tag <>", value, "checkTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTagGreaterThan(Integer value) {
+            addCriterion("check_tag >", value, "checkTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTagGreaterThanOrEqualTo(Integer value) {
+            addCriterion("check_tag >=", value, "checkTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTagLessThan(Integer value) {
+            addCriterion("check_tag <", value, "checkTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTagLessThanOrEqualTo(Integer value) {
+            addCriterion("check_tag <=", value, "checkTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTagIn(List<Integer> values) {
+            addCriterion("check_tag in", values, "checkTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTagNotIn(List<Integer> values) {
+            addCriterion("check_tag not in", values, "checkTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTagBetween(Integer value1, Integer value2) {
+            addCriterion("check_tag between", value1, value2, "checkTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTagNotBetween(Integer value1, Integer value2) {
+            addCriterion("check_tag not between", value1, value2, "checkTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckStatusIsNull() {
+            addCriterion("check_status is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckStatusIsNotNull() {
+            addCriterion("check_status is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckStatusEqualTo(String value) {
+            addCriterion("check_status =", value, "checkStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckStatusNotEqualTo(String value) {
+            addCriterion("check_status <>", value, "checkStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckStatusGreaterThan(String value) {
+            addCriterion("check_status >", value, "checkStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckStatusGreaterThanOrEqualTo(String value) {
+            addCriterion("check_status >=", value, "checkStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckStatusLessThan(String value) {
+            addCriterion("check_status <", value, "checkStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckStatusLessThanOrEqualTo(String value) {
+            addCriterion("check_status <=", value, "checkStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckStatusLike(String value) {
+            addCriterion("check_status like", value, "checkStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckStatusNotLike(String value) {
+            addCriterion("check_status not like", value, "checkStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckStatusIn(List<String> values) {
+            addCriterion("check_status in", values, "checkStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckStatusNotIn(List<String> values) {
+            addCriterion("check_status not in", values, "checkStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckStatusBetween(String value1, String value2) {
+            addCriterion("check_status between", value1, value2, "checkStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckStatusNotBetween(String value1, String value2) {
+            addCriterion("check_status not between", value1, value2, "checkStatus");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTimeIsNull() {
+            addCriterion("check_time is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTimeIsNotNull() {
+            addCriterion("check_time is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTimeEqualTo(Date value) {
+            addCriterion("check_time =", value, "checkTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTimeNotEqualTo(Date value) {
+            addCriterion("check_time <>", value, "checkTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTimeGreaterThan(Date value) {
+            addCriterion("check_time >", value, "checkTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTimeGreaterThanOrEqualTo(Date value) {
+            addCriterion("check_time >=", value, "checkTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTimeLessThan(Date value) {
+            addCriterion("check_time <", value, "checkTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTimeLessThanOrEqualTo(Date value) {
+            addCriterion("check_time <=", value, "checkTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTimeIn(List<Date> values) {
+            addCriterion("check_time in", values, "checkTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTimeNotIn(List<Date> values) {
+            addCriterion("check_time not in", values, "checkTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTimeBetween(Date value1, Date value2) {
+            addCriterion("check_time between", value1, value2, "checkTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckTimeNotBetween(Date value1, Date value2) {
+            addCriterion("check_time not between", value1, value2, "checkTime");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckPersonIsNull() {
+            addCriterion("check_person is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckPersonIsNotNull() {
+            addCriterion("check_person is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckPersonEqualTo(String value) {
+            addCriterion("check_person =", value, "checkPerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckPersonNotEqualTo(String value) {
+            addCriterion("check_person <>", value, "checkPerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckPersonGreaterThan(String value) {
+            addCriterion("check_person >", value, "checkPerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckPersonGreaterThanOrEqualTo(String value) {
+            addCriterion("check_person >=", value, "checkPerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckPersonLessThan(String value) {
+            addCriterion("check_person <", value, "checkPerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckPersonLessThanOrEqualTo(String value) {
+            addCriterion("check_person <=", value, "checkPerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckPersonLike(String value) {
+            addCriterion("check_person like", value, "checkPerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckPersonNotLike(String value) {
+            addCriterion("check_person not like", value, "checkPerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckPersonIn(List<String> values) {
+            addCriterion("check_person in", values, "checkPerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckPersonNotIn(List<String> values) {
+            addCriterion("check_person not in", values, "checkPerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckPersonBetween(String value1, String value2) {
+            addCriterion("check_person between", value1, value2, "checkPerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andCheckPersonNotBetween(String value1, String value2) {
+            addCriterion("check_person not between", value1, value2, "checkPerson");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrintTagIsNull() {
+            addCriterion("print_tag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrintTagIsNotNull() {
+            addCriterion("print_tag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrintTagEqualTo(Integer value) {
+            addCriterion("print_tag =", value, "printTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrintTagNotEqualTo(Integer value) {
+            addCriterion("print_tag <>", value, "printTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrintTagGreaterThan(Integer value) {
+            addCriterion("print_tag >", value, "printTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrintTagGreaterThanOrEqualTo(Integer value) {
+            addCriterion("print_tag >=", value, "printTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrintTagLessThan(Integer value) {
+            addCriterion("print_tag <", value, "printTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrintTagLessThanOrEqualTo(Integer value) {
+            addCriterion("print_tag <=", value, "printTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrintTagIn(List<Integer> values) {
+            addCriterion("print_tag in", values, "printTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrintTagNotIn(List<Integer> values) {
+            addCriterion("print_tag not in", values, "printTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrintTagBetween(Integer value1, Integer value2) {
+            addCriterion("print_tag between", value1, value2, "printTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrintTagNotBetween(Integer value1, Integer value2) {
+            addCriterion("print_tag not between", value1, value2, "printTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInvalidTagIsNull() {
+            addCriterion("invalid_tag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInvalidTagIsNotNull() {
+            addCriterion("invalid_tag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andInvalidTagEqualTo(Integer value) {
+            addCriterion("invalid_tag =", value, "invalidTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInvalidTagNotEqualTo(Integer value) {
+            addCriterion("invalid_tag <>", value, "invalidTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInvalidTagGreaterThan(Integer value) {
+            addCriterion("invalid_tag >", value, "invalidTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInvalidTagGreaterThanOrEqualTo(Integer value) {
+            addCriterion("invalid_tag >=", value, "invalidTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInvalidTagLessThan(Integer value) {
+            addCriterion("invalid_tag <", value, "invalidTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInvalidTagLessThanOrEqualTo(Integer value) {
+            addCriterion("invalid_tag <=", value, "invalidTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInvalidTagIn(List<Integer> values) {
+            addCriterion("invalid_tag in", values, "invalidTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInvalidTagNotIn(List<Integer> values) {
+            addCriterion("invalid_tag not in", values, "invalidTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInvalidTagBetween(Integer value1, Integer value2) {
+            addCriterion("invalid_tag between", value1, value2, "invalidTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andInvalidTagNotBetween(Integer value1, Integer value2) {
+            addCriterion("invalid_tag not between", value1, value2, "invalidTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuIdIsNull() {
+            addCriterion("menu_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuIdIsNotNull() {
+            addCriterion("menu_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuIdEqualTo(String value) {
+            addCriterion("menu_id =", value, "menuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuIdNotEqualTo(String value) {
+            addCriterion("menu_id <>", value, "menuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuIdGreaterThan(String value) {
+            addCriterion("menu_id >", value, "menuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuIdGreaterThanOrEqualTo(String value) {
+            addCriterion("menu_id >=", value, "menuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuIdLessThan(String value) {
+            addCriterion("menu_id <", value, "menuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuIdLessThanOrEqualTo(String value) {
+            addCriterion("menu_id <=", value, "menuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuIdLike(String value) {
+            addCriterion("menu_id like", value, "menuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuIdNotLike(String value) {
+            addCriterion("menu_id not like", value, "menuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuIdIn(List<String> values) {
+            addCriterion("menu_id in", values, "menuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuIdNotIn(List<String> values) {
+            addCriterion("menu_id not in", values, "menuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuIdBetween(String value1, String value2) {
+            addCriterion("menu_id between", value1, value2, "menuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuIdNotBetween(String value1, String value2) {
+            addCriterion("menu_id not between", value1, value2, "menuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuNameIsNull() {
+            addCriterion("menu_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuNameIsNotNull() {
+            addCriterion("menu_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuNameEqualTo(String value) {
+            addCriterion("menu_name =", value, "menuName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuNameNotEqualTo(String value) {
+            addCriterion("menu_name <>", value, "menuName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuNameGreaterThan(String value) {
+            addCriterion("menu_name >", value, "menuName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuNameGreaterThanOrEqualTo(String value) {
+            addCriterion("menu_name >=", value, "menuName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuNameLessThan(String value) {
+            addCriterion("menu_name <", value, "menuName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuNameLessThanOrEqualTo(String value) {
+            addCriterion("menu_name <=", value, "menuName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuNameLike(String value) {
+            addCriterion("menu_name like", value, "menuName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuNameNotLike(String value) {
+            addCriterion("menu_name not like", value, "menuName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuNameIn(List<String> values) {
+            addCriterion("menu_name in", values, "menuName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuNameNotIn(List<String> values) {
+            addCriterion("menu_name not in", values, "menuName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuNameBetween(String value1, String value2) {
+            addCriterion("menu_name between", value1, value2, "menuName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMenuNameNotBetween(String value1, String value2) {
+            addCriterion("menu_name not between", value1, value2, "menuName");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarksIsNull() {
+            addCriterion("remarks is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarksIsNotNull() {
+            addCriterion("remarks is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarksEqualTo(String value) {
+            addCriterion("remarks =", value, "remarks");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarksNotEqualTo(String value) {
+            addCriterion("remarks <>", value, "remarks");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarksGreaterThan(String value) {
+            addCriterion("remarks >", value, "remarks");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarksGreaterThanOrEqualTo(String value) {
+            addCriterion("remarks >=", value, "remarks");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarksLessThan(String value) {
+            addCriterion("remarks <", value, "remarks");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarksLessThanOrEqualTo(String value) {
+            addCriterion("remarks <=", value, "remarks");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarksLike(String value) {
+            addCriterion("remarks like", value, "remarks");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarksNotLike(String value) {
+            addCriterion("remarks not like", value, "remarks");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarksIn(List<String> values) {
+            addCriterion("remarks in", values, "remarks");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarksNotIn(List<String> values) {
+            addCriterion("remarks not in", values, "remarks");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarksBetween(String value1, String value2) {
+            addCriterion("remarks between", value1, value2, "remarks");
+            return (Criteria) this;
+        }
+
+        public Criteria andRemarksNotBetween(String value1, String value2) {
+            addCriterion("remarks not between", value1, value2, "remarks");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantIdIsNull() {
+            addCriterion("merchant_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantIdIsNotNull() {
+            addCriterion("merchant_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantIdEqualTo(String value) {
+            addCriterion("merchant_id =", value, "merchantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantIdNotEqualTo(String value) {
+            addCriterion("merchant_id <>", value, "merchantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantIdGreaterThan(String value) {
+            addCriterion("merchant_id >", value, "merchantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantIdGreaterThanOrEqualTo(String value) {
+            addCriterion("merchant_id >=", value, "merchantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantIdLessThan(String value) {
+            addCriterion("merchant_id <", value, "merchantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantIdLessThanOrEqualTo(String value) {
+            addCriterion("merchant_id <=", value, "merchantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantIdLike(String value) {
+            addCriterion("merchant_id like", value, "merchantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantIdNotLike(String value) {
+            addCriterion("merchant_id not like", value, "merchantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantIdIn(List<String> values) {
+            addCriterion("merchant_id in", values, "merchantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantIdNotIn(List<String> values) {
+            addCriterion("merchant_id not in", values, "merchantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantIdBetween(String value1, String value2) {
+            addCriterion("merchant_id between", value1, value2, "merchantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantIdNotBetween(String value1, String value2) {
+            addCriterion("merchant_id not between", value1, value2, "merchantId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppIdIsNull() {
+            addCriterion("app_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppIdIsNotNull() {
+            addCriterion("app_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppIdEqualTo(String value) {
+            addCriterion("app_id =", value, "appId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppIdNotEqualTo(String value) {
+            addCriterion("app_id <>", value, "appId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppIdGreaterThan(String value) {
+            addCriterion("app_id >", value, "appId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppIdGreaterThanOrEqualTo(String value) {
+            addCriterion("app_id >=", value, "appId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppIdLessThan(String value) {
+            addCriterion("app_id <", value, "appId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppIdLessThanOrEqualTo(String value) {
+            addCriterion("app_id <=", value, "appId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppIdLike(String value) {
+            addCriterion("app_id like", value, "appId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppIdNotLike(String value) {
+            addCriterion("app_id not like", value, "appId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppIdIn(List<String> values) {
+            addCriterion("app_id in", values, "appId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppIdNotIn(List<String> values) {
+            addCriterion("app_id not in", values, "appId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppIdBetween(String value1, String value2) {
+            addCriterion("app_id between", value1, value2, "appId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppIdNotBetween(String value1, String value2) {
+            addCriterion("app_id not between", value1, value2, "appId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdIsNull() {
+            addCriterion("member_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdIsNotNull() {
+            addCriterion("member_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdEqualTo(String value) {
+            addCriterion("member_id =", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdNotEqualTo(String value) {
+            addCriterion("member_id <>", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdGreaterThan(String value) {
+            addCriterion("member_id >", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdGreaterThanOrEqualTo(String value) {
+            addCriterion("member_id >=", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdLessThan(String value) {
+            addCriterion("member_id <", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdLessThanOrEqualTo(String value) {
+            addCriterion("member_id <=", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdLike(String value) {
+            addCriterion("member_id like", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdNotLike(String value) {
+            addCriterion("member_id not like", value, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdIn(List<String> values) {
+            addCriterion("member_id in", values, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdNotIn(List<String> values) {
+            addCriterion("member_id not in", values, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdBetween(String value1, String value2) {
+            addCriterion("member_id between", value1, value2, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMemberIdNotBetween(String value1, String value2) {
+            addCriterion("member_id not between", value1, value2, "memberId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAliPidIsNull() {
+            addCriterion("ali_pid is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAliPidIsNotNull() {
+            addCriterion("ali_pid is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAliPidEqualTo(String value) {
+            addCriterion("ali_pid =", value, "aliPid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAliPidNotEqualTo(String value) {
+            addCriterion("ali_pid <>", value, "aliPid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAliPidGreaterThan(String value) {
+            addCriterion("ali_pid >", value, "aliPid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAliPidGreaterThanOrEqualTo(String value) {
+            addCriterion("ali_pid >=", value, "aliPid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAliPidLessThan(String value) {
+            addCriterion("ali_pid <", value, "aliPid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAliPidLessThanOrEqualTo(String value) {
+            addCriterion("ali_pid <=", value, "aliPid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAliPidLike(String value) {
+            addCriterion("ali_pid like", value, "aliPid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAliPidNotLike(String value) {
+            addCriterion("ali_pid not like", value, "aliPid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAliPidIn(List<String> values) {
+            addCriterion("ali_pid in", values, "aliPid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAliPidNotIn(List<String> values) {
+            addCriterion("ali_pid not in", values, "aliPid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAliPidBetween(String value1, String value2) {
+            addCriterion("ali_pid between", value1, value2, "aliPid");
+            return (Criteria) this;
+        }
+
+        public Criteria andAliPidNotBetween(String value1, String value2) {
+            addCriterion("ali_pid not between", value1, value2, "aliPid");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreIdIsNull() {
+            addCriterion("store_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreIdIsNotNull() {
+            addCriterion("store_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreIdEqualTo(String value) {
+            addCriterion("store_id =", value, "storeId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreIdNotEqualTo(String value) {
+            addCriterion("store_id <>", value, "storeId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreIdGreaterThan(String value) {
+            addCriterion("store_id >", value, "storeId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreIdGreaterThanOrEqualTo(String value) {
+            addCriterion("store_id >=", value, "storeId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreIdLessThan(String value) {
+            addCriterion("store_id <", value, "storeId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreIdLessThanOrEqualTo(String value) {
+            addCriterion("store_id <=", value, "storeId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreIdLike(String value) {
+            addCriterion("store_id like", value, "storeId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreIdNotLike(String value) {
+            addCriterion("store_id not like", value, "storeId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreIdIn(List<String> values) {
+            addCriterion("store_id in", values, "storeId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreIdNotIn(List<String> values) {
+            addCriterion("store_id not in", values, "storeId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreIdBetween(String value1, String value2) {
+            addCriterion("store_id between", value1, value2, "storeId");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreIdNotBetween(String value1, String value2) {
+            addCriterion("store_id not between", value1, value2, "storeId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentIdIsNull() {
+            addCriterion("agent_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentIdIsNotNull() {
+            addCriterion("agent_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentIdEqualTo(String value) {
+            addCriterion("agent_id =", value, "agentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentIdNotEqualTo(String value) {
+            addCriterion("agent_id <>", value, "agentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentIdGreaterThan(String value) {
+            addCriterion("agent_id >", value, "agentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentIdGreaterThanOrEqualTo(String value) {
+            addCriterion("agent_id >=", value, "agentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentIdLessThan(String value) {
+            addCriterion("agent_id <", value, "agentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentIdLessThanOrEqualTo(String value) {
+            addCriterion("agent_id <=", value, "agentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentIdLike(String value) {
+            addCriterion("agent_id like", value, "agentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentIdNotLike(String value) {
+            addCriterion("agent_id not like", value, "agentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentIdIn(List<String> values) {
+            addCriterion("agent_id in", values, "agentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentIdNotIn(List<String> values) {
+            addCriterion("agent_id not in", values, "agentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentIdBetween(String value1, String value2) {
+            addCriterion("agent_id between", value1, value2, "agentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentIdNotBetween(String value1, String value2) {
+            addCriterion("agent_id not between", value1, value2, "agentId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentNameIsNull() {
+            addCriterion("agent_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentNameIsNotNull() {
+            addCriterion("agent_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentNameEqualTo(String value) {
+            addCriterion("agent_name =", value, "agentName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentNameNotEqualTo(String value) {
+            addCriterion("agent_name <>", value, "agentName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentNameGreaterThan(String value) {
+            addCriterion("agent_name >", value, "agentName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentNameGreaterThanOrEqualTo(String value) {
+            addCriterion("agent_name >=", value, "agentName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentNameLessThan(String value) {
+            addCriterion("agent_name <", value, "agentName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentNameLessThanOrEqualTo(String value) {
+            addCriterion("agent_name <=", value, "agentName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentNameLike(String value) {
+            addCriterion("agent_name like", value, "agentName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentNameNotLike(String value) {
+            addCriterion("agent_name not like", value, "agentName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentNameIn(List<String> values) {
+            addCriterion("agent_name in", values, "agentName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentNameNotIn(List<String> values) {
+            addCriterion("agent_name not in", values, "agentName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentNameBetween(String value1, String value2) {
+            addCriterion("agent_name between", value1, value2, "agentName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAgentNameNotBetween(String value1, String value2) {
+            addCriterion("agent_name not between", value1, value2, "agentName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreTypeIsNull() {
+            addCriterion("store_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreTypeIsNotNull() {
+            addCriterion("store_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreTypeEqualTo(Integer value) {
+            addCriterion("store_type =", value, "storeType");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreTypeNotEqualTo(Integer value) {
+            addCriterion("store_type <>", value, "storeType");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreTypeGreaterThan(Integer value) {
+            addCriterion("store_type >", value, "storeType");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreTypeGreaterThanOrEqualTo(Integer value) {
+            addCriterion("store_type >=", value, "storeType");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreTypeLessThan(Integer value) {
+            addCriterion("store_type <", value, "storeType");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreTypeLessThanOrEqualTo(Integer value) {
+            addCriterion("store_type <=", value, "storeType");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreTypeIn(List<Integer> values) {
+            addCriterion("store_type in", values, "storeType");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreTypeNotIn(List<Integer> values) {
+            addCriterion("store_type not in", values, "storeType");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreTypeBetween(Integer value1, Integer value2) {
+            addCriterion("store_type between", value1, value2, "storeType");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreTypeNotBetween(Integer value1, Integer value2) {
+            addCriterion("store_type not between", value1, value2, "storeType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentTypeIsNull() {
+            addCriterion("payment_type is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentTypeIsNotNull() {
+            addCriterion("payment_type is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentTypeEqualTo(Integer value) {
+            addCriterion("payment_type =", value, "paymentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentTypeNotEqualTo(Integer value) {
+            addCriterion("payment_type <>", value, "paymentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentTypeGreaterThan(Integer value) {
+            addCriterion("payment_type >", value, "paymentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentTypeGreaterThanOrEqualTo(Integer value) {
+            addCriterion("payment_type >=", value, "paymentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentTypeLessThan(Integer value) {
+            addCriterion("payment_type <", value, "paymentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentTypeLessThanOrEqualTo(Integer value) {
+            addCriterion("payment_type <=", value, "paymentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentTypeIn(List<Integer> values) {
+            addCriterion("payment_type in", values, "paymentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentTypeNotIn(List<Integer> values) {
+            addCriterion("payment_type not in", values, "paymentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentTypeBetween(Integer value1, Integer value2) {
+            addCriterion("payment_type between", value1, value2, "paymentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andPaymentTypeNotBetween(Integer value1, Integer value2) {
+            addCriterion("payment_type not between", value1, value2, "paymentType");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCodeIsNull() {
+            addCriterion("merchant_code is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCodeIsNotNull() {
+            addCriterion("merchant_code is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCodeEqualTo(String value) {
+            addCriterion("merchant_code =", value, "merchantCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCodeNotEqualTo(String value) {
+            addCriterion("merchant_code <>", value, "merchantCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCodeGreaterThan(String value) {
+            addCriterion("merchant_code >", value, "merchantCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCodeGreaterThanOrEqualTo(String value) {
+            addCriterion("merchant_code >=", value, "merchantCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCodeLessThan(String value) {
+            addCriterion("merchant_code <", value, "merchantCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCodeLessThanOrEqualTo(String value) {
+            addCriterion("merchant_code <=", value, "merchantCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCodeLike(String value) {
+            addCriterion("merchant_code like", value, "merchantCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCodeNotLike(String value) {
+            addCriterion("merchant_code not like", value, "merchantCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCodeIn(List<String> values) {
+            addCriterion("merchant_code in", values, "merchantCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCodeNotIn(List<String> values) {
+            addCriterion("merchant_code not in", values, "merchantCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCodeBetween(String value1, String value2) {
+            addCriterion("merchant_code between", value1, value2, "merchantCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCodeNotBetween(String value1, String value2) {
+            addCriterion("merchant_code not between", value1, value2, "merchantCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCounterCodeIsNull() {
+            addCriterion("merchant_counter_code is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCounterCodeIsNotNull() {
+            addCriterion("merchant_counter_code is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCounterCodeEqualTo(String value) {
+            addCriterion("merchant_counter_code =", value, "merchantCounterCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCounterCodeNotEqualTo(String value) {
+            addCriterion("merchant_counter_code <>", value, "merchantCounterCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCounterCodeGreaterThan(String value) {
+            addCriterion("merchant_counter_code >", value, "merchantCounterCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCounterCodeGreaterThanOrEqualTo(String value) {
+            addCriterion("merchant_counter_code >=", value, "merchantCounterCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCounterCodeLessThan(String value) {
+            addCriterion("merchant_counter_code <", value, "merchantCounterCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCounterCodeLessThanOrEqualTo(String value) {
+            addCriterion("merchant_counter_code <=", value, "merchantCounterCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCounterCodeLike(String value) {
+            addCriterion("merchant_counter_code like", value, "merchantCounterCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCounterCodeNotLike(String value) {
+            addCriterion("merchant_counter_code not like", value, "merchantCounterCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCounterCodeIn(List<String> values) {
+            addCriterion("merchant_counter_code in", values, "merchantCounterCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCounterCodeNotIn(List<String> values) {
+            addCriterion("merchant_counter_code not in", values, "merchantCounterCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCounterCodeBetween(String value1, String value2) {
+            addCriterion("merchant_counter_code between", value1, value2, "merchantCounterCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantCounterCodeNotBetween(String value1, String value2) {
+            addCriterion("merchant_counter_code not between", value1, value2, "merchantCounterCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andTheBranchCodeIsNull() {
+            addCriterion("the_branch_code is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTheBranchCodeIsNotNull() {
+            addCriterion("the_branch_code is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andTheBranchCodeEqualTo(String value) {
+            addCriterion("the_branch_code =", value, "theBranchCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andTheBranchCodeNotEqualTo(String value) {
+            addCriterion("the_branch_code <>", value, "theBranchCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andTheBranchCodeGreaterThan(String value) {
+            addCriterion("the_branch_code >", value, "theBranchCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andTheBranchCodeGreaterThanOrEqualTo(String value) {
+            addCriterion("the_branch_code >=", value, "theBranchCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andTheBranchCodeLessThan(String value) {
+            addCriterion("the_branch_code <", value, "theBranchCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andTheBranchCodeLessThanOrEqualTo(String value) {
+            addCriterion("the_branch_code <=", value, "theBranchCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andTheBranchCodeLike(String value) {
+            addCriterion("the_branch_code like", value, "theBranchCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andTheBranchCodeNotLike(String value) {
+            addCriterion("the_branch_code not like", value, "theBranchCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andTheBranchCodeIn(List<String> values) {
+            addCriterion("the_branch_code in", values, "theBranchCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andTheBranchCodeNotIn(List<String> values) {
+            addCriterion("the_branch_code not in", values, "theBranchCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andTheBranchCodeBetween(String value1, String value2) {
+            addCriterion("the_branch_code between", value1, value2, "theBranchCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andTheBranchCodeNotBetween(String value1, String value2) {
+            addCriterion("the_branch_code not between", value1, value2, "theBranchCode");
+            return (Criteria) this;
+        }
+
+        public Criteria andSysIdIsNull() {
+            addCriterion("sys_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSysIdIsNotNull() {
+            addCriterion("sys_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andSysIdEqualTo(String value) {
+            addCriterion("sys_id =", value, "sysId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSysIdNotEqualTo(String value) {
+            addCriterion("sys_id <>", value, "sysId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSysIdGreaterThan(String value) {
+            addCriterion("sys_id >", value, "sysId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSysIdGreaterThanOrEqualTo(String value) {
+            addCriterion("sys_id >=", value, "sysId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSysIdLessThan(String value) {
+            addCriterion("sys_id <", value, "sysId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSysIdLessThanOrEqualTo(String value) {
+            addCriterion("sys_id <=", value, "sysId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSysIdLike(String value) {
+            addCriterion("sys_id like", value, "sysId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSysIdNotLike(String value) {
+            addCriterion("sys_id not like", value, "sysId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSysIdIn(List<String> values) {
+            addCriterion("sys_id in", values, "sysId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSysIdNotIn(List<String> values) {
+            addCriterion("sys_id not in", values, "sysId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSysIdBetween(String value1, String value2) {
+            addCriterion("sys_id between", value1, value2, "sysId");
+            return (Criteria) this;
+        }
+
+        public Criteria andSysIdNotBetween(String value1, String value2) {
+            addCriterion("sys_id not between", value1, value2, "sysId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHuifuIdIsNull() {
+            addCriterion("huifu_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andHuifuIdIsNotNull() {
+            addCriterion("huifu_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andHuifuIdEqualTo(String value) {
+            addCriterion("huifu_id =", value, "huifuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHuifuIdNotEqualTo(String value) {
+            addCriterion("huifu_id <>", value, "huifuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHuifuIdGreaterThan(String value) {
+            addCriterion("huifu_id >", value, "huifuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHuifuIdGreaterThanOrEqualTo(String value) {
+            addCriterion("huifu_id >=", value, "huifuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHuifuIdLessThan(String value) {
+            addCriterion("huifu_id <", value, "huifuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHuifuIdLessThanOrEqualTo(String value) {
+            addCriterion("huifu_id <=", value, "huifuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHuifuIdLike(String value) {
+            addCriterion("huifu_id like", value, "huifuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHuifuIdNotLike(String value) {
+            addCriterion("huifu_id not like", value, "huifuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHuifuIdIn(List<String> values) {
+            addCriterion("huifu_id in", values, "huifuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHuifuIdNotIn(List<String> values) {
+            addCriterion("huifu_id not in", values, "huifuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHuifuIdBetween(String value1, String value2) {
+            addCriterion("huifu_id between", value1, value2, "huifuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andHuifuIdNotBetween(String value1, String value2) {
+            addCriterion("huifu_id not between", value1, value2, "huifuId");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantNameIsNull() {
+            addCriterion("merchant_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantNameIsNotNull() {
+            addCriterion("merchant_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantNameEqualTo(String value) {
+            addCriterion("merchant_name =", value, "merchantName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantNameNotEqualTo(String value) {
+            addCriterion("merchant_name <>", value, "merchantName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantNameGreaterThan(String value) {
+            addCriterion("merchant_name >", value, "merchantName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantNameGreaterThanOrEqualTo(String value) {
+            addCriterion("merchant_name >=", value, "merchantName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantNameLessThan(String value) {
+            addCriterion("merchant_name <", value, "merchantName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantNameLessThanOrEqualTo(String value) {
+            addCriterion("merchant_name <=", value, "merchantName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantNameLike(String value) {
+            addCriterion("merchant_name like", value, "merchantName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantNameNotLike(String value) {
+            addCriterion("merchant_name not like", value, "merchantName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantNameIn(List<String> values) {
+            addCriterion("merchant_name in", values, "merchantName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantNameNotIn(List<String> values) {
+            addCriterion("merchant_name not in", values, "merchantName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantNameBetween(String value1, String value2) {
+            addCriterion("merchant_name between", value1, value2, "merchantName");
+            return (Criteria) this;
+        }
+
+        public Criteria andMerchantNameNotBetween(String value1, String value2) {
+            addCriterion("merchant_name not between", value1, value2, "merchantName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreNameIsNull() {
+            addCriterion("store_name is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreNameIsNotNull() {
+            addCriterion("store_name is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreNameEqualTo(String value) {
+            addCriterion("store_name =", value, "storeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreNameNotEqualTo(String value) {
+            addCriterion("store_name <>", value, "storeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreNameGreaterThan(String value) {
+            addCriterion("store_name >", value, "storeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreNameGreaterThanOrEqualTo(String value) {
+            addCriterion("store_name >=", value, "storeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreNameLessThan(String value) {
+            addCriterion("store_name <", value, "storeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreNameLessThanOrEqualTo(String value) {
+            addCriterion("store_name <=", value, "storeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreNameLike(String value) {
+            addCriterion("store_name like", value, "storeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreNameNotLike(String value) {
+            addCriterion("store_name not like", value, "storeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreNameIn(List<String> values) {
+            addCriterion("store_name in", values, "storeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreNameNotIn(List<String> values) {
+            addCriterion("store_name not in", values, "storeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreNameBetween(String value1, String value2) {
+            addCriterion("store_name between", value1, value2, "storeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andStoreNameNotBetween(String value1, String value2) {
+            addCriterion("store_name not between", value1, value2, "storeName");
+            return (Criteria) this;
+        }
+
+        public Criteria andAvailableTagIsNull() {
+            addCriterion("available_tag is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAvailableTagIsNotNull() {
+            addCriterion("available_tag is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAvailableTagEqualTo(Integer value) {
+            addCriterion("available_tag =", value, "availableTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAvailableTagNotEqualTo(Integer value) {
+            addCriterion("available_tag <>", value, "availableTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAvailableTagGreaterThan(Integer value) {
+            addCriterion("available_tag >", value, "availableTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAvailableTagGreaterThanOrEqualTo(Integer value) {
+            addCriterion("available_tag >=", value, "availableTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAvailableTagLessThan(Integer value) {
+            addCriterion("available_tag <", value, "availableTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAvailableTagLessThanOrEqualTo(Integer value) {
+            addCriterion("available_tag <=", value, "availableTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAvailableTagIn(List<Integer> values) {
+            addCriterion("available_tag in", values, "availableTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAvailableTagNotIn(List<Integer> values) {
+            addCriterion("available_tag not in", values, "availableTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAvailableTagBetween(Integer value1, Integer value2) {
+            addCriterion("available_tag between", value1, value2, "availableTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andAvailableTagNotBetween(Integer value1, Integer value2) {
+            addCriterion("available_tag not between", value1, value2, "availableTag");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrivateKeyDougongIsNull() {
+            addCriterion("private_key_dougong is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrivateKeyDougongIsNotNull() {
+            addCriterion("private_key_dougong is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrivateKeyDougongEqualTo(String value) {
+            addCriterion("private_key_dougong =", value, "privateKeyDougong");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrivateKeyDougongNotEqualTo(String value) {
+            addCriterion("private_key_dougong <>", value, "privateKeyDougong");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrivateKeyDougongGreaterThan(String value) {
+            addCriterion("private_key_dougong >", value, "privateKeyDougong");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrivateKeyDougongGreaterThanOrEqualTo(String value) {
+            addCriterion("private_key_dougong >=", value, "privateKeyDougong");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrivateKeyDougongLessThan(String value) {
+            addCriterion("private_key_dougong <", value, "privateKeyDougong");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrivateKeyDougongLessThanOrEqualTo(String value) {
+            addCriterion("private_key_dougong <=", value, "privateKeyDougong");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrivateKeyDougongLike(String value) {
+            addCriterion("private_key_dougong like", value, "privateKeyDougong");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrivateKeyDougongNotLike(String value) {
+            addCriterion("private_key_dougong not like", value, "privateKeyDougong");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrivateKeyDougongIn(List<String> values) {
+            addCriterion("private_key_dougong in", values, "privateKeyDougong");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrivateKeyDougongNotIn(List<String> values) {
+            addCriterion("private_key_dougong not in", values, "privateKeyDougong");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrivateKeyDougongBetween(String value1, String value2) {
+            addCriterion("private_key_dougong between", value1, value2, "privateKeyDougong");
+            return (Criteria) this;
+        }
+
+        public Criteria andPrivateKeyDougongNotBetween(String value1, String value2) {
+            addCriterion("private_key_dougong not between", value1, value2, "privateKeyDougong");
+            return (Criteria) this;
+        }
+
+        public Criteria andPublicKeyHuifuIsNull() {
+            addCriterion("public_key_huifu is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPublicKeyHuifuIsNotNull() {
+            addCriterion("public_key_huifu is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPublicKeyHuifuEqualTo(String value) {
+            addCriterion("public_key_huifu =", value, "publicKeyHuifu");
+            return (Criteria) this;
+        }
+
+        public Criteria andPublicKeyHuifuNotEqualTo(String value) {
+            addCriterion("public_key_huifu <>", value, "publicKeyHuifu");
+            return (Criteria) this;
+        }
+
+        public Criteria andPublicKeyHuifuGreaterThan(String value) {
+            addCriterion("public_key_huifu >", value, "publicKeyHuifu");
+            return (Criteria) this;
+        }
+
+        public Criteria andPublicKeyHuifuGreaterThanOrEqualTo(String value) {
+            addCriterion("public_key_huifu >=", value, "publicKeyHuifu");
+            return (Criteria) this;
+        }
+
+        public Criteria andPublicKeyHuifuLessThan(String value) {
+            addCriterion("public_key_huifu <", value, "publicKeyHuifu");
+            return (Criteria) this;
+        }
+
+        public Criteria andPublicKeyHuifuLessThanOrEqualTo(String value) {
+            addCriterion("public_key_huifu <=", value, "publicKeyHuifu");
+            return (Criteria) this;
+        }
+
+        public Criteria andPublicKeyHuifuLike(String value) {
+            addCriterion("public_key_huifu like", value, "publicKeyHuifu");
+            return (Criteria) this;
+        }
+
+        public Criteria andPublicKeyHuifuNotLike(String value) {
+            addCriterion("public_key_huifu not like", value, "publicKeyHuifu");
+            return (Criteria) this;
+        }
+
+        public Criteria andPublicKeyHuifuIn(List<String> values) {
+            addCriterion("public_key_huifu in", values, "publicKeyHuifu");
+            return (Criteria) this;
+        }
+
+        public Criteria andPublicKeyHuifuNotIn(List<String> values) {
+            addCriterion("public_key_huifu not in", values, "publicKeyHuifu");
+            return (Criteria) this;
+        }
+
+        public Criteria andPublicKeyHuifuBetween(String value1, String value2) {
+            addCriterion("public_key_huifu between", value1, value2, "publicKeyHuifu");
+            return (Criteria) this;
+        }
+
+        public Criteria andPublicKeyHuifuNotBetween(String value1, String value2) {
+            addCriterion("public_key_huifu not between", value1, value2, "publicKeyHuifu");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletIdIsNull() {
+            addCriterion("applet_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletIdIsNotNull() {
+            addCriterion("applet_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletIdEqualTo(String value) {
+            addCriterion("applet_id =", value, "appletId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletIdNotEqualTo(String value) {
+            addCriterion("applet_id <>", value, "appletId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletIdGreaterThan(String value) {
+            addCriterion("applet_id >", value, "appletId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletIdGreaterThanOrEqualTo(String value) {
+            addCriterion("applet_id >=", value, "appletId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletIdLessThan(String value) {
+            addCriterion("applet_id <", value, "appletId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletIdLessThanOrEqualTo(String value) {
+            addCriterion("applet_id <=", value, "appletId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletIdLike(String value) {
+            addCriterion("applet_id like", value, "appletId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletIdNotLike(String value) {
+            addCriterion("applet_id not like", value, "appletId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletIdIn(List<String> values) {
+            addCriterion("applet_id in", values, "appletId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletIdNotIn(List<String> values) {
+            addCriterion("applet_id not in", values, "appletId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletIdBetween(String value1, String value2) {
+            addCriterion("applet_id between", value1, value2, "appletId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletIdNotBetween(String value1, String value2) {
+            addCriterion("applet_id not between", value1, value2, "appletId");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletSecretIsNull() {
+            addCriterion("applet_secret is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletSecretIsNotNull() {
+            addCriterion("applet_secret is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletSecretEqualTo(String value) {
+            addCriterion("applet_secret =", value, "appletSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletSecretNotEqualTo(String value) {
+            addCriterion("applet_secret <>", value, "appletSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletSecretGreaterThan(String value) {
+            addCriterion("applet_secret >", value, "appletSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletSecretGreaterThanOrEqualTo(String value) {
+            addCriterion("applet_secret >=", value, "appletSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletSecretLessThan(String value) {
+            addCriterion("applet_secret <", value, "appletSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletSecretLessThanOrEqualTo(String value) {
+            addCriterion("applet_secret <=", value, "appletSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletSecretLike(String value) {
+            addCriterion("applet_secret like", value, "appletSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletSecretNotLike(String value) {
+            addCriterion("applet_secret not like", value, "appletSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletSecretIn(List<String> values) {
+            addCriterion("applet_secret in", values, "appletSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletSecretNotIn(List<String> values) {
+            addCriterion("applet_secret not in", values, "appletSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletSecretBetween(String value1, String value2) {
+            addCriterion("applet_secret between", value1, value2, "appletSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andAppletSecretNotBetween(String value1, String value2) {
+            addCriterion("applet_secret not between", value1, value2, "appletSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andWechatSecretIsNull() {
+            addCriterion("wechat_secret is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWechatSecretIsNotNull() {
+            addCriterion("wechat_secret is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWechatSecretEqualTo(String value) {
+            addCriterion("wechat_secret =", value, "wechatSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andWechatSecretNotEqualTo(String value) {
+            addCriterion("wechat_secret <>", value, "wechatSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andWechatSecretGreaterThan(String value) {
+            addCriterion("wechat_secret >", value, "wechatSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andWechatSecretGreaterThanOrEqualTo(String value) {
+            addCriterion("wechat_secret >=", value, "wechatSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andWechatSecretLessThan(String value) {
+            addCriterion("wechat_secret <", value, "wechatSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andWechatSecretLessThanOrEqualTo(String value) {
+            addCriterion("wechat_secret <=", value, "wechatSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andWechatSecretLike(String value) {
+            addCriterion("wechat_secret like", value, "wechatSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andWechatSecretNotLike(String value) {
+            addCriterion("wechat_secret not like", value, "wechatSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andWechatSecretIn(List<String> values) {
+            addCriterion("wechat_secret in", values, "wechatSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andWechatSecretNotIn(List<String> values) {
+            addCriterion("wechat_secret not in", values, "wechatSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andWechatSecretBetween(String value1, String value2) {
+            addCriterion("wechat_secret between", value1, value2, "wechatSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andWechatSecretNotBetween(String value1, String value2) {
+            addCriterion("wechat_secret not between", value1, value2, "wechatSecret");
+            return (Criteria) this;
+        }
+
+        public Criteria andDougongProductIdIsNull() {
+            addCriterion("dougong_product_id is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDougongProductIdIsNotNull() {
+            addCriterion("dougong_product_id is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andDougongProductIdEqualTo(String value) {
+            addCriterion("dougong_product_id =", value, "dougongProductId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDougongProductIdNotEqualTo(String value) {
+            addCriterion("dougong_product_id <>", value, "dougongProductId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDougongProductIdGreaterThan(String value) {
+            addCriterion("dougong_product_id >", value, "dougongProductId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDougongProductIdGreaterThanOrEqualTo(String value) {
+            addCriterion("dougong_product_id >=", value, "dougongProductId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDougongProductIdLessThan(String value) {
+            addCriterion("dougong_product_id <", value, "dougongProductId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDougongProductIdLessThanOrEqualTo(String value) {
+            addCriterion("dougong_product_id <=", value, "dougongProductId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDougongProductIdLike(String value) {
+            addCriterion("dougong_product_id like", value, "dougongProductId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDougongProductIdNotLike(String value) {
+            addCriterion("dougong_product_id not like", value, "dougongProductId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDougongProductIdIn(List<String> values) {
+            addCriterion("dougong_product_id in", values, "dougongProductId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDougongProductIdNotIn(List<String> values) {
+            addCriterion("dougong_product_id not in", values, "dougongProductId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDougongProductIdBetween(String value1, String value2) {
+            addCriterion("dougong_product_id between", value1, value2, "dougongProductId");
+            return (Criteria) this;
+        }
+
+        public Criteria andDougongProductIdNotBetween(String value1, String value2) {
+            addCriterion("dougong_product_id not between", value1, value2, "dougongProductId");
+            return (Criteria) this;
+        }
+    }
+
+    public static class Criteria extends GeneratedCriteria {
+        protected Criteria() {
+            super();
+        }
+    }
+
+    public static class Criterion {
+        private String condition;
+
+        private Object value;
+
+        private Object secondValue;
+
+        private boolean noValue;
+
+        private boolean singleValue;
+
+        private boolean betweenValue;
+
+        private boolean listValue;
+
+        private String typeHandler;
+
+        public String getCondition() {
+            return condition;
+        }
+
+        public Object getValue() {
+            return value;
+        }
+
+        public Object getSecondValue() {
+            return secondValue;
+        }
+
+        public boolean isNoValue() {
+            return noValue;
+        }
+
+        public boolean isSingleValue() {
+            return singleValue;
+        }
+
+        public boolean isBetweenValue() {
+            return betweenValue;
+        }
+
+        public boolean isListValue() {
+            return listValue;
+        }
+
+        public String getTypeHandler() {
+            return typeHandler;
+        }
+
+        protected Criterion(String condition) {
+            super();
+            this.condition = condition;
+            this.typeHandler = null;
+            this.noValue = true;
+        }
+
+        protected Criterion(String condition, Object value, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.typeHandler = typeHandler;
+            if (value instanceof List<?>) {
+                this.listValue = true;
+            } else {
+                this.singleValue = true;
+            }
+        }
+
+        protected Criterion(String condition, Object value) {
+            this(condition, value, null);
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
+            super();
+            this.condition = condition;
+            this.value = value;
+            this.secondValue = secondValue;
+            this.typeHandler = typeHandler;
+            this.betweenValue = true;
+        }
+
+        protected Criterion(String condition, Object value, Object secondValue) {
+            this(condition, value, secondValue, null);
+        }
+    }
+}

+ 13 - 0
mp-service/src/main/java/com/qs/mp/pay/mapper/DivisionLogMapper.java

@@ -0,0 +1,13 @@
+package com.qs.mp.pay.mapper;
+
+import com.qs.mp.pay.domain.DivisionLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @auther quanshu
+ * @create 2023-03-27 14:24:26
+ * @describe 分账记录表mapper类
+ */
+public interface DivisionLogMapper extends BaseMapper<DivisionLog> {
+
+}

+ 33 - 0
mp-service/src/main/java/com/qs/mp/pay/mapper/PaymentConfigMapper.java

@@ -0,0 +1,33 @@
+package com.qs.mp.pay.mapper;
+
+
+import com.qs.mp.pay.domain.PaymentConfig;
+import com.qs.mp.pay.domain.PaymentConfigExample;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface PaymentConfigMapper {
+    long countByExample(PaymentConfigExample example);
+
+    int deleteByExample(PaymentConfigExample example);
+
+    int deleteByPrimaryKey(String id);
+
+    int insert(PaymentConfig record);
+
+    int insertSelective(PaymentConfig record);
+
+    List<PaymentConfig> selectByExample(PaymentConfigExample example);
+
+    PaymentConfig selectByPrimaryKey(String id);
+    String selectByHostName(String hostName);
+
+    int updateByExampleSelective(@Param("record") PaymentConfig record, @Param("example") PaymentConfigExample example);
+
+    int updateByExample(@Param("record") PaymentConfig record, @Param("example") PaymentConfigExample example);
+
+    int updateByPrimaryKeySelective(PaymentConfig record);
+
+    int updateByPrimaryKey(PaymentConfig record);
+}

+ 16 - 0
mp-service/src/main/java/com/qs/mp/pay/service/IDivisionLogService.java

@@ -0,0 +1,16 @@
+package com.qs.mp.pay.service;
+
+import com.qs.mp.pay.domain.DivisionLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 分账记录表 服务类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2023-03-27
+ */
+public interface IDivisionLogService extends IService<DivisionLog> {
+
+}

+ 4 - 0
mp-service/src/main/java/com/qs/mp/pay/service/IPayOrderService.java

@@ -3,6 +3,8 @@ package com.qs.mp.pay.service;
 import com.qs.mp.pay.domain.PayOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.Map;
+
 /**
  * <p>
  * 支付订单表 服务类
@@ -13,4 +15,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IPayOrderService extends IService<PayOrder> {
 
+
+    Map<String, Object> dougongPaySuccessCallBack(PayOrder payOrder);
 }

+ 44 - 0
mp-service/src/main/java/com/qs/mp/pay/service/IWalletService.java

@@ -2,6 +2,7 @@ package com.qs.mp.pay.service;
 
 import com.alibaba.fastjson.JSONObject;
 import com.qs.mp.common.enums.BizTypeEnum;
+import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.pay.domain.PayOrder;
 
 /**
@@ -11,6 +12,18 @@ import com.qs.mp.pay.domain.PayOrder;
  */
 public interface IWalletService {
 
+
+  /**
+   * 银盛h5支付
+   * @param bizType
+   * @param bizId
+   * @param money
+   * @param orderRemark
+   * @return
+   */
+  JSONObject h5Pay(BizTypeEnum bizType, String bizId, int money, String orderRemark);
+
+
   /**
    * 支付宝直连支付
    * @param bizType
@@ -49,6 +62,30 @@ public interface IWalletService {
   JSONObject pay(BizTypeEnum bizType, String bizId, String openId, int money,
       String orderRemark, Integer appSource);
 
+  /**
+   * 斗拱支付宝订单支付
+   * @param bizType
+   * @param bizId
+   * @param openId
+   * @param money
+   * @param orderRemark
+   * @return
+   */
+  JSONObject dgAliPay(BizTypeEnum bizType, String bizId, String openId, int money,
+                          String orderRemark, String clientType, Integer appSource) throws ServiceException;
+
+  /**
+   * 斗拱微信订单支付
+   * @param bizType
+   * @param bizId
+   * @param openId
+   * @param money
+   * @param orderRemark
+   * @param appSource
+   * @return
+   */
+  JSONObject dgWxPay(BizTypeEnum bizType, String bizId, String openId, int money,
+                 String orderRemark, Integer appSource, String clientType) throws ServiceException;
 
   /**
    * 订单退款
@@ -59,6 +96,13 @@ public interface IWalletService {
    */
   boolean refund(String bizId, Integer refundAmount, String remark);
 
+  /**
+   * 银盛提现
+   * @param bizId
+   * @return
+   */
+  boolean withdrawal(String bizId);
+
 
   /**
    *

+ 20 - 0
mp-service/src/main/java/com/qs/mp/pay/service/impl/DivisionLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qs.mp.pay.service.impl;
+
+import com.qs.mp.pay.domain.DivisionLog;
+import com.qs.mp.pay.mapper.DivisionLogMapper;
+import com.qs.mp.pay.service.IDivisionLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 分账记录表 服务实现类
+ * </p>
+ *
+ * @author quanshu
+ * @since 2023-03-27
+ */
+@Service
+public class DivisionLogServiceImpl extends ServiceImpl<DivisionLogMapper, DivisionLog> implements IDivisionLogService {
+
+}

+ 167 - 0
mp-service/src/main/java/com/qs/mp/pay/service/impl/DougongPayApi.java

@@ -0,0 +1,167 @@
+package com.qs.mp.pay.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Maps;
+import com.huifu.bspay.sdk.opps.client.BasePayClient;
+import com.huifu.bspay.sdk.opps.core.BasePay;
+import com.huifu.bspay.sdk.opps.core.config.MerConfig;
+import com.huifu.bspay.sdk.opps.core.request.*;
+import com.huifu.bspay.sdk.opps.core.utils.DateTools;
+import com.huifu.bspay.sdk.opps.core.utils.SequenceTools;
+import com.qs.mp.common.constant.Constants;
+import com.qs.mp.common.utils.KeyGenUtil;
+import com.qs.mp.common.utils.LogUtil;
+import com.qs.mp.pay.domain.DougongPayRequestParam;
+import com.qs.mp.pay.domain.PaymentConfig;
+import com.qs.mp.pay.domain.PaymentConfigExample;
+import com.qs.mp.pay.mapper.PaymentConfigMapper;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import com.qs.mp.common.exception.ServiceException;
+
+/**
+ * 商家的微信支付
+ */
+@Component
+public class DougongPayApi {
+    private static final Logger log = LoggerFactory.getLogger(DougongPayApi.class);
+    private static final String onlineEnvironment = "dev,prd,ali";
+    @Value("${pay.dgPay.dougongMiniNoticeUrl}")
+    private String dougongMiniNoticeUrl;
+    @Value("${pay.dgPay.dougongMiniRefundNoticeUrl}")
+    private String dougongMiniRefundNoticeUrl;
+    @Value("${pay.dgPay.dougongMerchantSubmitsBackPageUrl}")
+    private String dougongMerchantSubmitsBackPageUrl;
+    @Value("${pay.dgPay.dougongMerchantSubmitsAsyncReceiveUrl}")
+    private String dougongMerchantSubmitsAsyncReceiveUrl;
+    private static final String DOUGONG_SYS_ID_FENGYI = "6666000137086944";
+
+    @Resource
+    private PaymentConfigMapper paymentConfigMapper;
+
+    public List<PaymentConfig> getAvailablePaymentConfigList(){
+        PaymentConfigExample paymentConfigExample = new PaymentConfigExample();
+        PaymentConfigExample.Criteria criteria = paymentConfigExample.createCriteria();
+        criteria.andDelTagEqualTo(0);
+        criteria.andAvailableTagEqualTo(1);
+        return this.paymentConfigMapper.selectByExample(paymentConfigExample);
+    }
+
+    public Map<String, String> unifiedOrderDougong(DougongPayRequestParam dougongPayRequestParam, String tradeType, PaymentConfig paymentConfig) throws ServiceException{
+        //检测必填参数
+        if (StringUtils.isEmpty(dougongPayRequestParam.getTradesOrderId())) {
+            throw new ServiceException("缺少统一支付接口必填参数tradesOrderId!");
+        } else if (Objects.isNull(dougongPayRequestParam.getTotalFee())) {
+            throw new ServiceException("缺少统一支付接口必填参数total_fee!");
+        }
+
+        //关联参数
+        if ("JSAPI".equals(dougongPayRequestParam.getTradeType()) && (StringUtils.isEmpty(dougongPayRequestParam.getOpenid()) && StringUtils.isEmpty(dougongPayRequestParam.getSubOpenid()))) {
+            throw new ServiceException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!");
+        }
+        if ("NATIVE".equals(dougongPayRequestParam.getTradeType()) && StringUtils.isEmpty(dougongPayRequestParam.getProductId())) {
+            throw new ServiceException("统一支付接口中,缺少必填参数product_id!trade_type为NATIVE时,product_id为必填参数!");
+        }
+        String orderFee = BigDecimal.valueOf(dougongPayRequestParam.getTotalFee()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP).toPlainString();
+        log.info("unifiedOrderDougong--orderFee::{},totalFee:{}",orderFee,dougongPayRequestParam.getTotalFee());
+        /**
+         * T_JSAPI: 微信公众号
+         * T_MINIAPP: 微信小程序
+         * A_JSAPI: 支付宝JS
+         * A_NATIVE: 支付宝正扫
+         * U_NATIVE: 银联正扫
+         * U_JSAPI: 银联JS
+         * D_NATIVE: 数字人民币正扫
+         */
+        log.info("dougong pay jspay api request:{}",dougongPayRequestParam.getTradesOrderId());
+//        List<PaymentConfig> paymentConfigList = getAvailablePaymentConfigList();
+//        PaymentConfig paymentConfig = CollectionUtil.isNotEmpty(paymentConfigList) ? RandomUtil.randomEle(paymentConfigList) : null;
+        long huifupayStart = System.currentTimeMillis();
+        String sysId = Objects.nonNull(paymentConfig) ? paymentConfig.getSysId() : "";
+        String huifuId = Objects.nonNull(paymentConfig) ? paymentConfig.getHuifuId() : "";
+        log.info("unifiedOrderDougong--sysId:{},huifuId:{}",sysId,huifuId);
+        BasePay.debug = false;
+        BasePay.prodMode = BasePay.MODE_PROD;
+        MerConfig merConfig = new MerConfig();
+        log.info("斗拱配置参数3:-------------------------------》" + JSONUtil.toJsonStr(paymentConfig));
+        merConfig.setProcutId(Objects.nonNull(paymentConfig) ? paymentConfig.getDougongProductId() : "");
+        merConfig.setSysId(sysId);
+        merConfig.setRsaPrivateKey(Objects.nonNull(paymentConfig) ? paymentConfig.getPrivateKeyDougong() : "");
+        merConfig.setRsaPublicKey(Objects.nonNull(paymentConfig) ? paymentConfig.getPublicKeyHuifu() : "");
+        log.info("斗拱支付参数:-------------------------------》"+JSONUtil.toJsonStr(merConfig));
+        Map<String, Object> result = null;
+        try{
+            log.info("Dougong-pay-initWithMerConfig0");
+            BasePay.initWithMerConfig(merConfig);
+            log.info("Dougong-pay-initWithMerConfig1");
+            V2TradePaymentJspayRequest request = new V2TradePaymentJspayRequest();
+            request.setReqDate(DateTools.getCurrentDateYYYYMMDD());
+            request.setReqSeqId(SequenceTools.getReqSeqId32());
+            request.setHuifuId(huifuId);
+            request.setTradeType(tradeType);
+            log.info("unifiedOrderDougong--transAmt::{}",orderFee);
+            request.setTransAmt(orderFee);
+            JSONObject wxData = new JSONObject();
+            JSONObject aliPayData = new JSONObject();
+
+            wxData.put("openid",dougongPayRequestParam.getOpenid());
+            wxData.put("sub_openid",dougongPayRequestParam.getSubOpenid());
+//            wxData.put("sub_appid",wxRequestParam.getSubAppid());
+            wxData.put("sub_appid",dougongPayRequestParam.getAppid());
+
+            log.info("ali-buyer_id::{}",dougongPayRequestParam.getOpenid());
+            aliPayData.put("buyer_id",dougongPayRequestParam.getOpenid());
+
+            request.setGoodsDesc("ql-goods-" + KeyGenUtil.newKey());
+            Map<String, Object> extendInfoMap = Maps.newHashMap();
+
+            log.info("unifiedOrderDougong--notifyUrl::{},payStyle::{}",dougongMiniNoticeUrl,dougongPayRequestParam.getPayStyle());
+            log.info("回调地址---------------》{}",dougongMiniNoticeUrl);
+            extendInfoMap.put("notify_url",this.dougongMiniNoticeUrl);
+            if(Constants.DOUGONG_TRADE_TYPE_MINIAPP.equals(tradeType)){
+                extendInfoMap.put("wx_data",wxData.toString());
+            }else if(Constants.DOUGONG_TRADE_TYPE_ALINATIVE.equals(tradeType)){
+                extendInfoMap.put("alipay_data",aliPayData.toString());
+            }
+
+            extendInfoMap.put("remark","--");
+            extendInfoMap.put("goods_desc","门店消费");
+            request.setExtendInfo(extendInfoMap);
+            request.setReqSeqId(dougongPayRequestParam.getHuifuPayId());
+
+            log.info("Dougong-pay-request-params::{}",JSONUtil.toJsonStr(request));
+            result = BasePayClient.request(request,false);
+            log.info("微信小程序-斗拱扫台牌交易返回报文:{},请求耗时:{},tradesId:{},payStyle:{}",result,(System.currentTimeMillis() - huifupayStart),dougongPayRequestParam.getTradesOrderId(),dougongPayRequestParam.getPayStyle());
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+        log.info("微信小程序-斗拱扫台牌交易返回报文1:{}",result);
+        Map<String, String> payInfo = Maps.newHashMap();
+
+        if(Constants.DOUGONG_TRADE_TYPE_MINIAPP.equals(tradeType)){
+            payInfo.put("payInfo", result.get("pay_info").toString());
+            payInfo.put("respCode",result.get("resp_code").toString());
+            log.info("dougong pay info-wx:{}", payInfo);
+        }else if(Constants.DOUGONG_TRADE_TYPE_ALINATIVE.equals(tradeType)){
+            payInfo.put("payInfo", result.get("qr_code").toString());
+            payInfo.put("respCode",result.get("resp_code").toString());
+            log.info("dougong pay info-ali:{}", payInfo);
+        }
+
+        return payInfo;
+    }
+
+
+}

+ 62 - 0
mp-service/src/main/java/com/qs/mp/pay/service/impl/PayOrderServiceImpl.java

@@ -1,10 +1,25 @@
 package com.qs.mp.pay.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.json.JSONUtil;
+import com.google.common.collect.Maps;
+import com.qs.mp.common.constant.SysCode;
+import com.qs.mp.common.enums.PayOrderStatusEnum;
+import com.qs.mp.common.utils.http.OkHttpUtil;
 import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.pay.mapper.PayOrderMapper;
 import com.qs.mp.pay.service.IPayOrderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * <p>
@@ -17,4 +32,51 @@ import org.springframework.stereotype.Service;
 @Service
 public class PayOrderServiceImpl extends ServiceImpl<PayOrderMapper, PayOrder> implements IPayOrderService {
 
+    Logger log = LoggerFactory.getLogger(PayOrderServiceImpl.class);
+
+    @Autowired
+    private IPayOrderService payOrderService;
+
+    @Transactional
+    public Map<String,Object> dougongPaySuccessCallBack(PayOrder payOrder) {
+        Map<String,Object> result = SysCode.fail();
+        log.info("dougongPaySuccessCallBack---------->tradesId:{},huifuPayId:{}",payOrder.getOrderId(),payOrder.getOrderNo());
+        log.info("dougongPaySuccessCallBack---------->tradesOrder:{}", JSONUtil.toJsonStr(payOrder));
+        try {
+            if ("2".equals(payOrder.getOrderStatus())) {
+                log.info("dougongPaySuccessCallBack---------->0,huifuPaId:{}", payOrder.getOrderNo());
+                payOrder.setOrderStatus(PayOrderStatusEnum.SUCCESS.getValue());
+                payOrderService.saveOrUpdate(payOrder);
+
+                Map<String,String> resultx = SysCode.success();
+
+                resultx.put(SysCode.DATA_KEY, JSONUtil.toJsonStr(payOrder));
+                resultx.put(SysCode.MSG_KEY,"订单支付成功,单号:" + payOrder.getOrderId());
+                log.info("dougongPaySuccessCallBack----->1");
+
+                String xurl = "https://openapi.donghuid.com/yinLianPay/yinLianPayNotify";
+                for (int i = 0; i < 5; i++) {
+                    String xresult = OkHttpUtil.post(xurl, resultx);
+                    log.info("向第三方继续回调结果:{}", xresult);
+                    Map<String, Object> xmap = JSONUtil.toBean(xresult, Map.class);
+                    if (xmap.containsKey("code")) {
+                        String v = xmap.get("code").toString();
+                        if (String.valueOf(SysCode.OPER_SUCCESS).equals(v)) {//1W成功,2W失败
+                            break;
+                        }
+                    }
+                }
+
+
+                result = SysCode.success("dg支付回调成功,单号:{}" + payOrder.getOrderId());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("线下订单回调处理出错{}", e.getMessage());
+            result = SysCode.fail("dg支付回调失败,单号:{}" + payOrder.getOrderId());
+        }
+
+
+        return result;
+    }
 }

+ 545 - 4
mp-service/src/main/java/com/qs/mp/pay/service/impl/WalletServiceImpl.java

@@ -1,5 +1,8 @@
 package com.qs.mp.pay.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alipay.api.AlipayApiException;
@@ -9,23 +12,43 @@ import com.alipay.api.request.AlipayTradeCreateRequest;
 import com.alipay.api.response.AlipayTradeCreateResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.google.common.collect.Maps;
+import com.eptok.yspay.opensdkjava.common.Constants;
+import com.eptok.yspay.opensdkjava.fund.MercFundApi;
+import com.eptok.yspay.opensdkjava.orderpay.AppPayApi;
+import com.eptok.yspay.opensdkjava.pojo.vo.OnlineReqDataVo;
+import com.eptok.yspay.opensdkjava.util.DateUtil;
+import com.eptok.yspay.opensdkjava.util.HttpClientUtil;
+import com.eptok.yspay.opensdkjava.util.StringUtil;
+import com.eptok.yspay.opensdkjava.util.YsOnlineSignUtils;
+import com.qs.mp.channel.domain.ChannelWithdraw;
 import com.qs.mp.channel.service.IChannelGoodsOrderService;
 import com.qs.mp.channel.service.IChannelGoodsSettleOrderService;
 import com.qs.mp.channel.service.IChannelOrderService;
+import com.qs.mp.channel.service.IChannelWithdrawService;
+import com.qs.mp.common.constant.YsPayMethodConstants;
+import com.qs.mp.common.constant.YsServerApiConstants;
+import com.qs.mp.common.domain.YsCallLog;
 import com.qs.mp.common.enums.AppSourceEnum;
 import com.qs.mp.common.enums.AsyncTaskTypeEnum;
 import com.qs.mp.common.enums.BizTypeEnum;
+import com.qs.mp.common.enums.ChannelWithdrawStatusEnum;
 import com.qs.mp.common.enums.MqTopicType;
 import com.qs.mp.common.enums.PayOrderStatusEnum;
+import com.qs.mp.common.enums.YsCallBizTypeEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.pulsar.PulsarClientService;
+import com.qs.mp.common.service.IYsCallLogService;
 import com.qs.mp.common.utils.DateUtils;
+import com.qs.mp.common.utils.KeyGenUtil;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.common.utils.StringUtils;
 import com.qs.mp.common.utils.http.OkHttpUtil;
 import com.qs.mp.framework.domain.AsyncTask;
 import com.qs.mp.framework.service.IAsyncTaskService;
+import com.qs.mp.pay.domain.DougongPayRequestParam;
 import com.qs.mp.pay.domain.PayOrder;
+import com.qs.mp.pay.domain.PaymentConfig;
 import com.qs.mp.pay.service.IPayOrderService;
 import com.qs.mp.pay.service.IWalletService;
 import com.qs.mp.system.service.id.BizIdGenerator;
@@ -34,9 +57,9 @@ import com.qs.mp.user.service.IUserDeliverOrderService;
 import com.qs.mp.user.service.IUserTicketOrderService;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
 import org.apache.pulsar.client.api.PulsarClientException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,7 +68,6 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
-import java.util.Objects;
 import org.springframework.transaction.annotation.Transactional;
 
 /**
@@ -85,6 +107,17 @@ public class WalletServiceImpl implements IWalletService {
   @Autowired
   private IChannelGoodsSettleOrderService settleOrderService;
 
+  @Autowired
+  private DougongPayApi dougongPayApi;
+
+  @Autowired
+  private IChannelWithdrawService channelWithdrawService;
+
+  @Autowired
+  private IYsCallLogService ysCallLogService;
+
+  @Autowired
+
   @Value("${pay.notifyUrl}")
   private String notifyUrl;  //支付成功前端跳转地址
   @Value("${pay.callbackUrl}")
@@ -139,6 +172,117 @@ public class WalletServiceImpl implements IWalletService {
   private AlipayClient alipayClient = null;
 
 
+  @Value("${ys-pay.partner-id}")
+  private String partnerId;
+
+  @Value("${ys-pay.private-key-pass}")
+  private String privateKeyPass;
+
+  @Value("${ys-pay.private-key-path}")
+  private String privateKeyPath;
+
+  @Value("${ys-pay.public-key-path}")
+  private String publicKeyPath;
+
+  @Value("${ys-pay.master-seller-id}")
+  private String masterSellerId;
+
+  @Value("${ys-pay.child-seller-id}")
+  private String childSellerId;
+
+  @Value("${ys-pay.return-url}")
+  private String ysReturnUrl;
+  @Value("${ys-pay.pay-notify-url}")
+  private String ysPayNotifyUrl;
+
+  @Value("${ys-pay.withdraw-notify-url}")
+  private String ysWithdrawNotifyUrl;
+
+  @Override
+  public JSONObject h5Pay(BizTypeEnum bizType, String bizId, int money, String orderRemark) {
+    Map<String, String> params = new HashMap<>();
+    String orderId = String.valueOf(bizIdGenerator.newId());
+    String tradeNo = DateUtil.getDateNowYmd() + DateUtil.getRandom(14);
+    // 返回页面拼接
+
+    String returnUrl = ysReturnUrl;
+    if (BizTypeEnum.TICKET_ORDER.equals(bizType)) {
+      UserTicketOrder userTicketOrder = userTicketOrderService.getById(bizId);
+      returnUrl = returnUrl + "?boxId=" + userTicketOrder.getBoxId() + "&orderId=" + bizId + "&istry=0";
+    }
+    params.put("method", YsPayMethodConstants.H5_PAY_METHOD);
+    params.put("partner_id", partnerId);
+    params.put("timestamp", DateUtil.getDateNow());
+    params.put("charset", Constants.CHARSET_UTF_8);
+    params.put("sign_type", "RSA");
+    params.put("notify_url", ysPayNotifyUrl);
+    params.put("return_url", returnUrl);
+    params.put("seller_id", partnerId);
+    params.put("version","3.0");
+    params.put("out_trade_no", tradeNo);
+    params.put("shopdate", DateUtil.getDateNowYmd());
+    params.put("subject", orderRemark);
+    params.put("total_amount", new BigDecimal(money).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString());
+    params.put("timeout_express","96h");
+    params.put("business_code", "3010002");
+    try {
+      String sign = YsOnlineSignUtils.sign(params, privateKeyPass, privateKeyPath);
+      params.put("sign", sign);
+    } catch (Exception e) {
+      logger.error("签名失败,bizId=" + bizId, e);
+      throw new ServiceException("支付发起签名失败");
+    }
+
+//    String result = OkHttpUtil.post("https://openapi.ysepay.com/gateway.do", params);
+//
+    // 保存调用记录
+    YsCallLog ysCallLog = new YsCallLog();
+    ysCallLog.setBizId(orderId);
+    ysCallLog.setBizType(YsCallBizTypeEnum.ORDER_PAY);
+    ysCallLog.setInterfaceId(YsPayMethodConstants.H5_PAY_METHOD);
+    ysCallLog.setReqJson(JSONObject.toJSONString(params));
+    ysCallLogService.save(ysCallLog);
+
+//
+//    String result = "https://openapi.ysepay.com/gateway.do?";
+//    for (String key : params.keySet()) {
+//      result += key + "=" + params.get(key);
+//      // 如果是最后一个,则不再末尾加上&
+//      if (key != params.keySet().toArray()[params.keySet().size() - 1]) {
+//          result += "&";
+//      }
+//    }
+//    System.out.println("result = " + result);
+
+//
+//    //保存订单记录
+    PayOrder payOrder = new PayOrder();
+    payOrder.setOrderId(orderId);
+    payOrder.setBizType(bizType);
+    payOrder.setBizId(bizId);
+    payOrder.setTradeNo(tradeNo);
+    payOrder.setOrderTime(DateUtils.getTime());
+    payOrder.setPayResource("3"); // 支付宝直连
+    payOrder.setTransTypeCode("1020"); // 支付宝小程序
+    payOrder.setTransactionAmount(money);
+    payOrder.setOrderRemark(orderRemark);
+    payOrder.setOrderName(orderRemark);
+    payOrder.setOrderStatus(PayOrderStatusEnum.WAIT.getValue());
+    boolean ret = payOrderService.save(payOrder);
+    if (!ret) {
+      LogUtil.error(logger, "支付订单数据保存失败.");
+      throw new ServiceException("支付订单保存失败");
+    }
+//
+//    JSONObject data = new JSONObject();
+//    data.put("payUrl", result);
+
+
+    JSONObject data = JSONObject.parseObject(JSONObject.toJSONString(params));
+    return data;
+  }
+
+
   @Override
   public JSONObject directAliPay(BizTypeEnum bizType, String bizId, String openId, int money, String orderRemark) {
     if (null == alipayClient) {
@@ -292,6 +436,323 @@ public class WalletServiceImpl implements IWalletService {
 
   }
 
+  /**
+   * 斗拱支付宝支付
+   * @param bizType
+   * @param bizId
+   * @param openId
+   * @param money
+   * @param orderRemark
+   * @return
+   */
+  @Override
+  public JSONObject dgAliPay(BizTypeEnum bizType, String bizId, String openId, int money, String orderRemark, String clientType, Integer appSource) throws ServiceException {
+
+    JSONObject data = new JSONObject();
+
+    String appId = channelAppId;
+    String payShopNo = channelPayShopNo;
+    String paySign = channelPaySign;
+
+    AppSourceEnum appSourceEnum = AppSourceEnum.getByValue(appSource);
+    if (bizType == BizTypeEnum.TICKET_ORDER || bizType == BizTypeEnum.DELIVER_ORDER) {
+      appId = appSourceEnum.getAppId();
+      // 区分微信小程序
+      if (AppSourceEnum.MSDQ.equals(appSourceEnum)) {
+        payShopNo = msdqPayShopNo;
+        paySign = msdqPaySign;
+      } else {
+        payShopNo = userPayShopNo;
+        paySign = userPaySign;
+      }
+
+    }
+    JSONObject params = buildPayOrderReqData(payShopNo, paySign, money, openId, appId, orderRemark, PAY_RESOURCE, PAY_RESOURCE_TYPE);
+    //判断是否是0元订单
+    Map<String, String> payMap = Maps.newHashMap();
+    if(money == 0){//0元订单,直接返回,不需要进支付
+      String orderId = String.valueOf(bizIdGenerator.newId());
+      PayOrder payOrder = buildPayOrder(params);
+      payOrder.setOrderId(orderId);
+      payOrder.setBizType(bizType);
+      payOrder.setBizId(bizId);
+      payOrder.setOrderNo("");
+      payOrder.setOrderTime(DateUtils.getTime());
+      payOrder.setPayResource("1"); // 支付宝直连
+      payOrder.setTransTypeCode("1019"); // 支付宝小程序
+      payOrder.setTransactionAmount(money);
+      payOrder.setOrderRemark(orderRemark);
+      payOrder.setOrderName(orderRemark);
+      payOrder.setOrderStatus(PayOrderStatusEnum.WAIT.getValue());
+      boolean ret = payOrderService.save(payOrder);
+
+      if (!ret) {
+        LogUtil.error(logger, "支付订单数据库保存失败.");
+        throw new ServiceException("支付订单保存失败");
+      }else {
+        return data;
+      }
+
+    }
+
+    //发起支付
+    payMap = createJSAPIOrderDougong(money, openId, clientType, appId, bizType, bizId, orderRemark);
+    JSONObject json = (JSONObject) JSON.toJSON(payMap);
+    LogUtil.info(logger, "jsapiOrder--result::{}", json);
+
+    return data;
+
+  }
+
+
+
+  /**
+   * 斗拱微信支付
+   * @param bizType
+   * @param bizId
+   * @param openId
+   * @param money
+   * @param orderRemark
+   * @param appSource
+   * @return
+   */
+  @Override
+  public JSONObject dgWxPay(BizTypeEnum bizType, String bizId, String openId, int money,
+                        String orderRemark, Integer appSource, String clientType) throws ServiceException{
+    JSONObject data = new JSONObject();
+
+    //用户端小程序appId
+    String appId = userAppId;
+    String payShopNo = channelPayShopNo;
+    String paySign = channelPaySign;
+
+    AppSourceEnum appSourceEnum = AppSourceEnum.getByValue(appSource);
+    if (bizType == BizTypeEnum.TICKET_ORDER || bizType == BizTypeEnum.DELIVER_ORDER) {
+      appId = appSourceEnum.getAppId();
+      // 区分微信小程序
+      if (AppSourceEnum.MSDQ.equals(appSourceEnum)) {
+        payShopNo = msdqPayShopNo;
+        paySign = msdqPaySign;
+      } else {
+        payShopNo = userPayShopNo;
+        paySign = userPaySign;
+      }
+
+    }
+    JSONObject params = buildPayOrderReqData(payShopNo, paySign, money, openId, appId, orderRemark, PAY_RESOURCE, PAY_RESOURCE_TYPE);
+    //判断是否是0元订单
+    Map<String, String> payMap = Maps.newHashMap();
+    if(money == 0){//0元订单,直接返回,不需要进支付
+
+      PayOrder payOrder = buildPayOrder(params);
+      payOrder.setOrderId(String.valueOf(bizIdGenerator.newId()));
+      payOrder.setOrderNo("");
+      payOrder.setCode("");
+      payOrder.setBizType(bizType);
+      payOrder.setBizId(bizId);
+      payOrder.setOrderStatus("");
+      payOrder.setOrderStatus(PayOrderStatusEnum.SUCCESS.getValue());
+      boolean ret = payOrderService.save(payOrder);
+
+      if (!ret) {
+        LogUtil.error(logger, "支付订单数据库保存失败.");
+        throw new ServiceException("支付订单保存失败");
+      }else {
+        return data;
+      }
+
+    }
+
+    //发起支付
+    payMap = createJSAPIOrderDougong(money, openId, clientType, appId, bizType, bizId, orderRemark);
+    JSONObject json = (JSONObject) JSON.toJSON(payMap);
+    LogUtil.info(logger, "jsapiOrder--result::{}", json);
+
+    return json;
+
+  }
+
+
+  /**
+   * 根据类型调用斗拱支付
+   * @param payAmt
+   * @param openId
+   * @param clientType
+   * @param appId
+   * @return
+   * @throws Exception
+   */
+  public Map<String, String> createJSAPIOrderDougong(int payAmt,String openId, String clientType,String appId, BizTypeEnum bizType, String bizId, String orderRemark) throws ServiceException {
+    String tradeType;
+    if(com.qs.mp.common.constant.Constants.PAY_STYLE_WX.equals(clientType)){
+      tradeType = com.qs.mp.common.constant.Constants.DOUGONG_TRADE_TYPE_MINIAPP;
+      String payStyle = com.qs.mp.common.constant.Constants.PAY_STYLE_WXMINI_DOUGONG;
+      return wxCreateJSAPIOrderWxminiDougong(payAmt,openId,tradeType,payStyle,appId, bizType, bizId, orderRemark);
+    }else if(com.qs.mp.common.constant.Constants.PAY_STYLE_ALI.equals(clientType)){
+      tradeType = com.qs.mp.common.constant.Constants.DOUGONG_TRADE_TYPE_ALIJS;
+      String payStyle = com.qs.mp.common.constant.Constants.PAY_STYLE_ALIMINI_DOUGONG;
+      return aliCreateJSAPIOrderMiniDougong(payAmt,openId,tradeType,payStyle, bizType, bizId, orderRemark);
+    }
+    return Maps.newHashMap();
+  }
+
+
+  /**
+   * 创建JSAPI微信小程序支付
+   * @param payAmt
+   * @param code
+   * @param tradeType
+   * @param payStyle
+   * @param wxAppId
+   * @return
+   * @throws Exception
+   */
+  @Transactional
+  public Map<String, String> wxCreateJSAPIOrderWxminiDougong(int payAmt,String code, String tradeType,String payStyle,String wxAppId, BizTypeEnum bizType, String bizId, String orderRemark) throws ServiceException {
+
+    String orderId = String.valueOf(bizIdGenerator.newId());
+
+    DougongPayRequestParam wxRequestParam = new DougongPayRequestParam();
+    wxRequestParam.setTradesOrderId(orderId);
+    wxRequestParam.setTotalFee(payAmt);
+    wxRequestParam.setTradeType(com.qs.mp.common.constant.Constants.PAY_STYLE_WXMINI_DOUGONG);
+    wxRequestParam.setOpenid(code);
+    List<PaymentConfig> paymentConfigList = dougongPayApi.getAvailablePaymentConfigList();
+    PaymentConfig paymentConfig = CollectionUtil.isNotEmpty(paymentConfigList) ? RandomUtil.randomEle(paymentConfigList) : null;
+
+    if(StringUtils.isEmpty(wxAppId)){
+      wxAppId = Objects.nonNull(paymentConfig) ? paymentConfig.getAppletId() : "";
+    }else{
+      final String appId0 = wxAppId;
+      paymentConfig = CollectionUtil.isNotEmpty(paymentConfigList) ? paymentConfigList.stream().filter(p->appId0.equals(p.getAppletId())).findFirst().orElse(null) : null;
+      LogUtil.info(logger,"wxCreateJSAPIOrderWxminiDougong--appId:{}",wxAppId);
+    }
+
+    wxRequestParam.setAppid(Objects.nonNull(paymentConfig) ? paymentConfig.getAppletId() : "");
+    wxRequestParam.setPayStyle(payStyle);
+
+
+    //汇付,斗拱共用这个字段
+    String huifuPayId = orderId + "D" + KeyGenUtil.newKeyTimestamp();
+    wxRequestParam.setHuifuPayId(huifuPayId);
+
+    Map<String, String> payMap;
+    try {
+      wxRequestParam.setMchId("");
+      LogUtil.info(logger,"dougong pay order:{}",orderId);
+      payMap = dougongPayApi.unifiedOrderDougong(wxRequestParam,tradeType,paymentConfig);
+      String jsonData = payMap.get("payInfo");
+      LogUtil.info(logger,"jsonData:{}", jsonData);
+      JSONObject payInfoJson = JSONObject.parseObject(jsonData);
+      String packageStr = payInfoJson.getString("package");
+      LogUtil.info(logger,"packageStr-->{}", packageStr);
+      String appId = payInfoJson.getString("appId");
+      String signType = payInfoJson.getString("signType");
+      String nonceStr = payInfoJson.getString("nonceStr");
+      String paySign = payInfoJson.getString("paySign");
+      String timeStamp = payInfoJson.getString("timeStamp");
+      payMap.put("package", packageStr);
+      payMap.put("appId", appId);
+      payMap.put("signType", signType);
+      payMap.put("nonceStr", nonceStr);
+      payMap.put("paySign", paySign);
+      payMap.put("timeStamp", timeStamp);
+      String respCode = payMap.get("respCode");
+      LogUtil.info(logger,"success status:{}", com.qs.mp.common.constant.Constants.DOUGONG_ORDER_SUCCESS_CODE.equals(respCode));
+
+      if (com.qs.mp.common.constant.Constants.DOUGONG_ORDER_SUCCESS_CODE.equals(respCode)) {
+
+        //插入支付订单记录
+        PayOrder payOrder = new PayOrder();
+        payOrder.setOrderId(orderId);
+        payOrder.setBizType(bizType);
+        payOrder.setBizId(bizId);
+        payOrder.setOrderNo(huifuPayId);
+        payOrder.setOrderTime(DateUtils.getTime());
+        payOrder.setPayResource("2"); // 微信支付
+        payOrder.setTransTypeCode("1019"); // 微信小程序
+        payOrder.setTransactionAmount(payAmt);
+        payOrder.setOrderRemark(orderRemark);
+        payOrder.setOrderName(orderRemark);
+        payOrder.setOrderStatus(PayOrderStatusEnum.WAIT.getValue());
+        boolean ret = payOrderService.save(payOrder);
+
+        if (!ret) {
+          LogUtil.error(logger, "支付订单数据库保存失败.");
+          throw new ServiceException("支付订单保存失败");
+        }
+
+      } else {
+        payMap.put("respCode","");
+      }
+
+    } catch (Exception e) {
+      LogUtil.error(logger,"Exception", e);
+      throw new ServiceException("微信斗拱预生成订单失败");
+    }
+    return payMap;
+  }
+
+
+  /**
+   * 创建JSAPI支付宝小程序支付
+   * @param payAmt
+   * @param code
+   * @param tradeType
+   * @param payStyle
+   * @return
+   * @throws Exception
+   */
+  @Transactional
+  public Map<String, String> aliCreateJSAPIOrderMiniDougong(int payAmt,String code, String tradeType,String payStyle, BizTypeEnum bizType, String bizId, String orderRemark) throws ServiceException {
+
+    String orderId = String.valueOf(bizIdGenerator.newId());
+
+    DougongPayRequestParam dougongPayRequestParam = new DougongPayRequestParam();
+    dougongPayRequestParam.setTradesOrderId(orderId);
+    dougongPayRequestParam.setTotalFee(payAmt);
+    List<PaymentConfig> paymentConfigList = dougongPayApi.getAvailablePaymentConfigList();
+    PaymentConfig paymentConfig = CollectionUtil.isNotEmpty(paymentConfigList) ? RandomUtil.randomEle(paymentConfigList) : null;
+
+    dougongPayRequestParam.setAppid(Objects.nonNull(paymentConfig) ? paymentConfig.getAliPid() : "");
+    dougongPayRequestParam.setTradeType(com.qs.mp.common.constant.Constants.PAY_STYLE_ALIMINI_DOUGONG);
+    dougongPayRequestParam.setOpenid(code);
+    String huifuPayId = orderId + "D" + KeyGenUtil.newKeyTimestamp();
+    dougongPayRequestParam.setHuifuPayId(huifuPayId);
+
+
+    Map<String, String> payMap = null;
+    try {
+      dougongPayRequestParam.setMchId("");
+      payMap = dougongPayApi.unifiedOrderDougong(dougongPayRequestParam,tradeType,paymentConfig);
+      LogUtil.info(logger,"dougong-ali-pay result:{}", payMap.toString());
+      String jsonData = payMap.get("payInfo");
+      String respCode = payMap.get("respCode");
+      if(JSONUtil.isTypeJSON(jsonData)){
+        JSONObject payInfoJson = JSONObject.parseObject(jsonData);
+        String packageStr = payInfoJson.getString("package");
+        LogUtil.info(logger,"packageStr-->{}", packageStr);
+        String tradeNO = payInfoJson.getString("tradeNO");
+        String memberId = payInfoJson.getString("memberId");
+        LogUtil.info(logger,"dougong-ali payinfo--tradeNo:{},memberId:{}",tradeNO,memberId);
+        payMap.put("tradeNO", tradeNO);
+        LogUtil.info(logger, "success status:{},respCode:{}", com.qs.mp.common.constant.Constants.DOUGONG_ORDER_SUCCESS_CODE.equals(respCode),respCode);
+      }else{
+        payMap.put("payInfo",jsonData);
+      }
+
+      LogUtil.info(logger, "支付宝小程序斗拱支付--即将更新订单信息:tradesId:{},payStyle:{},huifuMemberId:{}",orderId, payStyle, huifuPayId);
+      //后跟51原始订单号,value为list,list的值为huifu_pay_id过期时间4小时
+
+    } catch (Exception e) {
+      LogUtil.error(logger,"Exception", e);
+      throw new ServiceException("斗拱-支付宝小程序预生成订单失败");
+    }
+    return payMap;
+  }
+
+
+
   @Override
   public boolean refund(String bizId, Integer refundAmount, String remark) {
     // 获取支付成功的订单号
@@ -340,6 +801,86 @@ public class WalletServiceImpl implements IWalletService {
   }
 
 
+  @Override
+  @Transactional(rollbackFor = Exception.class)
+  public boolean withdrawal(String bizId) {
+    /*ChannelWithdraw channelWithdraw = channelWithdrawService.getById(bizId);
+
+    if (!ChannelWithdrawStatusEnum.WITHDRAWING.equals(channelWithdraw.getStatus())) {
+        throw new ServiceException("提现状态不正确");
+    }
+
+    String tradeNo = DateUtil.getDateNowYmd() + DateUtil.getRandom(14);
+
+      boolean res = channelWithdrawService.update(new LambdaUpdateWrapper<ChannelWithdraw>()
+          .set(ChannelWithdraw::getTradeNo, tradeNo)
+          .set(ChannelWithdraw::getStatus, ChannelWithdrawStatusEnum.WITHDRAW_PROCESS)
+          .eq(ChannelWithdraw::getId, channelWithdraw.getId())
+          .eq(ChannelWithdraw::getStatus, ChannelWithdrawStatusEnum.WITHDRAWING));
+      if (!res) {
+          throw new ServiceException("提现状态更新失败");
+      }
+
+
+    OnlineReqDataVo req = new OnlineReqDataVo();
+    req.setReqUrl(YsServerApiConstants.COMMON_API);
+    req.setPrivateKeyFilePath(privateKeyPath);
+    req.setYsPublicKeyFilePath(publicKeyPath);
+    req.setPrivateKeyPassword(privateKeyPass);
+    req.setNotifyUrl(ysWithdrawNotifyUrl);
+    req.setPartnerId(partnerId);
+
+    //实时提现(一般户到银行卡)业务参数
+    Map<String, Object> bizContent = new HashMap<>();
+    //商户生成的订单号,生成规则前8位必须为交易日期,如20180525,范围跨度支持包含当天在内的前后一天
+    bizContent.put("out_trade_no", tradeNo);
+    //商户号
+    bizContent.put("merchant_usercode", partnerId);
+    //暂时只支持币种:CNY(人民币)
+    bizContent.put("currency", "CNY");
+    //提现的总金额。单位为:RMB Yuan。取值范围为[0.01,99999999.99],精确到小数点后两位。Number(10,2)指10位长度,2位精度
+    bizContent.put("total_amount", new BigDecimal(channelWithdraw.getMoney()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString());
+    //订单说明
+    bizContent.put("subject", "提现备注");
+    //商户日期(该参数做交易与查询时需要一致) 该日期需在当日的前后一天时间范围之内
+    bizContent.put("shopdate", DateUtil.getDateNowYmd());
+    //银行帐号
+    bizContent.put("bank_account_no", channelWithdraw.getCardNo());
+    req.setParamData(bizContent);
+    String result = null;
+    try{
+      logger.info("实时提现(一般户到银行卡)调用sdk接口addScanMerc请求入参为:"+ JSONObject.toJSONString(req));
+      //根据返回结果处理自己的业务逻辑,result内容详见接口文档
+      result = MercFundApi.withdrawQuick(req);
+    }catch (Exception e){
+      logger.info("实时提现(一般户到银行卡)失败:"+ e.getMessage());
+    }
+
+    logger.info("提现提交result = " + result);
+
+    // 保存调用日志
+      YsCallLog ysCallLog = new YsCallLog();
+      ysCallLog.setInterfaceId(YsPayMethodConstants.SETTLED_ACCOUNT_WITHDRAW_METHOD);
+      ysCallLog.setBizId(tradeNo);
+      ysCallLog.setBizType(YsCallBizTypeEnum.WITHDRAW);
+      ysCallLog.setReqJson(JSONObject.toJSONString(bizContent));
+      ysCallLog.setResJson(result);
+      ysCallLogService.save(ysCallLog);
+
+      if (StringUtils.isBlank(result)) {
+            throw new ServiceException("提现交易处理失败");
+    }
+
+    JSONObject response = JSONObject.parseObject(result);
+    String tradeStatus = (String) response.get("trade_status");
+    if (StringUtils.isBlank(tradeStatus) &&
+        (!"TRADE_ACCEPT_SUCCESS".equals(tradeStatus) || !"TRADE_SUCCESS".equals(tradeStatus))) {
+      logger.error("提现交易处理失败,result = " + result);
+        throw new ServiceException("提现交易处理失败");
+    }*/
+    return true;
+  }
+
   @Override
   public void payOrderStatusHandle(PayOrder payOrder) {
     String orderNo = payOrder.getOrderId();

+ 1 - 0
mp-service/src/main/java/com/qs/mp/system/mapper/SysUserRoleMapper.java

@@ -1,5 +1,6 @@
 package com.qs.mp.system.mapper;
 
+import com.qs.mp.system.domain.SysUser;
 import com.qs.mp.system.domain.SysUserRole;
 import java.util.List;
 import org.apache.ibatis.annotations.Param;

+ 21 - 0
mp-service/src/main/resources/mapper/channel/ChannelBankMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.channel.mapper.ChannelBankMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.channel.domain.ChannelBank">
+        <id column="id" property="id" />
+        <result column="channel_id" property="channelId" />
+        <result column="bank_no" property="bankNo" />
+        <result column="bank_name" property="bankName" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="is_deleted" property="isDeleted" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, channel_id, bank_no, bank_name, created_time, updated_time, is_deleted
+    </sql>
+
+</mapper>

+ 22 - 0
mp-service/src/main/resources/mapper/common/YsCallLogMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.common.mapper.YsCallLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.common.domain.YsCallLog">
+        <id column="id" property="id" />
+        <result column="req_id" property="reqId" />
+        <result column="interface_id" property="interfaceId" />
+        <result column="req_json" property="reqJson" />
+        <result column="res_json" property="resJson" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="is_deleted" property="isDeleted" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, req_id, interface_id, req_json, res_json, created_time, updated_time, is_deleted
+    </sql>
+
+</mapper>

+ 23 - 0
mp-service/src/main/resources/mapper/pay/DivisionLogMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.pay.mapper.DivisionLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qs.mp.pay.domain.DivisionLog">
+        <id column="id" property="id" />
+        <result column="trade_no" property="tradeNo" />
+        <result column="order_no" property="orderNo" />
+        <result column="biz_id" property="bizId" />
+        <result column="amount" property="amount" />
+        <result column="status" property="status" />
+        <result column="created_time" property="createdTime" />
+        <result column="updated_time" property="updatedTime" />
+        <result column="is_deleted" property="isDeleted" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, trade_no, order_no, biz_id, amount, status, created_time, updated_time, is_deleted
+    </sql>
+
+</mapper>

+ 788 - 0
mp-service/src/main/resources/mapper/pay/PaymentConfigMapper.xml

@@ -0,0 +1,788 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qs.mp.pay.mapper.PaymentConfigMapper">
+  <resultMap id="BaseResultMap" type="com.qs.mp.pay.domain.PaymentConfig">
+    <id column="id" jdbcType="VARCHAR" property="id" />
+    <result column="data_order" jdbcType="INTEGER" property="dataOrder" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
+    <result column="make_person" jdbcType="VARCHAR" property="makePerson" />
+    <result column="modifier" jdbcType="VARCHAR" property="modifier" />
+    <result column="modifier_time" jdbcType="TIMESTAMP" property="modifierTime" />
+    <result column="locked" jdbcType="INTEGER" property="locked" />
+    <result column="del_tag" jdbcType="INTEGER" property="delTag" />
+    <result column="check_tag" jdbcType="INTEGER" property="checkTag" />
+    <result column="check_status" jdbcType="VARCHAR" property="checkStatus" />
+    <result column="check_time" jdbcType="TIMESTAMP" property="checkTime" />
+    <result column="check_person" jdbcType="VARCHAR" property="checkPerson" />
+    <result column="print_tag" jdbcType="INTEGER" property="printTag" />
+    <result column="invalid_tag" jdbcType="INTEGER" property="invalidTag" />
+    <result column="menu_id" jdbcType="VARCHAR" property="menuId" />
+    <result column="menu_name" jdbcType="VARCHAR" property="menuName" />
+    <result column="remarks" jdbcType="VARCHAR" property="remarks" />
+    <result column="merchant_id" jdbcType="VARCHAR" property="merchantId" />
+    <result column="app_id" jdbcType="VARCHAR" property="appId" />
+    <result column="member_id" jdbcType="VARCHAR" property="memberId" />
+    <result column="ali_pid" jdbcType="VARCHAR" property="aliPid" />
+    <result column="store_id" jdbcType="VARCHAR" property="storeId" />
+    <result column="agent_id" jdbcType="VARCHAR" property="agentId" />
+    <result column="agent_name" jdbcType="VARCHAR" property="agentName" />
+    <result column="store_type" jdbcType="INTEGER" property="storeType" />
+    <result column="payment_type" jdbcType="INTEGER" property="paymentType" />
+    <result column="merchant_code" jdbcType="VARCHAR" property="merchantCode" />
+    <result column="merchant_counter_code" jdbcType="VARCHAR" property="merchantCounterCode" />
+    <result column="the_branch_code" jdbcType="VARCHAR" property="theBranchCode" />
+    <result column="sys_id" jdbcType="VARCHAR" property="sysId" />
+    <result column="huifu_id" jdbcType="VARCHAR" property="huifuId" />
+    <result column="merchant_name" jdbcType="VARCHAR" property="merchantName" />
+    <result column="store_name" jdbcType="VARCHAR" property="storeName" />
+    <result column="available_tag" jdbcType="INTEGER" property="availableTag" />
+    <result column="private_key_dougong" jdbcType="VARCHAR" property="privateKeyDougong" />
+    <result column="public_key_huifu" jdbcType="VARCHAR" property="publicKeyHuifu" />
+    <result column="applet_id" jdbcType="VARCHAR" property="appletId" />
+    <result column="applet_secret" jdbcType="VARCHAR" property="appletSecret" />
+    <result column="wechat_secret" jdbcType="VARCHAR" property="wechatSecret" />
+    <result column="dougong_product_id" jdbcType="VARCHAR" property="dougongProductId" />
+  </resultMap>
+  <sql id="Example_Where_Clause">
+    <where>
+      <foreach collection="oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Update_By_Example_Where_Clause">
+    <where>
+      <foreach collection="example.oredCriteria" item="criteria" separator="or">
+        <if test="criteria.valid">
+          <trim prefix="(" prefixOverrides="and" suffix=")">
+            <foreach collection="criteria.criteria" item="criterion">
+              <choose>
+                <when test="criterion.noValue">
+                  and ${criterion.condition}
+                </when>
+                <when test="criterion.singleValue">
+                  and ${criterion.condition} #{criterion.value}
+                </when>
+                <when test="criterion.betweenValue">
+                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
+                </when>
+                <when test="criterion.listValue">
+                  and ${criterion.condition}
+                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
+                    #{listItem}
+                  </foreach>
+                </when>
+              </choose>
+            </foreach>
+          </trim>
+        </if>
+      </foreach>
+    </where>
+  </sql>
+  <sql id="Base_Column_List">
+    id, data_order, create_time, update_time, make_person, modifier, modifier_time, locked, 
+    del_tag, check_tag, check_status, check_time, check_person, print_tag, invalid_tag, 
+    menu_id, menu_name, remarks, merchant_id, app_id, member_id, ali_pid, store_id, agent_id, 
+    agent_name, store_type, payment_type, merchant_code, merchant_counter_code, the_branch_code, 
+    sys_id, huifu_id, merchant_name, store_name, available_tag, private_key_dougong, 
+    public_key_huifu, applet_id, applet_secret, wechat_secret, dougong_product_id
+  </sql>
+  <select id="selectByExample" parameterType="com.qs.mp.pay.domain.PaymentConfigExample" resultMap="BaseResultMap">
+    select
+    <if test="distinct">
+      distinct
+    </if>
+    <include refid="Base_Column_List" />
+    from mp_payment_config
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+    <if test="orderByClause != null">
+      order by ${orderByClause}
+    </if>
+  </select>
+  <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
+    select 
+    <include refid="Base_Column_List" />
+    from mp_payment_config
+    where id = #{id,jdbcType=VARCHAR}
+  </select>
+
+  <select id="selectByHostName" parameterType="java.lang.String" resultType="string">
+    select
+    token
+    from mp_payment_config
+    where host_name LIKE CONCAT('%', #{hostName}, '%')
+  </select>
+
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.String">
+    delete from mp_payment_config
+    where id = #{id,jdbcType=VARCHAR}
+  </delete>
+  <delete id="deleteByExample" parameterType="com.qs.mp.pay.domain.PaymentConfigExample">
+    delete from mp_payment_config
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </delete>
+  <insert id="insert" parameterType="com.qs.mp.pay.domain.PaymentConfig">
+    insert into mp_payment_config (id, data_order, create_time, 
+      update_time, make_person, modifier, 
+      modifier_time, locked, del_tag, 
+      check_tag, check_status, check_time, 
+      check_person, print_tag, invalid_tag, 
+      menu_id, menu_name, remarks, 
+      merchant_id, app_id, member_id, 
+      ali_pid, store_id, agent_id, 
+      agent_name, store_type, payment_type, 
+      merchant_code, merchant_counter_code, the_branch_code, 
+      sys_id, huifu_id, merchant_name, 
+      store_name, available_tag, private_key_dougong, 
+      public_key_huifu, applet_id, applet_secret, 
+      wechat_secret, dougong_product_id)
+    values (#{id,jdbcType=VARCHAR}, #{dataOrder,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, 
+      #{updateTime,jdbcType=TIMESTAMP}, #{makePerson,jdbcType=VARCHAR}, #{modifier,jdbcType=VARCHAR}, 
+      #{modifierTime,jdbcType=TIMESTAMP}, #{locked,jdbcType=INTEGER}, #{delTag,jdbcType=INTEGER}, 
+      #{checkTag,jdbcType=INTEGER}, #{checkStatus,jdbcType=VARCHAR}, #{checkTime,jdbcType=TIMESTAMP}, 
+      #{checkPerson,jdbcType=VARCHAR}, #{printTag,jdbcType=INTEGER}, #{invalidTag,jdbcType=INTEGER}, 
+      #{menuId,jdbcType=VARCHAR}, #{menuName,jdbcType=VARCHAR}, #{remarks,jdbcType=VARCHAR}, 
+      #{merchantId,jdbcType=VARCHAR}, #{appId,jdbcType=VARCHAR}, #{memberId,jdbcType=VARCHAR}, 
+      #{aliPid,jdbcType=VARCHAR}, #{storeId,jdbcType=VARCHAR}, #{agentId,jdbcType=VARCHAR}, 
+      #{agentName,jdbcType=VARCHAR}, #{storeType,jdbcType=INTEGER}, #{paymentType,jdbcType=INTEGER}, 
+      #{merchantCode,jdbcType=VARCHAR}, #{merchantCounterCode,jdbcType=VARCHAR}, #{theBranchCode,jdbcType=VARCHAR}, 
+      #{sysId,jdbcType=VARCHAR}, #{huifuId,jdbcType=VARCHAR}, #{merchantName,jdbcType=VARCHAR}, 
+      #{storeName,jdbcType=VARCHAR}, #{availableTag,jdbcType=INTEGER}, #{privateKeyDougong,jdbcType=VARCHAR}, 
+      #{publicKeyHuifu,jdbcType=VARCHAR}, #{appletId,jdbcType=VARCHAR}, #{appletSecret,jdbcType=VARCHAR}, 
+      #{wechatSecret,jdbcType=VARCHAR}, #{dougongProductId,jdbcType=VARCHAR})
+  </insert>
+  <insert id="insertSelective" parameterType="com.qs.mp.pay.domain.PaymentConfig">
+    insert into mp_payment_config
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        id,
+      </if>
+      <if test="dataOrder != null">
+        data_order,
+      </if>
+      <if test="createTime != null">
+        create_time,
+      </if>
+      <if test="updateTime != null">
+        update_time,
+      </if>
+      <if test="makePerson != null">
+        make_person,
+      </if>
+      <if test="modifier != null">
+        modifier,
+      </if>
+      <if test="modifierTime != null">
+        modifier_time,
+      </if>
+      <if test="locked != null">
+        locked,
+      </if>
+      <if test="delTag != null">
+        del_tag,
+      </if>
+      <if test="checkTag != null">
+        check_tag,
+      </if>
+      <if test="checkStatus != null">
+        check_status,
+      </if>
+      <if test="checkTime != null">
+        check_time,
+      </if>
+      <if test="checkPerson != null">
+        check_person,
+      </if>
+      <if test="printTag != null">
+        print_tag,
+      </if>
+      <if test="invalidTag != null">
+        invalid_tag,
+      </if>
+      <if test="menuId != null">
+        menu_id,
+      </if>
+      <if test="menuName != null">
+        menu_name,
+      </if>
+      <if test="remarks != null">
+        remarks,
+      </if>
+      <if test="merchantId != null">
+        merchant_id,
+      </if>
+      <if test="appId != null">
+        app_id,
+      </if>
+      <if test="memberId != null">
+        member_id,
+      </if>
+      <if test="aliPid != null">
+        ali_pid,
+      </if>
+      <if test="storeId != null">
+        store_id,
+      </if>
+      <if test="agentId != null">
+        agent_id,
+      </if>
+      <if test="agentName != null">
+        agent_name,
+      </if>
+      <if test="storeType != null">
+        store_type,
+      </if>
+      <if test="paymentType != null">
+        payment_type,
+      </if>
+      <if test="merchantCode != null">
+        merchant_code,
+      </if>
+      <if test="merchantCounterCode != null">
+        merchant_counter_code,
+      </if>
+      <if test="theBranchCode != null">
+        the_branch_code,
+      </if>
+      <if test="sysId != null">
+        sys_id,
+      </if>
+      <if test="huifuId != null">
+        huifu_id,
+      </if>
+      <if test="merchantName != null">
+        merchant_name,
+      </if>
+      <if test="storeName != null">
+        store_name,
+      </if>
+      <if test="availableTag != null">
+        available_tag,
+      </if>
+      <if test="privateKeyDougong != null">
+        private_key_dougong,
+      </if>
+      <if test="publicKeyHuifu != null">
+        public_key_huifu,
+      </if>
+      <if test="appletId != null">
+        applet_id,
+      </if>
+      <if test="appletSecret != null">
+        applet_secret,
+      </if>
+      <if test="wechatSecret != null">
+        wechat_secret,
+      </if>
+      <if test="dougongProductId != null">
+        dougong_product_id,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="id != null">
+        #{id,jdbcType=VARCHAR},
+      </if>
+      <if test="dataOrder != null">
+        #{dataOrder,jdbcType=INTEGER},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="makePerson != null">
+        #{makePerson,jdbcType=VARCHAR},
+      </if>
+      <if test="modifier != null">
+        #{modifier,jdbcType=VARCHAR},
+      </if>
+      <if test="modifierTime != null">
+        #{modifierTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="locked != null">
+        #{locked,jdbcType=INTEGER},
+      </if>
+      <if test="delTag != null">
+        #{delTag,jdbcType=INTEGER},
+      </if>
+      <if test="checkTag != null">
+        #{checkTag,jdbcType=INTEGER},
+      </if>
+      <if test="checkStatus != null">
+        #{checkStatus,jdbcType=VARCHAR},
+      </if>
+      <if test="checkTime != null">
+        #{checkTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="checkPerson != null">
+        #{checkPerson,jdbcType=VARCHAR},
+      </if>
+      <if test="printTag != null">
+        #{printTag,jdbcType=INTEGER},
+      </if>
+      <if test="invalidTag != null">
+        #{invalidTag,jdbcType=INTEGER},
+      </if>
+      <if test="menuId != null">
+        #{menuId,jdbcType=VARCHAR},
+      </if>
+      <if test="menuName != null">
+        #{menuName,jdbcType=VARCHAR},
+      </if>
+      <if test="remarks != null">
+        #{remarks,jdbcType=VARCHAR},
+      </if>
+      <if test="merchantId != null">
+        #{merchantId,jdbcType=VARCHAR},
+      </if>
+      <if test="appId != null">
+        #{appId,jdbcType=VARCHAR},
+      </if>
+      <if test="memberId != null">
+        #{memberId,jdbcType=VARCHAR},
+      </if>
+      <if test="aliPid != null">
+        #{aliPid,jdbcType=VARCHAR},
+      </if>
+      <if test="storeId != null">
+        #{storeId,jdbcType=VARCHAR},
+      </if>
+      <if test="agentId != null">
+        #{agentId,jdbcType=VARCHAR},
+      </if>
+      <if test="agentName != null">
+        #{agentName,jdbcType=VARCHAR},
+      </if>
+      <if test="storeType != null">
+        #{storeType,jdbcType=INTEGER},
+      </if>
+      <if test="paymentType != null">
+        #{paymentType,jdbcType=INTEGER},
+      </if>
+      <if test="merchantCode != null">
+        #{merchantCode,jdbcType=VARCHAR},
+      </if>
+      <if test="merchantCounterCode != null">
+        #{merchantCounterCode,jdbcType=VARCHAR},
+      </if>
+      <if test="theBranchCode != null">
+        #{theBranchCode,jdbcType=VARCHAR},
+      </if>
+      <if test="sysId != null">
+        #{sysId,jdbcType=VARCHAR},
+      </if>
+      <if test="huifuId != null">
+        #{huifuId,jdbcType=VARCHAR},
+      </if>
+      <if test="merchantName != null">
+        #{merchantName,jdbcType=VARCHAR},
+      </if>
+      <if test="storeName != null">
+        #{storeName,jdbcType=VARCHAR},
+      </if>
+      <if test="availableTag != null">
+        #{availableTag,jdbcType=INTEGER},
+      </if>
+      <if test="privateKeyDougong != null">
+        #{privateKeyDougong,jdbcType=VARCHAR},
+      </if>
+      <if test="publicKeyHuifu != null">
+        #{publicKeyHuifu,jdbcType=VARCHAR},
+      </if>
+      <if test="appletId != null">
+        #{appletId,jdbcType=VARCHAR},
+      </if>
+      <if test="appletSecret != null">
+        #{appletSecret,jdbcType=VARCHAR},
+      </if>
+      <if test="wechatSecret != null">
+        #{wechatSecret,jdbcType=VARCHAR},
+      </if>
+      <if test="dougongProductId != null">
+        #{dougongProductId,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+  <select id="countByExample" parameterType="com.qs.mp.pay.domain.PaymentConfigExample" resultType="java.lang.Long">
+    select count(*) from mp_payment_config
+    <if test="_parameter != null">
+      <include refid="Example_Where_Clause" />
+    </if>
+  </select>
+  <update id="updateByExampleSelective" parameterType="map">
+    update mp_payment_config
+    <set>
+      <if test="record.id != null">
+        id = #{record.id,jdbcType=VARCHAR},
+      </if>
+      <if test="record.dataOrder != null">
+        data_order = #{record.dataOrder,jdbcType=INTEGER},
+      </if>
+      <if test="record.createTime != null">
+        create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.updateTime != null">
+        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.makePerson != null">
+        make_person = #{record.makePerson,jdbcType=VARCHAR},
+      </if>
+      <if test="record.modifier != null">
+        modifier = #{record.modifier,jdbcType=VARCHAR},
+      </if>
+      <if test="record.modifierTime != null">
+        modifier_time = #{record.modifierTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.locked != null">
+        locked = #{record.locked,jdbcType=INTEGER},
+      </if>
+      <if test="record.delTag != null">
+        del_tag = #{record.delTag,jdbcType=INTEGER},
+      </if>
+      <if test="record.checkTag != null">
+        check_tag = #{record.checkTag,jdbcType=INTEGER},
+      </if>
+      <if test="record.checkStatus != null">
+        check_status = #{record.checkStatus,jdbcType=VARCHAR},
+      </if>
+      <if test="record.checkTime != null">
+        check_time = #{record.checkTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="record.checkPerson != null">
+        check_person = #{record.checkPerson,jdbcType=VARCHAR},
+      </if>
+      <if test="record.printTag != null">
+        print_tag = #{record.printTag,jdbcType=INTEGER},
+      </if>
+      <if test="record.invalidTag != null">
+        invalid_tag = #{record.invalidTag,jdbcType=INTEGER},
+      </if>
+      <if test="record.menuId != null">
+        menu_id = #{record.menuId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.menuName != null">
+        menu_name = #{record.menuName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.remarks != null">
+        remarks = #{record.remarks,jdbcType=VARCHAR},
+      </if>
+      <if test="record.merchantId != null">
+        merchant_id = #{record.merchantId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.appId != null">
+        app_id = #{record.appId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.memberId != null">
+        member_id = #{record.memberId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.aliPid != null">
+        ali_pid = #{record.aliPid,jdbcType=VARCHAR},
+      </if>
+      <if test="record.storeId != null">
+        store_id = #{record.storeId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.agentId != null">
+        agent_id = #{record.agentId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.agentName != null">
+        agent_name = #{record.agentName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.storeType != null">
+        store_type = #{record.storeType,jdbcType=INTEGER},
+      </if>
+      <if test="record.paymentType != null">
+        payment_type = #{record.paymentType,jdbcType=INTEGER},
+      </if>
+      <if test="record.merchantCode != null">
+        merchant_code = #{record.merchantCode,jdbcType=VARCHAR},
+      </if>
+      <if test="record.merchantCounterCode != null">
+        merchant_counter_code = #{record.merchantCounterCode,jdbcType=VARCHAR},
+      </if>
+      <if test="record.theBranchCode != null">
+        the_branch_code = #{record.theBranchCode,jdbcType=VARCHAR},
+      </if>
+      <if test="record.sysId != null">
+        sys_id = #{record.sysId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.huifuId != null">
+        huifu_id = #{record.huifuId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.merchantName != null">
+        merchant_name = #{record.merchantName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.storeName != null">
+        store_name = #{record.storeName,jdbcType=VARCHAR},
+      </if>
+      <if test="record.availableTag != null">
+        available_tag = #{record.availableTag,jdbcType=INTEGER},
+      </if>
+      <if test="record.privateKeyDougong != null">
+        private_key_dougong = #{record.privateKeyDougong,jdbcType=VARCHAR},
+      </if>
+      <if test="record.publicKeyHuifu != null">
+        public_key_huifu = #{record.publicKeyHuifu,jdbcType=VARCHAR},
+      </if>
+      <if test="record.appletId != null">
+        applet_id = #{record.appletId,jdbcType=VARCHAR},
+      </if>
+      <if test="record.appletSecret != null">
+        applet_secret = #{record.appletSecret,jdbcType=VARCHAR},
+      </if>
+      <if test="record.wechatSecret != null">
+        wechat_secret = #{record.wechatSecret,jdbcType=VARCHAR},
+      </if>
+      <if test="record.dougongProductId != null">
+        dougong_product_id = #{record.dougongProductId,jdbcType=VARCHAR},
+      </if>
+    </set>
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByExample" parameterType="map">
+    update mp_payment_config
+    set id = #{record.id,jdbcType=VARCHAR},
+      data_order = #{record.dataOrder,jdbcType=INTEGER},
+      create_time = #{record.createTime,jdbcType=TIMESTAMP},
+      update_time = #{record.updateTime,jdbcType=TIMESTAMP},
+      make_person = #{record.makePerson,jdbcType=VARCHAR},
+      modifier = #{record.modifier,jdbcType=VARCHAR},
+      modifier_time = #{record.modifierTime,jdbcType=TIMESTAMP},
+      locked = #{record.locked,jdbcType=INTEGER},
+      del_tag = #{record.delTag,jdbcType=INTEGER},
+      check_tag = #{record.checkTag,jdbcType=INTEGER},
+      check_status = #{record.checkStatus,jdbcType=VARCHAR},
+      check_time = #{record.checkTime,jdbcType=TIMESTAMP},
+      check_person = #{record.checkPerson,jdbcType=VARCHAR},
+      print_tag = #{record.printTag,jdbcType=INTEGER},
+      invalid_tag = #{record.invalidTag,jdbcType=INTEGER},
+      menu_id = #{record.menuId,jdbcType=VARCHAR},
+      menu_name = #{record.menuName,jdbcType=VARCHAR},
+      remarks = #{record.remarks,jdbcType=VARCHAR},
+      merchant_id = #{record.merchantId,jdbcType=VARCHAR},
+      app_id = #{record.appId,jdbcType=VARCHAR},
+      member_id = #{record.memberId,jdbcType=VARCHAR},
+      ali_pid = #{record.aliPid,jdbcType=VARCHAR},
+      store_id = #{record.storeId,jdbcType=VARCHAR},
+      agent_id = #{record.agentId,jdbcType=VARCHAR},
+      agent_name = #{record.agentName,jdbcType=VARCHAR},
+      store_type = #{record.storeType,jdbcType=INTEGER},
+      payment_type = #{record.paymentType,jdbcType=INTEGER},
+      merchant_code = #{record.merchantCode,jdbcType=VARCHAR},
+      merchant_counter_code = #{record.merchantCounterCode,jdbcType=VARCHAR},
+      the_branch_code = #{record.theBranchCode,jdbcType=VARCHAR},
+      sys_id = #{record.sysId,jdbcType=VARCHAR},
+      huifu_id = #{record.huifuId,jdbcType=VARCHAR},
+      merchant_name = #{record.merchantName,jdbcType=VARCHAR},
+      store_name = #{record.storeName,jdbcType=VARCHAR},
+      available_tag = #{record.availableTag,jdbcType=INTEGER},
+      private_key_dougong = #{record.privateKeyDougong,jdbcType=VARCHAR},
+      public_key_huifu = #{record.publicKeyHuifu,jdbcType=VARCHAR},
+      applet_id = #{record.appletId,jdbcType=VARCHAR},
+      applet_secret = #{record.appletSecret,jdbcType=VARCHAR},
+      wechat_secret = #{record.wechatSecret,jdbcType=VARCHAR},
+      dougong_product_id = #{record.dougongProductId,jdbcType=VARCHAR}
+    <if test="_parameter != null">
+      <include refid="Update_By_Example_Where_Clause" />
+    </if>
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.qs.mp.pay.domain.PaymentConfig">
+    update mp_payment_config
+    <set>
+      <if test="dataOrder != null">
+        data_order = #{dataOrder,jdbcType=INTEGER},
+      </if>
+      <if test="createTime != null">
+        create_time = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateTime != null">
+        update_time = #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="makePerson != null">
+        make_person = #{makePerson,jdbcType=VARCHAR},
+      </if>
+      <if test="modifier != null">
+        modifier = #{modifier,jdbcType=VARCHAR},
+      </if>
+      <if test="modifierTime != null">
+        modifier_time = #{modifierTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="locked != null">
+        locked = #{locked,jdbcType=INTEGER},
+      </if>
+      <if test="delTag != null">
+        del_tag = #{delTag,jdbcType=INTEGER},
+      </if>
+      <if test="checkTag != null">
+        check_tag = #{checkTag,jdbcType=INTEGER},
+      </if>
+      <if test="checkStatus != null">
+        check_status = #{checkStatus,jdbcType=VARCHAR},
+      </if>
+      <if test="checkTime != null">
+        check_time = #{checkTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="checkPerson != null">
+        check_person = #{checkPerson,jdbcType=VARCHAR},
+      </if>
+      <if test="printTag != null">
+        print_tag = #{printTag,jdbcType=INTEGER},
+      </if>
+      <if test="invalidTag != null">
+        invalid_tag = #{invalidTag,jdbcType=INTEGER},
+      </if>
+      <if test="menuId != null">
+        menu_id = #{menuId,jdbcType=VARCHAR},
+      </if>
+      <if test="menuName != null">
+        menu_name = #{menuName,jdbcType=VARCHAR},
+      </if>
+      <if test="remarks != null">
+        remarks = #{remarks,jdbcType=VARCHAR},
+      </if>
+      <if test="merchantId != null">
+        merchant_id = #{merchantId,jdbcType=VARCHAR},
+      </if>
+      <if test="appId != null">
+        app_id = #{appId,jdbcType=VARCHAR},
+      </if>
+      <if test="memberId != null">
+        member_id = #{memberId,jdbcType=VARCHAR},
+      </if>
+      <if test="aliPid != null">
+        ali_pid = #{aliPid,jdbcType=VARCHAR},
+      </if>
+      <if test="storeId != null">
+        store_id = #{storeId,jdbcType=VARCHAR},
+      </if>
+      <if test="agentId != null">
+        agent_id = #{agentId,jdbcType=VARCHAR},
+      </if>
+      <if test="agentName != null">
+        agent_name = #{agentName,jdbcType=VARCHAR},
+      </if>
+      <if test="storeType != null">
+        store_type = #{storeType,jdbcType=INTEGER},
+      </if>
+      <if test="paymentType != null">
+        payment_type = #{paymentType,jdbcType=INTEGER},
+      </if>
+      <if test="merchantCode != null">
+        merchant_code = #{merchantCode,jdbcType=VARCHAR},
+      </if>
+      <if test="merchantCounterCode != null">
+        merchant_counter_code = #{merchantCounterCode,jdbcType=VARCHAR},
+      </if>
+      <if test="theBranchCode != null">
+        the_branch_code = #{theBranchCode,jdbcType=VARCHAR},
+      </if>
+      <if test="sysId != null">
+        sys_id = #{sysId,jdbcType=VARCHAR},
+      </if>
+      <if test="huifuId != null">
+        huifu_id = #{huifuId,jdbcType=VARCHAR},
+      </if>
+      <if test="merchantName != null">
+        merchant_name = #{merchantName,jdbcType=VARCHAR},
+      </if>
+      <if test="storeName != null">
+        store_name = #{storeName,jdbcType=VARCHAR},
+      </if>
+      <if test="availableTag != null">
+        available_tag = #{availableTag,jdbcType=INTEGER},
+      </if>
+      <if test="privateKeyDougong != null">
+        private_key_dougong = #{privateKeyDougong,jdbcType=VARCHAR},
+      </if>
+      <if test="publicKeyHuifu != null">
+        public_key_huifu = #{publicKeyHuifu,jdbcType=VARCHAR},
+      </if>
+      <if test="appletId != null">
+        applet_id = #{appletId,jdbcType=VARCHAR},
+      </if>
+      <if test="appletSecret != null">
+        applet_secret = #{appletSecret,jdbcType=VARCHAR},
+      </if>
+      <if test="wechatSecret != null">
+        wechat_secret = #{wechatSecret,jdbcType=VARCHAR},
+      </if>
+      <if test="dougongProductId != null">
+        dougong_product_id = #{dougongProductId,jdbcType=VARCHAR},
+      </if>
+    </set>
+    where id = #{id,jdbcType=VARCHAR}
+  </update>
+  <update id="updateByPrimaryKey" parameterType="com.qs.mp.pay.domain.PaymentConfig">
+    update mp_payment_config
+    set data_order = #{dataOrder,jdbcType=INTEGER},
+      create_time = #{createTime,jdbcType=TIMESTAMP},
+      update_time = #{updateTime,jdbcType=TIMESTAMP},
+      make_person = #{makePerson,jdbcType=VARCHAR},
+      modifier = #{modifier,jdbcType=VARCHAR},
+      modifier_time = #{modifierTime,jdbcType=TIMESTAMP},
+      locked = #{locked,jdbcType=INTEGER},
+      del_tag = #{delTag,jdbcType=INTEGER},
+      check_tag = #{checkTag,jdbcType=INTEGER},
+      check_status = #{checkStatus,jdbcType=VARCHAR},
+      check_time = #{checkTime,jdbcType=TIMESTAMP},
+      check_person = #{checkPerson,jdbcType=VARCHAR},
+      print_tag = #{printTag,jdbcType=INTEGER},
+      invalid_tag = #{invalidTag,jdbcType=INTEGER},
+      menu_id = #{menuId,jdbcType=VARCHAR},
+      menu_name = #{menuName,jdbcType=VARCHAR},
+      remarks = #{remarks,jdbcType=VARCHAR},
+      merchant_id = #{merchantId,jdbcType=VARCHAR},
+      app_id = #{appId,jdbcType=VARCHAR},
+      member_id = #{memberId,jdbcType=VARCHAR},
+      ali_pid = #{aliPid,jdbcType=VARCHAR},
+      store_id = #{storeId,jdbcType=VARCHAR},
+      agent_id = #{agentId,jdbcType=VARCHAR},
+      agent_name = #{agentName,jdbcType=VARCHAR},
+      store_type = #{storeType,jdbcType=INTEGER},
+      payment_type = #{paymentType,jdbcType=INTEGER},
+      merchant_code = #{merchantCode,jdbcType=VARCHAR},
+      merchant_counter_code = #{merchantCounterCode,jdbcType=VARCHAR},
+      the_branch_code = #{theBranchCode,jdbcType=VARCHAR},
+      sys_id = #{sysId,jdbcType=VARCHAR},
+      huifu_id = #{huifuId,jdbcType=VARCHAR},
+      merchant_name = #{merchantName,jdbcType=VARCHAR},
+      store_name = #{storeName,jdbcType=VARCHAR},
+      available_tag = #{availableTag,jdbcType=INTEGER},
+      private_key_dougong = #{privateKeyDougong,jdbcType=VARCHAR},
+      public_key_huifu = #{publicKeyHuifu,jdbcType=VARCHAR},
+      applet_id = #{appletId,jdbcType=VARCHAR},
+      applet_secret = #{appletSecret,jdbcType=VARCHAR},
+      wechat_secret = #{wechatSecret,jdbcType=VARCHAR},
+      dougong_product_id = #{dougongProductId,jdbcType=VARCHAR}
+    where id = #{id,jdbcType=VARCHAR}
+  </update>
+</mapper>

+ 1 - 1
mp-service/src/main/resources/mapper/system/SysUserRoleMapper.xml

@@ -49,4 +49,4 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	<update id="updateUserRole" parameterType="com.qs.mp.system.domain.SysUserRole">
 		update sys_user_role set role_id = #{roleId} where user_id=#{userId}
 	</update>
-</mapper> 
+</mapper>

+ 19 - 0
pom.xml

@@ -273,6 +273,12 @@
                 <version>${mp.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>5.8.20</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 
@@ -301,6 +307,19 @@
                     <source>${java.version}</source>
                     <target>${java.version}</target>
                     <encoding>${project.build.sourceEncoding}</encoding>
+                    <compilerArgs>
+                        <arg>-extdirs</arg>
+                        <arg>${project.basedir}/libs/dougong</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <!--maven编译时将本地引用的jar包一起打包-->
+                    <includeSystemScope>true</includeSystemScope>
                 </configuration>
             </plugin>
         </plugins>