Selaa lähdekoodia

Merge remote-tracking branch 'origin/dev0.0.1' into dev-lingfeng

bilingfeng 2 vuotta sitten
vanhempi
commit
388d6390a0
44 muutettua tiedostoa jossa 636 lisäystä ja 126 poistoa
  1. 0 1
      game-module/game-common-redis/pom.xml
  2. 2 2
      game-module/game-common/pom.xml
  3. 5 0
      game-module/game-common/src/main/java/com/zanxiang/common/enums/HttpStatusEnum.java
  4. 21 1
      game-module/game-common/src/main/java/com/zanxiang/common/enums/OsEnum.java
  5. 2 2
      game-module/game-manage/src/main/java/com/zanxiang/manage/domain/vo/GamePayWayListVO.java
  6. 5 0
      game-module/game-manage/src/main/resources/bootstrap.yml
  7. 1 6
      game-module/game-mybatis/pom.xml
  8. 10 0
      game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/entity/GameUserRole.java
  9. 5 0
      game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/entity/LogPayCp.java
  10. 7 0
      game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/entity/Order.java
  11. 5 1
      game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/entity/OrderComplete.java
  12. 0 2
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/SDKApplication.java
  13. 8 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/listener/OrderPaySuccessListener.java
  14. 10 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/resolver/TokenArgumentResolver.java
  15. 43 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/util/DeviceCheckUtil.java
  16. 37 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/util/HttpUtil.java
  17. 1 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/config/MybatisPlusConfig.java
  18. 6 2
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/PayController.java
  19. 2 2
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/bo/PlatformOrderBO.java
  20. 2 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/bo/ProductPayParamBO.java
  21. 6 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/dto/PlatformOrderDTO.java
  22. 55 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/mapper/OrderCompleteCreateMapper.java
  23. 3 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/CommonParam.java
  24. 9 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/ProductPayParam.java
  25. 9 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/UserData.java
  26. 9 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/GameUserRoleService.java
  27. 13 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/GameUserService.java
  28. 3 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/GamePayWayServiceImpl.java
  29. 22 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/GameUserImpl.java
  30. 42 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/GameUserRoleImpl.java
  31. 18 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/OrderCompleteServiceImpl.java
  32. 117 78
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/PerformOrderServiceImpl.java
  33. 2 8
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/PlatformOrderServiceImpl.java
  34. 21 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/UserExtServiceImpl.java
  35. 2 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/UserLoginLogServiceImpl.java
  36. 74 7
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/pay/AlipayServiceImpl.java
  37. 5 4
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/pay/PayService.java
  38. 13 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/OrderCompleteService.java
  39. 16 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/PerformOrderService.java
  40. 13 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/UserExtService.java
  41. 2 1
      game-module/game-sdk/src/main/resources/META-INF/spring.factories
  42. 8 1
      game-module/game-sdk/src/main/resources/bootstrap.yml
  43. 1 1
      game-module/game-sdk/src/test/java/com/zanxiang/sdk/OrderTests.java
  44. 1 0
      game-module/pom.xml

+ 0 - 1
game-module/game-common-redis/pom.xml

@@ -10,7 +10,6 @@
     <modelVersion>4.0.0</modelVersion>
     <artifactId>game-common-redis</artifactId>
     <description>redis相关</description>
-    <packaging>pom</packaging>
 
     <dependencies>
         <!-- SpringBoot Boot aspectj -->

+ 2 - 2
game-module/game-common/pom.xml

@@ -3,14 +3,14 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>game-center</artifactId>
+        <artifactId>game-module</artifactId>
         <groupId>com.zanxiang.game</groupId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>game-common</artifactId>
-    <packaging>pom</packaging>
+
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 5 - 0
game-module/game-common/src/main/java/com/zanxiang/common/enums/HttpStatusEnum.java

@@ -327,6 +327,11 @@ public enum HttpStatusEnum {
      */
     ORDER_AMOUNT_IS_NULL(41500, "订单金额为空"),
 
+    /**
+     * 玩家充值未达标
+     */
+    ORDER_GAME_ID_IS_NULL(41501, "订单游戏id为空"),
+
     /**
      * 参数为空
      */

+ 21 - 1
game-module/game-common/src/main/java/com/zanxiang/common/enums/OsEnum.java

@@ -20,7 +20,27 @@ public enum OsEnum {
     /**
      * 安卓
      */
-    SYSTEM_ANDROID("android", "安卓手机操作系统");
+    SYSTEM_ANDROID("android", "安卓手机操作系统"),
+
+    /**
+     * window操作系统
+     */
+    SYSTEM_WINDOW("window", "window操作系统"),
+
+    /**
+     * window操作系统
+     */
+    SYSTEM_LINUX("linux", "linux操作系统"),
+
+    /**
+     * Mac操作系统
+     */
+    SYSTEM_MAC("mac", "Mac操作系统"),
+
+    /**
+     * 其它操作系统
+     */
+    SYSTEM_OTHER("other", "other操作系统");
 
     /**
      * 平台id

+ 2 - 2
game-module/game-manage/src/main/java/com/zanxiang/manage/domain/vo/GamePayWayListVO.java

@@ -1,7 +1,7 @@
 package com.zanxiang.manage.domain.vo;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.StringSerializer;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -63,6 +63,6 @@ public class GamePayWayListVO implements Serializable {
 
 
     @ApiModelProperty(notes = "支付商户号id")
-    @JsonSerialize(using = StringSerializer.class)
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long payMerchantId;
 }

+ 5 - 0
game-module/game-manage/src/main/resources/bootstrap.yml

@@ -29,6 +29,11 @@ spring:
         shared-dataids: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
         max-retry: 10
 
+  #redis数据库配置
+  redis:
+    host: 118.178.187.109
+    port: 6379
+    password: zx$2020ddd
   #数据库配置
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver

+ 1 - 6
game-module/game-mybatis/pom.xml

@@ -3,7 +3,7 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <parent>
-        <artifactId>game-center</artifactId>
+        <artifactId>game-module</artifactId>
         <groupId>com.zanxiang.game</groupId>
         <version>0.0.1-SNAPSHOT</version>
     </parent>
@@ -11,11 +11,6 @@
 
     <artifactId>game-mybatis</artifactId>
 
-    <properties>
-        <maven.compiler.source>18</maven.compiler.source>
-        <maven.compiler.target>18</maven.compiler.target>
-    </properties>
-
     <dependencies>
         <dependency>
             <artifactId>game-common</artifactId>

+ 10 - 0
game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/entity/GameUserRole.java

@@ -107,6 +107,16 @@ public class GameUserRole {
      */
     private String os;
 
+    /**
+     * 游戏区服id
+     */
+    private Long regionalId;
+
+    /**
+     * 游戏区服名称
+     */
+    private String regionalName;
+
     /**
      * 创建时间
      */

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

@@ -30,6 +30,11 @@ public class LogPayCp implements Serializable {
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
+    /**
+     * 支付方式
+     */
+    private String payId;
+
     /**
      * 订单号
      */

+ 7 - 0
game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/entity/Order.java

@@ -2,6 +2,7 @@ package com.zanxiang.mybatis.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.*;
 
@@ -195,8 +196,14 @@ public class Order {
     /**
      * 0正常 1删除
      */
+    @TableLogic
     private Integer isDelete;
 
+    /**
+     * 是否首充 0 否 1 是
+     */
+    private Integer isFirstRecharge;
+
     /**
      * 操作系统
      */

+ 5 - 1
game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/entity/OrderComplete.java

@@ -28,7 +28,6 @@ public class OrderComplete implements Serializable {
     /**
      * 订单ID
      */
-    @TableId(value = "order_id", type = IdType.AUTO)
     private Long orderId;
 
     /**
@@ -176,6 +175,11 @@ public class OrderComplete implements Serializable {
      */
     private String gameRegional;
 
+    /**
+     * 游戏角色id
+     */
+    private String gameRoleId;
+
     /**
      * 游戏角色
      */

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

@@ -1,7 +1,6 @@
 package com.zanxiang.sdk;
 
 import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@@ -12,7 +11,6 @@ import org.springframework.web.bind.annotation.CrossOrigin;
 @Slf4j
 @EnableDiscoveryClient
 @SpringBootApplication
-@MapperScan("com.zanxiang.mybatis.mapper")
 @Configuration
 public class SDKApplication {
 

+ 8 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/listener/OrderPaySuccessListener.java

@@ -47,7 +47,15 @@ public class OrderPaySuccessListener {
             logger.error("订单:{} 获取详情失败", event.getOrderId());
             return;
         }
+        //用户充值统计更新
+        performOrderService.userRechargeTotal(orderInfo);
+        //检查是否为首充(账号首充)
+        Boolean isFirstRecharge = performOrderService.checkIsFirstRecharge(orderInfo);
         //cp推送
         performOrderService.pushCp(orderInfo);
+        //生成宽表数据
+        performOrderService.createOrderComplete(orderInfo);
+
+
     }
 }

+ 10 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/resolver/TokenArgumentResolver.java

@@ -7,7 +7,11 @@ import com.zanxiang.sdk.common.annotation.ValidLogin;
 import com.zanxiang.sdk.common.util.DeviceCheckUtil;
 import com.zanxiang.sdk.domain.dto.UserTokenDTO;
 import com.zanxiang.sdk.domain.params.UserData;
+import com.zanxiang.sdk.service.Impl.pay.AlipayServiceImpl;
 import com.zanxiang.sdk.service.UserTokenService;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.core.MethodParameter;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
@@ -27,8 +31,11 @@ import javax.servlet.http.HttpServletRequest;
  */
 @Component
 @Service
+@Slf4j
 public class TokenArgumentResolver implements HandlerMethodArgumentResolver {
 
+    private static final Logger logger = LoggerFactory.getLogger(AlipayServiceImpl.class);
+
     @Resource
     private UserTokenService userTokenService;
 
@@ -50,9 +57,12 @@ public class TokenArgumentResolver implements HandlerMethodArgumentResolver {
             throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
         }
         String userAgent = request.getHeader("user-agent");
+        logger.info("user-agent:{}", userAgent);
         Integer deviceType = DeviceCheckUtil.getType(userAgent);
         UserData data = new UserData();
         data.setDeviceType(deviceType);
+        data.setDeviceSystem(DeviceCheckUtil.getDeviceSystem(userAgent));
+        logger.info("UserData:{}", data);
         if (StringUtils.isEmpty(token)) {
             if (b) {
                 throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);

+ 43 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/util/DeviceCheckUtil.java

@@ -1,9 +1,12 @@
 package com.zanxiang.sdk.common.util;
 
+import com.zanxiang.common.enums.OsEnum;
 import com.zanxiang.common.enums.PayDeviceEnum;
+import com.zanxiang.common.utils.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
+import java.util.Locale;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -93,4 +96,44 @@ public class DeviceCheckUtil {
         }
         return false;
     }
+
+
+    /**
+     * 获取设备系统
+     *
+     * @param userAgent
+     * @return
+     */
+    public static String getDeviceSystem(String userAgent) {
+        if (StringUtils.isEmpty(userAgent)) {
+            return OsEnum.SYSTEM_OTHER.getOs();
+        }
+        //window
+        userAgent = userAgent.toLowerCase(Locale.ROOT);
+        if (userAgent.contains(OsEnum.SYSTEM_WINDOW.getOs())) {
+            return OsEnum.SYSTEM_WINDOW.getOs();
+        }
+        //linux
+        if (userAgent.contains(OsEnum.SYSTEM_LINUX.getOs())) {
+            return OsEnum.SYSTEM_LINUX.getOs();
+        }
+        boolean isMobile = isMobile(userAgent);
+        if (isMobile) {
+            // android
+            if (userAgent.contains(OsEnum.SYSTEM_ANDROID.getOs())) {
+                return OsEnum.SYSTEM_ANDROID.getOs();
+            }
+            //ios
+            if (isIOS(userAgent)) {
+                return OsEnum.SYSTEM_IOS.getOs();
+            }
+        } else {
+            //mac
+            if (userAgent.contains(OsEnum.SYSTEM_MAC.getOs())) {
+                return OsEnum.SYSTEM_MAC.getOs();
+            }
+        }
+
+        return OsEnum.SYSTEM_OTHER.getOs();
+    }
 }

+ 37 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/util/HttpUtil.java

@@ -62,6 +62,42 @@ public class HttpUtil {
         return null;
     }
 
+    public static String postDataUrl(String urlStr, String data, String contentType) {
+        BufferedReader reader = null;
+        try {
+            URLConnection conn = initHttps(urlStr);
+            if (contentType != null) {
+                conn.setRequestProperty("content-type", contentType);
+            }
+            OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), DEFAULT_ENCODING);
+            if (data == null) {
+                data = "";
+            }
+            writer.write(data);
+            writer.flush();
+            writer.close();
+
+            reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), DEFAULT_ENCODING));
+            StringBuilder sb = new StringBuilder();
+            String line;
+            while ((line = reader.readLine()) != null) {
+                sb.append(line);
+                sb.append("\r\n");
+            }
+            return conn.getURL().toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (reader != null) {
+                    reader.close();
+                }
+            } catch (IOException e) {
+            }
+        }
+        return null;
+    }
+
     /**
      * 初始化http请求参数
      */
@@ -85,7 +121,7 @@ public class HttpUtil {
                 "application/x-www-form-urlencoded");
         http.setRequestProperty(
                 "User-Agent",
-                "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
+                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36");
         http.setSSLSocketFactory(ssf);
         http.setDoOutput(true);
         http.setDoInput(true);

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

@@ -28,7 +28,7 @@ import java.sql.SQLException;
  */
 @Configuration
 @EnableTransactionManagement
-@MapperScan("com.zanxiang.mybatis.mapper")
+@MapperScan({"com.zanxiang.mybatis.mapper", "com.zanxiang.sdk.domain.mapper"})
 public class MybatisPlusConfig {
 
     /**

+ 6 - 2
game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/PayController.java

@@ -56,13 +56,16 @@ public class PayController {
             if (product.getAmount() == null || Objects.equals(product.getAmount(), BigDecimal.ZERO)) {
                 return ResultMap.error(HttpStatusEnum.ORDER_AMOUNT_IS_NULL.getMsg());
             }
+            if (StringUtils.isEmpty(product.getGameId())) {
+                return ResultMap.error(HttpStatusEnum.ORDER_GAME_ID_IS_NULL.getMsg());
+            }
             PlatformOrderBO orderBO = new PlatformOrderBO();
             orderBO.setAmount(product.getAmount());
-            orderBO.setProductName("充值" + product.getAmount());
+            orderBO.setProductName(product.getAmount().toString());//"充值" +
             orderBO.setProductId("ptb_charge");
             orderBO.setMgUserId(product.getMgUserId());
             orderBO.setUserId(userId);
-            orderBO.setGameId(product.getGameId());
+            orderBO.setGameId(Long.valueOf(product.getGameId()));
             orderBO.setCpId(cpId);
             String orderId = platformOrderService.create(orderBO);
             product.setOrderId(orderId);
@@ -71,6 +74,7 @@ public class PayController {
         bo.setGameId(product.getGameId());
         bo.setUserId(userId);
         bo.setPayDevice(userData.getDeviceType());
+        bo.setDeviceSystem(userData.getDeviceSystem());
         //todo : 工具类做了修改
         bo.setSpbillCreateIp(IpUtils.getHostIp());
         bo.setOutTradeNo(product.getOrderId());

+ 2 - 2
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/bo/PlatformOrderBO.java

@@ -7,7 +7,7 @@ import java.util.Date;
 
 @Data
 public class PlatformOrderBO {
-    
+
     private String id;
 
     /**
@@ -35,7 +35,7 @@ public class PlatformOrderBO {
      * 游戏ID
      */
 //    @NonNull
-    private String gameId;
+    private Long gameId;
 
     /**
      * 货物总价

+ 2 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/bo/ProductPayParamBO.java

@@ -41,4 +41,6 @@ public class ProductPayParamBO {
 
     private Object config; //支付相关配置
 
+    private String deviceSystem; //支付类型详情(android / ios/ window)
+
 }

+ 6 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/dto/PlatformOrderDTO.java

@@ -1,5 +1,7 @@
 package com.zanxiang.sdk.domain.dto;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -36,7 +38,8 @@ public class PlatformOrderDTO implements Serializable {
      * 游戏ID
      */
 //    @NonNull
-    private String gameId;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long gameId;
 
     /**
      * 货物总价
@@ -188,6 +191,8 @@ public class PlatformOrderDTO implements Serializable {
 
     private String payDevice;
 
+    private String roleId;
+
     /**
      * 创建时间
      */

+ 55 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/mapper/OrderCompleteCreateMapper.java

@@ -0,0 +1,55 @@
+package com.zanxiang.sdk.domain.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zanxiang.mybatis.entity.OrderComplete;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+/**
+ * @author xufeng
+ * @date 2022/7/6 11:34
+ */
+public interface OrderCompleteCreateMapper extends BaseMapper<OrderComplete> {
+
+    @Select("<script> " +
+            "SELECT o.*,o.id as orderId,o.amount as orderAmount,u.username AS agentAccount,u.create_time AS regTime,ux.reg_game_id AS regGameId,ux.reg_from AS regFrom,gur.regional_name AS regionalName,gur.role_id AS gameRoleId,gur.role_level AS gameLevel,gur.role_name AS gameRole,gur.role_vip_level AS gameVip,g.`name` AS gameName,gc1.`name` AS gameCategory,g2.`name` AS regGameName,gc2.`name` AS regGameCategory,gpw.pay_way_id AS payWayId,pw.pay_name AS payWayName,pm.merchant_name AS merchantName,pm.merchant_no AS merchantNo FROM h_order o LEFT JOIN h_user u ON o.user_id=u.id LEFT JOIN h_user_ext ux ON u.id=ux.user_id LEFT JOIN h_game_user_role gur ON gur.role_id=o.role_id LEFT JOIN h_game g ON g.id=o.game_id LEFT JOIN h_game_category gc1 ON gc1.id=g.category LEFT JOIN h_game g2 ON g2.id=ux.reg_game_id=g2.id LEFT JOIN h_game_category gc2 ON gc2.id=g2.category LEFT JOIN h_game_pay_way gpw ON gpw.id=o.game_payway_id LEFT JOIN h_pay_way pw ON gpw.pay_way_id=pw.id LEFT JOIN h_pay_merchant pm ON pm.id=gpw.pay_merchant_id " +
+            "WHERE o.id=#{orderId};" +
+            " </script>")
+    OrderComplete info(@Param("orderId") String orderId);
+
+
+//    SELECT
+//    o.*,
+//    o.id as orderId,
+//    o.amount as orderAmount,
+//    u.username as agentAccount,
+//    u.create_time as regTime,
+//    ux.reg_game_id as regGameId,
+//    ux.reg_from as regFrom,
+//    gur.regional_name as regionalName,
+//    gur.role_id as gameRoleId,
+//    gur.role_level as gameLevel,
+//    gur.role_name as gameRole,
+//    gur.role_vip_level as gameVip,
+//    g.`name` as gameName,
+//    gc1.`name` as gameCategory,
+//    g2.`name`as regGameName,
+//    gc2.`name` as regGameCategory,
+//    gpw.pay_way_id as payWayId,
+//    pw.pay_name as payWayName,
+//    pm.merchant_name as merchantName,
+//    pm.merchant_no as merchantNo
+//            FROM
+//    h_order o
+//    LEFT JOIN h_user u ON o.user_id = u.id
+//    LEFT JOIN h_user_ext ux ON u.id = ux.user_id
+//    LEFT JOIN h_game_user_role gur ON gur.role_id = o.role_id
+//    LEFT JOIN h_game g ON g.id = o.game_id
+//    LEFT JOIN h_game_category gc1 ON gc1.id = g.category
+//    LEFT JOIN h_game g2 ON g2.id = ux.reg_game_id = g2.id
+//    LEFT JOIN h_game_category gc2 ON gc2.id = g2.category
+//    LEFT JOIN h_game_pay_way gpw on gpw.id = o.game_payway_id
+//    LEFT JOIN h_pay_way pw ON gpw.pay_way_id = pw.id
+//    LEFT JOIN h_pay_merchant pm ON pm.id = gpw.pay_merchant_id
+//    WHERE o.id = 1;
+}

+ 3 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/CommonParam.java

@@ -4,8 +4,10 @@ import com.fasterxml.jackson.annotation.JsonAlias;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.io.Serializable;
+
 @Data
-public class CommonParam {
+public class CommonParam implements Serializable {
     //==============必须携带相关参数===========
     @ApiModelProperty("token")
     private String token;

+ 9 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/ProductPayParam.java

@@ -3,8 +3,12 @@ package com.zanxiang.sdk.domain.params;
 import com.fasterxml.jackson.annotation.JsonAlias;
 import com.sun.istack.NotNull;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 
 /**
@@ -14,7 +18,10 @@ import java.math.BigDecimal;
  * @date 2022/6/8 15:21
  */
 @Data
-public class ProductPayParam extends CommonParam {
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProductPayParam extends CommonParam implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty("订单id")
@@ -29,6 +36,7 @@ public class ProductPayParam extends CommonParam {
     @NotNull
     private Integer payWay;
 
+
 //    @ApiModelProperty("支付方式 (1:PC,平板 2:Wap 3:App )")
 ////    @NotNull
 //    private Integer payDevice;

+ 9 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/UserData.java

@@ -27,6 +27,11 @@ public class UserData implements Serializable {
      */
     private Integer deviceType;
 
+    /**
+     * 设备类型(android / ios)
+     */
+    private String deviceSystem;
+
     public Long getUserId() {
         if (userId == null) {
             return 1L;
@@ -40,4 +45,8 @@ public class UserData implements Serializable {
         }
         return deviceType;
     }
+
+    public String getDeviceSystem() {
+        return deviceSystem;
+    }
 }

+ 9 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/GameUserRoleService.java

@@ -0,0 +1,9 @@
+package com.zanxiang.sdk.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.mybatis.entity.GameUserRole;
+
+
+public interface GameUserRoleService extends IService<GameUserRole> {
+
+}

+ 13 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/GameUserService.java

@@ -0,0 +1,13 @@
+package com.zanxiang.sdk.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.mybatis.entity.GameUser;
+
+/**
+ * @author : xufeng
+ * @time : 2022-07-06
+ * @description : 玩家游戏
+ */
+public interface GameUserService extends IService<GameUser> {
+
+}

+ 3 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/GamePayWayServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.common.enums.DeleteEnum;
 import com.zanxiang.common.enums.MaxPayLock;
+import com.zanxiang.common.enums.StatusEnum;
 import com.zanxiang.common.utils.StringUtils;
 import com.zanxiang.mybatis.entity.GamePayWay;
 import com.zanxiang.mybatis.mapper.GamePayWayMapper;
@@ -32,8 +33,9 @@ public class GamePayWayServiceImpl extends ServiceImpl<GamePayWayMapper, GamePay
                 .eq(GamePayWay::getGameId, gameId)
                 .eq(GamePayWay::getPayWayId, payType)
                 .eq(GamePayWay::getIsDelete, DeleteEnum.NO.getCode())
-                .eq(GamePayWay::getStatus, DeleteEnum.NO.getCode())
+                .eq(GamePayWay::getStatus, StatusEnum.YES.getCode())
                 .eq(GamePayWay::getMaxPayLock, MaxPayLock.UNLOCK.getCode())
+                .last("limit 1")
                 .orderBy(true, true, GamePayWay::getCreateTime));
         if (payInfo == null)
             throw new RuntimeException("暂无该游戏支付方式 gameId:" + gameId + " payType:" + payType);

+ 22 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/GameUserImpl.java

@@ -0,0 +1,22 @@
+package com.zanxiang.sdk.service.Impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.mybatis.entity.GameUser;
+import com.zanxiang.mybatis.entity.GameUserRole;
+import com.zanxiang.mybatis.mapper.GameUserMapper;
+import com.zanxiang.mybatis.mapper.GameUserRoleMapper;
+import com.zanxiang.sdk.service.GameUserRoleService;
+import com.zanxiang.sdk.service.GameUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author : xufeng
+ * @time : 2022-07-06
+ */
+@Slf4j
+@Service
+public class GameUserImpl extends ServiceImpl<GameUserMapper, GameUser> implements GameUserService {
+
+}

+ 42 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/GameUserRoleImpl.java

@@ -0,0 +1,42 @@
+package com.zanxiang.sdk.service.Impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.common.domain.ResultVo;
+import com.zanxiang.common.enums.ExpireTimeEnum;
+import com.zanxiang.common.enums.HttpStatusEnum;
+import com.zanxiang.common.enums.SmsTypeEnum;
+import com.zanxiang.common.utils.StringUtils;
+import com.zanxiang.mybatis.entity.GameUserRole;
+import com.zanxiang.mybatis.entity.LogPayCp;
+import com.zanxiang.mybatis.mapper.GameUserRoleMapper;
+import com.zanxiang.mybatis.mapper.LogPayCpMapper;
+import com.zanxiang.sdk.common.constant.RedisKeyConstant;
+import com.zanxiang.sdk.common.util.RedisUtil;
+import com.zanxiang.sdk.domain.dto.UserDTO;
+import com.zanxiang.sdk.domain.params.SmsCheckParam;
+import com.zanxiang.sdk.domain.params.SmsSendParam;
+import com.zanxiang.sdk.domain.params.UserData;
+import com.zanxiang.sdk.service.GameUserRoleService;
+import com.zanxiang.sdk.service.SmsService;
+import com.zanxiang.sdk.service.UserService;
+import com.zanxiang.sdk.service.UserTokenService;
+import com.zanxiangnet.module.sms.pojo.SendResult;
+import com.zanxiangnet.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 org.springframework.transaction.annotation.Transactional;
+
+import java.util.Objects;
+import java.util.Random;
+
+/**
+ * @author : xufeng
+ * @time : 2022-07-06
+ */
+@Slf4j
+@Service
+public class GameUserRoleImpl extends ServiceImpl<GameUserRoleMapper, GameUserRole> implements GameUserRoleService {
+
+}

+ 18 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/OrderCompleteServiceImpl.java

@@ -0,0 +1,18 @@
+package com.zanxiang.sdk.service.Impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.mybatis.entity.OrderComplete;
+import com.zanxiang.mybatis.mapper.OrderCompleteMapper;
+import com.zanxiang.sdk.service.OrderCompleteService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 游戏订单全量宽表 服务实现类
+ *
+ * @author xufeng
+ * @date 2022-07-04 11:45
+ */
+@Service
+public class OrderCompleteServiceImpl extends ServiceImpl<OrderCompleteMapper, OrderComplete> implements OrderCompleteService {
+
+}

+ 117 - 78
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/PerformOrderServiceImpl.java

@@ -1,13 +1,18 @@
 package com.zanxiang.sdk.service.Impl;
 
 import com.alipay.easysdk.kernel.util.Signer;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.zanxiang.common.enums.CpStatusEnum;
+import com.zanxiang.common.enums.OrderStateEnum;
 import com.zanxiang.common.enums.ResEnum;
 import com.zanxiang.common.utils.MD5Util;
 import com.zanxiang.common.utils.StringUtils;
 import com.zanxiang.mybatis.entity.*;
 import com.zanxiang.sdk.common.util.HttpUtil;
 import com.zanxiang.sdk.domain.dto.PlatformOrderDTO;
+import com.zanxiang.sdk.domain.mapper.OrderCompleteCreateMapper;
 import com.zanxiang.sdk.service.*;
 import lombok.extern.slf4j.Slf4j;
 import org.slf4j.Logger;
@@ -18,7 +23,10 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
-import java.util.*;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Objects;
+import java.util.TreeMap;
 
 /**
  * 订单履约逻辑
@@ -29,7 +37,7 @@ import java.util.*;
 @Component
 @Slf4j
 @Service
-@Transactional
+@Transactional(rollbackFor = {RuntimeException.class, Exception.class})
 public class PerformOrderServiceImpl implements PerformOrderService {
     protected final Logger logger = LoggerFactory.getLogger(PlatformOrderServiceImpl.class);
 
@@ -39,11 +47,20 @@ public class PerformOrderServiceImpl implements PerformOrderService {
     @Autowired
     private LogPayCpService logPayCpService;
 
+    @Autowired
+    private OrderCompleteCreateMapper orderCompleteMapper;
+
+    @Autowired
+    private GameUserRoleService gameUserRoleService;
+
+    @Autowired
+    private GameUserService gameUserService;
+
     @Autowired
     private UserService userService;
 
     @Autowired
-    private GamePayWayService gamePayWayService;
+    private OrderCompleteService orderCompleteService;
 
     public Boolean pushCp(PlatformOrderDTO orderInfo) {
         if (orderInfo.getCpStatus() == CpStatusEnum.SUCCESS.getCode()) {
@@ -55,7 +72,7 @@ public class PerformOrderServiceImpl implements PerformOrderService {
         String cpPaybackUrl = "https://baidu.com";
 
         HashMap<String, String> map = new HashMap<>();
-        map.put("app_id", orderInfo.getGameId());
+        map.put("app_id", String.valueOf(orderInfo.getGameId()));
         map.put("cp_order_id", orderInfo.getCpOrderId());
         map.put("mem_id", orderInfo.getMgUserId());
         map.put("order_status", String.valueOf(orderInfo.getStatus()));
@@ -101,91 +118,113 @@ public class PerformOrderServiceImpl implements PerformOrderService {
             logPayCpService.save(logPayCp);
         } catch (Exception e) {
             logger.error("订单:{} 通知cp方失败 e:{}", orderId, e);
-            e.printStackTrace();
         }
         return false;
     }
 
     @Override
     public Boolean createOrderComplete(PlatformOrderDTO orderInfo) {
-        OrderComplete orderComplete = new OrderComplete();
-        orderComplete.setOrderId(Long.valueOf(orderInfo.getId()));
-        orderComplete.setGameId(StringUtils.isNotEmpty(orderInfo.getGameId()) ? Long.valueOf(orderInfo.getGameId()) : null);
-        orderComplete.setOrderDate(orderInfo.getCreateTime());
-        orderComplete.setCpOrderId(StringUtils.isNotEmpty(orderInfo.getCpOrderId()) ? orderInfo.getCpOrderId() : "");
-        orderComplete.setMerchantOrderNo(orderInfo.getMerchantOrderNo());
-        orderComplete.setUserId(StringUtils.isNotEmpty(orderInfo.getUserId()) ? Long.valueOf(orderInfo.getUserId()) : null);
-        orderComplete.setCpId(StringUtils.isNotEmpty(orderInfo.getCpId()) ? Long.valueOf(orderInfo.getCpId()) : null);
-        orderComplete.setProductId(orderInfo.getProductId());
-        orderComplete.setProductName(orderInfo.getProductName());
-        orderComplete.setOrderAmount(orderInfo.getAmount());
-        orderComplete.setRealAmount(orderInfo.getRealAmount());
-        orderComplete.setIsSwitch(orderInfo.getIsSwitch());
-        orderComplete.setPayTime(orderInfo.getPayTime());
-        orderComplete.setLastCpNotifyTime(orderInfo.getLastCpNotifyTime());
-        orderComplete.setStatus(orderInfo.getStatus());
-        orderComplete.setCpStatus(orderInfo.getCpStatus());
-        orderComplete.setIsDelete(orderInfo.getIsDelete());
-        orderComplete.setChannel(orderInfo.getChannel());
-        orderComplete.setCreateTime(orderInfo.getCreateTime());
-        orderComplete.setEndTime(orderInfo.getEndTime());
-        orderComplete.setPayDevice(orderInfo.getPayDevice());
-
-        /*-------支付那一刻系统------*/
-        orderComplete.setFromDevice(orderInfo.getFromDevice());
-
-
-        //todo 获取游戏信息
-        orderComplete.setGameName("");
-        orderComplete.setGameCategory("");
-        orderComplete.setGameRegional("");
-        orderComplete.setGameRole("");
-        orderComplete.setGameLevel("");
-        orderComplete.setGameVip("");
-
-        //todo 获取玩家账号信息
-        orderComplete.setUserAccount("");
-        orderComplete.setUserRegisterTime(new Date());
-        orderComplete.setUserRegisterGameId(0L);
-        orderComplete.setUserRegisterGame("");
-        orderComplete.setUserRegisterGameCategory("");
-        orderComplete.setUserRegisterChannel("");
-
-        if (StringUtils.isNotEmpty(orderInfo.getUserId())) {
-            User userInfo = userService.getById(orderInfo.getUserId());
-            if (!Objects.isNull(userInfo)) {
-                orderComplete.setUserAccount(userInfo.getUsername());
+        try {
+            OrderComplete orderComplete = orderCompleteMapper.info(orderInfo.getId());
+            orderComplete.setOrderDate(orderInfo.getCreateTime());
+            //todo 推广相关信息
+            orderComplete.setAgentId("");
+            orderComplete.setAgentAccount("");
+            orderComplete.setAgentMedia("");
+            orderComplete.setAgentAdvert("");
+
+            //todo 广告通知状态
+            orderComplete.setAdvertNotifyStatus(0);
+            orderComplete.setAdvertNotifyType(0);
+
+            OrderComplete complete = orderCompleteService.getOne(new LambdaQueryWrapper<OrderComplete>().eq(OrderComplete::getOrderId, orderInfo.getId()));
+            if (Objects.isNull(complete)) {
+                orderCompleteMapper.insert(orderComplete);
+                logger.info("订单:{} 生成宽表数据成功", orderInfo.getId());
+            } else {
+                OrderComplete pa = new OrderComplete();
+                pa.setOrderId(complete.getOrderId());
+                orderCompleteService.update(pa, new UpdateWrapper<OrderComplete>().setEntity(orderComplete));
+                logger.info("订单:{} 宽表数据更新成功", orderInfo.getId());
             }
+            return true;
+        } catch (Exception e) {
+            logger.error("订单:{} 生成宽表数据失败 e:{}", orderInfo.getId(), e);
         }
+        return false;
+    }
 
-        //todo 推广相关信息
-        orderComplete.setAgentId("");
-        orderComplete.setAgentAccount("");
-        orderComplete.setAgentMedia("");
-        orderComplete.setAgentAdvert("");
-
-
-        //todo 支付相关信息
-        orderComplete.setPayWayId("");
-        orderComplete.setPayWay("");
-        orderComplete.setMerchantNo("");
-        orderComplete.setMerchantName("");
-        if (StringUtils.isNotEmpty(orderInfo.getGamePaywayId())) {
-            GamePayWay gamePayWay = gamePayWayService.getInfo(orderInfo.getGamePaywayId());
-            if (!Objects.isNull(gamePayWay)) {
-                orderComplete.setPayWayId(gamePayWay.getPayWayId() > 0 ? String.valueOf(gamePayWay.getPayWayId()) : null);
-                orderComplete.setPayWay(gamePayWay.getPayWayName());
+    @Override
+    public Boolean checkIsFirstRecharge(PlatformOrderDTO orderInfo) {
+        try {
+            Order one = platformOrderService.getOne(new QueryWrapper<Order>().lambda().eq(Order::getUserId, orderInfo.getUserId()).ne(Order::getId, orderInfo.getId()).last("limit 1"));
+            if (Objects.isNull(one)) {
+                Order order = new Order();
+                order.setId(order.getId());
+                order.setIsFirstRecharge(1);
+                platformOrderService.updateById(order);
+                logger.info("订单:{} 验证订单是否为首充成功", orderInfo.getId());
+                return true;
             }
+        } catch (Exception e) {
+            logger.error("订单:{} 验证订单是否为首充失败 e:{}", orderInfo.getId(), e);
         }
+        return true;
+    }
 
-
-        //todo 是否首充单独更新
-        orderComplete.setIsFirstRecharge(0);
-
-        //todo 广告通知状态
-        orderComplete.setAdvertNotifyStatus(0);
-        orderComplete.setAdvertNotifyType(0);
-
-        return null;
+    @Override
+    public Boolean userRechargeTotal(PlatformOrderDTO orderInfo) {
+        try {
+            //订单取消情况 做减法
+            float amount = orderInfo.getAmount().floatValue();
+            int num = 1;
+            if (orderInfo.getStatus().equals(OrderStateEnum.CANCEL.getCode())) {
+                amount = -amount;
+                num = -1;
+            }
+            //游戏用户角色统计更新
+            if (StringUtils.isNotEmpty(orderInfo.getRoleId())) {
+                GameUserRole gameUserRole = new GameUserRole();
+                gameUserRole.setRoleId(orderInfo.getRoleId());
+                gameUserRoleService.update(gameUserRole, new UpdateWrapper<GameUserRole>().lambda()
+                        .set(GameUserRole::getLastRechargeTime, orderInfo.getPayTime())
+                        .setSql("recharge_count=recharge_count+" + num)
+                        .setSql("recharge_money=recharge_money+" + amount)
+                        .setEntity(gameUserRole)
+                );
+            } else {
+                logger.info("订单:{} 用户玩家角色RoleId为空,不进行gameUserRole充值统计汇总", orderInfo.getId());
+            }
+            //游戏用户统计更新
+            if (StringUtils.isNotEmpty(orderInfo.getMgUserId())) {
+                GameUser gameUser = new GameUser();
+                gameUser.setId(Long.valueOf(orderInfo.getMgUserId()));
+                gameUserService.update(gameUser, new UpdateWrapper<GameUser>().lambda()
+                        .set(GameUser::getLastRechargeTime, orderInfo.getPayTime())
+                        .setSql("recharge_count=recharge_count+" + num)
+                        .setSql("recharge_money=recharge_money+" + amount)
+                        .setEntity(gameUser)
+                );
+            } else {
+                logger.info("订单:{} 用户玩家MgUserId为空,不进行gameUser充值统计汇总", orderInfo.getId());
+            }
+            //用户统计更新
+            if (StringUtils.isNotEmpty(orderInfo.getUserId())) {
+                User user = new User();
+                user.setId(Long.valueOf(orderInfo.getUserId()));
+                userService.update(user, new UpdateWrapper<User>().lambda()
+                        .set(User::getLastRechargeTime, orderInfo.getPayTime())
+                        .setSql("recharge_count=recharge_count+" + num)
+                        .setSql("recharge_money=recharge_money+" + amount)
+                        .setEntity(user)
+                );
+            } else {
+                logger.info("订单:{} 用户UserId为空,不进行User充值统计汇总", orderInfo.getId());
+            }
+            return true;
+        } catch (Exception e) {
+            logger.error("订单:{} 用户充值统计逻辑操作失败 e:{}", orderInfo.getId(), e);
+        }
+        return false;
     }
 }

+ 2 - 8
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/PlatformOrderServiceImpl.java

@@ -34,6 +34,7 @@ import java.util.Date;
 @Component
 @Slf4j
 @Service
+@Transactional(rollbackFor = {Exception.class, RuntimeException.class})
 public class PlatformOrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements PlatformOrderService {
     protected final Logger logger = LoggerFactory.getLogger(PlatformOrderServiceImpl.class);
 
@@ -43,9 +44,7 @@ public class PlatformOrderServiceImpl extends ServiceImpl<OrderMapper, Order> im
     @Autowired
     private ApplicationContext applicationContext;
 
-    @Transactional(rollbackFor = Exception.class)
     @Override
-
     public String create(PlatformOrderBO platformOrderBO) {
         try {
             logger.info("生成订单请求参数 platformOrderBO:{}", platformOrderBO);
@@ -56,12 +55,10 @@ public class PlatformOrderServiceImpl extends ServiceImpl<OrderMapper, Order> im
             }
         } catch (Exception e) {
             logger.error("生成订单失败 platformOrderBO:{}, error:{}", platformOrderBO, e);
-            e.printStackTrace();
         }
         return null;
     }
 
-    @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean pay(PlatformOrderBO platformOrderBO) {
         logger.info("订单支付请求参数 platformOrderBO:{}", platformOrderBO);
@@ -84,14 +81,12 @@ public class PlatformOrderServiceImpl extends ServiceImpl<OrderMapper, Order> im
                 return true;
             }
             return false;
-        } catch (ParameterResolutionException e) {
+        } catch (Exception e) {
             logger.error("订单支付失败 platformOrderBO:{}, error:{}", platformOrderBO, e);
-            e.printStackTrace();
             return false;
         }
     }
 
-    @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean cancel(PlatformOrderBO platformOrderBO) {
         logger.info("订单支付取消请求参数 platformOrderBO:{}", platformOrderBO);
@@ -106,7 +101,6 @@ public class PlatformOrderServiceImpl extends ServiceImpl<OrderMapper, Order> im
             return updateById(order);
         } catch (Exception e) {
             logger.error("订单取消失败 platformOrderBO:{}, error:{}", platformOrderBO, e);
-            e.printStackTrace();
             return false;
         }
     }

+ 21 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/UserExtServiceImpl.java

@@ -0,0 +1,21 @@
+package com.zanxiang.sdk.service.Impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.mybatis.entity.UserExt;
+import com.zanxiang.mybatis.mapper.UserExtMapper;
+import com.zanxiang.sdk.service.UserExtService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author : xufeng
+ * @time : 2022-07-06
+ * @description : 玩家拓展信息
+ */
+@Slf4j
+@Service
+public class UserExtServiceImpl extends ServiceImpl<UserExtMapper, UserExt> implements UserExtService {
+
+
+}

+ 2 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/UserLoginLogServiceImpl.java

@@ -1,6 +1,7 @@
 package com.zanxiang.sdk.service.Impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.common.utils.StringUtils;
 import com.zanxiang.mybatis.entity.User;
 import com.zanxiang.mybatis.entity.UserLoginLog;
 import com.zanxiang.mybatis.mapper.UserLoginLogMapper;
@@ -35,7 +36,7 @@ public class UserLoginLogServiceImpl extends ServiceImpl<UserLoginLogMapper, Use
                 .fromDevice(user.getFromDevice())
                 .deviceId(user.getDeviceId())
                 .loginIp(realIp)
-                .gameId(gameId)
+                .gameId(StringUtils.isNotEmpty(gameId) ? Long.valueOf(gameId) : null)
                 .loginTime(LocalDateTime.now())
                 .build();
         super.save(userLoginLog);

+ 74 - 7
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/pay/AlipayServiceImpl.java

@@ -9,7 +9,9 @@ import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
 import com.alipay.easysdk.payment.wap.models.AlipayTradeWapPayResponse;
 import com.zanxiang.common.domain.ResultMap;
 import com.zanxiang.common.enums.HttpStatusEnum;
+import com.zanxiang.common.enums.OsEnum;
 import com.zanxiang.common.enums.ResEnum;
+import com.zanxiang.sdk.common.util.HttpUtil;
 import com.zanxiang.sdk.domain.bo.ProductPayParamBO;
 import com.zanxiang.sdk.service.OrderPayService;
 import lombok.extern.slf4j.Slf4j;
@@ -21,10 +23,13 @@ import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.net.URLEncoder;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * @author xufeng
@@ -42,6 +47,8 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
     @Value("payConfig.alipay.notifyUrl")
     private String notifyUrl;
 
+    private Config config;
+
     /**
      * 支付调起
      *
@@ -49,7 +56,6 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
      * @return
      */
     @Override
-
     public ResultMap create(ProductPayParamBO product) {
         this.attach = product.getAttach();
         configInit(getPayConfig(product.getGameId(), product.getPayWay(), product.getPayWay()));
@@ -64,7 +70,7 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
             case 1:
                 return this.pc(product);
             case 2:
-                return this.mobile(product);
+                return this.mobile2(product);
             case 3:
                 return this.app(product);
             default:
@@ -82,7 +88,7 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
     @Override
     public String notify(HttpServletRequest request, HttpServletResponse response) {
         try {
-            Map<String, String> params = new HashMap<>();
+            Map<String, String> params = new HashMap<String, String>();
             Enumeration<String> parameterNames = request.getParameterNames();
             while (parameterNames.hasMoreElements()) {
                 String parameterName = parameterNames.nextElement();
@@ -118,7 +124,7 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
     public ResultMap synNotify(HttpServletRequest request) {
         try {
             //获取支付宝GET过来反馈信息
-            Map<String, String> params = new HashMap<>();
+            Map<String, String> params = new HashMap<String, String>();
             Map<String, String[]> requestParams = request.getParameterMap();
             for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
                 String name = iter.next();
@@ -173,16 +179,76 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
                     .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee(), "", this.returnUrl);
             logger.info("mobile端支付生成,result:{}", response);
             if (ResponseChecker.success(response)) {
+                System.out.println("mobile端支付生成================");
+                System.out.println(response.getBody());
                 return ResultMap.ok(product.getPayDevice(), response.getBody());
             } else {
                 return ResultMap.ok(ResEnum.FAIL.getMsg());
             }
         } catch (Exception e) {
-            e.printStackTrace();
             return ResultMap.error(ResEnum.FAIL.getMsg());
         }
     }
 
+    private ResultMap mobile2(ProductPayParamBO product) {
+        try {
+            logger.info("mobile端支付生成,请求参数 bo:{}", product);
+            AlipayTradeWapPayResponse response = Factory.Payment
+                    .Wap().asyncNotify(notifyUrl)
+                    .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee(), "", this.returnUrl);
+            logger.info("mobile端支付生成,result:{}", response);
+            if (ResponseChecker.success(response)) {
+                HashMap<String, String> result = new HashMap<>();
+                String body = response.getBody();
+                result.put("fromData", body);
+                //安卓与ios系统时才单独获取app支付地址
+                if (product.getDeviceSystem().contains(OsEnum.SYSTEM_ANDROID.getOs()) || product.getDeviceSystem().contains(OsEnum.SYSTEM_IOS.getOs())) {
+                    Pattern pattern = Pattern.compile("action=\"(.*)\">", Pattern.CASE_INSENSITIVE);
+                    Matcher matcher = pattern.matcher(body);
+                    if (matcher.find()) {
+                        String url = matcher.group();
+                        url = url.substring(8, url.length() - 2);
+                        System.out.println(url);
+                        Pattern param = Pattern.compile("value=\"(.*)\">", Pattern.CASE_INSENSITIVE);
+                        Matcher paraMatcher = param.matcher(body);
+                        if (paraMatcher.find()) {
+                            String paramData = paraMatcher.group();
+                            paramData = paramData.substring(7, paramData.length() - 2);
+                            paramData = paramData.replace("&quot;", "\"");
+                            String mobileClientUrl = HttpUtil.postDataUrl(url, "biz_content=" + paramData, null);
+                            System.out.println(mobileClientUrl);
+                            String alipayContentBody = HttpUtil.postData(mobileClientUrl, "");
+                            Pattern mobileClientParam = Pattern.compile("\\{\"queryResultUrl\".*?\"}", Pattern.CASE_INSENSITIVE);
+                            Matcher mobileClientMatcher = mobileClientParam.matcher(alipayContentBody);
+                            System.out.println(mobileClientMatcher);
+                            String deeplink_android = "alipays://platformapi/startApp?appId=20000125&orderSuffix=";
+                            String deeplink_ios = "alipay://alipayclient/?";
+                            if (mobileClientMatcher.find()) {
+                                //示例:{"queryResultUrl":"/h5/h5RoutePayResultQuery.json?h5_route_token=GZ00rxXoidjHj2airAK8nhYz70MUBsmobilecashierGZ00","invokeAlipayData":{"dataString":"h5_route_token=\"GZ00rxXoidjHj2airAK8nhYz70MUBsmobilecashierGZ00\"&is_h5_route=\"true\""}
+                                String pageData = mobileClientMatcher.group() + "}";
+                                JSONObject jsonObject = JSONObject.parseObject(pageData);
+                                Object invokeAlipayData = jsonObject.get("invokeAlipayData");
+                                String dataString = JSONObject.parseObject(invokeAlipayData.toString()).get("dataString").toString();
+                                deeplink_android += URLEncoder.encode(dataString, "utf-8");
+                                deeplink_ios += URLEncoder.encode(pageData, "utf-8");
+                                if (product.getDeviceSystem().contains(OsEnum.SYSTEM_ANDROID.getOs())) {
+                                    result.put("appLink", deeplink_android);
+                                } else {
+                                    result.put("appLink", deeplink_ios);
+                                }
+                            }
+                        }
+                    }
+                }
+                return ResultMap.ok(product.getPayDevice(), result);
+            }
+        } catch (
+                Exception e) {
+            return ResultMap.error(ResEnum.FAIL.getMsg());
+        }
+        return ResultMap.error(ResEnum.FAIL.getMsg());
+    }
+
     /**
      * 电脑支付
      *
@@ -194,6 +260,7 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
             logger.info("pc端支付生成,请求参数 bo:{}", product);
             AlipayTradePagePayResponse response = Factory.Payment
                     .Page().asyncNotify(notifyUrl)
+                    .optional("goods_detail", "1")
                     .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee(), this.returnUrl);
             logger.info("pc端支付生成,result:{}", response);
             if (ResponseChecker.success(response)) {
@@ -203,7 +270,6 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
             }
         } catch (Exception e) {
             logger.error("pc端支付生成异常 e:{}", e);
-            e.printStackTrace();
             return ResultMap.error(ResEnum.FAIL.getMsg());
         }
     }
@@ -239,5 +305,6 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
     public void configInit(String obj) {
         Config config = JSONObject.parseObject(obj, Config.class);
         Factory.setOptions(config);
+        this.config = config;
     }
-}
+}

+ 5 - 4
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/pay/PayService.java

@@ -62,15 +62,16 @@ public class PayService {
         try {
             //获取订单信息
             PlatformOrderDTO info = platformOrderService.info(product.getOutTradeNo(), product.getUserId());
-            if (info == null)
+            if (info == null) {
                 throw new RuntimeException("订单不存在");
-
+            }
+            String gameId = String.valueOf(info.getGameId());
             //根据订单中游戏id,获取游戏的支付方式
-            GamePayWay payInfo = gamePayWayService.getPayWayToOrderPay(info.getGameId(), product.getPayWay());
+            GamePayWay payInfo = gamePayWayService.getPayWayToOrderPay(gameId, product.getPayWay());
 
             product.setProductId(info.getProductId());
             product.setSubject(info.getProductName());
-            product.setGameId(info.getGameId());
+            product.setGameId(gameId);
             product.setTotalFee(String.valueOf(info.getAmount()));
             product.setOutTradeNo(info.getId());
             product.setFrontUrl("");

+ 13 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/OrderCompleteService.java

@@ -0,0 +1,13 @@
+package com.zanxiang.sdk.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.mybatis.entity.OrderComplete;
+
+/**
+ * 游戏订单全量宽表 服务类接口
+ *
+ * @author xufeng
+ * @date 2022-07-04 11:45
+ */
+public interface OrderCompleteService extends IService<OrderComplete> {
+}

+ 16 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/PerformOrderService.java

@@ -24,4 +24,20 @@ public interface PerformOrderService {
      * @return
      */
     Boolean createOrderComplete(PlatformOrderDTO orderInfo);
+
+    /**
+     * 检查订单是否为首单(账号首充)
+     *
+     * @param orderInfo
+     * @return
+     */
+    Boolean checkIsFirstRecharge(PlatformOrderDTO orderInfo);
+
+    /**
+     * 更新游戏玩家充值统计
+     *
+     * @param orderInfo
+     * @return
+     */
+    Boolean userRechargeTotal(PlatformOrderDTO orderInfo);
 }

+ 13 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/UserExtService.java

@@ -0,0 +1,13 @@
+package com.zanxiang.sdk.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.mybatis.entity.UserExt;
+
+/**
+ * @author : xufeng
+ * @time : 2022-07-06
+ * @description : 玩家拓展信息
+ */
+public interface UserExtService extends IService<UserExt> {
+
+}

+ 2 - 1
game-module/game-sdk/src/main/resources/META-INF/spring.factories

@@ -1,3 +1,4 @@
 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
   com.zanxiang.common.handler.GlobalExceptionHandler,\
-  com.zanxiang.common.utils.SpringUtils
+  com.zanxiang.common.utils.SpringUtils,\
+  com.zanxiang.sdk.common.listener.OrderPaySuccessListener

+ 8 - 1
game-module/game-sdk/src/main/resources/bootstrap.yml

@@ -3,7 +3,10 @@ server:
   shutdown: graceful
   port: 8091
   domain: http://localhost:8091
-#  servlet:
+
+  servlet:
+    encoding:
+      charset: UTF-8
 #    context-path: /game-manage
 
 # Spring
@@ -69,3 +72,7 @@ payConfig:
   alipay:
     returnUrl: http://localhost:8091/pay/alipaySynNotify
     notifyUrl: http://localhost:8091/pay/notify
+
+
+
+

+ 1 - 1
game-module/game-sdk/src/test/java/com/zanxiang/sdk/OrderTests.java

@@ -38,7 +38,7 @@ public class OrderTests extends SDKApplicationTests {
         bo.setCpOrderId("cp00001");
         bo.setUserId("1");
         bo.setMgUserId("1");
-        bo.setGameId("1");
+        bo.setGameId(1L);
         bo.setAmount(new BigDecimal("0.01"));
         bo.setProductId("cs0001");
         bo.setProductCnt(1);

+ 1 - 0
game-module/pom.xml

@@ -11,6 +11,7 @@
 
     <artifactId>game-module</artifactId>
     <packaging>pom</packaging>
+
     <modules>
         <module>game-manage</module>
         <module>game-sdk</module>