Parcourir la source

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

shishaosong il y a 9 mois
Parent
commit
f771bfa50b

+ 7 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/controller/GameParentController.java

@@ -42,4 +42,11 @@ public class GameParentController {
         return ResultVO.ok(adsRoleAmountRateParentService.rolePayOfPage(dto));
     }
 
+    @ApiOperation(value = "GS角色付费留存总计")
+//    @PreAuthorize(permissionKey = "gameGs:rolePay:total")
+    @PostMapping("/role/pay/retained/total")
+    public ResultVO<RolePayVO> rolePayTotal(@Validated @RequestBody RolePayDTO dto) {
+        return ResultVO.ok(adsRoleAmountRateParentService.rolePayTotal(dto));
+    }
+
 }

+ 6 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/pojo/vo/RolePayVO.java

@@ -1,12 +1,18 @@
 package com.zanxiang.game.gs.data.serve.pojo.vo;
 
 import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
 
 @Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
 public class RolePayVO {
 
     /**

+ 2 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/IAdsRoleAmountRateParentService.java

@@ -17,4 +17,6 @@ import com.zanxiang.game.gs.data.serve.pojo.vo.RolePayVO;
 public interface IAdsRoleAmountRateParentService extends IService<AdsRoleAmountRateParent> {
 
     PageVO<RolePayVO, Row> rolePayOfPage(RolePayDTO dto);
+
+    RolePayVO rolePayTotal(RolePayDTO dto);
 }

+ 58 - 0
game-gs-data/game-gs-data-serve/src/main/java/com/zanxiang/game/gs/data/serve/service/impl/AdsRoleAmountRateParentServiceImpl.java

@@ -10,6 +10,7 @@ import com.zanxiang.game.gs.data.serve.pojo.vo.RolePayVO;
 import com.zanxiang.game.gs.data.serve.service.ISysUserService;
 import com.zanxiang.module.util.DateUtil;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import com.zanxiang.game.gs.data.serve.service.IAdsRoleAmountRateParentService;
 import com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.AdsRoleAmountRateParent;
@@ -23,6 +24,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import static com.mybatisflex.core.query.QueryMethods.*;
 import static com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.table.AdsRoleAmountDataParentTableDef.ADS_ROLE_AMOUNT_DATA_PARENT;
 import static com.zanxiang.game.gs.data.serve.pojo.entity.game.parent.table.AdsRoleAmountRateParentTableDef.ADS_ROLE_AMOUNT_RATE_PARENT;
 
@@ -55,8 +57,64 @@ public class AdsRoleAmountRateParentServiceImpl extends ServiceImpl<AdsRoleAmoun
         return new PageVO<>(paginate);
     }
 
+    @Override
+    public RolePayVO rolePayTotal(RolePayDTO dto) {
+        QueryWrapper rolePayWrapper = getRolePayTotalWrapper(dto);
+        return getMapper().selectOneByQueryAs(rolePayWrapper, RolePayVO.class);
+    }
+
+    private QueryWrapper getRolePayTotalWrapper(RolePayDTO dto) {
+        return QueryWrapper.create()
+                .from(ADS_ROLE_AMOUNT_RATE_PARENT)
+                .select(getDayN())
+                .select(sum(ADS_ROLE_AMOUNT_RATE_PARENT.ROLE_AMOUNT_NUM).as(ADS_ROLE_AMOUNT_RATE_PARENT.ROLE_AMOUNT_NUM.getName()))
+                .select(sum(ADS_ROLE_AMOUNT_RATE_PARENT.ORDER_COUNT).as(ADS_ROLE_AMOUNT_RATE_PARENT.ORDER_COUNT.getName()))
+                .select(sum(ADS_ROLE_AMOUNT_RATE_PARENT.TOTAL_AMOUNT).as(ADS_ROLE_AMOUNT_RATE_PARENT.TOTAL_AMOUNT.getName()))
+                .select(sum(ADS_ROLE_AMOUNT_RATE_PARENT.ROLE_NUM).as(ADS_ROLE_AMOUNT_RATE_PARENT.ROLE_NUM.getName()))
+                .select("ROUND(IF(SUM(role_amount_num) > 0 , SUM(total_amount) / SUM(role_amount_num), 0), 4) AS gs_arppu")
+                .select("ROUND(IF(SUM(order_count) > 0 , SUM(total_amount) / SUM(order_count), 0), 4) AS gs_avg")
+                .select("ROUND(IF(SUM(role_num) > 0 , SUM(role_amount_num) / SUM(role_num), 0), 4) AS gs_rate")
+                .ge(AdsRoleAmountRateParent::getDt, dto.getDtBegin(), null != dto.getDtBegin())
+                .le(AdsRoleAmountRateParent::getDt, dto.getDtEnd(), null != dto.getDtEnd())
+                .in(AdsRoleAmountRateParent::getGsId, dto.getGsIdList(), CollectionUtils.isNotEmpty(dto.getGsIdList()));
+    }
+
+    private String getDayN() {
+        StringBuilder currDayN = new StringBuilder(StringUtils.EMPTY);
+        for (int day = 1; day <= 90; day++) {
+            String dayN = "da" + day;
+            daySplit(currDayN, dayN);
+        }
+        for (int month = 4; month <= 12; month++) {
+            String mN = "m" + month;
+            daySplit(currDayN, mN);
+        }
+        String total = "total";
+        daySplit(currDayN, total);
+        // 移除最后一个逗号和空格
+        if (currDayN.length() > 0) {
+            currDayN.setLength(currDayN.length() - 2);
+        }
+        //返回结果
+        return currDayN.toString();
+    }
+
+    private void daySplit(StringBuilder totalDayN, String dayN) {
+        totalDayN.append(" CONCAT_WS('/', ")
+                .append("SUM(SPLIT_PART(").append(dayN).append(", '/', 1)), ")
+                .append("SUM(SPLIT_PART(").append(dayN).append(", '/', 2)), ")
+                .append("SUM(SPLIT_PART(").append(dayN).append(", '/', 3)), ")
+                .append("SUM(SPLIT_PART(").append(dayN).append(", '/', 4)), ")
+                .append("ROUND(IF(SUM(SPLIT_PART(").append(dayN).append(", '/', 1)) > 0, ")
+                .append("SUM(SPLIT_PART(").append(dayN).append(", '/', 2)) / SUM(SPLIT_PART(").append(dayN).append(", '/', 1)), 0), 4), ")
+                .append("ROUND(IF(SUM(role_num) > 0, SUM(SPLIT_PART(").append(dayN).append(", '/', 1)) / SUM(role_num), 0), 4), ")
+                .append("ROUND(IF(SUM(role_num) > 0, SUM(SPLIT_PART(").append(dayN).append(", '/', 2)) / SUM(role_num), 0), 4)) ")
+                .append("as ").append(dayN).append(", ");
+    }
+
     private QueryWrapper getRolePayWrapper(RolePayDTO dto) {
         return QueryWrapper.create()
+                .from(ADS_ROLE_AMOUNT_RATE_PARENT)
                 .select(ADS_ROLE_AMOUNT_RATE_PARENT.ALL_COLUMNS)
                 .ge(AdsRoleAmountRateParent::getDt, dto.getDtBegin(), null != dto.getDtBegin())
                 .le(AdsRoleAmountRateParent::getDt, dto.getDtEnd(), null != dto.getDtEnd())