Browse Source

修改智贸

Fan 1 tháng trước cách đây
mục cha
commit
559a919b8d

+ 2 - 1
ui/smarttrade-platform/src/api/marketing/index.js

@@ -19,4 +19,5 @@ export const cancelEmail = (data = {}) => post('/router/rest/marketEmails/cancel
 export const setMarketingStatus = (data = {}) => post('/router/rest/marketing/status', data)
 export const getTradeCustomer = (data = {}) => post('/router/rest/customerTrade/list', data)
 export const saveGenerateEmail = (data = {}) => post('/router/rest/sopDetail/edit', data)
-export const getEmailDetail = (data = {}) => post('/router/rest/mkt/email/get_mail_detial', data)
+export const getEmailDetail = (data = {}) => post('/router/rest/mkt/email/get_mail_detial', data)
+export const editEmail = (data = {}) => post('/router/rest/mkt/email/edit_content', data)

+ 13 - 11
ui/smarttrade-platform/src/components/addMarketing.vue

@@ -82,9 +82,9 @@
                             <label class="form-label">开始日期</label>
                             <el-date-picker
                                 v-model="newCampaign.startDate"
-                                type="date"
-                                format="YYYY-MM-DD"
-                                value-format="YYYY-MM-DD"
+                                type="datetime"
+                                format="YYYY-MM-DD HH:mm"
+                                value-format="YYYY-MM-DD HH:mm"
                                 placeholder="选择开始时间"
                             />
                         </div>
@@ -92,9 +92,9 @@
                             <label class="form-label">结束日期</label>
                             <el-date-picker
                                 v-model="newCampaign.endDate"
-                                type="date"
-                                format="YYYY-MM-DD"
-                                value-format="YYYY-MM-DD"
+                                type="datetime"
+                                format="YYYY-MM-DD HH:mm"
+                                value-format="YYYY-MM-DD HH:mm"
                                 placeholder="选择结束时间"
                             />
                         </div>
@@ -334,7 +334,7 @@
                             <div class="form-group">
                                 <label class="form-label">发件邮箱</label>
                                 <el-select v-model="newCampaign.emailSender" placeholder="请选择发件邮箱">
-                                    <el-option v-for="item in emailList" :label="item.mailAccount" :value="item.mailAccount" :key="item.id"></el-option>
+                                    <el-option v-for="item in emailList" :label="item.emailAddress" :value="item.emailAddress" :key="item.id"></el-option>
                                 </el-select>
                             </div>
                             <div class="form-group">
@@ -650,7 +650,7 @@
                 <!-- SOP 名称 -->
                 <div class="form-group">
                     <label class="form-label">序列名称 <span class="required">*</span></label>
-                    <el-input v-model="customSopData.name" placeholder="例如:我的自定义开发序列" />
+                    <el-input v-model="customSopData.name" placeholder="例如:我的自定义开发序列" :maxlength="30" />
                 </div>
 
                 <!-- 步骤列表 -->
@@ -669,7 +669,7 @@
                                 <div class="step-row">
                                     <div class="form-group">
                                         <label class="form-label">步骤名称</label>
-                                        <el-input v-model="step.name" placeholder="例如:发送产品介绍" />
+                                        <el-input v-model="step.name" placeholder="例如:发送产品介绍" :maxlength="30" />
                                     </div>
                                     <div class="form-group">
                                         <label class="form-label">间隔天数</label>
@@ -755,7 +755,7 @@
             region: '', industry: '', scoreRange: '', stage: '', companySize: '', purchaseCycle: '',
             keyword: '', selectedTags: []
         },
-        goals: { sent: 500, openRate: 40, replyRate: 10, opportunities: 15 },
+        goals: { sent: 0, openRate: 0, replyRate: 0, opportunities: 0 },
         channels: ['email'],
         emailSender: '', emailSendTime: 'optimal',
         trackOpen: true, trackClick: true, trackReply: true,
@@ -1109,6 +1109,8 @@
         }
         getSop(data?.sopId || '')
         getEmails()
+        let userInfo = JSON.parse(localStorage.getItem('userInfo') || '{}')
+        newCampaign.value.owner = [userInfo.id]
     }
 
     const regionValue = ref([])
@@ -1158,7 +1160,7 @@
         getUserEmails().then(res => {
             emailList.value = res.result || []
             if(emailList.value.length > 0) {
-                newCampaign.value.emailSender = emailList.value[0].mailAccount || ''
+                newCampaign.value.emailSender = emailList.value[0].emailAddress || ''
             }
         })
     }

+ 0 - 1
ui/smarttrade-platform/src/components/ckeditor/index.vue

@@ -95,7 +95,6 @@ export default {
 .cke_div :deep(.cke_chrome){
 	height: 100%;
 	box-sizing: border-box;
-	border-bottom: none;
 }
 .cke_div :deep(.cke_chrome) .cke_inner{
 	height: 100%;

+ 15 - 1
ui/smarttrade-platform/src/components/marketing/openedCustomers.vue

@@ -8,11 +8,25 @@
           <button class="modal-close" @click="showOpenedCustomersModal = false"><i class="fas fa-times"></i></button>
         </div>
         <div class="modal-body" v-loading="loading">
-          <div class="filter-bar">
+          <!-- <div class="filter-bar">
             <button class="filter-btn active">全部</button>
             <button class="filter-btn">高价值</button>
             <button class="filter-btn">已保护</button>
             <button class="filter-btn">营销暂停</button>
+          </div> -->
+          <div class="review-stats">
+            <div class="stat-box">
+              <span class="stat-label">全部</span>
+              <span class="stat-value">{{ openedCustomers.length }}</span>
+            </div>
+            <div class="stat-box">
+              <span class="stat-label">已保护</span>
+              <span class="stat-value">{{ openedCustomers.filter(r => r.hasProtect).length }}</span>
+            </div>
+            <div class="stat-box">
+              <span class="stat-label">营销暂停</span>
+              <span class="stat-value">{{ openedCustomers.filter(r => r.hasSuspend).length }}</span>
+            </div>
           </div>
           <div v-if="openedCustomers.length > 0" class="customers-list">
             <div v-for="customer in openedCustomers" class="customer-item" :class="{ protected: customer.hasProtect }">

+ 8 - 2
ui/smarttrade-platform/src/views/MarketingView.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="marketing-page">
+  <div class="marketing-page" v-loading="loading">
     <div class="marketing-header">
       <div class="header-left">
         <div class="data-title">📧 自动营销</div>
@@ -77,7 +77,7 @@
     </div>
 
     <!-- Campaigns Grid campaigns marketingList-->
-    <div class="campaigns-grid">
+    <div class="campaigns-grid" v-if="filteredMarketingList.length > 0">
       <div v-for="campaign in filteredMarketingList" :key="campaign.id" 
            class="campaign-card" @click="showCampaignDetail(campaign)">
         <div class="card-header">
@@ -141,6 +141,7 @@
         </div>
       </div>
     </div>
+    <div v-else class="no-data">暂无数据</div>
 
     <!-- Campaign Detail Modal -->
     <MarketingDetail ref="marketingDetailRef" />
@@ -740,6 +741,7 @@ import InterventionCustomers from '../components/marketing/interventionCustomers
 import AiGenerator from '../components/marketing/aiGenerator.vue'
 import EmailList from '../components/marketing/emailList.vue'
 import MarketingDetail from '../components/marketing/marketingDetail.vue'
+import Loading from 'element-plus/es/components/loading/src/service.mjs'
 
 const filterTab = ref('all')
 
@@ -776,7 +778,9 @@ onMounted(() => {
   getStatsData()
 })
 
+const loading = ref(false)
 const getData = () => {
+  loading.value = true
   getMarketingList({ pageIndex: 1, pageSize: 1000 }).then(res => {
     if(res.code == 200) {
       marketingList.value = res.result.result.records || []
@@ -788,6 +792,8 @@ const getData = () => {
         { key: 3, label: '已完成', count: marketingList.value.filter(item => item.status === 3).length }
       ]
     }
+  }).finally(() => {
+    loading.value = false
   })
 }
 

+ 21 - 14
ui/smarttrade-platform/src/views/emails/detail.vue

@@ -5,22 +5,22 @@
                 <div class='item'>
                     <div class="label">发件人</div>
                     <span>:</span>
-                    <div class='value'>{{ emailDetail?.fromName }}({{ emailDetail?.from }})</div>
+                    <div class='value'>{{ emailDetail?.fromName }}({{ emailDetail?.fromAddr }})</div>
                 </div>
-                <div class='item' v-if='emailDetail?.sjr?.length>0'>
+                <div class='item' v-if='emailDetail?.recipient'>
                     <div class="label">收件人</div>
                     <span>:</span>
-                    <div class='value'>{{ emailDetail?.sjr.join(',') }}</div>
+                    <div class='value'>{{ emailDetail?.recipient }}</div>
                 </div>
-                <div class='item' v-if='emailDetail?.csr?.length>0'>
+                <div class='item' v-if='emailDetail?.recipientCc'>
                     <div class="label">抄送人</div>
                     <span>:</span>
-                    <div class='value'>{{ emailDetail?.csr.join(',') }}</div>
+                    <div class='value'>{{ emailDetail?.recipientCc }}</div>
                 </div>
-                <div class='item' v-if='emailDetail?.msr?.length>0'>
+                <div class='item' v-if='emailDetail?.recipientBcc'>
                     <div class="label">密送人</div>
                     <span>:</span>
-                    <div class='value'>{{ emailDetail?.msr.join(',') }}</div>
+                    <div class='value'>{{ emailDetail?.recipientBcc }}</div>
                 </div>
                 <div class='item' v-if='emailDetail?.subject'>
                     <div class="label">主题</div>
@@ -51,22 +51,29 @@
     import { ref, onMounted } from 'vue';
     import { getEmailDetail } from '@/api/marketing'
     import { useRouter } from 'vue-router'
+    import moment from 'moment';
 
     const emailLoading = ref(false);
     const emailDetail = ref({
-        fromName: 'zhuwanlong',
-        from: 'zhuwanlong@lcjs43.wecom.work',
-        sjr: ['daisy<daisy@storlead.com>'],
-        subject: 'One-stop storage solution focusing on SSD Controller',
-        sentDate: '2025-10-16 17:20:02',
-        content: '<p>Dear all,</p><p>One-stop storage solution focusing on SSD Controller</p>',
+        fromName: '',
+        fromAddr: '',
+        recipient: '',
+        recipientCc: '',
+        recipientBcc: '',
+        subject: '',
+        sentDate: '',
+        content: '',
     })
 
     const router = useRouter();
     let queryData = router.currentRoute.value.query
     const getData = () => {
+        emailLoading.value = true;
         getEmailDetail({ mailId: queryData.id }).then(res => {
-            console.log('res :>> ', res);
+            res.result.sentDate = moment(res.result.sentDate).format('YYYY-MM-DD HH:mm:ss')
+            Object.assign(emailDetail.value, res.result)
+        }).finally(() => {
+            emailLoading.value = false;
         })
     }
 

+ 24 - 12
ui/smarttrade-platform/src/views/emails/edit.vue

@@ -2,22 +2,22 @@
     <div class="send-email" style="display: flex;" v-loading="dataLoadng">
         <div class="header">
             <div class="header-btn">
-                <el-button type="primary">保存</el-button>
+                <el-button type="primary" @click="saveEmail" v-loading>保存</el-button>
             </div>
         </div>
         <div class="content" style="display: flex;">
             <div class="send-content">
                 <div class="send-input">
                     <span class="send-label">收件人</span>
-                    <el-input v-model="form.recipientls" disabled></el-input>
+                    <el-input v-model="form.recipient" disabled></el-input>
                 </div>
                 <div class="send-input">
                     <span class="send-label">抄送</span>
-                    <el-input v-model="form.recipientCcls" disabled></el-input>
+                    <el-input v-model="form.recipientCc" disabled></el-input>
                 </div>
                 <div class="send-input">
                     <span class="send-label">密件抄送</span>
-                    <el-input v-model="form.recipientBccls" disabled></el-input>
+                    <el-input v-model="form.recipientBcc" disabled></el-input>
                 </div>
                 <div class="send-input">
                     <span class="send-label">主题</span>
@@ -32,7 +32,7 @@
                             :content="form.content"
                             ref="ckeditorRef"
                         ></ckeditor>
-                        <div class="ai-button" v-if="aiShow">
+                        <!-- <div class="ai-button" v-if="aiShow">
                             <el-button v-for="item in aiButton" @click="aiButtonClick(item)">
                                 <img :src="getImageUrl(item.value)" />
                                 {{ item.label }}
@@ -41,7 +41,7 @@
                         <div class="ai-div">
                             <p>智能写信新体验,试试AI润色让文字焕发活力</p>
                             <el-button type="primary" @click="aiShow = !aiShow">AI润色</el-button>
-                        </div>
+                        </div> -->
                     </div>
                     <div class="file-div" v-loading="fileLoading">
                         <div class="file-header">
@@ -97,7 +97,7 @@
 <script setup>
     import { ref, reactive, onMounted } from 'vue'
     import { useRouter } from 'vue-router'
-    import { getEmailDetail } from '@/api/marketing'
+    import { getEmailDetail, editEmail } from '@/api/marketing'
     import ckeditor from '@/components/ckeditor/index.vue'
 
     const getContent = (val) => {
@@ -108,7 +108,7 @@
     let queryData = router.currentRoute.value.query
     const getData = () => {
         getEmailDetail({ mailId: queryData.id }).then(res => {
-            console.log('res :>> ', res);
+            Object.assign(form.value, res.result)
         })
     }
 
@@ -284,9 +284,9 @@
     const isDelaySend = ref(0)
     const form = ref({
         content: '',
-        recipientls: [],
-        recipientCcls: [],
-        recipientBccls: [],
+        recipient: '',
+        recipientCc: '',
+        recipientBcc: '',
         subject: '',
         fileIds: [],
         replyMsgId: '',
@@ -298,6 +298,18 @@
         oldfileIds: undefined
     })
 
+    const saveLoading = ref(false)
+    const saveEmail = () => {
+        saveLoading.value = true
+        editEmail({ mailId: form.value.id, content: form.value.content }).then(res => {
+            ElMessage.success('保存成功')
+        }).catch((err) => {
+            ElMessage.error(err.message || '保存失败')
+        }).finally(() => {
+            saveLoading.value = false
+        })
+    }
+
     // 上传附件部分
     // const token = getToken()
     const uploadRef = ref()
@@ -603,7 +615,7 @@
     display: flex;
     align-items: center;
     height: 41px;
-    /* background: #313F54; */
+    background: #f8f8f8;
     color: #000;
     justify-content: space-between;
     padding: 0 10px;