Explorar el Código

对接邮箱发送统计接口

Fan hace 15 horas
padre
commit
cff646f820

+ 4 - 1
ui/smarttrade-platform/src/api/emails/index.js

@@ -4,4 +4,7 @@ export const getMailsPort = (mailAccount) => post('/router/rest/mail/common/mail
 export const emailsTest = (data) => post('/router/rest/mkt/email/account/test_connect', data)
 export const addEmailsSetting = (data) => post('/router/rest/mkt/email/account/save', data)
 export const getUserEmails = () => post('/router/rest/mkt/email/account/personal_mail_account')
-export const getAccountTotal = (data) => post('/router/rest/marketEmails/account-total', data)
+export const getAccountTotal = (data) => post('/router/rest/marketEmails/account-total', data)
+export const getTodayStats = () => get('/router/rest/marketEmails/today-stats')
+export const getSendTrend = () => get('/router/rest/marketEmails/send-trend-7d')
+export const getHotTemplates = () => get('/router/rest/api/sop/hot-template-rank')

+ 1 - 1
ui/smarttrade-platform/src/assets/styles/settings.css

@@ -102,7 +102,7 @@
 .chart-section h5 i, .top-performers h5 i { color: var(--primary); }
 
 .simple-chart { display: flex; align-items: flex-end; gap: 12px; height: 160px; padding: 30px 20px; background: var(--bg-hover); border-radius: 12px; }
-.chart-bar { flex: 1; background: linear-gradient(to top, var(--primary), var(--secondary)); border-radius: 6px 6px 0 0; position: relative; min-height: 20px; display: flex; align-items: flex-end; justify-content: center; padding-bottom: 8px; }
+.chart-bar { flex: 1; background: linear-gradient(to top, var(--primary), var(--secondary)); border-radius: 6px 6px 0 0; position: relative; display: flex; align-items: flex-end; justify-content: center; }
 .chart-bar span { font-size: 11px; color: var(--text-muted); position: absolute; bottom: -24px; }
 
 .template-list { display: flex; flex-direction: column; gap: 10px; }

+ 29 - 23
ui/smarttrade-platform/src/components/email/email.vue

@@ -70,28 +70,28 @@
               <div class="stat-card">
                 <div class="stat-icon"><i class="fas fa-paper-plane"></i></div>
                 <div class="stat-info">
-                  <div class="stat-value">{{ emailAccounts.reduce((sum, a) => sum + a.sendToday, 0) }}</div>
+                  <div class="stat-value">{{ todayData.todaySendCount }}</div>
                   <div class="stat-label">今日发送</div>
                 </div>
               </div>
               <div class="stat-card">
                 <div class="stat-icon"><i class="fas fa-envelope-open"></i></div>
                 <div class="stat-info">
-                  <div class="stat-value">{{ emailAccounts.reduce((sum, a) => sum + a.sendToday * 0.45, 0).toFixed(0) }}</div>
+                  <div class="stat-value">{{ todayData.todayOpenCount }}</div>
                   <div class="stat-label">今日打开</div>
                 </div>
               </div>
               <div class="stat-card">
                 <div class="stat-icon"><i class="fas fa-reply"></i></div>
                 <div class="stat-info">
-                  <div class="stat-value">{{ emailAccounts.reduce((sum, a) => sum + a.sendToday * a.replyRate / 100, 0).toFixed(0) }}</div>
+                  <div class="stat-value">{{ todayData.todayReplyCount }}</div>
                   <div class="stat-label">今日回复</div>
                 </div>
               </div>
               <div class="stat-card">
                 <div class="stat-icon"><i class="fas fa-mouse-pointer"></i></div>
                 <div class="stat-info">
-                  <div class="stat-value">{{ emailAccounts.reduce((sum, a) => sum + a.sendToday * 0.15, 0).toFixed(0) }}</div>
+                  <div class="stat-value">{{ todayData.todayRefuseCount }}</div>
                   <div class="stat-label">今日拒收</div>
                 </div>
               </div>
@@ -99,29 +99,17 @@
             <div class="chart-section">
               <h5><i class="fas fa-chart-line"></i> 最近7天发送趋势</h5>
               <div class="simple-chart">
-                <div class="chart-bar" style="height: 45%"><span>周一</span></div>
-                <div class="chart-bar" style="height: 62%"><span>周二</span></div>
-                <div class="chart-bar" style="height: 58%"><span>周三</span></div>
-                <div class="chart-bar" style="height: 75%"><span>周四</span></div>
-                <div class="chart-bar" style="height: 82%"><span>周五</span></div>
-                <div class="chart-bar" style="height: 40%"><span>周六</span></div>
-                <div class="chart-bar" style="height: 35%"><span>周日</span></div>
+                <div class="chart-bar" :style="{ height: (item.sendCount / sendTrendTotal) * 100 + '%' }" v-for="item in sendTrendData">
+                  <span>{{ item.date }}</span>
+                </div>
               </div>
             </div>
             <div class="top-performers">
               <h5><i class="fas fa-trophy"></i> 热门模板</h5>
               <div class="template-list">
-                <div class="template-item">
-                  <span class="template-name">产品介绍邮件</span>
-                  <span class="template-stats">发送 1,234 · 打开率 52%</span>
-                </div>
-                <div class="template-item">
-                  <span class="template-name">节日祝福</span>
-                  <span class="template-stats">发送 856 · 打开率 68%</span>
-                </div>
-                <div class="template-item">
-                  <span class="template-name">跟进邮件</span>
-                  <span class="template-stats">发送 654 · 打开率 45%</span>
+                <div class="template-item" v-for="item in templatesData">
+                  <span class="template-name">{{ item.name }}</span>
+                  <span class="template-stats">发送 {{ item.sendCount }} · 打开率 {{ item.openRate * 100 }}%</span>
                 </div>
               </div>
             </div>
@@ -255,7 +243,7 @@
 <script setup>
     import { ref } from 'vue'
     import AddEmailModal from './addEmail.vue'
-    import { getMailsPort, getAccountTotal } from '@/api/emails'
+    import { getMailsPort, getAccountTotal, getTodayStats, getSendTrend, getHotTemplates } from '@/api/emails'
 
     const showEmailModal = ref(false)
     // 企业邮箱列表
@@ -284,6 +272,24 @@
             total.value.replyRate = emailList.value.reduce((sum, a) => sum + (a.accountTotal.replyRate * 100 || 0), 0) / emailList.value.length
           })
         }
+        getOther()
+    }
+
+    const todayData = ref({})
+    const sendTrendData = ref([])
+    const sendTrendTotal = ref(0)
+    const templatesData = ref([])
+    const getOther = () => {
+      getTodayStats().then(res => {
+        todayData.value = res.result
+      })
+      getSendTrend().then(res => {
+        sendTrendData.value = res.result
+        sendTrendTotal.value = sendTrendData.value.reduce((sum, a) => sum + a.sendCount, 0)
+      })
+      getHotTemplates().then(res => {
+        templatesData.value = res.result
+      })
     }
 
     const tabTyps = ref('email')