Procházet zdrojové kódy

:feat:GS区服数据查询列表

zhangxianyu před 1 rokem
rodič
revize
9fa6a1c5db

+ 12 - 8
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/controller/AdsGameServerController.java

@@ -1,14 +1,8 @@
 package com.zanxiang.game.data.serve.controller;
 
 import com.zanxiang.erp.security.annotation.PreAuthorize;
-import com.zanxiang.game.data.serve.pojo.dto.GameServerDayDTO;
-import com.zanxiang.game.data.serve.pojo.dto.GameServerDayTotalDTO;
-import com.zanxiang.game.data.serve.pojo.dto.GameServerSumDayDTO;
-import com.zanxiang.game.data.serve.pojo.dto.GameServerSumDayTotalDTO;
-import com.zanxiang.game.data.serve.pojo.vo.GameServerDayTotalVO;
-import com.zanxiang.game.data.serve.pojo.vo.GameServerDayVO;
-import com.zanxiang.game.data.serve.pojo.vo.GameServerSumDayTotalVO;
-import com.zanxiang.game.data.serve.pojo.vo.GameServerSumDayVO;
+import com.zanxiang.game.data.serve.pojo.dto.*;
+import com.zanxiang.game.data.serve.pojo.vo.*;
 import com.zanxiang.game.data.serve.service.IGameServerService;
 import com.zanxiang.game.data.serve.utils.Page;
 import com.zanxiang.module.util.pojo.ResultVO;
@@ -63,4 +57,14 @@ public class AdsGameServerController {
         return ResultVO.ok(gameServerService.getGameServerDataSumDayTotal(dto));
     }
 
+    @ApiOperation(value = "GS区服数据")
+    @PreAuthorize(permissionKey = "gameServer:GSAdsGameServerDay:day")
+    @PostMapping("/gs/day")
+    public ResultVO<Page<GSGameServerDayVO>> getGSGameServerDataDay(@RequestBody GSGameServerDayDTO dto) {
+        return ResultVO.ok(gameServerService.getGSGameServerDataDay(dto));
+    }
+
+
+
+
 }

+ 68 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GSGameServerDayDTO.java

@@ -0,0 +1,68 @@
+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;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * @author ZhangXianyu
+ * @description: 游戏区服列表条件类
+ * @date 2024-03-14 19:06:50
+ */
+@Data
+public class GSGameServerDayDTO extends BasePage implements Serializable {
+
+    /**
+     * 游戏维度:1-子游戏维度;2-父游戏维度;3-超父游戏维度
+     */
+    @ApiModelProperty(notes = "游戏维度:1-子游戏维度;2-父游戏维度")
+    private Integer gameDimension = 1;
+
+    /**
+     * 游戏id
+     */
+    @ApiModelProperty(value = "游戏id")
+    private List<Long> gameId;
+
+    /**
+     * GS id
+     */
+    @ApiModelProperty(value = "GS id")
+    private List<Long> gsId;
+
+    /**
+     * 区服名称
+     */
+    @ApiModelProperty(value = "区服名称")
+    private String serverName;
+
+    /**
+     * 区服id
+     */
+    @ApiModelProperty(value = "区服id")
+    private Long serverId;
+
+    /**
+     * 开服时间
+     */
+    @ApiModelProperty(value = "开服时间(起始)")
+    private LocalDate beginDate;
+
+    /**
+     * 开服时间
+     */
+    @ApiModelProperty(value = "开服时间(结束)")
+    private LocalDate endDate;
+
+    /**
+     * 开服天数
+     */
+    @ApiModelProperty(value = "开服天数")
+    private Integer day;
+
+}

+ 1 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/FlowMonitorCountVo.java

@@ -32,4 +32,5 @@ public class FlowMonitorCountVo implements Serializable {
     private Double recoveryCount = 0.0;
 
 
+
 }

+ 368 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/vo/GSGameServerDayVO.java

@@ -0,0 +1,368 @@
+package com.zanxiang.game.data.serve.pojo.vo;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * @author ZhangXianyu
+ * @description: 游戏区服列表数据
+ * @date 2024-03-14 19:06:50
+ */
+@Data
+public class GSGameServerDayVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+
+    @ApiModelProperty(value = "游戏名称")
+    private String gameName;
+
+    @ApiModelProperty(value = "游戏类别")
+    private String parentGameClassify;
+
+    @ApiModelProperty(value = "游戏区服名称")
+    private String serverName;
+
+    @ApiModelProperty(value = "SDK来源")
+    private String sourceSystem;
+
+    @ApiModelProperty(value = "开服天数")
+    private Integer day;
+
+    @ApiModelProperty(value = "开服时间")
+    private LocalDate beginDate;
+
+
+    @ApiModelProperty(value = "新用户人数")
+    private Integer newUserCount;
+
+    @ApiModelProperty(value = "创角人数")
+    private Integer newRoleCount;
+
+    @ApiModelProperty(value = "付费人数")
+    private Integer payUserCount;
+
+    /**
+     * 区服第1天:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String da1;
+
+    /**
+     * 区服第1天:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String da2;
+
+    /**
+     * 区服第2天:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String da3;
+
+    /**
+     * 区服第3天:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String da4;
+
+    /**
+     * 区服第4天:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String da5;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da6;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da7;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da8;
+
+    @ApiModelProperty(value = "不展示")
+    private String da9;
+
+    @ApiModelProperty(value = "不展示")
+    private String da10;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da11;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da12;
+
+    @ApiModelProperty(value = "不展示")
+    private String da13;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da14;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da15;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da16;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da17;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da18;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da19;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da20;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da21;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da22;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da23;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da24;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da25;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da26;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da27;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da28;
+
+
+    @ApiModelProperty(value = "不展示")
+    private String da29;
+
+    @ApiModelProperty(value = "不展示")
+    private String da30;
+    @ApiModelProperty(value = "不展示")
+    private String da31;
+    @ApiModelProperty(value = "不展示")
+    private String da32;
+    @ApiModelProperty(value = "不展示")
+    private String da33;
+    @ApiModelProperty(value = "不展示")
+    private String da34;
+    @ApiModelProperty(value = "不展示")
+    private String da35;
+    @ApiModelProperty(value = "不展示")
+    private String da36;
+    @ApiModelProperty(value = "不展示")
+    private String da37;
+    @ApiModelProperty(value = "不展示")
+    private String da38;
+    @ApiModelProperty(value = "不展示")
+    private String da39;
+
+    @ApiModelProperty(value = "不展示")
+    private String da40;
+    @ApiModelProperty(value = "不展示")
+    private String da41;
+    @ApiModelProperty(value = "不展示")
+    private String da42;
+    @ApiModelProperty(value = "不展示")
+    private String da43;
+    @ApiModelProperty(value = "不展示")
+    private String da44;
+    @ApiModelProperty(value = "不展示")
+    private String da45;
+    @ApiModelProperty(value = "不展示")
+    private String da46;
+    @ApiModelProperty(value = "不展示")
+    private String da47;
+    @ApiModelProperty(value = "不展示")
+    private String da48;
+    @ApiModelProperty(value = "不展示")
+    private String da49;
+
+    @ApiModelProperty(value = "不展示")
+    private String da50;
+    @ApiModelProperty(value = "不展示")
+    private String da51;
+    @ApiModelProperty(value = "不展示")
+    private String da52;
+    @ApiModelProperty(value = "不展示")
+    private String da53;
+    @ApiModelProperty(value = "不展示")
+    private String da54;
+    @ApiModelProperty(value = "不展示")
+    private String da55;
+    @ApiModelProperty(value = "不展示")
+    private String da56;
+    @ApiModelProperty(value = "不展示")
+    private String da57;
+    @ApiModelProperty(value = "不展示")
+    private String da58;
+    @ApiModelProperty(value = "不展示")
+    private String da59;
+
+    @ApiModelProperty(value = "不展示")
+    private String da60;
+    @ApiModelProperty(value = "不展示")
+    private String da61;
+    @ApiModelProperty(value = "不展示")
+    private String da62;
+    @ApiModelProperty(value = "不展示")
+    private String da63;
+    @ApiModelProperty(value = "不展示")
+    private String da64;
+    @ApiModelProperty(value = "不展示")
+    private String da65;
+    @ApiModelProperty(value = "不展示")
+    private String da66;
+    @ApiModelProperty(value = "不展示")
+    private String da67;
+    @ApiModelProperty(value = "不展示")
+    private String da68;
+    @ApiModelProperty(value = "不展示")
+    private String da69;
+
+    @ApiModelProperty(value = "不展示")
+    private String da70;
+    @ApiModelProperty(value = "不展示")
+    private String da71;
+    @ApiModelProperty(value = "不展示")
+    private String da72;
+    @ApiModelProperty(value = "不展示")
+    private String da73;
+    @ApiModelProperty(value = "不展示")
+    private String da74;
+    @ApiModelProperty(value = "不展示")
+    private String da75;
+    @ApiModelProperty(value = "不展示")
+    private String da76;
+    @ApiModelProperty(value = "不展示")
+    private String da77;
+    @ApiModelProperty(value = "不展示")
+    private String da78;
+    @ApiModelProperty(value = "不展示")
+    private String da79;
+
+    @ApiModelProperty(value = "不展示")
+    private String da80;
+    @ApiModelProperty(value = "不展示")
+    private String da81;
+    @ApiModelProperty(value = "不展示")
+    private String da82;
+    @ApiModelProperty(value = "不展示")
+    private String da83;
+    @ApiModelProperty(value = "不展示")
+    private String da84;
+    @ApiModelProperty(value = "不展示")
+    private String da85;
+    @ApiModelProperty(value = "不展示")
+    private String da86;
+    @ApiModelProperty(value = "不展示")
+    private String da87;
+    @ApiModelProperty(value = "不展示")
+    private String da88;
+    @ApiModelProperty(value = "不展示")
+    private String da89;
+    @ApiModelProperty(value = "不展示")
+    private String da90;
+
+    /**
+     * 区服在第4月:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m4;
+
+    /**
+     * 区服在第5月:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m5;
+
+    /**
+     * 区服在第6月:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m6;
+
+    /**
+     * 区服在第7月:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m7;
+
+    /**
+     * 区服在第8月:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m8;
+
+    /**
+     * 区服在第9月:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m9;
+
+    /**
+     * 区服在第10月:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m10;
+
+    /**
+     * 区服在第11月:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m11;
+
+    /**
+     * 区服在第1年:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String m12;
+
+//    /**
+//     * 区服至今:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+//     */
+//    @ApiModelProperty(value = "区服至今总数据")
+//    private GameServerTrendVO totalTrend;
+
+    /**
+     * 昨日区服数据:活跃留存率/付费留存率/小R留存率/中R留存率/大R留存率/超大R留存率/第N天创角总人数/第N天付费总人数
+     */
+    @ApiModelProperty(value = "不展示")
+    private String yesterday;
+
+
+
+
+}

+ 6 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/IGameServerService.java

@@ -44,4 +44,10 @@ public interface IGameServerService {
      */
     List<GameServerVO> getAllGameServer(GameServerListDTO dto);
 
+    /**
+     * GS区服数据
+     * @param dto
+     * @return
+     */
+    Page<GSGameServerDayVO> getGSGameServerDataDay(GSGameServerDayDTO dto);
 }

+ 11 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameServerServiceImpl.java

@@ -495,6 +495,17 @@ public class GameServerServiceImpl implements IGameServerService {
         return sql.getList(GameServerVO.class);
     }
 
+    /**
+     * 游戏区服数据
+     * @param dto GameServerDayDTO
+     * @return Page<GameServerDayVO>
+     */
+    @Override
+    public Page<GSGameServerDayVO> getGSGameServerDataDay(GSGameServerDayDTO dto) {
+
+        return null;
+    }
+
     /**
      * 将vo中的原始String数据修改为一个对象
      * @param vo 展示给前端的游戏区服数据

+ 2 - 2
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/vo/SendMsgVo.java

@@ -13,10 +13,10 @@ public class SendMsgVo implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
+
     /**
-     * 主键id
+     * 任务id
      */
-    @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
     /**

+ 6 - 47
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/rpc/impl/CpSendMsgRpcImpl.java

@@ -35,59 +35,18 @@ public class CpSendMsgRpcImpl implements ICPSendMsgRpc {
 
     @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("发送消息异常");
-        }
+       return sendMsgTaskService.sendMsg(sendMsgDto);
     }
 
     @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())
-                        .orderByDesc(CpSendMsgTask::getCreateTime));
-        List<CpSendMsgTask> cpSendMsgTasks = page.getRecords();
-        List<SendMsgVo> sendMsgVos = toVo(cpSendMsgTasks);
-        return new PageUtil<>(sendMsgVos, page.getTotal(), param.getPageSize(), param.getPageNum(),0);
+       return sendMsgTaskService.getSendMsgTaskList(param);
     }
 
-    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(ZoneId.of("UTC")));
-        cpSendMsgTask.setUpdateTime(LocalDateTime.now(ZoneId.of("UTC")));
-        return cpSendMsgTask;
-    }
+
+
+
+
 }

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

@@ -1,7 +1,29 @@
 package com.zanxiang.game.module.manage.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+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.mybatis.entity.CpSendMsgTask;
+import com.zanxiang.module.util.pojo.ResultVO;
 
 public interface ICPSendMsgTaskService extends IService<CpSendMsgTask> {
+
+    /**
+     * 创建消息任务并发送消息
+     * @param sendMsgDto
+     * @return
+     */
+    ResultVO<Boolean> sendMsg(SendMsgDto sendMsgDto);
+
+    /**
+     * 获取消息任务列表
+     * @param param
+     * @return
+     */
+    PageUtil<SendMsgVo> getSendMsgTaskList(SendMsgTaskParam param);
+
+
+
 }

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

@@ -1,11 +1,92 @@
 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.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.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+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;
+
+    @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("发送消息异常");
+        }
+    }
+
+    @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())
+                        .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(ZoneId.of("UTC")));
+        cpSendMsgTask.setUpdateTime(LocalDateTime.now(ZoneId.of("UTC")));
+        return cpSendMsgTask;
+    }
 }