From 8fe74ad372762785e8e52d3feb0bb1ead330ed87 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Tue, 20 Jun 2023 11:26:29 +0800
Subject: [PATCH] IM后台

---
 src/main/java/cc/mrbird/febs/mall/mapper/ChatUserMapper.java               |   36 +
 src/main/java/cc/mrbird/febs/mall/service/impl/AdminChatServiceImpl.java   |  137 ++++
 src/main/java/cc/mrbird/febs/mall/GenderEnum.java                          |   28 
 src/main/java/cc/mrbird/febs/mall/vo/AdminChatAmountFlowVo.java            |   38 +
 src/main/java/cc/mrbird/febs/system/controller/LoginController.java        |   54 -
 src/test/java/cc/mrbird/febs/ProfitTest.java                               |   19 
 src/main/resources/templates/error/404.html                                |    2 
 src/main/resources/application-prod.yml                                    |   20 
 src/main/java/cc/mrbird/febs/mall/controller/AdminChatController.java      |  127 +++
 src/main/resources/mapper/modules/ChatUserMapper.xml                       |  157 ++++
 src/main/resources/templates/error/403.html                                |    2 
 src/main/java/cc/mrbird/febs/mall/dto/AdminSystemPayDto.java               |   17 
 src/main/resources/templates/febs/views/modules/chat/userList.html         |  205 ++++++
 src/main/java/cc/mrbird/febs/mall/service/IAdminChatService.java           |   33 +
 src/main/resources/application-dev.yml                                     |   10 
 src/main/java/cc/mrbird/febs/mall/vo/AdminChatWalletVo.java                |   16 
 src/main/resources/templates/error/500.html                                |    2 
 src/main/resources/templates/index.html                                    |    2 
 src/main/resources/templates/febs/views/modules/chat/chatWithDrawList.html |  193 +++++
 src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java        |    2 
 src/main/java/cc/mrbird/febs/common/utils/ZzSmsSend.java                   |    2 
 src/main/java/cc/mrbird/febs/mall/controller/ViewChatController.java       |   81 ++
 src/main/resources/templates/febs/views/modules/chat/mallSystemPay.html    |   90 ++
 src/main/java/cc/mrbird/febs/mall/entity/MemberCoinWithdraw.java           |   43 +
 /dev/null                                                                  |  101 ---
 src/main/java/cc/mrbird/febs/mall/vo/AdminChatCahrgeVo.java                |   28 
 src/main/resources/templates/febs/views/modules/chat/chatChargeList.html   |  129 +++
 src/main/java/cc/mrbird/febs/mall/vo/AdminChatUserVo.java                  |   35 +
 src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java                    |   43 -
 src/main/java/cc/mrbird/febs/mall/entity/ChatUser.java                     |  106 +++
 src/main/java/cc/mrbird/febs/mall/vo/AdminChatWithDrawVo.java              |   35 +
 src/main/java/cc/mrbird/febs/mall/YesOrNoEnum.java                         |   27 
 src/main/resources/application.yml                                         |    2 
 src/main/resources/templates/febs/views/modules/chat/chatAmountFlow.html   |  146 ++++
 src/main/resources/templates/febs/views/layout.html                        |    2 
 src/main/resources/templates/febs/views/login.html                         |    4 
 36 files changed, 1,733 insertions(+), 241 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java b/src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java
index 35e131b..02ba872 100644
--- a/src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java
+++ b/src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java
@@ -63,7 +63,7 @@
             log.info("/ /`  / / \\ | |\\/| | |_) | |   | |_   | |  | |_  ");
             log.info("\\_\\_, \\_\\_/ |_|  | |_|   |_|__ |_|__  |_|  |_|__ ");
             log.info("                                                      ");
-            log.info("国致优品商城 权限系统启动完毕,地址:{}", url);
+            log.info("IM 权限系统启动完毕,地址:{}", url);
 
             boolean auto = febsProperties.isAutoOpenBrowser();
             if (auto && StringUtils.equalsIgnoreCase(active, FebsConstant.DEVELOP)) {
diff --git a/src/main/java/cc/mrbird/febs/common/utils/ZzSmsSend.java b/src/main/java/cc/mrbird/febs/common/utils/ZzSmsSend.java
index c508be5..5dde0ad 100644
--- a/src/main/java/cc/mrbird/febs/common/utils/ZzSmsSend.java
+++ b/src/main/java/cc/mrbird/febs/common/utils/ZzSmsSend.java
@@ -26,7 +26,7 @@
     private static final String PWD = "1369815429";
 
     public static boolean sendVerifyCode(String telphone, String code, int time) {
-        String content = "【国致优品】您的验证码是{},请在{}分钟内输入,请勿泄露给他人,如非本人操作,请及时修改密码。";
+        String content = "【IM】您的验证码是{},请在{}分钟内输入,请勿泄露给他人,如非本人操作,请及时修改密码。";
         return send(telphone, StrUtil.format(content, code, time));
     }
 
diff --git a/src/main/java/cc/mrbird/febs/mall/GenderEnum.java b/src/main/java/cc/mrbird/febs/mall/GenderEnum.java
new file mode 100644
index 0000000..0032e9c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/GenderEnum.java
@@ -0,0 +1,28 @@
+package cc.mrbird.febs.mall;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public enum GenderEnum {
+    UNKNOWN("0", "未知"),
+    MALE("1", "男"),
+    FEMALE("2", "女");
+
+    @EnumValue
+    @JsonValue
+    private final String code;
+    private final String info;
+
+    private GenderEnum(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getInfo() {
+        return this.info;
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/cc/mrbird/febs/mall/YesOrNoEnum.java b/src/main/java/cc/mrbird/febs/mall/YesOrNoEnum.java
new file mode 100644
index 0000000..c66d061
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/YesOrNoEnum.java
@@ -0,0 +1,27 @@
+package cc.mrbird.febs.mall;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public enum YesOrNoEnum {
+    YES("Y", "是"),
+    NO("N", "否");
+
+    @EnumValue
+    @JsonValue
+    private final String code;
+    private final String info;
+
+    private YesOrNoEnum(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getInfo() {
+        return this.info;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/AdminChatController.java b/src/main/java/cc/mrbird/febs/mall/controller/AdminChatController.java
new file mode 100644
index 0000000..aec2763
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/controller/AdminChatController.java
@@ -0,0 +1,127 @@
+package cc.mrbird.febs.mall.controller;
+
+import cc.mrbird.febs.common.annotation.ControllerEndpoint;
+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.mall.dto.AdminSystemPayDto;
+import cc.mrbird.febs.mall.dto.MallSystemPayDto;
+import cc.mrbird.febs.mall.entity.ChatUser;
+import cc.mrbird.febs.mall.entity.MallMember;
+import cc.mrbird.febs.mall.service.IAdminChatService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.Map;
+
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/admin/chat")
+public class AdminChatController extends BaseController {
+
+    @Resource
+    private IAdminChatService iAdminChatService;
+
+    /**
+     * 用户列表
+     *
+     * @param chatUser
+     * @param request
+     * @return
+     */
+    @GetMapping("getUserList")
+    public FebsResponse getUserList(ChatUser chatUser, QueryRequest request) {
+        Map<String, Object> data = getDataTable(iAdminChatService.getUserList(chatUser, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    /**
+     * 用户列表---开启
+     *
+     * @param userId
+     * @return
+     */
+    @GetMapping("openAccount/{userId}")
+    @ControllerEndpoint(operation = "会员列表---开启", exceptionMessage = "操作失败")
+    public FebsResponse openAccount(@NotNull(message = "{required}") @PathVariable String userId) {
+        return iAdminChatService.openAccount(userId);
+    }
+    /**
+     * 用户列表---关闭
+     *
+     * @param userId
+     * @return
+     */
+    @GetMapping("closeAccount/{userId}")
+    @ControllerEndpoint(operation = "会员列表---关闭", exceptionMessage = "操作失败")
+    public FebsResponse closeAccount(@NotNull(message = "{required}") @PathVariable String userId) {
+        return iAdminChatService.closeAccount(userId);
+    }
+
+    /**
+     * 用户列表-系统拨付
+     */
+    @PostMapping("updateSystemPay")
+    @ControllerEndpoint(operation = "会员列表-系统拨付", exceptionMessage = "操作失败")
+    public FebsResponse updateSystemPay(@Valid AdminSystemPayDto adminSystemPayDto) {
+        return iAdminChatService.updateSystemPay(adminSystemPayDto);
+    }
+
+    /**
+     * 资金流水
+     */
+    @GetMapping("getFlowList")
+    public FebsResponse getFlowList(ChatUser chatUser, QueryRequest request) {
+        Map<String, Object> data = getDataTable(iAdminChatService.getFlowList(chatUser, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    /**
+     * 会员充值
+     */
+    @GetMapping("getChargeList")
+    public FebsResponse getChargeList(ChatUser chatUser, QueryRequest request) {
+        Map<String, Object> data = getDataTable(iAdminChatService.getChargeList(chatUser, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    /**
+     * 会员提现
+     */
+    @GetMapping("getWithdrawList")
+    public FebsResponse getWithdrawList(ChatUser chatUser, QueryRequest request) {
+        Map<String, Object> data = getDataTable(iAdminChatService.getWithdrawList(chatUser, request));
+        return new FebsResponse().success().data(data);
+    }
+
+    /**
+     * 会员提现-同意
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping("agreeEvent/{id}")
+    @ControllerEndpoint(operation = "会员提现-同意", exceptionMessage = "操作失败")
+    public FebsResponse agreeEvent(@NotNull(message = "{required}") @PathVariable String id) {
+        return iAdminChatService.agreeEvent(id);
+    }
+
+    /**
+     * 会员提现-拒绝
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping("disagreeEvent/{id}")
+    @ControllerEndpoint(operation = "会员提现-拒绝", exceptionMessage = "操作失败")
+    public FebsResponse disagreeEvent(@NotNull(message = "{required}") @PathVariable String id) {
+        return iAdminChatService.disagreeEvent(id);
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ViewChatController.java b/src/main/java/cc/mrbird/febs/mall/controller/ViewChatController.java
new file mode 100644
index 0000000..cebaa2f
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ViewChatController.java
@@ -0,0 +1,81 @@
+package cc.mrbird.febs.mall.controller;
+
+import cc.mrbird.febs.common.controller.BaseController;
+import cc.mrbird.febs.common.entity.FebsConstant;
+import cc.mrbird.febs.common.utils.FebsUtil;
+import cc.mrbird.febs.mall.mapper.ChatUserMapper;
+import cc.mrbird.febs.mall.service.IAdminMallMemberService;
+import cc.mrbird.febs.mall.vo.AdminChatWalletVo;
+import cc.mrbird.febs.mall.vo.MallMemberVo;
+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;
+
+import javax.annotation.Resource;
+
+@Controller("chatView")
+@RequestMapping(FebsConstant.VIEW_PREFIX + "modules/chat")
+@RequiredArgsConstructor
+public class ViewChatController extends BaseController {
+
+    @Resource
+    private ChatUserMapper chatUserMapper;
+
+    /**
+     * 用户列表
+     * @return
+     */
+    @GetMapping("userList")
+    @RequiresPermissions("userList:view")
+    public String userList() {
+        return FebsUtil.view("modules/chat/userList");
+    }
+
+    /**
+     * 用户列表-系统拨付
+     * @param userId
+     * @param model
+     * @return
+     */
+    @GetMapping("mallSystemPay/{userId}")
+    @RequiresPermissions("mallSystemPay:update")
+    public String systemPay(@PathVariable String userId, Model model) {
+        AdminChatWalletVo data = chatUserMapper.selectTotalAmountByUserIdAndType(userId);
+        model.addAttribute("systemPay", data);
+        return FebsUtil.view("modules/chat/mallSystemPay");
+    }
+
+    /**
+     * 资金流水
+     * @return
+     */
+    @GetMapping("chatAmountFlow")
+    @RequiresPermissions("chatAmountFlow:view")
+    public String chatAmountFlow() {
+        return FebsUtil.view("modules/chat/chatAmountFlow");
+    }
+
+    /**
+     * 会员充值
+     * @return
+     */
+    @GetMapping("chatChargeList")
+    @RequiresPermissions("chatChargeList:view")
+    public String chatChargeList() {
+        return FebsUtil.view("modules/chat/chatChargeList");
+    }
+
+    /**
+     * 会员提现
+     * @return
+     */
+    @GetMapping("chatWithDrawList")
+    @RequiresPermissions("chatWithDrawList:view")
+    public String chatWithDrawList() {
+        return FebsUtil.view("modules/chat/chatWithDrawList");
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/AdminSystemPayDto.java b/src/main/java/cc/mrbird/febs/mall/dto/AdminSystemPayDto.java
new file mode 100644
index 0000000..1fd50cd
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/AdminSystemPayDto.java
@@ -0,0 +1,17 @@
+package cc.mrbird.febs.mall.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+@Data
+public class AdminSystemPayDto {
+    /**
+     * userId
+     */
+    private String id;
+
+    private BigDecimal balance;
+
+    private BigDecimal addBalance;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/ChatUser.java b/src/main/java/cc/mrbird/febs/mall/entity/ChatUser.java
new file mode 100644
index 0000000..a84807a
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/ChatUser.java
@@ -0,0 +1,106 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.mall.GenderEnum;
+import cc.mrbird.febs.mall.YesOrNoEnum;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@TableName("chat_user")
+public class ChatUser {
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id",type = IdType.AUTO)
+    private Long userId;
+    /**
+     * 昵称
+     */
+    private String nickName;
+    /**
+     * 介绍
+     */
+    private String intro;
+    /**
+     * 性别1男0女
+     */
+    private String gender;
+    /**
+     * 头像
+     */
+    private String portrait;
+    /**
+     * 封面
+     */
+    private String cover;
+    /**
+     * 手机号
+     */
+    private String phone;
+    /**
+     * 省份
+     */
+    private String provinces;
+    /**
+     * 城市
+     */
+    private String city;
+    /**
+     * 微聊号
+     */
+    private String chatNo;
+    /**
+     * 密码
+     */
+    private String password;
+    /**
+     * 资金密码
+     */
+    private String tradePassword;
+    /**
+     * 盐
+     */
+    private String salt;
+    /**
+     * 状态Y正常N禁用
+     */
+    private String status;
+    /**
+     * 推送id
+     */
+    private String cid;
+    /**
+     * 用户token
+     */
+    private String token;
+    /**
+     * 版本信息
+     */
+    private String version;
+    /**
+     * 注册时间
+     */
+    @TableField(updateStrategy = FieldStrategy.NEVER)
+    private Date createTime;
+    /**
+     * 注销0正常null注销
+     */
+    @TableLogic
+    private Integer deleted;
+    /**
+     * 注销时间
+     */
+    private Date deletedTime;
+
+    @TableField(exist = false)
+    private Integer type;
+
+    @TableField(exist = false)
+    private String address;
+
+    @TableField(exist = false)
+    private Integer state;
+
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MemberCoinWithdraw.java b/src/main/java/cc/mrbird/febs/mall/entity/MemberCoinWithdraw.java
new file mode 100644
index 0000000..429bd1b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MemberCoinWithdraw.java
@@ -0,0 +1,43 @@
+package cc.mrbird.febs.mall.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@TableName("member_coin_withdraw")
+public class MemberCoinWithdraw {
+    private static final long serialVersionUID = 1L;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime = new Date();
+    /**
+     * 主键
+     */
+    @TableId(value = "id",type = IdType.AUTO)
+    private Long id;
+
+    private String userId;
+    /**
+     * 提现金额
+     */
+    private BigDecimal amount;
+    /**
+     * 1:内转 2:外转提现
+     */
+    private Integer type;
+    /**
+     * 提现地址
+     */
+    private String address;
+    /**
+     * 1:成功 2:失败 3:进行中
+     */
+    private Integer state;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/ChatUserMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/ChatUserMapper.java
new file mode 100644
index 0000000..cd987c5
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/ChatUserMapper.java
@@ -0,0 +1,36 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.ChatUser;
+import cc.mrbird.febs.mall.entity.MemberCoinWithdraw;
+import cc.mrbird.febs.mall.vo.*;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+
+import java.math.BigDecimal;
+
+public interface ChatUserMapper extends BaseMapper<ChatUser> {
+
+    IPage<AdminChatUserVo> selectUserListInPage(Page<AdminChatUserVo> page, @Param("record")ChatUser chatUser);
+
+    ChatUser selectByUserId(@Param("userId")String userId);
+
+    void updateStatusByUserId(@Param("userId")String userId, @Param("status")String code);
+
+    AdminChatWalletVo selectTotalAmountByUserIdAndType(@Param("userId")String userId);
+
+    void updateBalanceByUserId(@Param("userId")String userId, @Param("addBalance")BigDecimal addBalance);
+
+    IPage<AdminChatAmountFlowVo> selectAmountFlowListInPage(Page<AdminChatAmountFlowVo> page, @Param("record")ChatUser chatUser);
+
+    IPage<AdminChatCahrgeVo> selectChargeListInPage(Page<AdminChatCahrgeVo> page, @Param("record")ChatUser chatUser);
+
+    IPage<AdminChatWithDrawVo> selectWithdrawListInPage(Page<AdminChatWithDrawVo> page, @Param("record")ChatUser chatUser);
+
+    MemberCoinWithdraw selectWithdrawInfoById(@Param("id")String id);
+
+    void updateWithdrawStateById(@Param("state")int i,@Param("id")String id);
+
+    void updateAmountFlowListByWithdrawId(@Param("id")String id, @Param("userId")String userId, @Param("state")int i);
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java
deleted file mode 100644
index c9ca6a6..0000000
--- a/src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package cc.mrbird.febs.mall.quartz;
-
-import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
-import cc.mrbird.febs.mall.entity.MallOrderInfo;
-import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.date.DateUnit;
-import cn.hutool.core.date.DateUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-
-import java.util.Date;
-import java.util.List;
-
-/**
- * @author wzy
- * @date 2021-09-25
- **/
-@Slf4j
-@Component
-public class OrderOvertimeJob {
-
-    @Autowired
-    private MallOrderInfoMapper orderInfoMapper;
-
-    @Scheduled(cron = "0 0/5 * * * ? ")
-    public void overtimeJob() {
-        log.info("订单超时任务执行");
-        List<MallOrderInfo> orderList = orderInfoMapper.selectOrderInfoByStatus(OrderStatusEnum.WAIT_PAY.getValue());
-        if (CollUtil.isNotEmpty(orderList)) {
-            for (MallOrderInfo orderInfo : orderList) {
-                long subTime = DateUtil.between(orderInfo.getOrderTime(), new Date(), DateUnit.MINUTE, false);
-
-                if (subTime > 15) {
-                    orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue());
-                    orderInfo.setCancelType(MallOrderInfo.CANCEL_OVERTIME_NO_PAY);
-                    orderInfoMapper.updateById(orderInfo);
-                }
-            }
-        }
-
-    }
-}
diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java
deleted file mode 100644
index e13295f..0000000
--- a/src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package cc.mrbird.febs.mall.quartz;
-
-import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
-import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
-import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
-import cc.mrbird.febs.mall.entity.MallGoodsSku;
-import cc.mrbird.febs.mall.entity.MallMember;
-import cc.mrbird.febs.mall.entity.MallOrderInfo;
-import cc.mrbird.febs.mall.entity.MallOrderItem;
-import cc.mrbird.febs.mall.mapper.MallGoodsSkuMapper;
-import cc.mrbird.febs.mall.mapper.MallMemberMapper;
-import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
-import cc.mrbird.febs.mall.mapper.MallOrderItemMapper;
-import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
-import cc.mrbird.febs.mall.service.IMallAchieveService;
-import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
-import cc.mrbird.febs.mall.service.IMemberProfitService;
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.DateUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-
-/**
- * @author wzy
- * @date 2022-06-15
- **/
-@Slf4j
-@Component
-public class OrderSettlementJob {
-
-    @Autowired
-    private MallOrderInfoMapper mallOrderInfoMapper;
-
-    @Autowired
-    private IApiMallMemberWalletService memberWalletService;
-
-    @Autowired
-    private IMallMoneyFlowService mallMoneyFlowService;
-
-    @Autowired
-    private MallMemberMapper mallMemberMapper;
-
-    @Autowired
-    private MallGoodsSkuMapper mallGoodsSkuMapper;
-
-    @Autowired
-    private IMemberProfitService memberProfitService;
-
-    @Autowired
-    private IMallAchieveService mallAchieveService;
-
-    /**
-     * 普通商品结算 -- 10天结算一次
-     */
-//    @Scheduled(cron = "0 0 0 * * ?")
-    @Transactional(rollbackFor = Exception.class)
-    public void normalGoodsSettlementJob() {
-        log.info("普通商品结算");
-        List<MallOrderInfo> orderInfos = mallOrderInfoMapper.selectOrderInfoWithNormalGoods(DateUtil.offsetDay(new Date(), -10));
-        if (CollUtil.isEmpty(orderInfos)) {
-            return;
-        }
-
-        for (MallOrderInfo orderInfo : orderInfos) {
-            MallMember member = mallMemberMapper.selectById(orderInfo.getMemberId());
-            if (AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())) {
-                continue;
-            }
-
-            for (MallOrderItem item : orderInfo.getItems()) {
-                MallGoodsSku sku = mallGoodsSkuMapper.selectById(item.getSkuId());
-                BigDecimal score = sku.getPresentPrice();
-
-                memberWalletService.add(score, member.getId(), "score");
-                mallMoneyFlowService.addMoneyFlow(member.getId(), score, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue());
-
-                mallAchieveService.add(item.getId());
-            }
-
-            // 普通商品动态分红结算
-            memberProfitService.dynamicProfit(orderInfo.getId(), 1);
-        }
-    }
-
-    /**
-     * 自动确认收货
-     */
-    @Scheduled(cron = "0 0 0 * * ?")
-    public void orderAutoConfirmJob() {
-        log.info("自动确认收货");
-        mallOrderInfoMapper.updateOrderConfirmStatus(DateUtil.offsetDay(new Date(), -7));
-    }
-}
diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
index 77ff326..34290df 100644
--- a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
+++ b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -34,8 +34,8 @@
 @Component
 public class ProfitJob {
 
-    @Autowired
-    private IMemberProfitService memberProfitService;
+//    @Autowired
+//    private IMemberProfitService memberProfitService;
 
     /**
      * 代理分红
@@ -43,44 +43,5 @@
 //    @Scheduled(cron = "0 30 0 * * ?")
 //    public void profitJob() {
 //        memberProfitService.agentProfit(null);
-//    }
-//
-//    @Scheduled(cron = "0 30 1 * * ?")
-//    public void storeAndDirectorJob() {
-//        memberProfitService.storeAndDirectorProfit(null);
-//    }
-//
-//    /**
-//     * 感恩奖
-//     */
-//    @Scheduled(cron = "0 0 1 * * ?")
-//    public void thankfulJob() {
-//        memberProfitService.thankfulProfit(null);
-//    }
-//
-//
-//    /**
-//     * 静态分红
-//     */
-////    @Scheduled(cron = "0 0 0 * * ?")
-////    public void staticProfitJob() {
-////        memberProfitService.staticProfit(null);
-////    }
-//
-//    /**
-//     * 排名奖 每月1号
-//     */
-//    @Scheduled(cron = "0 30 0 1 * ?")
-//    public void rankJob() {
-//        memberProfitService.rankProfit();
-//    }
-//
-//    /**
-//     * 积分池,所有消费拿出10%放到积分池,然后按1%每天释放加权平分
-//     */
-//    @Scheduled(cron = "0 0 2 * * ?")
-////    @Scheduled(cron = "0 0/5 * * * ? ")
-//    public void scorePool() {
-//        memberProfitService.scorePool();
 //    }
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IAdminChatService.java b/src/main/java/cc/mrbird/febs/mall/service/IAdminChatService.java
new file mode 100644
index 0000000..197a51d
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/IAdminChatService.java
@@ -0,0 +1,33 @@
+package cc.mrbird.febs.mall.service;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.mall.dto.AdminSystemPayDto;
+import cc.mrbird.febs.mall.entity.ChatUser;
+import cc.mrbird.febs.mall.vo.AdminChatAmountFlowVo;
+import cc.mrbird.febs.mall.vo.AdminChatCahrgeVo;
+import cc.mrbird.febs.mall.vo.AdminChatUserVo;
+import cc.mrbird.febs.mall.vo.AdminChatWithDrawVo;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+public interface IAdminChatService extends IService<ChatUser> {
+
+    IPage<AdminChatUserVo> getUserList(ChatUser chatUser, QueryRequest request);
+
+    FebsResponse openAccount(String userId);
+
+    FebsResponse closeAccount(String userId);
+
+    FebsResponse updateSystemPay(AdminSystemPayDto adminSystemPayDto);
+
+    IPage<AdminChatAmountFlowVo> getFlowList(ChatUser chatUser, QueryRequest request);
+
+    IPage<AdminChatCahrgeVo> getChargeList(ChatUser chatUser, QueryRequest request);
+
+    IPage<AdminChatWithDrawVo> getWithdrawList(ChatUser chatUser, QueryRequest request);
+
+    FebsResponse agreeEvent(String id);
+
+    FebsResponse disagreeEvent(String id);
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/AdminChatServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminChatServiceImpl.java
new file mode 100644
index 0000000..cd559c9
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/AdminChatServiceImpl.java
@@ -0,0 +1,137 @@
+package cc.mrbird.febs.mall.service.impl;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.common.entity.QueryRequest;
+import cc.mrbird.febs.mall.YesOrNoEnum;
+import cc.mrbird.febs.mall.dto.AdminSystemPayDto;
+import cc.mrbird.febs.mall.entity.ChatUser;
+import cc.mrbird.febs.mall.entity.MemberCoinWithdraw;
+import cc.mrbird.febs.mall.mapper.ChatUserMapper;
+import cc.mrbird.febs.mall.service.IAdminChatService;
+import cc.mrbird.febs.mall.vo.AdminChatAmountFlowVo;
+import cc.mrbird.febs.mall.vo.AdminChatCahrgeVo;
+import cc.mrbird.febs.mall.vo.AdminChatUserVo;
+import cc.mrbird.febs.mall.vo.AdminChatWithDrawVo;
+import cn.hutool.core.util.ObjectUtil;
+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.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+@Transactional
+public class AdminChatServiceImpl extends ServiceImpl<ChatUserMapper, ChatUser> implements IAdminChatService {
+
+    @Override
+    public IPage<AdminChatUserVo> getUserList(ChatUser chatUser, QueryRequest request) {
+        Page<AdminChatUserVo> page = new Page<>(request.getPageNum(), request.getPageSize());
+        IPage<AdminChatUserVo> chatUserIPage = this.baseMapper.selectUserListInPage(page, chatUser);
+        return chatUserIPage;
+    }
+
+    @Override
+    public FebsResponse openAccount(String userId) {
+        ChatUser chatUser = this.baseMapper.selectByUserId(userId);
+        if(ObjectUtil.isEmpty(chatUser)) {
+            return new FebsResponse().fail().message("会员信息不存在");
+        }
+        this.baseMapper.updateStatusByUserId(userId,YesOrNoEnum.YES.getCode());
+        return new FebsResponse().success();
+    }
+
+    @Override
+    public FebsResponse closeAccount(String userId) {
+        ChatUser chatUser = this.baseMapper.selectByUserId(userId);
+        if(ObjectUtil.isEmpty(chatUser)) {
+            return new FebsResponse().fail().message("会员信息不存在");
+        }
+        this.baseMapper.updateStatusByUserId(userId,YesOrNoEnum.NO.getCode());
+        return new FebsResponse().success();
+    }
+
+    @Override
+    public FebsResponse updateSystemPay(AdminSystemPayDto adminSystemPayDto) {
+
+        ChatUser chatUser = this.baseMapper.selectByUserId(adminSystemPayDto.getId());
+        if(ObjectUtil.isEmpty(chatUser)) {
+            return new FebsResponse().fail().message("会员信息不存在");
+        }
+        BigDecimal addBalance = adminSystemPayDto.getAddBalance();
+        BigDecimal balance = adminSystemPayDto.getBalance();
+        if(BigDecimal.ZERO.compareTo(addBalance) > 0){
+            //减少余额,则判断增加数量的绝对值是否大于余额,避免出现负数
+            if(addBalance.negate().compareTo(balance) > 0){
+                return new FebsResponse().fail().message("余额不能为负数,请调整拨付数量");
+            }
+        }
+        //增加用户的余额
+        this.baseMapper.updateBalanceByUserId(adminSystemPayDto.getId(),addBalance);
+        return new FebsResponse().success();
+    }
+
+    @Override
+    public IPage<AdminChatAmountFlowVo> getFlowList(ChatUser chatUser, QueryRequest request) {
+        Page<AdminChatAmountFlowVo> page = new Page<>(request.getPageNum(), request.getPageSize());
+        IPage<AdminChatAmountFlowVo> chatUserIPage = this.baseMapper.selectAmountFlowListInPage(page, chatUser);
+        return chatUserIPage;
+    }
+
+    @Override
+    public IPage<AdminChatCahrgeVo> getChargeList(ChatUser chatUser, QueryRequest request) {
+        Page<AdminChatCahrgeVo> page = new Page<>(request.getPageNum(), request.getPageSize());
+        IPage<AdminChatCahrgeVo> adminChatCahrgeVos = this.baseMapper.selectChargeListInPage(page, chatUser);
+        return adminChatCahrgeVos;
+    }
+
+    @Override
+    public IPage<AdminChatWithDrawVo> getWithdrawList(ChatUser chatUser, QueryRequest request) {
+        Page<AdminChatWithDrawVo> page = new Page<>(request.getPageNum(), request.getPageSize());
+        IPage<AdminChatWithDrawVo> adminChatWithDrawVos = this.baseMapper.selectWithdrawListInPage(page, chatUser);
+        return adminChatWithDrawVos;
+    }
+
+    @Override
+    public FebsResponse agreeEvent(String id) {
+        MemberCoinWithdraw memberCoinWithdraw = this.baseMapper.selectWithdrawInfoById(id);
+        if(ObjectUtil.isEmpty(memberCoinWithdraw)) {
+            return new FebsResponse().fail().message("提现记录不存在");
+        }
+        Integer state = memberCoinWithdraw.getState();
+        if(3 != state){
+            return new FebsResponse().fail().message("提现记录不是进行中的状态");
+        }
+
+        this.baseMapper.updateWithdrawStateById(1,id);
+
+        this.baseMapper.updateAmountFlowListByWithdrawId(id,memberCoinWithdraw.getUserId(),1);
+        return new FebsResponse().success();
+    }
+
+    @Override
+    public FebsResponse disagreeEvent(String id) {
+        MemberCoinWithdraw memberCoinWithdraw = this.baseMapper.selectWithdrawInfoById(id);
+        if(ObjectUtil.isEmpty(memberCoinWithdraw)) {
+            return new FebsResponse().fail().message("提现记录不存在");
+        }
+        Integer state = memberCoinWithdraw.getState();
+        if(3 != state){
+            return new FebsResponse().fail().message("提现记录不是进行中的状态");
+        }
+        this.baseMapper.updateWithdrawStateById(2,id);
+
+        //增加用户的余额
+        this.baseMapper.updateBalanceByUserId(memberCoinWithdraw.getUserId(),memberCoinWithdraw.getAmount());
+
+        this.baseMapper.updateAmountFlowListByWithdrawId(id,memberCoinWithdraw.getUserId(),2);
+        return new FebsResponse().success();
+    }
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/AdminChatAmountFlowVo.java b/src/main/java/cc/mrbird/febs/mall/vo/AdminChatAmountFlowVo.java
new file mode 100644
index 0000000..1a0dd9c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/AdminChatAmountFlowVo.java
@@ -0,0 +1,38 @@
+package cc.mrbird.febs.mall.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class AdminChatAmountFlowVo {
+    /**
+     * 1:充值 2:提现 3:红包 4:转账 5:创建群聊
+     */
+    private Integer type;
+    /**
+     * 金额
+     */
+    private BigDecimal amount;
+    /**
+     * 昵称
+     */
+    private String nickName;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 当前余额
+     */
+    private BigDecimal avaAmount;
+    /**
+     * 1 :成功 2:失败 3:进行中
+     */
+    private Integer state;
+    /**
+     * 说明
+     */
+    private String remark;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/AdminChatCahrgeVo.java b/src/main/java/cc/mrbird/febs/mall/vo/AdminChatCahrgeVo.java
new file mode 100644
index 0000000..17a3e8b
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/AdminChatCahrgeVo.java
@@ -0,0 +1,28 @@
+package cc.mrbird.febs.mall.vo;
+
+import lombok.Data;
+import java.math.BigDecimal;
+
+@Data
+public class AdminChatCahrgeVo {
+
+    private String createdTime;
+    /**
+     * 昵称
+     */
+    private String nickName;
+
+    private BigDecimal amount;
+
+    private BigDecimal lastAmount;
+
+    private int status;
+
+    private String symbol;
+
+    private String address;
+
+    private String tag;
+
+    private String hash;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/AdminChatUserVo.java b/src/main/java/cc/mrbird/febs/mall/vo/AdminChatUserVo.java
new file mode 100644
index 0000000..4e200c6
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/AdminChatUserVo.java
@@ -0,0 +1,35 @@
+package cc.mrbird.febs.mall.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class AdminChatUserVo {
+
+    private String userId;
+    /**
+     * 昵称
+     */
+    private String nickName;
+    /**
+     * 微聊号
+     */
+    private String chatNo;
+    /**
+     * 状态Y正常N禁用
+     */
+    private String status;
+    /**
+     * 注册时间
+     */
+    private String createTime;
+    /**
+     * 账户总额
+     */
+    private BigDecimal totalAmount;
+    /**
+     * 账户可用
+     */
+    private BigDecimal avaAmount;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/AdminChatWalletVo.java b/src/main/java/cc/mrbird/febs/mall/vo/AdminChatWalletVo.java
new file mode 100644
index 0000000..091bf63
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/AdminChatWalletVo.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.mall.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class AdminChatWalletVo {
+
+    private String id;
+    /**
+     * 总金额
+     */
+    private BigDecimal balance;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/AdminChatWithDrawVo.java b/src/main/java/cc/mrbird/febs/mall/vo/AdminChatWithDrawVo.java
new file mode 100644
index 0000000..b7e1c21
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/AdminChatWithDrawVo.java
@@ -0,0 +1,35 @@
+package cc.mrbird.febs.mall.vo;
+
+import lombok.Data;
+import java.math.BigDecimal;
+
+@Data
+public class AdminChatWithDrawVo {
+
+    private String createdTime;
+    /**
+     * 主键
+     */
+    private String id;
+
+    /**
+     * 昵称
+     */
+    private String nickName;
+    /**
+     * 提现金额
+     */
+    private BigDecimal amount;
+    /**
+     * 1:内转 2:外转提现
+     */
+    private Integer type;
+    /**
+     * 提现地址
+     */
+    private String address;
+    /**
+     * 1:成功 2:失败 3:进行中
+     */
+    private Integer state;
+}
diff --git a/src/main/java/cc/mrbird/febs/system/controller/LoginController.java b/src/main/java/cc/mrbird/febs/system/controller/LoginController.java
index c99e8d9..9811cc6 100644
--- a/src/main/java/cc/mrbird/febs/system/controller/LoginController.java
+++ b/src/main/java/cc/mrbird/febs/system/controller/LoginController.java
@@ -89,60 +89,6 @@
         // 更新登录时间
         this.userService.updateLoginTime(username);
         Map<String, Object> data = new HashMap<>(5);
-        // 获取系统访问记录
-//        Long totalVisitCount = this.loginLogService.findTotalVisitCount();
-//        data.put("totalVisitCount", totalVisitCount);
-//        Long todayVisitCount = this.loginLogService.findTodayVisitCount();
-//        data.put("todayVisitCount", todayVisitCount);
-//        Long todayIp = this.loginLogService.findTodayIp();
-//        data.put("todayIp", todayIp);
-
-        //积分池数据
-        data.put("scorePool",redisUtils.get("scorePool"));
-        //支付统计
-        List<Long> states = new ArrayList();
-        states.add(2L);
-        states.add(3L);
-        states.add(4L);
-//        data.put("wechatPay",mallOrderInfoMapper.selectSumAmountByPayMethodAndStatue(OrderPayMethodEnum.WECHAT.getName(), OrderStatusEnum.FINISH.getValue()));
-        data.put("wechatPay",mallOrderInfoMapper.selectSumAmountByPayMethodAndSomeStatue(OrderPayMethodEnum.WECHAT.getName(), states));
-//        data.put("alipayPay",mallOrderInfoMapper.selectSumAmountByPayMethodAndStatue(OrderPayMethodEnum.ALIPAY.getName(), OrderStatusEnum.FINISH.getValue()));
-        data.put("alipayPay",mallOrderInfoMapper.selectSumAmountByPayMethodAndSomeStatue(OrderPayMethodEnum.ALIPAY.getName(), states));
-//        data.put("scorePay",mallOrderInfoMapper.selectSumAmountByPayMethodAndStatue(OrderPayMethodEnum.SCORE.getName(), OrderStatusEnum.FINISH.getValue()));
-        data.put("scorePay",mallOrderInfoMapper.selectSumAmountByPayMethodAndSomeStatue(OrderPayMethodEnum.BANK.getName(), states));
-//        data.put("balancePay",mallOrderInfoMapper.selectSumAmountByPayMethodAndStatue(OrderPayMethodEnum.BALANCE.getName(), OrderStatusEnum.FINISH.getValue()));
-        data.put("balancePay",mallOrderInfoMapper.selectSumAmountByPayMethodAndSomeStatue(OrderPayMethodEnum.BALANCE.getName(), states));
-
-
-        data.put("lastDay", mallAchieveRecordMapper.selectAchieveTotal("D", DateUtil.offsetDay(new Date(), -1)));
-        data.put("today", mallAchieveRecordMapper.selectAchieveTotal("D", new Date()));
-        data.put("lastMonth", mallAchieveRecordMapper.selectAchieveTotal("M", DateUtil.offsetMonth(new Date(), -1)));
-        data.put("thisMonth", mallAchieveRecordMapper.selectAchieveTotal("M", new Date()));
-
-        //会员数据
-        data.put("totalMember",mallMemberMapper.selectCount(new QueryWrapper<>()) );
-        QueryWrapper<MallMember> formalMember = new QueryWrapper<>();
-        formalMember.ne("level", AgentLevelEnum.ZERO_LEVEL.name());
-        data.put("formalMember",mallMemberMapper.selectCount(formalMember));
-
-        QueryWrapper<MallMember> informalMember = new QueryWrapper<>();
-        informalMember.eq("level", AgentLevelEnum.ZERO_LEVEL.name());
-        data.put("informalMember",mallMemberMapper.selectCount(informalMember));
-
-        QueryWrapper<MallMember> todayMember = new QueryWrapper<>();
-        todayMember.like("CREATED_TIME", DateUtil.today());
-//        todayMember.ne("level", AgentLevelEnum.ZERO_LEVEL.name());
-        data.put("todayMember",mallMemberMapper.selectCount(todayMember));
-
-        QueryWrapper<MallMember> thisMonthMember = new QueryWrapper<>();
-        thisMonthMember.like("CREATED_TIME", DateUtil.format(DateUtil.date(),"yyyy-MM"));
-//        thisMonthMember.ne("level", AgentLevelEnum.ZERO_LEVEL.name());
-        data.put("thisMonthMember",mallMemberMapper.selectCount(thisMonthMember));
-
-        QueryWrapper<MallMember> lastMonthMember = new QueryWrapper<>();
-        lastMonthMember.like("CREATED_TIME", DateUtil.format(DateUtil.offsetMonth(new Date(), -1),"yyyy-MM"));
-//        lastMonthMember.ne("level", AgentLevelEnum.ZERO_LEVEL.name());
-        data.put("lastMonthMember",mallMemberMapper.selectCount(lastMonthMember));
 
         // 获取近期系统访问记录
         List<Map<String, Object>> lastSevenVisitCount = this.loginLogService.findLastSevenDaysVisitCount(null);
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 954e7e8..13e201b 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -15,14 +15,10 @@
       datasource:
         # 数据源-1,名称为 base
         base:
-          username: ct_test
-          password: 123456
+          username: boot_im
+          password: boot_im!@#123
           driver-class-name: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://120.27.238.55:3406/db_hnto?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
-#          username: db_mall
-#          password: mall!@#123
-#          driver-class-name: com.mysql.cj.jdbc.Driver
-#          url: jdbc:mysql://47.111.90.145:3306/db_mall?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
+          url: jdbc:mysql://154.91.195.148:3306/boot_im?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
 
   redis:
     # Redis数据库索引(默认为 0)
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index 27eef32..3095258 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -15,20 +15,20 @@
       datasource:
         # 数据源-1,名称为 base
         base:
-          username: db_gzyp_prd
-          password: gzyp123!@#123
+          username: boot_im
+          password: boot_im!@#123
           driver-class-name: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://121.43.43.93:3306/db_gzyp_prd?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
+          url: jdbc:mysql://154.91.195.148:3306/boot_im?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
 
   redis:
     # Redis数据库索引(默认为 0)
-    database: 0
+    database: 7
     # Redis服务器地址
-    host: 121.43.43.93
+    host: 127.0.0.1
     # Redis服务器连接端口
     port: 6379
     # Redis 密码
-    password: gzyp-mall=-0
+    password: dapp!@#123
     lettuce:
       pool:
         # 连接池中的最小空闲连接
@@ -41,11 +41,13 @@
         max-wait: 10000
     # 连接超时时间(毫秒)
     timeout: 5000
+
+  # rabbitmq 配置
   rabbitmq:
-    host: 121.43.43.93
+    host: 127.0.0.1
     port: 5672
-    username: ct_rabbit
-    password: 123456
+    username: xc_rabbit
+    password: xuncong123
     publisher-confirm-type: correlated
 
 pay:
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index a4a3d86..3538ebe 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,5 +1,5 @@
 server:
-  port: 8186
+  port: 8098
   tomcat:
     uri-encoding: utf-8
 
diff --git a/src/main/resources/mapper/modules/ChatUserMapper.xml b/src/main/resources/mapper/modules/ChatUserMapper.xml
new file mode 100644
index 0000000..b040b45
--- /dev/null
+++ b/src/main/resources/mapper/modules/ChatUserMapper.xml
@@ -0,0 +1,157 @@
+<?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="cc.mrbird.febs.mall.mapper.ChatUserMapper">
+
+    <select id="selectUserListInPage" resultType="cc.mrbird.febs.mall.vo.AdminChatUserVo">
+        select
+        a.user_id userId,
+        a.nick_name nickName,
+        a.chat_no chatNo,
+        a.status status,
+        date_format(a.create_time, '%Y-%m-%d %H:%m:%s') createTime,
+        IFNULL(sum(b.total_amount), 0) totalAmount,
+        IFNULL(sum(b.ava_amount), 0) avaAmount
+        from chat_user a
+        left join chat_wallet b on b.user_id = a.user_id and type = 'USDT'
+        <where>
+            <if test="record != null">
+                <if test="record.nickName != null and record.nickName != ''">
+                    and a.nick_name like CONCAT('%', CONCAT(#{record.nickName}, '%'))
+                </if>
+                <if test="record.chatNo != null and record.chatNo != ''">
+                    and a.chat_no = #{record.chatNo}
+                </if>
+                <if test="record.status != null and record.status != ''">
+                    and a.status = #{record.status}
+                </if>
+            </if>
+        </where>
+        group by a.user_id
+        order by a.create_time desc
+    </select>
+
+    <select id="selectByUserId" resultType="cc.mrbird.febs.mall.entity.ChatUser">
+        select
+        a.*
+        from chat_user a
+        where a.user_id = #{userId}
+    </select>
+
+    <update id="updateStatusByUserId">
+        update chat_user
+        set
+            status = #{status}
+        where user_id = #{userId}
+    </update>
+
+    <select id="selectTotalAmountByUserIdAndType" resultType="cc.mrbird.febs.mall.vo.AdminChatWalletVo">
+        select
+            a.user_id id,
+            a.total_amount balance
+        from chat_wallet a
+        where a.user_id = #{userId}
+            and a.type = 'USDT'
+    </select>
+
+    <update id="updateBalanceByUserId">
+        update chat_wallet
+        set
+            total_amount = total_amount + #{addBalance},
+            ava_amount = ava_amount + #{addBalance}
+        where user_id = #{userId}
+          and type = 'USDT'
+    </update>
+
+    <select id="selectAmountFlowListInPage" resultType="cc.mrbird.febs.mall.vo.AdminChatAmountFlowVo">
+        select
+        a.type type,
+        a.amount amount,
+        b.nick_name nickName,
+        date_format(a.create_time, '%Y-%m-%d %H:%m:%s') createTime,
+        a.ava_amount avaAmount,
+        a.state state,
+        a.remark remark
+        from chat_amount_flow a
+        left join chat_user b on b.user_id = a.user_id
+        <where>
+            <if test="record != null">
+                <if test="record.nickName != null and record.nickName != ''">
+                    and b.nick_name like CONCAT('%', CONCAT(#{record.nickName}, '%'))
+                </if>
+                <if test="record.type != null and record.type != ''">
+                    and a.type = #{record.type}
+                </if>
+            </if>
+        </where>
+        order by a.create_time desc
+    </select>
+
+    <select id="selectChargeListInPage" resultType="cc.mrbird.febs.mall.vo.AdminChatCahrgeVo">
+        select
+        date_format(a.created_time, '%Y-%m-%d %H:%m:%s') createdTime,
+        b.nick_name nickName,
+        a.amount amount,
+        a.last_amount lastAmount,
+        a.status status,
+        a.symbol symbol,
+        a.tag tag,
+        a.hash hash,
+        a.address address
+        from member_coin_charge a
+        left join chat_user b on b.user_id = a.user_id
+        <where>
+            <if test="record != null">
+                <if test="record.nickName != null and record.nickName != ''">
+                    and b.nick_name like CONCAT('%', CONCAT(#{record.nickName}, '%'))
+                </if>
+                <if test="record.address != null and record.address != ''">
+                    and a.address = #{record.address}
+                </if>
+            </if>
+        </where>
+        order by a.created_time desc
+    </select>
+
+    <select id="selectWithdrawListInPage" resultType="cc.mrbird.febs.mall.vo.AdminChatWithDrawVo">
+        select
+        date_format(a.created_time, '%Y-%m-%d %H:%m:%s') createdTime,
+        b.nick_name nickName,
+        a.id id,
+        a.amount amount,
+        a.type type,
+        a.address address,
+        a.state state
+        from member_coin_withdraw a
+        left join chat_user b on b.user_id = a.user_id
+        <where>
+            <if test="record != null">
+                <if test="record.nickName != null and record.nickName != ''">
+                    and b.nick_name like CONCAT('%', CONCAT(#{record.nickName}, '%'))
+                </if>
+                <if test="record.address != null and record.address != ''">
+                    and a.address = #{record.address}
+                </if>
+                <if test="record.state != null and record.state != ''">
+                    and a.state = #{record.state}
+                </if>
+                <if test="record.type != null and record.type != ''">
+                    and a.type = #{record.type}
+                </if>
+            </if>
+        </where>
+        order by a.created_time desc
+    </select>
+
+    <select id="selectWithdrawInfoById" resultType="cc.mrbird.febs.mall.entity.MemberCoinWithdraw">
+        select * from member_coin_withdraw a where a.id = #{id}
+    </select>
+
+    <update id="updateWithdrawStateById">
+        update member_coin_withdraw set state = #{state} where id = #{id}
+    </update>
+
+    <update id="updateAmountFlowListByWithdrawId">
+        update chat_amount_flow set state = #{state} where user_id = #{userId} and relation_id = #{id}
+    </update>
+
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/templates/error/403.html b/src/main/resources/templates/error/403.html
index de2892a..bde822e 100644
--- a/src/main/resources/templates/error/403.html
+++ b/src/main/resources/templates/error/403.html
@@ -2,7 +2,7 @@
 <html xmlns:th="http://www.thymeleaf.org">
 <head>
     <meta charset="utf-8">
-    <title>国致优品商城 权限系统</title>
+    <title>IM 权限系统</title>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <meta name="renderer" content="webkit">
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
diff --git a/src/main/resources/templates/error/404.html b/src/main/resources/templates/error/404.html
index 5b71790..68c50d9 100644
--- a/src/main/resources/templates/error/404.html
+++ b/src/main/resources/templates/error/404.html
@@ -2,7 +2,7 @@
 <html xmlns:th="http://www.thymeleaf.org">
 <head>
     <meta charset="utf-8">
-    <title>国致优品商城 权限系统</title>
+    <title>IM 权限系统</title>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <meta name="renderer" content="webkit">
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
diff --git a/src/main/resources/templates/error/500.html b/src/main/resources/templates/error/500.html
index 08482be..9fe2d98 100644
--- a/src/main/resources/templates/error/500.html
+++ b/src/main/resources/templates/error/500.html
@@ -2,7 +2,7 @@
 <html xmlns:th="http://www.thymeleaf.org">
 <head>
     <meta charset="utf-8">
-    <title>国致优品商城 权限系统</title>
+    <title>IM 权限系统</title>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <meta name="renderer" content="webkit">
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
diff --git a/src/main/resources/templates/febs/views/layout.html b/src/main/resources/templates/febs/views/layout.html
index ae2be6b..f89506c 100644
--- a/src/main/resources/templates/febs/views/layout.html
+++ b/src/main/resources/templates/febs/views/layout.html
@@ -64,7 +64,7 @@
         <div class="layui-side-scroll">
             <div class="layui-logo" style="cursor: pointer">
                 <img data-th-src="@{febs/images/logo.png}">
-                <span>国致优品商城 权限系统</span>
+                <span>IM 权限系统</span>
             </div>
             <script
                     type="text/html"
diff --git a/src/main/resources/templates/febs/views/login.html b/src/main/resources/templates/febs/views/login.html
index 3f3f2db..37ef274 100644
--- a/src/main/resources/templates/febs/views/login.html
+++ b/src/main/resources/templates/febs/views/login.html
@@ -2,7 +2,7 @@
 <html xmlns:th="http://www.thymeleaf.org">
 <head>
     <meta charset="utf-8">
-    <title>国致优品商城 权限系统</title>
+    <title>IM 权限系统</title>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <meta name="renderer" content="webkit">
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
@@ -19,7 +19,7 @@
         <div class="layui-container">
             <div class="layui-row">
                 <div class="layui-col-xs12 layui-col-lg4 layui-col-lg-offset4 febs-tc">
-                    <div class="layui-logo"><span><b>国致优品商城</b> 权限系统</span></div>
+                    <div class="layui-logo"><span><b>IM</b> 权限系统</span></div>
                 </div>
                 <div class="layui-col-xs12 layui-col-lg4 layui-col-lg-offset4" id="login-div">
                     <div class="layui-form" lay-filter="login-form">
diff --git a/src/main/resources/templates/febs/views/modules/chat/chatAmountFlow.html b/src/main/resources/templates/febs/views/modules/chat/chatAmountFlow.html
new file mode 100644
index 0000000..80b2a9b
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/chat/chatAmountFlow.html
@@ -0,0 +1,146 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-chat-flow-list" 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="user-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">昵称:</label>
+                                        <div class="layui-input-inline">
+                                            <input type="text" placeholder="昵称" name="nickName" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">操作类型:</label>
+                                        <div class="layui-input-inline">
+                                            <select name="type">
+                                                <!--1:充值 2:提现 3:红包 4:转账 5:创建群聊-->
+                                                <option value="">请选择</option>
+                                                <option value="1">充值</option>
+                                                <option value="2">提现</option>
+                                                <option value="3">红包</option>
+                                                <option value="4">转账</option>
+                                                <option value="5">创建群聊</option>
+                                                <option value="6">系统拨付</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="userChatFlowTable" lay-data="{id: 'userChatFlowTable'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+    <span shiro:lacksPermission="user:view,user:update,user:delete">
+        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+    </span>
+    <a lay-event="edit" shiro:hasPermission="user:update"><i
+            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
+</script>
+<!--1:充值 2:提现 3:红包 4:转账 5:创建群聊-->
+<script type="text/html" id="flow-type">
+    {{#
+    var type = {
+    1: {title: '充值', color: 'orange'},
+    2: {title: '提现', color: 'green'},
+    3: {title: '红包', color: 'blue'},
+    4: {title: '转账', color: 'orange'},
+    5: {title: '创建群聊', color: 'green'},
+    6: {title: '系统拨付', color: 'blue'},
+    }[d.type];
+    }}
+    <span class="layui-badge febs-bg-{{type.color}}">{{ type.title }}</span>
+</script>
+<style>
+    .layui-form-onswitch {
+        background-color: #5FB878 !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-chat-flow-list'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'phone', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initTable();
+
+        // 查询按钮
+        $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();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                nickName: $searchForm.find('input[name="nickName"]').val().trim(),
+                type: $searchForm.find("select[name='type']").val()
+            };
+        }
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'userChatFlowTable',
+                url: ctx + 'admin/chat/getFlowList',
+                // toolbar:"#toolbar",
+                // defaultToolbar:[],
+                totalRow: true ,// 开启合计行
+                cols: [[
+                    {field: 'nickName', title: '昵称', minWidth: 150,align:'center', totalRowText: '合计:',align:'center'},
+                    {title: '操作类型', minWidth: 150,templet: '#flow-type',align:'center'},
+                    {field: 'amount', title: '金额', minWidth: 100,align:'center',align:'center',totalRow: '{{= parseInt(d.amount) }}'},
+                    {field: 'state', title: '状态',
+                        templet: function (d) {
+                            if (d.state === 1) {
+                                return '<span class="layui-badge febs-bg-green">成功</span>'
+                            } else if (d.state === 2) {
+                                return '<span class="layui-badge febs-bg-red">失败</span>'
+                            }else{
+                                return '<span class="layui-badge febs-bg-orange">进行中</span>'
+                            }
+                        }, minWidth: 120,align:'center'},
+                    {field: 'createTime', title: '操作时间', minWidth: 180,align:'center'},
+                    {field: 'remark', title: '说明', minWidth: 80,align:'center',align:'center'}
+                ]]
+            });
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/chat/chatChargeList.html b/src/main/resources/templates/febs/views/modules/chat/chatChargeList.html
new file mode 100644
index 0000000..1b58f88
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/chat/chatChargeList.html
@@ -0,0 +1,129 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-chat-charge-list" 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="user-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">昵称:</label>
+                                        <div class="layui-input-inline">
+                                            <input type="text" placeholder="昵称" name="nickName" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">地址:</label>
+                                        <div class="layui-input-inline">
+                                            <input type="text" placeholder="地址" name="address" autocomplete="off" class="layui-input">
+                                        </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="userChatChargeTable" lay-data="{id: 'userChatChargeTable'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+    <span shiro:lacksPermission="user:view,user:update,user:delete">
+        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+    </span>
+    <a lay-event="edit" shiro:hasPermission="user:update"><i
+            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
+</script>
+<!--1:成功 2:失败 3:进行中-->
+<script type="text/html" id="status-type">
+    {{#
+    var status = {
+    1: {title: '-', color: ''},
+    2: {title: '成功', color: 'green'},
+    3: {title: '进行中', color: 'orange'},
+    }[d.status];
+    }}
+    <span class="layui-badge febs-bg-{{status.color}}">{{ status.title }}</span>
+</script>
+<style>
+    .layui-form-onswitch {
+        background-color: #5FB878 !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-chat-charge-list'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'phone', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initTable();
+
+        // 查询按钮
+        $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();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                nickName: $searchForm.find('input[name="nickName"]').val().trim(),
+                address: $searchForm.find('input[name="address"]').val().trim()
+            };
+        }
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'userChatChargeTable',
+                url: ctx + 'admin/chat/getChargeList',
+                // toolbar:"#toolbar",
+                // defaultToolbar:[],
+                totalRow: true ,// 开启合计行
+                cols: [[
+                    {field: 'nickName', title: '昵称', minWidth: 150,align:'center', totalRowText: '合计:',align:'center'},
+                    {field: 'amount', title: '金额', minWidth: 100,align:'center',align:'center',totalRow: '{{= parseInt(d.amount) }}'},
+                    {field: 'lastAmount', title: '充值前金额', minWidth: 100,align:'center',align:'center',totalRow: '{{= parseInt(d.amount) }}'},
+                    // {field: 'avaAmount', title: '操作前余额', minWidth: 150,align:'center',align:'center',totalRow: '{{= parseInt(d.avaAmount) }}'},
+                    {title: '状态', minWidth: 150,templet: '#status-type',align:'center'},
+                    {field: 'symbol', title: '币种', minWidth: 180,align:'center'},
+                    {field: 'address', title: '地址', minWidth: 180,align:'center'},
+                    {field: 'hash', title: 'HASH', minWidth: 180,align:'center'},
+                    {field: 'createdTime', title: '操作时间', minWidth: 180,align:'center'},
+                    {field: 'remark', title: '说明', minWidth: 80,align:'center',align:'center'}
+                ]]
+            });
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/chat/chatWithDrawList.html b/src/main/resources/templates/febs/views/modules/chat/chatWithDrawList.html
new file mode 100644
index 0000000..8f3b2c7
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/chat/chatWithDrawList.html
@@ -0,0 +1,193 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-chat-withdraw-list" 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="user-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">昵称:</label>
+                                        <div class="layui-input-inline">
+                                            <input type="text" placeholder="昵称" name="nickName" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">地址:</label>
+                                        <div class="layui-input-inline">
+                                            <input type="text" placeholder="地址" name="address" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">类型:</label>
+                                        <div class="layui-input-inline">
+                                            <select name="type">
+                                                <option value="">请选择</option>
+                                                <option value="1">转账</option>
+                                                <option value="2">提现</option>
+                                            </select>
+                                        </div>
+                                    </div>
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">状态:</label>
+                                        <div class="layui-input-inline">
+                                            <select name="state">
+                                                <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="userChatWithdrawTable" lay-data="{id: 'userChatWithdrawTable'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+    <span shiro:lacksPermission="user:view,user:update,user:delete">
+        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+    </span>
+    <a lay-event="edit" shiro:hasPermission="user:update"><i
+            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
+</script>
+<style>
+    .layui-form-onswitch {
+        background-color: #5FB878 !important;
+    }
+</style>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-chat-withdraw-list'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'phone', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initTable();table.on('tool(userChatWithdrawTable)', function (obj) {
+            var data = obj.data,
+                layEvent = obj.event;
+            if (layEvent === 'agree') {
+                febs.modal.confirm('同意', '通过提现?', function () {
+                    agreeEvent(data.id);
+                });
+            }
+            if (layEvent === 'disagree') {
+                febs.modal.confirm('拒绝', '拒绝提现?', function () {
+                    disagreeEvent(data.id);
+                });
+            }
+
+            function agreeEvent(id) {
+                febs.get(ctx + 'admin/chat/agreeEvent/' + id, null, function () {
+                    febs.alert.success('操作成功');
+                    $query.click();
+                });
+            }
+
+            function disagreeEvent(id) {
+                febs.get(ctx + 'admin/chat/disagreeEvent/' + id, null, function () {
+                    febs.alert.success('操作成功');
+                    $query.click();
+                });
+            }
+
+        });
+
+        // 查询按钮
+        $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();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                nickName: $searchForm.find('input[name="nickName"]').val().trim(),
+                address: $searchForm.find('input[name="address"]').val().trim(),
+                state: $searchForm.find("select[name='state']").val(),
+                type: $searchForm.find("select[name='type']").val()
+            };
+        }
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'userChatWithdrawTable',
+                url: ctx + 'admin/chat/getWithdrawList',
+                // toolbar:"#toolbar",
+                // defaultToolbar:[],
+                totalRow: true ,// 开启合计行
+                cols: [[
+                    {field: 'id', title: '', minWidth: 150,align:'center', totalRowText: '合计:',align:'center'},
+                    {field: 'nickName', title: '昵称', minWidth: 150,align:'center'},
+                    {field: 'amount', title: '金额', minWidth: 100,align:'center',align:'center',totalRow: '{{= parseInt(d.amount) }}'},
+                    {field: 'type', title: '类型',
+                        templet: function (d) {
+                            if (d.type === 1) {
+                                return '<span style="color:green;">转账</span>'
+                            } else if (d.type === 2) {
+                                return '<span style="color:blue;">提现</span>'
+                            }else{
+                                return '-'
+                            }
+                        }, minWidth: 120,align:'center'},
+                    {field: 'state', title: '状态',
+                        templet: function (d) {
+                            if (d.state === 1) {
+                                return '<span class="layui-badge febs-bg-green">成功</span>'
+                            } else if (d.state === 2) {
+                                return '<span class="layui-badge febs-bg-red">失败</span>'
+                            }else{
+                                return '<span class="layui-badge febs-bg-orange">进行中</span>'
+                            }
+                        }, minWidth: 120,align:'center'},
+                    {field: 'address', title: '地址', minWidth: 180,align:'center'},
+                    {field: 'createdTime', title: '操作时间', minWidth: 180,align:'center'},
+                    {title: '操作',
+                        templet: function (d) {
+                            if (d.state === 3 && d.type == 2) {
+                                    return '<button class="layui-btn layui-btn-normal layui-btn-xs layui-btn-success" lay-event="agree" shiro:hasPermission="withdraw:info">同意</button>'
+                                    +'<button class="layui-btn layui-btn-normal layui-btn-xs layui-btn-fail" lay-event="disagree" shiro:hasPermission="withdraw:info">拒绝</button>'
+                            }else{
+                                return ''
+                            }
+                        },minWidth: 200,align:'center'}
+                ]]
+            });
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/chat/mallSystemPay.html b/src/main/resources/templates/febs/views/modules/chat/mallSystemPay.html
new file mode 100644
index 0000000..23dcf5b
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/chat/mallSystemPay.html
@@ -0,0 +1,90 @@
+<style>
+    #chat-systemPay-update {
+        padding: 20px 25px 25px 0;
+    }
+
+    #chat-systemPay-update .layui-treeSelect .ztree li a, .ztree li span {
+        margin: 0 0 2px 3px !important;
+    }
+    #chat-systemPay-update #data-permission-tree-block {
+        border: 1px solid #eee;
+        border-radius: 2px;
+        padding: 3px 0;
+    }
+    #chat-systemPay-update .layui-treeSelect .ztree li span.button.switch {
+        top: 1px;
+        left: 3px;
+    }
+    #chat-systemPay-update img{
+        max-width:100px
+    }
+
+</style>
+<div class="layui-fluid" id="chat-systemPay-update">
+    <form class="layui-form" action="" lay-filter="chat-systemPay-update-form">
+        <div class="layui-form-item febs-hide">
+            <label class="layui-form-label febs-form-item-require">id:</label>
+            <div class="layui-input-block">
+                <input type="text" name="id">
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">当前余额:</label>
+            <div class="layui-input-block">
+                <input type="number" name="balance" lay-verify="required" autocomplete="off" class="layui-input" readonly>
+            </div>
+        </div>
+        <div class="layui-form-item">
+            <label class="layui-form-label febs-form-item-require">拨付数目:</label>
+            <div class="layui-input-block">
+                <input type="number" name="addBalance" lay-verify="required" autocomplete="off" class="layui-input">
+                <div class="layui-word-aux">输入负数即减少数量</div>
+            </div>
+        </div>
+        <div class="layui-form-item febs-hide">
+            <button class="layui-btn" lay-submit="" lay-filter="chat-systemPay-update-form-submit" id="submit"></button>
+        </div>
+    </form>
+</div>
+
+<script data-th-inline="javascript">
+    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree', 'laydate'], function () {
+        var $ = layui.$,
+            febs = layui.febs,
+            layer = layui.layer,
+            formSelects = layui.formSelects,
+            treeSelect = layui.treeSelect,
+            form = layui.form,
+            laydate = layui.laydate,
+            eleTree = layui.eleTree,
+            systemPay = [[${systemPay}]],
+            $view = $('#chat-systemPay-update'),
+            validate = layui.validate;
+
+        form.render();
+        laydate.render({
+            elem: '#febs-form-group-date'
+        });
+
+        formSelects.render();
+
+
+        initUserValue();
+
+        function initUserValue() {
+            form.val("chat-systemPay-update-form", {
+                "id": systemPay.id,
+                "balance": systemPay.balance
+            });
+        }
+
+        form.on('submit(chat-systemPay-update-form-submit)', function (data) {
+            febs.post(ctx + 'admin/chat/updateSystemPay', data.field, function () {
+                layer.closeAll();
+                febs.alert.success('操作成功');
+                $('#febs-chat-user-list').find('#query').click();
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/febs/views/modules/chat/userList.html b/src/main/resources/templates/febs/views/modules/chat/userList.html
new file mode 100644
index 0000000..8f7e381
--- /dev/null
+++ b/src/main/resources/templates/febs/views/modules/chat/userList.html
@@ -0,0 +1,205 @@
+<div class="layui-fluid layui-anim febs-anim" id="febs-chat-user-list" 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="user-table-form">
+                        <div class="layui-row">
+                            <div class="layui-col-md10">
+                                <div class="layui-form-item">
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">昵称:</label>
+                                        <div class="layui-input-inline">
+                                            <input type="text" placeholder="昵称" name="nickName" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">微聊号:</label>
+                                        <div class="layui-input-inline">
+                                            <input type="text" placeholder="微聊号" name="chatNo" autocomplete="off" class="layui-input">
+                                        </div>
+                                    </div>
+                                    <div class="layui-inline">
+                                        <label class="layui-form-label">账号状态:</label>
+                                        <div class="layui-input-inline">
+                                            <select name="status">
+                                                <option value="">请选择</option>
+                                                <option value="Y">正常</option>
+                                                <option value="N">禁用</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="userChatTable" lay-data="{id: 'userChatTable'}"></table>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+<!-- 表格操作栏 start -->
+<script type="text/html" id="user-option">
+    <span shiro:lacksPermission="user:view,user:update,user:delete">
+        <span class="layui-badge-dot febs-bg-orange"></span> 无权限
+    </span>
+    <a lay-event="edit" shiro:hasPermission="user:update"><i
+            class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
+</script>
+<script type="text/html" id="switchStatus">
+    {{# if(d.status === 'Y') { }}
+    <input type="checkbox" value={{d.userId}} lay-text="正常|禁用" checked lay-skin="switch" lay-filter="switchStatus">
+    {{# } else { }}
+    <input type="checkbox" value={{d.userId}} lay-text="正常|禁用" lay-skin="switch" lay-filter="switchStatus">
+    {{# } }}
+</script>
+<style>
+    .layui-form-onswitch {
+        background-color: #5FB878 !important;
+    }
+</style>
+<script type="text/html" id="toolbar">
+    <div class="layui-btn-container">
+<!--        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="registMember">添加会员</button>-->
+        <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" lay-event="balance">拨付余额</button>
+    </div>
+</script>
+<!-- 表格操作栏 end -->
+<script data-th-inline="none" type="text/javascript">
+    // 引入组件并初始化
+    layui.use([ 'jquery', 'form', 'table', 'febs'], function () {
+        var $ = layui.jquery,
+            febs = layui.febs,
+            form = layui.form,
+            table = layui.table,
+            $view = $('#febs-chat-user-list'),
+            $query = $view.find('#query'),
+            $reset = $view.find('#reset'),
+            $searchForm = $view.find('form'),
+            sortObject = {field: 'phone', type: null},
+            tableIns;
+
+        form.render();
+
+        // 表格初始化
+        initTable();
+
+        // 查询按钮
+        $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();
+            sortObject.type = 'null';
+            tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject});
+        });
+
+        // 获取查询参数
+        function getQueryParams() {
+            return {
+                nickName: $searchForm.find('input[name="nickName"]').val().trim(),
+                chatNo: $searchForm.find('input[name="chatNo"]').val().trim(),
+                status: $searchForm.find("select[name='status']").val()
+            };
+        }
+
+        function initTable() {
+            tableIns = febs.table.init({
+                elem: $view.find('table'),
+                id: 'userChatTable',
+                url: ctx + 'admin/chat/getUserList',
+                toolbar:"#toolbar",
+                defaultToolbar:[],
+                totalRow: true ,// 开启合计行
+                cols: [[
+                    {type: 'checkbox'},
+                    {field: 'userId', title: '标识', minWidth: 150,align:'left', totalRowText: '合计:',align:'center'},
+                    {field: 'nickName', title: '昵称', minWidth: 100,align:'left',align:'center'},
+                    {field: 'chatNo', title: '微聊号', minWidth: 150,align:'left',align:'center'},
+                    {field: 'totalAmount', title: '账户总额', minWidth: 80,align:'left',totalRow: '{{= parseInt(d.totalAmount) }}',align:'center'},
+                    {field: 'avaAmount', title: '账户余额', minWidth: 80,align:'left',totalRow: '{{= parseInt(d.avaAmount) }}',align:'center'},
+                    {field: 'status', title: '账号状态', templet: '#switchStatus', minWidth: 80,align:'center'},
+                    {field: 'createTime', title: '注册时间', minWidth: 180,align:'center'},
+                ]]
+            });
+        }
+
+        table.on('toolbar(userChatTable)', function(obj){
+            var data = obj.data,
+                layEvent = obj.event;
+
+            // if (layEvent === 'registMember') {
+            //     febs.modal.open( '添加会员', 'modules/mallMember/addMember', {
+            //         btn: ['提交', '取消'],
+            //         yes: function (index, layero) {
+            //             $('#member-add').find('#submit').trigger('click');
+            //         },
+            //         btn2: function () {
+            //             layer.closeAll();
+            //         }
+            //     });
+            //
+            //     return;
+            // }
+
+            var checkData = table.checkStatus('userChatTable').data;
+            if (checkData.length <= 0) {
+                febs.alert.warn('请选择需要的用户');
+                return;
+            }
+
+            if (layEvent === 'balance') {
+                if (checkData.length > 1) {
+                    febs.alert.warn('请选择一个用户');
+                    return;
+                }
+                systemPay("修改余额", checkData[0].userId, 1);
+            }
+        });
+
+        function systemPay(text, userId, type) {
+            febs.modal.open(text, 'modules/chat/mallSystemPay/'+ userId, {
+                btn: ['提交', '取消'],
+                yes: function (index, layero) {
+                    $('#chat-systemPay-update').find('#submit').trigger('click');
+                },
+                btn2: function () {
+                    layer.closeAll();
+                }
+            });
+        }
+
+        form.on('switch(switchStatus)', function (data) {
+            if (data.elem.checked) {
+                openAccount(data.value);
+            } else {
+                closeAccount(data.value);
+            }
+        })
+        function openAccount(userId) {
+            febs.get(ctx + 'admin/chat/openAccount/' + userId, null, function () {
+                febs.alert.success('操作成功');
+                $query.click();
+            });
+        }
+        function closeAccount(userId) {
+            febs.get(ctx + 'admin/chat/closeAccount/' + userId, null, function () {
+                febs.alert.success('操作成功');
+                $query.click();
+            });
+        }
+
+    })
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html
index ce16f3d..3f695cd 100644
--- a/src/main/resources/templates/index.html
+++ b/src/main/resources/templates/index.html
@@ -3,7 +3,7 @@
       xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
 <head>
     <meta charset="utf-8">
-    <title>国致优品商城 权限系统</title>
+    <title>IM 权限系统</title>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
     <meta name="renderer" content="webkit">
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
diff --git a/src/test/java/cc/mrbird/febs/ProfitTest.java b/src/test/java/cc/mrbird/febs/ProfitTest.java
index 09bb277..4b8e7e2 100644
--- a/src/test/java/cc/mrbird/febs/ProfitTest.java
+++ b/src/test/java/cc/mrbird/febs/ProfitTest.java
@@ -1,28 +1,9 @@
 package cc.mrbird.febs;
 
-import cc.mrbird.febs.common.entity.FebsResponse;
-import cc.mrbird.febs.common.utils.MallUtils;
-import cc.mrbird.febs.mall.entity.MallOrderItem;
-import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
-import cc.mrbird.febs.mall.mapper.MallOrderItemMapper;
-import cc.mrbird.febs.mall.quartz.OrderSettlementJob;
 import cc.mrbird.febs.mall.service.IAgentService;
-import cc.mrbird.febs.mall.service.IMallAchieveService;
-import cc.mrbird.febs.mall.service.IMemberProfitService;
-import cc.mrbird.febs.pay.model.*;
-import cc.mrbird.febs.pay.service.UnipayService;
-import cc.mrbird.febs.rabbit.consumer.AgentConsumer;
-import cn.hutool.core.date.DateUtil;
 import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-
-import java.math.BigDecimal;
-import java.text.DecimalFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
 /**
  * @author wzy

--
Gitblit v1.9.1