Browse Source

Merge remote-tracking branch 'origin/package' into package

zhangxianyu 7 months ago
parent
commit
0b490619ae
52 changed files with 2311 additions and 17 deletions
  1. 16 0
      game-module/game-module-manage/pom.xml
  2. 1 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  3. 4 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/constant/RedisKeyConstant.java
  4. 10 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/AgentController.java
  5. 130 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/GameGiftPackController.java
  6. 44 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/api/GameGiftPackApi.java
  7. 36 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/api/SmsController.java
  8. 9 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/handler/GlobalExceptionHandler.java
  9. 50 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/dto/GameGiftPackConditionDTO.java
  10. 17 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/dto/GameGiftPackLinkVisitDTO.java
  11. 38 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackCodeAddParam.java
  12. 61 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackCodeListParam.java
  13. 37 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackCodeLogListParam.java
  14. 27 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackCodeUpdateParam.java
  15. 37 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackLinkAddParam.java
  16. 59 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackLinkListParam.java
  17. 37 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackLinkLogListParam.java
  18. 22 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackLinkLogPushParam.java
  19. 37 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackLinkUpdateParam.java
  20. 69 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameGiftPackCodeLogVO.java
  21. 69 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameGiftPackCodeVO.java
  22. 45 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameGiftPackLinkLogVO.java
  23. 94 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameGiftPackLinkVO.java
  24. 23 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameGiftPackCodeLogService.java
  25. 41 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameGiftPackCodeService.java
  26. 23 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameGiftPackConfigService.java
  27. 41 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameGiftPackLinkLogService.java
  28. 49 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameGiftPackLinkService.java
  29. 26 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/ISmsService.java
  30. 7 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IUserAgentLogService.java
  31. 44 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameGiftPackCodeLogServiceImpl.java
  32. 131 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameGiftPackCodeServiceImpl.java
  33. 60 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameGiftPackConfigServiceImpl.java
  34. 142 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameGiftPackLinkLogServiceImpl.java
  35. 182 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameGiftPackLinkServiceImpl.java
  36. 67 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/SmsServiceImpl.java
  37. 50 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserAgentLogServiceImpl.java
  38. 71 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameGiftPackCode.java
  39. 91 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameGiftPackCodeLog.java
  40. 75 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameGiftPackConfig.java
  41. 81 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameGiftPackLink.java
  42. 76 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameGiftPackLinkLog.java
  43. 12 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameGiftPackCodeLogMapper.java
  44. 12 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameGiftPackCodeMapper.java
  45. 12 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameGiftPackConfigMapper.java
  46. 12 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameGiftPackLinkLogMapper.java
  47. 12 0
      game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameGiftPackLinkMapper.java
  48. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java
  49. 5 4
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IUserAgentLogService.java
  50. 3 2
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/AgentServiceImpl.java
  51. 3 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CpPushDataServiceImpl.java
  52. 10 8
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserAgentLogServiceImpl.java

+ 16 - 0
game-module/game-module-manage/pom.xml

@@ -137,6 +137,22 @@
             <artifactId>commons-io</artifactId>
             <version>2.11.0</version>
         </dependency>
+        <!--sms集成-->
+        <dependency>
+            <groupId>com.zanxiang.module</groupId>
+            <artifactId>zx-sms</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>4.10.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okio</groupId>
+            <artifactId>okio</artifactId>
+            <version>3.0.0</version>
+        </dependency>
+
     </dependencies>
 
     <build>

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

@@ -23,7 +23,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 < (梦回发送玩家弹窗消息, 新增二维码和获客链接字段・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 < (发码器后台代码提交05・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 4 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/constant/RedisKeyConstant.java

@@ -42,4 +42,8 @@ public class RedisKeyConstant {
      */
     public static final String GAME_USER_ROLE_UP_LOCK = RedisKeyConstant.REDIS_PREFIX + "gameUserRoleUpLock_";
 
+    /**
+     * 手机验证码缓存key
+     */
+    public static final String SMS_PHONE_KEY = RedisKeyConstant.REDIS_PREFIX + "sms_phone";
 }

+ 10 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/AgentController.java

@@ -8,6 +8,7 @@ import com.zanxiang.game.module.manage.pojo.params.AgentAddParam;
 import com.zanxiang.game.module.manage.pojo.params.AgentListParam;
 import com.zanxiang.game.module.manage.pojo.vo.AgentVO;
 import com.zanxiang.game.module.manage.service.IAgentService;
+import com.zanxiang.game.module.manage.service.IUserAgentLogService;
 import com.zanxiang.game.module.mybatis.entity.Agent;
 import com.zanxiang.module.util.exception.BaseException;
 import com.zanxiang.module.util.pojo.ResultVO;
@@ -27,6 +28,9 @@ public class AgentController {
     @Autowired
     private IAgentService agentService;
 
+    @Autowired
+    private IUserAgentLogService userAgentLogService;
+
     @PreAuthorize(permissionKey = "manage:agent:list")
     @PostMapping("/list")
     public ResultVO<IPage<AgentVO>> listOfPage(@Validated @RequestBody AgentListParam dto) {
@@ -89,4 +93,10 @@ public class AgentController {
     public ResultVO<Boolean> configBackPolicy(@PathVariable("agentIds") List<Long> agentIds, @PathVariable(value = "backPolicyId", required = false) Long backPolicyId) {
         return ResultVO.ok(agentService.configBackPolicy(agentIds, backPolicyId));
     }
+
+    @PutMapping("/user/agent/log/update")
+    public ResultVO<Void> userAgentLogUpdate(@RequestParam Boolean isRunUpdate) {
+        userAgentLogService.userAgentLogUpdate(isRunUpdate);
+        return ResultVO.ok();
+    }
 }

+ 130 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/GameGiftPackController.java

@@ -0,0 +1,130 @@
+package com.zanxiang.game.module.manage.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.zanxiang.erp.security.annotation.PreAuthorize;
+import com.zanxiang.game.module.manage.pojo.params.*;
+import com.zanxiang.game.module.manage.pojo.vo.GameGiftPackCodeLogVO;
+import com.zanxiang.game.module.manage.pojo.vo.GameGiftPackCodeVO;
+import com.zanxiang.game.module.manage.pojo.vo.GameGiftPackLinkLogVO;
+import com.zanxiang.game.module.manage.pojo.vo.GameGiftPackLinkVO;
+import com.zanxiang.game.module.manage.service.*;
+import com.zanxiang.module.util.pojo.ResultVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import reactor.util.function.Tuple2;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-10-31
+ * @description : 游戏发码器
+ */
+@Slf4j
+@Api(tags = {"游戏发码器"})
+@RestController
+@RequestMapping("/game/gift/pack")
+public class GameGiftPackController {
+
+    @Autowired
+    private IGameGiftPackCodeService gameGiftPackCodeService;
+
+    @Autowired
+    private IGameGiftPackLinkService gameGiftPackLinkService;
+
+    @Autowired
+    private IGameGiftPackConfigService gameGiftPackConfigService;
+
+    @Autowired
+    private IGameGiftPackLinkLogService gameGiftPackLinkLogService;
+
+    @Autowired
+    private IGameGiftPackCodeLogService gameGiftPackCodeLogService;
+
+    @ApiOperation(value = "获取发码器配置")
+    @GetMapping(value = "/config/list")
+    @PreAuthorize(permissionKey = "manage:giftPack:configList")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = List.class)})
+    public ResultVO<List<Tuple2<Map<Long, String>, Map<String, String>>>> getGameGiftPackConfig() {
+        return ResultVO.ok(gameGiftPackConfigService.getGameGiftPackConfig());
+    }
+
+    @ApiOperation(value = "查询礼包码链接列表")
+    @PostMapping(value = "/link/list")
+    @PreAuthorize(permissionKey = "manage:giftPack:linkList")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = GameGiftPackLinkVO.class)})
+    public ResultVO<IPage<GameGiftPackLinkVO>> linkList(@Validated @RequestBody GameGiftPackLinkListParam param) {
+        return ResultVO.ok(gameGiftPackLinkService.list(param));
+    }
+
+    @ApiOperation(value = "更新礼包码链接")
+    @PostMapping(value = "/link/update")
+    @PreAuthorize(permissionKey = "manage:giftPack:linkUpdate")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
+    public ResultVO<Boolean> updateGiftPackLink(@Validated @RequestBody GameGiftPackLinkUpdateParam param) {
+        return ResultVO.ok(gameGiftPackLinkService.updateGiftPackLink(param));
+    }
+
+    @ApiOperation(value = "删除礼包码链接")
+    @DeleteMapping(value = "/link/delete")
+    @PreAuthorize(permissionKey = "manage:giftPack:linkDelete")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
+    public ResultVO<Boolean> deleteById(@RequestParam Long id) {
+        return ResultVO.ok(gameGiftPackLinkService.deleteById(id));
+    }
+
+    @ApiOperation(value = "添加礼包码链接")
+    @PostMapping(value = "/link/add")
+    @PreAuthorize(permissionKey = "manage:giftPack:linkAdd")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
+    public ResultVO<Boolean> addGiftPackLink(@Validated @RequestBody GameGiftPackLinkAddParam param) {
+        return ResultVO.ok(gameGiftPackLinkService.addGiftPackLink(param));
+    }
+
+    @ApiOperation(value = "查询链接礼包码列表")
+    @PostMapping(value = "/link/code/list")
+    @PreAuthorize(permissionKey = "manage:giftPack:linkCodeList")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = GameGiftPackCodeVO.class)})
+    public ResultVO<IPage<GameGiftPackCodeVO>> linkList(@Validated @RequestBody GameGiftPackCodeListParam param) {
+        return ResultVO.ok(gameGiftPackCodeService.list(param));
+    }
+
+    @ApiOperation(value = "添加链接礼包码")
+    @PostMapping(value = "/link/code/add")
+    @PreAuthorize(permissionKey = "manage:giftPack:linkCodeAdd")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
+    public ResultVO<Boolean> addGiftPackLin(@Validated @RequestBody GameGiftPackCodeAddParam param) {
+        return ResultVO.ok(gameGiftPackCodeService.addGiftPackCode(param));
+    }
+
+    @ApiOperation(value = "更新链接礼包码")
+    @PostMapping(value = "/link/code/update")
+    @PreAuthorize(permissionKey = "manage:giftPack:linkCodeUpdate")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
+    public ResultVO<Boolean> updateGiftPackLin(@Validated @RequestBody GameGiftPackCodeUpdateParam param) {
+        return ResultVO.ok(gameGiftPackCodeService.updateGiftPackCode(param));
+    }
+
+    @ApiOperation(value = "查询链接访问记录")
+    @PostMapping(value = "/link/log/list")
+    @PreAuthorize(permissionKey = "manage:giftPack:linkLogList")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = GameGiftPackLinkLogVO.class)})
+    public ResultVO<IPage<GameGiftPackLinkLogVO>> linkLogList(@Validated @RequestBody GameGiftPackLinkLogListParam param) {
+        return ResultVO.ok(gameGiftPackLinkLogService.list(param));
+    }
+
+    @ApiOperation(value = "查询礼包码领取记录")
+    @PostMapping(value = "/code/log/list")
+    @PreAuthorize(permissionKey = "manage:giftPack:codeLogList")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = GameGiftPackCodeLogVO.class)})
+    public ResultVO<IPage<GameGiftPackCodeLogVO>> codeLogList(@Validated @RequestBody GameGiftPackCodeLogListParam param) {
+        return ResultVO.ok(gameGiftPackCodeLogService.list(param));
+    }
+}

+ 44 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/api/GameGiftPackApi.java

@@ -0,0 +1,44 @@
+package com.zanxiang.game.module.manage.controller.api;
+
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackLinkLogPushParam;
+import com.zanxiang.game.module.manage.service.IGameGiftPackLinkLogService;
+import com.zanxiang.module.util.pojo.ResultVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-04
+ * @description : 发码器外部接口
+ */
+@Slf4j
+@Api(tags = {"发码器外部接口"})
+@RestController
+@RequestMapping("/api/game/gift/pack")
+public class GameGiftPackApi {
+
+    @Autowired
+    private IGameGiftPackLinkLogService gameGiftPackLinkLogService;
+
+    @ApiOperation(value = "链接访问记录推送提交")
+    @PostMapping(value = "/link/log/push")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Long.class)})
+    public ResultVO<Long> linkList(@Validated @RequestBody GameGiftPackLinkLogPushParam param) {
+        return ResultVO.ok(gameGiftPackLinkLogService.linkVisitLogPush(param.getUrl()));
+    }
+
+    @ApiOperation(value = "获取游戏区服列表")
+    @GetMapping(value = "/source/game/server")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Long.class)})
+    public ResultVO<Map<String, String>> getSourceGameServer(@RequestParam Long linkLogId) {
+        return ResultVO.ok(gameGiftPackLinkLogService.getSourceGameServer(linkLogId));
+    }
+}

+ 36 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/api/SmsController.java

@@ -0,0 +1,36 @@
+package com.zanxiang.game.module.manage.controller.api;
+
+import com.zanxiang.game.module.manage.service.ISmsService;
+import com.zanxiang.module.util.pojo.ResultVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-04
+ * @description : 手机短信接口
+ */
+@Slf4j
+@Api(tags = {"手机短信接口"})
+@RestController
+@RequestMapping("/api/sms")
+public class SmsController {
+
+    @Autowired
+    private ISmsService smsService;
+
+    @ApiOperation(value = "手机验证码发送")
+    @GetMapping(value = "/random/code/send")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
+    public ResultVO<Boolean> randomCodeSend(@RequestParam String phoneNumber) {
+        return ResultVO.ok(smsService.randomCodeSend(phoneNumber));
+    }
+}

+ 9 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/handler/GlobalExceptionHandler.java

@@ -34,6 +34,15 @@ public class GlobalExceptionHandler {
         return ResultVO.fail(e.getMessage());
     }
 
+    /**
+     * 断言判断异常
+     */
+    @ExceptionHandler(AssertionError.class)
+    public ResultVO<?> assertionError(AssertionError e) {
+        log.error(e.getMessage(), e);
+        return ResultVO.fail(e.getMessage());
+    }
+
     /**
      * http method错误
      *

+ 50 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/dto/GameGiftPackConditionDTO.java

@@ -0,0 +1,50 @@
+package com.zanxiang.game.module.manage.pojo.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-10-31
+ * @description : 发码器礼包领取条件
+ */
+@Data
+public class GameGiftPackConditionDTO {
+
+    /**
+     * 未登录时间区间(单位 : 分钟)
+     */
+    @ApiModelProperty(notes = "未登录时间区间(单位 : 分钟)")
+    private RangeBean unLogin;
+
+    /**
+     * 注册时间区间(单位 : 分钟)
+     */
+    @ApiModelProperty(notes = "注册时间区间(单位 : 分钟)")
+    private RangeBean regTime;
+
+    /**
+     * 付费区间(单位 : 元)
+     */
+    @ApiModelProperty(notes = "付费区间(单位 : 元)")
+    private RangeBean pay;
+
+    /**
+     * 区间对象
+     */
+    @Data
+    public static class RangeBean {
+
+        /**
+         * 最小值
+         */
+        @ApiModelProperty(notes = "最小值")
+        private Long min;
+
+        /**
+         * 最大值
+         */
+        @ApiModelProperty(notes = "最大值")
+        private Long max;
+    }
+}

+ 17 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/dto/GameGiftPackLinkVisitDTO.java

@@ -0,0 +1,17 @@
+package com.zanxiang.game.module.manage.pojo.dto;
+
+import lombok.Data;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-04
+ * @description :
+ */
+@Data
+public class GameGiftPackLinkVisitDTO {
+
+    /**
+     * 访问日志id
+     */
+    private Long linkLogId;
+}

+ 38 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackCodeAddParam.java

@@ -0,0 +1,38 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-01
+ * @description : 礼包码添加参数
+ */
+@Data
+public class GameGiftPackCodeAddParam {
+
+    /**
+     * 礼包链接id
+     */
+    @NotNull(message = "礼包链接id不可为空")
+    @ApiModelProperty(notes = "礼包链接id, 必传")
+    private Long linkId;
+
+    /**
+     * 游戏id
+     */
+    @NotNull(message = "游戏id不可为空")
+    @ApiModelProperty(notes = "游戏id, 必传")
+    private Long gameId;
+
+    /**
+     * 礼包码列表
+     */
+    @NotEmpty(message = "礼包码列表不可为空")
+    @ApiModelProperty(notes = "礼包码列表, 必传")
+    private List<String> codeList;
+}

+ 61 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackCodeListParam.java

@@ -0,0 +1,61 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackCode;
+import com.zanxiang.module.web.pojo.BaseListDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-01
+ * @description :
+ */
+@Data
+public class GameGiftPackCodeListParam extends BaseListDTO<GameGiftPackCode> {
+
+    /**
+     * 链接id
+     */
+    @NotNull(message = "链接id不可为空")
+    @ApiModelProperty(notes = "链接id, 必传")
+    private Long linkId;
+
+    /**
+     * 礼包码
+     */
+    @ApiModelProperty(notes = "礼包码")
+    private String code;
+
+    /**
+     * 是否可用
+     */
+    @ApiModelProperty(notes = "是否可用")
+    private Integer enabled;
+
+    /**
+     * 创建开始时间
+     */
+    @ApiModelProperty(notes = "创建开始时间")
+    private LocalDate createBeginTime;
+
+    /**
+     * 创建结束时间
+     */
+    @ApiModelProperty(notes = "创建结束时间")
+    private LocalDate createEndTime;
+
+    /**
+     * 创建开始时间
+     */
+    @ApiModelProperty(notes = "创建开始时间")
+    private LocalDate updateBeginTime;
+
+    /**
+     * 创建结束时间
+     */
+    @ApiModelProperty(notes = "创建结束时间")
+    private LocalDate updateEndTime;
+}

+ 37 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackCodeLogListParam.java

@@ -0,0 +1,37 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackCodeLog;
+import com.zanxiang.module.web.pojo.BaseListDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-04
+ * @description : 礼包码领取查询记录参数
+ */
+@Data
+public class GameGiftPackCodeLogListParam extends BaseListDTO<GameGiftPackCodeLog> {
+
+    /**
+     * 链接id
+     */
+    @NotNull(message = "链接id不可为空")
+    @ApiModelProperty(notes = "链接id, 必传")
+    private Long linkId;
+
+    /**
+     * 创建开始时间
+     */
+    @ApiModelProperty(notes = "领取开始时间")
+    private LocalDate createBeginTime;
+
+    /**
+     * 创建结束时间
+     */
+    @ApiModelProperty(notes = "领取结束时间")
+    private LocalDate createEndTime;
+}

+ 27 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackCodeUpdateParam.java

@@ -0,0 +1,27 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-01
+ * @description : 礼包码更新参数
+ */
+@Data
+public class GameGiftPackCodeUpdateParam {
+
+    /**
+     * 礼包码id列表
+     */
+    @ApiModelProperty(notes = "礼包码id列表, 必传数组")
+    private List<Long> ids;
+
+    /**
+     * 是否有效
+     */
+    @ApiModelProperty(notes = "是否有效, 必传")
+    private Boolean enabled;
+}

+ 37 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackLinkAddParam.java

@@ -0,0 +1,37 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import com.zanxiang.game.module.manage.pojo.dto.GameGiftPackConditionDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-10-31
+ * @description : 发码器链接添加参数
+ */
+@Data
+public class GameGiftPackLinkAddParam {
+
+    /**
+     * 游戏id
+     */
+    @NotNull(message = "游戏id不可为空")
+    @ApiModelProperty(notes = "游戏id")
+    private Long gameId;
+
+    /**
+     * 礼包类型
+     */
+    @NotBlank(message = "礼包类型不可为空")
+    @ApiModelProperty(notes = "礼包类型")
+    private String codeType;
+
+    /**
+     * 礼包判定条件
+     */
+    @ApiModelProperty(notes = "礼包判定条件")
+    private GameGiftPackConditionDTO conditionDTO;
+}

+ 59 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackLinkListParam.java

@@ -0,0 +1,59 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackLink;
+import com.zanxiang.module.web.pojo.BaseListDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-10-31
+ * @description : 游戏礼包码链接查询参数
+ */
+@Data
+public class GameGiftPackLinkListParam extends BaseListDTO<GameGiftPackLink> {
+
+    /**
+     * 游戏id
+     */
+    @ApiModelProperty(notes = "游戏id")
+    private Long gameId;
+
+    /**
+     * 礼包码类型
+     */
+    @ApiModelProperty(notes = "礼包码类型")
+    private String codeType;
+
+    /**
+     * 礼包链接
+     */
+    @ApiModelProperty(notes = "礼包链接")
+    private String codeLink;
+
+    /**
+     * 创建开始时间
+     */
+    @ApiModelProperty(notes = "创建开始时间")
+    private LocalDate createBeginTime;
+
+    /**
+     * 创建结束时间
+     */
+    @ApiModelProperty(notes = "创建结束时间")
+    private LocalDate createEndTime;
+
+    /**
+     * 创建开始时间
+     */
+    @ApiModelProperty(notes = "创建开始时间")
+    private LocalDate updateBeginTime;
+
+    /**
+     * 创建结束时间
+     */
+    @ApiModelProperty(notes = "创建结束时间")
+    private LocalDate updateEndTime;
+}

+ 37 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackLinkLogListParam.java

@@ -0,0 +1,37 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackLinkLog;
+import com.zanxiang.module.web.pojo.BaseListDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-04
+ * @description :
+ */
+@Data
+public class GameGiftPackLinkLogListParam extends BaseListDTO<GameGiftPackLinkLog> {
+
+    /**
+     * 链接id
+     */
+    @NotNull(message = "链接id不可为空")
+    @ApiModelProperty(notes = "链接id, 必传")
+    private Long linkId;
+
+    /**
+     * 创建开始时间
+     */
+    @ApiModelProperty(notes = "创建时间开始时间")
+    private LocalDate createBeginTime;
+
+    /**
+     * 创建结束时间
+     */
+    @ApiModelProperty(notes = "创建时间结束时间")
+    private LocalDate createEndTime;
+}

+ 22 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackLinkLogPushParam.java

@@ -0,0 +1,22 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-04
+ * @description :
+ */
+@Data
+public class GameGiftPackLinkLogPushParam {
+
+    /**
+     * 网页完整地址
+     */
+    @NotBlank(message = "网页地址不可空")
+    @ApiModelProperty(notes = "网页完整地址")
+    private String url;
+}

+ 37 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/params/GameGiftPackLinkUpdateParam.java

@@ -0,0 +1,37 @@
+package com.zanxiang.game.module.manage.pojo.params;
+
+import com.zanxiang.game.module.manage.pojo.dto.GameGiftPackConditionDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-10-31
+ * @description : 礼包链接更新
+ */
+@Data
+public class GameGiftPackLinkUpdateParam {
+
+    /**
+     * 主键id
+     */
+    @NotNull(message = "主键id不可为空")
+    @ApiModelProperty(notes = "主键id")
+    private Long id;
+
+    /**
+     * 礼包类型
+     */
+    @NotBlank(message = "礼包类型不可为空")
+    @ApiModelProperty(notes = "礼包类型")
+    private String codeType;
+
+    /**
+     * 礼包判定条件
+     */
+    @ApiModelProperty(notes = "礼包判定条件")
+    private GameGiftPackConditionDTO conditionDTO;
+}

+ 69 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameGiftPackCodeLogVO.java

@@ -0,0 +1,69 @@
+package com.zanxiang.game.module.manage.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-04
+ * @description : 礼包码领取记录
+ */
+@Data
+public class GameGiftPackCodeLogVO {
+
+    /**
+     * 主键id
+     */
+    @ApiModelProperty(notes = "主键id")
+    private Long id;
+
+    /**
+     * 礼包码
+     */
+    @ApiModelProperty(notes = "礼包码")
+    private String code;
+
+    /**
+     * 玩家id
+     */
+    @ApiModelProperty(notes = "玩家id")
+    private Integer userId;
+
+    /**
+     * 角色id
+     */
+    @ApiModelProperty(notes = "角色id")
+    private String roleId;
+
+    /**
+     * 角色名称
+     */
+    @ApiModelProperty(notes = "角色名称")
+    private String roleName;
+
+    /**
+     * 企业id
+     */
+    @ApiModelProperty(notes = "企业id")
+    private String corpId;
+
+    /**
+     * 客服号id
+     */
+    @ApiModelProperty(notes = "客服号id")
+    private String corpUserId;
+
+    /**
+     * 企微用户id
+     */
+    @ApiModelProperty(notes = "企微用户id")
+    private String externalUserId;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(notes = "创建时间")
+    private LocalDateTime createTime;
+}

+ 69 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameGiftPackCodeVO.java

@@ -0,0 +1,69 @@
+package com.zanxiang.game.module.manage.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-01
+ * @description : 礼包码
+ */
+@Data
+public class GameGiftPackCodeVO {
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty(notes = "主键")
+    private Long id;
+
+    /**
+     * 礼包码
+     */
+    @ApiModelProperty(notes = "礼包码")
+    private String code;
+
+    /**
+     * 是否可用
+     */
+    @ApiModelProperty(notes = "是否可用")
+    private Integer enabled;
+
+    /**
+     * 创建者
+     */
+    @ApiModelProperty(notes = "创建者")
+    private String createByName;
+
+    /**
+     * 创建者
+     */
+    @ApiModelProperty(notes = "创建者")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(notes = "创建时间")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    @ApiModelProperty(notes = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新者
+     */
+    @ApiModelProperty(notes = "更新者")
+    private String updateByName;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(notes = "更新时间")
+    private LocalDateTime updateTime;
+}

+ 45 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameGiftPackLinkLogVO.java

@@ -0,0 +1,45 @@
+package com.zanxiang.game.module.manage.pojo.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-04
+ * @description : 链接访问记录
+ */
+@Data
+public class GameGiftPackLinkLogVO {
+
+    /**
+     * 主键id
+     */
+    @ApiModelProperty(notes = "主键id")
+    private Long id;
+
+    /**
+     * 企业id
+     */
+    @ApiModelProperty(notes = "企业id")
+    private String corpId;
+
+    /**
+     * 客服号id
+     */
+    @ApiModelProperty(notes = "客服号id")
+    private String corpUserId;
+
+    /**
+     * 企微用户id
+     */
+    @ApiModelProperty(notes = "企微用户id")
+    private String externalUserId;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(notes = "创建时间")
+    private LocalDateTime createTime;
+}

+ 94 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/pojo/vo/GameGiftPackLinkVO.java

@@ -0,0 +1,94 @@
+package com.zanxiang.game.module.manage.pojo.vo;
+
+import com.zanxiang.game.module.manage.pojo.dto.GameGiftPackConditionDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-10-31
+ * @description : 游戏礼包码链接
+ */
+@Data
+public class GameGiftPackLinkVO {
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty(notes = "主键")
+    private Long id;
+
+    /**
+     * 游戏id
+     */
+    @ApiModelProperty(notes = "游戏id")
+    private Long gameId;
+
+    /**
+     * 游戏名称
+     */
+    @ApiModelProperty(notes = "游戏名称")
+    private String gameName;
+
+    /**
+     * 礼包码类型
+     */
+    @ApiModelProperty(notes = "礼包码类型")
+    private String codeType;
+
+    /**
+     * 礼包码类型名称
+     */
+    @ApiModelProperty(notes = "礼包码类型名称")
+    private String codeTypeName;
+
+    /**
+     * 礼包判定条件
+     */
+    @ApiModelProperty(notes = "礼包判定条件")
+    private GameGiftPackConditionDTO conditionDTO;
+
+    /**
+     * 礼包链接
+     */
+    @ApiModelProperty(notes = "礼包链接")
+    private String codeLink;
+
+    /**
+     * 更新者名字
+     */
+    @ApiModelProperty(notes = "更新者名字")
+    private String createByName;
+
+    /**
+     * 创建者
+     */
+    @ApiModelProperty(notes = "创建者")
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty(notes = "创建时间")
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    @ApiModelProperty(notes = "更新者")
+    private Long updateBy;
+
+    /**
+     * 更新者名字
+     */
+    @ApiModelProperty(notes = "更新者名字")
+    private String updateByName;
+
+    /**
+     * 更新时间
+     */
+    @ApiModelProperty(notes = "更新时间")
+    private LocalDateTime updateTime;
+}

+ 23 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameGiftPackCodeLogService.java

@@ -0,0 +1,23 @@
+package com.zanxiang.game.module.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackCodeLogListParam;
+import com.zanxiang.game.module.manage.pojo.vo.GameGiftPackCodeLogVO;
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackCodeLog;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-09-23
+ * @description : 游戏礼包码领取日志
+ */
+public interface IGameGiftPackCodeLogService extends IService<GameGiftPackCodeLog> {
+
+    /**
+     * 查询访问记录
+     *
+     * @param param : 查询参数
+     * @return : 返回访问记录列表
+     */
+    IPage<GameGiftPackCodeLogVO> list(GameGiftPackCodeLogListParam param);
+}

+ 41 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameGiftPackCodeService.java

@@ -0,0 +1,41 @@
+package com.zanxiang.game.module.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackCodeAddParam;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackCodeListParam;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackCodeUpdateParam;
+import com.zanxiang.game.module.manage.pojo.vo.GameGiftPackCodeVO;
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackCode;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-09-23
+ * @description : 游戏礼包码
+ */
+public interface IGameGiftPackCodeService extends IService<GameGiftPackCode> {
+
+    /**
+     * 分页参数
+     *
+     * @param param : 查询参数
+     * @return : 返回数据
+     */
+    IPage<GameGiftPackCodeVO> list(GameGiftPackCodeListParam param);
+
+    /**
+     * 添加礼包码
+     *
+     * @param param : 添加参数
+     * @return : 返回添加结果
+     */
+    boolean addGiftPackCode(GameGiftPackCodeAddParam param);
+
+    /**
+     * 礼包码更新
+     *
+     * @param param : 更新参数
+     * @return : 返回结果
+     */
+    boolean updateGiftPackCode(GameGiftPackCodeUpdateParam param);
+}

+ 23 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameGiftPackConfigService.java

@@ -0,0 +1,23 @@
+package com.zanxiang.game.module.manage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackConfig;
+import reactor.util.function.Tuple2;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-09-23
+ * @description : 游戏礼包码配置
+ */
+public interface IGameGiftPackConfigService extends IService<GameGiftPackConfig> {
+
+    /**
+     * 获取游戏礼包配置
+     *
+     * @return : 返回游戏礼包配置
+     */
+    List<Tuple2<Map<Long, String>, Map<String, String>>> getGameGiftPackConfig();
+}

+ 41 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameGiftPackLinkLogService.java

@@ -0,0 +1,41 @@
+package com.zanxiang.game.module.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackLinkLogListParam;
+import com.zanxiang.game.module.manage.pojo.vo.GameGiftPackLinkLogVO;
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackLinkLog;
+
+import java.util.Map;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-09-23
+ * @description : 游戏礼包码链接访问日志
+ */
+public interface IGameGiftPackLinkLogService extends IService<GameGiftPackLinkLog> {
+
+    /**
+     * 链接访问记录仪提交
+     *
+     * @param url : 链接地址
+     * @return : 返回记录主键id
+     */
+    Long linkVisitLogPush(String url);
+
+    /**
+     * 分页查新访问记录
+     *
+     * @param param : 查询参数
+     * @return : 返回数据列表
+     */
+    IPage<GameGiftPackLinkLogVO> list(GameGiftPackLinkLogListParam param);
+
+    /**
+     * 获取游戏原始区服信息
+     *
+     * @param linkLogId : 访问日志id
+     * @return : 返回游戏区服信息
+     */
+    Map<String, String> getSourceGameServer(Long linkLogId);
+}

+ 49 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IGameGiftPackLinkService.java

@@ -0,0 +1,49 @@
+package com.zanxiang.game.module.manage.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackLinkAddParam;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackLinkListParam;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackLinkUpdateParam;
+import com.zanxiang.game.module.manage.pojo.vo.GameGiftPackLinkVO;
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackLink;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-09-23
+ * @description : 游戏礼包码链接
+ */
+public interface IGameGiftPackLinkService extends IService<GameGiftPackLink> {
+
+    /**
+     * 分页查询
+     *
+     * @param param : 查询参数
+     * @return : 查询结果
+     */
+    IPage<GameGiftPackLinkVO> list(GameGiftPackLinkListParam param);
+
+    /**
+     * 根据主键id删除
+     *
+     * @param id : 主键id
+     * @return : 删除结果
+     */
+    boolean deleteById(Long id);
+
+    /**
+     * 礼包码链接更新
+     *
+     * @param param : 更新参数
+     * @return : 返回更新结果
+     */
+    boolean updateGiftPackLink(GameGiftPackLinkUpdateParam param);
+
+    /**
+     * 添加礼包码链接
+     *
+     * @param param : 添加参数
+     * @return : 返回结果
+     */
+    boolean addGiftPackLink(GameGiftPackLinkAddParam param);
+}

+ 26 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/ISmsService.java

@@ -0,0 +1,26 @@
+package com.zanxiang.game.module.manage.service;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-04
+ * @description :
+ */
+public interface ISmsService {
+
+    /**
+     * 发送短信验证码
+     *
+     * @param phoneNumber : 手机号
+     * @return : 返回结果
+     */
+    boolean randomCodeSend(String phoneNumber);
+
+    /**
+     * 验证码校验
+     *
+     * @param phoneNumber : 手机号
+     * @param randomCode  : 验证码
+     * @return : 返回验证结果
+     */
+    boolean randomCodeCheck(String phoneNumber, String randomCode);
+}

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

@@ -11,6 +11,13 @@ import com.zanxiang.game.module.mybatis.entity.UserAgentLog;
  */
 public interface IUserAgentLogService extends IService<UserAgentLog> {
 
+    /**
+     * 数据修正
+     *
+     * @param isRunUpdate : 是否执行修正
+     */
+    void userAgentLogUpdate(boolean isRunUpdate);
+
     /**
      * 注册代理日志
      *

+ 44 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameGiftPackCodeLogServiceImpl.java

@@ -0,0 +1,44 @@
+package com.zanxiang.game.module.manage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackCodeLogListParam;
+import com.zanxiang.game.module.manage.pojo.vo.GameGiftPackCodeLogVO;
+import com.zanxiang.game.module.manage.service.IGameGiftPackCodeLogService;
+import com.zanxiang.game.module.manage.service.IGameUserRoleService;
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackCodeLog;
+import com.zanxiang.game.module.mybatis.mapper.GameGiftPackCodeLogMapper;
+import com.zanxiang.module.util.bean.BeanUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import reactor.util.function.Tuple2;
+
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-22
+ * @description : 游戏礼包码领取日志
+ */
+@Service
+public class GameGiftPackCodeLogServiceImpl extends ServiceImpl<GameGiftPackCodeLogMapper, GameGiftPackCodeLog> implements IGameGiftPackCodeLogService {
+
+    @Autowired
+    private IGameUserRoleService gameUserRoleService;
+
+    @Override
+    public IPage<GameGiftPackCodeLogVO> list(GameGiftPackCodeLogListParam param) {
+        return page(param.toPage(), new QueryWrapper<GameGiftPackCodeLog>().lambda()
+                .eq(GameGiftPackCodeLog::getLinkId, param.getLinkId())
+                .ge(param.getCreateBeginTime() != null, GameGiftPackCodeLog::getCreateTime, param.getCreateBeginTime() == null ? null : LocalDateTime.of(param.getCreateBeginTime(), LocalTime.MIN))
+                .le(param.getCreateEndTime() != null, GameGiftPackCodeLog::getCreateTime, param.getCreateEndTime() == null ? null : LocalDateTime.of(param.getCreateEndTime(), LocalTime.MAX))
+                .orderByDesc(GameGiftPackCodeLog::getCreateTime)
+        ).convert(log -> BeanUtil.copy(log, GameGiftPackCodeLogVO.class));
+    }
+
+    public Tuple2<Boolean, String> gameRoleCheck(String gameServerId, String roleName) {
+        return null;
+    }
+}

+ 131 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameGiftPackCodeServiceImpl.java

@@ -0,0 +1,131 @@
+package com.zanxiang.game.module.manage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.manage.pojo.params.GameGiftPackCodeAddParam;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackCodeListParam;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackCodeUpdateParam;
+import com.zanxiang.game.module.manage.pojo.vo.GameGiftPackCodeVO;
+import com.zanxiang.game.module.manage.service.IGameGiftPackCodeService;
+import com.zanxiang.game.module.manage.service.IGameGiftPackLinkService;
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackCode;
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackLink;
+import com.zanxiang.game.module.mybatis.mapper.GameGiftPackCodeMapper;
+import com.zanxiang.module.util.bean.BeanUtil;
+import org.apache.commons.collections4.CollectionUtils;
+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;
+
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-22
+ * @description : 游戏礼包码
+ */
+@Service
+public class GameGiftPackCodeServiceImpl extends ServiceImpl<GameGiftPackCodeMapper, GameGiftPackCode> implements IGameGiftPackCodeService {
+
+    @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
+    private ISysUserRpc sysUserRpc;
+
+    @Autowired
+    private IGameGiftPackLinkService gameGiftPackLinkService;
+
+    @Override
+    public IPage<GameGiftPackCodeVO> list(GameGiftPackCodeListParam param) {
+        IPage<GameGiftPackCode> giftPackLinkIPage = page(param.toPage(), new QueryWrapper<GameGiftPackCode>().lambda()
+                .eq(GameGiftPackCode::getLinkId, param.getLinkId())
+                .eq(Strings.isNotBlank(param.getCode()), GameGiftPackCode::getCode, param.getCode())
+                .eq(param.getEnabled() != null, GameGiftPackCode::getEnabled, param.getEnabled())
+                .ge(param.getCreateBeginTime() != null, GameGiftPackCode::getCreateTime, param.getCreateBeginTime() == null ? null : LocalDateTime.of(param.getCreateBeginTime(), LocalTime.MIN))
+                .le(param.getCreateEndTime() != null, GameGiftPackCode::getCreateTime, param.getCreateEndTime() == null ? null : LocalDateTime.of(param.getCreateEndTime(), LocalTime.MAX))
+                .ge(param.getUpdateBeginTime() != null, GameGiftPackCode::getUpdateTime, param.getUpdateBeginTime() == null ? null : LocalDateTime.of(param.getUpdateBeginTime(), LocalTime.MIN))
+                .le(param.getUpdateEndTime() != null, GameGiftPackCode::getUpdateTime, param.getUpdateEndTime() == null ? null : LocalDateTime.of(param.getUpdateEndTime(), LocalTime.MAX))
+                .orderByDesc(GameGiftPackCode::getUpdateTime));
+        IPage<GameGiftPackCodeVO> result = new Page<>(giftPackLinkIPage.getCurrent(), giftPackLinkIPage.getSize(), giftPackLinkIPage.getTotal());
+        if (CollectionUtils.isNotEmpty(giftPackLinkIPage.getRecords())) {
+            result.setRecords(this.toVOBatch(giftPackLinkIPage.getRecords()));
+        }
+        return result;
+    }
+
+    private List<GameGiftPackCodeVO> toVOBatch(List<GameGiftPackCode> codeList) {
+        //用户信息
+        List<Long> userIdList = codeList.stream()
+                .flatMap(link -> Stream.of(link.getCreateBy(), link.getUpdateBy()))
+                .filter(Objects::nonNull)
+                .distinct().collect(Collectors.toList());
+        Map<Long, String> userMap = sysUserRpc.getUserNameByIds(new ArrayList<>(userIdList)).getData();
+        //循环构造
+        return codeList.stream().map(code -> {
+            GameGiftPackCodeVO vo = BeanUtil.copy(code, GameGiftPackCodeVO.class);
+            vo.setCreateByName(userMap.get(code.getCreateBy()));
+            vo.setUpdateByName(userMap.get(code.getUpdateBy()));
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public boolean addGiftPackCode(GameGiftPackCodeAddParam param) {
+        //查询礼包码链接信息
+        GameGiftPackLink gameGiftPackLink = gameGiftPackLinkService.getOne(new LambdaQueryWrapper<GameGiftPackLink>()
+                .eq(GameGiftPackLink::getId, param.getLinkId())
+                .eq(GameGiftPackLink::getGameId, param.getGameId())
+        );
+        //礼包码链接信息不可为空
+        assert gameGiftPackLink != null : "参数错误, 礼包码链接信息不存在";
+        //判断已存在的礼包码
+        List<String> existCodeList = super.list(new LambdaQueryWrapper<GameGiftPackCode>()
+                .select(GameGiftPackCode::getCode)
+                .eq(GameGiftPackCode::getLinkId, param.getLinkId())
+                .eq(GameGiftPackCode::getGameId, param.getGameId())
+                .in(GameGiftPackCode::getCode, param.getCodeList())
+        ).stream().map(GameGiftPackCode::getCode).collect(Collectors.toList());
+        //构造新的礼包码
+        List<GameGiftPackCode> saveList = param.getCodeList().stream()
+                .filter(code -> !existCodeList.contains(code))
+                .map(code -> GameGiftPackCode.builder()
+                        .linkId(param.getLinkId())
+                        .gameId(param.getGameId())
+                        .code(code)
+                        .enabled(Boolean.TRUE)
+                        .createBy(SecurityUtil.getUserId())
+                        .createTime(LocalDateTime.now())
+                        .updateTime(LocalDateTime.now())
+                        .build())
+                .collect(Collectors.toList());
+        //保存返回
+        return super.saveBatch(saveList);
+    }
+
+    @Override
+    public boolean updateGiftPackCode(GameGiftPackCodeUpdateParam param) {
+        return super.update(new LambdaUpdateWrapper<GameGiftPackCode>()
+                .set(GameGiftPackCode::getEnabled, param.getEnabled())
+                .set(GameGiftPackCode::getUpdateBy, SecurityUtil.getUserId())
+                .set(GameGiftPackCode::getUpdateTime, LocalDateTime.now())
+                .in(GameGiftPackCode::getId, param.getIds())
+        );
+    }
+}
+
+
+
+

+ 60 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameGiftPackConfigServiceImpl.java

@@ -0,0 +1,60 @@
+package com.zanxiang.game.module.manage.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.module.manage.service.IGameGiftPackConfigService;
+import com.zanxiang.game.module.manage.service.IGameService;
+import com.zanxiang.game.module.mybatis.entity.Game;
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackConfig;
+import com.zanxiang.game.module.mybatis.mapper.GameGiftPackConfigMapper;
+import com.zanxiang.module.util.JsonUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import reactor.util.function.Tuple2;
+import reactor.util.function.Tuples;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-22
+ * @description : 游戏礼包码配置
+ */
+@Slf4j
+@Service
+public class GameGiftPackConfigServiceImpl extends ServiceImpl<GameGiftPackConfigMapper, GameGiftPackConfig> implements IGameGiftPackConfigService {
+
+    @Autowired
+    private IGameService gameService;
+
+    @Override
+    public List<Tuple2<Map<Long, String>, Map<String, String>>> getGameGiftPackConfig() {
+        List<GameGiftPackConfig> gameGiftPackConfigList = super.list();
+        if (CollectionUtils.isEmpty(gameGiftPackConfigList)) {
+            return Collections.emptyList();
+        }
+        Map<Long, String> gameMap = gameService.list().stream().collect(Collectors.toMap(Game::getId, Game::getName));
+        List<Tuple2<Map<Long, String>, Map<String, String>>> list = new ArrayList<>();
+        gameGiftPackConfigList.forEach(config -> {
+            String gameIds = config.getGameIds();
+            String codeTypeConfig = config.getCodeTypeConfig();
+            if (StringUtils.isAnyEmpty(gameIds, codeTypeConfig)) {
+                return;
+            }
+            //类型配置
+            Map<String, String> codeTypeMap = JsonUtil.toMap(codeTypeConfig, Map.class, String.class);
+            //添加返回
+            Arrays.stream(gameIds.split(",")).distinct()
+                    .map(Long::valueOf)
+                    .forEach(gameId -> list.add(Tuples.of(Collections.singletonMap(gameId, gameMap.get(gameId)), codeTypeMap)));
+        });
+        return list;
+    }
+}
+
+
+
+

+ 142 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameGiftPackLinkLogServiceImpl.java

@@ -0,0 +1,142 @@
+package com.zanxiang.game.module.manage.service.impl;
+
+import com.alibaba.nacos.common.utils.CollectionUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.module.manage.pojo.dto.GameDTO;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackLinkLogListParam;
+import com.zanxiang.game.module.manage.pojo.vo.GameGiftPackLinkLogVO;
+import com.zanxiang.game.module.manage.service.IGameGiftPackLinkLogService;
+import com.zanxiang.game.module.manage.service.IGameGiftPackLinkService;
+import com.zanxiang.game.module.manage.service.IGameServerService;
+import com.zanxiang.game.module.manage.service.IGameService;
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackLink;
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackLinkLog;
+import com.zanxiang.game.module.mybatis.entity.GameServer;
+import com.zanxiang.game.module.mybatis.mapper.GameGiftPackLinkLogMapper;
+import com.zanxiang.module.util.bean.BeanUtil;
+import com.zanxiang.module.util.exception.BaseException;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.net.URLDecoder;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-22
+ * @description : 游戏礼包码链接访问日志
+ */
+@Slf4j
+@Service
+public class GameGiftPackLinkLogServiceImpl extends ServiceImpl<GameGiftPackLinkLogMapper, GameGiftPackLinkLog> implements IGameGiftPackLinkLogService {
+
+    @Autowired
+    private IGameService gameService;
+
+    @Autowired
+    private IGameServerService gameServerService;
+
+    @Autowired
+    private IGameGiftPackLinkService gameGiftPackLinkService;
+
+    @Override
+    public IPage<GameGiftPackLinkLogVO> list(GameGiftPackLinkLogListParam param) {
+        return page(param.toPage(), new QueryWrapper<GameGiftPackLinkLog>().lambda()
+                .eq(GameGiftPackLinkLog::getLinkId, param.getLinkId())
+                .ge(param.getCreateBeginTime() != null, GameGiftPackLinkLog::getCreateTime, param.getCreateBeginTime() == null ? null : LocalDateTime.of(param.getCreateBeginTime(), LocalTime.MIN))
+                .le(param.getCreateEndTime() != null, GameGiftPackLinkLog::getCreateTime, param.getCreateEndTime() == null ? null : LocalDateTime.of(param.getCreateEndTime(), LocalTime.MAX))
+                .orderByDesc(GameGiftPackLinkLog::getCreateTime)
+        ).convert(log -> BeanUtil.copy(log, GameGiftPackLinkLogVO.class));
+    }
+
+    @Override
+    public Map<String, String> getSourceGameServer(Long linkLogId) {
+        //查询访问日志
+        GameGiftPackLinkLog gameGiftPackLinkLog = super.getById(linkLogId);
+        assert gameGiftPackLinkLog != null : "参数错误, 链接访问日志信息不存在";
+        //查询游戏信息
+        GameDTO gameDTO = gameService.getById(gameGiftPackLinkLog.getGameId());
+        assert gameDTO != null : "参数错误, 游戏信息不存在";
+        //查询区服信息
+        return gameServerService.list(new LambdaQueryWrapper<GameServer>()
+                .eq(GameServer::getGameId, gameDTO.getSuperGameId())
+                .eq(GameServer::getIsSourceServer, Boolean.TRUE)
+        ).stream().collect(Collectors.toMap(GameServer::getServerId, GameServer::getServerName));
+    }
+
+    @Override
+    public Long linkVisitLogPush(String url) {
+        Map<String, String> urlParameter = this.getUrlParameter(url);
+        String gameId = urlParameter.get("gameId");
+        String codeType = urlParameter.get("codeType");
+        if (CollectionUtils.isMapEmpty(urlParameter) || StringUtils.isAnyEmpty(gameId, codeType)) {
+            throw new BaseException("非法链接请求, 链接参数解析异常");
+        }
+        //查询链接信息
+        GameGiftPackLink gameGiftPackLink = gameGiftPackLinkService.getOne(new LambdaQueryWrapper<GameGiftPackLink>()
+                .eq(GameGiftPackLink::getGameId, Long.valueOf(gameId))
+                .eq(GameGiftPackLink::getCodeType, codeType));
+        assert gameGiftPackLink != null : "非法链接请求, 链接信息不存在";
+        //构造
+        GameGiftPackLinkLog gameGiftPackLinkLog = this.transform(gameGiftPackLink, urlParameter);
+        super.save(gameGiftPackLinkLog);
+        return gameGiftPackLinkLog.getId();
+    }
+
+    private GameGiftPackLinkLog transform(GameGiftPackLink gameGiftPackLink, Map<String, String> urlParameter) {
+        return GameGiftPackLinkLog.builder()
+                .linkId(gameGiftPackLink.getId())
+                .linkUrl(urlParameter.get("linkUrl"))
+                .gameId(gameGiftPackLink.getGameId())
+                .corpId(urlParameter.get("corpId"))
+                .corpUserId(urlParameter.get("corpUserId"))
+                .externalUserId(urlParameter.get("externalUserId"))
+                .createTime(LocalDateTime.now())
+                .build();
+    }
+
+    private Map<String, String> getUrlParameter(String url) {
+        //参数判断
+        if (Strings.isBlank(url)) {
+            return Collections.emptyMap();
+        }
+        //没有拼接参数
+        if (url.indexOf('?') == -1) {
+            return Collections.singletonMap("url", url);
+        }
+        //参数map
+        Map<String, String> map = new HashMap<>(6);
+        map.put("linkUrl", url);
+        try {
+            final String charset = "utf-8";
+            url = URLDecoder.decode(url, charset);
+            //解析参数
+            final String contents = url.substring(url.indexOf('?') + 1);
+            String[] keyValues = contents.split("&");
+            for (String keyValue : keyValues) {
+                String key = keyValue.substring(0, keyValue.indexOf("="));
+                String value = keyValue.substring(keyValue.indexOf("=") + 1);
+                map.put(key, value);
+            }
+        } catch (Exception e) {
+            log.error("url : {}, 链接参数解析异常", url);
+            throw new BaseException("链接参数解析异常");
+        }
+        return map;
+    }
+}
+
+
+
+

+ 182 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/GameGiftPackLinkServiceImpl.java

@@ -0,0 +1,182 @@
+package com.zanxiang.game.module.manage.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.pojo.dto.GameDTO;
+import com.zanxiang.game.module.manage.pojo.dto.GameGiftPackConditionDTO;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackLinkAddParam;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackLinkListParam;
+import com.zanxiang.game.module.manage.pojo.params.GameGiftPackLinkUpdateParam;
+import com.zanxiang.game.module.manage.pojo.vo.GameGiftPackLinkVO;
+import com.zanxiang.game.module.manage.service.IGameGiftPackConfigService;
+import com.zanxiang.game.module.manage.service.IGameGiftPackLinkService;
+import com.zanxiang.game.module.manage.service.IGameService;
+import com.zanxiang.game.module.mybatis.entity.Game;
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackConfig;
+import com.zanxiang.game.module.mybatis.entity.GameGiftPackLink;
+import com.zanxiang.game.module.mybatis.mapper.GameGiftPackLinkMapper;
+import com.zanxiang.module.util.JsonUtil;
+import com.zanxiang.module.util.bean.BeanUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+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;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-22
+ * @description : 游戏礼包码链接
+ */
+@Slf4j
+@Service
+public class GameGiftPackLinkServiceImpl extends ServiceImpl<GameGiftPackLinkMapper, GameGiftPackLink> implements IGameGiftPackLinkService {
+
+    @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
+    private ISysUserRpc sysUserRpc;
+
+    @Autowired
+    private IGameService gameService;
+
+    @Autowired
+    private IGameGiftPackConfigService gameGiftPackConfigService;
+
+    @Override
+    public IPage<GameGiftPackLinkVO> list(GameGiftPackLinkListParam param) {
+        IPage<GameGiftPackLink> giftPackLinkIPage = page(param.toPage(), new QueryWrapper<GameGiftPackLink>().lambda()
+                .eq(param.getGameId() != null, GameGiftPackLink::getGameId, param.getGameId())
+                .eq(Strings.isNotBlank(param.getCodeType()), GameGiftPackLink::getCodeType, param.getCodeType())
+                .eq(Strings.isNotBlank(param.getCodeLink()), GameGiftPackLink::getCodeLink, param.getCodeLink())
+                .ge(param.getCreateBeginTime() != null, GameGiftPackLink::getCreateTime, param.getCreateBeginTime() == null ? null : LocalDateTime.of(param.getCreateBeginTime(), LocalTime.MIN))
+                .le(param.getCreateEndTime() != null, GameGiftPackLink::getCreateTime, param.getCreateEndTime() == null ? null : LocalDateTime.of(param.getCreateEndTime(), LocalTime.MAX))
+                .ge(param.getUpdateBeginTime() != null, GameGiftPackLink::getUpdateTime, param.getUpdateBeginTime() == null ? null : LocalDateTime.of(param.getUpdateBeginTime(), LocalTime.MIN))
+                .le(param.getUpdateEndTime() != null, GameGiftPackLink::getUpdateTime, param.getUpdateEndTime() == null ? null : LocalDateTime.of(param.getUpdateEndTime(), LocalTime.MAX))
+                .orderByDesc(GameGiftPackLink::getUpdateTime));
+        IPage<GameGiftPackLinkVO> result = new Page<>(giftPackLinkIPage.getCurrent(), giftPackLinkIPage.getSize(), giftPackLinkIPage.getTotal());
+        if (CollectionUtils.isNotEmpty(giftPackLinkIPage.getRecords())) {
+            result.setRecords(this.toVOBatch(giftPackLinkIPage.getRecords()));
+        }
+        return result;
+    }
+
+    private List<GameGiftPackLinkVO> toVOBatch(List<GameGiftPackLink> linkList) {
+        //游戏信息
+        List<Long> gameIdList = linkList.stream().map(GameGiftPackLink::getGameId).collect(Collectors.toList());
+        Map<Long, Game> gameMap = gameService.listByIds(gameIdList).stream()
+                .collect(Collectors.toMap(Game::getId, Function.identity()));
+        //查询配置
+        List<Long> supperGameIdList = gameMap.values().stream().map(Game::getSuperGameId).collect(Collectors.toList());
+        Map<Long, GameGiftPackConfig> configMap = gameGiftPackConfigService.list(new LambdaQueryWrapper<GameGiftPackConfig>()
+                .in(GameGiftPackConfig::getSuperGameId, supperGameIdList)
+        ).stream().collect(Collectors.toMap(GameGiftPackConfig::getId, Function.identity()));
+        //用户信息
+        List<Long> userIdList = linkList.stream()
+                .flatMap(link -> Stream.of(link.getCreateBy(), link.getUpdateBy()))
+                .filter(Objects::nonNull)
+                .distinct().collect(Collectors.toList());
+        Map<Long, String> userMap = sysUserRpc.getUserNameByIds(new ArrayList<>(userIdList)).getData();
+        //循环构造
+        return linkList.stream().map(link -> {
+            GameGiftPackLinkVO vo = BeanUtil.copy(link, GameGiftPackLinkVO.class);
+            vo.setConditionDTO(JsonUtil.toObj(link.getCodeCheck(), GameGiftPackConditionDTO.class));
+            vo.setCreateByName(userMap.get(link.getCreateBy()));
+            vo.setUpdateByName(userMap.get(link.getUpdateBy()));
+            Game game = gameMap.get(link.getGameId());
+            if (game != null) {
+                vo.setGameName(game.getName());
+            }
+            GameGiftPackConfig gameGiftPackConfig = configMap.get(link.getConfigId());
+            if (gameGiftPackConfig != null) {
+                vo.setCodeTypeName(this.codeTypeName(link.getCodeType(), gameGiftPackConfig.getCodeTypeConfig()));
+            }
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+    private String codeTypeName(String codeType, String codeTypeConfig) {
+        if (Strings.isBlank(codeTypeConfig) || Strings.isBlank(codeType)) {
+            return null;
+        }
+        Map<String, String> codeTypeMap = JsonUtil.toMap(codeTypeConfig, Map.class, String.class);
+        return codeTypeMap.get(codeType);
+    }
+
+    @Override
+    public boolean updateGiftPackLink(GameGiftPackLinkUpdateParam param) {
+        return super.update(new LambdaUpdateWrapper<GameGiftPackLink>()
+                .set(GameGiftPackLink::getCodeType, param.getCodeType())
+                .set(GameGiftPackLink::getCodeCheck, param.getConditionDTO() == null ? null : JsonUtil.toString(param.getConditionDTO()))
+                .set(GameGiftPackLink::getUpdateBy, SecurityUtil.getUserId())
+                .set(GameGiftPackLink::getUpdateTime, LocalDateTime.now())
+                .eq(GameGiftPackLink::getId, param.getId())
+        );
+    }
+
+    @Override
+    public boolean deleteById(Long id) {
+        return super.update(new LambdaUpdateWrapper<GameGiftPackLink>()
+                .set(GameGiftPackLink::getIsDelete, DeleteEnum.YES.getCode())
+                .set(GameGiftPackLink::getUpdateBy, SecurityUtil.getUserId())
+                .set(GameGiftPackLink::getUpdateTime, LocalDateTime.now())
+                .eq(GameGiftPackLink::getId, id)
+        );
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean addGiftPackLink(GameGiftPackLinkAddParam param) {
+        //判断该游戏该类型是否已经存在礼包链接
+        assert super.count(new LambdaQueryWrapper<GameGiftPackLink>()
+                .eq(GameGiftPackLink::getGameId, param.getGameId())
+                .eq(GameGiftPackLink::getCodeType, param.getCodeType())
+        ) <= 0 : "该游戏已经存在此类型礼包码链接, 请勿重复添加";
+        //查询超父游戏id
+        GameDTO gameDTO = gameService.getById(param.getGameId());
+        //游戏不可以为空
+        assert gameDTO != null : "参数错误, 游戏信息不存在";
+        //查询配置
+        GameGiftPackConfig giftPackConfig = gameGiftPackConfigService.getOne(new LambdaQueryWrapper<GameGiftPackConfig>()
+                .eq(GameGiftPackConfig::getSuperGameId, gameDTO.getSuperGameId()));
+        //礼包码配置不可为空
+        assert giftPackConfig.getGameIdList().contains(param.getGameId()) : "参数错误, 游戏礼包码配置不存在";
+        //链接域名必须存在
+        assert Strings.isNotBlank(giftPackConfig.getCodeLinkHost()) : "数据错误, 配置链接域名不可为空";
+        //礼包码链接
+        String codeLink = giftPackConfig.getCodeLinkHost() + "?gameId=" + param.getGameId() + "&codeType=" + param.getCodeType();
+        //保存且返回结果
+        return super.save(this.transform(giftPackConfig.getId(), codeLink, param));
+    }
+
+    private GameGiftPackLink transform(Long configId, String codeLink, GameGiftPackLinkAddParam param) {
+        return GameGiftPackLink.builder()
+                .configId(configId)
+                .gameId(param.getGameId())
+                .codeType(param.getCodeType())
+                .codeCheck(JsonUtil.toString(param.getConditionDTO()))
+                .codeLink(codeLink)
+                .createBy(SecurityUtil.getUserId())
+                .createTime(LocalDateTime.now())
+                .updateTime(LocalDateTime.now())
+                .build();
+    }
+}

+ 67 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/SmsServiceImpl.java

@@ -0,0 +1,67 @@
+package com.zanxiang.game.module.manage.service.impl;
+
+import cn.hutool.core.util.RandomUtil;
+import com.zanxiang.game.module.manage.constant.RedisKeyConstant;
+import com.zanxiang.game.module.manage.enums.ExpireTimeEnum;
+import com.zanxiang.game.module.manage.service.ISmsService;
+import com.zanxiang.game.module.manage.utils.RedisUtil;
+import com.zanxiang.module.sms.pojo.SendResult;
+import com.zanxiang.module.sms.service.impl.AliSmsService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+import java.util.regex.Pattern;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-11-04
+ * @description : 短信验证码
+ */
+@Slf4j
+@Service
+public class SmsServiceImpl implements ISmsService {
+
+    @Autowired
+    private RedisUtil<String> redisUtil;
+
+    @Autowired
+    private AliSmsService aliSmsService;
+
+    @Override
+    public boolean randomCodeSend(String phoneNumber) {
+        //判断是否已经发送
+        String smsKey = RedisKeyConstant.SMS_PHONE_KEY + "_" + phoneNumber;
+        assert Strings.isBlank(redisUtil.getCache(smsKey)) : "验证码已发送请稍后再试";
+        //发送验证码
+        String randomCode = RandomUtil.randomNumbers(6);
+        //发送短信验证码
+        this.smsSendApi(randomCode, phoneNumber);
+        //发送成功设置缓存, 时效5分钟
+        return redisUtil.setCache(smsKey, randomCode, ExpireTimeEnum.FIVE_MIN.getTime());
+    }
+
+    @Override
+    public boolean randomCodeCheck(String phoneNumber, String randomCode) {
+        String smsKey = RedisKeyConstant.SMS_PHONE_KEY + "_" + phoneNumber;
+        //获取缓存中的验证码
+        String cache = redisUtil.getCache(smsKey);
+        //验证码已过期
+        assert Strings.isNotBlank(cache) : "验证码已过期";
+        //验证码错误
+        assert Objects.equals(cache, randomCode) : "验证码错误";
+        //验证成功, 删除缓存
+        return redisUtil.deleteCache(smsKey);
+    }
+
+    private void smsSendApi(String content, String phoneNumber) {
+        //验证手机号
+        assert Pattern.matches("^1[3-9]\\d{9}$", phoneNumber) : "手机号格式错误";
+        //发送短信
+        SendResult sendResult = aliSmsService.sendCode(content, phoneNumber);
+        //发送结果判断
+        assert sendResult.isSuccess() : "验证码发送失败";
+    }
+}

+ 50 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserAgentLogServiceImpl.java

@@ -1,5 +1,6 @@
 package com.zanxiang.game.module.manage.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.game.module.manage.service.IUserAgentLogService;
 import com.zanxiang.game.module.mybatis.entity.Agent;
@@ -7,9 +8,13 @@ import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.mybatis.entity.UserAgentLog;
 import com.zanxiang.game.module.mybatis.mapper.UserAgentLogMapper;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.logging.log4j.util.Strings;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.Objects;
+
 /**
  * @author : lingfeng
  * @time : 2023-07-20
@@ -19,6 +24,51 @@ import org.springframework.stereotype.Service;
 @Service
 public class UserAgentLogServiceImpl extends ServiceImpl<UserAgentLogMapper, UserAgentLog> implements IUserAgentLogService {
 
+    @Override
+    public void userAgentLogUpdate(boolean isRunUpdate) {
+        List<UserAgentLog> errorList = super.list(new LambdaQueryWrapper<UserAgentLog>()
+                .isNotNull(UserAgentLog::getOldAgentId)
+                .isNotNull(UserAgentLog::getNewAgentId)
+                .apply("old_agent_id=new_agent_id"));
+        if (CollectionUtils.isEmpty(errorList)) {
+            log.error("查询到可修正的数据列表为空!!!");
+            return;
+        }
+        log.error("查询到数据 count : {}", errorList.size());
+        if (!isRunUpdate) {
+            return;
+        }
+        int count = 0;
+        for (UserAgentLog userAgentLog : errorList) {
+            this.agentLogUpdate(userAgentLog);
+            count++;
+            log.error("第 count : {} 条数据, id : {} 修正", count, userAgentLog.getId());
+        }
+        log.error("=========== 全部修正完成 ===========");
+    }
+
+    private void agentLogUpdate(UserAgentLog userAgentLog) {
+        //不是错误数据
+        if (!Objects.equals(userAgentLog.getOldAgentId(), userAgentLog.getNewAgentId())) {
+            return;
+        }
+        //根据 userId 和 createTime 查询上一条数据
+        UserAgentLog beforeLog = super.getOne(new LambdaQueryWrapper<UserAgentLog>()
+                .eq(UserAgentLog::getUserId, userAgentLog.getUserId())
+                .lt(UserAgentLog::getCreateTime, userAgentLog.getCreateTime())
+                .orderByDesc(UserAgentLog::getCreateTime)
+                .last("limit 1"));
+        //未查询到上一条记录, 不做修正
+        if (beforeLog == null) {
+            log.error("查询上一条记录结果为空-------!!!!!!, logId : {}", userAgentLog.getId());
+            return;
+        }
+        //数据修正
+        userAgentLog.setOldAgentId(beforeLog.getNewAgentId());
+        userAgentLog.setOldChannel(beforeLog.getNewChannel());
+        super.updateById(userAgentLog);
+    }
+
     @Override
     public boolean regAgentLog(User user) {
         if (Agent.DEFAULT_AGENT.equals(user.getAgentId()) || Strings.isBlank(user.getChannel())) {

+ 71 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameGiftPackCode.java

@@ -0,0 +1,71 @@
+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 : 2022-06-06
+ * @description : 游戏礼包码
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Builder
+@TableName("t_game_gift_pack_code")
+public class GameGiftPackCode implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 游戏id
+     */
+    private Long gameId;
+
+    /**
+     * 链接id
+     */
+    private Long linkId;
+
+    /**
+     * 礼包码
+     */
+    private String code;
+
+    /**
+     * 是否可用
+     */
+    private Boolean enabled;
+
+    /**
+     * 创建者
+     */
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}

+ 91 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameGiftPackCodeLog.java

@@ -0,0 +1,91 @@
+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 : 2022-06-06
+ * @description : 游戏礼包码领取日志
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Builder
+@TableName("t_game_gift_pack_code_log")
+public class GameGiftPackCodeLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 礼包码
+     */
+    private String code;
+
+    /**
+     * 链接id
+     */
+    private Long linkId;
+
+    /**
+     * 游戏id
+     */
+    private Long gameId;
+
+    /**
+     * 玩家id
+     */
+    private Integer userId;
+
+    /**
+     * 角色id
+     */
+    private String roleId;
+
+    /**
+     * 角色名称
+     */
+    private String roleName;
+
+    /**
+     * 企业id
+     */
+    private String corpId;
+
+    /**
+     * 客服号id
+     */
+    private String corpUserId;
+
+    /**
+     * 企微用户id
+     */
+    private String externalUserId;
+
+    /**
+     * 关联访问记录id
+     */
+    private Long linkLogId;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}

+ 75 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameGiftPackConfig.java

@@ -0,0 +1,75 @@
+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 org.apache.logging.log4j.util.Strings;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-06
+ * @description : CP表
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Builder
+@TableName("t_game_gift_pack_config")
+public class GameGiftPackConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 超父游戏id
+     */
+    private Long superGameId;
+
+    /**
+     * 子游戏列表
+     */
+    private String gameIds;
+
+    /**
+     * 礼包码类型
+     */
+    private String codeTypeConfig;
+
+    /**
+     * 礼包链接域名
+     */
+    private String codeLinkHost;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    public List<Long> getGameIdList() {
+        if (Strings.isBlank(this.gameIds)) {
+            return Collections.emptyList();
+        }
+        return Arrays.stream(this.gameIds.split(","))
+                .map(Long::valueOf)
+                .collect(Collectors.toList());
+    }
+}

+ 81 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameGiftPackLink.java

@@ -0,0 +1,81 @@
+package com.zanxiang.game.module.mybatis.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.*;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-06
+ * @description : CP表
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Builder
+@TableName("t_game_gift_pack_link")
+public class GameGiftPackLink implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 配置id
+     */
+    private Long configId;
+
+    /**
+     * 游戏id
+     */
+    private Long gameId;
+
+    /**
+     * 礼包码类型
+     */
+    private String codeType;
+
+    /**
+     * 礼包条件
+     */
+    @TableField
+    private String codeCheck;
+
+    /**
+     * 礼包链接
+     */
+    private String codeLink;
+
+    /**
+     * 1 删除  0 正常
+     */
+    @TableLogic
+    private Integer isDelete;
+
+    /**
+     * 创建者
+     */
+    private Long createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}

+ 76 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/entity/GameGiftPackLinkLog.java

@@ -0,0 +1,76 @@
+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 : 2022-06-06
+ * @description : CP表
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Builder
+@TableName("t_game_gift_pack_link_log")
+public class GameGiftPackLinkLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 链接id
+     */
+    private Long linkId;
+
+    /**
+     * 访问链接地址
+     */
+    private String linkUrl;
+
+    /**
+     * 游戏id
+     */
+    private Long gameId;
+
+    /**
+     * 企业id
+     */
+    private String corpId;
+
+    /**
+     * 客服号id
+     */
+    private String corpUserId;
+
+    /**
+     * 企微用户id
+     */
+    private String externalUserId;
+
+    /**
+     * 关联code领取记录id
+     */
+    private Long codeLogId;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}

+ 12 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameGiftPackCodeLogMapper.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.GameGiftPackCodeLog;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-06
+ * @description : ${description}
+ */
+public interface GameGiftPackCodeLogMapper extends BaseMapper<GameGiftPackCodeLog> {
+}

+ 12 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameGiftPackCodeMapper.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.GameGiftPackCode;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-06
+ * @description : ${description}
+ */
+public interface GameGiftPackCodeMapper extends BaseMapper<GameGiftPackCode> {
+}

+ 12 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameGiftPackConfigMapper.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.GameGiftPackConfig;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-06
+ * @description : ${description}
+ */
+public interface GameGiftPackConfigMapper extends BaseMapper<GameGiftPackConfig> {
+}

+ 12 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameGiftPackLinkLogMapper.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.GameGiftPackLinkLog;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-06
+ * @description : ${description}
+ */
+public interface GameGiftPackLinkLogMapper extends BaseMapper<GameGiftPackLinkLog> {
+}

+ 12 - 0
game-module/game-module-mybatis/src/main/java/com/zanxiang/game/module/mybatis/mapper/GameGiftPackLinkMapper.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.GameGiftPackLink;
+
+/**
+ * @author : lingfeng
+ * @time : 2022-06-06
+ * @description : ${description}
+ */
+public interface GameGiftPackLinkMapper extends BaseMapper<GameGiftPackLink> {
+}

+ 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服务启动成功 <新游戏梦回解决订单中CP订单id不正确的问题> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <解决玩家被重复买量, AgentLog数据错误的问题> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 5 - 4
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IUserAgentLogService.java

@@ -3,6 +3,7 @@ package com.zanxiang.game.module.sdk.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.mybatis.entity.UserAgentLog;
+import reactor.util.function.Tuple3;
 
 /**
  * @author : lingfeng
@@ -22,10 +23,10 @@ public interface IUserAgentLogService extends IService<UserAgentLog> {
     /**
      * 代理更新日志
      *
-     * @param user       用户
-     * @param newAgentId 新代理id
-     * @param newChannel 新渠道
+     * @param oldAgentChannel 用户信息
+     * @param newAgentId      新代理id
+     * @param newChannel      新渠道
      * @return boolean
      */
-    boolean agentUpdateLog(User user, Long newAgentId, String newChannel);
+    boolean agentUpdateLog(Tuple3<Long, Long, String> oldAgentChannel, Long newAgentId, String newChannel);
 }

+ 3 - 2
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/AgentServiceImpl.java

@@ -8,7 +8,6 @@ import com.github.sd4324530.jtuple.Tuple2;
 import com.zanxiang.game.back.base.ServerInfo;
 import com.zanxiang.game.back.base.pojo.dto.TencentAppApiUserAgentQueryRpcDTO;
 import com.zanxiang.game.back.base.rpc.ITencentAppApiBackRpc;
-import com.zanxiang.game.back.base.rpc.ITencentUserActionBackRpc;
 import com.zanxiang.game.module.base.pojo.enums.GameCategoryEnum;
 import com.zanxiang.game.module.mybatis.entity.*;
 import com.zanxiang.game.module.mybatis.mapper.AgentMapper;
@@ -96,6 +95,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
             if (agent == null) {
                 return;
             }
+            //保存旧的渠道信息
+            Tuple3<Long, Long, String> oldAgentChannel = Tuples.of(user.getId(), user.getAgentId(), user.getChannel());
             //更新用户信息
             user.setAgentId(agent.getId());
             user.setUpdateTime(LocalDateTime.now());
@@ -107,7 +108,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
             }
             userService.updateById(user);
             //添加渠道变更记录
-            userAgentLogService.agentUpdateLog(user, agent.getId(), channel);
+            userAgentLogService.agentUpdateLog(oldAgentChannel, agent.getId(), channel);
             //回传用户信息
             callBackService.userCallBack(user, tuple3.getT2());
             //注册信息埋点数据发送到卡夫卡

+ 3 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/CpPushDataServiceImpl.java

@@ -554,13 +554,15 @@ public class CpPushDataServiceImpl implements ICpPushDataService {
         if (agent == null) {
             return Collections.emptyMap();
         }
+        //保存旧的渠道信息
+        Tuple3<Long, Long, String> oldAgentChannel = Tuples.of(user.getId(), user.getAgentId(), user.getChannel());
         //更新用户信息
         user.setAgentId(agent.getId());
         user.setChannel(userData.getChannel());
         user.setUpdateTime(LocalDateTime.now());
         userService.updateById(user);
         //添加渠道变更记录
-        userAgentLogService.agentUpdateLog(user, agent.getId(), userData.getChannel());
+        userAgentLogService.agentUpdateLog(oldAgentChannel, agent.getId(), userData.getChannel());
         //回传用户信息
         callBackService.userCallBack(user, tuple3.getT2());
         //渠道变更信息埋点数据发送到卡夫卡

+ 10 - 8
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserAgentLogServiceImpl.java

@@ -6,9 +6,11 @@ import com.zanxiang.game.module.mybatis.entity.User;
 import com.zanxiang.game.module.mybatis.entity.UserAgentLog;
 import com.zanxiang.game.module.mybatis.mapper.UserAgentLogMapper;
 import com.zanxiang.game.module.sdk.service.IUserAgentLogService;
+import com.zanxiang.module.util.JsonUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.logging.log4j.util.Strings;
 import org.springframework.stereotype.Service;
+import reactor.util.function.Tuple3;
 
 import java.time.LocalDateTime;
 
@@ -35,15 +37,15 @@ public class UserAgentLogServiceImpl extends ServiceImpl<UserAgentLogMapper, Use
     }
 
     @Override
-    public boolean agentUpdateLog(User user, Long newAgentId, String newChannel) {
+    public boolean agentUpdateLog(Tuple3<Long, Long, String> oldAgentChannel, Long newAgentId, String newChannel) {
         if (newAgentId == null || Strings.isBlank(newChannel)) {
             return Boolean.FALSE;
         }
         try {
-            return super.save(this.transform(user, newAgentId, newChannel));
+            return super.save(this.transform(oldAgentChannel, newAgentId, newChannel));
         } catch (Exception e) {
-            log.error("用户渠道更新记录保存异常, userId : {}, newAgentId : {}, newChannel : {}, e : {}",
-                    user.getId(), newAgentId, newChannel, e.getMessage());
+            log.error("用户渠道更新记录保存异常, oldAgentChannel : {}, newAgentId : {}, newChannel : {}, e : {}",
+                    JsonUtil.toString(oldAgentChannel), newAgentId, newChannel, e.getMessage());
         }
         return Boolean.FALSE;
     }
@@ -58,11 +60,11 @@ public class UserAgentLogServiceImpl extends ServiceImpl<UserAgentLogMapper, Use
                 .build();
     }
 
-    private UserAgentLog transform(User user, Long newAgentId, String newChannel) {
+    private UserAgentLog transform(Tuple3<Long, Long, String> oldAgentChannel, Long newAgentId, String newChannel) {
         return UserAgentLog.builder()
-                .userId(user.getId())
-                .oldAgentId(Agent.DEFAULT_AGENT.equals(user.getAgentId()) ? null : user.getAgentId())
-                .oldChannel(Agent.DEFAULT_AGENT.equals(user.getAgentId()) ? null : user.getChannel())
+                .userId(oldAgentChannel.getT1())
+                .oldAgentId(Agent.DEFAULT_AGENT.equals(oldAgentChannel.getT2()) ? null : oldAgentChannel.getT2())
+                .oldChannel(Agent.DEFAULT_AGENT.equals(oldAgentChannel.getT2()) ? null : oldAgentChannel.getT3())
                 .newAgentId(newAgentId)
                 .newChannel(newChannel)
                 .createTime(LocalDateTime.now())