Bladeren bron

feat : sdk新增企微链路自动添加角色操作记录, 异步事件发布方式实现

bilingfeng 10 maanden geleden
bovenliggende
commit
d18cf88c85

+ 5 - 0
game-gs-data/game-gs-data-serve/pom.xml

@@ -86,6 +86,11 @@
             <artifactId>springfox-swagger-ui</artifactId>
             <version>${swagger2.ui.version}</version>
         </dependency>
+        <dependency>
+            <groupId>com.mybatis-flex</groupId>
+            <artifactId>mybatis-flex-spring-boot-starter</artifactId>
+            <version>1.7.5</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 2 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/RoleOperate.java

@@ -24,6 +24,8 @@ public class RoleOperate implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
+    public static final Long SYSTEM_OPERATE = 0L;
+
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 

+ 1 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java

@@ -23,7 +23,7 @@ public class SDKApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(SDKApplication.class, args);
-        System.out.println("赞象SDK服务启动成功 <session检测弹窗换行, 识别开发工具os> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <角色创建新增自动操作记录> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 31 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/config/AsyncConfig.java

@@ -0,0 +1,31 @@
+package com.zanxiang.game.module.sdk.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.AsyncConfigurer;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-05-27
+ * @description : 异步线程池配置
+ */
+@Configuration
+@EnableAsync
+public class AsyncConfig implements AsyncConfigurer {
+
+    @Override
+    public Executor getAsyncExecutor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        //设置核心线程数
+        executor.setCorePoolSize(30);
+        //设置最大线程数
+        executor.setMaxPoolSize(50);
+        //设置队列容量
+        executor.setQueueCapacity(50);
+        executor.initialize();
+        return executor;
+    }
+}

+ 36 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/listener/GameRoleCreateEvent.java

@@ -0,0 +1,36 @@
+package com.zanxiang.game.module.sdk.listener;
+
+import com.zanxiang.game.module.mybatis.entity.GameUserRole;
+import lombok.Getter;
+import org.springframework.context.ApplicationEvent;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-06-05
+ * @description : 游戏角色创建事件
+ */
+@Getter
+public class GameRoleCreateEvent extends ApplicationEvent {
+
+    /**
+     * 玩家id
+     */
+    private Long userId;
+
+    /**
+     * 游戏id
+     */
+    private Long gameId;
+
+    /**
+     * 角色id
+     */
+    private String roleId;
+
+    public GameRoleCreateEvent(Object source, GameUserRole userRole) {
+        super(source);
+        this.userId = userRole.getUserId();
+        this.gameId = userRole.getGameId();
+        this.roleId = userRole.getRoleId();
+    }
+}

+ 49 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/listener/GameRoleCreateListener.java

@@ -0,0 +1,49 @@
+package com.zanxiang.game.module.sdk.listener;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zanxiang.game.module.mybatis.entity.GameUserRole;
+import com.zanxiang.game.module.sdk.service.IGameUserRoleService;
+import com.zanxiang.game.module.sdk.service.IRoleOperateService;
+import com.zanxiang.module.util.JsonUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-06-05
+ * @description : 游戏角色创建监听
+ */
+@Slf4j
+@Component
+public class GameRoleCreateListener {
+
+    @Autowired
+    private IRoleOperateService roleOperateService;
+
+    @Autowired
+    private IGameUserRoleService gameUserRoleService;
+
+    @Async
+    @EventListener
+    public void onApplicationEvent(GameRoleCreateEvent event) {
+        try {
+            //查询角色信息
+            GameUserRole gameUserRole = gameUserRoleService.getOne(new LambdaQueryWrapper<GameUserRole>()
+                    .eq(GameUserRole::getGameId, event.getGameId())
+                    .eq(GameUserRole::getRoleId, event.getRoleId())
+                    .eq(GameUserRole::getUserId, event.getUserId()));
+            if (gameUserRole == null) {
+                log.error("角色创建事 : 查询角色信息为空, event : {}", JsonUtil.toString(event));
+                return;
+            }
+            log.error("创角事件消费 gameId : {}, roleId : {}", gameUserRole.getGameId(), gameUserRole.getRoleId());
+            //创角成功, 添加角色操作记录
+            roleOperateService.systemRoleOperate(gameUserRole);
+        } catch (Exception e) {
+            log.error("创角事件消费异常, event : {}, e : {}", JsonUtil.toString(event), e.getMessage(), e);
+        }
+    }
+}

+ 20 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IRoleOperateService.java

@@ -0,0 +1,20 @@
+package com.zanxiang.game.module.sdk.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.mybatis.entity.GameUserRole;
+import com.zanxiang.game.module.mybatis.entity.RoleOperate;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-09-09
+ * @description : 角色操作表
+ */
+public interface IRoleOperateService extends IService<RoleOperate> {
+
+    /**
+     * 系统角色操作
+     *
+     * @param gameUserRole : 玩家角色信息
+     */
+    void systemRoleOperate(GameUserRole gameUserRole);
+}

+ 14 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameUserRoleServiceImpl.java

@@ -10,6 +10,7 @@ import com.zanxiang.game.module.sdk.constant.RedisKeyConstant;
 import com.zanxiang.game.module.sdk.enums.DataTypeEnum;
 import com.zanxiang.game.module.sdk.enums.KafkaEventTrackEnum;
 import com.zanxiang.game.module.sdk.enums.LoginTypeEnum;
+import com.zanxiang.game.module.sdk.listener.GameRoleCreateEvent;
 import com.zanxiang.game.module.sdk.pojo.param.GameRoleActiveCallParam;
 import com.zanxiang.game.module.sdk.pojo.param.GameUserRoleSubmitParam;
 import com.zanxiang.game.module.sdk.pojo.param.GameUserRoleUpdateParam;
@@ -22,6 +23,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.client.RestTemplate;
@@ -72,6 +75,10 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
     @Autowired
     private IGameExtService gameExtService;
 
+    @Lazy
+    @Autowired
+    private ApplicationContext applicationContext;
+
     @Override
     public Boolean updateUserGameRole(GameUserRoleSubmitParam param) {
         //查询游戏信息
@@ -265,6 +272,13 @@ public class GameUserRoleServiceImpl extends ServiceImpl<GameUserRoleMapper, Gam
         kafkaService.eventTrack(KafkaEventTrackEnum.KAFKA_EVENT_TRACK_ROLE_CREATE, JsonUtil.toString(userRole));
         //创建角色通知监听服务
         this.callListenIn(param, userData);
+        //发布创角事件
+        try {
+            GameRoleCreateEvent gameRoleCreateEvent = new GameRoleCreateEvent(this, userRole);
+            applicationContext.publishEvent(gameRoleCreateEvent);
+        } catch (Exception e) {
+            log.error("创角事件发布异常, gameId : {}, role : {}", userRole.getGameId(), userRole.getRoleId());
+        }
     }
 
     private GameUserRole transform(GameUserRoleUpdateParam param, UserData userData, GameUser gameUser, User user) {

+ 80 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/RoleOperateServiceImpl.java

@@ -0,0 +1,80 @@
+package com.zanxiang.game.module.sdk.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.module.mybatis.entity.GameUserRole;
+import com.zanxiang.game.module.mybatis.entity.RoleOperate;
+import com.zanxiang.game.module.mybatis.entity.User;
+import com.zanxiang.game.module.mybatis.mapper.RoleOperateMapper;
+import com.zanxiang.game.module.sdk.service.IAgentService;
+import com.zanxiang.game.module.sdk.service.IRoleOperateService;
+import com.zanxiang.game.module.sdk.service.IUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.Map;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-09-09
+ * @description : 角色操作表
+ */
+@Slf4j
+@Service
+public class RoleOperateServiceImpl extends ServiceImpl<RoleOperateMapper, RoleOperate> implements IRoleOperateService {
+
+    @Autowired
+    private IUserService userService;
+
+    @Autowired
+    private IAgentService agentService;
+
+    @Override
+    public void systemRoleOperate(GameUserRole gameUserRole) {
+        //查询玩家信息
+        User user = userService.getById(gameUserRole.getUserId());
+        //解析玩家渠道信息
+        Map<String, String> channelMap = agentService.channelTransform(user.getChannel());
+        if (!channelMap.containsKey("corpId") || !channelMap.containsKey("corpUserId")
+                || !channelMap.containsKey("externalUserId")) {
+            log.error("创角事件 : 非企微链路, 不做操作! gameId : {}, roleId : {}", gameUserRole.getGameId(), gameUserRole.getRoleId());
+            return;
+        }
+        //查询操作记录
+        RoleOperate roleOperate = super.getOne(new LambdaQueryWrapper<RoleOperate>()
+                .eq(RoleOperate::getGameId, gameUserRole.getGameId())
+                .eq(RoleOperate::getServerId, gameUserRole.getServerId())
+                .eq(RoleOperate::getUserId, gameUserRole.getUserId())
+                .eq(RoleOperate::getRoleId, gameUserRole.getRoleId()));
+        if (roleOperate == null) {
+            roleOperate = this.transform(gameUserRole, channelMap);
+        } else {
+            roleOperate.setCorpId(channelMap.get("corpId"));
+            roleOperate.setExternalUserId(channelMap.get("externalUserId"));
+            roleOperate.setAddCorpUserId(channelMap.get("corpUserId"));
+            roleOperate.setIsAddCorpWechat(1);
+            roleOperate.setUpdateBy(RoleOperate.SYSTEM_OPERATE);
+            roleOperate.setUpdateTime(LocalDateTime.now());
+        }
+        super.saveOrUpdate(roleOperate);
+    }
+
+    private RoleOperate transform(GameUserRole gameUserRole, Map<String, String> channelMap) {
+        return RoleOperate.builder()
+                .gameId(gameUserRole.getGameId())
+                .serverId(gameUserRole.getServerId())
+                .userId(gameUserRole.getUserId())
+                .roleId(gameUserRole.getRoleId())
+                .corpId(channelMap.get("corpId"))
+                .externalUserId(channelMap.get("externalUserId"))
+                .addCorpUserId(channelMap.get("corpUserId"))
+                .isAddCorpWechat(1)
+                .createBy(RoleOperate.SYSTEM_OPERATE)
+                .createTime(LocalDateTime.now())
+                .updateBy(RoleOperate.SYSTEM_OPERATE)
+                .updateTime(LocalDateTime.now())
+                .build();
+    }
+}