|
@@ -0,0 +1,285 @@
|
|
|
+package com.zanxiang.game.back.serve.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.tencent.ads.model.*;
|
|
|
+import com.zanxiang.advertising.tencent.base.AdvertisingTencentServer;
|
|
|
+import com.zanxiang.advertising.tencent.base.pojo.dto.DataReportOfAppIdRpcDTO;
|
|
|
+import com.zanxiang.advertising.tencent.base.pojo.dto.UserActionRpcDTO;
|
|
|
+import com.zanxiang.advertising.tencent.base.rpc.IUserActionSetRpc;
|
|
|
+import com.zanxiang.erp.base.ErpServer;
|
|
|
+import com.zanxiang.erp.base.pojo.vo.SysResourceRpcVO;
|
|
|
+import com.zanxiang.erp.base.rpc.ISysUserRpc;
|
|
|
+import com.zanxiang.erp.security.util.SecurityUtil;
|
|
|
+import com.zanxiang.game.back.base.pojo.dto.TencentOrderDTO;
|
|
|
+import com.zanxiang.game.back.base.pojo.dto.TencentUserDTO;
|
|
|
+import com.zanxiang.game.back.serve.pojo.dto.GameBackPolicyDTO;
|
|
|
+import com.zanxiang.game.back.serve.pojo.dto.GameBackPolicyListDTO;
|
|
|
+import com.zanxiang.game.back.serve.pojo.entity.GameBackPolicy;
|
|
|
+import com.zanxiang.game.back.serve.dao.mapper.GameBackPolicyMapper;
|
|
|
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentBackLog;
|
|
|
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentOrder;
|
|
|
+import com.zanxiang.game.back.serve.pojo.entity.GameTencentUser;
|
|
|
+import com.zanxiang.game.back.serve.pojo.vo.GameBackPolicyVO;
|
|
|
+import com.zanxiang.game.back.serve.service.IGameBackPolicyService;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.zanxiang.game.back.serve.service.IGameTencentBackLogService;
|
|
|
+import com.zanxiang.game.back.serve.service.IGameTencentOrderService;
|
|
|
+import com.zanxiang.game.back.serve.service.IGameTencentUserService;
|
|
|
+import com.zanxiang.module.util.exception.BaseException;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.apache.dubbo.config.annotation.DubboReference;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Random;
|
|
|
+
|
|
|
+/**
|
|
|
+ * <p>
|
|
|
+ * 游戏回传策略表 服务实现类
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @author auto
|
|
|
+ * @since 2023-06-01
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class GameBackPolicyServiceImpl extends ServiceImpl<GameBackPolicyMapper, GameBackPolicy> implements IGameBackPolicyService {
|
|
|
+ @Autowired
|
|
|
+ private IGameTencentBackLogService gameTencentBackLogService;
|
|
|
+ @Autowired
|
|
|
+ private IGameTencentOrderService gameTencentOrderService;
|
|
|
+ @Autowired
|
|
|
+ private IGameTencentUserService gameTencentUserService;
|
|
|
+ @Autowired
|
|
|
+ private IGameBackPolicyService gameBackPolicyService;
|
|
|
+ @DubboReference(providedBy = AdvertisingTencentServer.SERVER_DUBBO_NAME)
|
|
|
+ private IUserActionSetRpc userActionSetRpc;
|
|
|
+ @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
|
|
|
+ private ISysUserRpc sysUserRpc;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public boolean tencentUserBack(TencentOrderDTO dto) {
|
|
|
+ //用户保存
|
|
|
+ GameTencentOrder gameTencentOrder = GameTencentOrder.builder()
|
|
|
+ .orderId(dto.getOrderId())
|
|
|
+ .channel(dto.getChannel())
|
|
|
+ .rechargeMoney(dto.getRechargeMoney())
|
|
|
+ .rechargeTime(dto.getRechargeTime())
|
|
|
+ .subscribeTime(dto.getSubscribeTime())
|
|
|
+ .registerTime(dto.getRegisterTime())
|
|
|
+ .wechatAppId(dto.getWechatAppId())
|
|
|
+ .wechatOpenid(dto.getWechatOpenid())
|
|
|
+ .isBack(0)
|
|
|
+ .build();
|
|
|
+ gameTencentOrderService.save(gameTencentOrder);
|
|
|
+
|
|
|
+ GameBackPolicy gameBackPolicy = gameBackPolicyService.getOne(new LambdaQueryWrapper<GameBackPolicy>()
|
|
|
+ .eq(GameBackPolicy::getGameId, dto.getGameId())
|
|
|
+ .eq(GameBackPolicy::getAccountId, dto.getAdAccountId()));
|
|
|
+ if (null == gameBackPolicy) {
|
|
|
+ gameBackPolicy = gameBackPolicyService.getOne(new LambdaQueryWrapper<GameBackPolicy>()
|
|
|
+ .eq(GameBackPolicy::getGameId, dto.getGameId())
|
|
|
+ .isNull(GameBackPolicy::getAccountId));
|
|
|
+ }
|
|
|
+ DataReportOfAppIdRpcDTO dataReportOfAppIdRpcDTO = DataReportOfAppIdRpcDTO.builder()
|
|
|
+ .appId(dto.getWechatAppId())
|
|
|
+ .action(UserActionRpcDTO.builder()
|
|
|
+ .actionTime(dto.getRechargeTime())
|
|
|
+ .actionType(ActionType.PURCHASE.getValue())
|
|
|
+ .userId(UserActionRpcDTO.UserIdRpcDTO.builder()
|
|
|
+ .wechatAppId(dto.getWechatAppId())
|
|
|
+ .wechatOpenid(dto.getWechatOpenid())
|
|
|
+ .build())
|
|
|
+ .build())
|
|
|
+ .build();
|
|
|
+
|
|
|
+ GameTencentBackLog gameTencentBackLog = GameTencentBackLog.builder()
|
|
|
+ .gameId(dto.getGameId())
|
|
|
+ .adAccountId(dto.getAdAccountId())
|
|
|
+ .actionTime(dto.getRechargeTime())
|
|
|
+ .createTime(LocalDateTime.now())
|
|
|
+ .actionType(ActionType.PURCHASE.getValue())
|
|
|
+ .orderId(dto.getOrderId())
|
|
|
+ .wechatAppId(dto.getWechatAppId())
|
|
|
+ .wechatOpenid(dto.getWechatOpenid())
|
|
|
+ .build();
|
|
|
+ try {
|
|
|
+ if (null == gameBackPolicy) {
|
|
|
+ userActionSetRpc.reportByAppId(dataReportOfAppIdRpcDTO);
|
|
|
+ gameTencentBackLogService.save(gameTencentBackLog);
|
|
|
+ gameTencentOrder.setIsBack(1);
|
|
|
+ gameTencentOrderService.updateById(gameTencentOrder);
|
|
|
+ } else {
|
|
|
+ if (dto.getRechargeMoney() <= gameBackPolicy.getFirstRechargeMoney() && shouldDoTask(gameBackPolicy.getFirstRechargeBackPercentage())) {
|
|
|
+ userActionSetRpc.reportByAppId(dataReportOfAppIdRpcDTO);
|
|
|
+ gameTencentBackLogService.save(gameTencentBackLog);
|
|
|
+ gameTencentOrder.setIsBack(1);
|
|
|
+ gameTencentOrderService.updateById(gameTencentOrder);
|
|
|
+ } else if (dto.getRechargeMoney() >= gameBackPolicy.getFirstRechargeMoney() && shouldDoTask(gameBackPolicy.getBigRechargeBackPercentage())) {
|
|
|
+ userActionSetRpc.reportByAppId(dataReportOfAppIdRpcDTO);
|
|
|
+ gameTencentBackLogService.save(gameTencentBackLog);
|
|
|
+ gameTencentOrder.setIsBack(1);
|
|
|
+ gameTencentOrderService.updateById(gameTencentOrder);
|
|
|
+ } else if (shouldDoTask(gameBackPolicy.getOtherRechargeBackPercentage())) {
|
|
|
+ userActionSetRpc.reportByAppId(dataReportOfAppIdRpcDTO);
|
|
|
+ gameTencentBackLogService.save(gameTencentBackLog);
|
|
|
+ gameTencentOrder.setIsBack(1);
|
|
|
+ gameTencentOrderService.updateById(gameTencentOrder);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("回传腾讯订单失败,失败原因:{}", e.getMessage());
|
|
|
+ gameTencentBackLog.setBackLog(e.getMessage());
|
|
|
+ gameTencentBackLogService.saveOrUpdate(gameTencentBackLog);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public boolean tencentUserBack(TencentUserDTO dto) {
|
|
|
+ //用户保存
|
|
|
+ GameTencentUser gameTencentUser = GameTencentUser.builder()
|
|
|
+ .adAccountId(dto.getAdAccountId())
|
|
|
+ .gameId(dto.getGameId())
|
|
|
+ .channel(dto.getChannel())
|
|
|
+ .subscribeTime(dto.getSubscribeTime())
|
|
|
+ .registerTime(dto.getRegisterTime())
|
|
|
+ .wechatAppId(dto.getWechatAppId())
|
|
|
+ .wechatOpenid(dto.getWechatOpenid())
|
|
|
+ .isBack(0)
|
|
|
+ .build();
|
|
|
+ gameTencentUserService.save(gameTencentUser);
|
|
|
+
|
|
|
+ DataReportOfAppIdRpcDTO dataReportOfAppIdRpcDTO = DataReportOfAppIdRpcDTO.builder()
|
|
|
+ .appId(dto.getWechatAppId())
|
|
|
+ .action(UserActionRpcDTO.builder()
|
|
|
+ .actionTime(dto.getRegisterTime())
|
|
|
+ .actionType(ActionType.REGISTER.getValue())
|
|
|
+ .userId(UserActionRpcDTO.UserIdRpcDTO.builder()
|
|
|
+ .wechatAppId(dto.getWechatAppId())
|
|
|
+ .wechatOpenid(dto.getWechatOpenid())
|
|
|
+ .build())
|
|
|
+ .build())
|
|
|
+ .build();
|
|
|
+
|
|
|
+ GameTencentBackLog gameTencentBackLog = GameTencentBackLog.builder()
|
|
|
+ .gameId(dto.getGameId())
|
|
|
+ .adAccountId(dto.getAdAccountId())
|
|
|
+ .actionTime(dto.getRegisterTime())
|
|
|
+ .createTime(LocalDateTime.now())
|
|
|
+ .actionType(ActionType.REGISTER.getValue())
|
|
|
+ .wechatAppId(dto.getWechatAppId())
|
|
|
+ .wechatOpenid(dto.getWechatOpenid())
|
|
|
+ .build();
|
|
|
+ try {
|
|
|
+ userActionSetRpc.reportByAppId(dataReportOfAppIdRpcDTO);
|
|
|
+ gameTencentBackLogService.save(gameTencentBackLog);
|
|
|
+ gameTencentUser.setIsBack(1);
|
|
|
+ gameTencentUserService.updateById(gameTencentUser);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("回传腾讯用户失败,失败原因:{}", e.getMessage());
|
|
|
+ gameTencentBackLog.setBackLog(e.getMessage());
|
|
|
+ gameTencentBackLogService.saveOrUpdate(gameTencentBackLog);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean createPolicy(GameBackPolicyDTO dto) {
|
|
|
+ GameBackPolicy gameBackPolicy = gameBackPolicyService.getOne(new LambdaQueryWrapper<GameBackPolicy>()
|
|
|
+ .eq(GameBackPolicy::getCreateBy, SecurityUtil.getUserId())
|
|
|
+ .eq(GameBackPolicy::getBackPolicyName, dto.getBackPolicyName()));
|
|
|
+ if (null != gameBackPolicy) {
|
|
|
+ throw new BaseException("回传策略名重复");
|
|
|
+ }
|
|
|
+ GameBackPolicy backPolicy = GameBackPolicy.builder()
|
|
|
+ .backPolicyName(dto.getBackPolicyName())
|
|
|
+ .gameId(dto.getGameId())
|
|
|
+ .accountId(dto.getAccountId())
|
|
|
+ .firstRechargeMoney(dto.getFirstRechargeMoney())
|
|
|
+ .firstRechargeBackPercentage(dto.getFirstRechargeBackPercentage())
|
|
|
+ .bigRechargeBackPercentage(dto.getBigRechargeBackPercentage())
|
|
|
+ .bigRechargeMoney(dto.getBigRechargeMoney())
|
|
|
+ .otherRechargeBackPercentage(dto.getOtherRechargeBackPercentage())
|
|
|
+ .levelDown(dto.getLevelDown())
|
|
|
+ .createBy(SecurityUtil.getUserId())
|
|
|
+ .createTime(LocalDateTime.now())
|
|
|
+ .build();
|
|
|
+
|
|
|
+ return gameBackPolicyService.save(backPolicy);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean updatePolicy(GameBackPolicyDTO dto) {
|
|
|
+ long count = gameBackPolicyService.count(new LambdaQueryWrapper<GameBackPolicy>()
|
|
|
+ .eq(GameBackPolicy::getCreateBy, SecurityUtil.getUserId())
|
|
|
+ .eq(GameBackPolicy::getBackPolicyName, dto.getBackPolicyName())
|
|
|
+ .ne(GameBackPolicy::getId, dto.getId()));
|
|
|
+ if (count > 0) {
|
|
|
+ throw new BaseException("回传策略名重复");
|
|
|
+ }
|
|
|
+ GameBackPolicy backPolicy = GameBackPolicy.builder()
|
|
|
+ .id(dto.getId())
|
|
|
+ .backPolicyName(dto.getBackPolicyName())
|
|
|
+ .gameId(dto.getGameId())
|
|
|
+ .accountId(dto.getAccountId())
|
|
|
+ .firstRechargeMoney(dto.getFirstRechargeMoney())
|
|
|
+ .firstRechargeBackPercentage(dto.getFirstRechargeBackPercentage())
|
|
|
+ .bigRechargeBackPercentage(dto.getBigRechargeBackPercentage())
|
|
|
+ .bigRechargeMoney(dto.getBigRechargeMoney())
|
|
|
+ .otherRechargeBackPercentage(dto.getOtherRechargeBackPercentage())
|
|
|
+ .levelDown(dto.getLevelDown())
|
|
|
+ .updateBy(SecurityUtil.getUserId())
|
|
|
+ .updateTime(LocalDateTime.now())
|
|
|
+ .build();
|
|
|
+
|
|
|
+ return gameBackPolicyService.updateById(backPolicy);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean deletePolicy(List<Long> ids) {
|
|
|
+ return gameBackPolicyService.removeByIds(ids);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public IPage<GameBackPolicyVO> policyList(GameBackPolicyListDTO dto) {
|
|
|
+ return gameBackPolicyService.page(dto.toPage(), new LambdaQueryWrapper<GameBackPolicy>()
|
|
|
+ .like(StringUtils.isNotBlank(dto.getBackPolicyName()), GameBackPolicy::getBackPolicyName, dto.getBackPolicyName())
|
|
|
+ .eq(null != dto.getGameId(), GameBackPolicy::getGameId, dto.getGameId())
|
|
|
+ .eq(null != dto.getAccountId(), GameBackPolicy::getAccountId, dto.getAccountId())
|
|
|
+ .eq(null != dto.getCreateBy(), GameBackPolicy::getCreateBy, dto.getCreateBy()))
|
|
|
+ .convert(item -> GameBackPolicyVO.builder()
|
|
|
+ .id(item.getId())
|
|
|
+ .backPolicyName(item.getBackPolicyName())
|
|
|
+ .accountId(item.getAccountId())
|
|
|
+ .bigRechargeBackPercentage(item.getBigRechargeBackPercentage())
|
|
|
+ .bigRechargeMoney(item.getBigRechargeMoney())
|
|
|
+ .firstRechargeBackPercentage(item.getFirstRechargeBackPercentage())
|
|
|
+ .firstRechargeMoney(item.getFirstRechargeMoney())
|
|
|
+ .otherRechargeBackPercentage(item.getOtherRechargeBackPercentage())
|
|
|
+ .createBy(item.getCreateBy())
|
|
|
+ .updateBy(item.getUpdateBy())
|
|
|
+ .createName(sysUserRpc.getById(item.getCreateBy()).getData().getNickname())
|
|
|
+ .updateName(sysUserRpc.getById(item.getUpdateBy()).getData().getNickName())
|
|
|
+ .build());
|
|
|
+ }
|
|
|
+
|
|
|
+ private static boolean shouldDoTask(BigDecimal successProbability) {
|
|
|
+ Random random = new Random();
|
|
|
+ // 生成一个0到1之间的随机数
|
|
|
+ double randomValue = random.nextDouble();
|
|
|
+ // 如果随机数小于成功概率,则返回true,否则返回false
|
|
|
+ return successProbability.compareTo(BigDecimal.valueOf(randomValue)) > 0;
|
|
|
+ }
|
|
|
+}
|