Browse Source

feat : 用户分享

bilingfeng 2 years ago
parent
commit
5cc2352ab5

+ 53 - 0
game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/entity/UserShare.java

@@ -0,0 +1,53 @@
+package com.zanxiang.mybatis.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-01-16
+ * @description : 用户分享记录
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString
+@Builder
+@TableName("t_user_share")
+public class UserShare {
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 游戏ID
+     */
+    private Long gameId;
+
+    /**
+     * 分享人id
+     */
+    private Long fromUserId;
+
+    /**
+     * 被分享人id
+     */
+    private Long toUserId;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}

+ 12 - 0
game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/mapper/UserShareMapper.java

@@ -0,0 +1,12 @@
+package com.zanxiang.mybatis.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zanxiang.mybatis.entity.UserShare;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-01-16
+ * @description : ${description}
+ */
+public interface UserShareMapper extends BaseMapper<UserShare> {
+}

+ 13 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/UserController.java

@@ -4,6 +4,7 @@ import com.zanxiang.common.domain.ResultVO;
 import com.zanxiang.sdk.annotation.ValidLogin;
 import com.zanxiang.sdk.domain.params.*;
 import com.zanxiang.sdk.domain.vo.CustomerVO;
+import com.zanxiang.sdk.domain.vo.GameShareVO;
 import com.zanxiang.sdk.domain.vo.UserLoginVO;
 import com.zanxiang.sdk.domain.vo.UserVO;
 import com.zanxiang.sdk.service.GameUserRoleService;
@@ -36,6 +37,18 @@ public class UserController {
     @Autowired
     private GameUserRoleService gameUserRoleService;
 
+    @ApiOperation(value = "游戏分享信息")
+    @PostMapping("/share/game")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = GameShareVO.class)})
+    public ResultVO<GameShareVO> shareGame(UserData userData) {
+        GameShareVO shareVO = GameShareVO.builder()
+                .title("这是一个测试分享标题")
+                .shareImg("https://book.zanxiangnet.com/qc-tip/1.jpg")
+                .path("pages/index/index")
+                .build();
+        return ResultVO.ok(shareVO);
+    }
+
     @ApiOperation(value = "忘记密码找回")
     @PostMapping("/find/password")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})

+ 2 - 7
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/dto/PlatformOrderDTO.java

@@ -142,7 +142,7 @@ public class PlatformOrderDTO {
     /**
      * 支付配置id
      */
-    private Long gamePaywayId;
+    private Long gamePayWayId;
 
     /**
      * 支付时间
@@ -214,15 +214,10 @@ public class PlatformOrderDTO {
      */
     private Integer isFirstRecharge;
 
-    /**
-     * 操作系统
-     */
-    private String fromDevice;
-
     /**
      * 支付类型, 1:PC, 2: h5支付, 3: App支付, 4: 小程序支付, 5: 米大师支付
      */
-    private Integer payDevice;
+    private Long payDeviceId;
 
     /**
      * 创建时间

+ 6 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/LoginVxCodeParam.java

@@ -19,4 +19,10 @@ public class LoginVxCodeParam {
     @ApiModelProperty(notes = "微信授权code")
     @NotBlank(message = "微信授权code不可为空")
     private String code;
+
+    /**
+     * 分享用户id
+     */
+    @ApiModelProperty(notes = "分享用户id")
+    private Long shareUserId;
 }

+ 37 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/vo/GameShareVO.java

@@ -0,0 +1,37 @@
+package com.zanxiang.sdk.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-01-16
+ * @description : 游戏分享信息
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class GameShareVO {
+
+    /**
+     * 分享标题
+     */
+    @ApiModelProperty(notes = "分享标题")
+    private String title;
+
+    /**
+     * 分享图片
+     */
+    @ApiModelProperty(notes = "分享图片")
+    private String shareImg;
+
+    /**
+     * 游戏路径
+     */
+    @ApiModelProperty(notes = "游戏路径")
+    private String path;
+}

+ 2 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/listener/OrderPaySuccessListener.java

@@ -52,11 +52,12 @@ public class OrderPaySuccessListener {
         performOrderService.pushCp(orderInfo);
         //用户充值统计更新
         performOrderService.userRechargeTotal(orderInfo);
+        //用户首冲统计
+        performOrderService.checkIsFirstRecharge(orderInfo);
         //商户号额度统计更新
         performOrderService.payMerchantTotal(orderInfo);
         //订单回传
         callBackService.orderCallBack(orderInfo);
-
         log.info("订单:{} 支付成功履约监听逻辑 ------end---------", event.getOrderId());
     }
 }

+ 51 - 22
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/LoginServiceImpl.java

@@ -12,9 +12,11 @@ import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.mybatis.entity.GameExt;
 import com.zanxiang.mybatis.entity.User;
 import com.zanxiang.mybatis.entity.UserCard;
+import com.zanxiang.mybatis.entity.UserShare;
 import com.zanxiang.sdk.constant.ApiUrlConstant;
 import com.zanxiang.sdk.constant.RedisKeyConstant;
 import com.zanxiang.sdk.domain.dto.GameAppletDTO;
+import com.zanxiang.sdk.domain.dto.UserDTO;
 import com.zanxiang.sdk.domain.dto.UserOauthDTO;
 import com.zanxiang.sdk.domain.params.*;
 import com.zanxiang.sdk.domain.vo.UserLoginVO;
@@ -99,6 +101,9 @@ public class LoginServiceImpl implements RegisterLoginService {
     @Autowired
     private WxApiService wxApiService;
 
+    @Autowired
+    private UserShareService userShareService;
+
     /**
      * QQ开发者应用id
      */
@@ -119,6 +124,7 @@ public class LoginServiceImpl implements RegisterLoginService {
      * @return : 返回用户登录信息
      */
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public ResultVO<UserLoginVO> loginWxCode(LoginVxCodeParam param, UserData userData) {
         //验证登录ip是否封禁
         if (ipBanService.checkIpBan(userData.getIp())) {
@@ -131,32 +137,55 @@ public class LoginServiceImpl implements RegisterLoginService {
         //根据openId查询用户
         User user = userService.getOne(new LambdaQueryWrapper<User>()
                 .eq(User::getGameId, userData.getGameId()).eq(User::getOpenId, openId));
-        if (user == null) {
-            user = User.builder()
-                    .agentId(promoChannelService.getAgentIdByChannel(userData.getChannel()))
-                    .gameId(userData.getGameId())
-                    .username(openId)
-                    .nickname(RegisterUtil.randomNickName(openId))
-                    .openId(openId)
-                    .deviceType(userData.getDeviceType())
-                    .status(BanStatusEnum.NORMAL_STATUS.getStatus())
-                    .authentication(0)
-                    .createTime(LocalDateTime.now())
-                    .updateTime(LocalDateTime.now())
-                    .deviceSystem(userData.getDeviceSystem())
-                    .mac(userData.getMac())
-                    .imei(userData.getImei())
-                    .androidId(userData.getAndroidId())
-                    .ip(userData.getIp())
-                    .build();
-            userService.save(user);
-            gameUserService.createGameUser(user);
-            callBackService.userCallBack(user);
-        } else {
+        //用户已经注册
+        if (user != null) {
             //判断账号是否停用
             if (Objects.equals(BanStatusEnum.BAN_STATUS.getStatus(), user.getStatus())) {
                 return new ResultVO<>(HttpStatusEnum.ACCOUNT_HALT);
             }
+            //返回登录信息
+            return new ResultVO<>(this.createUserLoginVO(user, userData));
+        }
+        //渠道标识
+        Long agentId;
+        Long fromUserId = null;
+        if (param.getShareUserId() == null) {
+            agentId = promoChannelService.getAgentIdByChannel(userData.getChannel());
+        } else {
+            UserDTO userDTO = userService.getUserByUserId(param.getShareUserId());
+            agentId = userDTO.getAgentId();
+            fromUserId = userDTO.getId();
+        }
+        //构造用户信息
+        user = User.builder()
+                .agentId(agentId)
+                .gameId(userData.getGameId())
+                .username(openId)
+                .nickname(RegisterUtil.randomNickName(openId))
+                .openId(openId)
+                .deviceType(userData.getDeviceType())
+                .status(BanStatusEnum.NORMAL_STATUS.getStatus())
+                .authentication(0)
+                .createTime(LocalDateTime.now())
+                .updateTime(LocalDateTime.now())
+                .deviceSystem(userData.getDeviceSystem())
+                .mac(userData.getMac())
+                .imei(userData.getImei())
+                .androidId(userData.getAndroidId())
+                .ip(userData.getIp())
+                .build();
+        userService.save(user);
+        gameUserService.createGameUser(user);
+        callBackService.userCallBack(user);
+        if (fromUserId != null) {
+            UserShare userShare = UserShare.builder()
+                    .gameId(userData.getGameId())
+                    .fromUserId(fromUserId)
+                    .toUserId(user.getId())
+                    .createTime(LocalDateTime.now())
+                    .updateTime(LocalDateTime.now())
+                    .build();
+            userShareService.save(userShare);
         }
         //返回登录信息
         return new ResultVO<>(this.createUserLoginVO(user, userData));

+ 1 - 7
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/OrderServiceImpl.java

@@ -108,11 +108,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
         }
         //生成订单id
         String orderNum = this.getOrderNum(userData.getUserId());
-        //用户已有订单数
-        int count = super.count(new LambdaQueryWrapper<Order>()
-                .eq(Order::getGameId, gameId)
-                .eq(Order::getUserId, userId)
-                .eq(Order::getStatus, OrderStateEnum.SUCCESS.getCode()));
         //构造订单
         super.save(Order.builder()
                 .orderId(orderNum)
@@ -131,8 +126,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                 .productName(payParam.getProductName())
                 .gamePayWayId(gamePayWayDTO.getId())
                 .ext(payParam.getExtension())
-                .isFirstRecharge(count > 0 ? 0 : 1)
-                .payDeviceId(payParam.getPayDevice())
+                .payDeviceId(gamePayWayDTO.getPayDeviceId())
                 .createTime(LocalDateTime.now())
                 .updateTime(LocalDateTime.now())
                 .username(user.getUsername())

+ 33 - 59
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/PerformOrderServiceImpl.java

@@ -1,7 +1,6 @@
 package com.zanxiang.sdk.service.Impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.zanxiang.common.enums.CpStatusEnum;
@@ -12,7 +11,7 @@ import com.zanxiang.common.utils.StringUtils;
 import com.zanxiang.common.utils.URIUtil;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.mybatis.entity.*;
-import com.zanxiang.sdk.domain.dto.GamePayWayDTO;
+import com.zanxiang.sdk.domain.dto.PayMerchantDTO;
 import com.zanxiang.sdk.domain.dto.PlatformOrderDTO;
 import com.zanxiang.sdk.domain.result.PushCpResult;
 import com.zanxiang.sdk.service.*;
@@ -26,7 +25,6 @@ import org.springframework.web.client.RestTemplate;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
@@ -57,9 +55,6 @@ public class PerformOrderServiceImpl implements PerformOrderService {
     @Autowired
     private UserService userService;
 
-    @Autowired
-    private GamePayWayService gamePayWayService;
-
     @Autowired
     private PayMerchantService payMerchantService;
 
@@ -150,25 +145,24 @@ public class PerformOrderServiceImpl implements PerformOrderService {
     }
 
     @Override
-    public Boolean checkIsFirstRecharge(PlatformOrderDTO orderInfo) {
-        log.info("订单:{} 检查更新用户是否为首充 ----------start---------", orderInfo.getOrderId());
+    public Boolean checkIsFirstRecharge(PlatformOrderDTO platformOrderDTO) {
+        log.info("订单:{} 检查更新用户是否为首充 ----------start---------", platformOrderDTO.getOrderId());
         try {
-            Order one = orderService.getOne(new QueryWrapper<Order>().lambda()
-                    .eq(Order::getUserId, orderInfo.getUserId())
+            int count = orderService.count(new LambdaQueryWrapper<Order>()
+                    .eq(Order::getUserId, platformOrderDTO.getUserId())
                     .eq(Order::getStatus, OrderStateEnum.SUCCESS.getCode())
-                    .ne(Order::getOrderId, orderInfo.getOrderId()).last("limit 1"));
-            if (Objects.isNull(one)) {
-                Order order = new Order();
-                order.setOrderId(order.getOrderId());
-                order.setIsFirstRecharge(1);
-                orderService.updateById(order);
-                log.info("订单:{} 验证订单是否为首充成功", orderInfo.getOrderId());
-                return true;
+                    .ne(Order::getOrderId, platformOrderDTO.getOrderId()));
+            if (count <= 0) {
+                orderService.update(new LambdaUpdateWrapper<Order>()
+                        .set(Order::getIsFirstRecharge, 1)
+                        .eq(Order::getOrderId, platformOrderDTO.getOrderId()));
+                log.info("订单:{} 验证订单是否为首充成功", platformOrderDTO.getOrderId());
+                return Boolean.TRUE;
             }
         } catch (Exception e) {
-            log.error("订单:{} 验证订单是否为首充失败 e:{}", orderInfo.getOrderId(), e);
+            log.error("订单:{} 验证订单是否为首充失败 e:{}", platformOrderDTO.getOrderId(), e);
         }
-        return true;
+        return Boolean.FALSE;
     }
 
     @Override
@@ -229,43 +223,22 @@ public class PerformOrderServiceImpl implements PerformOrderService {
     }
 
     @Override
-    public Boolean payMerchantTotal(PlatformOrderDTO orderInfo) {
-        log.info("订单:{} 更新商户号统计 ----------start---------", orderInfo.getOrderId());
+    public Boolean payMerchantTotal(PlatformOrderDTO platformOrderDTO) {
+        log.info("订单:{} 更新商户号统计 ----------start---------", platformOrderDTO.getOrderId());
         try {
-            if (orderInfo.getGamePaywayId() == null) {
-                log.error("订单:{} 更新商户号统计时,该订单GamePaywayId为空", orderInfo.getOrderId());
-                return false;
-            }
-//            GamePayWay gamePayWayInfo = gamePayWayService.getInfo(String.valueOf(orderInfo.getGamePaywayId()));
-
-
-            GamePayWayDTO gamePayWayDTO = gamePayWayService.getById(orderInfo.getGamePaywayId());
-
-            if (Objects.isNull(gamePayWayDTO)) {
-                log.error("订单:{} 更新商户号统计时,获取GamePayway表id:{}信息为空", orderInfo.getOrderId(), orderInfo.getGamePaywayId());
-                return false;
-            }
-            //todo : 商户统计要修改
-//            if (gamePayWayInfo.getPayMerchantId() <= 0) {
-//                log.error("订单:{} 更新商户号统计时,获取GamePayway表id:{}信息中PayMerchantId为空", orderInfo.getOrderId(), orderInfo.getGamePaywayId());
-//                return false;
-//            }
-//            PayMerchant payMerchantInfo = payMerchantService.getById(gamePayWayInfo.getPayMerchantId());
-//            if (Objects.isNull(payMerchantInfo)) {
-//                log.error("订单:{} 更新商户号统计时,获取PayMerchant表id:{}信息为空", orderInfo.getOrderId(), gamePayWayInfo.getPayMerchantId());
-//                return false;
-//            }
-            PayMerchant payMerchantInfo = payMerchantService.getOne(new LambdaQueryWrapper<PayMerchant>()
-                    .eq(PayMerchant::getMerchantNo, gamePayWayDTO.getMerchantNo()));
-
-            BigDecimal amount = orderInfo.getAmount();
+            //根据订单中的商户id获取商户信息
+            PayMerchantDTO payMerchantInfo = payMerchantService.getByMerchantNo(platformOrderDTO.getMerchantNo());
+            //商户额度数据统计
+            BigDecimal amount = platformOrderDTO.getAmount();
             LocalDateTime updateTime = payMerchantInfo.getDayUpdateDate();
-            Date date = new Date();
+            LocalDateTime dateTime = LocalDateTime.now();
             String totalPayAmount, mouthPayAmount, weakerPayAmount, dayPayAmount;
+            //累计
             totalPayAmount = " total_pay_amount = total_pay_amount + " + amount;
             mouthPayAmount = " mouth_pay_amount = mouth_pay_amount + " + amount;
             weakerPayAmount = " weaker_pay_amount = weaker_pay_amount + " + amount;
             dayPayAmount = " day_pay_amount = day_pay_amount + " + amount;
+            //统计过期限, 重新赋值
             if (updateTime != null) {
                 if (!DateUtils.isThisMonth(payMerchantInfo.getMouthUpdateDate())) {
                     mouthPayAmount = " mouth_pay_amount = " + amount;
@@ -277,21 +250,22 @@ public class PerformOrderServiceImpl implements PerformOrderService {
                     dayPayAmount = " day_pay_amount = " + amount;
                 }
             }
-            payMerchantService.update(new UpdateWrapper<PayMerchant>().lambda()
-                    .set(PayMerchant::getMouthUpdateDate, date)
-                    .set(PayMerchant::getWeakerUpdateDate, date)
-                    .set(PayMerchant::getDayUpdateDate, date)
+            //更新商户表
+            payMerchantService.update(new LambdaUpdateWrapper<PayMerchant>()
+                    .set(PayMerchant::getMouthUpdateDate, dateTime)
+                    .set(PayMerchant::getWeakerUpdateDate, dateTime)
+                    .set(PayMerchant::getDayUpdateDate, dateTime)
                     .setSql(totalPayAmount)
                     .setSql(mouthPayAmount)
                     .setSql(weakerPayAmount)
                     .setSql(dayPayAmount)
-                    .setEntity(payMerchantInfo)
+                    .eq(PayMerchant::getMerchantNo, platformOrderDTO.getMerchantNo())
             );
-            log.info("订单:{} 更新商户号统计 ----------end---------", orderInfo.getOrderId());
-            return true;
+            log.info("订单:{} 更新商户号统计 ----------end---------", platformOrderDTO.getOrderId());
+            return Boolean.TRUE;
         } catch (Exception e) {
-            log.error("订单:{} 更新商户号统计失败 e:{}", orderInfo.getOrderId(), e);
+            log.error("订单:{} 更新商户号统计异常 e:{}", platformOrderDTO.getOrderId(), e);
         }
-        return false;
+        return Boolean.FALSE;
     }
 }

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

@@ -0,0 +1,18 @@
+package com.zanxiang.sdk.service.Impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zanxiang.mybatis.entity.UserShare;
+import com.zanxiang.mybatis.mapper.UserShareMapper;
+import com.zanxiang.sdk.service.UserShareService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-01-16
+ * @description : 用户分享
+ */
+@Slf4j
+@Service
+public class UserShareServiceImpl extends ServiceImpl<UserShareMapper, UserShare> implements UserShareService {
+}

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

@@ -13,31 +13,31 @@ public interface PerformOrderService {
     /**
      * cp方履约推送
      *
-     * @param orderInfo
+     * @param platformOrderDTO
      */
-    Boolean pushCp(PlatformOrderDTO orderInfo);
+    Boolean pushCp(PlatformOrderDTO platformOrderDTO);
 
     /**
      * 检查订单是否为首单(账号首充)
      *
-     * @param orderInfo
+     * @param platformOrderDTO
      * @return
      */
-    Boolean checkIsFirstRecharge(PlatformOrderDTO orderInfo);
+    Boolean checkIsFirstRecharge(PlatformOrderDTO platformOrderDTO);
 
     /**
      * 更新游戏玩家充值统计
      *
-     * @param orderInfo
+     * @param platformOrderDTO
      * @return
      */
-    Boolean userRechargeTotal(PlatformOrderDTO orderInfo);
+    Boolean userRechargeTotal(PlatformOrderDTO platformOrderDTO);
 
     /**
      * 更新商户号统计
      *
-     * @param orderInfo
+     * @param platformOrderDTO
      * @return
      */
-    Boolean payMerchantTotal(PlatformOrderDTO orderInfo);
+    Boolean payMerchantTotal(PlatformOrderDTO platformOrderDTO);
 }

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

@@ -0,0 +1,12 @@
+package com.zanxiang.sdk.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.zanxiang.mybatis.entity.UserShare;
+
+/**
+ * @author : lingfeng
+ * @time : 2023-01-16
+ * @description :
+ */
+public interface UserShareService extends IService<UserShare> {
+}