Quellcode durchsuchen

Merge branch 'package' of GameCenter/game-center into dev

zhimo vor 1 Jahr
Ursprung
Commit
4578e8b63e
19 geänderte Dateien mit 584 neuen und 29 gelöschten Zeilen
  1. 20 0
      game-data/game-data-base/pom.xml
  2. 45 0
      game-data/game-data-base/src/main/java/com/zangxiang/game/base/pojo/dto/SendMsgDto.java
  3. 15 0
      game-data/game-data-base/src/main/java/com/zangxiang/game/base/rpc/SendMsgRpc.java
  4. 2 4
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/RoleManageController.java
  5. 9 4
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/SendMsgTaskDto.java
  6. 10 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IRoleManageService.java
  7. 232 4
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java
  8. 43 0
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/dto/SendMsgDto.java
  9. 1 0
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/rpc/GameAuthRpc.java
  10. 14 0
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/rpc/SendMsgRpc.java
  11. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  12. 5 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/dto/KfWebSocketMsgDTO.java
  13. 55 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/rpc/impl/SendMsgImpl.java
  14. 8 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/ISendMsgTaskService.java
  15. 7 2
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/KfAppletMsgServiceImpl.java
  16. 11 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/SendMsgTaskServiceImpl.java
  17. 15 14
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/websocket/KfMsgWebsocketHandler.java
  18. 82 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/SendMsgTask.java
  19. 9 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/SendMsgTaskMapper.java

+ 20 - 0
game-data/game-data-base/pom.xml

@@ -16,4 +16,24 @@
         <maven.compiler.target>8</maven.compiler.target>
     </properties>
 
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-definition-protobuf</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.zanxiang.module</groupId>
+            <artifactId>zx-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-core</artifactId>
+        </dependency>
+    </dependencies>
+
 </project>

+ 45 - 0
game-data/game-data-base/src/main/java/com/zangxiang/game/base/pojo/dto/SendMsgDto.java

@@ -0,0 +1,45 @@
+package com.zangxiang.game.base.pojo.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.util.List;
+
+@Data
+public class SendMsgDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 创建人
+     */
+    private Long createBy;
+
+    /**
+     * 任务名称
+     */
+    private String taskName;
+    /**
+     * 消息
+     */
+    private String msg;
+    /**
+     * 角色列表
+     */
+    private List<String> roles;
+
+    /**
+     * 发送对象条件(筛选条件放入JSON)
+     */
+    private String sendConditionJson;
+
+    /**
+     * 游戏名称
+     */
+    private String gameName;
+
+
+
+
+}

+ 15 - 0
game-data/game-data-base/src/main/java/com/zangxiang/game/base/rpc/SendMsgRpc.java

@@ -0,0 +1,15 @@
+package com.zangxiang.game.base.rpc;
+
+
+import com.zangxiang.game.base.pojo.dto.SendMsgDto;
+import com.zanxiang.module.util.pojo.ResultVO;
+
+/**
+ * @author : ZhangXianyu
+ * @time : 2024-03-13 11:05:18
+ * @description : 发送消息
+ */
+public interface SendMsgRpc {
+
+    ResultVO<Boolean> sendMsg(SendMsgDto sendMsgDto);
+}

+ 2 - 4
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/RoleManageController.java

@@ -48,13 +48,11 @@ public class RoleManageController {
     }
 
     @ApiOperation(value = "创建发送消息任务")
-    @PreAuthorize(permissionKey = "roleManage:sendMsgTask:create")
+//    @PreAuthorize(permissionKey = "roleManage:sendMsgTask:create")
     @PostMapping("/sendMsgTask")
-    public ResultVO rcreateSendMsgTask(@RequestBody SendMsgTaskDto dto) {
+    public ResultVO createSendMsgTask(@RequestBody SendMsgTaskDto dto) {
         roleManageService.createSendMsgTask(dto);
         return ResultVO.ok();
     }
 
-
-
 }

+ 9 - 4
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/SendMsgTaskDto.java

@@ -6,6 +6,7 @@ import lombok.Data;
 
 import java.io.Serializable;
 import java.time.LocalDate;
+import java.util.List;
 
 /**
  * @author ZhangXianyu
@@ -13,7 +14,7 @@ import java.time.LocalDate;
  * @Description 发送消息任务参数
  **/
 @Data
-public class SendMsgTaskDto implements Serializable {
+public class SendMsgTaskDto  implements Serializable {
 
     /**
      * 任务名称
@@ -46,10 +47,14 @@ public class SendMsgTaskDto implements Serializable {
      */
     private String sendContent;
     /**
-     * 发送对象条件(筛选条件放入JSON)
-     * {@link RoleRechargeRankingDTO}
+     * 任务条件
      */
-    private String sendConditionJson;
+    private RoleRechargeRankingDTO roleRechargeRankingDTO;
+
+    /**
+     * 用户id
+     */
+    private List<String> roleIds;
 
 
 

+ 10 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IRoleManageService.java

@@ -5,6 +5,7 @@ import com.zanxiang.game.data.serve.pojo.dto.RoleRechargeRankingDTO;
 import com.zanxiang.game.data.serve.pojo.dto.SendMsgTaskDto;
 import com.zanxiang.game.data.serve.utils.Page;
 
+import java.util.List;
 import java.util.Map;
 
 public interface IRoleManageService {
@@ -18,4 +19,13 @@ public interface IRoleManageService {
      * @param dto
      */
     void createSendMsgTask(SendMsgTaskDto dto);
+
+
+    /**
+     * 获取角色列表
+     * @param dto
+     * @return
+     */
+    List<Map> getRoleList(RoleRechargeRankingDTO dto);
+
 }

+ 232 - 4
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java

@@ -1,13 +1,19 @@
 package com.zanxiang.game.data.serve.service.impl;
 
+import com.alibaba.fastjson2.JSON;
+import com.zangxiang.game.base.pojo.dto.SendMsgDto;
 import com.zanxiang.erp.base.ErpServer;
 import com.zanxiang.erp.base.rpc.ISysUserRpc;
+import com.zanxiang.erp.security.util.SecurityUtil;
 import com.zanxiang.game.data.serve.pojo.dto.RoleCombatRankingDTO;
 import com.zanxiang.game.data.serve.pojo.dto.RoleRechargeRankingDTO;
 import com.zanxiang.game.data.serve.pojo.dto.SendMsgTaskDto;
 import com.zanxiang.game.data.serve.pojo.enums.OrderByEnum;
 import com.zanxiang.game.data.serve.service.IRoleManageService;
 import com.zanxiang.game.data.serve.utils.Page;
+import com.zanxiang.module.util.JsonUtil;
+import com.zanxiang.module.util.exception.BaseException;
+import com.zanxiang.module.util.pojo.ResultVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -20,11 +26,9 @@ import org.nutz.dao.sql.Criteria;
 import org.nutz.dao.sql.Sql;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import com.zangxiang.game.base.rpc.SendMsgRpc;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -42,6 +46,11 @@ public class RoleManageServiceImpl implements IRoleManageService {
     @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
     private ISysUserRpc sysUserRpc;
 
+    @DubboReference
+    private SendMsgRpc sendMsgRpc;
+
+
+
     /**
      * 角色充值排行榜
      * @param dto RoleRechargeRankingDTO
@@ -323,8 +332,227 @@ public class RoleManageServiceImpl implements IRoleManageService {
      */
     @Override
     public void createSendMsgTask(SendMsgTaskDto dto) {
+        //获取当前用户id
+        Long sysUserId = SecurityUtil.getUserId();
+
+        //构建发送消息dto
+        SendMsgDto sendMsgDto = buildSendMsgDto(dto, sysUserId);
+
+        //调用发送消息接口
+        ResultVO<Boolean> booleanResultVO = sendMsgRpc.sendMsg(sendMsgDto);
+        if (!booleanResultVO.isSuccess()) {
+            throw new BaseException(booleanResultVO.getMsg());
+        }
+    }
+
+    private SendMsgDto buildSendMsgDto(SendMsgTaskDto dto, Long sysUserId) {
+        //先查出来所有的角色
+        List<Map> roleList = getRoleList(dto.getRoleRechargeRankingDTO());
+
+        //筛选出角色id
+        List<String> roleIdList = roleList.stream()
+                .map(map -> Optional.ofNullable(map.get("role_id")).map(Object::toString).orElse(null))
+                .collect(Collectors.toList());
+
+        SendMsgDto sendMsgDto = new SendMsgDto();
+        sendMsgDto.setTaskName(dto.getTaskName());
+        sendMsgDto.setMsg(dto.getSendContent());
+
+        //暂时用前端传的角色id后期在用自己查的
+        sendMsgDto.setRoles(dto.getRoleIds());
+        sendMsgDto.setCreateBy(sysUserId);
+
+        if (!roleList.isEmpty()) {
+            String gameName = roleList.get(0).get("role_reg_parent_game_name").toString();
+            sendMsgDto.setGameName(gameName);
+        }
+        //条件
+        RoleRechargeRankingDTO roleRechargeRankingDTO = dto.getRoleRechargeRankingDTO();
+        sendMsgDto.setSendConditionJson(JSON.toJSONString(roleRechargeRankingDTO));
+
+        return sendMsgDto;
+    }
+
+
+
+    /**
+     * 获取角色列表
+     * @param dto
+     * @return
+     */
+    @Override
+    public List<Map> getRoleList(RoleRechargeRankingDTO dto) {
+
+        //默认查询不合服的数据
+        if (dto.getIsMergeServer() == null) {
+            dto.setIsMergeServer(Boolean.FALSE);
+        }
+        //创建查询条件 给主表使用
+        Criteria criA = Cnd.cri();
+        if (CollectionUtils.isNotEmpty(dto.getGameId())) {
+            //角色注册子游戏
+            criA.where().andInList("role_reg_game_id", dto.getGameId());
+        }
+
+        //拼接24内充值金额条件
+        if(dto.getRechargeAmountWithin24h()!=null){
+            criA = spliceRechargeAmountWithin24h(dto, criA);
+        }
+        if(dto.getRechargeTotalAmountWithin24h()!=null){
+            criA = spliceRechargeTotalAmountWithin24h(dto, criA);
+        }
 
+        if (CollectionUtils.isNotEmpty(dto.getParentGameIds())) {
+            //角色注册父游戏
+            criA.where().andInList("role_reg_parent_game_id", dto.getParentGameIds());
+        }
+        if (dto.getSuperGameId() != null) {
+            //角色注册超父游戏
+            criA.where().andEquals("role_reg_super_game_id", dto.getSuperGameId());
+        }
+        if (StringUtils.isNotBlank(dto.getSourceSystem())) {
+            criA.where().andEquals("source_system", dto.getSourceSystem());
+        }
+        if (StringUtils.isNotBlank(dto.getRoleId())) {
+            criA.where().andEquals("role_id", dto.getRoleId());
+        }
+        if (StringUtils.isNotBlank(dto.getRoleName())) {
+            criA.where().andLike("role_name", dto.getRoleName());
+        }
+        if (CollectionUtils.isNotEmpty(dto.getServerIds()) && !dto.getIsMergeServer()) {
+            //区服列表查询,不合服的区服
+            criA.where().andIn("server_id", dto.getServerIds().toArray(String[]::new));
+        }
+        if (CollectionUtils.isNotEmpty(dto.getServerIds()) && dto.getIsMergeServer()) {
+            //合服区服列表查询
+            criA.where().andIn("merge_server_id", dto.getServerIds().toArray(String[]::new));
+        }
+        if (dto.getCreateRoleBeginDate() != null && dto.getCreateRoleEndDate() != null) {
+            //角色创建时间
+            criA.where().andBetween("DATE(role_create_time)", dto.getCreateRoleBeginDate(), dto.getCreateRoleEndDate());
+        }
+        if (CollectionUtils.isNotEmpty(dto.getVipLevel())) {
+            //角色vip等级
+            criA.where().andInList("vip_level", dto.getVipLevel());
+        }
+        if (dto.getIsSendMail() != null) {
+            criA.where().andEquals("is_send_mail", dto.getIsSendMail());
+        }
+        if (dto.getIsChange() != null) {
+            if (dto.getIsChange() == 2) {
+                //是否转端
+                criA.where().andIsNull("is_change_game_type");
+            } else {
+                //是否转端
+                criA.where().andEquals("is_change_game_type", dto.getIsChange());
+            }
+        }
+        if (StringUtils.isNotBlank(dto.getWeChatCompany())) {
+            //企业微信号
+            criA.where().andLike("add_corp_user_id", dto.getWeChatCompany());
+        }
+        if (StringUtils.isNotBlank(dto.getWeChat())) {
+            //客户微信
+            criA.where().andLike("user_wechat", dto.getWeChat());
+        }
+        if (StringUtils.isNotBlank(dto.getPhone())) {
+            //客户手机号
+            criA.where().andEquals("user_phone", dto.getPhone());
+        }
+        if (dto.getGsId() != null) {
+            //GS
+            if (dto.getGsId() == 0L) {
+                criA.where().andIsNull("gs_id");
+            } else {
+                criA.where().andEquals("gs_id", dto.getGsId());
+            }
+        }
+        if (dto.getPitcherId() != null) {
+            //投手
+            criA.where().andEquals("put_user_id", dto.getPitcherId());
+        }
+        if (dto.getOperatorId() != null) {
+            //运营
+            if (dto.getOperatorId() == 0L) {
+                criA.where().andIsNull("oper_user_id");
+            } else {
+                criA.where().andEquals("oper_user_id", dto.getOperatorId());
+            }
+        }
+        if (dto.getCustomerServerId() != null) {
+            //客服
+            if (dto.getCustomerServerId() == 0L) {
+                criA.where().andIsNull("customer_service_id");
+            } else {
+                criA.where().andEquals("customer_service_id", dto.getCustomerServerId());
+            }
+        }
+        if (dto.getTotalRechargeMin() != null) {
+            //累计充值金额最小值
+            criA.where().andGTE("amount", dto.getTotalRechargeMin());
+        }
+        if (dto.getTotalRechargeMax() != null) {
+            //累计充值金额最大值
+            criA.where().andLTE("amount", dto.getTotalRechargeMax());
+        }
+        if (StringUtils.isNotBlank(dto.getOs())) {
+            //玩家操作系统
+            criA.where().andEquals("os", dto.getOs());
+        }
+        if (dto.getIsRemoveGame() != null) {
+            if (dto.getIsRemoveGame() == 2) {
+                //是否退游
+                criA.where().andIsNull("is_remove_game");
+            } else {
+                //是否退游
+                criA.where().andEquals("is_remove_game", dto.getIsRemoveGame());
+            }
+        }
+        if (dto.getIsRemoveGameForSystem() != null) {
+            //是否退游(系统判定)
+            criA.where().andEquals("is_remove_game_for_system", dto.getIsRemoveGameForSystem());
+        }
+        if (dto.getIsWakeUp() != null) {
+            if (dto.getIsWakeUp() == 2) {
+                //是否唤醒
+                criA.where().andIsNull("is_wake_up");
+            } else {
+                //是否唤醒
+                criA.where().andEquals("is_wake_up", dto.getIsWakeUp());
+            }
+        }
+        if (dto.getIsAddCorpWechat() != null) {
+            if (dto.getIsAddCorpWechat() == 2) {
+                //是否添加企微
+                criA.where().andIsNull("is_add_corp_wechat");
+            } else {
+                //是否添加企微
+                criA.where().andEquals("is_add_corp_wechat", dto.getIsAddCorpWechat());
+            }
+        }
+        //给充值时间查询条件
+        Criteria criTodayAmount = Cnd.cri();
+        //查询充值成功的
+        criTodayAmount.where().andEquals("status", 2);
+        if (dto.getRechargeBeginDate() != null && dto.getRechargeEndDate() != null) {
+            //充值时间限制
+            criTodayAmount.where().andBetween("DATE(pay_time)", dto.getRechargeBeginDate(), dto.getRechargeEndDate());
+        }
 
+        //主表添加排序条件
+        if (StringUtils.isBlank(dto.getSortType())) {
+            dto.setSortType(OrderByEnum.DESC.getOrderType());
+        }
+        if (StringUtils.isBlank(dto.getSortFiled())) {
+            criA.getOrderBy().orderBy("amount", dto.getSortType());
+        } else {
+            criA.getOrderBy().orderBy(dto.getSortFiled(), dto.getSortType());
+        }
+        //创建sql
+        Sql sql = Sqls.create(getRoleRechargeRankingSql(criA, criTodayAmount));
+        sql.setCallback(Sqls.callback.maps());
+        dao.execute(sql);
+        return sql.getList(Map.class);
     }
 
     /**

+ 43 - 0
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/dto/SendMsgDto.java

@@ -0,0 +1,43 @@
+package com.zanxiang.game.module.base.pojo.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.util.List;
+
+@Data
+public class SendMsgDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 任务名称
+     */
+    private String taskName;
+
+    /**
+     * 创建人
+     */
+    private Long createBy;
+
+    /**
+     * 消息
+     */
+    private String msg;
+    /**
+     * 角色列表
+     */
+    private List<String> roles;
+
+    /**
+     * 发送对象条件(筛选条件放入JSON)
+     */
+    private String sendConditionJson;
+
+    /**
+     * 游戏名称
+     */
+    private String gameName;
+
+}

+ 1 - 0
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/rpc/GameAuthRpc.java

@@ -16,4 +16,5 @@ public interface GameAuthRpc {
      * @return {@link GameAuthUserVO}
      */
     ResultVO<GameAuthUserVO> getGameAuthByUserIds();
+
 }

+ 14 - 0
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/rpc/SendMsgRpc.java

@@ -0,0 +1,14 @@
+package com.zanxiang.game.module.base.rpc;
+
+import com.zanxiang.game.module.base.pojo.dto.SendMsgDto;
+import com.zanxiang.module.util.pojo.ResultVO;
+
+/**
+ * @author : ZhangXianyu
+ * @time : 2024-03-13 11:05:18
+ * @description : 发送消息
+ */
+public interface SendMsgRpc {
+
+    ResultVO<Boolean> sendMsg(SendMsgDto sendMsgDto);
+}

+ 1 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java

@@ -23,7 +23,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 <调试接入线程锁加日志> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 <解决接入线程锁的问题> ( ´・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 5 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/dto/KfWebSocketMsgDTO.java

@@ -55,6 +55,11 @@ public class KfWebSocketMsgDTO {
      */
     private ResultBean result;
 
+    /**
+     * 最新待接入玩家信息
+     */
+    private WaitUserBean lastWaitUser;
+
     /**
      * 游戏列表, 全量不分页
      */

+ 55 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/rpc/impl/SendMsgImpl.java

@@ -0,0 +1,55 @@
+package com.zanxiang.game.module.manage.rpc.impl;
+
+import com.zanxiang.game.module.base.pojo.dto.SendMsgDto;
+import com.zanxiang.game.module.base.rpc.SendMsgRpc;
+import com.zanxiang.game.module.manage.service.ISendMsgTaskService;
+import com.zanxiang.game.module.manage.service.impl.SendMsgTaskServiceImpl;
+import com.zanxiang.game.module.mybatis.entity.SendMsgTask;
+import com.zanxiang.module.util.pojo.ResultVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Date;
+
+@DubboService
+@Slf4j
+public class SendMsgImpl implements SendMsgRpc {
+
+    @Resource
+    private ISendMsgTaskService sendMsgTaskService;
+
+    @Override
+    public ResultVO<Boolean> sendMsg(SendMsgDto sendMsgDto) {
+        try {
+            // 数据校验
+            if (sendMsgDto == null || sendMsgDto.getMsg() == null || sendMsgDto.getGameName() == null || sendMsgDto.getCreateBy() == null || sendMsgDto.getRoles() == null || sendMsgDto.getRoles().isEmpty()) {
+                return ResultVO.fail("参数不能为空");
+            }
+            //创建任务
+            SendMsgTask sendMsgTask = createSendMsgTask(sendMsgDto);
+            //保存任务
+            sendMsgTaskService.save(sendMsgTask);
+            //todo:发送消息
+            log.info("发送消息成功");
+            return ResultVO.ok();
+        } catch (Exception e) {
+            log.error("发送消息异常, sendMsgDto : {}, e : {}", sendMsgDto, e.getMessage());
+            return ResultVO.fail("发送消息异常");
+        }
+    }
+
+    private SendMsgTask createSendMsgTask(SendMsgDto sendMsgDto) {
+        SendMsgTask sendMsgTask = new SendMsgTask();
+        sendMsgTask.setTaskName(sendMsgDto.getTaskName());
+        sendMsgTask.setMsg(sendMsgDto.getMsg());
+        sendMsgTask.setTaskCondition(sendMsgDto.getSendConditionJson());
+        sendMsgTask.setGameName(sendMsgDto.getGameName());
+        sendMsgTask.setCreateBy(sendMsgDto.getCreateBy());
+        sendMsgTask.setCreateTime(LocalDate.now(ZoneId.of("UTC")));
+        sendMsgTask.setRoleIds(String.join(",", sendMsgDto.getRoles()));
+        return sendMsgTask;
+    }
+}

+ 8 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/ISendMsgTaskService.java

@@ -0,0 +1,8 @@
+package com.zanxiang.game.module.manage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.mybatis.entity.RoleOperate;
+import com.zanxiang.game.module.mybatis.entity.SendMsgTask;
+
+public interface ISendMsgTaskService extends IService<SendMsgTask> {
+}

+ 7 - 2
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/KfAppletMsgServiceImpl.java

@@ -146,7 +146,7 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
                     .eq(KfSessionUser::getOpenId, kfAppletMsgDTO.getFromUserName()));
         }
         //消息转发到redis频道
-        this.pushMessage(this.transform(kfRoom, gameApplet.getGameId(), kfRoomMsg, msgContent));
+        this.pushMessage(this.transform(kfRoom, gameApplet.getGameId(), kfAppletMsgDTO.getFromUserName(), kfRoomMsg, msgContent));
     }
 
     private void monitorWordHandle(GameApplet gameApplet, KfAppletMsgDTO kfAppletMsgDTO) {
@@ -243,7 +243,8 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
         }
     }
 
-    private KfWebSocketMsgDTO transform(KfRoom kfRoom, Long gameId, KfRoomMsg kfRoomMsg, KfWebSocketMsgDTO.MsgContentBean msgContent) {
+    private KfWebSocketMsgDTO transform(KfRoom kfRoom, Long gameId, String openId, KfRoomMsg kfRoomMsg,
+                                        KfWebSocketMsgDTO.MsgContentBean msgContent) {
         //消息类型
         KfWebSocketMsgEnum kfWebSocketMsgEnum = kfRoom == null ? KfWebSocketMsgEnum.WEBSOCKET_MSG_WAIT_LIST
                 : KfWebSocketMsgEnum.WEBSOCKET_MSG_ROOM_MSG;
@@ -256,6 +257,10 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
         //待接入消息
         if (Objects.equals(kfWebSocketMsgEnum, KfWebSocketMsgEnum.WEBSOCKET_MSG_WAIT_LIST)) {
             List<KfWebSocketMsgDTO.WaitUserBean> waitUserList = kfSessionUserService.getWaitUserList(gameId);
+            KfWebSocketMsgDTO.WaitUserBean waitUserBean = waitUserList.stream()
+                    .filter(waitUser -> Objects.equals(waitUser.getOpenId(), openId))
+                    .findFirst().orElse(null);
+            kfWebSocketMsgDTO.setLastWaitUser(waitUserBean);
             kfWebSocketMsgDTO.setWaitUserList(waitUserList);
         }
         //房间消息

+ 11 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/SendMsgTaskServiceImpl.java

@@ -0,0 +1,11 @@
+package com.zanxiang.game.module.manage.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.module.manage.service.ISendMsgTaskService;
+import com.zanxiang.game.module.mybatis.entity.SendMsgTask;
+import com.zanxiang.game.module.mybatis.mapper.SendMsgTaskMapper;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SendMsgTaskServiceImpl extends ServiceImpl<SendMsgTaskMapper,SendMsgTask> implements ISendMsgTaskService {
+}

+ 15 - 14
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/websocket/KfMsgWebsocketHandler.java

@@ -4,15 +4,13 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.zanxiang.erp.base.pojo.TokenInfo;
 import com.zanxiang.erp.security.util.SecurityUtil;
 import com.zanxiang.game.module.manage.constant.RedisKeyConstant;
-import com.zanxiang.game.module.manage.enums.KfOperateEnum;
-import com.zanxiang.game.module.manage.enums.KfRoomMsgOwnerEnum;
-import com.zanxiang.game.module.manage.enums.KfRoomMsgTypeEnum;
-import com.zanxiang.game.module.manage.enums.KfWebSocketMsgEnum;
+import com.zanxiang.game.module.manage.enums.*;
 import com.zanxiang.game.module.manage.pojo.dto.KfWebSocketMsgDTO;
 import com.zanxiang.game.module.manage.pojo.params.KfWebSocketMsgParam;
 import com.zanxiang.game.module.manage.service.*;
 import com.zanxiang.game.module.manage.service.api.KfWxApiService;
 import com.zanxiang.game.module.manage.utils.FileUtil;
+import com.zanxiang.game.module.manage.utils.RedisUtil;
 import com.zanxiang.game.module.mybatis.entity.KfRoom;
 import com.zanxiang.game.module.mybatis.entity.KfRoomMsg;
 import com.zanxiang.game.module.mybatis.entity.KfSessionUser;
@@ -33,7 +31,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.concurrent.TimeUnit;
 
 /**
  * @author : lingfeng
@@ -69,6 +66,9 @@ public class KfMsgWebsocketHandler implements WebSocketHandler {
     @Autowired
     private IKfQuickReplyService kfQuickReplyService;
 
+    @Autowired
+    private RedisUtil<String> redisUtil;
+
     @Autowired
     private RedisTemplate<String, String> redisTemplate;
 
@@ -328,11 +328,12 @@ public class KfMsgWebsocketHandler implements WebSocketHandler {
                 .roomList(onlineRoomList)
                 .build());
         //以防锁依然存在, 尝试释放锁, 锁如果不存在, 会抛出异常, 直接捕获不处理
+        String lockKey = RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + kfRoom.getOpenId();
         try {
-            log.error("结束会话释放锁, key : {}", RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + kfRoom.getOpenId());
-            distributedLockComponent.unlock(RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + kfRoom.getOpenId());
+            log.error("结束会话释放锁, key : {}", lockKey);
+            redisUtil.deleteCache(lockKey);
         } catch (Exception e) {
-            log.error("结束会话释放锁异常, key : {}, e : {}", RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + kfRoom.getOpenId(), e.getMessage());
+            log.error("结束会话释放锁异常, key : {}, e : {}", lockKey, e.getMessage());
         }
     }
 
@@ -390,15 +391,15 @@ public class KfMsgWebsocketHandler implements WebSocketHandler {
         //玩家信息, 判断玩家是否已经被接入
         KfSessionUser kfSessionUser = kfSessionUserService.getById(param.getOpenId());
         if (!kfSessionUser.getIsWait()) {
-            this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(), "玩家已被其他客服接入, 非待接入状态"));
+            this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(), "玩家非待接入状态(已被其他客服接入)"));
             return;
         }
         //触发玩家接入线程锁
-        log.error("玩家接入触发线程锁, key : {}", RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + param.getOpenId());
-        if (!distributedLockComponent.doLock(RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + param.getOpenId(),
-                0L, 3L, TimeUnit.MINUTES)) {
-            log.error("玩家接入线程锁, 锁定中, key : {}", RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + param.getOpenId());
-            this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(), "玩家已被其他客服接入"));
+        String lockKey = RedisKeyConstant.KF_MSG_USER_CONNECT_JOIN + param.getOpenId();
+        log.error("玩家接入触发线程锁, key : {}", lockKey);
+        if (!redisUtil.setIfAbsent(lockKey, lockKey, ExpireTimeEnum.FIVE_MIN.getTime())) {
+            log.error("玩家接入锁碰撞, 未接入成功, key : {}", lockKey);
+            this.sendMessage(session, KfWebSocketMsgDTO.fail(param.getWebSocketMsgType(), "玩家非待接入状态,(其他客服已抢先接入)"));
             return;
         }
         //玩家更新为已接入

+ 82 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/SendMsgTask.java

@@ -0,0 +1,82 @@
+package com.zanxiang.game.module.mybatis.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @author : ZhangXianyu
+ * @time : 2024-03-13 14:03:40
+ * @description : 发送消息任务实体类
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Builder
+@TableName("t_cp_send_msg_task")
+public class SendMsgTask implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 消息内容
+     */
+    private String msg;
+
+    /**
+     * 任务人数
+     */
+    private Long roleIdCount;
+
+    /**
+     * 任务名称
+     */
+    private String taskName;
+
+    /**
+     * 任务条件
+     */
+    private String taskCondition;
+
+    /**
+     * 游戏id
+     */
+    private Long gameId;
+
+    /**
+     * 任务类型
+     */
+    private String type;
+
+    /**
+     * 任务状态
+     */
+    private String status;
+
+    /**
+     * 创建人
+     */
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+}

+ 9 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/SendMsgTaskMapper.java

@@ -0,0 +1,9 @@
+package com.zanxiang.game.module.mybatis.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zanxiang.game.module.mybatis.entity.SendMsgTask;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface SendMsgTaskMapper extends BaseMapper<SendMsgTask> {
+}