Pārlūkot izejas kodu

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

zhimo 1 gadu atpakaļ
vecāks
revīzija
11495f2fc7
35 mainītis faili ar 648 papildinājumiem un 216 dzēšanām
  1. 0 45
      game-data/game-data-base/src/main/java/com/zangxiang/game/base/pojo/dto/SendMsgDto.java
  2. 17 0
      game-data/game-data-base/src/main/java/com/zangxiang/game/base/pojo/vo/SendMsgVo.java
  3. 0 15
      game-data/game-data-base/src/main/java/com/zangxiang/game/base/rpc/SendMsgRpc.java
  4. 9 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/RoleManageController.java
  5. 16 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/MsgTaskDto.java
  6. 27 19
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/SendMsgTaskDto.java
  7. 8 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IRoleManageService.java
  8. 6 4
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java
  9. 46 9
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java
  10. 6 6
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/dto/SendMsgDto.java
  11. 1 1
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/rpc/ICPSendMsgRpc.java
  12. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  13. 9 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/GameServerController.java
  14. 31 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/enums/CpSendMsgTaskStatusEnum.java
  15. 36 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/enums/CpSendMsgTaskTypeEnum.java
  16. 29 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/enums/GameServerAssignEnum.java
  17. 40 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameServerAssignParam.java
  18. 32 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameServerListVO.java
  19. 60 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/rpc/impl/CpSendMsgRpcImpl.java
  20. 0 52
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/rpc/impl/SendMsgImpl.java
  21. 7 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/ICPSendMsgTaskService.java
  22. 12 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameServerAssignLogService.java
  23. 12 3
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameServerService.java
  24. 0 8
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/ISendMsgTaskService.java
  25. 11 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/CPSendMsgTaskServiceImpl.java
  26. 18 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameServerAssignLogServiceImpl.java
  27. 113 30
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameServerServiceImpl.java
  28. 20 7
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/KfAppletMsgServiceImpl.java
  29. 0 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/KfMsgServiceImpl.java
  30. 0 11
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/SendMsgTaskServiceImpl.java
  31. 1 1
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/CpSendMsgTask.java
  32. 5 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameServer.java
  33. 61 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameServerAssignLog.java
  34. 2 2
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/CpSendMsgTaskMapper.java
  35. 12 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameServerAssignLogMapper.java

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

@@ -1,45 +0,0 @@
-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;
-
-
-
-
-}

+ 17 - 0
game-data/game-data-base/src/main/java/com/zangxiang/game/base/pojo/vo/SendMsgVo.java

@@ -0,0 +1,17 @@
+package com.zangxiang.game.base.pojo.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class SendMsgVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+
+
+
+
+}

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

@@ -1,15 +0,0 @@
-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);
-}

+ 9 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/RoleManageController.java

@@ -1,6 +1,8 @@
 package com.zanxiang.game.data.serve.controller;
 
+import com.zangxiang.game.base.pojo.vo.SendMsgVo;
 import com.zanxiang.erp.security.annotation.PreAuthorize;
+import com.zanxiang.game.data.serve.pojo.dto.MsgTaskDto;
 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;
@@ -55,4 +57,11 @@ public class RoleManageController {
         return ResultVO.ok();
     }
 
+    @ApiOperation(value = "查询发送消息任务列表")
+    @PreAuthorize(permissionKey = "roleManage:sendMsgTask:list")
+    @PostMapping("/sendMsgTask/list")
+    public ResultVO<Page<SendMsgVo>> getSendMsgTaskList(@RequestBody MsgTaskDto dto) {
+        return ResultVO.ok(roleManageService.getSendMsgTaskList(dto));
+    }
+
 }

+ 16 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/MsgTaskDto.java

@@ -0,0 +1,16 @@
+package com.zanxiang.game.data.serve.pojo.dto;
+
+import com.zanxiang.game.data.serve.pojo.base.BasePage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class MsgTaskDto extends BasePage {
+
+    @ApiModelProperty(value = "游戏id")
+    private Long gameId;
+
+    @ApiModelProperty(value = "游戏名称")
+    private String gameName;
+}

+ 27 - 19
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/SendMsgTaskDto.java

@@ -22,25 +22,9 @@ public class SendMsgTaskDto  implements Serializable {
     private String taskName;
 
     /**
-     * 任务调度策略
-     * {@link TaskStrategyEnum}
+     * 游戏id
      */
-    private Integer taskStrategy;
-
-    /**
-     * 定时发送时间
-     */
-    private LocalDate sendOnTime;
-
-    /**
-     * 定时发送开始时间
-     */
-    private LocalDate everyDayBeginTime;
-
-    /**
-     * 定时发送结束时间(默认2099表示永久)
-     */
-    private LocalDate everyDayEndTime;
+    private Long gameId;
 
     /**
      * 发送文本内容
@@ -52,11 +36,35 @@ public class SendMsgTaskDto  implements Serializable {
     private RoleRechargeRankingDTO roleRechargeRankingDTO;
 
     /**
-     * 用户id
+     * 角色id
      */
     private List<String> roleIds;
 
 
+//    /**
+//     * 任务调度策略
+//     * {@link TaskStrategyEnum}
+//     */
+//    private Integer taskStrategy;
+//
+//    /**
+//     * 定时发送时间
+//     */
+//    private LocalDate sendOnTime;
+//
+//    /**
+//     * 定时发送开始时间
+//     */
+//    private LocalDate everyDayBeginTime;
+//
+//    /**
+//     * 定时发送结束时间(默认2099表示永久)
+//     */
+//    private LocalDate everyDayEndTime;
+
+
+
+
 
 
 }

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

@@ -1,5 +1,7 @@
 package com.zanxiang.game.data.serve.service;
 
+import com.zangxiang.game.base.pojo.vo.SendMsgVo;
+import com.zanxiang.game.data.serve.pojo.dto.MsgTaskDto;
 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;
@@ -28,4 +30,10 @@ public interface IRoleManageService {
      */
     List<Map> getRoleList(RoleRechargeRankingDTO dto);
 
+    /**
+     * 获取发送消息任务列表
+     * @param dto
+     * @return
+     */
+    Page<SendMsgVo> getSendMsgTaskList(MsgTaskDto dto);
 }

+ 6 - 4
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java

@@ -5379,15 +5379,13 @@ public class GameDataServiceImpl implements IGameDataService {
         Sql costSql = Sqls.create(getTotalCostSql(costCri, costTable));
         costSql.setCallback(Sqls.callback.doubleValue());
         dao.execute(costSql);
-        //总消耗
-        return costSql.getDouble();
-
+        return costSql.getDouble(0.00);
     }
 
     private String getTotalCostSql(Criteria costCri, String costTable) {
         String sql = """
                 SELECT
-                        sum(cost) costCount
+                        IFNULL(sum(cost),0) costCount
                 FROM 
                 """ + costTable + """
                 """ + costCri + """
@@ -5628,6 +5626,10 @@ public class GameDataServiceImpl implements IGameDataService {
      */
     @Override
     public FlowMonitorCountVo getFlowMonitorCount(FlowMonitorDTO dto) {
+        //查询所有,所以给分页默认值
+        dto.setPageNum(1);
+        dto.setPageSize(100000);
+
         FlowMonitorCountVo vo = new FlowMonitorCountVo();
         Page<FlowMonitorVO> flowMonitor = basicService.getFlowMonitor(dto);
         List<FlowMonitorVO> records = flowMonitor.getRecords();

+ 46 - 9
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java

@@ -1,17 +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.zangxiang.game.base.pojo.vo.SendMsgVo;
 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.MsgTaskDto;
 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.game.module.base.pojo.dto.SendMsgDto;
+import com.zanxiang.game.module.base.rpc.SendMsgRpc;
 import com.zanxiang.module.util.exception.BaseException;
 import com.zanxiang.module.util.pojo.ResultVO;
 import lombok.extern.slf4j.Slf4j;
@@ -26,8 +28,8 @@ 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 javax.validation.Valid;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -51,6 +53,8 @@ public class RoleManageServiceImpl implements IRoleManageService {
 
 
 
+
+
     /**
      * 角色充值排行榜
      * @param dto RoleRechargeRankingDTO
@@ -332,6 +336,9 @@ public class RoleManageServiceImpl implements IRoleManageService {
      */
     @Override
     public void createSendMsgTask(SendMsgTaskDto dto) {
+        //校验参数
+        validation(dto);
+
         //获取当前用户id
         Long sysUserId = SecurityUtil.getUserId();
 
@@ -345,6 +352,26 @@ public class RoleManageServiceImpl implements IRoleManageService {
         }
     }
 
+    /**
+     * 校验参数
+     * @param dto
+     */
+    private void validation(SendMsgTaskDto dto) {
+        if (StringUtils.isBlank(dto.getTaskName())) {
+            throw new BaseException("任务名称不能为空");
+        }
+        if (StringUtils.isBlank(dto.getSendContent())) {
+            throw new BaseException("发送内容不能为空");
+        }
+        if(dto.getGameId()==null){
+            throw new BaseException("游戏id不能为空");
+        }
+        if(CollectionUtils.isEmpty(dto.getRoleIds())){
+            throw new BaseException("角色id不能为空");
+        }
+
+    }
+
     private SendMsgDto buildSendMsgDto(SendMsgTaskDto dto, Long sysUserId) {
         //先查出来所有的角色
         List<Map> roleList = getRoleList(dto.getRoleRechargeRankingDTO());
@@ -355,17 +382,16 @@ public class RoleManageServiceImpl implements IRoleManageService {
                 .collect(Collectors.toList());
 
         SendMsgDto sendMsgDto = new SendMsgDto();
+        //任务名称
         sendMsgDto.setTaskName(dto.getTaskName());
+        //消息
         sendMsgDto.setMsg(dto.getSendContent());
-
+        //游戏id
+        sendMsgDto.setGameId(dto.getGameId());
         //暂时用前端传的角色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));
@@ -555,6 +581,17 @@ public class RoleManageServiceImpl implements IRoleManageService {
         return sql.getList(Map.class);
     }
 
+    /**
+     * 获取发送消息任务列表
+     * @param dto dto
+     * @return Page<SendMsgVo>
+     */
+    @Override
+    public Page<SendMsgVo> getSendMsgTaskList(MsgTaskDto dto) {
+//        sendMsgRpc.getSendMsgTaskList(dto);
+        return null;
+    }
+
     /**
      * 通过id获取 GS、运营、客服人员、投手名字
      * @param dataMap dataMap

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

@@ -11,16 +11,15 @@ public class SendMsgDto implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    /**
-     * 任务名称
-     */
-    private String taskName;
-
     /**
      * 创建人
      */
     private Long createBy;
 
+    /**
+     * 任务名称
+     */
+    private String taskName;
     /**
      * 消息
      */
@@ -38,6 +37,7 @@ public class SendMsgDto implements Serializable {
     /**
      * 游戏名称
      */
-    private String gameName;
+    private Long gameId;
+
 
 }

+ 1 - 1
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/rpc/SendMsgRpc.java → game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/rpc/ICPSendMsgRpc.java

@@ -8,7 +8,7 @@ import com.zanxiang.module.util.pojo.ResultVO;
  * @time : 2024-03-13 11:05:18
  * @description : 发送消息
  */
-public interface SendMsgRpc {
+public interface ICPSendMsgRpc {
 
     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服务启动成功 <解决接入线程锁的问题01> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 <解决客服系统小程序消息推送的问题 ( ´・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 9 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/GameServerController.java

@@ -5,6 +5,7 @@ import com.zanxiang.erp.security.annotation.PreAuthorize;
 import com.zanxiang.game.module.manage.enums.GameServerExcelEnum;
 import com.zanxiang.game.module.manage.pojo.params.GameMergeServerParam;
 import com.zanxiang.game.module.manage.pojo.params.GameServerAddUpdateParam;
+import com.zanxiang.game.module.manage.pojo.params.GameServerAssignParam;
 import com.zanxiang.game.module.manage.pojo.params.GameServerListParam;
 import com.zanxiang.game.module.manage.pojo.vo.GameServerListVO;
 import com.zanxiang.game.module.manage.pojo.vo.GameServerVO;
@@ -41,6 +42,14 @@ public class GameServerController {
     @Autowired
     private IGameSupperService gameSupperService;
 
+    @ApiOperation(value = "区服指派")
+    @PostMapping(value = "/assign")
+    @PreAuthorize(permissionKey = "manage:gameServer:assign")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
+    public ResultVO<Boolean> gameServerAssign(@Validated @RequestBody GameServerAssignParam param) {
+        return ResultVO.ok(gameServerService.gameServerAssignBatch(param));
+    }
+
     @ApiOperation(value = "新增原始服合服excel")
     @PostMapping(value = "/add/excel")
     @PreAuthorize(permissionKey = "manage:gameServer:addExcel")

+ 31 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/enums/CpSendMsgTaskStatusEnum.java

@@ -0,0 +1,31 @@
+package com.zanxiang.game.module.manage.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+
+/**
+ * @author : ZhangXianyu
+ * @time : 2024-03-13 19:25:51
+ * @description : 任务状态枚举
+ */
+@Getter
+@AllArgsConstructor
+public enum CpSendMsgTaskStatusEnum {
+
+    /**
+     * 已发送
+     */
+    SUCCESS_SEND("SUCCESS_SEND"),
+
+    /**
+     * 待发送
+     */
+    WAIT_SEND("WAIT_SEND");
+
+    /**
+     * 任务类型
+     */
+    private String value;
+
+}

+ 36 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/enums/CpSendMsgTaskTypeEnum.java

@@ -0,0 +1,36 @@
+package com.zanxiang.game.module.manage.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+
+/**
+ * @author : ZhangXianyu
+ * @time : 2024-03-13 19:18:30
+ * @description : 消息任务类型枚举
+ */
+@Getter
+@AllArgsConstructor
+public enum CpSendMsgTaskTypeEnum {
+
+    /**
+     * 即时任务
+     */
+    IMMEDIATE_TASK("IMMEDIATE_TASK"),
+
+    /**
+     * 循环任务
+     */
+    CYCLE_TASK("CYCLE_TASK"),
+
+    /**
+     * 定时任务
+     */
+    SCHEDULE_TASK("SCHEDULE_TASK");
+
+    /**
+     * 任务类型
+     */
+    private String value;
+
+}

+ 29 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/enums/GameServerAssignEnum.java

@@ -0,0 +1,29 @@
+package com.zanxiang.game.module.manage.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-03-13
+ * @description : 区服指派枚举
+ */
+@Getter
+@AllArgsConstructor
+public enum GameServerAssignEnum {
+
+    /**
+     * 客服指派
+     */
+    GAME_SERVER_ASSIGN_CUSTOMER("GAME_SERVER_ASSIGN_CUSTOMER"),
+
+    /**
+     * GS指派
+     */
+    GAME_SERVER_ASSIGN_GS("GAME_SERVER_ASSIGN_GS");
+
+    /**
+     * 指派类型
+     */
+    private String value;
+}

+ 40 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameServerAssignParam.java

@@ -0,0 +1,40 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import com.zanxiang.game.module.manage.enums.GameServerAssignEnum;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-03-13
+ * @description : 区服指派
+ */
+@Data
+public class GameServerAssignParam {
+
+    /**
+     * 指派类型
+     */
+    @ApiModelProperty(notes = "指派类型")
+    @NotNull(message = "指派类型不可为空")
+    private GameServerAssignEnum assignType;
+
+    /**
+     * 区服的主键
+     */
+    @ApiModelProperty(notes = "区服的主键")
+    @NotNull(message = "区服主键id不可为空")
+    private List<Long> idList;
+
+    /**
+     * 指派的人员id
+     */
+    @NotEmpty(message = "指派的人员id不可为空")
+    @ApiModelProperty(notes = "指派的人员id")
+    private Set<Long> assignUserIdList;
+}

+ 32 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameServerListVO.java

@@ -6,7 +6,6 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
-import javax.validation.constraints.NotBlank;
 import java.time.LocalDateTime;
 import java.util.List;
 
@@ -117,6 +116,18 @@ public class GameServerListVO {
     @ApiModelProperty(notes = "合服时间")
     private LocalDateTime mergeTime;
 
+    /**
+     * 指派客服列表
+     */
+    @ApiModelProperty(notes = "指派客服列表")
+    private List<UserBean> customerList;
+
+    /**
+     * 指派GS列表
+     */
+    @ApiModelProperty(notes = "指派GS列表")
+    private List<UserBean> gsList;
+
     @Data
     @AllArgsConstructor
     @NoArgsConstructor
@@ -136,4 +147,24 @@ public class GameServerListVO {
         private String serverName;
 
     }
+
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
+    @Builder
+    public static class UserBean {
+
+        /**
+         * 人员id
+         */
+        @ApiModelProperty(notes = "人员id")
+        private Long userId;
+
+        /**
+         * 人员名称
+         */
+        @ApiModelProperty(notes = "人员名称")
+        private String userName;
+
+    }
 }

+ 60 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/rpc/impl/CpSendMsgRpcImpl.java

@@ -0,0 +1,60 @@
+package com.zanxiang.game.module.manage.rpc.impl;
+
+import com.zanxiang.game.module.base.pojo.dto.SendMsgDto;
+import com.zanxiang.game.module.base.rpc.ICPSendMsgRpc;
+import com.zanxiang.game.module.manage.enums.CpSendMsgTaskStatusEnum;
+import com.zanxiang.game.module.manage.enums.CpSendMsgTaskTypeEnum;
+import com.zanxiang.game.module.manage.service.ICPSendMsgTaskService;
+import com.zanxiang.game.module.mybatis.entity.CpSendMsgTask;
+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.LocalDateTime;
+import java.time.ZoneId;
+
+@DubboService
+@Slf4j
+public class CpSendMsgRpcImpl implements ICPSendMsgRpc {
+
+    @Resource
+    private ICPSendMsgTaskService sendMsgTaskService;
+
+    @Override
+    public ResultVO<Boolean> sendMsg(SendMsgDto sendMsgDto) {
+        try {
+            // 数据校验
+            if (sendMsgDto == null || sendMsgDto.getMsg() == null || sendMsgDto.getGameId() == null || sendMsgDto.getCreateBy() == null || sendMsgDto.getRoles() == null || sendMsgDto.getRoles().isEmpty()) {
+                return ResultVO.fail("参数不能为空");
+            }
+            //创建任务
+            CpSendMsgTask cpSendMsgTask = createSendMsgTask(sendMsgDto);
+            //保存任务
+            sendMsgTaskService.save(cpSendMsgTask);
+            //todo:发送消息
+            log.info("发送消息成功");
+            return ResultVO.ok();
+        } catch (Exception e) {
+            log.error("发送消息异常, sendMsgDto : {}, e : {}", sendMsgDto, e.getMessage());
+            return ResultVO.fail("发送消息异常");
+        }
+    }
+
+    private CpSendMsgTask createSendMsgTask(SendMsgDto dto) {
+        CpSendMsgTask cpSendMsgTask = new CpSendMsgTask();
+        cpSendMsgTask.setMsg(dto.getMsg());
+        cpSendMsgTask.setRoleIdCount((long) dto.getRoles().size());
+        cpSendMsgTask.setTaskName(dto.getTaskName());
+        cpSendMsgTask.setTaskCondition(dto.getSendConditionJson());
+        cpSendMsgTask.setGameId(dto.getGameId());
+        //任务类型
+        cpSendMsgTask.setType(CpSendMsgTaskTypeEnum.IMMEDIATE_TASK.getValue());
+        //任务状态
+        cpSendMsgTask.setStatus(CpSendMsgTaskStatusEnum.WAIT_SEND.getValue());
+        cpSendMsgTask.setCreateBy(dto.getCreateBy());
+        cpSendMsgTask.setCreateTime(LocalDateTime.now(ZoneId.of("UTC")));
+        cpSendMsgTask.setUpdateTime(LocalDateTime.now(ZoneId.of("UTC")));
+        return cpSendMsgTask;
+    }
+}

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

@@ -1,52 +0,0 @@
-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.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;
-
-@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;
-        return null;
-    }
-}

+ 7 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/ICPSendMsgTaskService.java

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

+ 12 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameServerAssignLogService.java

@@ -0,0 +1,12 @@
+package com.zanxiang.game.module.manage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.mybatis.entity.GameServerAssignLog;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-03-13
+ * @description : 区服指派
+ */
+public interface IGameServerAssignLogService extends IService<GameServerAssignLog> {
+}

+ 12 - 3
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameServerService.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.module.manage.enums.GameServerExcelEnum;
 import com.zanxiang.game.module.manage.pojo.params.GameMergeServerParam;
 import com.zanxiang.game.module.manage.pojo.params.GameServerAddUpdateParam;
+import com.zanxiang.game.module.manage.pojo.params.GameServerAssignParam;
 import com.zanxiang.game.module.manage.pojo.params.GameServerListParam;
 import com.zanxiang.game.module.manage.pojo.vo.GameServerListVO;
 import com.zanxiang.game.module.manage.pojo.vo.GameServerVO;
@@ -20,12 +21,20 @@ import java.util.List;
  */
 public interface IGameServerService extends IService<GameServer> {
 
+    /**
+     * 区服指派
+     *
+     * @param param : 提交参数
+     * @return : 返回更新结果
+     */
+    Boolean gameServerAssignBatch(GameServerAssignParam param);
+
     /**
      * 区服excel提交
      *
-     * @param multipartFile        文件流
-     * @param gameServerExcelEnum  操作类型枚举
-     * @param gameId               游戏id
+     * @param multipartFile       文件流
+     * @param gameServerExcelEnum 操作类型枚举
+     * @param gameId              游戏id
      * @return {@link Boolean}
      */
     Boolean gameServerExcelImport(MultipartFile multipartFile, GameServerExcelEnum gameServerExcelEnum, Long gameId);

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

@@ -1,8 +0,0 @@
-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> {
-}

+ 11 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/CPSendMsgTaskServiceImpl.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.ICPSendMsgTaskService;
+import com.zanxiang.game.module.mybatis.entity.CpSendMsgTask;
+import com.zanxiang.game.module.mybatis.mapper.CpSendMsgTaskMapper;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CPSendMsgTaskServiceImpl extends ServiceImpl<CpSendMsgTaskMapper, CpSendMsgTask> implements ICPSendMsgTaskService {
+}

+ 18 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameServerAssignLogServiceImpl.java

@@ -0,0 +1,18 @@
+package com.zanxiang.game.module.manage.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.module.manage.service.IGameServerAssignLogService;
+import com.zanxiang.game.module.mybatis.entity.GameServerAssignLog;
+import com.zanxiang.game.module.mybatis.mapper.GameServerAssignLogMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-03-13
+ * @description : 区服指派
+ */
+@Slf4j
+@Service
+public class GameServerAssignLogServiceImpl extends ServiceImpl<GameServerAssignLogMapper, GameServerAssignLog> implements IGameServerAssignLogService {
+}

+ 113 - 30
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameServerServiceImpl.java

@@ -7,27 +7,30 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.erp.base.ErpServer;
+import com.zanxiang.erp.base.rpc.ISysUserRpc;
 import com.zanxiang.erp.security.util.SecurityUtil;
 import com.zanxiang.game.module.base.pojo.enums.DeleteEnum;
+import com.zanxiang.game.module.manage.enums.GameServerAssignEnum;
 import com.zanxiang.game.module.manage.enums.GameServerExcelEnum;
 import com.zanxiang.game.module.manage.pojo.dto.GameDTO;
 import com.zanxiang.game.module.manage.pojo.dto.GameServerExcelDTO;
 import com.zanxiang.game.module.manage.pojo.params.GameMergeServerParam;
 import com.zanxiang.game.module.manage.pojo.params.GameServerAddUpdateParam;
+import com.zanxiang.game.module.manage.pojo.params.GameServerAssignParam;
 import com.zanxiang.game.module.manage.pojo.params.GameServerListParam;
 import com.zanxiang.game.module.manage.pojo.vo.GameServerListVO;
 import com.zanxiang.game.module.manage.pojo.vo.GameServerVO;
-import com.zanxiang.game.module.manage.service.IGameAuthService;
-import com.zanxiang.game.module.manage.service.IGameServerService;
-import com.zanxiang.game.module.manage.service.IGameService;
-import com.zanxiang.game.module.manage.service.IGameSupperService;
+import com.zanxiang.game.module.manage.service.*;
 import com.zanxiang.game.module.mybatis.entity.GameServer;
+import com.zanxiang.game.module.mybatis.entity.GameServerAssignLog;
 import com.zanxiang.game.module.mybatis.entity.GameSupper;
 import com.zanxiang.game.module.mybatis.mapper.GameServerMapper;
 import com.zanxiang.module.util.bean.BeanUtil;
 import com.zanxiang.module.util.excel.ExcelUtil;
 import com.zanxiang.module.util.exception.BaseException;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -51,6 +54,9 @@ import java.util.stream.Collectors;
 @Service
 public class GameServerServiceImpl extends ServiceImpl<GameServerMapper, GameServer> implements IGameServerService {
 
+    @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
+    private ISysUserRpc sysUserRpc;
+
     @Autowired
     private IGameService gameService;
 
@@ -60,6 +66,54 @@ public class GameServerServiceImpl extends ServiceImpl<GameServerMapper, GameSer
     @Autowired
     private IGameSupperService gameSupperService;
 
+    @Autowired
+    private IGameServerAssignLogService gameServerAssignLogService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean gameServerAssignBatch(GameServerAssignParam param) {
+        List<GameServer> gameServerList = super.listByIds(param.getIdList());
+        if (CollectionUtils.isEmpty(gameServerList)) {
+            throw new BaseException("参数错误, 区服信息不存在");
+        }
+        gameServerList.forEach(gameServer -> this.gameServerAssign(param, gameServer));
+        return Boolean.TRUE;
+    }
+
+    private void gameServerAssign(GameServerAssignParam param, GameServer gameServer) {
+        //老的指派人员id
+        String oldUserIds = null;
+        if (Objects.equals(param.getAssignType(), GameServerAssignEnum.GAME_SERVER_ASSIGN_GS)) {
+            oldUserIds = gameServer.getGsIds();
+        }
+        if (Objects.equals(param.getAssignType(), GameServerAssignEnum.GAME_SERVER_ASSIGN_CUSTOMER)) {
+            oldUserIds = gameServer.getCustomerIds();
+        }
+        //新的指派人员id
+        String userIds = null;
+        if (CollectionUtils.isNotEmpty(param.getAssignUserIdList())) {
+            List<String> collect = param.getAssignUserIdList().stream()
+                    .map(String::valueOf).collect(Collectors.toList());
+            userIds = String.join(",", collect);
+        }
+        //更新区服信息
+        super.update(new LambdaUpdateWrapper<GameServer>()
+                .eq(GameServer::getId, gameServer.getId())
+                .set(Objects.equals(param.getAssignType(), GameServerAssignEnum.GAME_SERVER_ASSIGN_GS),
+                        GameServer::getGsIds, userIds)
+                .set(Objects.equals(param.getAssignType(), GameServerAssignEnum.GAME_SERVER_ASSIGN_CUSTOMER),
+                        GameServer::getCustomerIds, userIds));
+        //新增保存指派记录
+        gameServerAssignLogService.save(GameServerAssignLog.builder()
+                .serverId(gameServer.getServerId())
+                .assignType(param.getAssignType().getValue())
+                .oldUserIds(oldUserIds)
+                .newUserIds(userIds)
+                .createBy(SecurityUtil.getUserId())
+                .createTime(LocalDateTime.now())
+                .build());
+    }
+
     @Override
     public Boolean gameServerExcelImport(MultipartFile multipartFile, GameServerExcelEnum gameServerExcelEnum, Long gameId) {
         StringBuilder stringBuilder = new StringBuilder();
@@ -282,39 +336,68 @@ public class GameServerServiceImpl extends ServiceImpl<GameServerMapper, GameSer
         }
         //合服子服列表
         if (sonServerIdArray != null) {
-            List<GameServerListVO.ServerBean> sonServerList = new ArrayList<>();
-            for (String sonServerId : sonServerIdArray) {
-                GameServer sonServer = gameServerMap.get(sonServerId);
-                if (sonServer == null) {
-                    continue;
-                }
-                sonServerList.add(GameServerListVO.ServerBean.builder()
-                        .serverId(sonServerId)
-                        .serverName(sonServer.getServerName())
-                        .build());
-            }
-            gameServerListVO.setSonServerList(sonServerList);
+            gameServerListVO.setSonServerList(this.getSonServerList(sonServerIdArray, gameServerMap));
         }
         //合服原始服列表
         if (sourceServerIdArray != null) {
-            List<Integer> sourceServerIdList = Arrays.stream(sourceServerIdArray)
-                    .map(Integer::parseInt)
-                    .sorted().collect(Collectors.toList());
-            List<GameServerListVO.ServerBean> sourceServerList = new ArrayList<>();
-            for (Integer sourceServerId : sourceServerIdList) {
-                GameServer sourceServer = gameServerMap.get(sourceServerId.toString());
-                if (sourceServer != null) {
-                    sourceServerList.add(GameServerListVO.ServerBean.builder()
-                            .serverId(sourceServerId.toString())
-                            .serverName(sourceServer.getServerName())
-                            .build());
-                }
-            }
-            gameServerListVO.setSourceServerList(sourceServerList);
+            gameServerListVO.setSourceServerList(this.getSourceServerList(sourceServerIdArray, gameServerMap));
+        }
+        //指派客服
+        if (Strings.isNotBlank(gameServer.getCustomerIds())) {
+            gameServerListVO.setCustomerList(this.getUserBeanList(gameServer.getCustomerIds()));
+        }
+        //指派GS
+        if (Strings.isNotBlank(gameServer.getGsIds())) {
+            gameServerListVO.setGsList(this.getUserBeanList(gameServer.getGsIds()));
         }
         return gameServerListVO;
     }
 
+    private List<GameServerListVO.ServerBean> getSonServerList(String[] sonServerIdArray, Map<String, GameServer> gameServerMap) {
+        List<GameServerListVO.ServerBean> sonServerList = new ArrayList<>();
+        for (String sonServerId : sonServerIdArray) {
+            GameServer sonServer = gameServerMap.get(sonServerId);
+            if (sonServer == null) {
+                continue;
+            }
+            sonServerList.add(GameServerListVO.ServerBean.builder()
+                    .serverId(sonServerId)
+                    .serverName(sonServer.getServerName())
+                    .build());
+        }
+        return sonServerList;
+    }
+
+    private List<GameServerListVO.ServerBean> getSourceServerList(String[] sourceServerIdArray, Map<String, GameServer> gameServerMap) {
+        List<Integer> sourceServerIdList = Arrays.stream(sourceServerIdArray)
+                .map(Integer::parseInt)
+                .sorted().collect(Collectors.toList());
+        List<GameServerListVO.ServerBean> sourceServerList = new ArrayList<>();
+        sourceServerIdList.forEach(sourceServerId -> {
+            GameServer sourceServer = gameServerMap.get(sourceServerId.toString());
+            if (sourceServer == null) {
+                return;
+            }
+            sourceServerList.add(GameServerListVO.ServerBean.builder()
+                    .serverId(sourceServerId.toString())
+                    .serverName(sourceServer.getServerName())
+                    .build());
+        });
+        return sourceServerList;
+    }
+
+    private List<GameServerListVO.UserBean> getUserBeanList(String userIds) {
+        List<GameServerListVO.UserBean> userList = new ArrayList<>();
+        List<Long> userIdList = Arrays.stream(userIds.split(","))
+                .map(Long::valueOf).collect(Collectors.toList());
+        Map<Long, String> userNameMap = sysUserRpc.getUserNameByIds(userIdList).getData();
+        userIdList.forEach(userId -> userList.add(GameServerListVO.UserBean.builder()
+                .userId(userId)
+                .userName(userNameMap.get(userId))
+                .build()));
+        return userList;
+    }
+
     @Override
     public Boolean mergeServerAddUpdate(GameMergeServerParam param) {
         List<GameServer> gameServerList = super.list(new LambdaQueryWrapper<GameServer>()

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

@@ -131,6 +131,12 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
         if (Strings.isNotBlank(orderId) && this.orderHandle(orderId, gameApplet.getGameId(), kfAppletMsgDTO, kfRoom, kfRoomMsg)) {
             return;
         }
+        //不存在订单的小程序消息, 直接略过, 不转入待接入
+        if (Objects.equals(kfAppletMsgDTO.getMsgType(), KfRoomMsgTypeEnum.KF_MSG_TYPE_MINI_APP.getValue())) {
+            kfRoomMsg.setReadStatus(Boolean.TRUE);
+            kfRoomMsgService.save(kfRoomMsg);
+            return;
+        }
         //客服休息时间, 发送自动回复
         this.systemReplyHandle(gameApplet.getGameId(), kfAppletMsgDTO.getFromUserName(), kfRoom);
         //消息报警监测
@@ -154,14 +160,22 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
         if (!Objects.equals(kfAppletMsgDTO.getMsgType(), KfRoomMsgTypeEnum.KF_MSG_TYPE_TEXT.getValue())) {
             return;
         }
-        //未匹配导监测词汇
-        if (kfMonitorWordService.count(new LambdaQueryWrapper<KfMonitorWord>()
-                .like(KfMonitorWord::getWord, kfAppletMsgDTO.getContent())
-        ) <= 0) {
+        //文本内容
+        String textContent = kfAppletMsgDTO.getContent();
+        //为本内容为空
+        if (Strings.isBlank(textContent)) {
+            return;
+        }
+        //查询所有监测词汇
+        List<KfMonitorWord> kfMonitorWordList = kfMonitorWordService.list();
+        //判断玩家的文本包含敏感词的数量, 不包含则不执行
+        if (kfMonitorWordList.stream()
+                .filter(word -> textContent.contains(word.getWord()))
+                .count() <= 0) {
             return;
         }
         //给客服发送钉钉通知
-        gameAuthRoleService.dingTalkCustomer(gameApplet.getGameId(), gameApplet.getAppName(), kfAppletMsgDTO.getContent());
+        gameAuthRoleService.dingTalkCustomer(gameApplet.getGameId(), gameApplet.getAppName(), textContent);
     }
 
     private void systemReplyHandle(Long gameId, String openId, KfRoom kfRoom) {
@@ -408,8 +422,7 @@ public class KfAppletMsgServiceImpl implements IKfAppletMsgService {
         msgParamMap.put("msgtype", KfRoomMsgTypeEnum.KF_MSG_TYPE_LINK.getValue());
         msgParamMap.put(KfRoomMsgTypeEnum.KF_MSG_TYPE_LINK.getValue(), linkMap);
         kfWxApiService.sendCustomMessageApi(gameId, msgParamMap);
-        //返回发送的消息内容
-        log.error("客服支付, 发送支付信息 : {}", JsonUtil.toString(msgParamMap));
+        //保存发送的支付链接消息
         kfRoomMsgService.save(this.transform(openId, gameId, kfRoom, KfRoomMsgTypeEnum.KF_MSG_TYPE_LINK, JsonUtil.toString(msgParamMap)));
         //删除待支付订单标记
         redisUtil.deleteCache(RedisKeyConstant.GAME_CUSTOM_PAY_SIGN + openId);

+ 0 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/KfMsgServiceImpl.java

@@ -65,7 +65,6 @@ public class KfMsgServiceImpl implements IKfMsgService {
         KfUser kfUser = kfUserService.getKfUser(SecurityUtil.getUserId(), param.getAppId());
         //图片上传腾讯
         String uploadResult = this.imgUploadApi(kfUser, files);
-        log.error("上传结果, uploadResult : {}", uploadResult);
         Map<String, Object> uploadResultMap = JsonUtil.toMap(uploadResult, Map.class, Object.class);
         //发送客服消息
         Map<String, Object> paramMap = param.getParam();

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

@@ -1,11 +0,0 @@
-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 {
-}

+ 1 - 1
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/SendMsgTask.java → game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/CpSendMsgTask.java

@@ -19,7 +19,7 @@ import java.time.LocalDateTime;
 @ToString
 @Builder
 @TableName("t_cp_send_msg_task")
-public class SendMsgTask implements Serializable {
+public class CpSendMsgTask implements Serializable {
 
     private static final long serialVersionUID = 1L;
 

+ 5 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameServer.java

@@ -104,6 +104,11 @@ public class GameServer implements Serializable {
      */
     private String customerIds;
 
+    /**
+     * 指派GS的ids
+     */
+    private String gsIds;
+
     /**
      * 创建时间
      */

+ 61 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameServerAssignLog.java

@@ -0,0 +1,61 @@
+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 : lingfeng
+ * @time : 2024-03-13
+ * @description : 游戏区服指派记录
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Builder
+@TableName("t_game_server_assign_log")
+public class GameServerAssignLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 指派类型
+     */
+    private String assignType;
+
+    /**
+     * 区服id
+     */
+    private String serverId;
+
+    /**
+     * 旧的客服ids
+     */
+    private String oldUserIds;
+
+    /**
+     * 新的客服ids
+     */
+    private String newUserIds;
+
+    /**
+     * 创建者id
+     */
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+}

+ 2 - 2
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/SendMsgTaskMapper.java → game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/CpSendMsgTaskMapper.java

@@ -1,9 +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 com.zanxiang.game.module.mybatis.entity.CpSendMsgTask;
 import org.apache.ibatis.annotations.Mapper;
 
 @Mapper
-public interface SendMsgTaskMapper extends BaseMapper<SendMsgTask> {
+public interface CpSendMsgTaskMapper extends BaseMapper<CpSendMsgTask> {
 }

+ 12 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameServerAssignLogMapper.java

@@ -0,0 +1,12 @@
+package com.zanxiang.game.module.mybatis.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zanxiang.game.module.mybatis.entity.GameServerAssignLog;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-03-13
+ * @description : ${description}
+ */
+public interface GameServerAssignLogMapper extends BaseMapper<GameServerAssignLog> {
+}