Просмотр исходного кода

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

zhimo 11 месяцев назад
Родитель
Сommit
98289aa40b
15 измененных файлов с 445 добавлено и 125 удалено
  1. 20 0
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/rpc/ICPSendMsgRpc.java
  2. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  3. 9 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/GameServerController.java
  4. 63 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameServerExcelVO.java
  5. 21 8
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/rpc/impl/CpSendMsgRpcImpl.java
  6. 10 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/ICpSendMsgLogService.java
  7. 24 7
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/ICpSendMsgTaskService.java
  8. 9 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameServerService.java
  9. 7 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameSupperService.java
  10. 0 97
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/CPSendMsgTaskServiceImpl.java
  11. 51 12
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/CpSendMsgLogServiceImpl.java
  12. 167 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/CpSendMsgTaskServiceImpl.java
  13. 42 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameServerServiceImpl.java
  14. 16 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameSupperServiceImpl.java
  15. 5 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/CpSendMsgResult.java

+ 20 - 0
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/rpc/ICPSendMsgRpc.java

@@ -15,8 +15,26 @@ import com.zanxiang.module.util.pojo.ResultVO;
  */
 public interface ICPSendMsgRpc {
 
+    /**
+     * 根据任务id重发消息
+     *
+     * @param gameId
+     * @param taskId
+     * @return
+     */
+    ResultVO<Boolean> reSendMsgByTaskId(Long gameId, Long taskId);
+
+    /**
+     * 根据发送结果id重发消息
+     *
+     * @param resultId
+     * @return
+     */
+    ResultVO<Boolean> reSendMsgByResultId(Long resultId);
+
     /**
      * 发送消息
+     *
      * @param sendMsgDto
      * @return
      */
@@ -24,6 +42,7 @@ public interface ICPSendMsgRpc {
 
     /**
      * 获取发送消息任务列表
+     *
      * @param sendMsgTaskParam
      * @return
      */
@@ -31,6 +50,7 @@ public interface ICPSendMsgRpc {
 
     /**
      * 获取发送消息任务结果
+     *
      * @param sendMsgTaskResultParam
      * @return
      */

+ 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服务启动成功 < (生产测试pro・・)ノ(._.`) \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

@@ -23,6 +23,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -75,6 +76,14 @@ public class GameServerController {
         return ResultVO.ok(gameServerService.listOfPage(param));
     }
 
+    @ApiOperation(value = "游戏区服Excel下载")
+    @PostMapping(value = "/list/excel")
+    @PreAuthorize(permissionKey = "manage:gameServer:gameServerExcel")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功")})
+    public void getOrderExcel(@Validated @RequestBody GameServerListParam param, HttpServletResponse response) {
+        gameServerService.getGameServerExcel(param, response);
+    }
+
     @ApiOperation(value = "游戏区服删除")
     @DeleteMapping(value = "/delete")
     @PreAuthorize(permissionKey = "manage:gameServer:delete")

+ 63 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameServerExcelVO.java

@@ -0,0 +1,63 @@
+package com.zanxiang.game.module.manage.pojo.vo;
+
+import com.zanxiang.module.util.excel.ExcelAnno;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-06-04
+ * @description : 区服表格
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class GameServerExcelVO {
+
+    /**
+     * 游戏id
+     */
+    @ExcelAnno(title = "游戏id")
+    private Long gameId;
+
+    /**
+     * 游戏名称
+     */
+    @ExcelAnno(title = "游戏名称")
+    private String gameName;
+
+    /**
+     * 区服id
+     */
+    @ExcelAnno(title = "区服id")
+    private String serverId;
+
+    /**
+     * 区服名称
+     */
+    @ExcelAnno(title = "区服名称")
+    private String serverName;
+
+    /**
+     * 区服冠名
+     */
+    @ExcelAnno(title = "区服冠名")
+    private String nickName;
+
+    /**
+     * 开服时间
+     */
+    @ExcelAnno(title = "开服时间")
+    private LocalDateTime startTime;
+
+    /**
+     * 是否原始服
+     */
+    @ExcelAnno(title = "是否原始服")
+    private Boolean isSourceServer;
+}

+ 21 - 8
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/rpc/impl/CpSendMsgRpcImpl.java

@@ -7,31 +7,36 @@ import com.zanxiang.game.module.base.pojo.vo.SendMsgResultVO;
 import com.zanxiang.game.module.base.pojo.vo.SendMsgVO;
 import com.zanxiang.game.module.base.rpc.ICPSendMsgRpc;
 import com.zanxiang.game.module.base.util.PageUtil;
-import com.zanxiang.game.module.manage.service.ICPSendMsgTaskService;
 import com.zanxiang.game.module.manage.service.ICpSendMsgResultService;
+import com.zanxiang.game.module.manage.service.ICpSendMsgTaskService;
 import com.zanxiang.module.util.pojo.ResultVO;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.beans.factory.annotation.Autowired;
 
-import javax.annotation.Resource;
-
+/**
+ * @author : lingfeng
+ * @time : 2024-03-14
+ * @description : CP消息发送接口
+ */
 @DubboService
 @Slf4j
 public class CpSendMsgRpcImpl implements ICPSendMsgRpc {
 
-    @Resource
-    private ICPSendMsgTaskService cpSendMsgTaskService;
-    @Resource
+    @Autowired
+    private ICpSendMsgTaskService cpSendMsgTaskService;
+
+    @Autowired
     private ICpSendMsgResultService cpSendMsgResultService;
 
     @Override
     public ResultVO<Boolean> sendMsg(SendMsgDTO sendMsgDto) {
-       return cpSendMsgTaskService.sendMsg(sendMsgDto);
+        return cpSendMsgTaskService.sendMsg(sendMsgDto);
     }
 
     @Override
     public PageUtil<SendMsgVO> getSendMsgTaskList(SendMsgTaskParam param) {
-       return cpSendMsgTaskService.getSendMsgTaskList(param);
+        return cpSendMsgTaskService.getSendMsgTaskList(param);
     }
 
     @Override
@@ -39,5 +44,13 @@ public class CpSendMsgRpcImpl implements ICPSendMsgRpc {
         return cpSendMsgResultService.getSendMsgTaskResultList(sendMsgTaskResultParam);
     }
 
+    @Override
+    public ResultVO<Boolean> reSendMsgByTaskId(Long gameId, Long taskId) {
+        return ResultVO.ok(cpSendMsgTaskService.reSendMsgByTaskId(gameId, taskId));
+    }
 
+    @Override
+    public ResultVO<Boolean> reSendMsgByResultId(Long resultId) {
+        return ResultVO.ok(cpSendMsgTaskService.reSendMsgByResultId(resultId));
+    }
 }

+ 10 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/ICpSendMsgLogService.java

@@ -3,6 +3,7 @@ package com.zanxiang.game.module.manage.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.module.manage.pojo.dto.CpSendMsgResultDTO;
 import com.zanxiang.game.module.mybatis.entity.CpSendMsgLog;
+import com.zanxiang.game.module.mybatis.entity.CpSendMsgResult;
 import com.zanxiang.game.module.mybatis.entity.GameSupper;
 
 import java.util.List;
@@ -14,6 +15,15 @@ import java.util.List;
  */
 public interface ICpSendMsgLogService extends IService<CpSendMsgLog> {
 
+    /**
+     * 消息重发
+     *
+     * @param text              : 文本
+     * @param cpSendMsgLog      : 执行日志
+     * @param sendMsgResultList : 发送结果列表
+     */
+    void reCpSendMsg(String text, CpSendMsgLog cpSendMsgLog, List<CpSendMsgResult> sendMsgResultList);
+
     /**
      * CP发送消息
      *

+ 24 - 7
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/ICPSendMsgTaskService.java → game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/ICpSendMsgTaskService.java

@@ -8,22 +8,39 @@ import com.zanxiang.game.module.base.util.PageUtil;
 import com.zanxiang.game.module.mybatis.entity.CpSendMsgTask;
 import com.zanxiang.module.util.pojo.ResultVO;
 
-public interface ICPSendMsgTaskService extends IService<CpSendMsgTask> {
+public interface ICpSendMsgTaskService extends IService<CpSendMsgTask> {
+
+    /**
+     * 根据任务id重发消息
+     *
+     * @param gameId : 游戏id
+     * @param taskId : 任务id
+     * @return : 返回执行结果
+     */
+    boolean reSendMsgByTaskId(Long gameId, Long taskId);
+
+    /**
+     * 单个执行结果重发
+     *
+     * @param resultId : 结果id
+     * @return : 发送结果
+     */
+    boolean reSendMsgByResultId(Long resultId);
 
     /**
      * 创建消息任务并发送消息
-     * @param sendMsgDto
-     * @return
+     *
+     * @param sendMsgDto : 发送消息参数
+     * @return : 返回发送结果
      */
     ResultVO<Boolean> sendMsg(SendMsgDTO sendMsgDto);
 
     /**
      * 获取消息任务列表
-     * @param param
-     * @return
+     *
+     * @param param : 参数
+     * @return : 返回结果
      */
     PageUtil<SendMsgVO> getSendMsgTaskList(SendMsgTaskParam param);
 
-
-
 }

+ 9 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameServerService.java

@@ -12,6 +12,7 @@ import com.zanxiang.game.module.manage.pojo.vo.GameServerVO;
 import com.zanxiang.game.module.mybatis.entity.GameServer;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 
 /**
@@ -64,6 +65,14 @@ public interface IGameServerService extends IService<GameServer> {
      */
     IPage<GameServerListVO> listOfPage(GameServerListParam param);
 
+    /**
+     * 区服下载
+     *
+     * @param param    : 参数
+     * @param response : 返回数据流
+     */
+    void getGameServerExcel(GameServerListParam param, HttpServletResponse response);
+
     /**
      * 删除通过id
      *

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

@@ -13,6 +13,13 @@ import java.util.List;
  */
 public interface IGameSupperService extends IService<GameSupper> {
 
+    /**
+     * 根据子游戏获取超父游戏信息
+     *
+     * @param gameId : 游戏id
+     * @return : 返回超父游戏
+     */
+    GameSupper getGameSupperByGameId(Long gameId);
 
     /**
      * 获取超父游戏

+ 0 - 97
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/CPSendMsgTaskServiceImpl.java

@@ -1,97 +0,0 @@
-package com.zanxiang.game.module.manage.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.zanxiang.game.module.base.pojo.dto.SendMsgDTO;
-import com.zanxiang.game.module.base.pojo.params.SendMsgTaskParam;
-import com.zanxiang.game.module.base.pojo.vo.SendMsgVO;
-import com.zanxiang.game.module.base.util.PageUtil;
-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.manage.service.ICpSendMsgLogService;
-import com.zanxiang.game.module.mybatis.entity.CpSendMsgTask;
-import com.zanxiang.game.module.mybatis.mapper.CpSendMsgTaskMapper;
-import com.zanxiang.module.util.bean.BeanUtil;
-import com.zanxiang.module.util.pojo.ResultVO;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Objects;
-import java.util.stream.Collectors;
-
-@Service
-@Slf4j
-public class CPSendMsgTaskServiceImpl extends ServiceImpl<CpSendMsgTaskMapper, CpSendMsgTask> implements ICPSendMsgTaskService {
-
-    @Lazy
-    @Resource
-    private ICPSendMsgTaskService sendMsgTaskService;
-
-    @Resource
-    private ICpSendMsgLogService cpSendMsgLogService;
-
-    @Override
-    public ResultVO<Boolean> sendMsg(SendMsgDTO sendMsgDto) {
-        try {
-            //创建任务
-            CpSendMsgTask cpSendMsgTask = createSendMsgTask(sendMsgDto);
-            //保存任务
-            sendMsgTaskService.save(cpSendMsgTask);
-            //发消息
-            cpSendMsgLogService.cpSendMsg(cpSendMsgTask.getId(), sendMsgDto.getGameId(), sendMsgDto.getMsg(), sendMsgDto.getRoles());
-            //成功后修改状态
-            cpSendMsgTask.setStatus(CpSendMsgTaskStatusEnum.SUCCESS_SEND.getValue());
-            sendMsgTaskService.updateById(cpSendMsgTask);
-            log.info("发送消息成功");
-            return ResultVO.ok();
-        } catch (Exception e) {
-            log.error("发送消息异常, sendMsgDto : {}, e : {}", sendMsgDto, e.getMessage());
-            return ResultVO.fail("发送消息异常");
-        }
-    }
-
-    @Override
-    public PageUtil<SendMsgVO> getSendMsgTaskList(SendMsgTaskParam param) {
-        Page<CpSendMsgTask> page = sendMsgTaskService.page(new Page<>(param.getPageNum(), param.getPageSize()),
-                new LambdaQueryWrapper<CpSendMsgTask>()
-                        .eq(param.getGameId() != null, CpSendMsgTask::getGameId, param.getGameId())
-                        .eq(StringUtils.isNotEmpty(param.getTaskStatus()), CpSendMsgTask::getStatus, param.getTaskStatus())
-                        .orderByDesc(CpSendMsgTask::getCreateTime));
-        List<CpSendMsgTask> cpSendMsgTasks = page.getRecords();
-        List<SendMsgVO> sendMsgVos = toVo(cpSendMsgTasks);
-        return new PageUtil<>(sendMsgVos, page.getTotal(), param.getPageSize(), param.getPageNum(), 0);
-    }
-
-    private List<SendMsgVO> toVo(List<CpSendMsgTask> cpSendMsgTasks) {
-        if (Objects.isNull(cpSendMsgTasks) || cpSendMsgTasks.isEmpty()) {
-            return null;
-        }
-        return cpSendMsgTasks.stream()
-                .map(task -> BeanUtil.copy(task, SendMsgVO.class))
-                .collect(Collectors.toList());
-    }
-
-    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());
-        cpSendMsgTask.setUpdateTime(LocalDateTime.now());
-        return cpSendMsgTask;
-    }
-}

+ 51 - 12
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/CpSendMsgLogServiceImpl.java

@@ -6,8 +6,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.game.module.manage.enums.CpSendRoleResultEnum;
 import com.zanxiang.game.module.manage.pojo.dto.CpSendMsgResultDTO;
-import com.zanxiang.game.module.manage.pojo.dto.GameDTO;
-import com.zanxiang.game.module.manage.service.*;
+import com.zanxiang.game.module.manage.service.ICpSendMsgLogService;
+import com.zanxiang.game.module.manage.service.ICpSendMsgResultService;
+import com.zanxiang.game.module.manage.service.IGameSupperService;
+import com.zanxiang.game.module.manage.service.IGameUserRoleService;
 import com.zanxiang.game.module.manage.utils.SignUtil;
 import com.zanxiang.game.module.mybatis.entity.CpSendMsgLog;
 import com.zanxiang.game.module.mybatis.entity.CpSendMsgResult;
@@ -45,9 +47,6 @@ public class CpSendMsgLogServiceImpl extends ServiceImpl<CpSendMsgLogMapper, CpS
     @Autowired
     private RestTemplate restTemplate;
 
-    @Autowired
-    private IGameService gameService;
-
     @Autowired
     private IGameSupperService gameSupperService;
 
@@ -57,6 +56,51 @@ public class CpSendMsgLogServiceImpl extends ServiceImpl<CpSendMsgLogMapper, CpS
     @Autowired
     private ICpSendMsgResultService cpSendMsgResultService;
 
+    @Override
+    public void reCpSendMsg(String text, CpSendMsgLog cpSendMsgLog, List<CpSendMsgResult> sendResultList) {
+        //查询超父游戏信息
+        GameSupper gameSupper = gameSupperService.getGameSupperByGameId(cpSendMsgLog.getGameId());
+        if (gameSupper == null || Strings.isBlank(gameSupper.getCpSendMsgUrl()) || Strings.isBlank(gameSupper.getCpSendMsgKey())) {
+            log.error("CP发送消息补发, 超父游戏信息不全! cpSendMsgLog : {}, resultList : {}",
+                    JsonUtil.toString(cpSendMsgLog), JsonUtil.toString(sendResultList));
+            return;
+        }
+        //角色信息按区服分组
+        Map<String, List<CpSendMsgResult>> resultMap = sendResultList.stream()
+                .collect(Collectors.groupingBy(CpSendMsgResult::getServerId));
+        resultMap.forEach((serverId, cpSendMsgResultList) -> {
+            List<String> serverRoleIdList = cpSendMsgResultList.stream().map(CpSendMsgResult::getRoleId).collect(Collectors.toList());
+            try {
+                CpSendMsgResultDTO result = this.cpSendMsgApi(gameSupper, cpSendMsgLog.getMsgId(), serverId, text, serverRoleIdList);
+                this.reResultHandle(cpSendMsgLog, result, sendResultList);
+            } catch (Exception e) {
+                log.error("CP消息发送API调用异常, cpSendMsgLog : {}, sendMsgResultList : {}",
+                        JsonUtil.toString(cpSendMsgLog), JsonUtil.toString(sendResultList));
+            }
+        });
+    }
+
+    private void reResultHandle(CpSendMsgLog cpSendMsgLog, CpSendMsgResultDTO result, List<CpSendMsgResult> sendMsgResultList) {
+        //循环处理结果
+        sendMsgResultList.forEach(sendMsgResult -> {
+            //状态判断
+            CpSendRoleResultEnum resultEnum = result.getFailList().contains(sendMsgResult.getRoleId()) ?
+                    CpSendRoleResultEnum.CP_SEND_ROLE_RESULT_FAIL : CpSendRoleResultEnum.CP_SEND_ROLE_RESULT_SUCCESS;
+            sendMsgResult.setSendStatus(resultEnum.getValue());
+            sendMsgResult.setUpdateTime(LocalDateTime.now());
+        });
+        //在同一个事物中进行表更新
+        transactionTemplate.execute(status -> {
+            cpSendMsgResultService.updateBatchById(sendMsgResultList);
+            super.update(new LambdaUpdateWrapper<CpSendMsgLog>()
+                    .setSql("success_count=success_count+" + result.getSucessCount())
+                    .setSql("fail_count=fail_count-" + result.getSucessCount())
+                    .eq(CpSendMsgLog::getMsgId, cpSendMsgLog.getMsgId())
+            );
+            return Boolean.TRUE;
+        });
+    }
+
     @Override
     public void cpSendMsg(Long taskId, Long gameId, String text, List<String> roleIdList) {
         //查询角色区服信息
@@ -73,13 +117,8 @@ public class CpSendMsgLogServiceImpl extends ServiceImpl<CpSendMsgLogMapper, CpS
                     taskId, gameId, JsonUtil.toString(roleIdList));
             return;
         }
-        GameDTO gameDTO = gameService.getById(gameId);
-        if (gameDTO == null) {
-            log.error("CP发送消息参数错误, 游戏信息不存在! taskId : {}, gameId : {}, roleIdList : {}",
-                    taskId, gameId, JsonUtil.toString(roleIdList));
-            return;
-        }
-        GameSupper gameSupper = gameSupperService.getById(gameDTO.getSuperGameId());
+        //查询超父游戏信息
+        GameSupper gameSupper = gameSupperService.getGameSupperByGameId(gameId);
         if (gameSupper == null || Strings.isBlank(gameSupper.getCpSendMsgUrl()) || Strings.isBlank(gameSupper.getCpSendMsgKey())) {
             log.error("CP发送消息参数错误, 超父游戏信息不全! taskId : {}, gameId : {}, roleIdList : {}, gameSupper : {}",
                     taskId, gameId, JsonUtil.toString(roleIdList), JsonUtil.toString(gameSupper));

+ 167 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/CpSendMsgTaskServiceImpl.java

@@ -0,0 +1,167 @@
+package com.zanxiang.game.module.manage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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.game.module.base.pojo.dto.SendMsgDTO;
+import com.zanxiang.game.module.base.pojo.params.SendMsgTaskParam;
+import com.zanxiang.game.module.base.pojo.vo.SendMsgVO;
+import com.zanxiang.game.module.base.util.PageUtil;
+import com.zanxiang.game.module.manage.enums.CpSendMsgTaskStatusEnum;
+import com.zanxiang.game.module.manage.enums.CpSendMsgTaskTypeEnum;
+import com.zanxiang.game.module.manage.enums.CpSendRoleResultEnum;
+import com.zanxiang.game.module.manage.service.ICpSendMsgLogService;
+import com.zanxiang.game.module.manage.service.ICpSendMsgResultService;
+import com.zanxiang.game.module.manage.service.ICpSendMsgTaskService;
+import com.zanxiang.game.module.mybatis.entity.CpSendMsgLog;
+import com.zanxiang.game.module.mybatis.entity.CpSendMsgResult;
+import com.zanxiang.game.module.mybatis.entity.CpSendMsgTask;
+import com.zanxiang.game.module.mybatis.mapper.CpSendMsgTaskMapper;
+import com.zanxiang.module.util.bean.BeanUtil;
+import com.zanxiang.module.util.exception.BaseException;
+import com.zanxiang.module.util.pojo.ResultVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-03-14
+ * @description : CP消息发送任务
+ */
+@Service
+@Slf4j
+public class CpSendMsgTaskServiceImpl extends ServiceImpl<CpSendMsgTaskMapper, CpSendMsgTask> implements ICpSendMsgTaskService {
+
+    @Autowired
+    private ICpSendMsgLogService cpSendMsgLogService;
+
+    @Autowired
+    private ICpSendMsgResultService cpSendMsgResultService;
+
+    @Override
+    public boolean reSendMsgByTaskId(Long gameId, Long taskId) {
+        //查询任务
+        CpSendMsgTask cpSendMsgTask = super.getById(taskId);
+        if (cpSendMsgTask == null) {
+            log.error("参数错误, 任务id不存在! gameId : {}, taskId : {}", gameId, taskId);
+            throw new BaseException("参数错误, 任务id不存在");
+        }
+        //查询执行日志
+        List<CpSendMsgLog> sendMsgLogList = cpSendMsgLogService.list(new LambdaQueryWrapper<CpSendMsgLog>()
+                .eq(CpSendMsgLog::getGameId, gameId)
+                .eq(CpSendMsgLog::getTaskId, taskId));
+        if (CollectionUtils.isEmpty(sendMsgLogList)) {
+            log.error("执行日志log为空! gameId : {}, taskId : {}", gameId, taskId);
+            return Boolean.FALSE;
+        }
+        //查询日志执行结果
+        sendMsgLogList.forEach(cpSendMsgLog -> {
+            List<CpSendMsgResult> sendMsgResultList = cpSendMsgResultService.list(new LambdaQueryWrapper<CpSendMsgResult>()
+                    .eq(CpSendMsgResult::getGameId, cpSendMsgLog.getGameId())
+                    .eq(CpSendMsgResult::getTaskId, cpSendMsgLog.getTaskId())
+                    .eq(CpSendMsgResult::getMsgId, cpSendMsgLog.getMsgId())
+                    .eq(CpSendMsgResult::getSendStatus, CpSendRoleResultEnum.CP_SEND_ROLE_RESULT_FAIL.getValue())
+            );
+            if (CollectionUtils.isEmpty(sendMsgResultList)) {
+                return;
+            }
+            cpSendMsgLogService.reCpSendMsg(cpSendMsgTask.getMsg(), cpSendMsgLog, sendMsgResultList);
+        });
+        return Boolean.TRUE;
+    }
+
+    @Override
+    public boolean reSendMsgByResultId(Long resultId) {
+        //查询执行结果
+        CpSendMsgResult sendMsgResult = cpSendMsgResultService.getById(resultId);
+        if (sendMsgResult == null) {
+            log.error("参数错误, 执行结果id不存在! id : {}", resultId);
+            throw new BaseException("参数错误, 执行结果id不存在!");
+        }
+        if (Objects.equals(sendMsgResult.getSendStatus(), CpSendRoleResultEnum.CP_SEND_ROLE_RESULT_SUCCESS.getValue())) {
+            log.error("该发送结果已成功, 禁止重发! id : {}", resultId);
+            throw new BaseException("该发送结果已成功, 禁止重发!");
+        }
+        //查询任务
+        CpSendMsgTask cpSendMsgTask = super.getById(sendMsgResult.getTaskId());
+        if (cpSendMsgTask == null) {
+            log.error("参数错误, 任务id不存在! taskId : {}", sendMsgResult.getTaskId());
+            throw new BaseException("参数错误, 任务id不存在");
+        }
+        //查询执行记录
+        CpSendMsgLog cpSendMsgLog = cpSendMsgLogService.getById(sendMsgResult.getMsgId());
+        if (cpSendMsgLog == null) {
+            log.error("执行日志log为空! gameId : {}, taskId : {}", sendMsgResult.getGameId(), sendMsgResult.getTaskId());
+            throw new BaseException("执行日志log为空!");
+        }
+        cpSendMsgLogService.reCpSendMsg(cpSendMsgTask.getMsg(), cpSendMsgLog, Collections.singletonList(sendMsgResult));
+        return Boolean.TRUE;
+    }
+
+    @Override
+    public ResultVO<Boolean> sendMsg(SendMsgDTO sendMsgDto) {
+        try {
+            //创建任务
+            CpSendMsgTask cpSendMsgTask = createSendMsgTask(sendMsgDto);
+            //保存任务
+            super.save(cpSendMsgTask);
+            //发消息
+            cpSendMsgLogService.cpSendMsg(cpSendMsgTask.getId(), sendMsgDto.getGameId(), sendMsgDto.getMsg(), sendMsgDto.getRoles());
+            //成功后修改状态
+            cpSendMsgTask.setStatus(CpSendMsgTaskStatusEnum.SUCCESS_SEND.getValue());
+            super.updateById(cpSendMsgTask);
+            log.info("发送消息成功");
+            return ResultVO.ok();
+        } catch (Exception e) {
+            log.error("发送消息异常, sendMsgDto : {}, e : {}", sendMsgDto, e.getMessage());
+            return ResultVO.fail("发送消息异常");
+        }
+    }
+
+    @Override
+    public PageUtil<SendMsgVO> getSendMsgTaskList(SendMsgTaskParam param) {
+        Page<CpSendMsgTask> page = super.page(new Page<>(param.getPageNum(), param.getPageSize()),
+                new LambdaQueryWrapper<CpSendMsgTask>()
+                        .eq(param.getGameId() != null, CpSendMsgTask::getGameId, param.getGameId())
+                        .eq(StringUtils.isNotEmpty(param.getTaskStatus()), CpSendMsgTask::getStatus, param.getTaskStatus())
+                        .orderByDesc(CpSendMsgTask::getCreateTime));
+        List<CpSendMsgTask> cpSendMsgTasks = page.getRecords();
+        List<SendMsgVO> sendMsgVos = toVo(cpSendMsgTasks);
+        return new PageUtil<>(sendMsgVos, page.getTotal(), param.getPageSize(), param.getPageNum(), 0);
+    }
+
+    private List<SendMsgVO> toVo(List<CpSendMsgTask> cpSendMsgTasks) {
+        if (Objects.isNull(cpSendMsgTasks) || cpSendMsgTasks.isEmpty()) {
+            return null;
+        }
+        return cpSendMsgTasks.stream()
+                .map(task -> BeanUtil.copy(task, SendMsgVO.class))
+                .collect(Collectors.toList());
+    }
+
+    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());
+        cpSendMsgTask.setUpdateTime(LocalDateTime.now());
+        return cpSendMsgTask;
+    }
+}

+ 42 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameServerServiceImpl.java

@@ -19,6 +19,7 @@ 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.GameServerExcelVO;
 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.*;
@@ -29,6 +30,7 @@ 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 com.zanxiang.module.web.util.WebExcelUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.logging.log4j.util.Strings;
@@ -38,6 +40,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 import reactor.util.function.Tuple2;
 
+import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -301,6 +304,45 @@ public class GameServerServiceImpl extends ServiceImpl<GameServerMapper, GameSer
         ).convert(this::toVo);
     }
 
+    @Override
+    public void getGameServerExcel(GameServerListParam param, HttpServletResponse response) {
+        //游戏获取
+        Tuple2<String, List<Long>> gameTuple = gameAuthService.getUserGameList(null);
+        List<Long> gameIdList = gameTuple.getT2();
+        if (CollectionUtils.isEmpty(gameIdList)) {
+            return;
+        }
+        //不包含参数游戏
+        if (param.getGameId() != null && !gameIdList.contains(param.getGameId())) {
+            return;
+        }
+        Long gameId = null;
+        if (param.getGameId() != null) {
+            GameDTO gameDTO = gameService.getById(param.getGameId());
+            if (gameDTO == null || gameDTO.getSuperGameId() == null) {
+                return;
+            }
+            gameId = gameDTO.getSuperGameId();
+        }
+        final Long superGameId = gameId;
+        //excel下载
+        WebExcelUtil.httpExport(response, "游戏区服", GameServerExcelVO.class, ((pageNumber, pageSize) -> {
+            //查询订单
+            List<GameServer> gameServerList = page(new Page<>(pageNumber, pageSize),
+                    new QueryWrapper<GameServer>().lambda()
+                            .eq(Strings.isNotBlank(param.getServerId()), GameServer::getServerId, param.getServerId())
+                            .eq(superGameId != null, GameServer::getGameId, superGameId)
+                            .like(Strings.isNotBlank(param.getServerName()), GameServer::getServerName, param.getServerName())
+                            .like(Strings.isNotBlank(param.getNickName()), GameServer::getNickName, param.getNickName())
+                            .ge(param.getStartTime() != null, GameServer::getStartTime, param.getStartTime() == null ? null : LocalDateTime.of(param.getStartTime(), LocalTime.MIN))
+                            .le(param.getEndTime() != null, GameServer::getStartTime, param.getEndTime() == null ? null : LocalDateTime.of(param.getEndTime(), LocalTime.MAX))
+                            .eq(param.getIsSourceServer() != null, GameServer::getIsSourceServer, param.getIsSourceServer())
+                            .orderByDesc(GameServer::getCreateTime)).getRecords();
+            //excel字段赋值
+            return gameServerList.stream().map(gameServer -> BeanUtil.copy(gameServer, GameServerExcelVO.class)).collect(Collectors.toList());
+        }), ExcelUtil.DEFAULT_MAX_DATA_SIZE);
+    }
+
     private GameServerListVO toVo(GameServer gameServer) {
         if (Objects.isNull(gameServer)) {
             return null;

+ 16 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameSupperServiceImpl.java

@@ -1,12 +1,15 @@
 package com.zanxiang.game.module.manage.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.module.manage.pojo.dto.GameDTO;
 import com.zanxiang.game.module.manage.pojo.vo.GameSupperVO;
+import com.zanxiang.game.module.manage.service.IGameService;
 import com.zanxiang.game.module.manage.service.IGameSupperService;
 import com.zanxiang.game.module.mybatis.entity.GameSupper;
 import com.zanxiang.game.module.mybatis.mapper.GameSupperMapper;
 import com.zanxiang.module.util.bean.BeanUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -21,6 +24,19 @@ import java.util.stream.Collectors;
 @Service
 public class GameSupperServiceImpl extends ServiceImpl<GameSupperMapper, GameSupper> implements IGameSupperService {
 
+    @Autowired
+    private IGameService gameService;
+
+    @Override
+    public GameSupper getGameSupperByGameId(Long gameId) {
+        GameDTO gameDTO = gameService.getById(gameId);
+        if (gameDTO == null) {
+            log.error("查询超父游戏, 获取子游戏信息为空! gameId : {}", gameId);
+            return null;
+        }
+        return super.getById(gameDTO.getSuperGameId());
+    }
+
     @Override
     public List<GameSupperVO> getGameSupperList() {
         return super.list().stream()

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

@@ -63,4 +63,9 @@ public class CpSendMsgResult implements Serializable {
      * 创建时间
      */
     private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
 }