xiaoyong931011
2023-06-20 8fe74ad372762785e8e52d3feb0bb1ead330ed87
IM后台
2 files deleted
14 files modified
21 files added
2019 ■■■■ changed files
src/main/java/cc/mrbird/febs/common/runner/FebsStartedUpRunner.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/utils/ZzSmsSend.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/GenderEnum.java 28 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/YesOrNoEnum.java 27 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminChatController.java 127 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ViewChatController.java 81 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AdminSystemPayDto.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/ChatUser.java 106 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MemberCoinWithdraw.java 43 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/ChatUserMapper.java 36 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java 45 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java 101 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java 43 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAdminChatService.java 33 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminChatServiceImpl.java 137 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminChatAmountFlowVo.java 38 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminChatCahrgeVo.java 28 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminChatUserVo.java 35 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminChatWalletVo.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminChatWithDrawVo.java 35 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/system/controller/LoginController.java 54 ●●●●● patch | view | raw | blame | history
src/main/resources/application-dev.yml 10 ●●●●● patch | view | raw | blame | history
src/main/resources/application-prod.yml 20 ●●●●● patch | view | raw | blame | history
src/main/resources/application.yml 2 ●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/ChatUserMapper.xml 157 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/error/403.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/error/404.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/error/500.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/layout.html 2 ●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/login.html 4 ●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/chat/chatAmountFlow.html 146 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/chat/chatChargeList.html 129 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/chat/chatWithDrawList.html 193 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/chat/mallSystemPay.html 90 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/chat/userList.html 205 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/index.html 2 ●●● patch | view | raw | blame | history
src/test/java/cc/mrbird/febs/ProfitTest.java 19 ●●●●● patch | view | raw | blame | history
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)) {
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));
    }
src/main/java/cc/mrbird/febs/mall/GenderEnum.java
New file
@@ -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;
    }
}
src/main/java/cc/mrbird/febs/mall/YesOrNoEnum.java
New file
@@ -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;
    }
}
src/main/java/cc/mrbird/febs/mall/controller/AdminChatController.java
New file
@@ -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);
    }
}
src/main/java/cc/mrbird/febs/mall/controller/ViewChatController.java
New file
@@ -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");
    }
}
src/main/java/cc/mrbird/febs/mall/dto/AdminSystemPayDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/mall/entity/ChatUser.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/mall/entity/MemberCoinWithdraw.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/mall/mapper/ChatUserMapper.java
New file
@@ -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);
}
src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java
File was deleted
src/main/java/cc/mrbird/febs/mall/quartz/OrderSettlementJob.java
File was deleted
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();
//    }
}
src/main/java/cc/mrbird/febs/mall/service/IAdminChatService.java
New file
@@ -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);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AdminChatServiceImpl.java
New file
@@ -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();
    }
}
src/main/java/cc/mrbird/febs/mall/vo/AdminChatAmountFlowVo.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/mall/vo/AdminChatCahrgeVo.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/mall/vo/AdminChatUserVo.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/mall/vo/AdminChatWalletVo.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/mall/vo/AdminChatWithDrawVo.java
New file
@@ -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;
}
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);
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)
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:
src/main/resources/application.yml
@@ -1,5 +1,5 @@
server:
  port: 8186
  port: 8098
  tomcat:
    uri-encoding: utf-8
src/main/resources/mapper/modules/ChatUserMapper.xml
New file
@@ -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>
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">
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">
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">
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"
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">
src/main/resources/templates/febs/views/modules/chat/chatAmountFlow.html
New file
@@ -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>
src/main/resources/templates/febs/views/modules/chat/chatChargeList.html
New file
@@ -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>
src/main/resources/templates/febs/views/modules/chat/chatWithDrawList.html
New file
@@ -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>
src/main/resources/templates/febs/views/modules/chat/mallSystemPay.html
New file
@@ -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>
src/main/resources/templates/febs/views/modules/chat/userList.html
New file
@@ -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>
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">
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