From 4667dc8680a1bff172ce8151f9715b92d4159b88 Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Wed, 17 Apr 2024 16:39:32 +0800
Subject: [PATCH] 代币充值

---
 src/main/java/cc/mrbird/febs/mall/controller/ViewBasicTestController.java        |   86 +++++++++
 src/main/resources/templates/febs/views/modules/mallMember/memberChargeList.html |  203 ++++++++++++++++++++++
 src/main/java/cc/mrbird/febs/mall/dto/MemberChargrDto.java                       |   11 +
 src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java                      |    2 
 src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java                   |    8 
 src/main/java/cc/mrbird/febs/mall/mapper/MallMemberChargeMapper.java             |    7 
 src/main/java/cc/mrbird/febs/mall/service/impl/MallMoneyFlowServiceImpl.java     |    5 
 src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java      |   69 +++++++
 src/main/resources/mapper/modules/MallMemberMapper.xml                           |   17 +
 src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java             |    2 
 src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java   |    7 
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java     |   38 ++++
 src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java                           |    2 
 src/main/java/cc/mrbird/febs/mall/controller/ViewMallMemberController.java       |   10 +
 src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java        |    8 
 src/main/java/cc/mrbird/febs/mall/dto/ApiChargeBalanceDto.java                   |   21 ++
 src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java           |    4 
 src/main/java/cc/mrbird/febs/mall/entity/MallMemberCharge.java                   |   20 ++
 src/main/java/cc/mrbird/febs/mall/service/IMallMoneyFlowService.java             |    4 
 src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java           |    2 
 20 files changed, 521 insertions(+), 5 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 7b3d1dd..2d5d5bf 100644
--- a/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
@@ -5,6 +5,10 @@
 
 @Getter
 public enum DataDictionaryEnum {
+    //充值金额
+    CHARGE_AMOUNT("CHARGE_AMOUNT","CHARGE_AMOUNT"),
+    //充值地址
+    CHARGE_ADDRESS("CHARGE_ADDRESS","CHARGE_ADDRESS"),
     //卖方确认获取5%的GSD
     FCM_GSD_IN("FCM_GSD_IN","FCM_GSD_IN"),
     //卡牌互转手续费
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java
index a9cea2f..d260e6b 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminMallMemberController.java
@@ -4,7 +4,10 @@
 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.FlowTypeNewEnum;
+import cc.mrbird.febs.common.enumerates.MoneyFlowTypeNewEnum;
 import cc.mrbird.febs.common.enumerates.ProductEnum;
+import cc.mrbird.febs.common.utils.MallUtils;
 import cc.mrbird.febs.common.utils.ShareCodeUtil;
 import cc.mrbird.febs.common.utils.excl.ExcelSheetPO;
 import cc.mrbird.febs.common.utils.excl.ExcelUtil;
@@ -12,10 +15,13 @@
 import cc.mrbird.febs.common.utils.excl.ResponseHeadUtil;
 import cc.mrbird.febs.mall.dto.*;
 import cc.mrbird.febs.mall.entity.*;
+import cc.mrbird.febs.mall.mapper.MallMemberAmountMapper;
+import cc.mrbird.febs.mall.mapper.MallMemberChargeMapper;
 import cc.mrbird.febs.mall.mapper.MallMemberMapper;
 import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper;
 import cc.mrbird.febs.mall.service.IAdminMallMemberService;
 import cc.mrbird.febs.mall.service.IApiMallMemberService;
+import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
 import cc.mrbird.febs.mall.vo.AdminAgentLevelOptionTreeVo;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
@@ -49,8 +55,71 @@
 
     private final IAdminMallMemberService mallMemberService;
     private final MallMemberWalletMapper mallMemberWalletMapper;
+    private final MallMemberAmountMapper mallMemberAmountMapper;
     private final MallMemberMapper mallMemberMapper;
     private final IApiMallMemberService apiMallMemberService;
+    private final MallMemberChargeMapper mallMemberChargeMapper;
+    private final IMallMoneyFlowService mallMoneyFlowService;
+
+
+    @GetMapping("confirmOrder")
+    @ControllerEndpoint(operation = "批量充值", exceptionMessage = "操作失败")
+    public FebsResponse confirmOrder(MemberChargrDto memberChargrDto){
+        String orderIds = memberChargrDto.getOrderIds();
+        List<String> ids = StrUtil.splitTrim(orderIds, ",");
+        for(String id : ids){
+            long orderId = Long.parseLong(id);
+            MallMemberCharge mallMemberCharge = mallMemberChargeMapper.selectById(orderId);
+            if(1 != mallMemberCharge.getState()){
+                continue;
+            }
+            MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(mallMemberCharge.getMemberId());
+            mallMemberAmount.setFcmCntAva(mallMemberAmount.getFcmCntAva().add(mallMemberCharge.getAmount()));
+            mallMemberAmountMapper.updateFcmCntAvaById(mallMemberAmount);
+
+            mallMemberCharge.setState(2);
+            mallMemberChargeMapper.updateById(mallMemberCharge);
+
+            String orderNo = MallUtils.getOrderNum("BF");
+            mallMoneyFlowService.addMoneyFlow(
+                    mallMemberCharge.getMemberId(),
+                    mallMemberCharge.getAmount(),
+                    MoneyFlowTypeNewEnum.FCM_INSIDE_IN.getValue(),
+                    orderNo,
+                    mallMemberCharge.getMemberId(),
+                    FlowTypeNewEnum.FCM_COIN.getValue(),
+                    MoneyFlowTypeNewEnum.FCM_INSIDE_IN.getDescrition());
+        }
+        return new FebsResponse().success();
+    }
+
+
+    @GetMapping("confirmCancel")
+    @ControllerEndpoint(operation = "批量取消", exceptionMessage = "操作失败")
+    public FebsResponse confirmCancel(MemberChargrDto memberChargrDto){
+        String orderIds = memberChargrDto.getOrderIds();
+        List<String> ids = StrUtil.splitTrim(orderIds, ",");
+        for(String id : ids){
+            long orderId = Long.parseLong(id);
+            MallMemberCharge mallMemberCharge = mallMemberChargeMapper.selectById(orderId);
+            if(1 != mallMemberCharge.getState()){
+                continue;
+            }
+            mallMemberCharge.setState(3);
+            mallMemberChargeMapper.updateById(mallMemberCharge);
+        }
+        return new FebsResponse().success();
+    }
+
+
+    /**
+     * 充值列表
+     */
+    @GetMapping("memberChargeList")
+    public FebsResponse memberChargeList(MoneyChargeListDto moneyChargeListDto, QueryRequest request) {
+        Map<String, Object> data = getDataTable(mallMemberService.memberChargeList(moneyChargeListDto, request));
+        return new FebsResponse().success().data(data);
+    }
 
     /**
      * 平台账单
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 2b44b45..4ea4ca7 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
@@ -78,6 +78,14 @@
         return memberService.updatePayment(updatePaymentDto);
     }
 
+
+    @ApiOperation(value = "FCM-充值", notes = "FCM-充值")
+    @PostMapping(value = "/chargeBalance")
+    public FebsResponse chargeBalance(@RequestBody @Valid ApiChargeBalanceDto apiChargeBalanceDto) {
+        return memberService.chargeBalance(apiChargeBalanceDto);
+    }
+
+
     @ApiOperation(value = "FCM-推出登录", notes = "FCM-推出登录")
     @PostMapping(value = "/logout")
     public FebsResponse logout() {
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewBasicTestController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewBasicTestController.java
new file mode 100644
index 0000000..ce40fef
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewBasicTestController.java
@@ -0,0 +1,86 @@
+package cc.mrbird.febs.mall.controller;
+
+import cc.mrbird.febs.common.entity.FebsConstant;
+import cc.mrbird.febs.common.utils.FebsUtil;
+import cc.mrbird.febs.mall.entity.MallNewsCategory;
+import cc.mrbird.febs.mall.entity.MallNewsInfo;
+import cc.mrbird.febs.mall.service.IMallNewsInfoService;
+import lombok.RequiredArgsConstructor;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * @author wzy
+ * @date 2022-05-13
+ **/
+@Controller("basicTestView")
+@RequestMapping(FebsConstant.VIEW_PREFIX + "modules/basicTest")
+@RequiredArgsConstructor
+public class ViewBasicTestController {
+
+    private final IMallNewsInfoService mallNewsInfoService;
+
+    /**
+     * 新闻中心-列表
+     * @return
+     */
+    @GetMapping("newsInfoList")
+    @RequiresPermissions("newsInfoList:view")
+    public String newsInfoList() {
+        return FebsUtil.view("modules/news/newsInfoList");
+    }
+
+    /**
+     * 新闻中心-新增
+     * @return
+     */
+    @GetMapping("newsInfoAdd")
+    @RequiresPermissions("newsInfoAdd:add")
+    public String newsInfoAdd() {
+        return FebsUtil.view("modules/news/newsInfoAdd");
+    }
+
+    /**
+     * 新闻中心-详情
+     * @param id
+     * @param model
+     * @return
+     */
+    @GetMapping("newsInfoUpdate/{id}")
+    @RequiresPermissions("newsInfoUpdate:update")
+    public String newsInfoUpdate(@PathVariable long id, Model model) {
+        MallNewsInfo data = mallNewsInfoService.getNewsInfoById(id);
+        model.addAttribute("newsInfo", data);
+        return FebsUtil.view("modules/news/newsInfoUpdate");
+    }
+
+    @GetMapping("newsCategory")
+    @RequiresPermissions("news:category:view")
+    public String newsCategory() {
+        return FebsUtil.view("modules/news/newsCategory");
+    }
+
+    @GetMapping("addCategory")
+    @RequiresPermissions("news:category:add")
+    public String addCategory(Long id, Model model) {
+        if (id != null) {
+            MallNewsCategory obj = mallNewsInfoService.findNewsCategoryById(id);
+            model.addAttribute("obj", obj);
+        }
+        return FebsUtil.view("modules/news/newsCategoryAdd");
+    }
+
+    @GetMapping("updateCategory/{id}")
+    @RequiresPermissions("news:category:update")
+    public String updateCategory(@PathVariable Long id, Model model) {
+        if (id != null) {
+            MallNewsCategory obj = mallNewsInfoService.findNewsCategoryById(id);
+            model.addAttribute("obj", obj);
+        }
+        return FebsUtil.view("modules/news/newsCategoryAdd");
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallMemberController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallMemberController.java
index 709ee5a..4b784cf 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ViewMallMemberController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewMallMemberController.java
@@ -33,6 +33,16 @@
     public static long idFromScoreAchieveRelease;
 
     /**
+     * 充值列表
+     * @return
+     */
+    @GetMapping("memberChargeList")
+    @RequiresPermissions("memberChargeList:view")
+    public String memberChargeList() {
+        return FebsUtil.view("modules/mallMember/memberChargeList");
+    }
+
+    /**
      * 平台账单
      * @return
      */
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiChargeBalanceDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiChargeBalanceDto.java
new file mode 100644
index 0000000..b98b300
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiChargeBalanceDto.java
@@ -0,0 +1,21 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "ApiChargeBalanceDto", description = "参数接收类")
+public class ApiChargeBalanceDto {
+
+    @NotNull(message = "参数不能为空")
+    @ApiModelProperty(value = "金额", example = "1")
+    private BigDecimal amount;
+
+    @NotNull(message = "交易密码不能为空")
+    @ApiModelProperty(value = "交易密码", example = "1")
+    private String tradePassword;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/MemberChargrDto.java b/src/main/java/cc/mrbird/febs/mall/dto/MemberChargrDto.java
new file mode 100644
index 0000000..74da929
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/MemberChargrDto.java
@@ -0,0 +1,11 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "MemberChargrDto", description = "参数接收类")
+public class MemberChargrDto {
+
+    private String orderIds;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberCharge.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberCharge.java
new file mode 100644
index 0000000..6df208e
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberCharge.java
@@ -0,0 +1,20 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@TableName("mall_member_charge")
+public class MallMemberCharge extends BaseEntity {
+    private Long memberId;
+    private BigDecimal amount;
+    private Integer state;//1-进行中 2-成功 3-失败
+
+
+    @TableField(exist = false)
+    private String accountLogin;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java
index 091b5bd..dcd6adf 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMoneyFlow.java
@@ -33,7 +33,7 @@
     private Long rtMemberId;
 
     /**
-     * 提现状态 1-提现中2-成功 3-拒绝
+     * 提现状态 1-进行中2-成功 3-拒绝
      */
     private Integer status;
 
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberChargeMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberChargeMapper.java
new file mode 100644
index 0000000..882dba5
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberChargeMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.MallMemberCharge;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface MallMemberChargeMapper extends BaseMapper<MallMemberCharge> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
index bc594ce..dee504f 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -1,11 +1,9 @@
 package cc.mrbird.febs.mall.mapper;
 
-import cc.mrbird.febs.mall.dto.AgentDto;
-import cc.mrbird.febs.mall.dto.AgentLevelDto;
-import cc.mrbird.febs.mall.dto.RankAwardDto;
-import cc.mrbird.febs.mall.dto.RankListDto;
+import cc.mrbird.febs.mall.dto.*;
 import cc.mrbird.febs.mall.entity.AppVersion;
 import cc.mrbird.febs.mall.entity.MallMember;
+import cc.mrbird.febs.mall.entity.MallMemberCharge;
 import cc.mrbird.febs.mall.vo.*;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -123,4 +121,6 @@
     IPage<AdminMallMemberVo> getFcmMallMemberList(Page<AdminMallMemberVo> page,  @Param("record")MallMember mallMember);
 
     MallMemberVo getMallmemberAmountByMemberId(@Param("memberId")long id);
+
+    IPage<MallMemberCharge> getMemberChargeListInPage(Page<MallMemberCharge> page,  @Param("record")MoneyChargeListDto moneyChargeListDto);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java
index 9e8306e..dfd5a4f 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IAdminMallMemberService.java
@@ -129,4 +129,6 @@
     FebsResponse updateSystemPayInfo(MallSystemPayDto mallSystemPayDto);
 
     MallMemberVo getMallmemberAmountByMemberId(long id);
+
+    IPage<MallMemberCharge> memberChargeList(MoneyChargeListDto moneyChargeListDto, QueryRequest request);
 }
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 70a5ed5..4a4965d 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
@@ -96,4 +96,6 @@
     FebsResponse memberSpeak(ApiMemberSpeakDto memberSpeakDto);
 
     FebsResponse moneyFlowInside(MoneyFlowDto moneyFlowDto);
+
+    FebsResponse chargeBalance(ApiChargeBalanceDto apiChargeBalanceDto);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IMallMoneyFlowService.java b/src/main/java/cc/mrbird/febs/mall/service/IMallMoneyFlowService.java
index e058ce6..9e2e106 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IMallMoneyFlowService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IMallMoneyFlowService.java
@@ -18,4 +18,8 @@
     void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, Long rtMemberId, Integer flowType, String description);
     void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, Long rtMemberId, Integer flowType, String description,Integer isReturn);
 
+
+
+    void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, Long rtMemberId, Integer flowType,Integer status, String description);
+
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java
index bbe36a4..da7fe0c 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java
@@ -959,6 +959,13 @@
         return mallMemberVo;
     }
 
+    @Override
+    public IPage<MallMemberCharge> memberChargeList(MoneyChargeListDto moneyChargeListDto, QueryRequest request) {
+        Page<MallMemberCharge> page = new Page<>(request.getPageNum(), request.getPageSize());
+        IPage<MallMemberCharge> mallMemberChargeIPage = mallMemberMapper.getMemberChargeListInPage(page, moneyChargeListDto);
+        return mallMemberChargeIPage;
+    }
+
     private String refererIds(String parentId) {
         boolean flag = false;
         if (StrUtil.isBlank(parentId)) {
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 5c531f5..5c8dc0e 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
@@ -66,6 +66,7 @@
     private final MallProductBuyRecordMapper mallProductBuyRecordMapper;
     private final MallProductBuyMapper mallProductBuyMapper;
     private final MallMemberSpeakMapper mallMemberSpeakMapper;
+    private final MallMemberChargeMapper mallMemberChargeMapper;
 
 
     @Value("${spring.profiles.active}")
@@ -341,6 +342,12 @@
                 DataDictionaryEnum.FCM_INSIDE_NFT_PERCENT.getCode()
         );
         mallMemberVo.setInsideNFTPercent(insideNFTPercentDic.getValue());
+
+        DataDictionaryCustom chargeAddressDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                DataDictionaryEnum.CHARGE_ADDRESS.getType(),
+                DataDictionaryEnum.CHARGE_ADDRESS.getCode()
+        );
+        mallMemberVo.setChargeAddress(chargeAddressDic.getValue());
         return new FebsResponse().success().data(mallMemberVo);
     }
 
@@ -1023,6 +1030,37 @@
         return new FebsResponse().success().data(pages);
     }
 
+    @Override
+    public FebsResponse chargeBalance(ApiChargeBalanceDto apiChargeBalanceDto) {
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        MallMember mallMember = this.baseMapper.selectById(memberId);
+        BigDecimal amount = apiChargeBalanceDto.getAmount();
+        DataDictionaryCustom chargeAmountDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                DataDictionaryEnum.CHARGE_AMOUNT.getType(),
+                DataDictionaryEnum.CHARGE_AMOUNT.getCode()
+        );
+        BigDecimal chargeAmount = new BigDecimal(chargeAmountDic.getValue()).setScale(2,BigDecimal.ROUND_DOWN);
+        if(chargeAmount.compareTo(amount) > 0){
+            throw new FebsException("充值金额需要大于"+chargeAmount);
+        }
+
+        if (StrUtil.isBlank(mallMember.getTradePassword())) {
+            throw new FebsException("请设置交易密码");
+        }
+
+        if (!mallMember.getTradePassword().equals(SecureUtil.md5(apiChargeBalanceDto.getTradePassword()))) {
+            throw new FebsException("交易密码错误");
+        }
+        MallMemberCharge mallMemberCharge = new MallMemberCharge();
+        mallMemberCharge.setMemberId(memberId);
+        mallMemberCharge.setAmount(chargeAmount);
+        mallMemberCharge.setState(1);
+        mallMemberChargeMapper.insert(mallMemberCharge);
+
+
+        return new FebsResponse().success().message("操作成功");
+    }
+
 //    public static void main(String[] args) {
 //        Set<String> objectsAccount = new HashSet<>();
 //        Set<String> objects = new HashSet<>();
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/MallMoneyFlowServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/MallMoneyFlowServiceImpl.java
index 8c5ff2a..8d78336 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/MallMoneyFlowServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/MallMoneyFlowServiceImpl.java
@@ -59,4 +59,9 @@
     public void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, Long rtMemberId, Integer flowType, String description, Integer isReturn) {
         this.addMoneyFlow(memberId, amount, type, orderNo, description, null, rtMemberId, null, flowType, isReturn);
     }
+
+    @Override
+    public void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, Long rtMemberId, Integer flowType, Integer status, String description) {
+        this.addMoneyFlow(memberId, amount, type, orderNo, description, null, rtMemberId, status, flowType, null);
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java b/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
index 78b9e28..1803761 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
@@ -118,5 +118,7 @@
     private BigDecimal totalPerk;
     @ApiModelProperty(value = "卡牌互转手续费")
     private String insideNFTPercent;
+    @ApiModelProperty(value = "充值地址")
+    private String chargeAddress;
 
 }
diff --git a/src/main/resources/mapper/modules/MallMemberMapper.xml b/src/main/resources/mapper/modules/MallMemberMapper.xml
index db3c093..375cc89 100644
--- a/src/main/resources/mapper/modules/MallMemberMapper.xml
+++ b/src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -580,4 +580,21 @@
         FROM mall_member_amount a
         where a.member_id = #{memberId}
     </select>
+
+    <select id="getMemberChargeListInPage" resultType="cc.mrbird.febs.mall.entity.MallMemberCharge">
+        select
+               a.*,
+               b.account_login accountLogin
+        from mall_member_charge a
+        left join mall_member b on a.member_id = b.id
+        <where>
+            <if test="record.accountLogin!=null and record.accountLogin!=''">
+                and b.account_login like concat('%',  #{record.accountLogin},'%')
+            </if>
+            <if test="record.status!=null">
+                and a.state = #{record.status}
+            </if>
+        </where>
+        order by a.CREATED_TIME desc
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/mallMember/memberChargeList.html b/src/main/resources/templates/febs/views/modules/mallMember/memberChargeList.html
new file mode 100644
index 0000000..282bc75
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/mallMember/memberChargeList.html
@@ -0,0 +1,203 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-member-charge" lay-title="代币充值">
+    <div class="layui-row febs-container">
+        <div class="layui-col-md12">
+            <div class="layui-card">
+                <div class="layui-card-body febs-table-full">
+                    <form class="layui-form layui-table-form" lay-filter="withdraw-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                    <div class="layui-inline">
+                                        <div class="layui-input-inline">
+                                            <input type="text" name="accountLogin" autocomplete="off" placeholder="登录账户" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label layui-form-label-sm">状态</label>
+                                        <div class="layui-input-inline">
+                                            <select name="status">
+                                                <option value=""></option>
+                                                <option value="1">进行中</option>
+                                                <option value="2">成功</option>
+                                                <option value="3">失败</option>
+                                            </select>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query">
+                                    <i class="layui-icon">&#xe848;</i>
+                                </div>
+                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
+                                    <i class="layui-icon">&#xe79b;</i>
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                    <table lay-filter="memberChargeTable" lay-data="{id: 'memberChargeTable'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<style>
+    .layui-table-cell {
+        height: auto !important;
+    }
+</style>
+<script type="text/html" id="withdraw-status">
+    {{#
+    var state = {
+    1: {title: '进行中'},
+    2: {title: '成功'},
+    3: {title: '失败'}
+    }[d.state];
+    }}
+    <span>{{ state.title }}</span>
+</script>
+
+<script type="text/html" id="tableToolBarOrder">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" lay-event="confirmOrder">提现确认</button>
+        <button class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain" lay-event="confirmCancel">提现取消</button>
+    </div>
+</script>
+
+
+<script data-th-inline="none" type="text/javascript">
+    layui.use(['dropdown', 'jquery', 'laydate', 'form', 'table', 'febs', 'treeSelect'], function () {
+        var $ = layui.jquery,
+            laydate = layui.laydate,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            dropdown = layui.dropdown,
+            $view = $('#febs-member-charge'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'createTime', type: null},
+            tableIns;
+
+        form.render();
+
+        initTable();
+
+        table.on('toolbar(memberChargeTable)', function(obj){
+            var event = obj.event;
+            var id = obj.config.id;
+            var checkStatus = table.checkStatus(id);
+            if(event === 'confirmOrder'){
+                var data = checkStatus.data;
+                let ids = "";
+                let totalAmount = 0;
+                for(let i = 0;i < data.length;i++){
+                    if(data[i].status != 1){
+                        febs.alert.warn('请选择审核中的记录');
+                        return;
+                    }else{
+                        ids = ids + data[i].id+",";
+                        totalAmount = totalAmount + data[i].amount;
+                    }
+                }
+                if(ids == null || ids == ""){
+                    febs.alert.warn('请选择审核中的记录');
+                    return;
+                }
+
+                febs.modal.confirm('USDT提现', '总额为:'+totalAmount, function () {
+                    confirmOrder(ids);
+                });
+            }
+            if(event === 'confirmCancel'){
+                var data = checkStatus.data;
+                let ids = "";
+                let totalAmount = 0;
+                for(let i = 0;i < data.length;i++){
+                    if(data[i].status != 1){
+                        febs.alert.warn('请选择审核中的记录');
+                        return;
+                    }else{
+                        ids = ids + data[i].id+",";
+                        totalAmount = totalAmount + data[i].amount;
+                    }
+                }
+                if(ids == null || ids == ""){
+                    febs.alert.warn('请选择审核中的记录');
+                    return;
+                }
+
+                febs.modal.confirm('提现取消', '总额为:'+totalAmount, function () {
+                    confirmCancel(ids);
+                });
+            }
+        });
+        function confirmOrder(ids) {
+            febs.get(ctx + 'admin/mallMember/confirmOrder?&orderIds='+ids, null, function () {
+                febs.alert.success('操作成功');
+                $query.click();
+
+            });
+        }
+        function confirmCancel(ids) {
+            febs.get(ctx + 'admin/mallMember/confirmCancel?&orderIds='+ids, null, function () {
+                febs.alert.success('操作成功');
+                $query.click();
+
+            });
+        }
+
+        table.on('sort(memberChargeTable)', function (obj) {
+            sortObject = obj;
+            tableIns.reload({
+                initSort: obj,
+                where: $.extend(getQueryParams(), {
+                    field: obj.field,
+                    order: obj.type
+                })
+            });
+        });
+
+        $query.on('click', function () {
+            var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type});
+            tableIns.reload({where: params, page: {curr: 1}});
+        });
+
+        $reset.on('click', function () {
+            $searchForm[0].reset();
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'memberChargeTable',
+                url: ctx + 'admin/mallMember/memberChargeList',
+                toolbar: '#tableToolBarOrder',
+                cols: [[
+                    {type: 'checkbox', fixed: 'left'},
+                    {field: 'accountLogin', title: '账户', minWidth: 180},
+                    {field: 'amount', title: '金额(USDT)', minWidth: 130},
+                    {title: '提现状态', templet: '#withdraw-status'},
+                    {field: 'createdTime', title: '创建时间', minWidth: 180},
+                ]]
+            });
+        }
+
+        function getQueryParams() {
+            return {
+                accountLogin: $searchForm.find('input[name="accountLogin"]').val().trim(),
+                status: $searchForm.find("select[name='status']").val(),
+                invalidate_ie_cache: new Date()
+            };
+        }
+
+        function changeStatus(url) {
+            febs.post(ctx + url, null, function () {
+                febs.alert.success('设置成功');
+                $query.click();
+            });
+        }
+    })
+</script>

--
Gitblit v1.9.1