YPZ 1 день назад
Родитель
Сommit
e24ad21c8b

+ 19 - 0
java/storlead-sasa/storlead-trade/src/main/java/com/storlead/trade/controller/SopController.java

@@ -146,5 +146,24 @@ public class SopController {
         }
     }
 
+    /**
+     * 热门模板排行(企业邮箱管理中心)
+     *
+     * @param limit 取前 N 条,默认 10,最大 50
+     * @return 模板名 + 累计发送数 + 打开率(整数百分比),按发送数倒序
+     */
+    @GetMapping("/hot-template-rank")
+    @ApiOperation(value = "热门模板排行", notes = "按邮件发送数倒序的 SOP 邮件模板列表;数据每天 3 点统计刷新")
+    public Result<Object> hotTemplateRank(
+            @ApiParam(value = "条数,默认10,最大50")
+            @RequestParam(value = "limit", required = false, defaultValue = "10") Integer limit) {
+        try {
+            return sopService.hotTemplateRank(limit);
+        } catch (Exception e) {
+            log.error("查询热门模板排行失败", e);
+            return Result.error("查询失败");
+        }
+    }
+
 
 }

+ 12 - 0
java/storlead-sasa/storlead-trade/src/main/java/com/storlead/trade/service/SopService.java

@@ -40,4 +40,16 @@ public interface SopService extends IService<SopEntity> {
      */
     IPage<SopResponseDTO> listSopPage(
             SopResponseDTO dto);
+
+    /**
+     * 热门模板排行:按邮件发送数倒序的 SOP 邮件模板列表。
+     * <p>
+     * 口径与 {@code SopDetailCountTask}(每天 3 点统计)一致:
+     * send_number = 该模板下 status=1 的邮件数,open_rate = 已读/发送 的整数百分比。
+     * 直接读 sop_detail 上统计好的字段,接口零聚合开销(数据 T+1)。
+     *
+     * @param limit 取前 N 条,null/非正数按 10,最大 50
+     * @return 排行列表
+     */
+    Result<Object> hotTemplateRank(Integer limit);
 }

+ 27 - 0
java/storlead-sasa/storlead-trade/src/main/java/com/storlead/trade/service/impl/SopServiceImpl.java

@@ -15,6 +15,7 @@ import com.storlead.trade.entity.MarketingCampaignEntity;
 import com.storlead.trade.entity.SopDetailEntity;
 import com.storlead.trade.entity.SopEntity;
 import com.storlead.trade.mapper.SopMapper;
+import com.storlead.trade.vo.HotTemplateRankVO;
 import com.storlead.trade.service.MarketingCampaignService;
 import com.storlead.trade.service.SopDetailService;
 import com.storlead.trade.service.SopService;
@@ -222,4 +223,30 @@ public class SopServiceImpl extends ServiceImpl<SopMapper, SopEntity> implements
 
         return responsePage;
     }
+
+    /**
+     * 热门模板排行:直接读 sop_detail 上统计好的 send_number / open_rate
+     * (由 SopDetailCountTask 每天 3 点刷新),按发送数倒序取前 N。
+     * 不在这里现算邮件聚合——接口高频调用,现算的成本留给定时任务更合适。
+     */
+    @Override
+    public Result<Object> hotTemplateRank(Integer limit) {
+        int topN = (limit == null || limit <= 0) ? 10 : Math.min(limit, 50);
+        LambdaQueryWrapper<SopDetailEntity> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SopDetailEntity::getIsDelete, 0);
+        wrapper.orderByDesc(SopDetailEntity::getSendNumber);
+        wrapper.orderByDesc(SopDetailEntity::getOpenRate);
+        wrapper.last("limit " + topN);
+        List<SopDetailEntity> list = sopDetailService.list(wrapper);
+
+        List<HotTemplateRankVO> voList = list.stream().map(detail -> {
+            HotTemplateRankVO vo = new HotTemplateRankVO();
+            vo.setId(detail.getId());
+            vo.setName(detail.getName());
+            vo.setSendCount(detail.getSendNumber() == null ? 0 : detail.getSendNumber());
+            vo.setOpenRate(detail.getOpenRate() == null ? 0 : detail.getOpenRate().intValue());
+            return vo;
+        }).collect(Collectors.toList());
+        return Result.result(voList);
+    }
 }

+ 32 - 0
java/storlead-sasa/storlead-trade/src/main/java/com/storlead/trade/vo/HotTemplateRankVO.java

@@ -0,0 +1,32 @@
+package com.storlead.trade.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 热门模板排行 VO(企业邮箱管理中心-热门模板)
+ * <p>
+ * 口径:按 SOP 邮件模板(sop_detail,步骤即一封邮件模板)聚合的邮件发送数倒序排名;
+ * 数据由 {@code SopDetailCountTask} 每天 3 点统计刷新(send_number / open_rate)。
+ */
+@Data
+@ApiModel(value = "HotTemplateRankVO", description = "热门模板排行")
+public class HotTemplateRankVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "模板ID(sop_detail.id)")
+    private Long id;
+
+    @ApiModelProperty(value = "模板名称(sop_detail.name)")
+    private String name;
+
+    @ApiModelProperty(value = "累计发送数(status=1 的邮件数)")
+    private Integer sendCount = 0;
+
+    @ApiModelProperty(value = "打开率(整数百分比,如 52 表示 52%;已读邮件数/发送数)")
+    private Integer openRate = 0;
+}