소스 검색

修改营销

Fan 3 주 전
부모
커밋
697e0a779a

+ 12 - 9
ui/smarttrade-platform/src/assets/styles/marketing.css

@@ -198,6 +198,7 @@
 .customers-list { display: flex; flex-direction: column; gap: 12px; }
 .customer-item { padding: 14px; background: var(--bg-hover); border-radius: 10px; border-left: 3px solid var(--border); transition: all 0.2s; }
 .customer-item.protected { border-left-color: var(--success); background: rgba(16, 185, 129, 0.05); }
+.customer-item.suspended { border-left-color: var(--warning); background: rgba(245, 158, 11, 0.05); }
 .customer-item .customer-header { display: flex; justify-content: space-between; align-items: flex-start; }
 .customer-item .customer-info { flex: 1; }
 .customer-item .customer-name { font-size: 14px; font-weight: 600; margin-bottom: 2px; display: flex; align-items: center; gap: 8px; }
@@ -218,8 +219,8 @@
 
 .replies-list { display: flex; flex-direction: column; gap: 12px; }
 .reply-item { padding: 14px; background: var(--bg-hover); border-radius: 10px; border-left: 3px solid var(--border); transition: all 0.2s; }
-.reply-item.pending-review { border-left-color: var(--warning); }
-.reply-item.approved { border-left-color: var(--success); opacity: 0.9; }
+.reply-item.pending-review { border-left-color: var(--warning);background: rgba(245, 158, 11, 0.05); }
+.reply-item.approved { border-left-color: var(--success); background: rgba(16, 185, 129, 0.05); }
 .reply-item.rejected { border-left-color: #EF4444; opacity: 0.7; }
 .reply-item.assigned { border-left-color: var(--primary); }
 .reply-item.requires-review { background: rgba(245, 158, 11, 0.05); }
@@ -249,19 +250,21 @@
 
 /* Protected Customers */
 .protected-customers { display: flex; flex-direction: column; gap: 10px; }
-.protected-customer-item { padding: 12px; background: var(--bg-dark); border-radius: 8px; border-left: 3px solid var(--success); }
-.protected-customer-item .customer-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px; }
-.protected-customer-item .customer-info { flex: 1; }
-.protected-customer-item .customer-name { font-size: 14px; font-weight: 600; margin-bottom: 2px; display: flex; align-items: center; gap: 8px; }
+.intervention-item { padding: 12px; border-radius: 10px; }
+.protected-customer-item { background: rgba(16, 185, 129, 0.05); border-left: 3px solid var(--success); }
+.suspended-customer-item { background: rgba(245, 158, 11, 0.05); border-left: 3px solid var(--warning); }
+.intervention-item .customer-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px; }
+.intervention-item .customer-info { flex: 1; }
+.intervention-item .customer-name { font-size: 14px; font-weight: 600; margin-bottom: 2px; display: flex; align-items: center; gap: 8px; }
 .protection-level { font-size: 10px; padding: 2px 8px; border-radius: 10px; margin-left: 8px; }
 .protection-level.高 { background: rgba(239, 68, 68, 0.2); color: #EF4444; }
 .protection-level.中 { background: rgba(245, 158, 11, 0.2); color: #F59E0B; }
-.protected-customer-item .customer-email { font-size: 12px; color: var(--text-muted); }
+.intervention-item .customer-email { font-size: 12px; color: var(--text-muted); }
 .customer-meta { display: flex; gap: 12px; font-size: 11px; color: var(--text-muted); }
 .meta-item { display: flex; align-items: center; gap: 4px; }
-.protected-customer-item .customer-details { display: flex; gap: 12px; font-size: 11px; color: var(--text-muted); margin-bottom: 8px; }
+.intervention-item .customer-details { display: flex; gap: 12px; font-size: 11px; color: var(--text-muted); margin-bottom: 8px; }
 .detail { display: flex; align-items: center; gap: 4px; }
-.protected-customer-item .customer-actions { display: flex; gap: 8px; }
+.intervention-item .customer-actions { display: flex; gap: 8px; }
 
 /* Intervention Options */
 .tabs-section { display: flex; gap: 12px; margin-bottom: 16px; padding-bottom: 12px; border-bottom: 1px solid var(--border); }

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

@@ -155,7 +155,7 @@ const viewDetail = (item) => {
   // 这里可以接入查看详情逻辑
   const { href } = router.resolve({
     path: '/emails/detail',
-    query: { id: item.emailId }
+    query: { id: item.id }
   })
   window.open(href, '_blank')
 }

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

@@ -20,7 +20,7 @@
           <!-- Protected Customers List -->
           <div class="detail-section" v-if="protectedCustomersList.length > 0">
             <div class="protected-customers">
-              <div v-for="customer in protectedCustomersList" :key="customer.id" class="protected-customer-item">
+              <div v-for="customer in protectedCustomersList" :key="customer.id" class="intervention-item" :class="{ 'protected-customer-item': tabType == 'protect', 'suspended-customer-item': tabType == 'suspend' }">
                 <div class="customer-header">
                   <div class="customer-info">
                     <div class="customer-name">

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

@@ -23,7 +23,7 @@
             </div>
           </div>
           <div v-if="openedCustomers.length > 0" class="customers-list">
-            <div v-for="customer in openedCustomers" class="customer-item" :class="{ protected: customer.hasProtect }">
+            <div v-for="customer in openedCustomers" class="customer-item" :class="{ protected: customer.hasProtect, suspended: !customer.hasProtect && customer.hasSuspend }">
               <div class="customer-header">
                 <div class="customer-info">
                   <div class="customer-name">

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

@@ -23,7 +23,7 @@
             </div>
           </div>
           <div class="replies-list" v-if="repliedCustomers.length > 0">
-            <div v-for="reply in repliedCustomers" :key="reply.id" class="reply-item" :class="['pending-review', { 'requires-review': !reply.requiresHumanReview }]">
+            <div v-for="reply in repliedCustomers" :key="reply.id" class="reply-item" :class="{ approved: reply.hasProtect, 'pending-review': !reply.hasProtect && reply.hasSuspend }">
               <div class="reply-header">
                 <div class="reply-info">
                   <div class="reply-name">

+ 4 - 6
ui/smarttrade-platform/src/views/emails/detail.vue

@@ -2,7 +2,7 @@
     <div class="follow_email" v-loading="emailLoading">
         <div class="email_area">
             <div class='header_message'>
-                <div class='item' v-if="!previewMode">
+                <div class='item' v-if="emailDetail.fromAddr">
                     <div class="label">发件人</div>
                     <span>:</span>
                     <div class='value'>{{ emailDetail?.fromName }}({{ emailDetail?.fromAddr }})</div>
@@ -27,10 +27,10 @@
                     <span>:</span>
                     <div class='value'>{{ emailDetail?.subject }}</div>
                 </div>
-                <div class='item' v-if='emailDetail?.sentDate'>
+                <div class='item' v-if='emailDetail?.expectSendTime'>
                     <div class="label">日期</div>
                     <span>:</span>
-                    <div class='value'>{{ emailDetail?.sentDate }}</div>
+                    <div class='value'>{{ emailDetail?.expectSendTime }}</div>
                 </div>
                 <div class='item' v-if='emailDetail?.attachments && emailDetail?.attachments?.length>0'>
                     <div class="label">附件</div>
@@ -51,7 +51,6 @@
     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({
@@ -88,8 +87,7 @@
         }
 
         emailLoading.value = true;
-        getEmailDetail({ mailId: queryData.id }).then(res => {
-            res.result.sentDate = moment(res.result.sentDate).format('YYYY-MM-DD HH:mm:ss')
+        getEmailDetail({ id: queryData.id }).then(res => {
             Object.assign(emailDetail.value, res.result)
         }).finally(() => {
             emailLoading.value = false;