Explorar el Código

修改自动营销

Fan hace 2 semanas
padre
commit
37de53d5e9

+ 172 - 0
ui/smarttrade-platform/package-lock.json

@@ -10,6 +10,7 @@
       "dependencies": {
         "@fortawesome/fontawesome-free": "^6.5.1",
         "axios": "^1.6.7",
+        "element-plus": "^2.14.2",
         "pinia": "^2.1.7",
         "vue": "^3.4.21",
         "vue-router": "^4.3.0"
@@ -65,6 +66,22 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@ctrl/tinycolor": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz",
+      "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==",
+      "engines": {
+        "node": ">=14"
+      }
+    },
+    "node_modules/@element-plus/icons-vue": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz",
+      "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==",
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
     "node_modules/@esbuild/aix-ppc64": {
       "version": "0.21.5",
       "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
@@ -456,6 +473,28 @@
         "node": ">=12"
       }
     },
+    "node_modules/@floating-ui/core": {
+      "version": "1.7.5",
+      "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz",
+      "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==",
+      "dependencies": {
+        "@floating-ui/utils": "^0.2.11"
+      }
+    },
+    "node_modules/@floating-ui/dom": {
+      "version": "1.7.6",
+      "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz",
+      "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==",
+      "dependencies": {
+        "@floating-ui/core": "^1.7.5",
+        "@floating-ui/utils": "^0.2.11"
+      }
+    },
+    "node_modules/@floating-ui/utils": {
+      "version": "0.2.11",
+      "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz",
+      "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="
+    },
     "node_modules/@fortawesome/fontawesome-free": {
       "version": "6.7.2",
       "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz",
@@ -471,6 +510,16 @@
       "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
       "license": "MIT"
     },
+    "node_modules/@popperjs/core": {
+      "name": "@sxzz/popperjs-es",
+      "version": "2.11.8",
+      "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz",
+      "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/popperjs"
+      }
+    },
     "node_modules/@rollup/rollup-android-arm-eabi": {
       "version": "4.60.1",
       "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz",
@@ -828,6 +877,24 @@
       "dev": true,
       "license": "MIT"
     },
+    "node_modules/@types/lodash": {
+      "version": "4.17.24",
+      "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz",
+      "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ=="
+    },
+    "node_modules/@types/lodash-es": {
+      "version": "4.17.12",
+      "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
+      "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
+      "dependencies": {
+        "@types/lodash": "*"
+      }
+    },
+    "node_modules/@types/web-bluetooth": {
+      "version": "0.0.21",
+      "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz",
+      "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="
+    },
     "node_modules/@vitejs/plugin-vue": {
       "version": "5.2.4",
       "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
@@ -948,6 +1015,41 @@
       "integrity": "sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==",
       "license": "MIT"
     },
+    "node_modules/@vueuse/core": {
+      "version": "14.3.0",
+      "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.3.0.tgz",
+      "integrity": "sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==",
+      "dependencies": {
+        "@types/web-bluetooth": "^0.0.21",
+        "@vueuse/metadata": "14.3.0",
+        "@vueuse/shared": "14.3.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "vue": "^3.5.0"
+      }
+    },
+    "node_modules/@vueuse/metadata": {
+      "version": "14.3.0",
+      "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.3.0.tgz",
+      "integrity": "sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/@vueuse/shared": {
+      "version": "14.3.0",
+      "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.3.0.tgz",
+      "integrity": "sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==",
+      "funding": {
+        "url": "https://github.com/sponsors/antfu"
+      },
+      "peerDependencies": {
+        "vue": "^3.5.0"
+      }
+    },
     "node_modules/agent-base": {
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@@ -960,6 +1062,11 @@
         "node": ">= 6.0.0"
       }
     },
+    "node_modules/async-validator": {
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
+      "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
+    },
     "node_modules/asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -1009,6 +1116,11 @@
       "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
       "license": "MIT"
     },
+    "node_modules/dayjs": {
+      "version": "1.11.21",
+      "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz",
+      "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA=="
+    },
     "node_modules/debug": {
       "version": "4.4.3",
       "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@@ -1049,6 +1161,31 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/element-plus": {
+      "version": "2.14.2",
+      "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.14.2.tgz",
+      "integrity": "sha512-eNH9uP3wQoNqieEIHXiNvIVv+zO5sZDU0CAZq5b0zqSN06DD0/V9xIq1R/qm3rw5k3nBTM1JvpxhCfRbaFLzDQ==",
+      "dependencies": {
+        "@ctrl/tinycolor": "^4.2.0",
+        "@element-plus/icons-vue": "^2.3.2",
+        "@floating-ui/dom": "^1.7.6",
+        "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.8",
+        "@types/lodash": "^4.17.24",
+        "@types/lodash-es": "^4.17.12",
+        "@vueuse/core": "14.3.0",
+        "async-validator": "^4.2.5",
+        "dayjs": "^1.11.20",
+        "lodash": "^4.18.1",
+        "lodash-es": "^4.18.1",
+        "lodash-unified": "^1.0.3",
+        "memoize-one": "^6.0.0",
+        "normalize-wheel-es": "^1.2.0",
+        "vue-component-type-helpers": "^3.3.3"
+      },
+      "peerDependencies": {
+        "vue": "^3.3.7"
+      }
+    },
     "node_modules/entities": {
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
@@ -1312,6 +1449,26 @@
         "node": ">= 6"
       }
     },
+    "node_modules/lodash": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+      "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="
+    },
+    "node_modules/lodash-es": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz",
+      "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A=="
+    },
+    "node_modules/lodash-unified": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz",
+      "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
+      "peerDependencies": {
+        "@types/lodash-es": "*",
+        "lodash": "*",
+        "lodash-es": "*"
+      }
+    },
     "node_modules/magic-string": {
       "version": "0.30.21",
       "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
@@ -1330,6 +1487,11 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/memoize-one": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
+      "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
+    },
     "node_modules/mime-db": {
       "version": "1.52.0",
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@@ -1375,6 +1537,11 @@
         "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
       }
     },
+    "node_modules/normalize-wheel-es": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+      "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
+    },
     "node_modules/picocolors": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -1575,6 +1742,11 @@
         }
       }
     },
+    "node_modules/vue-component-type-helpers": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.6.tgz",
+      "integrity": "sha512-FkljacAwJ9BUoSUdpFe3VDy0sGigNlTH9+2zcXUWmZOjN8swiCkl3t48wOJun0OsUd2cEIda1l04tsxMiKIIrQ=="
+    },
     "node_modules/vue-demi": {
       "version": "0.14.10",
       "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",

+ 4 - 3
ui/smarttrade-platform/package.json

@@ -9,11 +9,12 @@
     "preview": "vite preview"
   },
   "dependencies": {
+    "@fortawesome/fontawesome-free": "^6.5.1",
     "axios": "^1.6.7",
-    "vue": "^3.4.21",
-    "vue-router": "^4.3.0",
+    "element-plus": "^2.14.2",
     "pinia": "^2.1.7",
-    "@fortawesome/fontawesome-free": "^6.5.1"
+    "vue": "^3.4.21",
+    "vue-router": "^4.3.0"
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^5.0.4",

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

@@ -1,3 +1,5 @@
 import { get, post, put, remove, upload } from '@/utils/request'
 
-export const getMarketingList = (params = {}) => post('/router/rest/marketing/list', params)
+export const getMarketingList = (data = {}) => post('/router/rest/marketing/list', data)
+export const getSopList = (data = {}) => post('/router/rest/api/sop', data)
+export const addMarketing = (data = {}) => post('/router/rest/marketing/add', data)

+ 10 - 0
ui/smarttrade-platform/src/assets/styles/marketing.css

@@ -750,6 +750,16 @@
 .confirm-section h5 { font-size: 13px; margin-bottom: 12px; display: flex; align-items: center; gap: 6px; }
 .confirm-item { position: relative; padding-left: 28px; }
 .confirm-item .checkmark { position: absolute; left: 0; width: 18px; height: 18px; border: 2px solid var(--border); border-radius: 4px; }
+.confirm-item input {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 18px;
+  height: 18px;
+  margin: 0;
+  opacity: 0;
+  cursor: pointer;
+}
 .confirm-item input:checked + .checkmark { background: var(--success); border-color: var(--success); }
 .confirm-item input:checked + .checkmark::after { content: '✓'; position: absolute; color: white; font-size: 12px; top: 50%; left: 50%; transform: translate(-50%, -50%); }
 

+ 360 - 161
ui/smarttrade-platform/src/components/addMarketing.vue

@@ -44,8 +44,12 @@
                     <h4><i class="fas fa-info-circle"></i> 活动基本信息</h4>
                     <div class="form-group">
                         <label class="form-label">活动名称 <span class="required">*</span></label>
-                        <input type="text" class="form-input" v-model="newCampaign.name"
-                            placeholder="例如:2026春季中东客户开发活动" />
+                        <el-input
+                            v-model="newCampaign.name"
+                            maxlength="30"
+                            show-word-limit
+                            placeholder="例如:2026春季中东客户开发活动"
+                        />
                         <div class="form-hint" v-if="!newCampaign.name">
                             建议格式:时间+区域+目标+活动类型
                         </div>
@@ -53,70 +57,83 @@
                     <div class="form-row">
                         <div class="form-group">
                             <label class="form-label">活动类型</label>
-                            <select class="form-select" v-model="newCampaign.type">
-                                <option value="prospect">潜客开发</option>
-                                <option value="nurture">客户培育</option>
-                                <option value="reactivate">客户唤醒</option>
-                                <option value="promote">产品推广</option>
-                                <option value="seasonal">节日营销</option>
-                                <option value="exhibition">展会跟进</option>
-                            </select>
+                            <el-select v-model="newCampaign.type" placeholder="请选择活动类型">
+                                <el-option label="潜客开发" value="潜客开发" />
+                                <el-option label="客户培育" value="客户培育" />
+                                <el-option label="客户唤醒" value="客户唤醒" />
+                                <el-option label="产品推广" value="产品推广" />
+                                <el-option label="节日营销" value="节日营销" />
+                                <el-option label="展会跟进" value="展会跟进" />
+                            </el-select>
                         </div>
                         <div class="form-group">
                             <label class="form-label">优先级</label>
-                            <select class="form-select" v-model="newCampaign.priority">
-                                <option value="urgent">紧急</option>
-                                <option value="high">高优先</option>
-                                <option value="medium">中等</option>
-                                <option value="low">低优先</option>
-                            </select>
+                            <el-select v-model="newCampaign.priority" placeholder="请选择优先级">
+                                <el-option label="高" value="高" />
+                                <el-option label="中" value="中" />
+                                <el-option label="低" value="低" />
+                            </el-select>
                         </div>
                     </div>
                     <div class="form-row">
                         <div class="form-group">
                             <label class="form-label">开始日期</label>
-                            <input type="date" class="form-input" v-model="newCampaign.startDate" />
+                            <el-date-picker
+                                v-model="newCampaign.startDate"
+                                type="datetime"
+                                format="YYYY-MM-DD HH:mm"
+                                value-format="YYYY-MM-DD HH:mm:ss"
+                                placeholder="选择开始时间"
+                            />
                         </div>
                         <div class="form-group">
                             <label class="form-label">结束日期</label>
-                            <input type="date" class="form-input" v-model="newCampaign.endDate" />
+                            <el-date-picker
+                                v-model="newCampaign.endDate"
+                                type="datetime"
+                                format="YYYY-MM-DD HH:mm"
+                                value-format="YYYY-MM-DD HH:mm:ss"
+                                placeholder="选择结束时间"
+                            />
                         </div>
                     </div>
                     <div class="form-row">
                         <div class="form-group">
                             <label class="form-label">负责人</label>
-                            <select class="form-select" v-model="newCampaign.owner">
-                                <option value="">选择负责人</option>
-                                <option value="sales1">张经理</option>
-                                <option value="sales2">李主管</option>
-                                <option value="sales3">王小明</option>
-                            </select>
+                            <el-select v-model="newCampaign.owner" multiple collapse-tags placeholder="选择负责人">
+                                <el-option label="张经理" value="sales1" />
+                                <el-option label="李主管" value="sales2" />
+                                <el-option label="王小明" value="sales3" />
+                            </el-select>
                         </div>
                     </div>
                     <div class="form-group">
                         <label class="form-label">活动描述</label>
-                        <textarea class="form-textarea" v-model="newCampaign.description" rows="3"
-                            placeholder="描述本次营销活动的目标和策略..."></textarea>
+                        <el-input
+                            v-model="newCampaign.description"
+                            type="textarea"
+                            :rows="3"
+                            maxlength="150"
+                            show-word-limit
+                            placeholder="描述本次营销活动的目标和策略..."
+                        />
                     </div>
                     <div class="form-group">
                         <label class="form-label">活动目标</label>
                         <div class="goal-inputs">
                             <div class="goal-item">
                                 <i class="fas fa-envelope"></i>
-                                <input type="number" class="goal-input" v-model="newCampaign.goals.sent"
-                                    placeholder="0" />
+                                <el-input-number v-model="newCampaign.goals.sent" :controls="false" :min="0" />
                                 <span>发送量</span>
                             </div>
                             <div class="goal-item">
                                 <i class="fas fa-envelope-open"></i>
-                                <input type="number" class="goal-input" v-model="newCampaign.goals.openRate"
-                                    placeholder="0" />
+                                <el-input-number v-model="newCampaign.goals.openRate" :controls="false" :min="0" :max="100" />
                                 <span>% 打开率</span>
                             </div>
                             <div class="goal-item">
                                 <i class="fas fa-reply"></i>
-                                <input type="number" class="goal-input" v-model="newCampaign.goals.replyRate"
-                                    placeholder="0" />
+                                <el-input-number v-model="newCampaign.goals.replyRate" :controls="false" :min="0" :max="100" />
                                 <span>% 回复率</span>
                             </div>
                         </div>
@@ -188,54 +205,49 @@
                         <div class="filter-row">
                             <div class="form-group">
                                 <label class="form-label">地区</label>
-                                <select class="form-select" v-model="newCampaign.filters.region">
-                                    <option value="">全部地区</option>
-                                    <option value="middle-east">中东</option>
-                                    <option value="europe">欧洲</option>
-                                    <option value="north-america">北美</option>
-                                    <option value="southeast-asia">东南亚</option>
-                                    <option value="africa">非洲</option>
-                                    <option value="south-america">南美</option>
-                                </select>
+                                <el-select v-model="newCampaign.filters.region" clearable placeholder="全部地区">
+                                    <el-option label="中东" value="middle-east" />
+                                    <el-option label="欧洲" value="europe" />
+                                    <el-option label="北美" value="north-america" />
+                                    <el-option label="东南亚" value="southeast-asia" />
+                                    <el-option label="非洲" value="africa" />
+                                    <el-option label="南美" value="south-america" />
+                                </el-select>
                             </div>
                             <div class="form-group">
                                 <label class="form-label">行业</label>
-                                <select class="form-select" v-model="newCampaign.filters.industry">
-                                    <option value="">全部行业</option>
-                                    <option value="datacenter">数据中心</option>
-                                    <option value="consumer">消费电子</option>
-                                    <option value="distributor">电子分销</option>
-                                    <option value="retail">零售</option>
-                                    <option value="manufacturing">制造业</option>
-                                </select>
+                                <el-select v-model="newCampaign.filters.industry" clearable placeholder="全部行业">
+                                    <el-option label="数据中心" value="datacenter" />
+                                    <el-option label="消费电子" value="consumer" />
+                                    <el-option label="电子分销" value="distributor" />
+                                    <el-option label="零售" value="retail" />
+                                    <el-option label="制造业" value="manufacturing" />
+                                </el-select>
                             </div>
                         </div>
                         <div class="filter-row">
                             <div class="form-group">
                                 <label class="form-label">意向分数</label>
-                                <select class="form-select" v-model="newCampaign.filters.scoreRange">
-                                    <option value="">不限</option>
-                                    <option value="high">80-100分</option>
-                                    <option value="medium">60-79分</option>
-                                    <option value="low">40-59分</option>
-                                </select>
+                                <el-select v-model="newCampaign.filters.scoreRange" clearable placeholder="不限">
+                                    <el-option label="80-100分" value="high" />
+                                    <el-option label="60-79分" value="medium" />
+                                    <el-option label="40-59分" value="low" />
+                                </el-select>
                             </div>
                             <div class="form-group">
                                 <label class="form-label">客户规模</label>
-                                <select class="form-select" v-model="newCampaign.filters.companySize">
-                                    <option value="">不限</option>
-                                    <option value="large">大型企业(500+)</option>
-                                    <option value="medium">中型企业(100-500)</option>
-                                    <option value="small">小微企业(<100)</option>
-                                </select>
+                                <el-select v-model="newCampaign.filters.companySize" clearable placeholder="不限">
+                                    <el-option label="大型企业(500+)" value="large" />
+                                    <el-option label="中型企业(100-500)" value="medium" />
+                                    <el-option label="小微企业(<100)" value="small" />
+                                </el-select>
                             </div>
                         </div>
                         <!-- 自定义关键词搜索 -->
                         <div class="form-group">
                             <label class="form-label">关键词搜索</label>
                             <div class="keyword-search">
-                                <input type="text" class="form-input" v-model="newCampaign.filters.keyword"
-                                    placeholder="搜索公司名、联系人、产品关键词..." />
+                                <el-input v-model="newCampaign.filters.keyword" placeholder="搜索公司名、联系人、产品关键词..." clearable />
                                 <button class="btn btn-secondary">
                                     <i class="fas fa-search"></i>
                                 </button>
@@ -331,47 +343,44 @@
                         <div class="form-row">
                             <div class="form-group">
                                 <label class="form-label">发件邮箱</label>
-                                <select class="form-select" v-model="newCampaign.emailSender">
-                                    <option>sales@company.com</option>
-                                    <option>marketing@company.com</option>
-                                    <option>support@company.com</option>
-                                </select>
+                                <el-select v-model="newCampaign.emailSender" placeholder="请选择发件邮箱">
+                                    <el-option label="sales@company.com" value="sales@company.com" />
+                                    <el-option label="marketing@company.com" value="marketing@company.com" />
+                                    <el-option label="support@company.com" value="support@company.com" />
+                                </el-select>
                             </div>
                             <div class="form-group">
                                 <label class="form-label">发送时间</label>
-                                <select class="form-select" v-model="newCampaign.emailSendTime">
-                                    <option value="optimal">AI推荐最优时间</option>
-                                    <option value="morning">上午 9:00-11:00</option>
-                                    <option value="afternoon">下午 14:00-16:00</option>
-                                    <option value="evening">晚上 19:00-21:00</option>
-                                </select>
+                                <el-select v-model="newCampaign.emailSendTime" placeholder="请选择发送时间">
+                                    <el-option label="AI推荐最优时间" value="optimal" />
+                                    <el-option label="上午 9:00-11:00" value="morning" />
+                                    <el-option label="下午 14:00-16:00" value="afternoon" />
+                                    <el-option label="晚上 19:00-21:00" value="evening" />
+                                </el-select>
                             </div>
                         </div>
                         <div class="form-row">
                             <div class="form-group">
                                 <label class="form-label">生成方式</label>
-                                <select class="form-select" v-model="newCampaign.emailTemplate">
-                                    <option value="default">默认模板</option>
-                                    <option value="professional">专业商务</option>
-                                    <option value="friendly">友好亲切</option>
-                                    <option value="minimal">极简风格</option>
-                                </select>
+                                <el-select v-model="newCampaign.emailTemplate" placeholder="请选择生成方式">
+                                    <el-option label="AI自主" value="AI自主" />
+                                    <el-option label="人工协同" value="人工协同" />
+                                </el-select>
                             </div>
                             <div class="form-group">
                                 <label class="form-label">每批发送量</label>
-                                <select class="form-select" v-model="newCampaign.batchSize">
-                                    <option value="50">50封/批</option>
-                                    <option value="100">100封/批</option>
-                                    <option value="200">200封/批</option>
-                                    <option value="500">500封/批</option>
-                                </select>
+                                <el-select v-model="newCampaign.batchSize" placeholder="请选择每批发送量">
+                                    <el-option label="50封/批" value="50" />
+                                    <el-option label="100封/批" value="100" />
+                                    <el-option label="200封/批" value="200" />
+                                    <el-option label="500封/批" value="500" />
+                                </el-select>
                             </div>
                         </div>
                         <div class="form-group">
                             <label class="form-label">邮件主题 <span class="required">*</span></label>
                             <div class="subject-input-group">
-                                <input type="text" class="form-input" v-model="newCampaign.emailSubject"
-                                    placeholder="输入邮件主题" />
+                                <el-input style="flex: 1" v-model="newCampaign.emailSubject" placeholder="输入邮件主题" />
                                 <button class="btn btn-primary" @click="generateSubjectAI">
                                     <i class="fas fa-magic"></i> AI优化
                                 </button>
@@ -386,8 +395,7 @@
                         </div>
                         <div class="form-group">
                             <label class="form-label">邮件预览文本</label>
-                            <input type="text" class="form-input" v-model="newCampaign.emailPreviewText"
-                                placeholder="邮件列表中显示的预览文字(可选)" />
+                            <el-input v-model="newCampaign.emailPreviewText" placeholder="邮件列表中显示的预览文字(可选)" />
                         </div>
                     </div>
 
@@ -397,24 +405,23 @@
                         <div class="form-row">
                             <div class="form-group">
                                 <label class="form-label">发送账号</label>
-                                <select class="form-select" v-model="newCampaign.whatsappAccount">
-                                    <option>业务账号1</option>
-                                    <option>业务账号2</option>
-                                </select>
+                                <el-select v-model="newCampaign.whatsappAccount" placeholder="请选择发送账号">
+                                    <el-option label="业务账号1" value="业务账号1" />
+                                    <el-option label="业务账号2" value="业务账号2" />
+                                </el-select>
                             </div>
                             <div class="form-group">
                                 <label class="form-label">发送间隔</label>
-                                <select class="form-select" v-model="newCampaign.whatsappInterval">
-                                    <option value="30">30秒/条</option>
-                                    <option value="60">1分钟/条</option>
-                                    <option value="120">2分钟/条</option>
-                                </select>
+                                <el-select v-model="newCampaign.whatsappInterval" placeholder="请选择发送间隔">
+                                    <el-option label="30秒/条" value="30" />
+                                    <el-option label="1分钟/条" value="60" />
+                                    <el-option label="2分钟/条" value="120" />
+                                </el-select>
                             </div>
                         </div>
                         <div class="form-group">
                             <label class="form-label">消息模板</label>
-                            <textarea class="form-textarea" v-model="newCampaign.whatsappTemplate" rows="3"
-                                placeholder="输入 WhatsApp 消息模板..."></textarea>
+                            <el-input v-model="newCampaign.whatsappTemplate" type="textarea" :rows="3" placeholder="输入 WhatsApp 消息模板..." />
                         </div>
                     </div>
 
@@ -424,19 +431,19 @@
                         <div class="form-row">
                             <div class="form-group">
                                 <label class="form-label">操作类型</label>
-                                <select class="form-select" v-model="newCampaign.linkedinAction">
-                                    <option value="message">发送消息</option>
-                                    <option value="connect">发送连接请求</option>
-                                    <option value="inmail">InMail</option>
-                                </select>
+                                <el-select v-model="newCampaign.linkedinAction" placeholder="请选择操作类型">
+                                    <el-option label="发送消息" value="message" />
+                                    <el-option label="发送连接请求" value="connect" />
+                                    <el-option label="InMail" value="inmail" />
+                                </el-select>
                             </div>
                             <div class="form-group">
                                 <label class="form-label">每日上限</label>
-                                <select class="form-select" v-model="newCampaign.linkedinLimit">
-                                    <option value="20">20次/天</option>
-                                    <option value="30">30次/天</option>
-                                    <option value="50">50次/天</option>
-                                </select>
+                                <el-select v-model="newCampaign.linkedinLimit" placeholder="请选择每日上限">
+                                    <el-option label="20次/天" value="20" />
+                                    <el-option label="30次/天" value="30" />
+                                    <el-option label="50次/天" value="50" />
+                                </el-select>
                             </div>
                         </div>
                     </div>
@@ -501,12 +508,12 @@
                                 <div class="rule-desc">3天后发送提醒邮件,更换主题行</div>
                             </div>
                             <div class="rule-config" v-if="newCampaign.rules.noOpenFollowup">
-                                <select class="mini-select" v-model="newCampaign.rules.noOpenFollowupDays">
-                                    <option value="2">2天后</option>
-                                    <option value="3">3天后</option>
-                                    <option value="5">5天后</option>
-                                    <option value="7">7天后</option>
-                                </select>
+                                <el-select class="mini-select" v-model="newCampaign.rules.noOpenFollowupDays" placeholder="请选择">
+                                    <el-option label="2天后" value="2" />
+                                    <el-option label="3天后" value="3" />
+                                    <el-option label="5天后" value="5" />
+                                    <el-option label="7天后" value="7" />
+                                </el-select>
                             </div>
                         </div>
                         <div class="rule-item">
@@ -519,11 +526,11 @@
                                 <div class="rule-desc">7天后跟进</div>
                             </div>
                             <div class="rule-config" v-if="newCampaign.rules.noReplyFollowup">
-                                <select class="mini-select" v-model="newCampaign.rules.noReplyFollowupDays">
-                                    <option value="5">5天后</option>
-                                    <option value="7">7天后</option>
-                                    <option value="10">10天后</option>
-                                </select>
+                                <el-select class="mini-select" v-model="newCampaign.rules.noReplyFollowupDays" placeholder="请选择">
+                                    <el-option label="5天后" value="5" />
+                                    <el-option label="7天后" value="7" />
+                                    <el-option label="10天后" value="10" />
+                                </el-select>
                             </div>
                         </div>
                         <div class="rule-item">
@@ -551,29 +558,29 @@
                             <div class="form-row">
                                 <div class="form-group">
                                     <label class="form-label">测试变量</label>
-                                    <select class="form-select" v-model="newCampaign.abTest.variable">
-                                        <option value="subject">邮件主题</option>
-                                        <option value="content">邮件内容</option>
-                                        <option value="sendTime">发送时间</option>
-                                        <option value="fromName">发件人名称</option>
-                                    </select>
+                                    <el-select v-model="newCampaign.abTest.variable" placeholder="请选择测试变量">
+                                        <el-option label="邮件主题" value="subject" />
+                                        <el-option label="邮件内容" value="content" />
+                                        <el-option label="发送时间" value="sendTime" />
+                                        <el-option label="发件人名称" value="fromName" />
+                                    </el-select>
                                 </div>
                                 <div class="form-group">
                                     <label class="form-label">测试比例</label>
-                                    <select class="form-select" v-model="newCampaign.abTest.ratio">
-                                        <option value="50">50% : 50%</option>
-                                        <option value="30">30% : 70%</option>
-                                        <option value="20">20% : 80%</option>
-                                    </select>
+                                    <el-select v-model="newCampaign.abTest.ratio" placeholder="请选择测试比例">
+                                        <el-option label="50% : 50%" value="50" />
+                                        <el-option label="30% : 70%" value="30" />
+                                        <el-option label="20% : 80%" value="20" />
+                                    </el-select>
                                 </div>
                             </div>
                             <div class="form-group">
                                 <label class="form-label">胜出条件</label>
-                                <select class="form-select" v-model="newCampaign.abTest.winnerCriteria">
-                                    <option value="openRate">打开率最高</option>
-                                    <option value="clickRate">点击率最高</option>
-                                    <option value="replyRate">回复率最高</option>
-                                </select>
+                                <el-select v-model="newCampaign.abTest.winnerCriteria" placeholder="请选择胜出条件">
+                                    <el-option label="打开率最高" value="openRate" />
+                                    <el-option label="点击率最高" value="clickRate" />
+                                    <el-option label="回复率最高" value="replyRate" />
+                                </el-select>
                             </div>
                             <div class="ab-test-preview">
                                 <div class="ab-variant">
@@ -584,8 +591,7 @@
                                 </div>
                                 <div class="ab-variant">
                                     <span class="variant-label">B 版本</span>
-                                    <input type="text" class="variant-input" v-model="newCampaign.abTest.variantB"
-                                        placeholder="输入测试主题..." />
+                                    <el-input v-model="newCampaign.abTest.variantB" class="variant-input" placeholder="输入测试主题..." />
                                 </div>
                             </div>
                         </div>
@@ -628,11 +634,11 @@
                             <div class="form-row">
                                 <div class="form-group">
                                     <label class="form-label">开始日期</label>
-                                    <input type="date" class="form-input" v-model="newCampaign.scheduledDate" />
+                                    <el-date-picker v-model="newCampaign.scheduledDate" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" placeholder="选择日期" />
                                 </div>
                                 <div class="form-group">
                                     <label class="form-label">开始时间</label>
-                                    <input type="time" class="form-input" v-model="newCampaign.scheduledTime" />
+                                    <el-time-picker v-model="newCampaign.scheduledTime" format="HH:mm" value-format="HH:mm" placeholder="选择时间" />
                                 </div>
                             </div>
                         </div>
@@ -797,7 +803,7 @@
                 <button v-if="currentStep < 5" class="btn btn-primary" @click="currentStep++">
                     下一步 <i class="fas fa-arrow-right"></i>
                 </button>
-                <button v-else class="btn btn-primary" :disabled="!canCreate" @click="createCampaign">
+                <button v-else class="btn btn-primary" :disabled="!canCreate || isSubmitting" @click="createCampaign">
                     <i class="fas fa-rocket"></i> 创建活动
                 </button>
             </div>
@@ -815,7 +821,7 @@
                 <!-- SOP 名称 -->
                 <div class="form-group">
                     <label class="form-label">序列名称 <span class="required">*</span></label>
-                    <input type="text" class="form-input" v-model="customSopData.name" placeholder="例如:我的自定义开发序列">
+                    <el-input v-model="customSopData.name" placeholder="例如:我的自定义开发序列" />
                 </div>
 
                 <!-- 步骤列表 -->
@@ -834,25 +840,23 @@
                                 <div class="step-row">
                                     <div class="form-group">
                                         <label class="form-label">步骤名称</label>
-                                        <input type="text" class="form-input" v-model="step.title"
-                                            placeholder="例如:发送产品介绍">
+                                        <el-input v-model="step.title" placeholder="例如:发送产品介绍" />
                                     </div>
                                     <div class="form-group">
                                         <label class="form-label">间隔天数</label>
-                                        <input type="number" class="form-input" v-model="step.day" min="1" max="30">
+                                        <el-input-number v-model="step.day" :controls="false" :min="1" :max="30" />
                                     </div>
                                 </div>
                                 <div class="step-row">
                                     <div class="form-group">
                                         <label class="form-label">触达渠道</label>
-                                        <select class="form-select" v-model="step.channel"
-                                            @change="updateChannelIcon(index)">
-                                            <option value="email">邮件</option>
-                                            <option value="whatsapp">WhatsApp</option>
-                                            <option value="linkedin">LinkedIn</option>
-                                            <option value="phone">电话</option>
-                                            <option value="wechat">微信</option>
-                                        </select>
+                                        <el-select v-model="step.channel" placeholder="请选择渠道" @change="updateChannelIcon(index)">
+                                            <el-option label="邮件" value="email" />
+                                            <el-option label="WhatsApp" value="whatsapp" />
+                                            <el-option label="LinkedIn" value="linkedin" />
+                                            <el-option label="电话" value="phone" />
+                                            <el-option label="微信" value="wechat" />
+                                        </el-select>
                                     </div>
                                     <div class="channel-preview">
                                         <div class="preview-badge" :class="step.channel">
@@ -913,12 +917,20 @@
 <script setup>
     import { ref, computed } from 'vue'
     import PreviewCustomerModal from './PreviewCustomerModal.vue'
+    import { getSopList, addMarketing } from '@/api/marketing'
 
     const showCreateModal = ref(false)
     const currentStep = ref(1)
+    const toast = (message, type = 'success') => {
+        if (typeof window !== 'undefined' && typeof window.toast === 'function') {
+            window.toast(message, type)
+            return
+        }
+        console[type === 'success' ? 'log' : 'warn'](`[toast] ${message}`)
+    }
     const newCampaign = ref({
-        name: '', type: 'prospect', priority: 'medium', description: '',
-        startDate: '', endDate: '', owner: '', relatedOpportunity: '',
+        name: '', type: '潜客开发', priority: '中', description: '',
+        startDate: '', endDate: '', owner: [], relatedOpportunity: '',
         segment: 'all', aiRecommend: 'high-value',
         filters: {
             region: '', industry: '', scoreRange: '', stage: '', companySize: '', purchaseCycle: '',
@@ -927,7 +939,7 @@
         goals: { sent: 500, openRate: 40, replyRate: 10, opportunities: 15 },
         channels: ['email'],
         emailSender: 'sales@company.com', emailSendTime: 'optimal',
-        emailTemplate: 'default', batchSize: '100',
+        emailTemplate: 'AI自主', batchSize: '100',
         emailSubject: '', emailPreviewText: '',
         trackOpen: true, trackClick: true, trackReply: true,
         whatsappAccount: '业务账号1', whatsappInterval: '60', whatsappTemplate: '',
@@ -1017,9 +1029,91 @@
     const getChannelIconById = (id) => ({ email: 'fas fa-envelope', whatsapp: 'fab fa-whatsapp', linkedin: 'fab fa-linkedin', wechat: 'fab fa-weixin' }[id] || 'fas fa-comment')
     const hasWarnings = computed(() => selectedCustomerCount.value > 500 || !newCampaign.value.emailSubject || newCampaign.value.channels.length === 0)
     const confirmChecks = ref({ content: false, schedule: false, compliance: false, unsubscribe: true })
+    const isSubmitting = ref(false)
     const canCreate = computed(() => confirmChecks.value.content && confirmChecks.value.schedule && confirmChecks.value.compliance)
 
-    const createCampaign = () => { closeCreateModal(); toast('营销活动已创建', 'success') }
+    const goToStep = (step) => { currentStep.value = step }
+
+    const createCampaign = async () => {
+        if (!newCampaign.value.name) {
+            currentStep.value = 1
+            toast('请填写活动名称', 'error')
+            return
+        }
+        if (newCampaign.value.channels.includes('email') && !newCampaign.value.emailSubject) {
+            currentStep.value = 3
+            toast('请设置邮件主题', 'error')
+            return
+        }
+        if (!canCreate.value) {
+            toast('请完成确认事项后创建活动', 'error')
+            return
+        }
+        isSubmitting.value = true
+        try {
+            const typeMap = { prospect: 1, nurture: 2, reactivate: 3, promote: 4, seasonal: 5, exhibition: 6 }
+            const priorityMap = { urgent: 1, high: 2, medium: 3, low: 4 }
+            const ownerMap = { sales1: 1, sales2: 2, sales3: 3 }
+            const selectedOwners = Array.isArray(newCampaign.value.owner)
+                ? newCampaign.value.owner.filter(Boolean)
+                : [newCampaign.value.owner].filter(Boolean)
+            const sopIdMap = { standard: 1, aggressive: 2, nurture: 3, reactivate: 4, custom: 0 }
+            const channelConfig = newCampaign.value.channels.reduce((acc, channel) => {
+                if (channel === 'email') return acc + 1
+                if (channel === 'whatsapp') return acc + 2
+                if (channel === 'linkedin') return acc + 4
+                return acc
+            }, 0)
+            const payload = {
+                name: newCampaign.value.name,
+                type: typeMap[newCampaign.value.type] || 1,
+                priority: priorityMap[newCampaign.value.priority] || 3,
+                description: newCampaign.value.description,
+                beginData: newCampaign.value.startDate || null,
+                endDate: newCampaign.value.endDate || null,
+                supervisor: selectedOwners.length ? ownerMap[selectedOwners[0]] || null : null,
+                linkToOpportunity: newCampaign.value.relatedOpportunity || null,
+                sendVolume: Number(newCampaign.value.goals.sent) || null,
+                openRate: Number(newCampaign.value.goals.openRate) || null,
+                replyRate: Number(newCampaign.value.goals.replyRate) || null,
+                opportunityCount: Number(newCampaign.value.goals.opportunities) || null,
+                channelConfiguration: channelConfig,
+                emailAddress: newCampaign.value.emailSender,
+                emailSentTime: newCampaign.value.emailSendTime,
+                emailTemplate: newCampaign.value.emailTemplate,
+                emailBatchSize: Number(newCampaign.value.batchSize) || null,
+                emailSubject: newCampaign.value.emailSubject,
+                trackConfigOpen: newCampaign.value.trackOpen ? 1 : 0,
+                trackConfigClick: newCampaign.value.trackClick ? 1 : 0,
+                trackConfigReply: newCampaign.value.trackReply ? 1 : 0,
+                sopId: sopIdMap[newCampaign.value.sopTemplate] || 0,
+                followUpRulesNotOpened: newCampaign.value.rules.noOpenFollowup ? 1 : 0,
+                followUpRulesNotOpenedDays: newCampaign.value.rules.noOpenFollowupDays,
+                followUpRulesNotReplied: newCampaign.value.rules.noReplyFollowup ? 1 : 0,
+                followUpRulesNotRepliedDays: newCampaign.value.rules.noReplyFollowupDays,
+                followUpRulesLinkNotClicked: newCampaign.value.rules.noClickFollowup ? 1 : 0,
+                followUpRulesLinkNotClickedDays: newCampaign.value.rules.noClickFollowupDays || null,
+                followUpRulesReplied: newCampaign.value.rules.stopOnReply ? 1 : 0,
+                followUpRulesAppointmentBooked: newCampaign.value.rules.stopOnBooking ? 1 : 0,
+                aBTesting: newCampaign.value.abTest.enabled ? 1 : 0,
+                smartSchedulingType: newCampaign.value.scheduleMode,
+                smartSchedulingStartDate: newCampaign.value.scheduledDate || null,
+                smartSchedulingStartTime: newCampaign.value.scheduledTime || null,
+                hasContentCompliant: confirmChecks.value.content ? 1 : 0,
+                hasScheduleApproved: confirmChecks.value.schedule ? 1 : 0,
+                hasGdprCompliant: confirmChecks.value.compliance ? 1 : 0,
+                hasUnsubscribeLink: confirmChecks.value.unsubscribe ? 1 : 0
+            }
+            console.log(payload)
+            await addMarketing(payload)
+            toast('营销活动已创建', 'success')
+            closeCreateModal()
+        } catch (error) {
+            toast(error?.message || '创建营销活动失败', 'error')
+        } finally {
+            isSubmitting.value = false
+        }
+    }
 
     const selectSubject = (subj) => { newCampaign.value.emailSubject = subj; showSubjectSuggestions.value = false }
     const toggleChannel = (id) => {
@@ -1136,7 +1230,17 @@
         toast('自定义SOP已保存', 'success')
     }
 
-    const open = () => { currentStep.value = 1; showCreateModal.value = true }
+    const getSop = () => {
+        getSopList({ pageIndex: 1, pageSize: 100 }).then(res => {
+            console.log('res :>> ', res);
+        })
+    }
+
+    const open = () => {
+        currentStep.value = 1;
+        showCreateModal.value = true;
+        getSop()
+    }
     const closeCreateModal = () => { showCreateModal.value = false; currentStep.value = 1 }
 
     defineExpose({
@@ -1146,5 +1250,100 @@
 </script>
 
 <style scoped>
-@import '../assets/styles/marketing.css'
+@import '../assets/styles/marketing.css';
+
+.create-modal :deep(.el-input__wrapper),
+.create-modal :deep(.el-textarea__inner),
+.create-modal :deep(.el-select .el-select__wrapper),
+.create-modal :deep(.el-input-number__wrapper),
+.create-modal :deep(.el-date-editor.el-input__wrapper) {
+    background: var(--bg-dark);
+    border: 1px solid var(--border);
+    box-shadow: none;
+    border-radius: 8px;
+    color: var(--text-primary);
+    width: 100%;
+    box-sizing: border-box;
+    min-width: 0;
+}
+
+.create-modal :deep(.el-date-editor) {
+    width: 100%;
+    min-width: 0;
+}
+
+.create-modal :deep(.el-input__wrapper.is-focus),
+.create-modal :deep(.el-select .el-select__wrapper.is-focus),
+.create-modal :deep(.el-input-number__wrapper.is-focus),
+.create-modal :deep(.el-date-editor.el-input__wrapper.is-focus) {
+    background: var(--bg-card);
+    border-color: var(--primary);
+    box-shadow: 0 0 0 1px var(--primary) inset;
+}
+
+.create-modal :deep(.el-input__inner),
+.create-modal :deep(.el-textarea__inner),
+.create-modal :deep(.el-input-number__inner),
+.create-modal :deep(.el-date-editor .el-input__inner) {
+    background: transparent;
+    color: var(--text-primary);
+}
+
+.create-modal :deep(.el-input__inner::placeholder),
+.create-modal :deep(.el-textarea__inner::placeholder),
+.create-modal :deep(.el-date-editor .el-input__inner::placeholder) {
+    color: var(--text-muted);
+}
+
+.create-modal :deep(.el-select-dropdown),
+.create-modal :deep(.el-picker-panel) {
+    background: var(--bg-card);
+    border: 1px solid var(--border);
+    color: var(--text-primary);
+}
+
+.create-modal :deep(.el-select-dropdown__item.hover),
+.create-modal :deep(.el-select-dropdown__item:hover) {
+    background: rgba(99, 102, 241, 0.12);
+    color: var(--primary);
+}
+
+.create-modal :deep(.el-select-dropdown__item.is-selected) {
+    background: rgba(99, 102, 241, 0.2);
+    color: var(--primary);
+    font-weight: 600;
+}
+
+.create-modal :deep(.el-date-table td.current:not(.disabled) .el-date-table-cell__text),
+.create-modal :deep(.el-date-table td.today .el-date-table-cell__text) {
+    background: var(--primary);
+    color: white;
+}
+
+.create-modal :deep(.el-input__count),
+.create-modal :deep(.el-input__count-inner) {
+    background: transparent;
+    color: var(--text-muted);
+}
+
+.create-modal :deep(.el-input-number) {
+    width: 130px;
+}
+
+.create-modal :deep(.el-input-number__increase),
+.create-modal :deep(.el-input-number__decrease) {
+    background: var(--bg-hover);
+    color: var(--text-primary);
+    border-color: var(--border);
+}
+
+.create-modal :deep(.el-input-number__increase:hover),
+.create-modal :deep(.el-input-number__decrease:hover) {
+    background: rgba(99, 102, 241, 0.12);
+    color: var(--primary);
+}
+
+.create-modal :deep(.el-select__selection .el-select__placeholder:not(.is-transparent)) {
+    color: var(--text-primary);
+}
 </style>

+ 4 - 0
ui/smarttrade-platform/src/main.js

@@ -1,5 +1,8 @@
 import { createApp } from 'vue'
 import { createPinia } from 'pinia'
+import ElementPlus from 'element-plus'
+import zhCn from 'element-plus/es/locale/lang/zh-cn'
+import 'element-plus/dist/index.css'
 import App from './App.vue'
 import router from './router'
 import './assets/styles/main.css'
@@ -8,5 +11,6 @@ const app = createApp(App)
 
 app.use(createPinia())
 app.use(router)
+app.use(ElementPlus, { locale: zhCn })
 
 app.mount('#app')

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

@@ -1309,7 +1309,7 @@ const openCreateModal = () => {
   addMarketingRef.value.open()
 }
 
-getMarketingList().then(res => {
+getMarketingList({ pageIndex: 1, pageSize: 10 }).then(res => {
   console.log('res :>> ', res);
 })
 
@@ -1485,12 +1485,11 @@ const formatNumber = (n) => n >= 1000 ? (n / 1000).toFixed(1) + 'K' : n.toLocale
 const getStatusLabel = (s) => ({ active: '进行中', paused: '已暂停', completed: '已完成' }[s] || s)
 const getChannelIcon = (c) => ({ '邮件': 'fas fa-envelope', 'WhatsApp': 'fab fa-whatsapp', 'LinkedIn': 'fab fa-linkedin' }[c] || 'fas fa-comment')
 
-const getPriorityLabel = (priority) => ({ urgent: '紧急', high: '高优先', medium: '中', low: '低优先' }[priority] || priority)
+const getPriorityLabel = (priority) => ({ high: '高', medium: '中', low: '低' }[priority] || priority)
 const getRegionLabel = (region) => ({ 'middle-east': '中东', 'europe': '欧洲', 'north-america': '北美', 'southeast-asia': '东南亚', 'africa': '非洲', 'south-america': '南美' }[region] || '全部地区')
 const getIndustryLabel = (industry) => ({ 'datacenter': '数据中心', 'consumer': '消费电子', 'distributor': '电子分销', 'retail': '零售', 'manufacturing': '制造业' }[industry] || '全部行业')
 const getChannelName = (id) => ({ email: '邮件营销', whatsapp: 'WhatsApp', linkedin: 'LinkedIn', wechat: '微信企业号' }[id] || id)
 
-const goToStep = (step) => { currentStep.value = step }
 const generateSubjectAI = () => {
   showSubjectSuggestions.value = !showSubjectSuggestions.value
   if (showSubjectSuggestions.value) toast('已生成推荐主题', 'success')