ソースを参照

feat: 今日收益/历史收益查询调整到小说服务

hidewnd 4 週間 前
コミット
d2bc7668a6

+ 1 - 0
yt-common/src/main/java/com/ytpm/app/model/YtDyzUser.java

@@ -3,6 +3,7 @@ package com.ytpm.app.model;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.ytpm.app.enums.LoginType;
 import com.ytpm.custom.CustomField;
+import com.ytpm.handle.BigDecimalSerialize;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;

+ 14 - 2
yt-common/src/main/java/com/ytpm/app/model/YtNovelUser.java

@@ -1,7 +1,9 @@
 package com.ytpm.app.model;
 
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.ytpm.custom.CustomField;
+import com.ytpm.handle.BigDecimalSerialize;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -21,8 +23,6 @@ public class YtNovelUser extends YtUser {
     @ApiModelProperty("总观看视频数")
     private Integer totalVideo;
 
-    @ApiModelProperty("总收益")
-    private BigDecimal totalIncome;
 
     @ApiModelProperty("红包余额")
     private BigDecimal redPacketBalance;
@@ -44,6 +44,18 @@ public class YtNovelUser extends YtUser {
     @ApiModelProperty("体力")
     private Integer power;
 
+    @ApiModelProperty(value = "今日收益")
+    @JsonSerialize(using = BigDecimalSerialize.class)
+    private BigDecimal todayIncome;
+
+    @ApiModelProperty("前三日总收益")
+    @JsonSerialize(using = BigDecimalSerialize.class)
+    private BigDecimal nearlyIncome;
+
+    @ApiModelProperty("总收益")
+    @JsonSerialize(using = BigDecimalSerialize.class)
+    private BigDecimal totalIncome;
+
     @ApiModelProperty("广告观看记录")
     private List<YtNovelAdRecord> novelAdRecordList;
 }

+ 27 - 1
yt-novel/yt-novel-service/src/main/java/com/ytpm/novel/controller/UserController.java

@@ -23,6 +23,7 @@ import com.ytpm.app.param.AppUserQueryParam;
 import com.ytpm.app.param.AppUserTodayBannedParam;
 import com.ytpm.app.param.YtAppUserListParam;
 import com.ytpm.app.view.HourCountView;
+import com.ytpm.app.view.WxDefaultConfig;
 import com.ytpm.app.view.YtAppUserListView;
 import com.ytpm.general.RepMessage;
 import com.ytpm.general.Result;
@@ -36,8 +37,11 @@ import com.ytpm.novel.redis.RedisService;
 import com.ytpm.risk.enums.BannedTypeEnum;
 import com.ytpm.risk.view.RiskConfigView;
 import com.ytpm.risk.view.RiskTemplateView;
+import com.ytpm.util.NumberUtils;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -47,6 +51,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -63,6 +68,7 @@ import java.util.stream.Collectors;
  * @date 2025-10-09 14:24
  */
 @Slf4j
+@RefreshScope
 @RestController
 @RequestMapping("/user")
 public class UserController {
@@ -74,10 +80,12 @@ public class UserController {
     private AdRecordMapper adRecordMapper;
     @Resource
     private NovelAdRecordMapper novelAdRecordMapper;
-
     @Resource
     private RedisService redisService;
 
+    @Value("${yt.revenue.scale:3}")
+    private Integer revenueScale;
+
 
     @ApiOperation("根据应用ID查询当月注册用户")
     @GetMapping("/getMonthRegistryUser")
@@ -155,6 +163,24 @@ public class UserController {
             user.setLoginRecordList(loginRecordMapper.getLoginRecords(userId));
             user.setNovelAdRecordList(novelAdRecordMapper.selectToDayNovelRecode(userId));
         }
+        // 分层系数
+        WxDefaultConfig defaultConfig = appUserMapper.getDefaultConfigByAppId(user.getAppId());
+        String revenueDisplayRate = defaultConfig == null ? "" : defaultConfig.getRevenueDisplayRate();
+        BigDecimal todayRevenue = adRecordMapper.getToTalRevenue(userId, 1);
+        BigDecimal totalRevenue = user.getTotalIncome() == null ? adRecordMapper.getToTalRevenue(userId, 2) : user.getTotalIncome();
+        if (StrUtil.isNotEmpty(revenueDisplayRate)) {
+            BigDecimal rate = NumberUtils.rateToBigDecimal(revenueDisplayRate);
+            todayRevenue = todayRevenue.multiply(rate).setScale(revenueScale, RoundingMode.HALF_UP);
+            totalRevenue = totalRevenue.multiply(rate).setScale(revenueScale, RoundingMode.HALF_UP);
+        }
+        // 今日收益
+        user.setTodayIncome(todayRevenue);
+        // 历史收益
+        user.setTotalIncome(totalRevenue);
+        // 前三日总收益
+        if (user.getNearlyIncome() != null) {
+            user.setNearlyIncome(user.getNearlyIncome().setScale(revenueScale, RoundingMode.HALF_UP));
+        }
         return Result.resultObjOk(user);
     }
 

+ 7 - 0
yt-novel/yt-novel-service/src/main/java/com/ytpm/novel/dao/AdRecordMapper.java

@@ -82,4 +82,11 @@ public interface AdRecordMapper {
      * 本月按广告平台聚合
      */
     List<AgentNetworkAgg> getMonthAggByNetwork(@Param("appIds") String appIds);
+
+    /**
+     * 统计用户广告收益
+     * @param userId 用户ID
+     * @param type 统计方式|1统计今日|2统计所有
+     */
+    BigDecimal getToTalRevenue(@Param("userId") String userId, @Param("type") Integer type);
 }

+ 8 - 0
yt-novel/yt-novel-service/src/main/resources/mapper/AdRecordMapper.xml

@@ -277,4 +277,12 @@
         </if>
     </select>
 
+    <select id="getToTalRevenue" resultType="java.math.BigDecimal">
+        select ifnull(sum(revenue), 0) as revenue
+        from yt_dyz_ad_record
+        where user_id = #{userId}
+        <if test="type != null and type = 1">
+            AND DATE(finish_time) = DATE(NOW())
+        </if>
+    </select>
 </mapper>

+ 9 - 6
yt-novel/yt-novel-service/src/main/resources/mapper/AppUserMapper.xml

@@ -167,7 +167,10 @@
                 can_cache_video = #{canCacheVideo},
             </if>
             <if test="canAllowAutoRefresh != null">
-                can_allow_auto_refresh = #{canAllowAutoRefresh}
+                can_allow_auto_refresh = #{canAllowAutoRefresh},
+            </if>
+            <if test="revenueDisplayRate != null">
+                revenue_display_rate = #{revenueDisplayRate}
             </if>
         </set>
         where app_id = #{appId}
@@ -457,7 +460,7 @@
             can_use_root, can_use_adb, can_use_float, can_accumulation,
             ditch_id, power_wait_time, interstitial_interval_time,
             low_value_tip, brush_tip,flow_interval_time,task_limit_tip,start_wait_time,
-            can_cache_video,can_allow_auto_refresh
+            can_cache_video,can_allow_auto_refresh,revenue_display_rate
         from yt_app_default_config
         where app_type = #{appType}
     </select>
@@ -468,7 +471,7 @@
             taku_reward_pid, taku_interstitial_pid, can_use_root, can_use_adb, can_use_float, can_accumulation,
             ditch_id, power_wait_time, interstitial_interval_time,
             low_value_tip, brush_tip,flow_interval_time,task_limit_tip,start_wait_time,
-            can_cache_video,can_allow_auto_refresh
+            can_cache_video,can_allow_auto_refresh,revenue_display_rate
         from yt_app_default_config
         where app_id = #{appId}
     </select>
@@ -479,7 +482,7 @@
             taku_reward_pid, taku_interstitial_pid, can_use_root, can_use_adb, can_use_float, can_accumulation,
             ditch_id, power_wait_time, interstitial_interval_time,
             low_value_tip, brush_tip, flow_interval_time,task_limit_tip,start_wait_time,
-            can_cache_video,can_allow_auto_refresh
+            can_cache_video,can_allow_auto_refresh,revenue_display_rate
         from yt_app_default_config
         where app_id = #{appId}
     </select>
@@ -502,8 +505,8 @@
         config_id, config_name, open_id, secret, app_id, app_key, app_type, user_path, login_path, ad_path,
         answer_path, power_path,taku_app_id, taku_key, taku_banner_pid, taku_native_pid, taku_reward_pid,
         taku_interstitial_pid, can_use_root, can_use_adb, can_use_float, can_accumulation,can_simulator,
-        ditch_id, power_wait_time, interstitial_interval_time,
-        low_value_tip, brush_tip, flow_interval_time,task_limit_tip,start_wait_time,can_cache_video,can_allow_auto_refresh
+        ditch_id, power_wait_time, interstitial_interval_time, low_value_tip, brush_tip,
+        flow_interval_time,task_limit_tip,start_wait_time,can_cache_video,can_allow_auto_refresh,revenue_display_rate
         from yt_app_default_config
         where app_id in
         <foreach collection="appIds.split(',')" item="item" separator="," open="(" close=")">

+ 13 - 37
yt-question/yt-question-service/src/main/java/com/ytpm/question/controller/UserController.java

@@ -24,7 +24,6 @@ import com.ytpm.app.param.AppUserQueryParam;
 import com.ytpm.app.param.AppUserTodayBannedParam;
 import com.ytpm.app.param.YtAppUserListParam;
 import com.ytpm.app.view.HourCountView;
-import com.ytpm.app.view.WxDefaultConfig;
 import com.ytpm.app.view.YtAppUserListView;
 import com.ytpm.feign.RiskFeign;
 import com.ytpm.general.RepMessage;
@@ -39,12 +38,10 @@ import com.ytpm.question.redis.RedisService;
 import com.ytpm.risk.enums.BannedTypeEnum;
 import com.ytpm.risk.view.RiskConfigView;
 import com.ytpm.risk.view.RiskTemplateView;
-import com.ytpm.util.NumberUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.apache.commons.codec.binary.Base64;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -57,7 +54,6 @@ import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayOutputStream;
 import java.math.BigDecimal;
-import java.math.RoundingMode;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -90,9 +86,6 @@ public class UserController {
     @Resource
     private RiskFeign riskFeign;
 
-    @Value("${yt.revenue.scale:3}")
-    private Integer revenueScale;
-
     @Value("${spring.application.name:}")
     private String applicationName;
 
@@ -182,23 +175,6 @@ public class UserController {
             user.setHistoryAnswerCount(questionMapper.getAnswerCount(userId, 2));
             // 答题记录列表
             user.setAnswerRecordList(questionMapper.getAnswerRecords(userId));
-            WxDefaultConfig defaultConfig = appUserMapper.getDefaultConfigByAppId(user.getAppId());
-            // 分层系数
-            String revenueDisplayRate = defaultConfig == null ? "" : defaultConfig.getRevenueDisplayRate();
-            BigDecimal todayRevenue = adRecordMapper.getToTalRevenue(userId, 1);
-            BigDecimal totalRevenue = user.getTotalIncome() == null ? adRecordMapper.getToTalRevenue(userId, 2) : user.getTotalIncome();
-            if (StrUtil.isNotEmpty(revenueDisplayRate)) {
-                BigDecimal rate = NumberUtils.rateToBigDecimal(revenueDisplayRate);
-                todayRevenue = todayRevenue.multiply(rate).setScale(revenueScale, RoundingMode.HALF_UP);
-                totalRevenue = totalRevenue.multiply(rate).setScale(revenueScale, RoundingMode.HALF_UP);
-            }
-            // 今日收益
-            user.setTodayIncome(todayRevenue);
-            // 历史收益
-            user.setTotalIncome(totalRevenue);
-            if (user.getNearlyIncome() != null) {
-                user.setNearlyIncome(user.getNearlyIncome().setScale(revenueScale, RoundingMode.HALF_UP));
-            }
             // 是否体力已达上限
             boolean ifPowerLimit = false;
             Result<?> result = riskFeign.checkAdRisk(user);
@@ -208,31 +184,31 @@ public class UserController {
             }
             user.setIfPowerLimit(ifPowerLimit);
         }
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put("serverName", applicationName);
-        jsonObject.put("appId", user.getAppId());
-        jsonObject.put("userId", userId);
-        jsonObject.put("deviceId", user.getDeviceId());
-        String content = new Base64().encodeToString(JSONObject.toJSONString(jsonObject).getBytes());
-        BufferedImage qrCode = QrCodeUtil.generate(content, 50, 50);
-        user.setQrCode(bufferedImageToBase64(qrCode));
         return Result.resultObjOk(user);
     }
 
-    public String bufferedImageToBase64(BufferedImage bufferedImage) {
+    /**
+     * 生成用户信息二维码
+     */
+    private void setQrCode(YtDyzUser user) {
         try {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("serverName", applicationName);
+            jsonObject.put("appId", user.getAppId());
+            jsonObject.put("userId", user.getUserId());
+            jsonObject.put("deviceId", user.getDeviceId());
+            String content = new Base64().encodeToString(JSONObject.toJSONString(jsonObject).getBytes());
+            BufferedImage qrCode = QrCodeUtil.generate(content, 50, 50);
             ByteArrayOutputStream stream = new ByteArrayOutputStream();
-            ImageIO.write(bufferedImage, "png", stream);
+            ImageIO.write(qrCode, "png", stream);
             Base64 base64 = new Base64();
             String base64String = base64.encodeToString(stream.toByteArray());
-            return "data:image/png;base64," + base64String;
+            user.setQrCode("data:image/png;base64," + base64String);
         } catch (Exception e) {
             log.error("生成qrCode失败", e);
-            return "";
         }
     }
 
-
     /**
      * 查询用户信息
      */