zhangqin 1 tydzień temu
rodzic
commit
661d52702b

+ 8 - 0
src/api/qw/assignRule.js

@@ -42,3 +42,11 @@ export function delAssignRule(id) {
     method: 'delete'
   })
 }
+
+// 启用/停用分配规则
+export function enableAssignRule(id, status) {
+  return request({
+    url: '/qwAssignRule/enable/' + id + '/' + status,
+    method: 'post'
+  })
+}

+ 8 - 0
src/api/qw/customerLink.js

@@ -9,6 +9,14 @@ export function pageCustomerLink(params) {
   })
 }
 
+// 获取渠道链接详情
+export function getCustomerLink(id) {
+  return request({
+    url: '/qwCustomerLink/' + id,
+    method: 'get'
+  })
+}
+
 // 新增或编辑渠道链接
 export function createOrUpdateCustomerLink(data) {
   return request({

+ 31 - 10
src/components/H5Editor/index.vue

@@ -222,15 +222,29 @@ export default {
       try {
         const data = JSON.parse(json)
         // 支持新格式
-        if (data.pageTitle !== undefined) {
+        if (data.pageTitle !== undefined && Array.isArray(data.configList)) {
           this.pageTitle = data.pageTitle
-          this.configList = data.configList || []
+          // 深拷贝接收到的configList
+          this.configList = JSON.parse(JSON.stringify(data.configList))
           // 初始化configList,确保所有页面都存在
           this.initializeConfigList()
           // 加载首页数据
           this.switchPage('home')
-        } else {
+        } else if (Array.isArray(data)) {
           // 兼容旧格式(直接是数组)
+          this.configList = [{
+            pageStep: 'home',
+            moduleList: data
+          }, {
+            pageStep: 'appletLand',
+            moduleList: []
+          }, {
+            pageStep: 'purchaseSuccess',
+            moduleList: []
+          }]
+          this.switchPage('home')
+        } else {
+          // 其他格式
           this.configList = [{
             pageStep: 'home',
             moduleList: Array.isArray(data) ? data : []
@@ -241,7 +255,7 @@ export default {
             pageStep: 'purchaseSuccess',
             moduleList: []
           }]
-          this.list = this.configList[0].moduleList
+          this.switchPage('home')
         }
       } catch (e) {
         // 初始化为新格式
@@ -256,7 +270,7 @@ export default {
           pageStep: 'purchaseSuccess',
           moduleList: []
         }]
-        this.list = []
+        this.switchPage('home')
       }
       // 重置选中状态和属性表单
       this.form = {}
@@ -282,13 +296,20 @@ export default {
       
       // 切换到新页面
       this.currentPageStep = pageStep
-      const newConfig = this.configList.find(config => config.pageStep === pageStep)
-      if (newConfig) {
-        this.list = newConfig.moduleList || []
-      } else {
-        this.list = []
+      let newConfig = this.configList.find(config => config.pageStep === pageStep)
+      
+      // 如果找不到对应的配置,创建一个新的
+      if (!newConfig) {
+        newConfig = {
+          pageStep: pageStep,
+          moduleList: []
+        }
+        this.configList.push(newConfig)
       }
       
+      // 使用$set确保列表更新响应式追踪
+      this.$set(this, 'list', newConfig.moduleList || [])
+      
       // 重置选中和表单
       this.form = {}
       this.index = -1

+ 6 - 6
src/views/adv/site/index.vue

@@ -187,7 +187,7 @@
                 :border="true"
               >个人码分配</el-radio>
               <el-radio 
-                label="0"
+                label="2"
                 :border="true"
               >活码分配</el-radio>
             </el-radio-group>
@@ -217,7 +217,7 @@
           </el-form-item>
           
           <el-form-item 
-            v-if="form.allocationRule === '0'" 
+            v-if="form.allocationRule === '2'" 
             :label="form.launchType === 1 ? '群活码' : '企业微信活码'" 
             prop="allocationRuleId"
             class="slide-fade"
@@ -441,7 +441,7 @@
         <el-descriptions-item label="投放域名" :span="2">{{ detail.launchDomain || '-' }}</el-descriptions-item>
         <el-descriptions-item label="一级分配规则">
           <span v-if="detail.allocationRule === '1'">选择员工"个人码"分配规则</span>
-          <span v-else-if="detail.allocationRule === '0'">选择员工"活码"分配规则</span>
+          <span v-else-if="detail.allocationRule === '2'">选择员工"活码"分配规则</span>
           <span v-else>-</span>
         </el-descriptions-item>
         <el-descriptions-item label="二级分配汇总">{{ detail.allocationRuleId || '-' }}</el-descriptions-item>
@@ -746,7 +746,7 @@ export default {
           if (this.form.allocationRule === '1') {
             // 加载企业微信分配规则列表
             this.loadAllocationRuleList();
-          } else if (this.form.allocationRule === '0') {
+          } else if (this.form.allocationRule === '2') {
             // 加载活码列表(根据投放类型)
             if (this.form.launchType === 1) {
               this.loadGroupActiveList();
@@ -1002,7 +1002,7 @@ export default {
       }
       
       // 根据投放类型重新加载活码数据(如果已选择活码分配)
-      if (this.form.allocationRule === '0') {
+      if (this.form.allocationRule === '2') {
         if (launchType === 1) {
           this.loadGroupActiveList();
         } else if (launchType === 2) {
@@ -1232,7 +1232,7 @@ export default {
       if (allocationRule === '1') {
         // 加载企业微信分配规则列表
         this.loadAllocationRuleList();
-      } else if (allocationRule === '0') {
+      } else if (allocationRule === '2') {
         // 根据投放类型加载群活码或企业微信活码
         if (this.form.launchType === 1) {
           this.loadGroupActiveList();

+ 180 - 26
src/views/adv/statistics/index.vue

@@ -18,8 +18,46 @@
           />
         </el-select>
       </el-form-item>
+      <el-form-item label="广告商" prop="advertiserId">
+        <el-select
+          v-model="queryParams.advertiserId"
+          placeholder="请选择广告商"
+          clearable
+          size="small"
+          filterable
+        >
+          <el-option
+            v-for="item in advertiserList"
+            :key="item.id"
+            :label="item.advertiserName"
+            :value="item.id"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="日期范围" prop="dateRange">
+        <el-date-picker
+          v-model="queryParams.dateRange"
+          type="daterange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          format="yyyy-MM-dd"
+          value-format="yyyy-MM-dd"
+          size="small"
+          style="width: 280px"
+        />
+      </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <div class="date-quick-buttons">
+          <el-button type="primary" plain size="small" @click="setDateRange('today')">今日</el-button>
+          <el-button type="primary" plain size="small" @click="setDateRange('yesterday')">昨日</el-button>
+          <el-button type="primary" plain size="small" @click="setDateRange('week')">本周</el-button>
+          <el-button type="primary" plain size="small" @click="setDateRange('month')">本月</el-button>
+          <el-button type="primary" plain size="small" @click="setDateRange('30days')">30天</el-button>
+        </div>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
@@ -141,22 +179,44 @@
             <span class="rate-text">{{ scope.row.wechatGroupRate || 0 }}</span>
           </template>
         </el-table-column>
+        <el-table-column label="企微删除人数" align="center" prop="wechatDeleteCount" width="120">
+          <template slot-scope="scope">
+            <span class="number-text">{{ scope.row.wechatDeleteCount || 0 }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="企微删除率" align="center" prop="wechatDeleteCountRate" width="120">
+          <template slot-scope="scope">
+            <span class="rate-text">{{ scope.row.wechatDeleteCountRate || 0 }}</span>
+          </template>
+        </el-table-column>
       </el-table-column>
 
-      <!-- ROI与销售 -->
-      <el-table-column label="效果数据" align="center">
-        <el-table-column label="ROI" align="center" prop="roi" width="100">
+      <!-- 小程序数据 -->
+      <el-table-column label="小程序数据" align="center">
+        <el-table-column label="发起进入小程序人数" align="center" prop="miniLaunchIndexCount" width="140">
+          <template slot-scope="scope">
+            <span class="number-text">{{ scope.row.miniLaunchIndexCount || 0 }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="进入小程序落地页" align="center" prop="miniAuthIndexCount" width="140">
           <template slot-scope="scope">
-            <el-tag :type="getRoiType(scope.row.roi)" size="small">
-              {{ scope.row.roi || 0 }}
-            </el-tag>
+            <span class="number-text">{{ scope.row.miniAuthIndexCount || 0 }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="销售额" align="center" prop="salesAmount" width="120">
+        <el-table-column label="小程序授权人数" align="center" prop="miniAuthCount" width="140">
           <template slot-scope="scope">
-            <span class="money-text success">¥{{ scope.row.salesAmount || 0 }}</span>
+            <span class="number-text">{{ scope.row.miniAuthCount || 0 }}</span>
           </template>
         </el-table-column>
+        <el-table-column label="进入出码页人数" align="center" prop="miniQrCodeIndexCount" width="140">
+          <template slot-scope="scope">
+            <span class="number-text">{{ scope.row.miniQrCodeIndexCount || 0 }}</span>
+          </template>
+        </el-table-column>
+      </el-table-column>
+
+      <!-- 下次转化数据 -->
+      <el-table-column label="下次转化数据" align="center">
         <el-table-column label="报名成功人数" align="center" prop="registerSuccessCount" width="120">
           <template slot-scope="scope">
             <span class="number-text">{{ scope.row.registerSuccessCount || 0 }}</span>
@@ -190,8 +250,8 @@
     <pagination
       v-show="total>0"
       :total="total"
-      :page.sync="queryParams.current"
-      :limit.sync="queryParams.size"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
       @pagination="getList"
     />
 
@@ -204,24 +264,21 @@
         <el-descriptions-item label="UV">{{ detail.uv || 0 }}</el-descriptions-item>
         <el-descriptions-item label="展示数">{{ detail.impressionCount || 0 }}</el-descriptions-item>
         <el-descriptions-item label="点击数">{{ detail.clickCount || 0 }}</el-descriptions-item>
-        <el-descriptions-item label="点击率">{{ detail.clickRate || 0 }}%</el-descriptions-item>
+        <el-descriptions-item label="点击率">{{ detail.clickRate || 0 }}</el-descriptions-item>
         <el-descriptions-item label="平均点击单价">¥{{ detail.avgClickPrice || 0 }}</el-descriptions-item>
         <el-descriptions-item label="账面花费">¥{{ detail.accountCost || 0 }}</el-descriptions-item>
         <el-descriptions-item label="实际花费">¥{{ detail.actualCost || 0 }}</el-descriptions-item>
         <el-descriptions-item label="名片数">{{ detail.cardCount || 0 }}</el-descriptions-item>
-        <el-descriptions-item label="名片获取率">{{ detail.cardAcquireRate || 0 }}%</el-descriptions-item>
+        <el-descriptions-item label="名片获取率">{{ detail.cardAcquireRate || 0 }}</el-descriptions-item>
         <el-descriptions-item label="名片获取成本">¥{{ detail.cardAcquireCost || 0 }}</el-descriptions-item>
         <el-descriptions-item label="企微添加人数">{{ detail.wechatAddCount || 0 }}</el-descriptions-item>
-        <el-descriptions-item label="企微添加率">{{ detail.wechatAddRate || 0 }}%</el-descriptions-item>
+        <el-descriptions-item label="企微添加率">{{ detail.wechatAddRate || 0 }}</el-descriptions-item>
         <el-descriptions-item label="企微添加成本">¥{{ detail.wechatAddCost || 0 }}</el-descriptions-item>
         <el-descriptions-item label="企微加群人数">{{ detail.wechatGroupCount || 0 }}</el-descriptions-item>
-        <el-descriptions-item label="企微加群率">{{ detail.wechatGroupRate || 0 }}%</el-descriptions-item>
+        <el-descriptions-item label="企微加群率">{{ detail.wechatGroupRate || 0 }}</el-descriptions-item>
         <el-descriptions-item label="报名成功人数">{{ detail.registerSuccessCount || 0 }}</el-descriptions-item>
-        <el-descriptions-item label="报名成功加微率">{{ detail.registerWechatRate || 0 }}%</el-descriptions-item>
-        <el-descriptions-item label="ROI">
-          <el-tag :type="getRoiType(detail.roi)" size="medium">{{ detail.roi || 0 }}</el-tag>
-        </el-descriptions-item>
-        <el-descriptions-item label="销售额">¥{{ detail.salesAmount || 0 }}</el-descriptions-item>
+        <el-descriptions-item label="报名成功加微率">{{ detail.registerWechatRate || 0 }}</el-descriptions-item>
+        <el-descriptions-item label="企微删除率">{{ detail.wechatDeleteCountRate || 0 }}</el-descriptions-item>
         <el-descriptions-item label="创建时间">{{ parseTime(detail.createTime) }}</el-descriptions-item>
         <el-descriptions-item label="更新时间">{{ parseTime(detail.updateTime) }}</el-descriptions-item>
       </el-descriptions>
@@ -235,6 +292,7 @@
 <script>
 import { pageSiteStatistics, getSiteStatistics } from "@/api/adv/siteStatistics";
 import { listSite } from "@/api/adv/site";
+import { pageAdvertiser } from "@/api/adv/advertiser";
 
 export default {
   name: "SiteStatistics",
@@ -256,10 +314,16 @@ export default {
       detail: {},
       // 查询参数
       queryParams: {
-        current: 1,
-        size: 10,
-        siteId: undefined
-      }
+        pageNum: 1,
+        pageSize: 10,
+        siteId: undefined,
+        advertiserId: undefined,
+        startDate: undefined,
+        endDate: undefined,
+        dateRange: []
+      },
+      // 广告商列表
+      advertiserList: []
     };
   },
   created() {
@@ -268,7 +332,14 @@ export default {
     if (siteId) {
       this.queryParams.siteId = parseInt(siteId);
     }
+    // 默认设置今天的日期范围
+    const today = new Date();
+    const dateStr = today.getFullYear() + '-' + String(today.getMonth() + 1).padStart(2, '0') + '-' + String(today.getDate()).padStart(2, '0');
+    this.queryParams.startDate = dateStr;
+    this.queryParams.endDate = dateStr;
+    this.queryParams.dateRange = [dateStr, dateStr];
     this.getSiteList();
+    this.getAdvertiserList();
     this.getList();
   },
   methods: {
@@ -278,10 +349,59 @@ export default {
         this.siteList = response.data || [];
       });
     },
+    /** 查询广告商列表 */
+    getAdvertiserList() {
+      pageAdvertiser({ pageNum: 1, pageSize: 1000 }).then(response => {
+        this.advertiserList = response.data.records || [];
+      }).catch(error => {
+        console.error('查询广告商列表失败:', error);
+        this.advertiserList = [];
+      });
+    },
+    /** 设置日期范围 */
+    setDateRange(rangeType) {
+      const today = new Date();
+      let startDate, endDate;
+      
+      if (rangeType === 'today') {
+        startDate = new Date(today);
+        endDate = new Date(today);
+      } else if (rangeType === 'yesterday') {
+        startDate = new Date(today.getTime() - 24 * 60 * 60 * 1000);
+        endDate = new Date(today.getTime() - 24 * 60 * 60 * 1000);
+      } else if (rangeType === 'week') {
+        const dayOfWeek = today.getDay();
+        const diff = today.getDate() - dayOfWeek + (dayOfWeek === 0 ? -6 : 1);
+        startDate = new Date(today.getFullYear(), today.getMonth(), diff);
+        endDate = new Date(today);
+      } else if (rangeType === 'month') {
+        startDate = new Date(today.getFullYear(), today.getMonth(), 1);
+        endDate = new Date(today);
+      } else if (rangeType === '30days') {
+        startDate = new Date(today.getTime() - 29 * 24 * 60 * 60 * 1000);
+        endDate = new Date(today);
+      }
+      
+      const formatDate = (date) => {
+        return date.getFullYear() + '-' + String(date.getMonth() + 1).padStart(2, '0') + '-' + String(date.getDate()).padStart(2, '0');
+      };
+      
+      this.queryParams.startDate = formatDate(startDate);
+      this.queryParams.endDate = formatDate(endDate);
+      this.queryParams.dateRange = [this.queryParams.startDate, this.queryParams.endDate];
+    },
     /** 查询统计列表 */
     getList() {
       this.loading = true;
-      pageSiteStatistics(this.queryParams).then(response => {
+      const params = {
+        pageNum: this.queryParams.pageNum,
+        pageSize: this.queryParams.pageSize,
+        siteId: this.queryParams.siteId,
+        advertiserId: this.queryParams.advertiserId,
+        startDate: this.queryParams.startDate,
+        endDate: this.queryParams.endDate
+      };
+      pageSiteStatistics(params).then(response => {
         this.statisticsList = response.data.records || [];
         this.total = response.data.total || 0;
         this.loading = false;
@@ -292,12 +412,22 @@ export default {
     },
     /** 搜索按钮操作 */
     handleQuery() {
-      this.queryParams.current = 1;
+      // 不会会改版面pageNum,维持已有的pageNum
+      if (this.queryParams.dateRange && this.queryParams.dateRange.length === 2) {
+        this.queryParams.startDate = this.queryParams.dateRange[0];
+        this.queryParams.endDate = this.queryParams.dateRange[1];
+      }
       this.getList();
     },
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      // 重新设置为today是不是更好?这里应该是按照简易逻辑重新设置日期
+      const today = new Date();
+      const dateStr = today.getFullYear() + '-' + String(today.getMonth() + 1).padStart(2, '0') + '-' + String(today.getDate()).padStart(2, '0');
+      this.queryParams.startDate = dateStr;
+      this.queryParams.endDate = dateStr;
+      this.queryParams.dateRange = [dateStr, dateStr];
       this.handleQuery();
     },
     /** 详情按钮操作 */
@@ -399,6 +529,30 @@ export default {
   }
 }
 
+// 日期快速设置按钮样式
+.date-quick-buttons {
+  display: flex;
+  gap: 12px;
+  flex-wrap: wrap;
+  
+  .el-button {
+    padding: 8px 18px;
+    font-size: 13px;
+    font-weight: 500;
+    border-radius: 6px;
+    transition: all 0.3s ease;
+    
+    &:hover {
+      transform: translateY(-2px);
+      box-shadow: 0 4px 12px rgba(64, 158, 255, 0.3);
+    }
+    
+    &:active {
+      transform: translateY(0);
+    }
+  }
+}
+
 // 详情对话框样式
 ::v-deep .detail-dialog {
   .el-dialog__header {

+ 27 - 38
src/views/qw/assignRule/index.vue

@@ -44,9 +44,9 @@
           <span v-else-if="scope.row.assignType === 3">按权重</span>
         </template>
       </el-table-column>
-      <el-table-column label="员工数" align="center" prop="personnelCount">
+      <el-table-column label="员工数" align="center" prop="qwAssignRuleUsers">
         <template slot-scope="scope">
-          {{ getPersonnelCount(scope.row) }}
+          {{ scope.row.qwAssignRuleUsers && Array.isArray(scope.row.qwAssignRuleUsers) ? scope.row.qwAssignRuleUsers.length : 0 }}
         </template>
       </el-table-column>
       <el-table-column label="状态" align="center" prop="status">
@@ -98,7 +98,7 @@
             <el-radio :label="3">按权重</el-radio>
           </el-radio-group>
         </el-form-item>
-        <el-form-item label="选择员工" prop="assignPersonnelJson" style="margin-top: 2%">
+        <el-form-item label="选择员工" prop="qwAssignRuleUsers" style="margin-top: 2%">
           <div>
             <el-button
               size="medium"
@@ -151,7 +151,7 @@
 </template>
 
 <script>
-import { listAssignRule, getAssignRule, addOrUpdateAssignRule } from "@/api/qw/assignRule";
+import { listAssignRule, getAssignRule, addOrUpdateAssignRule, enableAssignRule } from "@/api/qw/assignRule";
 import qwUserList from '@/views/qw/user/qwUserList.vue'
 
 export default {
@@ -175,7 +175,7 @@ export default {
       },
       form: {
         assignType: 3,
-        assignPersonnelJson: null
+        qwAssignRuleUsers: null
       },
       personnelList: [],
       selectUserDialog: {
@@ -206,18 +206,7 @@ export default {
       });
     },
 
-    /** 获取员工数量 */
-    getPersonnelCount(row) {
-      if (row.assignPersonnelJson) {
-        try {
-          const personnel = JSON.parse(row.assignPersonnelJson);
-          return Array.isArray(personnel) ? personnel.length : 0;
-        } catch (e) {
-          return 0;
-        }
-      }
-      return 0;
-    },
+    // ... existing code ...
 
     /** 新增按钮 */
     handleAdd() {
@@ -233,12 +222,8 @@ export default {
       this.title = "修改分配规则";
       getAssignRule(row.id).then(response => {
         this.form = response.data;
-        if (this.form.assignPersonnelJson) {
-          try {
-            this.personnelList = JSON.parse(this.form.assignPersonnelJson);
-          } catch (e) {
-            this.personnelList = [];
-          }
+        if (this.form.qwAssignRuleUsers && Array.isArray(this.form.qwAssignRuleUsers)) {
+          this.personnelList = this.form.qwAssignRuleUsers;
         }
       });
     },
@@ -252,11 +237,7 @@ export default {
         cancelButtonText: "取消",
         type: "warning"
       }).then(() => {
-        const data = {
-          id: row.id,
-          status: status
-        };
-        addOrUpdateAssignRule(data).then(response => {
+        enableAssignRule(row.id, status).then(response => {
           this.msgSuccess(`${statusText}成功`);
           this.getList();
         });
@@ -265,12 +246,10 @@ export default {
 
     /** 分配详情 */
     handleDetails(row) {
-      if (row.assignPersonnelJson) {
-        try {
-          this.detailsPersonnelList = JSON.parse(row.assignPersonnelJson);
-        } catch (e) {
-          this.detailsPersonnelList = [];
-        }
+      if (row.qwAssignRuleUsers && Array.isArray(row.qwAssignRuleUsers)) {
+        this.detailsPersonnelList = row.qwAssignRuleUsers;
+      } else {
+        this.detailsPersonnelList = [];
       }
       this.detailsOpen = true;
     },
@@ -288,11 +267,13 @@ export default {
       this.selectUserDialog.open = false;
       if (selectUsers && selectUsers.length > 0) {
         selectUsers.forEach(user => {
-          const exists = this.personnelList.find(p => p.qwUserId === user.qwUserId);
+          const exists = this.personnelList.find(p => p.sysQwUserId === user.id);
           if (!exists) {
             this.personnelList.push({
-              qwUserId: user.qwUserId,
+              assignId: this.form.id || null,
+              sysQwUserId: user.id,
               qwUserName: user.qwUserName,
+              qwUserId: user.qwUserId,
               weight: 1,
               assignNumToDay: 0,
               assignNumCount: 0,
@@ -320,9 +301,17 @@ export default {
             this.$message.error("请选择至少一个员工");
             return;
           }
+          // 准备发送的数据,包含 weight
+          const submitPersonnelList = this.personnelList.map(p => ({
+            assignId: this.form.id || null,
+            sysQwUserId: p.sysQwUserId,
+            qwUserName: p.qwUserName,
+            qwUserId: p.qwUserId,
+            weight: p.weight
+          }));
           const data = {
             ...this.form,
-            assignPersonnelJson: JSON.stringify(this.personnelList)
+            qwAssignRuleUsers: submitPersonnelList
           };
           addOrUpdateAssignRule(data).then(response => {
             this.msgSuccess(this.form.id ? "修改成功" : "新增成功");
@@ -345,7 +334,7 @@ export default {
         id: null,
         ruleName: null,
         assignType: 3,
-        assignPersonnelJson: null,
+        qwAssignRuleUsers: null,
         status: 1
       };
       this.personnelList = [];

+ 97 - 22
src/views/qw/customerLink/index.vue

@@ -85,9 +85,24 @@
           </div>
         </el-form-item>
         <el-form-item label="员工选择" prop="linkUser">
-          <el-select v-model="form.selectedUserIds" placeholder="请先选择企业微信" :disabled="!form.corpId" multiple @change="handleUserChange">
-            <el-option v-for="item in qwUserList" :key="item.id" :label="item.qwUserName" :value="item.id" />
-          </el-select>
+          <div>
+            <el-button
+              size="medium"
+              icon="el-icon-circle-plus-outline"
+              plain
+              @click="handleSelectUser">请选择员工</el-button>
+          </div>
+          <div style="margin-top: 10px;">
+            <el-table :data="personnelList" border size="small" style="margin-top: 10px;">
+              <el-table-column label="企微号" align="center" prop="qwUserId" width="120px" />
+              <el-table-column label="企微姓名" align="center" prop="qwUserName" width="120px" />
+              <el-table-column label="操作" align="center" width="80px">
+                <template slot-scope="scope">
+                  <el-button type="danger" size="mini" icon="el-icon-delete" @click="handleRemovePersonnel(scope.row)"></el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -237,12 +252,17 @@
         <el-button type="primary" @click="confirmAddChannel">确 定</el-button>
       </div>
     </el-dialog>
+    <!-- 选择员工对话框 -->
+    <el-dialog :title="selectUserDialog.title" :visible.sync="selectUserDialog.open" width="1300px" append-to-body>
+      <qwUserList ref="QwUserList" @selectUserList="selectUserList"></qwUserList>
+    </el-dialog>
   </div>
 </template>
 
 <script>
 import {
   pageCustomerLink,
+  getCustomerLink,
   createOrUpdateCustomerLink,
   deleteCustomerLink,
   pageCustomerLinkChannel,
@@ -251,12 +271,14 @@ import {
 } from '@/api/qw/customerLink'
 import { getMyQwCompanyList, listUser } from '@/api/qw/user'
 import { pageProject } from '@/api/adv/channel'
+import qwUserList from '@/views/qw/user/qwUserList.vue'
 import Pagination from '@/components/Pagination'
 import RightToolbar from '@/components/RightToolbar'
 
 export default {
   name: 'CustomerLink',
   components: {
+    qwUserList,
     Pagination,
     RightToolbar
   },
@@ -299,8 +321,13 @@ export default {
       qwCompanyList: [],
       // 企业微信员工列表
       qwUserList: [],
-      // 选中的企业微信ID
-      selectedCorpId: undefined,
+      // 分配规则人员列表
+      personnelList: [],
+      // 选择员工对话框
+      selectUserDialog: {
+        title: "选择员工",
+        open: false
+      },
       
       // 渠道链接对话框
       channelDialogOpen: false,
@@ -369,11 +396,23 @@ export default {
     // 编辑
     handleUpdate(row) {
       this.reset()
-      this.form = Object.assign({}, row)
-      this.selectedCorpId = row.corpId
-      this.loadQwUserList(row.corpId)
       this.open = true
       this.title = '编辑渠道管理'
+      // 调用详情接口获取按键数据
+      getCustomerLink(row.id).then(response => {
+        this.form = response.data
+        // 从 qwCustomerLinkUsers 映射到 personnelList
+        if (this.form.qwCustomerLinkUsers && Array.isArray(this.form.qwCustomerLinkUsers)) {
+          this.personnelList = this.form.qwCustomerLinkUsers.map(user => ({
+            sysQwUserId: user.sysQwUserId,
+            qwUserName: user.qwUserName,
+            qwUserId: user.qwUserId
+          }))
+          // 同步 linkUser
+          this.form.linkUser = this.personnelList
+        }
+        this.loadQwUserList(this.form.corpId)
+      })
     },
     // 删除
     handleDelete(row) {
@@ -522,6 +561,12 @@ export default {
     submitForm() {
       this.$refs.form.validate(valid => {
         if (valid) {
+          // 将 personnelList 赋值给 form.linkUser
+          this.form.linkUser = this.personnelList.map(p => ({
+            sysQwUserId: p.sysQwUserId,
+            qwUserName: p.qwUserName,
+            qwUserId: p.qwUserId
+          }))
           const data = {
             linkName: this.form.linkName,
             corpId: this.form.corpId,
@@ -547,11 +592,10 @@ export default {
         corpId: undefined,
         corpName: undefined,
         skipVerify: 0,
-        selectedUserIds: [],
         linkUser: []
       }
+      this.personnelList = []
       this.qwUserList = []
-      this.selectedCorpId = undefined
       if (this.$refs.form) {
         this.$refs.form.clearValidate()
       }
@@ -571,14 +615,14 @@ export default {
     },
     // 企业微信改变
     handleCorpChange(corpId) {
-      this.form.selectedUserIds = []
+      this.personnelList = []
       this.form.linkUser = []
       this.qwUserList = []
       const selectedCompany = this.qwCompanyList.find(item => item.corpId === corpId)
       if (selectedCompany) {
         this.form.corpName = selectedCompany.corpName
       }
-      this.loadQwUserList(corpId)
+      // 不加载员工列表,等待用户点击"请选择员工"按钮时再加载
     },
     // 加载企业微信员工列表
     loadQwUserList(corpId) {
@@ -592,18 +636,49 @@ export default {
         this.qwUserList = []
       })
     },
-    // 员工改变
-    handleUserChange(userIds) {
-      // 根据选中的用户ID列表构建员工信息数组
-      this.form.linkUser = userIds.map(userId => {
-        const selectedUser = this.qwUserList.find(item => item.id === userId)
-        return {
-          sysQwUserId: selectedUser.id,
-          qwUserName: selectedUser.qwUserName,
-          qwUserId: selectedUser.qwUserId
-        }
+    // 选择员工
+    handleSelectUser() {
+      if (!this.form.corpId) {
+        this.$message.warning('请先选择企业微信')
+        return
+      }
+      this.selectUserDialog.open = true
+      this.$nextTick(() => {
+        // 传递 corpId 给 qwUserList 组件,确保加载正确的企业微信员工
+        this.$refs.QwUserList.getDetails(this.form.corpId, null, null, null)
       })
     },
+
+    /** 接收选中的员工 */
+    selectUserList(selectUsers) {
+      this.selectUserDialog.open = false
+      if (selectUsers && selectUsers.length > 0) {
+        selectUsers.forEach(user => {
+          const exists = this.personnelList.find(p => p.sysQwUserId === user.id)
+          if (!exists) {
+            this.personnelList.push({
+              sysQwUserId: user.id,
+              qwUserName: user.qwUserName,
+              qwUserId: user.qwUserId
+            })
+          }
+        })
+        // 更新 form.linkUser
+        this.form.linkUser = this.personnelList.map(p => ({
+          sysQwUserId: p.sysQwUserId,
+          qwUserName: p.qwUserName,
+          qwUserId: p.qwUserId
+        }))
+      }
+    },
+
+    /** 移除员工 */
+    handleRemovePersonnel(item) {
+      const index = this.personnelList.findIndex(p => p.qwUserId === item.qwUserId)
+      if (index > -1) {
+        this.personnelList.splice(index, 1)
+      }
+    },
     // 表单重置
     resetForm(refName) {
       if (this.$refs[refName]) {