From 1a66508ad3d73dcc456162c553b03f2208570b51 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Wed, 31 Aug 2022 16:15:54 +0800
Subject: [PATCH] 20220822

---
 src/main/java/cc/mrbird/febs/mall/controller/AdminMallTeamLeaderController.java |   32 ++++
 src/main/java/cc/mrbird/febs/mall/dto/ApiRechargeWalletDto.java                 |   19 ++
 src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java               |    2 
 src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java                    |    6 
 src/main/java/cc/mrbird/febs/mall/controller/ViewMallTeamLeaderController.java  |   32 ++--
 src/main/resources/application-prod.yml                                         |    1 
 src/main/resources/application-test.yml                                         |    1 
 src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java            |    2 
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java    |   25 +++
 src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java           |    7 
 src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java               |  107 +++++++++++++++
 src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java       |    6 
 src/main/java/cc/mrbird/febs/mall/vo/AdminLeaderBonusSettingVo.java             |   13 +
 src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java          |    3 
 src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java            |   32 ++++
 src/main/resources/application-dev.yml                                          |    1 
 src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java                    |    5 
 src/main/resources/mapper/modules/MallMoneyFlowMapper.xml                       |    5 
 src/main/resources/templates/febs/views/modules/leader/leaderBonusSetting.html  |   72 ++++++++++
 src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java               |    2 
 20 files changed, 350 insertions(+), 23 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
index 936282e..46fea59 100644
--- a/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
@@ -14,6 +14,9 @@
     //范围参数
     RANGE_SWITCH("RANGE_SETTING", "RANGE_SWITCH"),
     RANGE_SIZE("RANGE_SETTING", "RANGE_SIZE"),
+    //团长返利参数
+    BONUS_SWITCH("LEADERBONUS_SETTING", "BONUS_SWITCH"),
+    BONUS_PERCENT("LEADERBONUS_SETTING", "BONUS_PERCENT"),
 
     SCORE_SIGN_SETTING("SCORE_SETTING", "SCORE_SIGN_SETTING"),
     STATIC_BONUS("BONUS_TYPE", "STATIC_BONUS"),
diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
index 7af4142..fde427e 100644
--- a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
@@ -88,7 +88,12 @@
     /**
      * 抽奖
      */
-    PRIZE(17);
+    PRIZE(17),
+
+    /**
+     * 充值
+     */
+    RECHARGE(18);
 
     private final int value;
 
diff --git a/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java b/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java
index 1077d2d..a261795 100644
--- a/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java
+++ b/src/main/java/cc/mrbird/febs/common/properties/XcxProperties.java
@@ -16,6 +16,8 @@
     private String xcxSecret;
 
     private String wecharPaynotifyUrl;
+
+    private String wecharRechargePaynotifyUrl;
     //测试支付的开关,true:支付0.01元
     private Boolean debug;
     //支付证书地址
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallTeamLeaderController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallTeamLeaderController.java
index f1ae202..add177a 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallTeamLeaderController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallTeamLeaderController.java
@@ -4,14 +4,15 @@
 import cc.mrbird.febs.common.controller.BaseController;
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
 import cc.mrbird.febs.mall.dto.AdminLeaderAddDto;
 import cc.mrbird.febs.mall.dto.AdminLeaderUpdateDto;
 import cc.mrbird.febs.mall.dto.ApiApplayLeaderDto;
-import cc.mrbird.febs.mall.entity.MallGoodsCategory;
-import cc.mrbird.febs.mall.entity.MallLeaderStock;
-import cc.mrbird.febs.mall.entity.MallMember;
-import cc.mrbird.febs.mall.entity.MallTeamLeader;
+import cc.mrbird.febs.mall.entity.*;
+import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
 import cc.mrbird.febs.mall.service.IAdminMallTeamLeaderService;
+import cc.mrbird.febs.mall.vo.AdminLeaderBonusSettingVo;
+import cc.mrbird.febs.mall.vo.AdminRangeSettingVo;
 import cc.mrbird.febs.mall.vo.AdminSelectListLeaderVo;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -32,6 +33,7 @@
 
 
     private final IAdminMallTeamLeaderService iAdminMallTeamLeaderService;
+    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
 
     /**
      * 团长信息--列表
@@ -91,4 +93,26 @@
         return new FebsResponse().success().data(dataTable);
     }
 
+
+
+    /**
+     * 团长每日分成设置 -- 更新
+     */
+    @PostMapping(value = "/leaderBonusSetUpdate")
+    public FebsResponse leaderBonusSetUpdate(AdminLeaderBonusSettingVo adminLeaderBonusSettingVo) {
+        Integer bonusSwitch = adminLeaderBonusSettingVo.getBonusSwitch();
+        DataDictionaryCustom bonusSwitchDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.BONUS_SWITCH.getType(), DataDictionaryEnum.BONUS_SWITCH.getCode());
+        bonusSwitchDic.setValue(bonusSwitch.toString());
+        dataDictionaryCustomMapper.updateById(bonusSwitchDic);
+
+        Double bonusPercent = adminLeaderBonusSettingVo.getBonusPercent();
+        if(1 <= bonusPercent || 0 >= bonusPercent){
+            return new FebsResponse().fail().message("请输入合适的百分比小数");
+        }
+        DataDictionaryCustom bonusPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.BONUS_PERCENT.getType(), DataDictionaryEnum.BONUS_PERCENT.getCode());
+        bonusPercentDic.setValue(bonusPercent.toString());
+        dataDictionaryCustomMapper.updateById(bonusPercentDic);
+        return new FebsResponse().success();
+    }
+
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
index 034e190..79d6d3f 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
@@ -186,4 +186,10 @@
         return null;
     }
 
+    @ApiOperation(value = "充值余额")
+    @PostMapping(value = "/rechargeWallet")
+    public FebsResponse rechargeWallet(@RequestBody @Validated ApiRechargeWalletDto apiRechargeWalletDto) {
+        return memberService.rechargeWallet(apiRechargeWalletDto);
+    }
+
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallTeamLeaderController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallTeamLeaderController.java
index ed1ab23..18c4ba6 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallTeamLeaderController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallTeamLeaderController.java
@@ -5,11 +5,10 @@
 import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
 import cc.mrbird.febs.common.utils.FebsUtil;
 import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
-import cc.mrbird.febs.mall.service.IAdminMallOrderService;
+import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
 import cc.mrbird.febs.mall.service.IAdminMallTeamLeaderService;
-import cc.mrbird.febs.mall.vo.AdminMallOrderVo;
+import cc.mrbird.febs.mall.vo.AdminLeaderBonusSettingVo;
 import cc.mrbird.febs.mall.vo.AdminMallTeamLeaderVo;
-import cc.mrbird.febs.mall.vo.AdminRangeSettingVo;
 import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -25,6 +24,7 @@
 public class ViewMallTeamLeaderController extends BaseController {
 
     private final IAdminMallTeamLeaderService iAdminMallTeamLeaderService;
+    private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
 
     /**
      * 团长信息--列表
@@ -71,20 +71,16 @@
      */
     @GetMapping("/leaderBonusSetting")
     public String deliverySetting(Model model) {
-//        AdminRangeSettingVo adminRangeSettingVo = new AdminRangeSettingVo();
-//        DataDictionaryCustom deliverySetting = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.HOME_DELIVERY_AMOUNT.getType(), DataDictionaryEnum.HOME_DELIVERY_AMOUNT.getCode());
-//        if (ObjectUtil.isNotNull(deliverySetting)) {
-//            adminRangeSettingVo.setHomeDeliveryAmount(Double.parseDouble(deliverySetting.getValue()));
-//        }
-//        DataDictionaryCustom rangeSwitch = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.RANGE_SWITCH.getType(), DataDictionaryEnum.RANGE_SWITCH.getCode());
-//        if (ObjectUtil.isNotNull(rangeSwitch)) {
-//            adminRangeSettingVo.setRangeSwitch(Integer.parseInt(rangeSwitch.getValue()));
-//        }
-//        DataDictionaryCustom rangeSize = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.RANGE_SIZE.getType(), DataDictionaryEnum.RANGE_SIZE.getCode());
-//        if (ObjectUtil.isNotNull(rangeSize)) {
-//            adminRangeSettingVo.setRangeSize(Integer.parseInt(rangeSize.getValue()));
-//        }
-//        model.addAttribute("deliverySetting", adminRangeSettingVo);
-        return FebsUtil.view("modules/goods/deliverySetting");
+        AdminLeaderBonusSettingVo adminLeaderBonusSettingVo = new AdminLeaderBonusSettingVo();
+        DataDictionaryCustom bonusSwitch = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.BONUS_SWITCH.getType(), DataDictionaryEnum.BONUS_SWITCH.getCode());
+        if (ObjectUtil.isNotNull(bonusSwitch)) {
+            adminLeaderBonusSettingVo.setBonusSwitch(Integer.parseInt(bonusSwitch.getValue()));
+        }
+        DataDictionaryCustom bonusPercent = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.BONUS_PERCENT.getType(), DataDictionaryEnum.BONUS_PERCENT.getCode());
+        if (ObjectUtil.isNotNull(bonusPercent)) {
+            adminLeaderBonusSettingVo.setBonusPercent(Double.parseDouble(bonusSwitch.getValue()));
+        }
+        model.addAttribute("leaderBonusSetting", adminLeaderBonusSettingVo);
+        return FebsUtil.view("modules/leader/leaderBonusSetting");
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiRechargeWalletDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiRechargeWalletDto.java
new file mode 100644
index 0000000..fc8ea85
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiRechargeWalletDto.java
@@ -0,0 +1,19 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "ApiRechargeWalletDto", description = "余额充值接收类")
+public class ApiRechargeWalletDto {
+
+    @ApiModelProperty(value = "充值金额", example = "10")
+    private BigDecimal amount;
+
+    @ApiModelProperty(hidden = true)
+    private Long memberId;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java
index eaa05c6..01c7027 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java
@@ -37,4 +37,6 @@
     BigDecimal selectCommissionIncome(@Param("type") Integer type, @Param("date") Date date, @Param("memberId") Long memebrid);
 
     BigDecimal selectThankfulCommission(@Param("date") Date date, @Param("memberId") Long memberId);
+
+    MallMoneyFlow selectOneByOrderNoAndMemberId(@Param("rechargeNo")String rechargeNo, @Param("memberId")Long memberId);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
index 02f6bb7..e07d737 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
@@ -73,4 +73,6 @@
     FebsResponse xcxPhoneLogin(ApiXcxPhoneLoginDto apiXcxPhoneLoginDto);
 
     FebsResponse xcxOpen(ApiXcxOpenDto apiXcxOpenDto);
+
+    FebsResponse rechargeWallet(ApiRechargeWalletDto apiRechargeWalletDto);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
index 2203ca0..fb65cc4 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -17,6 +17,8 @@
 import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
 import cc.mrbird.febs.mall.service.ICommonService;
 import cc.mrbird.febs.mall.vo.*;
+import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
+import cc.mrbird.febs.pay.service.IXcxPayService;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.IdUtil;
@@ -25,6 +27,7 @@
 import cn.hutool.crypto.SecureUtil;
 import cn.hutool.crypto.asymmetric.KeyType;
 import cn.hutool.crypto.asymmetric.RSA;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -730,6 +733,28 @@
         return new FebsResponse().success().data(1);
     }
 
+    private final IXcxPayService iXcxPayService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public FebsResponse rechargeWallet(ApiRechargeWalletDto apiRechargeWalletDto) {
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        BigDecimal amount = apiRechargeWalletDto.getAmount();
+        if(BigDecimal.ZERO.compareTo(amount)>0){
+            return new FebsResponse().fail().message("请输入正确的充值金额");
+        }
+        apiRechargeWalletDto.setMemberId(memberId);
+        BrandWCPayRequestData brandWCPayRequestData = null;
+        try {
+            brandWCPayRequestData = iXcxPayService.startRechargeWallet(apiRechargeWalletDto);
+        } catch (Exception e) {
+            throw new FebsException("支付失败");
+        }
+        String wxResultStr = JSONUtil.toJsonStr(brandWCPayRequestData);
+        String payResultStr = brandWCPayRequestData.getPrepay_id();
+        return new FebsResponse().success().message("充值即将到账");
+    }
+
     private  String getXcxLoginUrl(String code) {
         String wechatLoginUrl =xcxProperties.getWecharLoginUrl();
         return String.format(wechatLoginUrl, xcxProperties.getXcxAppid(), xcxProperties.getXcxSecret(), code);
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/AdminLeaderBonusSettingVo.java b/src/main/java/cc/mrbird/febs/mall/vo/AdminLeaderBonusSettingVo.java
new file mode 100644
index 0000000..576ea5b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/AdminLeaderBonusSettingVo.java
@@ -0,0 +1,13 @@
+package cc.mrbird.febs.mall.vo;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "AdminLeaderBonusSettingVo", description = "信息返回类")
+public class AdminLeaderBonusSettingVo {
+    //团长返利开关1:开启2:关闭
+    private Integer bonusSwitch;
+    //返利百分比
+    private Double bonusPercent;
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java b/src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java
index 3a74c5e..93b09e9 100644
--- a/src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java
+++ b/src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java
@@ -6,8 +6,13 @@
 import cc.mrbird.febs.common.properties.XcxProperties;
 import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.common.utils.SpringContextHolder;
+import cc.mrbird.febs.mall.entity.MallMemberWallet;
+import cc.mrbird.febs.mall.entity.MallMoneyFlow;
 import cc.mrbird.febs.mall.entity.MallOrderInfo;
+import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper;
+import cc.mrbird.febs.mall.mapper.MallMoneyFlowMapper;
 import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
+import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
 import cc.mrbird.febs.pay.model.NotifyData;
 import cc.mrbird.febs.pay.model.OrderStateDto;
 import cc.mrbird.febs.pay.model.OrderStateMsgVo;
@@ -18,6 +23,9 @@
 import cc.mrbird.febs.pay.util.Signature;
 import cc.mrbird.febs.pay.util.Util;
 import cc.mrbird.febs.pay.util.WechatConfigure;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
@@ -48,13 +56,112 @@
     @Autowired
     MallOrderInfoMapper mallOrderInfoMapper;
     @Autowired
+    MallMoneyFlowMapper mallMoneyFlowMapper;
+    @Autowired
+    MallMemberWalletMapper mallMemberWalletMapper;
+    @Autowired
     RedisUtils redisUtils;
+    @Autowired
+    private IApiMallMemberWalletService memberWalletService;
 
     @Autowired
     private IXcxPayService iXcxPayService;
 
     private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class);
     /**
+     * 微信充值回调接口
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @RequestMapping(value = "/rechargeCallBack")
+    public void rechargeCallBack(HttpServletResponse response, HttpServletRequest request) throws IOException {
+        log.info("微信充值回调start....");
+
+        // 获取输入参数
+        String inputLine;
+        StringBuffer notityXml = new StringBuffer();
+        String resXml = "";
+
+//        String attrStr = "{'rechargeNo':"+rechargeNo+",'memberId':"+mallMember.getId()+"}";
+        String attrStr = "";
+
+        FebsResponse threadResult = new FebsResponse();
+        try {
+            while ((inputLine = request.getReader().readLine()) != null) {
+                notityXml.append(inputLine);
+            }
+            request.getReader().close();
+            log.info("notityXml ---- :{} ", notityXml);
+
+
+            // XMl转对象
+            Object bb = Util.getObjectFromXML(notityXml.toString(), NotifyData.class);
+            NotifyData data = new NotifyData();
+            BeanUtils.copyProperties(bb,data);
+            log.info("----return_code = {}", data.getReturn_code());
+            // 返回状态码 SUCCESS/FAIL
+            if (WechatConfigure.CODE_SUCCESS.equals(data.getReturn_code())) {
+                attrStr = data.getAttach();
+                JSONObject jsonObject = JSONUtil.parseObj(attrStr);
+                String rechargeNo = (String) jsonObject.get("rechargeNo");
+                Long memberId = (Long) jsonObject.get("memberId");
+                // 检验订单状态
+                MallMoneyFlow mallMoneyFlow = mallMoneyFlowMapper.selectOneByOrderNoAndMemberId(rechargeNo,memberId);
+                // 校验签名
+//                String paySecret = WechatConfigure.WECHARPAY_SECRET;
+                String paySecret = xcxProperties.getWecharpaySecret();
+                if (Signature.checkIsSignValidFromResponseString(notityXml.toString(),paySecret)) {
+                    // 校验业务结果
+                    if (WechatConfigure.CODE_SUCCESS.equals(data.getResult_code())) {
+                        // 返回SUCCESS报文
+                        resXml = WechatConfigure.RESULT_XML_SUCCESS;
+                        // 支付费用
+                        Double total_fee = Double.parseDouble(data.getTotal_fee());
+                        // 商户订单号
+                        String payNum = data.getOut_trade_no();
+
+                        log.info("支付回调关键信息---total_fee:{},payNum:{},rechargeNo:{}", total_fee, payNum, rechargeNo);
+                        // 订单ID
+                        BigDecimal payMoney = new BigDecimal(total_fee).divide(new BigDecimal(100), 2,
+                                RoundingMode.HALF_UP);
+
+                        if (ObjectUtil.isNotEmpty(mallMoneyFlow)) {
+                            log.debug("检查支付金额payMoney={},mallMoneyFlow.getPayMoney()={}", payMoney, mallMoneyFlow.getAmount());
+                            MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId);
+                            if(ObjectUtil.isNotEmpty(mallMemberWallet)){
+                                memberWalletService.addBalance(payMoney,memberId);
+                            }
+                            threadResult.success().message("充值成功");
+                        } else {
+                            log.info("充值失败", attrStr);
+                        }
+                    } else {
+                        log.info("微信标识业务是失败");
+                        threadResult.fail().message("查询支付信息失败,请联系客服或者刷新支付信息(错误码:001)");
+//                        resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "微信标识业务是失败");
+                    }
+                } else {
+                    log.info("无效签名");
+                    threadResult.fail().message("查询支付信息失败,请联系客服或者刷新支付信息(错误码:002)");
+//                    resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "微信标识业务是失败");
+                }
+            } else {
+                log.info("通信标识失败");
+                threadResult.fail().message("查询支付信息失败,请联系客服或者刷新支付信息(错误码:003)");
+//                resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "通信标识失败");
+            }
+        } catch (Exception e) {
+            log.error("支付回调签名错误", e);
+            threadResult.fail().message("查询支付信息失败,请联系客服或者刷新支付信息(错误码:004)");
+//            resXml = AppConstance.RESULT_XML_FAIL.replace(ERRORMSG, "支付回调签名错误");
+        } finally {
+            // 通知线程消息
+//            PayThreadPool.notifyThread(Integer.valueOf(orderId), threadResult);
+            sendResultBack(response, resXml);
+        }
+        return;
+
+    }
+    /**
      * 微信支付回调接口
      */
     @Transactional(rollbackFor = Exception.class)
diff --git a/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java b/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java
index c4cd3f7..f582915 100644
--- a/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java
+++ b/src/main/java/cc/mrbird/febs/pay/service/IXcxPayService.java
@@ -1,6 +1,7 @@
 package cc.mrbird.febs.pay.service;
 
 import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.mall.dto.ApiRechargeWalletDto;
 import cc.mrbird.febs.mall.entity.MallOrderInfo;
 import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
 import cc.mrbird.febs.pay.model.OrderStateDto;
@@ -31,4 +32,9 @@
      * 生成小程序二维码
      */
     FebsResponse generateQrCode(WxGenerateQrCodeDto wxGenerateQrCodeDto);
+
+    /**
+     * 发起充值(创建预付订单)
+     */
+    BrandWCPayRequestData startRechargeWallet(ApiRechargeWalletDto apiRechargeWalletDto) throws Exception;
 }
diff --git a/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java b/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java
index d8c3a2f..794a2e3 100644
--- a/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/pay/service/impl/XcxPayServiceImpl.java
@@ -2,10 +2,14 @@
 
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
+import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
+import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
 import cc.mrbird.febs.common.properties.XcxProperties;
+import cc.mrbird.febs.common.utils.MallUtils;
 import cc.mrbird.febs.common.utils.OssUtils;
 import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.common.utils.SpringContextHolder;
+import cc.mrbird.febs.mall.dto.ApiRechargeWalletDto;
 import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
 import cc.mrbird.febs.mall.entity.MallMember;
 import cc.mrbird.febs.mall.entity.MallOrderInfo;
@@ -13,6 +17,7 @@
 import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
 import cc.mrbird.febs.mall.mapper.MallMemberMapper;
 import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
+import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
 import cc.mrbird.febs.pay.model.*;
 import cc.mrbird.febs.pay.service.IXcxPayService;
 import cc.mrbird.febs.pay.util.WechatConfigure;
@@ -54,6 +59,7 @@
     WeixinServiceUtil weixinServiceUtil;
     @Autowired
     private DataDictionaryCustomMapper dataDictionaryCustomMapper;
+    private final IMallMoneyFlowService mallMoneyFlowService;
     @Autowired
     RedisUtils redisUtils;
 
@@ -62,6 +68,32 @@
     private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class);
 
     @Override
+    public BrandWCPayRequestData startRechargeWallet(ApiRechargeWalletDto apiRechargeWalletDto) throws Exception {
+        BigDecimal unit = new BigDecimal("100");
+        BigDecimal money = new BigDecimal(apiRechargeWalletDto.getAmount().toString());
+        BrandWCPayRequestData payData;
+        String productNames = "小程序充值";
+        MallMember mallMember = mallMemberMapper.selectById(apiRechargeWalletDto.getMemberId());
+        String rechargeNo = "CZ_"+MallUtils.getOrderNum();
+        Boolean debug = xcxProperties.getDebug();
+        String attrStr = "{'rechargeNo':"+rechargeNo+",'memberId':"+mallMember.getId()+"}";
+        if (debug) {
+            payData = weixinServiceUtil.createRechargeWallet("[测试]" + productNames, rechargeNo,
+                    1, mallMember.getOpenId(), attrStr);
+        } else {
+            payData = weixinServiceUtil.createRechargeWallet(productNames, rechargeNo,
+                    unit.multiply(money).intValue(),mallMember.getOpenId(), attrStr);
+        }
+        mallMoneyFlowService.addMoneyFlow(
+                mallMember.getId(),
+                money,
+                MoneyFlowTypeEnum.RECHARGE.getValue(),
+                rechargeNo,
+                FlowTypeEnum.BALANCE.getValue());
+        return payData;
+    }
+
+    @Override
     public BrandWCPayRequestData startPayment(MallOrderInfo mallOrderInfo) throws Exception {
         BigDecimal unit = new BigDecimal("100");
         BigDecimal money = new BigDecimal(mallOrderInfo.getAmount().toString());
diff --git a/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java b/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java
index 3c6d58d..8da26bb 100644
--- a/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java
+++ b/src/main/java/cc/mrbird/febs/pay/util/WeixinServiceUtil.java
@@ -40,6 +40,11 @@
 		return buildBrandWCPayRequestData(desc, outTradeNo, price, openId, attach, wecharPaynotifyUrl);
 	}
 
+	public BrandWCPayRequestData createRechargeWallet(String desc, String outTradeNo, int price, String openId, String attach) throws Exception {
+		String wecharRechargePaynotifyUrl = xcxProperties.getWecharRechargePaynotifyUrl();
+		return buildBrandWCPayRequestData(desc, outTradeNo, price, openId, attach, wecharRechargePaynotifyUrl);
+	}
+
 	private BrandWCPayRequestData buildBrandWCPayRequestData(String desc, String outTradeNo, int price, String openId, String attach, String notifyUrl) throws Exception {
 		// 创建微信支付预付接口
 		JsApiPayBusiness jsApiPayBusiness = new JsApiPayBusiness();
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 98fed55..ecd832d 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -69,6 +69,7 @@
   xcx_secret: 8d3d3c14221f7dc37650b861dc0fc570
   debug: false
   wecharPaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/wxpayCallback
+  wecharRechargePaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/rechargeCallBack
   certLocalPath: /home/yyscCert/apiclient_cert.p12
   wecharpayMchid: 1631084809
   wecharpaySecret: YYSC13875978057YYSC13875978057SH
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index 6e1a607..8f67763 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -65,6 +65,7 @@
   xcx_secret: 8d3d3c14221f7dc37650b861dc0fc570
   debug: false
   wecharPaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/wxpayCallback
+  wecharRechargePaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/rechargeCallBack
   certLocalPath: /home/yyscCert/apiclient_cert.p12
   wecharpayMchid: 1631084809
   wecharpaySecret: YYSC13875978057YYSC13875978057SH
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index e494984..8e0da64 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -74,6 +74,7 @@
   xcx_secret: 8d3d3c14221f7dc37650b861dc0fc570
   debug: false
   wecharPaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/wxpayCallback
+  wecharRechargePaynotifyUrl: http://groupbuy.csxuncong.com/api/xcxPay/rechargeCallBack
   certLocalPath: /home/yyscCert/apiclient_cert.p12
   wecharpayMchid: 1631084809
   wecharpaySecret: YYSC13875978057YYSC13875978057SH
diff --git a/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml b/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml
index 33d93b7..f94d009 100644
--- a/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml
+++ b/src/main/resources/mapper/modules/MallMoneyFlowMapper.xml
@@ -131,4 +131,9 @@
           and date_format(created_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d')
           and type in (2,3,4)
     </select>
+
+    <select id="selectOneByOrderNoAndMemberId" resultType="cc.mrbird.febs.mall.entity.MallMoneyFlow">
+        select a.* from mall_money_flow a
+        where a.order_no = #{} and a.member_id = #{memberId}
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/leader/leaderBonusSetting.html b/src/main/resources/templates/febs/views/modules/leader/leaderBonusSetting.html
new file mode 100644
index 0000000..ecd9588
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/leader/leaderBonusSetting.html
@@ -0,0 +1,72 @@
+<div class="layui-fluid layui-anim febs-anim" id="leader-bonus-setting" lay-title="团长返利设置">
+    <div class="layui-row layui-col-space8 febs-container">
+        <form class="layui-form" action="" lay-filter="leader-bonus-setting-form">
+            <div class="layui-card">
+                <div class="layui-card-body">
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">返利开关:</label>
+                        <div class="layui-input-block">
+                            <input type="radio" name="bonusSwitch" value="1" title="开启">
+                            <input type="radio" name="bonusSwitch" value="2" title="关闭">
+                        </div>
+                        <div class="layui-form-mid layui-word-aux">返利开关,开启之后,团长按照每天按返利百分比,返还业绩</div>
+                    </div>
+                    <div class="layui-form-item">
+                        <label class="layui-form-label">返利百分比:</label>
+                        <div class="layui-input-inline" style="width: 200px">
+                            <input type="text" name="bonusPercent" data-th-id="${leaderBonusSetting.bonusPercent}"
+                                   lay-verify="required" autocomplete="off" class="layui-input" >
+                            <div class="layui-form-mid layui-word-aux">(填入0到1之间的小数)</div>
+                        </div>
+                        <div class="layui-form-mid">如0.15,表示返利百分比为15%</div>
+                    </div>
+                </div>
+                <div class="layui-card-footer">
+                    <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="leader-bonus-setting-form-submit" id="submit">保存</button>
+                </div>
+            </div>
+        </form>
+    </div>
+</div>
+<style>
+    .layui-form-label {
+        width: 120px;
+    }
+
+    .layui-form-item .layui-input-block {
+        margin-left: 150px;
+    }
+
+    .layui-table-form .layui-form-item {
+        margin-bottom: 20px !important;
+    }
+</style>
+<script data-th-inline="javascript" type="text/javascript">
+    layui.use(['dropdown', 'jquery', 'validate', 'febs', 'form', 'eleTree'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            validate = layui.validate,
+            leaderBonusSetting = [[${leaderBonusSetting}]],
+            $view = $('#leader-bonus-setting');
+
+        form.verify(validate);
+        form.render();
+        initUserValue();
+
+        function initUserValue() {
+            form.val("leader-bonus-setting-form", {
+                "bonusSwitch": leaderBonusSetting.bonusSwitch,
+                "bonusPercent": leaderBonusSetting.bonusPercent
+            });
+        }
+
+        form.on('submit(leader-bonus-setting-form-submit)', function (data) {
+            console.log(data);
+            febs.post(ctx + 'admin/leader/leaderBonusSetUpdate', data.field, function (res) {
+                febs.alert.success('设置成功');
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file

--
Gitblit v1.9.1