YPZ 1 månad sedan
förälder
incheckning
2761513a5f

+ 41 - 0
java/storlead-sasa/storlead-trade/src/main/java/com/storlead/trade/service/impl/MarketingCampaignServiceImpl.java

@@ -12,6 +12,7 @@ import com.storlead.trade.dto.MarketingCampaignDTO;
 import com.storlead.trade.entity.*;
 import com.storlead.trade.mapper.MarketingCampaignEntityMapper;
 import com.storlead.trade.service.*;
+import com.storlead.trade.vo.CampaignStatsVO;
 import com.storlead.trade.vo.MarketingCampaignDetailVO;
 import com.storlead.trade.vo.MarketingCampaignVO;
 import com.storlead.framework.common.constant.CommonConstant;
@@ -165,6 +166,46 @@ public class MarketingCampaignServiceImpl
         detailVO.setSopDetailList(relationList);
         detailVO.setCustomerList(customerEntityList);
 
+        // 4. 计算达成率统计(从 market_emails 表取实际数据)
+        CampaignStatsVO stats = new CampaignStatsVO();
+        Integer sendVolume = campaign.getSendVolume();
+        stats.setSendVolume(sendVolume);
+
+        Integer sentCountLong = marketEmailsService.lambdaQuery()
+                .eq(MarketEmailsEntity::getMarketingCampaignId, id)
+                .eq(MarketEmailsEntity::getIsDelete, CommonConstant.DEL_FLAG_0)
+                .eq(MarketEmailsEntity::getStatus, 1)
+                .count();
+        Integer sentCount = sentCountLong == null ? 0 : sentCountLong.intValue();
+        stats.setSentCount(sentCount);
+
+        Integer openCountLong = marketEmailsService.lambdaQuery()
+                .eq(MarketEmailsEntity::getMarketingCampaignId, id)
+                .eq(MarketEmailsEntity::getIsDelete, CommonConstant.DEL_FLAG_0)
+                .eq(MarketEmailsEntity::getHasReader, 1)
+                .count();
+        Integer openCount = openCountLong == null ? 0 : openCountLong.intValue();
+        stats.setOpenCount(openCount);
+
+        Integer replyCountLong = marketEmailsService.lambdaQuery()
+                .eq(MarketEmailsEntity::getMarketingCampaignId, id)
+                .eq(MarketEmailsEntity::getIsDelete, CommonConstant.DEL_FLAG_0)
+                .eq(MarketEmailsEntity::getHasReply, 1)
+                .count();
+        Integer replyCount = replyCountLong == null ? 0 : replyCountLong.intValue();
+        stats.setReplyCount(replyCount);
+
+        // 打开率 = openCount / sentCount
+        stats.setOpenRate(sentCount > 0 ? Math.round(openCount * 100f / sentCount) : 0);
+        // 回复率 = replyCount / sentCount
+        stats.setReplyRate(sentCount > 0 ? Math.round(replyCount * 100f / sentCount) : 0);
+        // 达成率 = sentCount / sendVolume
+        stats.setAchievementRate(sendVolume != null && sendVolume > 0
+                ? Math.min(Math.round(sentCount * 100f / sendVolume), 100)
+                : 0);
+
+        detailVO.setStats(stats);
+
         return Result.result(detailVO);
     }
 

+ 31 - 0
java/storlead-sasa/storlead-trade/src/main/java/com/storlead/trade/vo/CampaignStatsVO.java

@@ -0,0 +1,31 @@
+package com.storlead.trade.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "CampaignStatsVO", description = "营销活动达成率统计")
+public class CampaignStatsVO {
+
+    @ApiModelProperty(value = "计划发送量(来自营销活动sendVolume)")
+    private Integer sendVolume;
+
+    @ApiModelProperty(value = "实际已发送数(market_emails.status=1)")
+    private Integer sentCount;
+
+    @ApiModelProperty(value = "打开数(market_emails.hasReader=1)")
+    private Integer openCount;
+
+    @ApiModelProperty(value = "回复数(market_emails.hasReply=1)")
+    private Integer replyCount;
+
+    @ApiModelProperty(value = "打开率(0-100)")
+    private Integer openRate;
+
+    @ApiModelProperty(value = "回复率(0-100)")
+    private Integer replyRate;
+
+    @ApiModelProperty(value = "达成率(0-100)")
+    private Integer achievementRate;
+}

+ 3 - 0
java/storlead-sasa/storlead-trade/src/main/java/com/storlead/trade/vo/MarketingCampaignDetailVO.java

@@ -22,4 +22,7 @@ public class MarketingCampaignDetailVO {
 
     @ApiModelProperty(value = "关联的sop详情")
     private SopEntity sopEntity;
+
+    @ApiModelProperty(value = "达成率统计(计划/已发送/打开/回复 + 三个率)")
+    private CampaignStatsVO stats;
 }