From 1443f8eb9f3b001e84f101852aa5f6ec7f49f4c9 Mon Sep 17 00:00:00 2001
From: jyy <935090232@qq.com>
Date: Fri, 09 Apr 2021 14:34:12 +0800
Subject: [PATCH] 微信储值卡充值接口

---
 zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseV2Dao.xml                                                  |    7 
 zq-erp/src/main/resources/static/demoPage/soketLoginTest.html                                                        |    3 
 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java                 |   28 ++
 zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopCouponDao.java                                                |    1 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopCouponServiceImpl.java                         |    2 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java                                        |  137 ++++++++++++++-
 zq-erp/src/main/resources/config/db/increment/推广员.sql                                                                |    5 
 zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUseFlow.java                                               |   15 +
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxUserAction.java                                          |   18 +
 zq-erp/src/main/java/com/matrix/system/hive/dao/MoneyCardUseV2Dao.java                                               |   12 +
 zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java                                     |    3 
 zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopCouponRecordDao.xml                                             |    4 
 zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseFlowDao.xml                                                |   16 +
 zq-erp/src/test/java/com/matrix/ParameterSettingsTool.java                                                           |    7 
 zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java                                            |    7 
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxMoneyCardUseAction.java                                  |  155 +++++++++++++++++
 zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopCouponRecordDao.java                                          |    1 
 zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java |    2 
 zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUse.java                                                   |   52 +++++
 zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/WxMoneyCardUseVO.java                                          |   56 ++++++
 20 files changed, 507 insertions(+), 24 deletions(-)

diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java
index b0c8126..c5961d9 100644
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java
+++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/protocol/paramProtocol/BrandWCPayRequestData.java
@@ -25,7 +25,7 @@
     private String signType = "";
     private String paySign = "";
     
-    public BrandWCPayRequestData(String prepay_id,String appID,String paySecret){
+    public BrandWCPayRequestData(String prepay_id, String appID, String paySecret){
     	//默认必须设置
         setAppId(appID);
         //随机字符串,不长于32 位
diff --git a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java
index 32ab3bb..cc168ab 100644
--- a/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java
+++ b/zq-erp/src/main/java/com/matrix/component/wechat/externalInterface/weixinUtil/WeixinServiceUtil.java
@@ -25,6 +25,7 @@
 import com.matrix.system.common.interceptor.HostInterceptor;
 import com.matrix.system.shopXcx.api.tools.WxShopOrderUtil;
 import org.apache.log4j.Logger;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -69,7 +70,25 @@
 	 * @return 预支付订单返回的结果对象(该结果对象已封装),在H5页面使用该对象信息
 	 * @throws Exception
 	 */
-	public BrandWCPayRequestData createOrder(String desc,String outTradeNo, int price, String openId,String attach) throws Exception {
+	public BrandWCPayRequestData createOrder(String desc, String outTradeNo, int price, String openId, String attach) throws Exception {
+		Long companyId=HostInterceptor.getCompanyId();
+		BusParameterSettings notifyUrl = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_NOTIFYURL, companyId);
+		return buildBrandWCPayRequestData(desc, outTradeNo, price, openId, attach, notifyUrl);
+	}
+
+	/**
+	 * 创建充值订单
+	 */
+	public BrandWCPayRequestData createRechargeOrder(String desc, String outTradeNo, int price, String openId, String attach) throws Exception {
+		Long companyId=HostInterceptor.getCompanyId();
+		BusParameterSettings notifyUrl = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_RECHARGE_NOTIFYURL, companyId);
+		return buildBrandWCPayRequestData(desc, outTradeNo, price, openId, attach, notifyUrl);
+	}
+
+
+
+	@NotNull
+	private BrandWCPayRequestData buildBrandWCPayRequestData(String desc, String outTradeNo, int price, String openId, String attach, BusParameterSettings notifyUrl) throws Exception {
 		// 创建微信支付预付接口
 		JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness();
 		String idAddr = getIpAddr(WebUtil.getRequest());
@@ -78,7 +97,7 @@
 
 		BusParameterSettings mchID = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_MCHID, companyId);
 		BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, companyId);
-		BusParameterSettings notifyUrl = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_NOTIFYURL, companyId);
+
 
 		BusParameterSettings appId = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.MINIPROGRAM_APPID, companyId);
 
@@ -102,10 +121,9 @@
 			LogUtil.error("创建微信支付订单失败msg={}",result.getReturn_msg());
 			throw new GlobleException("创建微信支付订单失败,请检查程序配置");
 		}
-
 	}
-	
-	
+
+
 	/**@Description 支付后,向微信发送请求、查询订单,看订单是否真的支付成功了
 	   @date 2017年6月27日
 	   @atuhor jiangyouyao
diff --git a/zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java b/zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java
index 538ffde..7c53969 100644
--- a/zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java
+++ b/zq-erp/src/main/java/com/matrix/system/common/constance/AppConstance.java
@@ -13,6 +13,7 @@
     public static final String ZONGDIAN = "总店";
 
 
+
     private AppConstance() {
     }
 
@@ -550,6 +551,12 @@
      */
     public static final String WECHARPAY_NOTIFYURL = "wecharPaynotifyUrl";
     /**
+     * 充值支付通知地址
+     */
+    public static final String WECHARPAY_RECHARGE_NOTIFYURL = "wecharpayRechargeNotifyurl";
+
+
+    /**
      * 支付证书地址
      */
     public static final String WECHARPAY_CERTLOCAL_PATH = "certLocalPath";
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUse.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUse.java
index c530480..d0a63cb 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUse.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUse.java
@@ -1,5 +1,6 @@
 package com.matrix.system.hive.bean;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.matrix.core.anotations.Extend;
 import com.matrix.core.tools.DateUtil;
@@ -15,18 +16,29 @@
  */
 public class MoneyCardUse  {
 
-	private static final long serialVersionUID = 1L; 
 
-	
 	private Long  id;
+
+
+	private String createBy;
+
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date createTime;
+
+	private String updateBy;
+
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date updateTime;
 
 	/**
 	 * 剩余次数
 	 */
+	@TableField(exist = false)
 	String lastCountName;
 	/**
 	 * 数据来源
 	 */
+	@TableField(exist = false)
 	String sourceName;
 
 	/*vo对象************/
@@ -98,6 +110,7 @@
 	/**
 	 * 订单ID
 	 */
+	@TableField(exist = false)
 	private Long  orderId;
 			
 	
@@ -117,6 +130,7 @@
 	/**
 	 * 前台输入的退款金额
 	 */
+	@TableField(exist = false)
 	private String returnMonery;
 
 	/**
@@ -172,6 +186,38 @@
 		return lastCountName;
 	}
 
+	public String getCreateBy() {
+		return createBy;
+	}
+
+	public void setCreateBy(String createBy) {
+		this.createBy = createBy;
+	}
+
+	public Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public String getUpdateBy() {
+		return updateBy;
+	}
+
+	public void setUpdateBy(String updateBy) {
+		this.updateBy = updateBy;
+	}
+
+	public Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
 	public void setLastCountName(String lastCountName) {
 		this.lastCountName = lastCountName;
 	}
@@ -212,12 +258,14 @@
 	/**
 	 * 会员信息
 	 */
+	@TableField(exist = false)
 	private SysVipInfo vipInfo;
 
 	/**
 	 * 调整说明
 	 */
 	@Extend
+	@TableField(exist = false)
 	private String changeRemark;
 
 
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUseFlow.java b/zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUseFlow.java
index 8bb8780..80a097b 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUseFlow.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/bean/MoneyCardUseFlow.java
@@ -27,7 +27,12 @@
 	 * 订单编号
 	 */
 	private String  orderNo;
-			
+
+	/**
+	 * 微信支付编号
+	 */
+	private String  payNo;
+
 	
 	/**
 	 * 操作员id
@@ -235,4 +240,12 @@
 	public void setTimes(Integer times) {
 		this.times = times;
 	}
+
+	public String getPayNo() {
+		return payNo;
+	}
+
+	public void setPayNo(String payNo) {
+		this.payNo = payNo;
+	}
 }
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/dao/MoneyCardUseV2Dao.java b/zq-erp/src/main/java/com/matrix/system/hive/dao/MoneyCardUseV2Dao.java
new file mode 100644
index 0000000..741d039
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/hive/dao/MoneyCardUseV2Dao.java
@@ -0,0 +1,12 @@
+package com.matrix.system.hive.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.matrix.system.hive.bean.MoneyCardUse;
+
+/**
+ * @description 订单表
+ */
+public interface MoneyCardUseV2Dao extends BaseMapper<MoneyCardUse> {
+
+
+}
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
index 77f19f6..647ead9 100644
--- a/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/hive/service/imp/SysOrderServiceImpl.java
@@ -680,7 +680,7 @@
             ShoppingGoods goods = shoppingGoodsDao.selectById(goodsId);
             flow.setFlowContent(goods.getName() + "等" + sourceOrder.getItems().size() + "件产品");
             // 若是退款,则取负数
-            if (SysOrder.ORDER_TYPE_REFUND == sourceOrder.getOrderType()) {
+            if (SysOrder.ORDER_TYPE_REFUND== sourceOrder.getOrderType()) {
                 flow.setFlowType(SysOrderFlow.FLOW_TYPE_REFUND);
                 flow.setAmount(flow.getAmount().negate());
                 flow.setOrderId(sourceOrder.getOldOrderId());
@@ -1331,6 +1331,7 @@
         order.setRemark(cardUser.getCardName());
         order.setStaffId(user.getSuId());
         order.setIsCross(2 + "");
+        order.setOrderType(SysOrder.ORDER_TYPE_SEAL);
         order.setStatu(Dictionary.ORDER_STATU_YFK);
         order.setCompanyId(user.getCompanyId());
         sysOrderDao.insert(order);
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java
index d5423a3..5246abe 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxCommonAction.java
@@ -10,9 +10,12 @@
 import com.matrix.system.common.bean.BusParameterSettings;
 import com.matrix.system.common.constance.AppConstance;
 import com.matrix.system.common.dao.BusParameterSettingsDao;
+import com.matrix.system.hive.bean.MoneyCardUse;
+import com.matrix.system.hive.bean.MoneyCardUseFlow;
 import com.matrix.system.hive.bean.SysVipInfo;
+import com.matrix.system.hive.dao.MoneyCardUseDao;
+import com.matrix.system.hive.dao.MoneyCardUseFlowDao;
 import com.matrix.system.hive.dao.SysVipInfoDao;
-import com.matrix.system.score.entity.ScoreVipDetail;
 import com.matrix.system.score.service.ScoreVipDetailService;
 import com.matrix.system.shopXcx.bean.ShopActivitiesGroupJoin;
 import com.matrix.system.shopXcx.bean.ShopActivitiesGroupJoinUser;
@@ -90,11 +93,6 @@
     private String evn;
     /**
      * 微信支付回调接口
-     *
-     * @param response
-     * @param request
-     * @throws IOException
-     * @throws Exception
      */
     @Transactional(rollbackFor = Exception.class)
     @RequestMapping(value = "/wxapi/wxpayCallback")
@@ -206,7 +204,7 @@
                             resXml = AppConstance.RESULT_XML_SUCCESS;
 
                             //支付记录
-                            recordPayLog(Integer.valueOf(orderId), payMoney, order, payLog, "支付成功", ShopOrder.ORDER_PAY_STATUS_SUCCESS);
+                            recordPayLog(Integer.valueOf(orderId), 1, order.getOrderNo(), payMoney,  payLog, "支付成功", ShopOrder.ORDER_PAY_STATUS_SUCCESS);
 
 
                         } else {
@@ -245,12 +243,131 @@
 
     }
 
-    private void recordPayLog(Integer orderId, BigDecimal payMoney, ShopOrder order, ShopPayLog payLog, String payRemark, int payStatus) {
+
+    @Autowired
+    MoneyCardUseFlowDao moneyCardUseFlowDao;
+
+    @Autowired
+    MoneyCardUseDao moneyCardUseDao;
+
+    /**
+     * 微信充值回调
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @RequestMapping(value = "/wxapi/rechargeCallBack")
+    public void rechargeCallBack(HttpServletResponse response, HttpServletRequest request) throws IOException {
+        LogUtil.info("微信充值回调start....");
+
+        // 获取输入参数
+        String inputLine;
+        StringBuffer notityXml = new StringBuffer();
+        String resXml = "";
+        String moneyCardUseFlowId = "";
+
+        AjaxResult threadResult = new AjaxResult(AjaxResult.STATUS_SUCCESS, "");
+        try {
+            while ((inputLine = request.getReader().readLine()) != null) {
+                notityXml.append(inputLine);
+            }
+            request.getReader().close();
+            LogUtil.info("notityXml ---- :{} ", notityXml);
+
+
+            // XMl转对象
+            Object bb = Util.getObjectFromXML(notityXml.toString(), NotifyData.class);
+            NotifyData    data = new NotifyData();
+            BeanUtils.copyProperties(bb,data);
+            LogUtil.info("----return_code = {}", data.getReturn_code());
+
+
+            // 返回状态码 SUCCESS/FAIL
+            if (AppConstance.CODE_SUCCESS.equals(data.getReturn_code())) {
+
+                moneyCardUseFlowId = data.getAttach();
+                // 检验订单状态
+                MoneyCardUseFlow moneyCardUseFlow = moneyCardUseFlowDao.selectById(Long.valueOf(moneyCardUseFlowId));
+                SysVipInfo user=sysVipInfoDao.selectById(moneyCardUseFlow.getVipId());
+
+                // 校验签名
+                BusParameterSettings paySecret = busParameterSettingsDao.selectCompanyParamByCode(AppConstance.WECHARPAY_SECRET, user.getCompanyId());
+                if (Signature.checkIsSignValidFromResponseString(notityXml.toString(),paySecret.getParamValue())) {
+                    // 校验业务结果
+                    if (AppConstance.CODE_SUCCESS.equals(data.getResult_code())) {
+                        // 返回SUCCESS报文
+                        resXml = AppConstance.RESULT_XML_SUCCESS;
+                        // 支付费用
+                        Double total_fee = Double.parseDouble(data.getTotal_fee());
+                        // 商户订单号
+                        String payNum = data.getOut_trade_no();
+
+                        LogUtil.info("支付回调关键信息---total_fee:{},payNum:{},moneyCardUseFlowId:{}", total_fee, payNum, moneyCardUseFlowId);
+                        // 订单ID
+                        Double payMoney = new BigDecimal(total_fee).divide(new BigDecimal(100), 2,
+                                BigDecimal.ROUND_HALF_DOWN).doubleValue();
+
+                        if (moneyCardUseFlow.getCarUseId()==null) {
+                            ShopPayLog payLog = new ShopPayLog();
+                            if(payMoney==moneyCardUseFlow.getTotal()){
+                                threadResult.putInMap("status", "success");
+                                resXml = AppConstance.RESULT_XML_SUCCESS;
+                                MoneyCardUse moneyCardUse = moneyCardUseDao.selectVipCard(user.getId());
+                                moneyCardUseFlow.setCarUseId(moneyCardUse.getId());
+                                moneyCardUseFlow.setCardName(moneyCardUse.getCardName());
+                                moneyCardUseFlow.setBalance(moneyCardUse.getGiftMoney() + moneyCardUse.getRealMoney());
+                                moneyCardUseFlowDao.update(moneyCardUseFlow);
+                                //充值记录
+                                recordPayLog(Integer.valueOf(moneyCardUseFlowId),2,moneyCardUseFlow.getPayNo(),new BigDecimal(payMoney),  payLog, "充值成功", ShopOrder.ORDER_PAY_STATUS_SUCCESS);
+                            }else{
+                                LogUtil.debug("支付金额不一致,检查支付金额payMoney={},order.getPayMoney()={}", payMoney, moneyCardUseFlow.getTotal());
+                                threadResult.putInMap("status", "err");
+                                threadResult.putInMap("msg", "支付金额不一致");
+                                resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "微信标识业务是失败");
+                            }
+
+                        } else {
+                            LogUtil.info("充值已经确认");
+                        }
+
+                    } else {
+                        LogUtil.info("微信标识业务是失败");
+                        threadResult.putInMap("status", "err");
+                        threadResult.putInMap("msg", "查询支付信息失败,请联系客服或者刷新支付信息(错误码:001)");
+                        resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "微信标识业务是失败");
+                    }
+                } else {
+                    LogUtil.info("无效签名");
+                    threadResult.putInMap("status", "err");
+                    threadResult.putInMap("msg", "查询支付信息失败,请联系客服或者刷新支付信息(错误码:002)");
+                    resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "微信标识业务是失败");
+                }
+            } else {
+                LogUtil.info("通信标识失败");
+                threadResult.putInMap("status", "err");
+                threadResult.putInMap("msg", "查询支付信息失败,请联系客服或者刷新支付信息(错误码:003)");
+                resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "通信标识失败");
+            }
+        } catch (Exception e) {
+            LogUtil.error("支付回调签名错误", e);
+            threadResult.putInMap("status", "err");
+            threadResult.putInMap("msg", "查询支付信息失败,请联系客服或者刷新支付信息(错误码:004)");
+            resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "支付回调签名错误");
+        } finally {
+            // 通知线程消息
+            PayThreadPool.notifyThread(Integer.valueOf(moneyCardUseFlowId), threadResult);
+            sendResultBack(response, resXml);
+        }
+        return;
+
+    }
+
+
+
+    private void recordPayLog(Integer orderId, Integer type,String orderNo, BigDecimal payMoney, ShopPayLog payLog, String payRemark, int payStatus) {
         //设置支付类型为收款
-        payLog.setPayType(1);
+        payLog.setPayType(type);
         payLog.setJoinId(orderId);
         payLog.setPayMoney(payMoney);
-        payLog.setPayOrderNo(order.getOrderNo());
+        payLog.setPayOrderNo(orderNo);
         payLog.setPayRemark(payRemark);
         payLog.setPayStatus(payStatus);
         payLog.setCreateBy(AppConstance.SYSTEM_USER);
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxMoneyCardUseAction.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxMoneyCardUseAction.java
new file mode 100644
index 0000000..e090630
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxMoneyCardUseAction.java
@@ -0,0 +1,155 @@
+package com.matrix.system.shopXcx.api.action;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.matrix.component.redis.RedisUserLoginUtils;
+import com.matrix.component.wechat.externalInterface.protocol.paramProtocol.BrandWCPayRequestData;
+import com.matrix.component.wechat.externalInterface.weixinUtil.WeixinServiceUtil;
+import com.matrix.core.pojo.AjaxResult;
+import com.matrix.core.pojo.BasePageQueryDto;
+import com.matrix.core.pojo.PaginationVO;
+import com.matrix.core.tools.LogUtil;
+import com.matrix.core.tools.StringUtils;
+import com.matrix.system.hive.bean.MoneyCardUse;
+import com.matrix.system.hive.bean.MoneyCardUseFlow;
+import com.matrix.system.hive.bean.SysVipInfo;
+import com.matrix.system.hive.dao.MoneyCardUseFlowDao;
+import com.matrix.system.hive.dao.MoneyCardUseV2Dao;
+import com.matrix.system.hive.service.CodeService;
+import com.matrix.system.shopXcx.api.vo.WxMoneyCardUseVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author jyy
+ * @date 2021-04-09
+ **/
+@Api(tags = "会员储值卡")
+@RestController
+@RequestMapping(value = "/wxapi/moneyCardUse")
+public class WxMoneyCardUseAction {
+
+    @Autowired
+    WeixinServiceUtil weixinServiceUtil;
+
+
+    @Autowired
+    private MoneyCardUseV2Dao moneyCardUseV2Dao;
+
+    @Autowired
+    private RedisUserLoginUtils redisUserLoginUtils;
+
+    @Autowired
+    MoneyCardUseFlowDao moneyCardUseFlowDao;
+
+    @Autowired
+    CodeService codeService;
+
+    @ApiOperation(value = "查询会员储值卡", notes = "")
+    @GetMapping(value = "/getUserMoneyCardUseList")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = WxMoneyCardUseVO.class)
+    })
+    public AjaxResult getUserMoneyCardUseList(@RequestBody @Validated BasePageQueryDto pageDto) {
+        SysVipInfo sysVipInfo = redisUserLoginUtils.getLoginUser(SysVipInfo.class);
+        QueryWrapper queryWrapper = new QueryWrapper();
+        queryWrapper.eq("vip_id", sysVipInfo.getId());
+        IPage<MoneyCardUse> page = new Page<>(pageDto.getPageNum(), pageDto.getPageSize());
+        IPage pageList = moneyCardUseV2Dao.selectPage(page, queryWrapper);
+        List<WxMoneyCardUseVO> rows = (List<WxMoneyCardUseVO>) pageList.getRecords().stream().map(item -> {
+            WxMoneyCardUseVO vo = new WxMoneyCardUseVO();
+            BeanUtils.copyProperties(item, vo);
+            return vo;
+        }).collect(Collectors.toList());
+        return AjaxResult.buildSuccessInstance(rows);
+    }
+
+    @ApiOperation(value = "创建储值卡充值预付单", notes = "传入参数 {rechargeAmount:10} 最少充值1元,最多2位小数 ")
+    @PostMapping(value = "/createRechargeOrder")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = AjaxResult.class)
+    })
+    public AjaxResult createRechargeOrder(@RequestBody Map<String, String> param) throws Exception {
+
+        String rechargeAmount = param.get("rechargeAmount");
+        if (StringUtils.isBlank(rechargeAmount)) {
+            return AjaxResult.buildFailInstance("去输入充值金额");
+        }
+        double total = new BigDecimal(rechargeAmount).setScale(2, BigDecimal.ROUND_HALF_DOWN).doubleValue();
+        if (total < 0.02) {
+            return AjaxResult.buildFailInstance("充值金额最底1元");
+        }
+        SysVipInfo sysVipInfo = redisUserLoginUtils.getLoginUser(SysVipInfo.class);
+        MoneyCardUseFlow moneyCardUseFlow = new MoneyCardUseFlow();
+        moneyCardUseFlow.setVipId(sysVipInfo.getId());
+        moneyCardUseFlow.setPayNo(codeService.get32LenNumberCode());
+        moneyCardUseFlow.setTotal(total);
+        moneyCardUseFlow.setCreateTime(new Date());
+        moneyCardUseFlow.setType(MoneyCardUseFlow.USE_TYPE_CZ);
+        moneyCardUseFlowDao.insert(moneyCardUseFlow);
+        moneyCardUseFlow.setContent("微信充值");
+        BrandWCPayRequestData payData = weixinServiceUtil.createRechargeOrder("储值卡充值", moneyCardUseFlow.getPayNo(),
+                (int) (moneyCardUseFlow.getTotal() * 100), sysVipInfo.getOpenId(), String.valueOf(moneyCardUseFlow.getId()));
+        AjaxResult result = AjaxResult.buildSuccessInstance(payData);
+        result.putInMap("orderId", moneyCardUseFlow.getId());
+        return result;
+    }
+
+    @ApiOperation(value = "查询充值结果", notes = " ")
+    @GetMapping(value = "/getRechargePayStatus/{orderId}")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = AjaxResult.class)
+    })
+    public AjaxResult getRechargePayStatus(@PathVariable Long orderId) {
+        AjaxResult result =AjaxResult.buildSuccessInstance("查询成功");
+        MoneyCardUseFlow moneyCardUseFlow = moneyCardUseFlowDao.selectById(orderId);
+        if (moneyCardUseFlow.getCarUseId() != null) {
+            result.putInMap("status", "success");
+            result.putInMap("msg", "支付成功");
+        } else {
+            LogUtil.debug("充值等待支付中={}。。。", orderId);
+            PayThreadPool.waitThread(orderId.intValue(), new Object());
+            result = PayThreadPool.getThreadResult(orderId.intValue());
+            LogUtil.debug("充值订单支付完成={}。。。", orderId);
+        }
+        return result;
+    }
+
+
+
+    @ApiOperation(value = "查询会员储值卡充值使用记录", notes = "keywords 传入会员卡ID")
+    @GetMapping(value = "/getRechargeList")
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "ok", response = MoneyCardUseFlow.class)
+    })
+    public AjaxResult getRechargeList(@RequestBody @Validated BasePageQueryDto pageDto) {
+        if(StringUtils.isBlank(pageDto.getKeywords())){
+            return AjaxResult.buildFailInstance("keywords参数是必须的");
+        }
+        PaginationVO pageVo = new PaginationVO();
+        pageVo.setOffset((pageDto.getPageNum() - 1) * pageDto.getPageSize());
+        pageVo.setLimit(pageDto.getPageSize());
+        SysVipInfo sysVipInfo = redisUserLoginUtils.getLoginUser(SysVipInfo.class);
+        MoneyCardUseFlow moneyCardUseFlow=new MoneyCardUseFlow();
+        moneyCardUseFlow.setVipId(sysVipInfo.getId());
+        moneyCardUseFlow.setCarUseId(Long.parseLong(pageDto.getKeywords()));
+        List<MoneyCardUseFlow> dataList = moneyCardUseFlowDao.selectInPage(moneyCardUseFlow, pageVo);
+        return AjaxResult.buildSuccessInstance(dataList, moneyCardUseFlowDao.selectTotalRecord(moneyCardUseFlow));
+    }
+
+
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxUserAction.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxUserAction.java
index 9cac99e..c4c6da2 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxUserAction.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/action/WxUserAction.java
@@ -18,10 +18,13 @@
 import com.matrix.system.fenxiao.entity.ShopSalesmanApply;
 import com.matrix.system.fenxiao.service.ShopSalesmanApplyService;
 import com.matrix.system.hive.bean.SysVipInfo;
+import com.matrix.system.hive.dao.MoneyCardUseDao;
 import com.matrix.system.hive.dao.SysVipInfoDao;
 import com.matrix.system.hive.service.SysVipInfoService;
+import com.matrix.system.score.dao.ScoreVipDetailDao;
 import com.matrix.system.shopXcx.api.WeChatApiTools;
 import com.matrix.system.shopXcx.api.dto.XcxUserSaveUserInfoDto;
+import com.matrix.system.shopXcx.dao.ShopCouponRecordDao;
 import net.sf.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -58,6 +61,11 @@
     @Autowired
     WeChatApiTools weChatApiTools;
 
+    @Autowired
+    private ScoreVipDetailDao scoreVipDetailDao;
+
+    @Autowired
+    private MoneyCardUseDao moneyCardUseDao;
 
     @Autowired
     private WeixinServiceUtil weixinServiceUtil;
@@ -134,6 +142,9 @@
         return res;
     }
 
+    @Autowired
+    ShopCouponRecordDao shopCouponRecordDao;
+
     /**
      * 查询用户信息
      */
@@ -141,9 +152,12 @@
     public @ResponseBody
     AjaxResult findUserInfo() {
         SysVipInfo loginUser = redisUserLoginUtils.getLoginUser(SysVipInfo.class);
-        String openId = loginUser.getOpenId();
-        SysVipInfo sysVipInfo = sysVipInfoService.findByOpenId(openId);
+        SysVipInfo sysVipInfo = sysVipInfoService.findById(loginUser.getId());
+        sysVipInfo.setPointAll(scoreVipDetailDao.selectUserTotalScore(loginUser.getId()));
+        sysVipInfo.setBalance(moneyCardUseDao.selectVipCardTotalMoney(loginUser.getId()));
         AjaxResult res = new AjaxResult();
+        res.putInMap("couponCount", shopCouponRecordDao.countUnuseCouponRecord(loginUser.getId()));
+        res.putInMap("prizeCount",0);
         res.putInMap("userInfo", sysVipInfo);
         res.setStatus(AjaxResult.STATUS_SUCCESS);
         return res;
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopCouponServiceImpl.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopCouponServiceImpl.java
index 4c5f062..d2840d3 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopCouponServiceImpl.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/service/impl/WxShopCouponServiceImpl.java
@@ -157,7 +157,7 @@
     }
 
     /**
-     * 领取优惠券
+     *
      *
      * @param couponId
      * @return
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/WxMoneyCardUseVO.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/WxMoneyCardUseVO.java
new file mode 100644
index 0000000..f5d9b25
--- /dev/null
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/api/vo/WxMoneyCardUseVO.java
@@ -0,0 +1,56 @@
+package com.matrix.system.shopXcx.api.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.matrix.core.tools.DateUtil;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @author jyy
+ * @date 2020-04-21 11:36
+ **/
+@Data
+@ApiModel(value = "WxMoneyCardUseVO", description = "储值卡展示类")
+public class WxMoneyCardUseVO   {
+
+    @ApiModelProperty(value ="储值卡ID")
+    private Long  id;
+
+
+    @ApiModelProperty(value ="储值卡名称")
+    private String cardName;
+
+    @ApiModelProperty(value ="失效时间")
+    @JsonFormat(pattern = DateUtil.DATE_FORMAT_DD, timezone = "GMT+8")
+    @DateTimeFormat(pattern= DateUtil.DATE_FORMAT_DD)
+    private Date failTime;
+
+    @ApiModelProperty(value ="状态,有效,无效,转让,冻结,退款")
+    private String  status;
+
+
+    @ApiModelProperty(value ="总次数")
+    private Integer  useTotal;
+
+    @ApiModelProperty(value ="剩余次数")
+    private Integer  lastCount;
+
+    @ApiModelProperty(value ="来源,购买,转让,赠送")
+    private String  source;
+
+
+    @ApiModelProperty(value ="本金")
+    private Double  realMoney;
+
+
+    @ApiModelProperty(value ="赠送金额")
+    private Double  giftMoney;
+
+    @ApiModelProperty(value ="是会籍卡? Y 是,N否")
+    private String  isVipCar;
+
+}
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopCouponDao.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopCouponDao.java
index 589f88f..f92e198 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopCouponDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopCouponDao.java
@@ -58,4 +58,5 @@
 	public List<ShopCoupon> selectHdListByProductId(@Param("productId") Integer productId, @Param("attrIds") List<String> attrIds, @Param("companyId")Long companyId);
 
     ShopCoupon getCouponByTitle(@Param("title")String title, @Param("companyId")Long companyId);
+
 }
\ No newline at end of file
diff --git a/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopCouponRecordDao.java b/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopCouponRecordDao.java
index fd8cce2..0f316fc 100644
--- a/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopCouponRecordDao.java
+++ b/zq-erp/src/main/java/com/matrix/system/shopXcx/dao/ShopCouponRecordDao.java
@@ -48,4 +48,5 @@
 
 	List<CouponReceiveInfoVO> selectMyPastCoupon(@Param("companyId")Long shopId, @Param("userId") Long userId, @Param("pageVo") PaginationVO pageVo);
 
+	int countUnuseCouponRecord(Long id);
 }
\ No newline at end of file
diff --git "a/zq-erp/src/main/resources/config/db/increment/\346\216\250\345\271\277\345\221\230.sql" "b/zq-erp/src/main/resources/config/db/increment/\346\216\250\345\271\277\345\221\230.sql"
index a4ff4a9..d29024c 100644
--- "a/zq-erp/src/main/resources/config/db/increment/\346\216\250\345\271\277\345\221\230.sql"
+++ "b/zq-erp/src/main/resources/config/db/increment/\346\216\250\345\271\277\345\221\230.sql"
@@ -223,6 +223,11 @@
 ADD COLUMN `self_commission`  double(20,2) NULL COMMENT '自购返佣比例%' AFTER `company_id`;
 
 
+ALTER TABLE `money_card_use_flow`
+ADD COLUMN `pay_no`  varchar(32) NULL COMMENT '微信充值订单号';
+
+
+
 
 ALTER TABLE `sys_vip_info`
     ADD COLUMN `fenxiao_state` int(11) NULL DEFAULT NULL COMMENT '分销审核状态' AFTER `recommend_id`,
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseFlowDao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseFlowDao.xml
index a40157c..0c36b69 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseFlowDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseFlowDao.xml
@@ -7,6 +7,7 @@
 	<resultMap type="com.matrix.system.hive.bean.MoneyCardUseFlow" id="MoneyCardUseFlowMap">
 		<id property="id" column="id" />
 		<result property="orderNo" column="order_no" />
+		<result property="payNo" column="pay_no" />
 		<result property="operationId" column="operation_id" />
 		<result property="content" column="content" />
 		<result property="createTime" column="create_time" />
@@ -31,6 +32,7 @@
 	<resultMap type="com.matrix.system.hive.bean.MoneyCardUseFlow" id="MoneyCardUseFlowSimpleMap">
 		<id property="id" column="id" />
 		<result property="orderNo" column="order_no" />
+		<result property="payNo" column="pay_no" />
 		<result property="operationId" column="operation_id" />
 		<result property="content" column="content" />
 		<result property="createTime" column="create_time" />
@@ -51,6 +53,7 @@
 		INSERT INTO money_card_use_flow (
 		id,
 		order_no,
+		pay_no,
 		operation_id,
 		content,
 		create_time,
@@ -66,6 +69,7 @@
 		VALUES (
 		#{id},
 		#{orderNo},
+		#{payNo},
 		#{operationId},
 		#{content},
 		#{createTime},
@@ -149,6 +153,7 @@
 		select
 		id,
 		order_no,
+		pay_no,
 		operation_id,
 		content,
 		create_time,
@@ -171,6 +176,9 @@
 			</if>
 			<if test="record.orderNo != null and record.orderNo !='' ">
 				and order_no = #{record.orderNo}
+			</if>
+			<if test="record.payNo != null and record.payNo !='' ">
+				and pay_no = #{record.payNo}
 			</if>
 			<if test="record.operationId != null and record.operationId !='' ">
 				and operation_id = #{record.operationId}
@@ -215,6 +223,9 @@
 			<if test="record.orderNo != null and record.orderNo !='' ">
 				and order_no = #{record.orderNo}
 			</if>
+			<if test="record.payNo != null and record.payNo !='' ">
+				and pay_no = #{record.payNo}
+			</if>
 			<if test="record.operationId != null and record.operationId !='' ">
 				and operation_id = #{record.operationId}
 			</if>
@@ -245,6 +256,7 @@
 		select
 		id,
 		order_no,
+		pay_no,
 		operation_id,
 		content,
 		create_time,
@@ -269,6 +281,7 @@
 		select
 		id,
 		order_no,
+		pay_no,
 		operation_id,
 		content,
 		create_time,
@@ -292,6 +305,9 @@
 			<if test="record.orderNo != null and record.orderNo !='' ">
 				and order_no = #{record.orderNo}
 			</if>
+			<if test="record.payNo != null and record.payNo !='' ">
+				and pay_no = #{record.payNo}
+			</if>
 			<if test="record.operationId != null and record.operationId !='' ">
 				and operation_id = #{record.operationId}
 			</if>
diff --git a/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseV2Dao.xml b/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseV2Dao.xml
new file mode 100644
index 0000000..86ef51f
--- /dev/null
+++ b/zq-erp/src/main/resources/mybatis/mapper/hive/MoneyCardUseV2Dao.xml
@@ -0,0 +1,7 @@
+<?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.matrix.system.hive.dao.MoneyCardUseV2Dao">
+
+</mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopCouponRecordDao.xml b/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopCouponRecordDao.xml
index cbb939b..4a915c2 100644
--- a/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopCouponRecordDao.xml
+++ b/zq-erp/src/main/resources/mybatis/mapper/xcxShop/ShopCouponRecordDao.xml
@@ -311,4 +311,8 @@
         </if>
     </select>
 
+    <select id="countUnuseCouponRecord" resultType="java.lang.Integer">
+        select  count(*) from shop_coupon_record where user_id = #{userId} and   is_using = 2
+    </select>
+
 </mapper>
\ No newline at end of file
diff --git a/zq-erp/src/main/resources/static/demoPage/soketLoginTest.html b/zq-erp/src/main/resources/static/demoPage/soketLoginTest.html
index 50de183..0598c8d 100644
--- a/zq-erp/src/main/resources/static/demoPage/soketLoginTest.html
+++ b/zq-erp/src/main/resources/static/demoPage/soketLoginTest.html
@@ -82,7 +82,8 @@
                 console.log("您的浏览器支持WebSocket");
                 //实现化WebSocket对象,指定要连接的服务器地址与端口  建立连接
 
-                var socketUrl="ws://localhost:8080/webSocketServer?userId=123";
+                //var socketUrl="ws://test.hive.jyymatrix.cc/webSocketServer?userId=123";
+                var socketUrl="ws://192.168.0.6:8080/webSocketServer?userId=123";
                 console.log(socketUrl);
                 if(socket!=null){
                     socket.close();
diff --git a/zq-erp/src/test/java/com/matrix/ParameterSettingsTool.java b/zq-erp/src/test/java/com/matrix/ParameterSettingsTool.java
index 9868e2b..a29c349 100644
--- a/zq-erp/src/test/java/com/matrix/ParameterSettingsTool.java
+++ b/zq-erp/src/test/java/com/matrix/ParameterSettingsTool.java
@@ -61,6 +61,13 @@
 		newSetting2.setCategory("仓库设置");
 		newSettings.add(newSetting2);
 
+		ParameterSettings newSetting3=new ParameterSettings();
+		newSetting3.setCode(AppConstance.WECHARPAY_RECHARGE_NOTIFYURL);
+		newSetting3.setName("储值卡充值回调地址");
+		newSetting3.setType(1);
+		newSetting3.setCategory("微信开发配置");
+		newSettings.add(newSetting3);
+
 
 
 

--
Gitblit v1.9.1