Преглед на файлове

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

zhimo преди 1 година
родител
ревизия
1d13fa94d7
променени са 30 файла, в които са добавени 2311 реда и са изтрити 172 реда
  1. 9 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/ActiveDataDayDTO.java
  2. 8 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/ActiveDataTotalDTO.java
  3. 6 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GameDataDayDTO.java
  4. 6 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GameDataDayTotalDTO.java
  5. 8 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GameDataFirstNewUserAgainDTO.java
  6. 8 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GameDataFirstNewUserAgainTotalDTO.java
  7. 9 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/LtvDataDTO.java
  8. 8 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/LtvDataTotalDTO.java
  9. 779 0
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsGameDayParent.java
  10. 1 1
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AdsOrderDetailService.java
  11. 955 143
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java
  12. 5 5
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/IActiveDataServiceImpl.java
  13. 16 8
      game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java
  14. 18 0
      game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/rpc/IWxApiServiceRpc.java
  15. 2 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java
  16. 18 1
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/rpc/impl/PayBoxRpcImpl.java
  17. 23 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IAppletCheckService.java
  18. 13 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IListenCallService.java
  19. 216 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/AppletCheckServiceImpl.java
  20. 18 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/ListenCallServiceImpl.java
  21. 4 3
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserServiceImpl.java
  22. 50 0
      game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/task/PayApplicationTask.java
  23. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java
  24. 10 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/LoginController.java
  25. 28 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/vo/CpTokenCheckVO.java
  26. 23 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/rpc/impl/WxApiServiceRpcImpl.java
  27. 12 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IUserTokenService.java
  28. 53 0
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserTokenServiceImpl.java
  29. 3 3
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/AliPayService.java
  30. 1 1
      game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/WxPayService.java

+ 9 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/ActiveDataDayDTO.java

@@ -8,6 +8,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.time.LocalDate;
+import java.util.List;
 
 /**
  * @author tianhua
@@ -24,7 +25,7 @@ public class ActiveDataDayDTO extends BasePage {
      * 游戏ID
      */
     @ApiModelProperty(notes = "游戏ID")
-    private Long gameId;
+    private List<Long> gameId;
 
     /**
      * 推广游戏应用类别
@@ -75,4 +76,11 @@ public class ActiveDataDayDTO extends BasePage {
      */
     @ApiModelProperty(notes = "排序方式:升序asc;降序desc")
     private String sortType;
+
+    /**
+     * 游戏维度:1-子游戏维度;2-父游戏维度;3-超父游戏维度
+     */
+    @ApiModelProperty(notes = "游戏维度:1-子游戏维度;2-父游戏维度")
+    private Long gameDimension;
+
 }

+ 8 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/ActiveDataTotalDTO.java

@@ -7,6 +7,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.time.LocalDate;
+import java.util.List;
 
 /**
  * @author tianhua
@@ -23,7 +24,7 @@ public class ActiveDataTotalDTO {
      * 游戏ID
      */
     @ApiModelProperty(notes = "游戏ID")
-    private Long gameId;
+    private List<Long> gameId;
 
     /**
      * 推广游戏应用类别
@@ -63,4 +64,10 @@ public class ActiveDataTotalDTO {
             """)
     private String activeTypes;
 
+    /**
+     * 游戏维度:1-子游戏维度;2-父游戏维度;3-超父游戏维度
+     */
+    @ApiModelProperty(notes = "游戏维度:1-子游戏维度;2-父游戏维度")
+    private Long gameDimension;
+
 }

+ 6 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GameDataDayDTO.java

@@ -75,4 +75,10 @@ public class GameDataDayDTO extends BasePage {
     @ApiModelProperty(notes = "排序方式:升序asc;降序desc")
     private String sortType;
 
+    /**
+     * 游戏维度:1-子游戏维度;2-父游戏维度;3-超父游戏维度
+     */
+    @ApiModelProperty(notes = "游戏维度:1-子游戏维度;2-父游戏维度;3-超父游戏维度")
+    private Long gameDimension;
+
 }

+ 6 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GameDataDayTotalDTO.java

@@ -62,4 +62,10 @@ public class GameDataDayTotalDTO {
     @ApiModelProperty(notes = "选择展示数据种类:buy -> 买量 ; nature -> 自然量 ; total -> 总量")
     private String tableTypes;
 
+    /**
+     * 游戏维度:1-子游戏维度;2-父游戏维度;3-超父游戏维度
+     */
+    @ApiModelProperty(notes = "游戏维度:1-子游戏维度;2-父游戏维度;3-超父游戏维度")
+    private Long gameDimension;
+
 }

+ 8 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GameDataFirstNewUserAgainDTO.java

@@ -8,6 +8,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.time.LocalDate;
+import java.util.List;
 
 /**
  * @author tianhua
@@ -24,7 +25,7 @@ public class GameDataFirstNewUserAgainDTO extends BasePage {
      * 游戏ID
      */
     @ApiModelProperty(notes = "游戏ID")
-    private Long gameId;
+    private List<Long> gameId;
 
     /**
      * 推广游戏应用类别
@@ -68,4 +69,10 @@ public class GameDataFirstNewUserAgainDTO extends BasePage {
     @ApiModelProperty(notes = "排序方式:升序asc;降序desc")
     private String sortType;
 
+    /**
+     * 游戏维度:1-子游戏维度;2-父游戏维度;3-超父游戏维度
+     */
+    @ApiModelProperty(notes = "游戏维度:1-子游戏维度;2-父游戏维度")
+    private Long gameDimension;
+
 }

+ 8 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/GameDataFirstNewUserAgainTotalDTO.java

@@ -7,6 +7,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.time.LocalDate;
+import java.util.List;
 
 /**
  * @author tianhua
@@ -23,7 +24,7 @@ public class GameDataFirstNewUserAgainTotalDTO {
      * 游戏ID
      */
     @ApiModelProperty(notes = "游戏ID")
-    private Long gameId;
+    private List<Long> gameId;
 
     /**
      * 推广游戏应用类别
@@ -55,4 +56,10 @@ public class GameDataFirstNewUserAgainTotalDTO {
     @ApiModelProperty(notes = "选择展示数据种类:buy -> 买量 ; nature -> 自然量 ; total -> 总量")
     private String tableTypes;
 
+    /**
+     * 游戏维度:1-子游戏维度;2-父游戏维度;3-超父游戏维度
+     */
+    @ApiModelProperty(notes = "游戏维度:1-子游戏维度;2-父游戏维度")
+    private Long gameDimension;
+
 }

+ 9 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/LtvDataDTO.java

@@ -8,6 +8,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.time.LocalDate;
+import java.util.List;
 
 /**
  * @author tianhua
@@ -24,7 +25,7 @@ public class LtvDataDTO extends BasePage {
      * 游戏ID
      */
     @ApiModelProperty(notes = "游戏ID")
-    private Long gameId;
+    private List<Long> gameId;
 
     /**
      * 推广游戏应用类别
@@ -67,4 +68,11 @@ public class LtvDataDTO extends BasePage {
      */
     @ApiModelProperty(notes = "排序方式:升序asc;降序desc")
     private String sortType;
+
+    /**
+     * 游戏维度:1-子游戏维度;2-父游戏维度;3-超父游戏维度
+     */
+    @ApiModelProperty(notes = "游戏维度:1-子游戏维度;2-父游戏维度")
+    private Long gameDimension;
+
 }

+ 8 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/dto/LtvDataTotalDTO.java

@@ -7,6 +7,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.time.LocalDate;
+import java.util.List;
 
 /**
  * @author tianhua
@@ -23,7 +24,7 @@ public class LtvDataTotalDTO{
      * 游戏ID
      */
     @ApiModelProperty(notes = "游戏ID")
-    private Long gameId;
+    private List<Long> gameId;
 
     /**
      * 推广游戏应用类别
@@ -55,4 +56,10 @@ public class LtvDataTotalDTO{
     @ApiModelProperty(notes = "选择展示数据种类:buy -> 买量 ; nature -> 自然量 ; total -> 总量")
     private String tableTypes;
 
+    /**
+     * 游戏维度:1-子游戏维度;2-父游戏维度;3-超父游戏维度
+     */
+    @ApiModelProperty(notes = "游戏维度:1-子游戏维度;2-父游戏维度")
+    private Long gameDimension;
+
 }

+ 779 - 0
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/pojo/entity/AdsGameDayParent.java

@@ -0,0 +1,779 @@
+package com.zanxiang.game.data.serve.pojo.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.nutz.dao.entity.annotation.Column;
+import org.nutz.dao.entity.annotation.PK;
+import org.nutz.dao.entity.annotation.Table;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 游戏每日数据-父游戏维度
+ * </p>
+ *
+ * @author 
+ * @since 2023-06-30
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+@Table(AdsGameDayParent.TABLE_NAME)
+@PK({"dt", "parentGameId", "parentGameName", "parentGameNameClassify", "sourceSystem"})
+public class AdsGameDayParent implements Serializable {
+    private static final long serialVersionUID = 1L;
+    public static final String TABLE_NAME = "game_ads_parent.ads_game_day_parent";
+
+    /**
+     * 日期
+     */
+    private LocalDate dt;
+
+    /**
+     * 游戏ID
+     */
+    private Long parentGameId;
+
+    /**
+     * 游戏名称
+     */
+    private String parentGameName;
+
+    /**
+     * 游戏类别
+     */
+    private Long parentGameNameClassify;
+
+    /**
+     * SDK来源
+     */
+    private String sourceSystem;
+
+    /**
+     * CP名称
+     */
+    @Column
+    private String cpName;
+
+    /**
+     * 消耗
+     */
+    @Column
+    private BigDecimal cost;
+
+    /**
+     * 注册人数(总)
+     */
+    @Column
+    private Long regNum;
+
+    /**
+     * 新增付费次数(总)
+     */
+    @Column
+    private Long firstNewUserAmountCount;
+
+    /**
+     * 新增付费人数(总)
+     */
+    @Column
+    private Long firstNewUserAmountNum;
+
+    /**
+     * 新增付费金额(总)
+     */
+    @Column
+    private BigDecimal firstNewUserAmount;
+
+    /**
+     * 老用户充值次数(总)
+     */
+    @Column
+    private Long oldUserCount;
+
+    /**
+     * 老用户充值人数(总)
+     */
+    @Column
+    private Long oldUserNum;
+
+    /**
+     * 老用户充值金额(总)
+     */
+    @Column
+    private BigDecimal oldUserAmount;
+
+    /**
+     * 账面充值次数(总)
+     */
+    @Column
+    private Long amountCount;
+
+    /**
+     * 账面充值人数(总)
+     */
+    @Column
+    private Long amountNum;
+
+    /**
+     * 账面充值金额(总)
+     */
+    @Column
+    private BigDecimal amount;
+
+    /**
+     * 至今付费次数(总)
+     */
+    @Column
+    private Long newUserTotalAmountCount;
+
+    /**
+     * 至今付费人数(总)
+     */
+    @Column
+    private Long newUserTotalAmountNum;
+
+    /**
+     * 至今付费金额(总)
+     */
+    @Column
+    private BigDecimal newUserTotalAmount;
+
+    /**
+     * 首日ROI(总)
+     */
+    @Column
+    private BigDecimal firstRoi;
+
+    /**
+     * 首日付费率(总)
+     */
+    @Column
+    private BigDecimal firstAmountRate;
+
+    /**
+     * 当天付费率(总)
+     */
+    @Column
+    private BigDecimal todayAmountRate;
+
+    /**
+     * 新用户付费比(总)
+     */
+    @Column
+    private BigDecimal newUserRate;
+
+    /**
+     * 首日客单价(总)
+     */
+    @Column
+    private BigDecimal firstAvgAmount;
+
+    /**
+     * 当天客单价(总)
+     */
+    @Column
+    private BigDecimal todayAvgAmount;
+
+    /**
+     * 账面客单价(总)
+     */
+    @Column
+    private BigDecimal avgAmount;
+
+    /**
+     * 复充率(总)
+     */
+    @Column
+    private BigDecimal userAgainRate;
+
+    /**
+     * 复充人数(总)
+     */
+    @Column
+    private Long regOrderUserAgain;
+
+    /**
+     * 新增注册ARPU(总)
+     */
+    @Column
+    private BigDecimal regUserArpu;
+
+    /**
+     * 首日付费ARPU(总)
+     */
+    @Column
+    private BigDecimal firstAmountArpu;
+
+    /**
+     * 当天付费ARPU(总)
+     */
+    @Column
+    private BigDecimal todayAmountArpu;
+
+    /**
+     * 账面ARPU(总)
+     */
+    @Column
+    private BigDecimal amountArpu;
+
+    /**
+     * 付费趋势第一天总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountD1;
+
+    /**
+     * 付费趋势第2天总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountD2;
+
+    /**
+     * 付费趋势第三天总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountD3;
+
+    /**
+     * 付费趋势第4天总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountD4;
+
+    /**
+     * 付费趋势第五天总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountD5;
+
+    /**
+     * 付费趋势第6天总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountD6;
+
+    /**
+     * 付费趋势第七天总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountD7;
+
+    /**
+     * 付费趋势第8天总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountD8;
+
+    /**
+     * 付费趋势第9天总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountD9;
+
+    /**
+     * 付费趋势第10天总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountD10;
+
+    /**
+     * 付费趋势第11天总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountD11;
+
+    /**
+     * 付费趋势第12天总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountD12;
+
+    /**
+     * 付费趋势第十五天总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountD15;
+
+    /**
+     * 付费趋势第一月总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountM1;
+
+    /**
+     * 付费趋势第二月总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountM2;
+
+    /**
+     * 付费趋势第三月总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountM3;
+
+    /**
+     * 付费趋势第六月总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountM6;
+
+    /**
+     * 付费趋势总:金额/人数/增/回/倍(总量)
+     */
+    @Column
+    private String amountSum;
+
+    /**
+     * 注册人数(买量)
+     */
+    @Column
+    private Long buyRegNum;
+
+    /**
+     * 新增付费次数(买量)
+     */
+    @Column
+    private Long buyFirstNewUserAmountCount;
+
+    /**
+     * 新增付费人数(买量)
+     */
+    @Column
+    private Long buyFirstNewUserAmountNum;
+
+    /**
+     * 新增付费金额(买量)
+     */
+    @Column
+    private BigDecimal buyFirstNewUserAmount;
+
+    /**
+     * 老用户充值次数(买量)
+     */
+    @Column
+    private Long buyOldUserCount;
+
+    /**
+     * 老用户充值人数(买量)
+     */
+    @Column
+    private Long buyOldUserNum;
+
+    /**
+     * 老用户充值金额(买量)
+     */
+    @Column
+    private BigDecimal buyOldUserAmount;
+
+    /**
+     * 账面充值次数(买量)
+     */
+    @Column
+    private Long buyAmountCount;
+
+    /**
+     * 账面充值人数(买量)
+     */
+    @Column
+    private Long buyAmountNum;
+
+    /**
+     * 账面充值金额(买量)
+     */
+    @Column
+    private BigDecimal buyAmount;
+
+    /**
+     * 至今付费次数(买量)
+     */
+    @Column
+    private Long buyNewUserTotalAmountCount;
+
+    /**
+     * 至今付费人数(买量)
+     */
+    @Column
+    private Long buyNewUserTotalAmountNum;
+
+    /**
+     * 至今付费金额(买量)
+     */
+    @Column
+    private BigDecimal buyNewUserTotalAmount;
+
+    /**
+     * 首日ROI(买量)
+     */
+    @Column
+    private BigDecimal buyFirstRoi;
+
+    /**
+     * 首日付费率(买量)
+     */
+    @Column
+    private BigDecimal buyFirstAmountRate;
+
+    /**
+     * 当天付费率(买量)
+     */
+    @Column
+    private BigDecimal buyTodayAmountRate;
+
+    /**
+     * 新用户付费比(买量)
+     */
+    @Column
+    private BigDecimal buyNewUserRate;
+
+    /**
+     * 首日客单价(买量)
+     */
+    @Column
+    private BigDecimal buyFirstAvgAmount;
+
+    /**
+     * 当天客单价(买量)
+     */
+    @Column
+    private BigDecimal buyTodayAvgAmount;
+
+    /**
+     * 账面客单价(买量)
+     */
+    @Column
+    private BigDecimal buyAvgAmount;
+
+    /**
+     * 复充率(买量)
+     */
+    @Column
+    private BigDecimal buyUserAgainRate;
+
+    /**
+     * 复充人数(买量)
+     */
+    @Column
+    private Long buyRegOrderUserAgain;
+
+    /**
+     * 新增注册ARPU(买量)
+     */
+    @Column
+    private BigDecimal buyRegUserArpu;
+
+    /**
+     * 首日付费ARPU(买量)
+     */
+    @Column
+    private BigDecimal buyFirstAmountArpu;
+
+    /**
+     * 当天付费ARPU(买量)
+     */
+    @Column
+    private BigDecimal buyTodayAmountArpu;
+
+    /**
+     * 账面ARPU(买量)
+     */
+    @Column
+    private BigDecimal buyAmountArpu;
+
+    /**
+     * 付费趋势第一天总:金额/人数/增/回/倍(买量)
+     */
+    @Column
+    private String buyAmountD1;
+
+    /**
+     * 付费趋势第三天总:金额/人数/增/回/倍(买量)
+     */
+    @Column
+    private String buyAmountD3;
+
+    /**
+     * 付费趋势第五天总:金额/人数/增/回/倍(买量)
+     */
+    @Column
+    private String buyAmountD5;
+
+    /**
+     * 付费趋势第七天总:金额/人数/增/回/倍(买量)
+     */
+    @Column
+    private String buyAmountD7;
+
+    /**
+     * 付费趋势第十五天总:金额/人数/增/回/倍(买量)
+     */
+    @Column
+    private String buyAmountD15;
+
+    /**
+     * 付费趋势第一月总:金额/人数/增/回/倍(买量)
+     */
+    @Column
+    private String buyAmountM1;
+
+    /**
+     * 付费趋势第二月总:金额/人数/增/回/倍(买量)
+     */
+    @Column
+    private String buyAmountM2;
+
+    /**
+     * 付费趋势第三月总:金额/人数/增/回/倍(买量)
+     */
+    @Column
+    private String buyAmountM3;
+
+    /**
+     * 付费趋势第六月总:金额/人数/增/回/倍(买量)
+     */
+    @Column
+    private String buyAmountM6;
+
+    /**
+     * 付费趋势总:金额/人数/增/回/倍(买量)
+     */
+    @Column
+    private String buyAmountSum;
+
+    /**
+     * 注册人数(自然量)
+     */
+    @Column
+    private Long natureRegNum;
+
+    /**
+     * 新增付费次数(自然量)
+     */
+    @Column
+    private Long natureFirstNewUserAmountCount;
+
+    /**
+     * 新增付费人数(自然量)
+     */
+    @Column
+    private Long natureFirstNewUserAmountNum;
+
+    /**
+     * 新增付费金额(自然量)
+     */
+    @Column
+    private BigDecimal natureFirstNewUserAmount;
+
+    /**
+     * 老用户充值次数(自然量)
+     */
+    @Column
+    private Long natureOldUserCount;
+
+    /**
+     * 老用户充值人数(自然量)
+     */
+    @Column
+    private Long natureOldUserNum;
+
+    /**
+     * 老用户充值金额(自然量)
+     */
+    @Column
+    private BigDecimal natureOldUserAmount;
+
+    /**
+     * 账面充值次数(自然量)
+     */
+    @Column
+    private Long natureAmountCount;
+
+    /**
+     * 账面充值人数(自然量)
+     */
+    @Column
+    private Long natureAmountNum;
+
+    /**
+     * 账面充值金额(自然量)
+     */
+    @Column
+    private BigDecimal natureAmount;
+
+    /**
+     * 至今付费次数(自然量)
+     */
+    @Column
+    private Long natureNewUserTotalAmountCount;
+
+    /**
+     * 至今付费人数(自然量)
+     */
+    @Column
+    private Long natureNewUserTotalAmountNum;
+
+    /**
+     * 至今付费金额(自然量)
+     */
+    @Column
+    private BigDecimal natureNewUserTotalAmount;
+
+    /**
+     * 首日ROI(自然量)
+     */
+    @Column
+    private BigDecimal natureFirstRoi;
+
+    /**
+     * 首日付费率(自然量)
+     */
+    @Column
+    private BigDecimal natureFirstAmountRate;
+
+    /**
+     * 当天付费率(自然量)
+     */
+    @Column
+    private BigDecimal natureTodayAmountRate;
+
+    /**
+     * 新用户付费比(自然量)
+     */
+    @Column
+    private BigDecimal natureNewUserRate;
+
+    /**
+     * 首日客单价(自然量)
+     */
+    @Column
+    private BigDecimal natureFirstAvgAmount;
+
+    /**
+     * 当天客单价(自然量)
+     */
+    @Column
+    private BigDecimal natureTodayAvgAmount;
+
+    /**
+     * 账面客单价(自然量)
+     */
+    @Column
+    private BigDecimal natureAvgAmount;
+
+    /**
+     * 复充率(自然量)
+     */
+    @Column
+    private BigDecimal natureUserAgainRate;
+
+    /**
+     * 复充人数(自然量)
+     */
+    @Column
+    private Long natureRegOrderUserAgain;
+
+    /**
+     * 新增注册ARPU(自然量)
+     */
+    @Column
+    private BigDecimal natureRegUserArpu;
+
+    /**
+     * 首日付费ARPU(自然量)
+     */
+    @Column
+    private BigDecimal natureFirstAmountArpu;
+
+    /**
+     * 当天付费ARPU(自然量)
+     */
+    @Column
+    private BigDecimal natureTodayAmountArpu;
+
+    /**
+     * 账面ARPU(自然量)
+     */
+    @Column
+    private BigDecimal natureAmountArpu;
+
+    /**
+     * 付费趋势第一天总:金额/人数/增/回/倍(自然量)
+     */
+    @Column
+    private String natureAmountD1;
+
+    /**
+     * 付费趋势第三天总:金额/人数/增/回/倍(自然量)
+     */
+    @Column
+    private String natureAmountD3;
+
+    /**
+     * 付费趋势第五天总:金额/人数/增/回/倍(自然量)
+     */
+    @Column
+    private String natureAmountD5;
+
+    /**
+     * 付费趋势第七天总:金额/人数/增/回/倍(自然量)
+     */
+    @Column
+    private String natureAmountD7;
+
+    /**
+     * 付费趋势第十五天总:金额/人数/增/回/倍(自然量)
+     */
+    @Column
+    private String natureAmountD15;
+
+    /**
+     * 付费趋势第一月总:金额/人数/增/回/倍(自然量)
+     */
+    @Column
+    private String natureAmountM1;
+
+    /**
+     * 付费趋势第二月总:金额/人数/增/回/倍(自然量)
+     */
+    @Column
+    private String natureAmountM2;
+
+    /**
+     * 付费趋势第三月总:金额/人数/增/回/倍(自然量)
+     */
+    @Column
+    private String natureAmountM3;
+
+    /**
+     * 付费趋势第六月总:金额/人数/增/回/倍(自然量)
+     */
+    @Column
+    private String natureAmountM6;
+
+    /**
+     * 付费趋势总:金额/人数/增/回/倍(自然量)
+     */
+    @Column
+    private String natureAmountSum;
+
+    /**
+     * 单日付费100+人数
+     */
+    @Column
+    private Long hundredUserNum;
+
+    /**
+     * 单日付费100+成本
+     */
+    @Column
+    private BigDecimal hundredUserNumCost;
+
+
+}

+ 1 - 1
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/AdsOrderDetailService.java

@@ -696,7 +696,7 @@ public class AdsOrderDetailService implements IAdsOrderDetailService {
                 SELECT
                 	SUM(amount) as amount,
                 	SUM(real_amount) as real_amount,
-                	SUM(back_money) / 100 as back_money
+                	SUM(back_money) as back_money
                 FROM (
                 	SELECT
                 		a.id, -- 主键id

Файловите разлики са ограничени, защото са твърде много
+ 955 - 143
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/GameDataServiceImpl.java


+ 5 - 5
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/IActiveDataServiceImpl.java

@@ -13,6 +13,7 @@ import com.zanxiang.game.data.serve.pojo.vo.ActiveDataTotalVO;
 import com.zanxiang.game.data.serve.pojo.vo.ActiveDataTrendVO;
 import com.zanxiang.game.data.serve.service.IActiveDataService;
 import com.zanxiang.game.data.serve.utils.Page;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.nutz.dao.Cnd;
 import org.nutz.dao.Dao;
@@ -25,7 +26,6 @@ import org.springframework.beans.BeanWrapper;
 import org.springframework.beans.BeanWrapperImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
 import reactor.util.function.Tuple2;
 import reactor.util.function.Tuples;
 
@@ -127,7 +127,7 @@ public class IActiveDataServiceImpl implements IActiveDataService {
     @Override
     public Page<ActiveDataDayVO> getActiveDataDay(ActiveDataDayDTO dto) {
         com.github.sd4324530.jtuple.Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
-        List<Long> userGameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());
+        List<Long> userGameIds = dto.getGameId() == null ? poerInfo.second : dto.getGameId();
         //默认查询总数据
         if (StringUtils.isBlank(dto.getTableTypes())) {
             dto.setTableTypes("total");
@@ -156,7 +156,7 @@ public class IActiveDataServiceImpl implements IActiveDataService {
         //创建查询条件
         Criteria cri = Cnd.cri();
         //拼接游戏ID
-        if (userGameIds != null) {
+        if (CollectionUtils.isNotEmpty(userGameIds)) {
             cri.where().andInList("game_id", userGameIds);
         }
         //拼接游戏应用类型
@@ -219,7 +219,7 @@ public class IActiveDataServiceImpl implements IActiveDataService {
     @Override
     public ActiveDataTotalVO getActiveDataTotal(ActiveDataTotalDTO dto) {
         com.github.sd4324530.jtuple.Tuple2<List<Long>, List<Long>> poerInfo = dataPowerComponent.getPowerInfo();
-        List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : Collections.singletonList(dto.getGameId());
+        List<Long> gameIds = dto.getGameId() == null ? poerInfo.second : dto.getGameId();
         //默认查询总数据
         if (StringUtils.isBlank(dto.getTableTypes())) {
             dto.setTableTypes("total");
@@ -237,7 +237,7 @@ public class IActiveDataServiceImpl implements IActiveDataService {
         //创建查询条件
         Criteria cri = Cnd.cri();
         //拼接游戏ID
-        if (gameIds != null) {
+        if (CollectionUtils.isNotEmpty(gameIds)) {
             cri.where().andInList("game_id", gameIds);
         }
         //拼接游戏应用类型

+ 16 - 8
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/RoleManageServiceImpl.java

@@ -288,23 +288,31 @@ public class RoleManageServiceImpl implements IRoleManageService {
 
         //投手名
         if (dataMap.get("put_user_id") != null) {
-            dataMap.put("put_user_name",
-                    sysUserRpc.getById(Long.valueOf((String) dataMap.get("put_user_id"))).getData().getNickname());
+            if (sysUserRpc.getById(Long.valueOf((String) dataMap.get("put_user_id"))).getData() != null) {
+                dataMap.put("put_user_name",
+                        sysUserRpc.getById(Long.valueOf((String) dataMap.get("put_user_id"))).getData().getNickname());
+            }
         }
         //运营人员名
         if (dataMap.get("oper_user_id") != null) {
-            dataMap.put("oper_user_name",
-                    sysUserRpc.getById((Long) dataMap.get("oper_user_id")).getData().getNickname());
+            if (sysUserRpc.getById((Long) dataMap.get("oper_user_id")).getData() != null) {
+                dataMap.put("oper_user_name",
+                        sysUserRpc.getById((Long) dataMap.get("oper_user_id")).getData().getNickname());
+            }
         }
         //GS人员名
         if (dataMap.get("gs_id") != null) {
-            dataMap.put("gs_name",
-                    sysUserRpc.getById((Long) dataMap.get("gs_id")).getData().getNickname());
+            if (sysUserRpc.getById((Long) dataMap.get("gs_id")).getData() != null) {
+                dataMap.put("gs_name",
+                        sysUserRpc.getById((Long) dataMap.get("gs_id")).getData().getNickname());
+            }
         }
         //客服人员名
         if (dataMap.get("customer_service_id") != null) {
-            dataMap.put("customer_service_name",
-                    sysUserRpc.getById((Long) dataMap.get("customer_service_id")).getData().getNickname());
+            if (sysUserRpc.getById((Long) dataMap.get("customer_service_id")).getData() != null) {
+                dataMap.put("customer_service_name",
+                        sysUserRpc.getById((Long) dataMap.get("customer_service_id")).getData().getNickname());
+            }
         }
 
         return dataMap;

+ 18 - 0
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/rpc/IWxApiServiceRpc.java

@@ -0,0 +1,18 @@
+package com.zanxiang.game.module.base.rpc;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-01-20
+ * @description : 微信接口
+ */
+public interface IWxApiServiceRpc {
+
+    /**
+     * 获取访问令牌
+     *
+     * @param appId  应用程序id
+     * @param secret 秘密
+     * @return {@link String}
+     */
+    String getAccessToken(String appId, String secret);
+}

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

@@ -5,6 +5,7 @@ import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.scheduling.annotation.EnableScheduling;
 import springfox.documentation.swagger2.annotations.EnableSwagger2;
 
 /**
@@ -17,6 +18,7 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2;
 @SpringBootApplication
 @EnableDubbo
 @EnableSwagger2
+@EnableScheduling
 public class ManageApplication {
 
     public static void main(String[] args) {

+ 18 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/rpc/impl/PayBoxRpcImpl.java

@@ -1,8 +1,13 @@
 package com.zanxiang.game.module.manage.rpc.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zanxiang.game.module.base.rpc.IPayBoxRpc;
+import com.zanxiang.game.module.manage.service.IAppletCheckService;
+import com.zanxiang.game.module.manage.service.IPayApplicationService;
+import com.zanxiang.game.module.mybatis.entity.PayApplication;
 import com.zanxiang.module.util.pojo.ResultVO;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * @author : lingfeng
@@ -12,8 +17,20 @@ import org.apache.dubbo.config.annotation.DubboService;
 @DubboService
 public class PayBoxRpcImpl implements IPayBoxRpc {
 
+    @Autowired
+    private IAppletCheckService appletCheckService;
+
+    @Autowired
+    private IPayApplicationService payApplicationService;
+
     @Override
     public ResultVO<Boolean> payBoxBan(String appId) {
-        return null;
+        PayApplication payApplication = payApplicationService.getOne(new LambdaQueryWrapper<PayApplication>()
+                .eq(PayApplication::getAppId, appId));
+        if (payApplication == null) {
+            return ResultVO.ok(Boolean.FALSE);
+        }
+        appletCheckService.payApplicationCheck(payApplication);
+        return ResultVO.ok(Boolean.TRUE);
     }
 }

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

@@ -0,0 +1,23 @@
+package com.zanxiang.game.module.manage.service;
+
+import com.zanxiang.game.module.mybatis.entity.PayApplication;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-01-20
+ * @description : 小程序检查
+ */
+public interface IAppletCheckService {
+
+    /**
+     * 小程序检查
+     */
+    void payApplicationCheck();
+
+    /**
+     * 小程序更新且通知
+     *
+     * @param payApplication : 支付应用
+     */
+    void payApplicationCheck(PayApplication payApplication);
+}

+ 13 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IListenCallService.java

@@ -0,0 +1,13 @@
+package com.zanxiang.game.module.manage.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.game.module.mybatis.entity.ListenCall;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-01-16
+ * @description : 监听呼叫
+ */
+public interface IListenCallService extends IService<ListenCall> {
+
+}

+ 216 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/AppletCheckServiceImpl.java

@@ -0,0 +1,216 @@
+package com.zanxiang.game.module.manage.service.impl;
+
+import cn.hutool.http.ContentType;
+import cn.hutool.http.HttpUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.zanxiang.erp.base.ErpServer;
+import com.zanxiang.erp.base.rpc.IDingTalkMsgRpc;
+import com.zanxiang.game.module.base.ServerInfo;
+import com.zanxiang.game.module.base.pojo.enums.PayApplicationTypeEnum;
+import com.zanxiang.game.module.base.pojo.enums.StatusEnum;
+import com.zanxiang.game.module.base.rpc.IWxApiServiceRpc;
+import com.zanxiang.game.module.manage.service.*;
+import com.zanxiang.game.module.mybatis.entity.GamePayWay;
+import com.zanxiang.game.module.mybatis.entity.ListenCall;
+import com.zanxiang.game.module.mybatis.entity.PayApplication;
+import com.zanxiang.game.module.mybatis.entity.PayBox;
+import com.zanxiang.module.util.JsonUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-01-20
+ * @description : 小程序检查
+ */
+@Slf4j
+@Service
+public class AppletCheckServiceImpl implements IAppletCheckService {
+
+    @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
+    private IDingTalkMsgRpc dingTalkMsgRpc;
+
+    @DubboReference(providedBy = ServerInfo.SERVER_SDK_DUBBO_NAME)
+    private IWxApiServiceRpc wxApiServiceRpc;
+
+    @Autowired
+    private IPayBoxService payBoxService;
+
+    @Autowired
+    private IGamePayWayService gamePayWayService;
+
+    @Autowired
+    private IListenCallService listenCallService;
+
+    @Autowired
+    private IPayApplicationService payApplicationService;
+
+    @Override
+    public void payApplicationCheck() {
+        List<PayApplication> payApplicationList = payApplicationService.list(new LambdaQueryWrapper<PayApplication>()
+                .eq(PayApplication::getStatus, StatusEnum.YES.getCode())
+                .eq(PayApplication::getType, PayApplicationTypeEnum.WX_MINI_APP.getType()));
+        if (CollectionUtils.isEmpty(payApplicationList)) {
+            return;
+        }
+        payApplicationList.forEach(payApplication -> {
+            String accessToken = wxApiServiceRpc.getAccessToken(payApplication.getAppId(), payApplication.getAppSecret());
+            boolean checkResult = this.appletCheck(accessToken);
+            if (checkResult) {
+                return;
+            }
+            this.payApplicationCheck(payApplication);
+        });
+    }
+
+    @Override
+    public void payApplicationCheck(PayApplication payApplication) {
+        try {
+            //更新游戏支付盒子配置
+            this.gamePayWayUpdate(payApplication);
+        } catch (Exception e) {
+            log.error("支付应用异常更新游戏支付盒子失败, appName : {}, e : {}", payApplication.getAppName(), e.getMessage());
+        }
+        try {
+            //钉钉通知
+            this.sendDingTalkMsg(payApplication);
+        } catch (Exception e) {
+            log.error("支付应用异常钉钉通知失败, appName : {}, e : {}", payApplication.getAppName(), e.getMessage());
+        }
+        try {
+            //电话通知
+            this.sendPhoneTalkMsg(payApplication);
+        } catch (Exception e) {
+            log.error("支付应用异常电话通知失败, appName : {}, e : {}", payApplication.getAppName(), e.getMessage());
+        }
+    }
+
+    private void gamePayWayUpdate(PayApplication payApplication) {
+        //修改支付应用状态
+        payApplicationService.update(new LambdaUpdateWrapper<PayApplication>()
+                .eq(PayApplication::getAppId, payApplication.getAppId())
+                .set(PayApplication::getStatus, StatusEnum.NO.getCode())
+                .set(PayApplication::getUpdateTime, LocalDateTime.now()));
+        //查询支付应用对应的盒子
+        List<PayBox> payBoxList = payBoxService.list(new LambdaQueryWrapper<PayBox>()
+                .eq(PayBox::getAppId, payApplication.getAppId()));
+        if (CollectionUtils.isEmpty(payBoxList)) {
+            return;
+        }
+        //修改相关支付盒子状态
+        payBoxService.update(new LambdaUpdateWrapper<PayBox>()
+                .eq(PayBox::getAppId, payApplication.getAppId())
+                .set(PayBox::getStatus, StatusEnum.NO.getCode())
+                .set(PayBox::getUpdateTime, LocalDateTime.now()));
+        //获取一个能用的支付盒子
+        PayBox payBox = payBoxService.getOne(new LambdaQueryWrapper<PayBox>()
+                .eq(PayBox::getType, payApplication.getType())
+                .eq(PayBox::getStatus, StatusEnum.YES.getCode())
+                .last("limit 1"));
+        //修改游戏支付配置
+        gamePayWayService.update(new LambdaUpdateWrapper<GamePayWay>()
+                .in(GamePayWay::getPayBoxId, payBoxList)
+                .set(GamePayWay::getPayBoxId, payBox.getId())
+                .set(GamePayWay::getUpdateTime, LocalDateTime.now()));
+    }
+
+    private void sendDingTalkMsg(PayApplication payApplication) {
+        List<ListenCall> listenCallList = this.callListenUser(payApplication);
+        if (CollectionUtils.isEmpty(listenCallList)) {
+            return;
+        }
+        String content = "小程序 : " + payApplication.getAppName() + " 可能被封停或者禁用, 请注意验证";
+        Set<Long> userIdSet = listenCallList.stream().map(ListenCall::getUserId).collect(Collectors.toSet());
+        userIdSet.forEach(userId -> dingTalkMsgRpc.sendByUserId(userId, content));
+    }
+
+    private void sendPhoneTalkMsg(PayApplication payApplication) {
+        List<ListenCall> listenCallList = this.callListenUser(payApplication);
+        if (CollectionUtils.isEmpty(listenCallList)) {
+            return;
+        }
+        String content = payApplication.getAppName() + "监测异常";
+        Set<String> phoneNumSet = listenCallList.stream().map(ListenCall::getPhoneNum).collect(Collectors.toSet());
+        phoneNumSet.forEach(phoneNum -> this.phoneCall(phoneNum, content));
+    }
+
+    private List<ListenCall> callListenUser(PayApplication payApplication) {
+        //支付应用被使用到的盒子
+        List<Integer> payBoxIdList = payBoxService.list(new LambdaQueryWrapper<PayBox>()
+                .eq(PayBox::getAppId, payApplication.getAppId())
+        ).stream().map(PayBox::getId).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(payBoxIdList)) {
+            return Collections.emptyList();
+        }
+        //盒子被使用到的游戏
+        Set<Long> gameIdSet = gamePayWayService.list(new LambdaQueryWrapper<GamePayWay>()
+                .in(GamePayWay::getPayBoxId, payBoxIdList)
+        ).stream().map(GamePayWay::getGameId).collect(Collectors.toSet());
+        if (CollectionUtils.isEmpty(gameIdSet)) {
+            return Collections.emptyList();
+        }
+        //游戏关联的监听人员
+        return listenCallService.list(new LambdaQueryWrapper<ListenCall>().in(ListenCall::getGameId, gameIdSet));
+    }
+
+    private boolean appletCheck(String token) {
+        //参数对象
+        String dayTime = LocalDate.now().minusDays(1).toString();
+        Map<String, String> paramMap = new HashMap<>(2);
+        paramMap.put("begin_date", dayTime);
+        paramMap.put("end_date", dayTime);
+        String host = "https://api.weixin.qq.com/datacube/getweanalysisappiddailyretaininfo?access_token=" + token;
+        try {
+            // 带参POST请求
+            String result = HttpUtil.post(host, JsonUtil.toString(paramMap));
+            if (Strings.isNotBlank(result) && result.contains("errcode")) {
+                return Boolean.FALSE;
+            }
+        } catch (Exception e) {
+            log.error("小程序token检测出现异常, token : {},  e : {}", token, e.getMessage());
+            return Boolean.FALSE;
+        }
+        return Boolean.TRUE;
+    }
+
+    private void phoneCall(String param, String mobile) {
+        RestTemplate restTemplate = new RestTemplate();
+        String appCode = "f395b1587fc04a49a975f908660fb1e9";
+        String host = "https://jumfixed.market.alicloudapi.com/voice-notify/send";
+        HttpHeaders headers = new HttpHeaders();
+        headers.set("Authorization", "APPCODE " + appCode);
+        headers.set("Content-Type", ContentType.FORM_URLENCODED.getValue());
+        //参数
+        MultiValueMap<String, String> requestParams = new LinkedMultiValueMap<>();
+        requestParams.add("mobile", mobile);
+        requestParams.add("templateId", "JMJNAWUQOJP9");
+        requestParams.add("param", param);
+        String result = null;
+        try {
+            ResponseEntity<String> responseEntity = restTemplate.exchange(host, HttpMethod.POST,
+                    new HttpEntity<>(requestParams, headers), String.class);
+            result = responseEntity.getBody();
+        } catch (Exception e) {
+            log.error("阿里语音呼叫失败, requestParams : {}, e : {}", JsonUtil.toString(requestParams), e.getMessage());
+        }
+        log.error("阿里语音呼叫结果, result : {}", result);
+    }
+
+}

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

@@ -0,0 +1,18 @@
+package com.zanxiang.game.module.manage.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.game.module.manage.service.IListenCallService;
+import com.zanxiang.game.module.mybatis.entity.ListenCall;
+import com.zanxiang.game.module.mybatis.mapper.ListenCallMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-01-16
+ * @description : 监听呼叫
+ */
+@Slf4j
+@Service
+public class ListenCallServiceImpl extends ServiceImpl<ListenCallMapper, ListenCall> implements IListenCallService {
+}

+ 4 - 3
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/UserServiceImpl.java

@@ -59,6 +59,9 @@ import java.util.stream.Collectors;
 @Service
 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
 
+    @DubboReference(providedBy = CorpServer.SERVER_DUBBO_NAME)
+    private ICorpExternalUserServiceRpc corpExternalUserServiceRpc;
+
     @Autowired
     private IGameService gameService;
 
@@ -74,9 +77,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
     @Autowired
     private IGameUserRoleService gameUserRoleService;
 
-    @DubboReference(providedBy = CorpServer.SERVER_DUBBO_NAME)
-    private ICorpExternalUserServiceRpc corpExternalUserServiceRpc;
-
     @Autowired
     private IGameUserService gameUserService;
 
@@ -121,6 +121,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         h5User.setGameId(gameDTO.getId());
         h5User.setMobile(mobile);
         h5User.setRelationUserId(user.getId());
+        h5User.setRelationGameId(user.getGameId());
         h5User.setRelationCreateTime(LocalDateTime.now());
         //充值统计数据归零设置
         h5User.setSessionKey(null);

+ 50 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/task/PayApplicationTask.java

@@ -0,0 +1,50 @@
+package com.zanxiang.game.module.manage.task;
+
+import com.zanxiang.game.module.manage.service.IAppletCheckService;
+import com.zanxiang.module.redis.service.IDistributedLockComponent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-01-20
+ * @description : 支付应用任务
+ */
+@Slf4j
+@Component
+public class PayApplicationTask {
+
+    @Autowired
+    private IDistributedLockComponent distributedLockComponent;
+
+    @Autowired
+    private IAppletCheckService appletCheckService;
+
+    /**
+     * 小程序每分钟检查
+     */
+    @Scheduled(cron = "0 0/1 * * * ?")
+    public void payApplicationCheck() {
+        String lockKey = "payApplicationCheck_lock";
+        //上锁
+        if (!distributedLockComponent.doLock(lockKey, 0L, 10L, TimeUnit.MINUTES)) {
+            return;
+        }
+        log.error("小程序每分钟token监控定时器开始执行, time : {}", System.currentTimeMillis());
+        try {
+            //执行检测
+            appletCheckService.payApplicationCheck();
+        } catch (Exception e) {
+            log.error("小程序每分钟token监控异常, e : {}", e.getMessage());
+        } finally {
+            //释放锁
+            distributedLockComponent.unlock(lockKey);
+        }
+        log.error("小程序每分钟token监控定时器执行完成时间 , time  : {}", System.currentTimeMillis());
+    }
+
+}

+ 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服务启动成功 <兼容ios通用客户端, 新增创角回传--01> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <新增token验证接口> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 10 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/LoginController.java

@@ -6,6 +6,7 @@ import com.zanxiang.game.module.sdk.pojo.param.LoginMobileParam;
 import com.zanxiang.game.module.sdk.pojo.param.LoginPasswordParam;
 import com.zanxiang.game.module.sdk.pojo.param.LoginVxCodeParam;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
+import com.zanxiang.game.module.sdk.pojo.vo.CpTokenCheckVO;
 import com.zanxiang.game.module.sdk.pojo.vo.UserLoginVO;
 import com.zanxiang.game.module.sdk.service.IRegisterLoginService;
 import com.zanxiang.game.module.sdk.service.IUserTokenService;
@@ -44,6 +45,15 @@ public class LoginController {
         return registerLoginService.loginWxCode(param, userData, request);
     }
 
+    @UnSignCheck
+    @ApiOperation(value = "CP登录凭证验证")
+    @GetMapping("/token/check/new")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = CpTokenCheckVO.class)})
+    public ResultVO<CpTokenCheckVO> cpTokenCheckNew(@RequestParam String appId, @RequestParam Long userId,
+                                                    @RequestParam String token, @RequestParam String sign) {
+        return userTokenService.cpTokenCheckNew(appId, userId, token, sign);
+    }
+
     @UnSignCheck
     @ApiOperation(value = "CP登录凭证验证")
     @GetMapping("/token/check")

+ 28 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/vo/CpTokenCheckVO.java

@@ -0,0 +1,28 @@
+package com.zanxiang.game.module.sdk.pojo.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-01-23
+ * @description : token验证返回
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CpTokenCheckVO {
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 应用id
+     */
+    private String appId;
+}

+ 23 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/rpc/impl/WxApiServiceRpcImpl.java

@@ -0,0 +1,23 @@
+package com.zanxiang.game.module.sdk.rpc.impl;
+
+import com.zanxiang.game.module.base.rpc.IWxApiServiceRpc;
+import com.zanxiang.game.module.sdk.service.api.WxApiService;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @author : lingfeng
+ * @time : 2024-01-20
+ * @description : 微信接口
+ */
+@DubboService
+public class WxApiServiceRpcImpl implements IWxApiServiceRpc {
+
+    @Autowired
+    private WxApiService wxApiService;
+
+    @Override
+    public String getAccessToken(String appId, String secret) {
+        return wxApiService.getAccessToken(appId, secret);
+    }
+}

+ 12 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IUserTokenService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.game.module.mybatis.entity.UserToken;
 import com.zanxiang.game.module.sdk.pojo.dto.UserTokenDTO;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
+import com.zanxiang.game.module.sdk.pojo.vo.CpTokenCheckVO;
 import com.zanxiang.module.util.pojo.ResultVO;
 
 /**
@@ -13,6 +14,17 @@ import com.zanxiang.module.util.pojo.ResultVO;
  */
 public interface IUserTokenService extends IService<UserToken> {
 
+    /**
+     * cp令牌检查
+     *
+     * @param appId  应用程序id
+     * @param userId 用户id
+     * @param token  令牌
+     * @param sign   标志
+     * @return {@link ResultVO}<{@link CpTokenCheckVO}>
+     */
+    ResultVO<CpTokenCheckVO> cpTokenCheckNew(String appId, Long userId, String token, String sign);
+
     /**
      * cp令牌检查
      *

+ 53 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/UserTokenServiceImpl.java

@@ -15,6 +15,7 @@ import com.zanxiang.game.module.sdk.enums.LoginTypeEnum;
 import com.zanxiang.game.module.sdk.enums.TokenCheckEnum;
 import com.zanxiang.game.module.sdk.pojo.dto.UserTokenDTO;
 import com.zanxiang.game.module.sdk.pojo.param.UserData;
+import com.zanxiang.game.module.sdk.pojo.vo.CpTokenCheckVO;
 import com.zanxiang.game.module.sdk.service.*;
 import com.zanxiang.game.module.sdk.util.RedisUtil;
 import com.zanxiang.game.module.sdk.util.SignUtil;
@@ -57,6 +58,58 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
     @Autowired
     private IUserLoginLogService userLoginLogService;
 
+    @Override
+    public ResultVO<CpTokenCheckVO> cpTokenCheckNew(String appId, Long userId, String token, String sign) {
+        //查询登录签名
+        GameExt gameExt = gameExtService.getByGameAppId(appId);
+        if (gameExt == null || Strings.isBlank(gameExt.getLoginKey())) {
+            log.error("token验证失败 , 游戏拓展信息不存在, appId : {}, userId : {}", appId, userId);
+            return ResultVO.fail(TokenCheckEnum.PARAM_LACK.getMsg());
+        }
+        //用户信息
+        User user = userService.getById(userId);
+        //查询token是否存在
+        UserToken userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
+                .eq(UserToken::getToken, token)
+                .eq(UserToken::getUserId, userId));
+        //导量用户携带的是 relationUserId 匹配的token
+        if (userToken == null && user.getRelationUserId() != null) {
+            userToken = super.getOne(new LambdaQueryWrapper<UserToken>()
+                    .eq(UserToken::getToken, token)
+                    .eq(UserToken::getUserId, user.getRelationUserId()));
+        }
+        //判断token是否存在, 并且没有过期
+        if (userToken == null || userToken.getExpireTime() < DateUtils.localDateTimeToSecond(LocalDateTime.now())) {
+            log.error("token验证失败 , token不存在或者已经失效, appId : {}, userId : {}, token : {}", appId, userId, token);
+            return ResultVO.fail(TokenCheckEnum.SIGN_ERROR.getMsg());
+        }
+        //登录密钥
+        String loginKey = gameExt.getLoginKey();
+        //计算用户签名
+        StringBuilder sb = new StringBuilder();
+        sb.append("loginKey=").append(loginKey);
+        sb.append("&appId=").append(appId);
+        sb.append("&userId=").append(userId);
+        sb.append("&token=").append(token);
+        String mySign;
+        try {
+            mySign = SignUtil.MD5(sb.toString());
+        } catch (Exception e) {
+            log.error("md5工具类加密异常, str : {}, e : {}", sb.toString(), e.getMessage());
+            throw new BaseException("MD5加密异常");
+        }
+        //签名错误
+        if (!Objects.equals(mySign, sign)) {
+            log.error("token验证失败 , str : {}, mySign : {}, sign : {}", sb.toString(), mySign, sign);
+            return ResultVO.fail(TokenCheckEnum.CHECK_FAIL.getMsg());
+        }
+        //构造返回
+        return ResultVO.ok(CpTokenCheckVO.builder()
+                .userId(userId)
+                .appId(gameExtService.getByGameId(user.getGameId()).getAppId())
+                .build());
+    }
+
     @Override
     public ResultVO<Long> cpTokenCheck(String appId, Long userId, String token, String sign) {
         //查询登录签名

+ 3 - 3
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/AliPayService.java

@@ -203,7 +203,7 @@ public class AliPayService extends PayBaseService {
                     .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee(), "", "");
         } catch (Exception e) {
             log.error("支付宝H5支付异常, product : {}, e:{}", JsonUtil.toString(product), e.getMessage());
-            this.listenCall(product.getGameId(), "支付宝H5支付");
+            this.listenCall(product.getGameId(), "阿宝网页端支付异常");
             throw new BaseException("支付宝H5支付异常");
         }
         //请求失败
@@ -307,7 +307,7 @@ public class AliPayService extends PayBaseService {
                     .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee(), "");
         } catch (Exception e) {
             log.error("支付宝pc端支付异常, product : {}, e:{}", JsonUtil.toString(product), e.getMessage());
-            this.listenCall(product.getGameId(), "支付宝pc端支付");
+            this.listenCall(product.getGameId(), "阿宝电脑端支付异常");
             throw new BaseException("支付宝pc端支付异常");
         }
         if (!ResponseChecker.success(response)) {
@@ -329,7 +329,7 @@ public class AliPayService extends PayBaseService {
                     .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee());
         } catch (Exception e) {
             log.error("支付宝app端支付异常, product : {}, e:{}", JsonUtil.toString(product), e.getMessage());
-            this.listenCall(product.getGameId(), "支付宝app端支付");
+            this.listenCall(product.getGameId(), "阿宝移动端支付异常");
             throw new BaseException("支付宝app端支付异常");
         }
         if (!ResponseChecker.success(response)) {

+ 1 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/WxPayService.java

@@ -351,7 +351,7 @@ public class WxPayService extends PayBaseService {
             throw new BaseException("微信小程序支付下单失败");
         } catch (Exception e) {
             log.error("微信支付通信异常, 订单号:{}, e : {}", product.getOutTradeNo(), e.getMessage());
-            this.listenCall(product.getGameId(), "微信支付通道");
+            this.listenCall(product.getGameId(), "小马支付通道异常");
             throw new BaseException("微信小程序支付下单异常");
         }
     }

Някои файлове не бяха показани, защото твърде много файлове са промени