Prechádzať zdrojové kódy

修改内容:优化广告监控查询代码逻辑

lth 1 rok pred
rodič
commit
32e77a07f7

+ 43 - 54
game-data/game-data-serve/src/main/java/com/zanxiang/game/data/serve/service/impl/PromotionDayServiceImpl.java

@@ -142,6 +142,7 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
      */
     @Override
     public Page<PromotionDayVO> getPromotionDayData(PromotionDayDTO dto) {
+
         //不传递查询条件默认查询当天数据
         if (dto.getCostBeginDate() == null || dto.getCostEndDate() == null) {
             dto.setCostBeginDate(LocalDate.now());
@@ -171,30 +172,14 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         Sql sqlCount = Sqls.queryEntity("select count(*) from ads_promotion_day" + cri);
         pager.setRecordCount((int) Daos.queryCount(dao, sqlCount));
 
+        //得到查询条件内所有广告最新的一条数据
+        Map<String, PromotionDayVO> latestDateDataMap = getLatestDateData(myCri(dto, false));
+
         //处理List中的每个vo对象缺少的数据
         list.stream().map(vo -> {
-            //记录最近有数据的LocalDate
-            LocalDate latestDate = dto.getCostEndDate();
-            Boolean hasDataDate = findDate(vo.getPromotionId(), latestDate);
-            while (!hasDataDate) {
-                latestDate = latestDate.minusDays(1);
-                hasDataDate = findDate(vo.getPromotionId(), latestDate);
-            }
-            //构建查询条件
-            Criteria totalCri = Cnd.cri();
-            totalCri.where().andEquals("dt", latestDate);
-            totalCri.where().andEquals("promotion_id", vo.getPromotionId());
-            //查询出最近一条包含总数据的记录
-            Sql totalDataSql = Sqls.create(getTotalDataSql() + totalCri);
-            //设置回传对象
-            totalDataSql.setCallback(Sqls.callback.entity());
-            totalDataSql.setEntity(dao.getEntity(PromotionDayVO.class));
-            //执行sql
-            dao.execute(totalDataSql);
-            //得到对象
-            PromotionDayVO tempVO = totalDataSql.getObject(PromotionDayVO.class);
-            //将两个对象内容合并
-            copyNullProperties(tempVO, vo);
+
+            //找到相同的广告ID,取出对象并合并属性值
+            copyNullProperties(latestDateDataMap.get(vo.getPromotionId()), vo);
 
             //总充值次数成本
             vo.setTotalAmountCountCost(vo.getTotalAmountCount() == 0L ? BigDecimal.ZERO :
@@ -497,34 +482,6 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         return cri;
     }
 
-    /**
-     * 用来判断当前日期有没有数据
-     *
-     * @param promotionId 查询的广告id
-     * @param latestDate  时间参数
-     * @return Boolean
-     */
-    private Boolean findDate(String promotionId, LocalDate latestDate) {
-        //创建查询条件
-        Criteria cri = Cnd.cri();
-        cri.where().andEquals("promotion_id", Long.valueOf(promotionId));
-        cri.where().andEquals("dt", latestDate);
-        Sql sql = Sqls.create("""
-                SELECT
-                    promotion_id
-                FROM
-                    game_ads.ads_promotion_day
-                """ + cri);
-        sql.setCallback(Sqls.callback.str());
-        dao.execute(sql);
-        String tempStr = sql.getString();
-        //查询结果判断
-        if (tempStr != null) {
-            return true;
-        }
-        return false;
-    }
-
     /**
      * 所有为空值的属性都不copy
      *
@@ -559,6 +516,37 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
         return notNullFieldSet.toArray(notNullField);
     }
 
+    /**
+     * 获取最新数据得到Map
+     * @param cri 查询条件
+     * @return Map结果
+     */
+    private Map<String, PromotionDayVO> getLatestDateData(Criteria cri) {
+        Sql sql = Sqls.create("""
+                SELECT
+                *
+                FROM(
+                """
+                +  getLatestDateDataSql() + cri +
+                """
+                 ) a
+                WHERE a.num = 1
+                """);
+        //设置回传对象
+        sql.setCallback(Sqls.callback.entities());
+        sql.setEntity(dao.getEntity(PromotionDayVO.class));
+        //执行sql
+        dao.execute(sql);
+        //得到sql查询的结果
+        List<PromotionDayVO> list = sql.getList(PromotionDayVO.class);
+        Map<String, PromotionDayVO> resMap = new HashMap<>(list.size());
+        //循环赋值得到最终map
+        for (PromotionDayVO vo : list) {
+            resMap.put(vo.getPromotionId(), vo);
+        }
+        return resMap;
+    }
+
     /**
      * 排序
      * @param dto 前端传递的查询条件
@@ -821,13 +809,14 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
     }
 
     /**
-     * 查询广告每日里总数据sql
-     *
+     * 获取到最新数据的sql
      * @return String
      */
-    private String getTotalDataSql() {
+    private String getLatestDateDataSql() {
         return """
                 SELECT
+                    ROW_NUMBER()over(partition by promotion_id order by dt desc) as num,
+                    promotion_id,
                     status,
                     creative_preview,
                     landing_type,
@@ -852,7 +841,7 @@ public class PromotionDayServiceImpl implements IAdsPromotionDayService {
                     promotion_total_roi,
                     total_recharge_cost
                 FROM
-                    game_ads.ads_promotion_day
+                	game_ads.ads_promotion_day
                 """;
     }