xiaoyong931011
2023-10-10 18fb219ee5ed5c267665b4c84d2306eea25349f6
redbagprod
10 files added
18 files modified
1014 ■■■■ changed files
src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java 92 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/AdminChatController.java 59 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ViewChatController.java 54 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/AdminBasicSettingDto.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/ChatAmountFlow.java 3 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/ChatGroup.java 69 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/ChatUser.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/DataDictionary.java 30 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/ChatGroupMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/ChatUserMapper.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/DataDictionaryMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IAdminChatService.java 15 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AdminChatServiceImpl.java 53 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminGroupInfoVo.java 37 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/AdminGroupVo.java 41 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/controller/UnipayController.java 4 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImplAli.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/service/impl/WxPayServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java 39 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java 31 ●●●●● patch | view | raw | blame | history
src/main/resources/application-prod.yml 2 ●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/ChatUserMapper.xml 52 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/chat/basicSetting.html 73 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/chat/groupEdit.html 136 ●●●●● patch | view | raw | blame | history
src/main/resources/templates/febs/views/modules/chat/groupList.html 164 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
@@ -31,96 +31,4 @@
        return new RabbitTemplate(connectionFactory);
    }
    @Bean
    public DirectExchange defaultExchange() {
        return new DirectExchange(ExchangeConstants.EXCHANGE_DEFAULT);
    }
    @Bean
    public Queue defaultQueue() {
        return new Queue(QueueConstants.QUEUE_DEFAULT);
    }
    @Bean
    public Binding defaultBind() {
        return BindingBuilder.bind(defaultQueue()).to(defaultExchange()).with(RouteKeyConstants.ROUTE_KEY_DEFAULT);
    }
    @Bean
    public DirectExchange delayTtlExchange() {
        return new DirectExchange(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getExchange());
    }
    @Bean
    public DirectExchange orderDelayExchange() {
        return new DirectExchange(RabbitQueueEnum.ORDER_CANCEL_DELAY.getExchange());
    }
    @Bean
    public Queue orderDelayQueue() {
        return new Queue(RabbitQueueEnum.ORDER_CANCEL_DELAY.getQueue());
    }
    @Bean
    public Queue orderDelayQueueTtl() {
        return QueueBuilder.durable(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getQueue())
                //到期后转发的交换机
                .withArgument("x-dead-letter-exchange", RabbitQueueEnum.ORDER_CANCEL_DELAY.getExchange())
                //到期后转发的路由键
                .withArgument("x-dead-letter-routing-key", RabbitQueueEnum.ORDER_CANCEL_DELAY.getRoute())
                .build();
    }
    @Bean
    public Binding orderDelayBind() {
        return BindingBuilder.bind(orderDelayQueue()).to(orderDelayExchange()).with(RabbitQueueEnum.ORDER_CANCEL_DELAY.getRoute());
    }
    @Bean
    public Binding orderDelayBindTtl() {
        return BindingBuilder.bind(orderDelayQueueTtl()).to(delayTtlExchange()).with(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getRoute());
    }
    @Bean
    public Queue autoLevelUpAgentQueue() {
        return new Queue(QueueConstants.AGENT_AUTO_LEVEL_UP);
    }
    @Bean
    public Binding autoLevelUpBind() {
        return BindingBuilder.bind(autoLevelUpAgentQueue()).to(defaultExchange()).with(RouteKeyConstants.ROUTE_KEY_DEFAULT);
    }
    // 订单返利 开始
    @Bean
    public DirectExchange agentReturnMoneyExchange() {
        return new DirectExchange(RabbitQueueEnum.AGENT_RETURN_MONEY.getExchange());
    }
    @Bean
    public Queue agentReturnMoneyQueue() {
        return new Queue(QueueConstants.AGENT_RETURN_MONEY);
    }
    @Bean
    public Binding agentReturnMoneyBind() {
        return BindingBuilder.bind(agentReturnMoneyQueue()).to(agentReturnMoneyExchange()).with(RabbitQueueEnum.AGENT_RETURN_MONEY.getRoute());
    }
    // 订单返利 结束
    @Bean
    public DirectExchange orderReturnMoneyExchange() {
        return new DirectExchange(RabbitQueueEnum.ORDER_RETURN_MONEY.getExchange());
    }
    @Bean
    public Queue orderReturnMoneyQueue() {
        return new Queue(QueueConstants.ORDER_RETURN_MONEY);
    }
    @Bean
    public Binding orderReturnMoneyBind() {
        return BindingBuilder.bind(orderReturnMoneyQueue()).to(orderReturnMoneyExchange()).with(RabbitQueueEnum.ORDER_RETURN_MONEY.getRoute());
    }
}
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
@@ -6,6 +6,13 @@
@Getter
public enum DataDictionaryEnum {
    /**
     * 模式类型
     * 1:简单模式-正常模式
     * 2:困难模式
     */
    MODEL_TYPE("MODEL_TYPE", "MODEL_TYPE"),
    //积分池设置{"everydayRatio":10,"dividEquallyRatio":1}每日订单的百分之几,增加到积分池;每日平分百分比
    SCORE_POOR_RADIO("SCORE_POOR", "SCORE_POOR_RADIO"),
src/main/java/cc/mrbird/febs/mall/controller/AdminChatController.java
@@ -4,11 +4,12 @@
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.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.mall.dto.*;
import cc.mrbird.febs.mall.entity.ChatUser;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.service.IAdminChatService;
import cc.mrbird.febs.mall.vo.AdminGroupInfoVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
@@ -66,7 +67,7 @@
    }
    /**
     * 用户列表---开启
     * 是否是机器人---开启
     *
     * @param userId
     * @return
@@ -77,7 +78,7 @@
        return iAdminChatService.openSwitchIsRobot(userId);
    }
    /**
     * 用户列表---关闭
     * 是否是机器人---关闭
     *
     * @param userId
     * @return
@@ -147,4 +148,54 @@
    public FebsResponse disagreeEvent(@NotNull(message = "{required}") @PathVariable String id) {
        return iAdminChatService.disagreeEvent(id);
    }
    @PostMapping(value = "/basicSetting")
    public FebsResponse basicSetting(AdminBasicSettingDto adminBasicSettingDto) {
        iAdminChatService.updateDataDic(
                DataDictionaryEnum.MODEL_TYPE.getType(),
                DataDictionaryEnum.MODEL_TYPE.getCode(),
                adminBasicSettingDto.getModelType());
        return new FebsResponse().success();
    }
    /**
     * 会员充值
     */
    @GetMapping("groupList")
    public FebsResponse groupList(ChatUser chatUser, QueryRequest request) {
        Map<String, Object> data = getDataTable(iAdminChatService.getGroupList(chatUser, request));
        return new FebsResponse().success().data(data);
    }
    /**
     * 使用机器人---开启
     *
     * @param id
     * @return
     */
    @GetMapping("openSwitchUseRobot/{id}")
    @ControllerEndpoint(operation = "会员列表---开启", exceptionMessage = "操作失败")
    public FebsResponse openSwitchUseRobot(@NotNull(message = "{required}") @PathVariable String id) {
        return iAdminChatService.openSwitchUseRobot(id);
    }
    /**
     * 使用机器人---关闭
     *
     * @param id
     * @return
     */
    @GetMapping("closeSwitchUseRobot/{id}")
    @ControllerEndpoint(operation = "会员列表---关闭", exceptionMessage = "操作失败")
    public FebsResponse closeSwitchUseRobot(@NotNull(message = "{required}") @PathVariable String id) {
        return iAdminChatService.closeSwitchUseRobot(id);
    }
    /**
     * 群组管理-更新
     */
    @PostMapping("updateGroupInfo")
    @ControllerEndpoint(operation = "新闻中心-更新", exceptionMessage = "操作失败")
    public FebsResponse updateGroupInfo(AdminGroupInfoVo adminGroupInfoVo) {
        return iAdminChatService.updateGroupInfo(adminGroupInfoVo);
    }
}
src/main/java/cc/mrbird/febs/mall/controller/ViewChatController.java
@@ -2,11 +2,20 @@
import cc.mrbird.febs.common.controller.BaseController;
import cc.mrbird.febs.common.entity.FebsConstant;
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.common.utils.FebsUtil;
import cc.mrbird.febs.mall.dto.AdminBasicSettingDto;
import cc.mrbird.febs.mall.dto.CashOutSettingDto;
import cc.mrbird.febs.mall.entity.DataDictionary;
import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
import cc.mrbird.febs.mall.entity.MallNewsInfo;
import cc.mrbird.febs.mall.mapper.ChatUserMapper;
import cc.mrbird.febs.mall.mapper.DataDictionaryMapper;
import cc.mrbird.febs.mall.service.IAdminMallMemberService;
import cc.mrbird.febs.mall.vo.AdminChatWalletVo;
import cc.mrbird.febs.mall.vo.AdminGroupInfoVo;
import cc.mrbird.febs.mall.vo.MallMemberVo;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
@@ -24,6 +33,9 @@
    @Resource
    private ChatUserMapper chatUserMapper;
    @Resource
    private DataDictionaryMapper dataDictionaryMapper;
    /**
     * 用户列表
@@ -78,4 +90,46 @@
    public String chatWithDrawList() {
        return FebsUtil.view("modules/chat/chatWithDrawList");
    }
    /**
     * 基础设置
     * @param model
     * @return
     */
    @GetMapping("basicSetting")
    @RequiresPermissions("basicSetting:update")
    public String cashOutSetting(Model model) {
        AdminBasicSettingDto adminBasicSettingDto = new AdminBasicSettingDto();
        DataDictionary modelTypeDic = chatUserMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.MODEL_TYPE.getType(),
                DataDictionaryEnum.MODEL_TYPE.getCode());
        if (modelTypeDic != null) {
            adminBasicSettingDto.setModelType(modelTypeDic.getValue());
        }
        model.addAttribute("basicSet", adminBasicSettingDto);
        return FebsUtil.view("modules/chat/basicSetting");
    }
    /**
     * 群组管理
     * @return
     */
    @GetMapping("groupList")
    @RequiresPermissions("groupList:view")
    public String groupList() {
        return FebsUtil.view("modules/chat/groupList");
    }
    /**
     * 群组管理-详情
     * @return
     */
    @GetMapping("groupInfo/{id}")
    @RequiresPermissions("editGroup:info")
    public String groupInfo(@PathVariable long id, Model model) {
        AdminGroupInfoVo data = chatUserMapper.getGroupInfoById(id);
        model.addAttribute("groupInfo", data);
        return FebsUtil.view("modules/chat/groupEdit");
    }
}
src/main/java/cc/mrbird/febs/mall/dto/AdminBasicSettingDto.java
New file
@@ -0,0 +1,13 @@
package cc.mrbird.febs.mall.dto;
import lombok.Data;
@Data
public class AdminBasicSettingDto {
    /**
     * 模式类型
     * 1:简单模式-正常模式
     * 2:困难模式
     */
    private String modelType;
}
src/main/java/cc/mrbird/febs/mall/entity/ChatAmountFlow.java
@@ -1,5 +1,6 @@
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 lombok.Data;
@@ -16,7 +17,7 @@
    /**
     * 主键
     */
    @TableId
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 1:充值 2:提现 3:红包 4:转账 5:创建群聊
src/main/java/cc/mrbird/febs/mall/entity/ChatGroup.java
New file
@@ -0,0 +1,69 @@
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 lombok.Data;
import java.util.Date;
/**
 * <p>
 * 群组实体类
 * q3z3
 * </p>
 */
@Data
@TableName("chat_group")
public class ChatGroup {
    private static final long serialVersionUID = 1L;
    /**
     * 主键
     */
    @TableId(value = "id",type = IdType.AUTO)
    private Long id;
    /**
     * 群名
     */
    private String name;
    /**
     * 公告
     */
    private String notice;
    /**
     * 头像
     */
    private String portrait;
    /**
     * 群主
     */
    private Long master;
    /**
     * 创建时间
     */
    private Date createTime;
    /**
     * 金额下限
     */
    private Integer amountMin;
    /**
     * 金额上限
     */
    private Integer amountMax;
    /**
     * 红包个数
     */
    private Integer redBagCnt;
    /**
     * 是否使用机器人 1:是  0:否
     */
    private Integer useRobot;
    /**
     * 模式类型 1:简单模式-正常模式 2:困难模式
     */
    private Integer modelType;
}
src/main/java/cc/mrbird/febs/mall/entity/ChatUser.java
@@ -120,6 +120,9 @@
    private String address;
    @TableField(exist = false)
    private String name;
    @TableField(exist = false)
    private Integer state;
src/main/java/cc/mrbird/febs/mall/entity/DataDictionary.java
New file
@@ -0,0 +1,30 @@
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 lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
@Data
@TableName("data_dictionary")
public class DataDictionary implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private String type;
    private String code;
    private String value;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
}
src/main/java/cc/mrbird/febs/mall/mapper/ChatGroupMapper.java
New file
@@ -0,0 +1,7 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.ChatGroup;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface ChatGroupMapper extends BaseMapper<ChatGroup> {
}
src/main/java/cc/mrbird/febs/mall/mapper/ChatUserMapper.java
@@ -1,6 +1,7 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.ChatUser;
import cc.mrbird.febs.mall.entity.DataDictionary;
import cc.mrbird.febs.mall.entity.MemberCoinWithdraw;
import cc.mrbird.febs.mall.vo.*;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -35,4 +36,12 @@
    void updateAmountFlowListByWithdrawId(@Param("id")String id, @Param("userId")String userId, @Param("state")int i);
    void updateIsRobotByUserId(@Param("userId")String userId, @Param("isRobot")int i);
    DataDictionary selectDicDataByTypeAndCode(@Param("type") String type, @Param("code") String code);
    IPage<AdminGroupVo> selectGroupListInPage(Page<AdminGroupVo> page, @Param("record")ChatUser chatUser);
    void updateIsRobotByGroupId(@Param("id")String id, @Param("useRobot")int i);
    AdminGroupInfoVo getGroupInfoById(@Param("id")long id);
}
src/main/java/cc/mrbird/febs/mall/mapper/DataDictionaryMapper.java
New file
@@ -0,0 +1,7 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.DataDictionary;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface DataDictionaryMapper extends BaseMapper<DataDictionary> {
}
src/main/java/cc/mrbird/febs/mall/service/IAdminChatService.java
@@ -4,10 +4,7 @@
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 cc.mrbird.febs.mall.vo.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -34,4 +31,14 @@
    FebsResponse openSwitchIsRobot(String userId);
    FebsResponse closeSwitchIsRobot(String userId);
    void updateDataDic(String type, String code, String modelType);
    IPage<AdminGroupVo> getGroupList(ChatUser chatUser, QueryRequest request);
    FebsResponse closeSwitchUseRobot(String id);
    FebsResponse openSwitchUseRobot(String id);
    FebsResponse updateGroupInfo(AdminGroupInfoVo adminGroupInfoVo);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AdminChatServiceImpl.java
@@ -5,16 +5,13 @@
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.mall.YesOrNoEnum;
import cc.mrbird.febs.mall.dto.AdminSystemPayDto;
import cc.mrbird.febs.mall.entity.ChatAmountFlow;
import cc.mrbird.febs.mall.entity.ChatUser;
import cc.mrbird.febs.mall.entity.MemberCoinWithdraw;
import cc.mrbird.febs.mall.entity.*;
import cc.mrbird.febs.mall.mapper.ChatAmountFlowMapper;
import cc.mrbird.febs.mall.mapper.ChatGroupMapper;
import cc.mrbird.febs.mall.mapper.ChatUserMapper;
import cc.mrbird.febs.mall.mapper.DataDictionaryMapper;
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 cc.mrbird.febs.mall.vo.*;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -35,6 +32,8 @@
public class AdminChatServiceImpl extends ServiceImpl<ChatUserMapper, ChatUser> implements IAdminChatService {
    private final ChatAmountFlowMapper chatAmountFlowMapper;
    private final DataDictionaryMapper dataDictionaryMapper;
    private final ChatGroupMapper chatGroupMapper;
    private final RedisUtils redisUtils;
    @Override
@@ -179,4 +178,44 @@
        return new FebsResponse().success();
    }
    @Override
    public void updateDataDic(String type, String code, String modelType) {
        DataDictionary dic = this.baseMapper.selectDicDataByTypeAndCode(type, code);
        if (dic != null) {
            dic.setValue(modelType);
            dataDictionaryMapper.updateById(dic);
        }
    }
    @Override
    public IPage<AdminGroupVo> getGroupList(ChatUser chatUser, QueryRequest request) {
        Page<AdminGroupVo> page = new Page<>(request.getPageNum(), request.getPageSize());
        return this.baseMapper.selectGroupListInPage(page, chatUser);
    }
    @Override
    public FebsResponse closeSwitchUseRobot(String id) {
        this.baseMapper.updateIsRobotByGroupId(id,0);
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse openSwitchUseRobot(String id) {
        this.baseMapper.updateIsRobotByGroupId(id,1);
        return new FebsResponse().success();
    }
    @Override
    public FebsResponse updateGroupInfo(AdminGroupInfoVo adminGroupInfoVo) {
        ChatGroup chatGroup = chatGroupMapper.selectById(adminGroupInfoVo.getId());
        if(ObjectUtil.isEmpty(chatGroup)) {
            return new FebsResponse().fail().message("信息不存在");
        }
        chatGroup.setAmountMin(adminGroupInfoVo.getAmountMin());
        chatGroup.setAmountMax(adminGroupInfoVo.getAmountMax());
        chatGroup.setRedBagCnt(adminGroupInfoVo.getRedBagCnt());
        chatGroup.setModelType(adminGroupInfoVo.getModelType());
        chatGroupMapper.updateById(chatGroup);
        return new FebsResponse().success();
    }
}
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -215,7 +215,6 @@
        }
        this.baseMapper.updateById(orderInfo);
        agentProducer.sendOrderCancelDelayMsg(orderInfo.getId(), 15 * 60 * 1000L);
        return orderInfo.getId();
    }
@@ -346,9 +345,6 @@
                commonService.addAchieveAndUpdateLevel(orderInfo.getId(),orderInfo.getMemberId());
                mallMoneyFlowService.addMoneyFlow(member.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue());
                agentProducer.sendAutoLevelUpMsg(member.getId());
//                agentProducer.sendOrderReturn(orderInfo.getId());
                agentProducer.sendReturnMoneyMsg(orderInfo.getId());
                break;
            case "4":
                if (orderInfo.getOrderType() != 2) {
src/main/java/cc/mrbird/febs/mall/vo/AdminGroupInfoVo.java
New file
@@ -0,0 +1,37 @@
package cc.mrbird.febs.mall.vo;
import lombok.Data;
import java.util.Date;
@Data
public class AdminGroupInfoVo {
    private Long id;
    private String name;
    private String phone;
    private String nickName;
    /**
     * 是否使用机器人 1:是  0:否
     */
    private Integer useRobot;
    /**
     * 金额下限
     */
    private Integer amountMin;
    /**
     * 金额上限
     */
    private Integer amountMax;
    /**
     * 红包个数
     */
    private Integer redBagCnt;
    /**
     * 模式类型 1:简单模式-正常模式 2:困难模式
     */
    private Integer modelType;
}
src/main/java/cc/mrbird/febs/mall/vo/AdminGroupVo.java
New file
@@ -0,0 +1,41 @@
package cc.mrbird.febs.mall.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class AdminGroupVo {
    private Long id;
    private String name;
    private String phone;
    private String nickName;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;
    /**
     * 是否使用机器人 1:是  0:否
     */
    private Integer useRobot;
    /**
     * 金额下限
     */
    private Integer amountMin;
    /**
     * 金额上限
     */
    private Integer amountMax;
    /**
     * 红包个数
     */
    private Integer redBagCnt;
    /**
     * 模式类型 1:简单模式-正常模式 2:困难模式
     */
    private Integer modelType;
}
src/main/java/cc/mrbird/febs/pay/controller/UnipayController.java
@@ -137,8 +137,6 @@
                    }
                    mallMoneyFlowService.addMoneyFlow(mallMember.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue());
                    agentProducer.sendAutoLevelUpMsg(mallMember.getId());
                    agentProducer.sendOrderReturn(orderInfo.getId());
                }
            }
        }
@@ -250,8 +248,6 @@
                    }
                    mallMoneyFlowService.addMoneyFlow(mallMember.getId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue());
                    agentProducer.sendAutoLevelUpMsg(mallMember.getId());
                    agentProducer.sendOrderReturn(orderInfo.getId());
                }
            }
        }
src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImplAli.java
@@ -102,7 +102,6 @@
        orderInfoMapper.updateById(orderInfo);
//        agentProducer.sendReturnMoneyMsg(orderInfo.getId());
        agentProducer.sendAutoLevelUpMsg(orderInfo.getMemberId());
//        memberService.addMoneyFlow(orderInfo.getMemberId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), null, null, null, null, FlowTypeEnum.BALANCE.getValue());
    }
src/main/java/cc/mrbird/febs/pay/service/impl/WxPayServiceImpl.java
@@ -117,8 +117,6 @@
        commonService.addAchieveAndUpdateLevel(orderInfo.getId(),orderInfo.getMemberId());
        mallMoneyFlowService.addMoneyFlow(orderInfo.getMemberId(), orderInfo.getAmount().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.WX.getValue());
        agentProducer.sendAutoLevelUpMsg(orderInfo.getMemberId());
        agentProducer.sendReturnMoneyMsg(orderInfo.getId());
    }
}
src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
@@ -24,15 +24,6 @@
    @Autowired
    private IApiMallOrderInfoService orderInfoService;
    @Autowired
    private IAgentService agentService;
    @Autowired
    private IMemberProfitService memberProfitService;
//    @RabbitListener(queues = QueueConstants.QUEUE_DEFAULT)
//    public void agentReturn(Message message, Channel channel) {
//        log.info("消费者:{}", new String(message.getBody()));
//    }
    @RabbitListener(queues = "queue_h_order_delay")
    public void orderCancelDelay(String id) {
@@ -42,34 +33,4 @@
            log.error("订单超时支付异常", e);
        }
    }
    @RabbitListener(queues = QueueConstants.AGENT_AUTO_LEVEL_UP)
    public void agentAutoLevelUp(String id) {
        log.info("收到代理自动升级消息:{}", id);
        try {
            agentService.autoUpAgentLevel(Long.parseLong(id));
        } catch (Exception e) {
            log.error("代理自动升级异常", e);
        }
    }
    @RabbitListener(queues = QueueConstants.AGENT_RETURN_MONEY)
    public void agentReturnMoney(String orderId) {
        log.info("收到返利消息:{}", orderId);
        try {
            agentService.returnMoneyToAgent(Long.parseLong(orderId));
        } catch (Exception e) {
            log.error("返利异常", e);
        }
    }
//    @RabbitListener(queues = QueueConstants.ORDER_RETURN_MONEY)
//    public void orderReturnMoney(String orderId) {
//        log.info("收到订单返利消息:{}", orderId);
//        try {
//            memberProfitService.dynamicProfit(Long.parseLong(orderId));
//        } catch (Exception e) {
//            log.error("订单返利异常:", e);
//        }
//    }
}
src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
@@ -5,13 +5,6 @@
@Getter
public enum RabbitQueueEnum {
    DEFAULT("exchange_h_default", "route_key_h_default", "queue_h_default"),
    ORDER_CANCEL_DELAY_TTL("exchange_h_order_delay_ttl", "route_key_h_order_delay_ttl", "queue_h_order_delay_ttl"),
    ORDER_CANCEL_DELAY("exchange_h_order_delay", "route_key_h_order_delay", "queue_h_order_delay"),
    AGENT_RETURN_MONEY("exchange_h_agent_return_money", "route_key_h_agent_return_money", "queue_h_agent_return_money"),
    ORDER_RETURN_MONEY("exchange_h_order_return_money", "route_key_h_order_return_money", "queue_h_order_return_money");
    private String exchange;
src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java
@@ -45,35 +45,4 @@
    }
    public void sendOrderReturn(Long id) {
        log.info("发送消息:{}", id);
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_RETURN_MONEY.getExchange(), RabbitQueueEnum.ORDER_RETURN_MONEY.getRoute(), id, correlationData);
    }
    public void sendOrderCancelDelayMsg(Long id, Long times) {
        log.info("发送自动取消订单消息:{}, {}", id, times);
        rabbitTemplate.convertAndSend(RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getExchange(), RabbitQueueEnum.ORDER_CANCEL_DELAY_TTL.getRoute(), id, new MessagePostProcessor() {
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                message.getMessageProperties().setExpiration(String.valueOf(times));
                return message;
            }
        });
    }
    /**
     * 发送代理自动升级消息
     *
     * @param memberId
     */
    public void sendAutoLevelUpMsg(@NotNull Long memberId) {
        log.info("发送代理自动升级消息:{}", memberId);
        rabbitTemplate.convertAndSend(ExchangeConstants.EXCHANGE_DEFAULT, RouteKeyConstants.ROUTE_KEY_DEFAULT, memberId);
    }
    public void sendReturnMoneyMsg(Long orderId) {
        log.info("发送返利消息:{}", orderId);
        rabbitTemplate.convertAndSend(RabbitQueueEnum.AGENT_RETURN_MONEY.getExchange(), RabbitQueueEnum.AGENT_RETURN_MONEY.getRoute(), orderId);
    }
}
src/main/resources/application-prod.yml
@@ -2,7 +2,7 @@
  datasource:
    dynamic:
      # 是否开启 SQL日志输出,生产环境建议关闭,有性能损耗
      p6spy: false
      p6spy: true
      hikari:
        connection-timeout: 30000
        max-lifetime: 1800000
src/main/resources/mapper/modules/ChatUserMapper.xml
@@ -164,4 +164,56 @@
        where user_id = #{userId}
    </update>
    <select id="selectDicDataByTypeAndCode" resultType="cc.mrbird.febs.mall.entity.DataDictionary">
        select * from data_dictionary a
        where a.type=#{type} and a.code=#{code}
    </select>
    <select id="selectGroupListInPage" resultType="cc.mrbird.febs.mall.vo.AdminGroupVo">
        select
        a.id id,
        a.use_robot useRobot,
        a.name name,
        a.model_type modelType,
        a.amount_min amountMin,
        a.amount_max amountMax,
        a.red_bag_cnt redBagCnt,
        b.phone phone,
        b.nick_name nickName,
        a.create_time createTime
        from chat_group a
        left join chat_user b on b.user_id = a.master
        <where>
            <if test="record != null">
                <if test="record.name != null and record.name != ''">
                    and a.name like CONCAT('%', CONCAT(#{record.name}, '%'))
                </if>
            </if>
        </where>
        order by a.create_time desc
    </select>
    <update id="updateIsRobotByGroupId">
        update chat_group
        set
            use_robot = #{useRobot}
        where id = #{id}
    </update>
    <select id="getGroupInfoById" resultType="cc.mrbird.febs.mall.vo.AdminGroupInfoVo">
        select
        a.id id,
        a.name name,
        b.phone phone,
        a.model_type modelType,
        b.nick_name nickName,
        a.use_robot useRobot,
        a.amount_min amountMin,
        a.amount_max amountMax,
        a.red_bag_cnt redBagCnt
        from chat_group a
        left join chat_user b on b.user_id = a.master
        where id = #{id}
    </select>
</mapper>
src/main/resources/templates/febs/views/modules/chat/basicSetting.html
New file
@@ -0,0 +1,73 @@
<div class="layui-fluid layui-anim febs-anim" id="basic-setting" lay-title="基础设置">
    <div class="layui-row layui-col-space8 febs-container">
        <form class="layui-form" action="" lay-filter="basic-setting-form">
            <div class="layui-card">
                <div class="layui-card-body">
                    <blockquote class="layui-elem-quote blue-border">模式设置</blockquote>
                    <div class="layui-form-item">
                        <label class="layui-form-label febs-form-item-require">模式:</label>
                        <div class="layui-input-block">
                            <input type="radio" name="modelType" value="1" title="简单模式">
                            <input type="radio" name="modelType" value="2" title="困难模式">
                        </div>
                        <div class="layui-word-aux" style="margin-left: 150px;">简单模式-正常模式</div>
                        <div class="layui-word-aux" style="margin-left: 150px;">困难模式</div>
                    </div>
                </div>
                <div class="layui-card-footer">
                    <button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="basic-setting-form-submit" id="submit">保存</button>
                </div>
            </div>
        </form>
    </div>
</div>
<style>
    .layui-form-label {
        width: 120px;
    }
    .layui-form-item .layui-input-block {
        margin-left: 150px;
    }
    .layui-table-form .layui-form-item {
        margin-bottom: 20px !important;
    }
</style>
<script data-th-inline="javascript" type="text/javascript">
    layui.use(['dropdown', 'jquery', 'validate', 'febs', 'form', 'eleTree'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            form = layui.form,
            basicSet = [[${basicSet}]],
            validate = layui.validate,
            $view = $('#basic-setting');
        form.verify({
            integer: [
                /^[1-9]\d*$/
                , '只能输入正整数'
            ]
        });
        initBasicSetValue();
        form.render();
        function initBasicSetValue() {
            form.val("basic-setting-form", {
                "modelType": basicSet.modelType,
            });
        }
        form.on('submit(basic-setting-form-submit)', function (data) {
            febs.post(ctx + 'admin/chat/basicSetting', data.field, function (res) {
                febs.alert.success('设置成功');
            });
            window.location.reload();
            return false;
        });
    });
</script>
src/main/resources/templates/febs/views/modules/chat/groupEdit.html
New file
@@ -0,0 +1,136 @@
<style>
    #febs-group-edit {
        padding: 20px 25px 25px 0;
    }
    #febs-group-edit .layui-treeSelect .ztree li a, .ztree li span {
        margin: 0 0 2px 3px !important;
    }
    #febs-group-edit #data-permission-tree-block {
        border: 1px solid #eee;
        border-radius: 2px;
        padding: 3px 0;
    }
    #febs-group-edit .layui-treeSelect .ztree li span.button.switch {
        top: 1px;
        left: 3px;
    }
    #febs-group-edit img{
        max-width:100px
    }
</style>
<div class="layui-fluid" id="febs-group-edit">
    <form class="layui-form" action="" lay-filter="febs-group-edit-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" data-th-value="${groupInfo.id}">
            </div>
        </div>
        <blockquote class="layui-elem-quote blue-border">基本信息</blockquote>
        <div class="layui-row layui-col-space10 layui-form-item">
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">群主昵称:</label>
                <div class="layui-input-block">
                    <input type="text" name="phone" autocomplete="off" class="layui-input" readonly>
                </div>
            </div>
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">群主账号:</label>
                <div class="layui-input-block">
                    <input type="text" name="nickName" autocomplete="off" class="layui-input" readonly>
                </div>
            </div>
        </div>
        <div class="layui-row layui-col-space10 layui-form-item">
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">名称:</label>
                <div class="layui-input-block">
                    <input type="text" name="name" autocomplete="off" class="layui-input" readonly>
                </div>
            </div>
        </div>
        <blockquote class="layui-elem-quote blue-border">群设置</blockquote>
        <div class="layui-row layui-col-space10 layui-form-item">
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">最小金额:</label>
                <div class="layui-input-block">
                    <input type="text" name="amountMin" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">最大金额:</label>
                <div class="layui-input-block">
                    <input type="text" name="amountMax" autocomplete="off" class="layui-input">
                </div>
            </div>
        </div>
        <div class="layui-row layui-col-space10 layui-form-item">
            <div class="layui-col-lg6">
                <label class="layui-form-label febs-form-item-require">每轮人数:</label>
                <div class="layui-input-block">
                    <input type="text" name="redBagCnt" autocomplete="off" class="layui-input">
                </div>
                <div class="layui-word-aux" style="margin-left: 150px;">设置为7,则每次红包可以有7个人抢。</div>
            </div>
        </div>
        <div class="layui-row layui-col-space10 layui-form-item">
            <div class="layui-col-lg6">
                <label class="layui-form-label">模式:</label>
                <div class="layui-input-block">
                    <input type="radio" name="modelType" value="1" title="简单模式" checked="">
                    <input type="radio" name="modelType" value="2" title="困难模式" >
                </div>
                <div class="layui-word-aux" style="margin-left: 150px;">困难模式,红包中只有一个不会中雷。</div>
            </div>
        </div>
        <div class="layui-form-item febs-hide">
            <button class="layui-btn" lay-submit="" lay-filter="febs-group-edit-form-submit" id="submit"></button>
        </div>
    </form>
</div>
<script data-th-inline="javascript">
    layui.use(['febs', 'form', 'formSelects', 'validate', 'treeSelect', 'eleTree','layedit', 'laydate', 'upload'], function () {
        var $ = layui.$,
            febs = layui.febs,
            layer = layui.layer,
            upload = layui.upload,
            formSelects = layui.formSelects,
            form = layui.form,
            laydate = layui.laydate,
            layedit = layui.layedit,
            groupInfo = [[${groupInfo}]],
            $view = $('#febs-group-edit');
        initGroupInfoValue();
        form.render();
        formSelects.render();
        form.on('submit(febs-group-edit-form-submit)', function (data) {
            febs.post(ctx + 'admin/chat/updateGroupInfo', data.field, function () {
                layer.closeAll();
                febs.alert.success('操作成功');
                $('#febs-group-list').find('#reset').click();
            });
            return false;
        });
        function initGroupInfoValue() {
            form.val("febs-group-edit-form", {
                "id": groupInfo.id,
                "name": groupInfo.name,
                "phone": groupInfo.phone,
                "nickName": groupInfo.nickName,
                "amountMin": groupInfo.amountMin,
                "amountMax": groupInfo.amountMax,
                "redBagCnt": groupInfo.redBagCnt,
                "modelType": groupInfo.modelType,
            });
        }
    });
</script>
src/main/resources/templates/febs/views/modules/chat/groupList.html
New file
@@ -0,0 +1,164 @@
<div class="layui-fluid layui-anim febs-anim" id="febs-group-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="group-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="name" 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="groupTable" lay-data="{id: 'groupTable'}"></table>
                </div>
            </div>
        </div>
    </div>
</div>
<!--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>
<script type="text/html" id="switchUseRobot">
    {{# if(d.useRobot === 1) { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" checked lay-skin="switch" lay-filter="switchUseRobot">
    {{# } else { }}
    <input type="checkbox" value={{d.id}} lay-text="是|否" lay-skin="switch" lay-filter="switchUseRobot">
    {{# } }}
</script>
<script type="text/html" id="isModelType">
    {{# if(d.modelType === 1) { }}
    <span>简单模式</span>
    {{# } else { }}
    <span>困难模式</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-group-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(groupTable)', function (obj) {
            var data = obj.data,
                layEvent = obj.event;
            if (layEvent === 'editGroup') {
                febs.modal.open('编辑', 'modules/chat/groupInfo/' + data.id, {
                    btn: ['提交', '取消'],
                    // area:['100%','100%'],
                    yes: function (index, layero) {
                        $('#febs-group-edit').find('#submit').trigger('click');
                    },
                    btn2: function () {
                        layer.closeAll();
                    }
                });
            }
        });
        // 查询按钮
        $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 {
                name: $searchForm.find('input[name="name"]').val().trim(),
            };
        }
        function initTable() {
            tableIns = febs.table.init({
                elem: $view.find('table'),
                id: 'groupTable',
                url: ctx + 'admin/chat/groupList',
                cols: [[
                    {field: 'id', title: '编号', minWidth: 100,align:'center'},
                    {field: 'name', title: '名称', minWidth: 150,align:'center'},
                    {field: 'nickName', title: '群主昵称', minWidth: 150,align:'center'},
                    {field: 'phone', title: '群主电话', minWidth: 150,align:'center'},
                    {field: 'amountMin', title: '上限', minWidth: 100,align:'center'},
                    {field: 'amountMax', title: '下限', minWidth: 100,align:'center'},
                    {field: 'redBagCnt', title: '红包个数', minWidth: 100,align:'center'},
                    {field: 'useRobot', title: '使用机器人', templet: '#switchUseRobot', minWidth: 80,align:'center'},
                    {templet:"#isModelType", title: '模式', minWidth: 150,align:'center'},
                    {field: 'createTime', title: '创建时间', minWidth: 180,align:'center'},
                    {title: '操作',
                        templet: function (d) {
                            return '<button class="layui-btn layui-btn-normal layui-btn-xs layui-btn-success" lay-event="editGroup" shiro:hasPermission="editGroup:info">编辑</button>'
                        },minWidth: 150,align:'center'}
                ]]
            });
        }
        form.on('switch(switchUseRobot)', function (data) {
            if (data.elem.checked) {
                openSwitchUseRobot(data.value);
            } else {
                closeSwitchUseRobot(data.value);
            }
        })
        function openSwitchUseRobot(id) {
            febs.get(ctx + 'admin/chat/openSwitchUseRobot/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
        function closeSwitchUseRobot(id) {
            febs.get(ctx + 'admin/chat/closeSwitchUseRobot/' + id, null, function () {
                febs.alert.success('操作成功');
                $query.click();
            });
        }
    })
</script>