zhangqin 2 tygodni temu
rodzic
commit
4b2078ba04

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

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询渠道链接列表
+export function pageCustomerLink(params) {
+  return request({
+    url: '/qwCustomerLink/page',
+    method: 'get',
+    params: params
+  })
+}
+
+// 新增或编辑渠道链接
+export function createOrUpdateCustomerLink(data) {
+  return request({
+    url: '/qwCustomerLink/createOrUpdate',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除渠道链接
+export function deleteCustomerLink(id) {
+  return request({
+    url: '/qwCustomerLink/delete/' + id,
+    method: 'post'
+  })
+}
+
+// 查询渠道链接的渠道列表
+export function pageCustomerLinkChannel(params) {
+  return request({
+    url: '/qwCustomerLink/channel/page',
+    method: 'get',
+    params: params
+  })
+}
+
+// 新增渠道链接的渠道
+export function createCustomerLinkChannel(data) {
+  return request({
+    url: '/qwCustomerLink/channel/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除渠道链接的渠道
+export function deleteCustomerLinkChannel(id) {
+  return request({
+    url: '/qwCustomerLink/channel/delete/' + id,
+    method: 'post'
+  })
+}

+ 18 - 14
src/views/adv/site/index.vue

@@ -435,25 +435,16 @@
         <el-descriptions-item label="站点URL" :span="2">{{ detail.siteUrl || '-' }}</el-descriptions-item>
         <el-descriptions-item label="投放类型">{{ detail.launchType || '-' }}</el-descriptions-item>
         <el-descriptions-item label="广告类型">{{ detail.adType || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="运营部门">{{ detail.operationDept || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="负责人">{{ detail.manager || '-' }}</el-descriptions-item>
         <el-descriptions-item label="广告商名称" :span="2">{{ detail.advertiserName || '-' }}</el-descriptions-item>
         <el-descriptions-item label="推广账户名称" :span="2">{{ detail.promotionAccountName || '-' }}</el-descriptions-item>
         <el-descriptions-item label="投放页面名称" :span="2">{{ detail.launchPageName || '-' }}</el-descriptions-item>
         <el-descriptions-item label="投放域名" :span="2">{{ detail.launchDomain || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="分配方式">
-          <span v-if="detail.distributeType === 1">手动分配</span>
-          <span v-else-if="detail.distributeType === 2">自动分配</span>
-          <span v-else>-</span>
-        </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>-</span>
         </el-descriptions-item>
         <el-descriptions-item label="二级分配汇总">{{ detail.allocationRuleId || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="分配规则">{{ detail.distributeRule || '-' }}</el-descriptions-item>
-        <el-descriptions-item label="来源名称">{{ detail.sourceName || '-' }}</el-descriptions-item>
         <el-descriptions-item label="项目名称">{{ detail.projectName || '-' }}</el-descriptions-item>
         <el-descriptions-item label="配置回传">
           <el-tag :type="detail.configCallback === 1 ? 'success' : 'info'" size="small">
@@ -728,6 +719,10 @@ export default {
       this.isDetail = false;
       getSite(row.id).then(response => {
         this.form = response.data;
+        // 确保 allocationRule 是字符串类型
+        if (this.form.allocationRule !== undefined && this.form.allocationRule !== null) {
+          this.form.allocationRule = String(this.form.allocationRule);
+        }
         // 根据投放类型加载广告商列表
         if (this.form.launchType) {
           this.loadAdvertiserList(this.form.launchType);
@@ -746,16 +741,24 @@ export default {
             }
           }
         }
-        // 如果服务持了批釋规则,加载对应的新批釋数据
+        // 如果设置了企微分配规则,加载对应的数据
         if (this.form.allocationRule) {
           if (this.form.allocationRule === '1') {
+            // 加载企业微信分配规则列表
             this.loadAllocationRuleList();
           } else if (this.form.allocationRule === '0') {
-            this.loadGroupActiveList();
+            // 加载活码列表(根据投放类型)
+            if (this.form.launchType === 1) {
+              this.loadGroupActiveList();
+            } else if (this.form.launchType === 2) {
+              this.loadContactWayList();
+            }
           }
         }
-        this.open = true;
-        this.title = "修改站点";
+        this.$nextTick(() => {
+          this.open = true;
+          this.title = "修改站点";
+        });
       });
     },
     /** 查看统计按钮操作 */
@@ -1267,8 +1270,9 @@ export default {
     /** 加载企业微信活码列表 */
     loadContactWayList() {
       // 调用/qw/contactWay/list接口获取企业微信活码数据
+      // 注意:此接口返回rows字段,不是data.records
       listContactWay().then(response => {
-        this.contactWayList = response.data || [];
+        this.contactWayList = response.rows || [];
       }).catch(error => {
         console.error('加载企业微信活码列表失败:', error);
         this.contactWayList = [];

+ 618 - 0
src/views/qw/customerLink/index.vue

@@ -0,0 +1,618 @@
+<template>
+  <div class="app-container">
+    <!-- 查询表单 -->
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="链接名称" prop="linkName">
+        <el-input
+          v-model="queryParams.linkName"
+          placeholder="请输入链接名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="企业微信" prop="corpName">
+        <el-input
+          v-model="queryParams.corpName"
+          placeholder="请输入企业微信"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </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>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+        >新增</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list" border>
+      <el-table-column label="链接名称" align="center" prop="linkName" />
+      <el-table-column label="企业微信" align="center" prop="corpName" />
+      <el-table-column label="渠道链接" align="center" prop="url" show-overflow-tooltip />
+      <el-table-column label="创建人" align="center" prop="createBy" />
+      <el-table-column label="创建时间" align="center" prop="createTime" />
+      <el-table-column label="最后修改人" align="center" prop="updateBy" />
+      <el-table-column label="修改时间" align="center" prop="updateTime" />
+      <el-table-column label="今日添加数" align="center" prop="toDayAddNum" />
+      <el-table-column label="累积添加数" align="center" prop="countAddNum" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">编辑</el-button>
+          <el-button size="mini" type="text" icon="el-icon-view" @click="handleViewChannel(scope.row)">查看渠道</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页 -->
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 新增/编辑对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body @close="cancel">
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="链接名称" prop="linkName">
+          <el-input v-model="form.linkName" placeholder="请输入链接名称" />
+        </el-form-item>
+        <el-form-item label="企业微信" prop="corpId">
+          <el-select v-model="form.corpId" placeholder="请选择企业微信" @change="handleCorpChange">
+            <el-option v-for="item in qwCompanyList" :key="item.corpId" :label="item.corpName" :value="item.corpId" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="自动通过好友" prop="skipVerify">
+          <div style="display: flex; align-items: center; height: 32px;">
+            <el-switch v-model="form.skipVerify" :active-value="1" :inactive-value="0" />
+          </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>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 查看渠道链接对话框 -->
+    <el-dialog title="查看渠道链接" :visible.sync="channelDialogOpen" width="900px" append-to-body @close="cancelChannel">
+      <!-- 查询表单 -->
+      <el-form :model="channelQueryParams" ref="channelQueryForm" :inline="true" v-show="channelShowSearch" label-width="68px">
+        <el-form-item label="渠道名称" prop="linkName">
+          <el-input
+            v-model="channelQueryParams.linkName"
+            placeholder="请输入渠道名称"
+            clearable
+            size="small"
+            @keyup.enter.native="getChannelList"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" size="mini" @click="getChannelList">搜索</el-button>
+          <el-button icon="el-icon-refresh" size="mini" @click="resetChannelQuery">重置</el-button>
+        </el-form-item>
+      </el-form>
+
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+          <el-button
+            type="primary"
+            plain
+            icon="el-icon-plus"
+            size="mini"
+            @click="handleAddChannel"
+          >新增</el-button>
+        </el-col>
+        <right-toolbar :showSearch.sync="channelShowSearch" @queryTable="getChannelList"></right-toolbar>
+      </el-row>
+
+      <!-- 渠道列表 -->
+      <el-table v-loading="channelLoading" :data="channelList" border>
+        <el-table-column label="渠道名称" align="center" prop="linkName" />
+        <el-table-column label="渠道链接" align="center" prop="url" show-overflow-tooltip />
+        <el-table-column label="今日添加数" align="center" prop="toDayAddNum" />
+        <el-table-column label="累积添加数" align="center" prop="countAddNum" />
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDeleteChannel(scope.row)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 分页 -->
+      <pagination
+        v-show="channelTotal>0"
+        :total="channelTotal"
+        :page.sync="channelQueryParams.pageNum"
+        :limit.sync="channelQueryParams.pageSize"
+        @pagination="getChannelList"
+      />
+
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancelChannel">关 闭</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 新增渠道对话框 -->
+    <el-dialog title="选择渠道" :visible.sync="selectChannelDialogOpen" width="900px" append-to-body>
+      <el-row :gutter="20">
+        <!-- 左侧:分组和渠道选择 -->
+        <el-col :xs="24" :sm="12">
+          <div style="border-right: 1px solid #dcdfe6; padding-right: 20px;">
+            <h4 style="margin-top: 0; margin-bottom: 15px;">分组管理</h4>
+            <div style="margin-bottom: 15px;">
+              <el-input 
+                v-model="selectChannelQueryParams.channelName" 
+                placeholder="搜索分组"
+                clearable
+                size="small"
+                @input="loadGroupList"
+              />
+            </div>
+            <div style="border: 1px solid #dcdfe6; border-radius: 4px; max-height: 400px; overflow-y: auto;">
+              <div 
+                v-for="item in groupList" 
+                :key="item.id"
+                :class="['group-item', { active: selectedGroupId === item.id }]"
+                @click="selectGroup(item)"
+                style="padding: 10px 15px; cursor: pointer; border-bottom: 1px solid #f0f0f0; user-select: none;"
+              >
+                <span>{{ item.channelName }}</span>
+              </div>
+              <div v-if="groupList.length === 0" style="padding: 20px; text-align: center; color: #909399;">暂无分组</div>
+            </div>
+          </div>
+        </el-col>
+    
+        <!-- 中间:渠道列表 -->
+        <el-col :xs="24" :sm="12">
+          <div style="padding: 0 20px;">
+            <h4 style="margin-top: 0; margin-bottom: 15px;">渠道模板</h4>
+            <div v-if="!selectedGroupId" style="padding: 40px 0; text-align: center; color: #909399;">
+              请上方选择分组
+            </div>
+            <div v-else>
+              <div style="border: 1px solid #dcdfe6; border-radius: 4px; max-height: 400px; overflow-y: auto;">
+                <div 
+                  v-for="item in selectChannelList" 
+                  :key="item.id"
+                  style="padding: 10px 15px; border-bottom: 1px solid #f0f0f0; display: flex; align-items: center; user-select: none; cursor: pointer; background-color: #fff; transition: all 0.3s;"
+                  :style="{ backgroundColor: isChannelSelected(item) ? '#e6f7ff' : '#fff' }"
+                  @click="toggleChannelSelection(item)"
+                >
+                  <el-checkbox 
+                    :value="isChannelSelected(item)"
+                    style="margin-right: 8px;"
+                  />
+                  <span>{{ item.channelName }}</span>
+                </div>
+                <div v-if="selectChannelList.length === 0" style="padding: 20px; text-align: center; color: #909399;">暂无渠道</div>
+              </div>
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+    
+      <!-- 右侧:已选渠道 -->
+      <div style="margin-top: 20px; padding-top: 20px; border-top: 1px solid #dcdfe6;">
+        <h4 style="margin-top: 0; margin-bottom: 10px;">已选渠道({{ selectedChannels.length }})</h4>
+        <div style="border: 1px solid #dcdfe6; border-radius: 4px; padding: 10px; min-height: 80px; max-height: 150px; overflow-y: auto;">
+          <el-tag 
+            v-for="(item, index) in selectedChannels" 
+            :key="item.channelId || index"
+            closable
+            @close="removeSelectedChannel(item)"
+            style="margin: 5px; cursor: pointer;"
+          >
+            {{ item.channelName }}
+          </el-tag>
+          <div v-if="selectedChannels.length === 0" style="color: #909399; text-align: center; padding: 20px 0;">未选择任何渠道</div>
+        </div>
+      </div>
+    
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="selectChannelDialogOpen = false">取 消</el-button>
+        <el-button type="primary" @click="confirmAddChannel">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  pageCustomerLink,
+  createOrUpdateCustomerLink,
+  deleteCustomerLink,
+  pageCustomerLinkChannel,
+  createCustomerLinkChannel,
+  deleteCustomerLinkChannel
+} from '@/api/qw/customerLink'
+import { getMyQwCompanyList, listUser } from '@/api/qw/user'
+import { pageProject } from '@/api/adv/channel'
+import Pagination from '@/components/Pagination'
+import RightToolbar from '@/components/RightToolbar'
+
+export default {
+  name: 'CustomerLink',
+  components: {
+    Pagination,
+    RightToolbar
+  },
+  data() {
+    return {
+      // 加载状态
+      loading: false,
+      channelLoading: false,
+      // 是否显示查询表单
+      showSearch: true,
+      channelShowSearch: true,
+      // 列表数据
+      list: [],
+      total: 0,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        linkName: undefined,
+        corpName: undefined
+      },
+      // 表单参数
+      form: {},
+      // 表单验证规则
+      rules: {
+        linkName: [
+          { required: true, message: '请输入链接名称', trigger: 'blur' }
+        ],
+        corpId: [
+          { required: true, message: '请选择企业微信', trigger: 'change' }
+        ],
+        linkUser: [
+          { required: true, message: '请选择员工', trigger: 'change' }
+        ]
+      },
+      // 对话框
+      open: false,
+      title: '',
+      // 企业微信列表
+      qwCompanyList: [],
+      // 企业微信员工列表
+      qwUserList: [],
+      // 选中的企业微信ID
+      selectedCorpId: undefined,
+      
+      // 渠道链接对话框
+      channelDialogOpen: false,
+      channelList: [],
+      channelTotal: 0,
+      channelQueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        linkName: undefined,
+        sysLinkId: undefined
+      },
+      // 新增渠道对话框
+      selectChannelDialogOpen: false,
+      selectChannelParams: {
+        channelId: undefined
+      },
+      channelOptions: [],
+      currentSysLinkId: undefined,
+      
+      // 渠道选择相关数据
+      groupList: [],  // 分组列表
+      selectedGroupId: null,  // 选中的分组ID
+      selectChannelList: [],  // 当前分组的渠道列表
+      selectChannelLoading: false,  // 渠道列表加载中
+      selectedChannels: [],  // 已选择的渠道列表(右侧)
+      selectChannelPageNum: 1,
+      selectChannelPageSize: 10,
+      selectChannelTotal: 0,
+      selectChannelQueryParams: {
+        channelName: ''
+      }
+    }
+  },
+  created() {
+    this.getList()
+    this.loadQwCompanyList()
+  },
+  methods: {
+    // 查询列表
+    getList() {
+      this.loading = true
+      pageCustomerLink(this.queryParams).then(response => {
+        this.list = response.data.records || []
+        this.total = response.data.total || 0
+        this.loading = false
+      }).catch(() => {
+        this.loading = false
+      })
+    },
+    // 搜索
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    // 重置查询
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    // 新增
+    handleAdd() {
+      this.reset()
+      this.open = true
+      this.title = '新增渠道管理'
+    },
+    // 编辑
+    handleUpdate(row) {
+      this.reset()
+      this.form = Object.assign({}, row)
+      this.selectedCorpId = row.corpId
+      this.loadQwUserList(row.corpId)
+      this.open = true
+      this.title = '编辑渠道管理'
+    },
+    // 删除
+    handleDelete(row) {
+      this.$confirm('确定删除该渠道吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        deleteCustomerLink(row.id).then(response => {
+          this.$message.success('删除成功')
+          this.getList()
+        })
+      }).catch(() => {})
+    },
+    // 查看渠道链接
+    handleViewChannel(row) {
+      this.channelDialogOpen = true
+      this.currentSysLinkId = row.id
+      this.channelQueryParams.sysLinkId = row.id
+      this.getChannelList()
+    },
+    // 查询渠道链接列表
+    getChannelList() {
+      this.channelLoading = true
+      pageCustomerLinkChannel(this.channelQueryParams).then(response => {
+        this.channelList = response.data.records || []
+        this.channelTotal = response.data.total || 0
+        this.channelLoading = false
+      }).catch(() => {
+        this.channelLoading = false
+      })
+    },
+    // 重置渠道查询
+    resetChannelQuery() {
+      this.channelQueryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        linkName: undefined,
+        sysLinkId: this.currentSysLinkId
+      }
+      this.getChannelList()
+    },
+    // 新增渠道链接
+    handleAddChannel() {
+      this.selectChannelDialogOpen = true
+      this.selectedChannels = []
+      this.selectedGroupId = null
+      this.selectChannelList = []
+      this.selectChannelQueryParams.channelName = ''
+      this.loadGroupList()
+    },
+    // 加载分组列表
+    loadGroupList() {
+      const params = { pageNum: 1, pageSize: 1000, parentId: 0 }
+      pageProject(params).then(response => {
+        this.groupList = response.data.records || []
+      }).catch(() => {
+        this.groupList = []
+      })
+    },
+    // 选择分组
+    selectGroup(group) {
+      this.selectedGroupId = group.id
+      this.selectChannelPageNum = 1
+      this.getSelectChannelList()
+    },
+    // 获取渠道列表
+    getSelectChannelList() {
+      if (!this.selectedGroupId) return
+      this.selectChannelLoading = true
+      const params = { pageNum: this.selectChannelPageNum, pageSize: this.selectChannelPageSize, parentId: this.selectedGroupId }
+      if (this.selectChannelQueryParams.channelName) {
+        params.channelName = this.selectChannelQueryParams.channelName
+      }
+      pageProject(params).then(response => {
+        this.selectChannelList = response.data.records || []
+        this.selectChannelTotal = response.data.total || 0
+        this.selectChannelLoading = false
+      }).catch(() => {
+        this.selectChannelLoading = false
+      })
+    },
+    // 勾选渠道
+    toggleChannelSelection(channel) {
+      const index = this.selectedChannels.findIndex(item => item.channelId === channel.id)
+      if (index > -1) {
+        // 已选中,取消选择
+        this.selectedChannels.splice(index, 1)
+      } else {
+        // 未选中,添加选择
+        this.selectedChannels.push({ channelId: channel.id, channelName: channel.channelName })
+      }
+    },
+    // 判断渠道是否已选择
+    isChannelSelected(channel) {
+      return this.selectedChannels.some(item => item.channelId === channel.id)
+    },
+    // 删除已选渠道
+    removeSelectedChannel(channel) {
+      const index = this.selectedChannels.findIndex(item => item.channelId === channel.channelId)
+      if (index > -1) {
+        this.selectedChannels.splice(index, 1)
+      }
+    },
+    // 加载渠道选项
+    loadChannelOptions() {
+      // 这里需要加载渠道列表,根据实际接口调整
+      // 暂时使用空数组,需要后续实现
+      this.channelOptions = []
+    },
+    // 确认新增渠道
+    confirmAddChannel() {
+      if (this.selectedChannels.length === 0) {
+        this.$message.error('请选择渠道')
+        return
+      }
+      const data = {
+        sysLinkId: this.currentSysLinkId,
+        channelList: this.selectedChannels
+      }
+      createCustomerLinkChannel(data).then(response => {
+        this.$message.success('新增成功')
+        this.selectChannelDialogOpen = false
+        this.getChannelList()
+      })
+    },
+    // 删除渠道链接
+    handleDeleteChannel(row) {
+      this.$confirm('确定删除该渠道链接吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        deleteCustomerLinkChannel(row.id).then(response => {
+          this.$message.success('删除成功')
+          this.getChannelList()
+        })
+      }).catch(() => {})
+    },
+    // 关闭渠道链接对话框
+    cancelChannel() {
+      this.channelDialogOpen = false
+      this.currentSysLinkId = undefined
+    },
+    // 表单提交
+    submitForm() {
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          const data = {
+            linkName: this.form.linkName,
+            corpId: this.form.corpId,
+            corpName: this.form.corpName,
+            skipVerify: this.form.skipVerify,
+            linkUser: this.form.linkUser
+          }
+          if (this.form.id) {
+            data.id = this.form.id
+          }
+          createOrUpdateCustomerLink(data).then(response => {
+            this.$message.success(this.form.id ? '编辑成功' : '新增成功')
+            this.open = false
+            this.getList()
+          })
+        }
+      })
+    },
+    // 重置表单
+    reset() {
+      this.form = {
+        linkName: undefined,
+        corpId: undefined,
+        corpName: undefined,
+        skipVerify: 0,
+        selectedUserIds: [],
+        linkUser: []
+      }
+      this.qwUserList = []
+      this.selectedCorpId = undefined
+      if (this.$refs.form) {
+        this.$refs.form.clearValidate()
+      }
+    },
+    // 取消
+    cancel() {
+      this.open = false
+      this.reset()
+    },
+    // 加载企业微信列表
+    loadQwCompanyList() {
+      getMyQwCompanyList().then(response => {
+        this.qwCompanyList = response.data || []
+      }).catch(() => {
+        this.qwCompanyList = []
+      })
+    },
+    // 企业微信改变
+    handleCorpChange(corpId) {
+      this.form.selectedUserIds = []
+      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) {
+      if (!corpId) {
+        this.qwUserList = []
+        return
+      }
+      listUser({ corpId: corpId }).then(response => {
+        this.qwUserList = response.rows || []
+      }).catch(() => {
+        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
+        }
+      })
+    },
+    // 表单重置
+    resetForm(refName) {
+      if (this.$refs[refName]) {
+        this.$refs[refName].resetFields()
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+</style>