Jelajahi Sumber

Merge branch 'master' of http://1.14.104.71:10880/root/ylrz_his_scrm_companyUI

caoliqin 20 jam lalu
induk
melakukan
ea8239f52a

+ 12 - 3
src/views/aiSipCall/aiSipCallManualOutbound.vue

@@ -469,9 +469,17 @@
             <el-form :model="intentForm" label-width="80px" size="small">
                 <el-form-item label="意向度">
                     <el-select v-model="intentForm.intent" placeholder="请选择意向度" style="width: 100%;">
-                        <el-option label="A" value="A" />
-                        <el-option label="B" value="B" />
-                        <el-option label="C" value="C" />
+                        <el-option label="A" value="5" />
+                        <el-option label="B" value="4" />
+                        <el-option label="C" value="3" />
+                        <el-option label="D" value="2" />
+                        <el-option label="E" value="1" />
+                        <el-option label="F" value="10" />
+                        <el-option label="G" value="11" />
+                        <el-option label="H" value="12" />
+                        <el-option label="I" value="13" />
+                        <el-option label="J" value="14" />
+                        <el-option label="无" value="无" />
                     </el-select>
                 </el-form-item>
             </el-form>
@@ -1386,6 +1394,7 @@ export default {
                     callType: '03',
                     status: status,
                     intent: this.intentForm.intent,
+                    // intent: 0,
                     companyId: this.companyId,
                     companyUserId: this.companyUserId,
                     workflowInstanceId: this.workflowInstanceId,

+ 56 - 1
src/views/company/companyUser/index.vue

@@ -185,6 +185,25 @@
               </div>
             </template>
           </el-table-column>
+
+            <!-- 新增:绑定会员状态 -->
+            <el-table-column label="绑定会员状态" align="center" prop="bindStatus" width="100">
+                <template slot-scope="scope">
+                    <el-tag
+                        :type="scope.row.bindStatus === 1 ? 'success' : 'info'"
+                        size="mini">
+                        {{ scope.row.bindStatus === 1 ? '已绑定' : '未绑定' }}
+                    </el-tag>
+                </template>
+            </el-table-column>
+
+            <!-- 新增:绑定用户 -->
+            <el-table-column label="绑定用户" align="center" prop="bindUser" width="120">
+                <template slot-scope="scope">
+                    <span v-if="scope.row.bindUser">{{ scope.row.bindUser }}</span>
+                    <span v-else>-</span>
+                </template>
+            </el-table-column>
           <el-table-column label="区域" align="center" prop="addressId">
           </el-table-column>
           <el-table-column label="创建时间"  sortable align="center" prop="createTime" width="160">
@@ -841,7 +860,7 @@ import { getMyQwUserList,getMyQwCompanyList } from "@/api/qw/user";
 import  selectUser  from "@/views/company/components/selectQwUser.vue";
 import { getConfigByKey } from "@/api/company/companyConfig";
 import axios from "axios";
-import {addCodeUrl, getSaleBindUserList} from "../../../api/company/companyUser";
+import {addCodeUrl, bindSaleAndFsUser, getSaleBindUserList} from "../../../api/company/companyUser";
 import selectDoctor from "@/views/qw/user/selectDoctor.vue";
 import {bindCidServer,unbindCidServer} from "@/api/company/companyAiWorkflowServer";
 import AiSipCallUser from "../../aiSipCall/aiSipCallUser.vue";
@@ -1105,6 +1124,14 @@ export default {
     });
   },
   methods: {
+
+      handlePagination(data) {
+          // 添加防抖或判断,避免初始化时自动触发
+          if (this.member.open) {
+              this.getMemberList();
+          }
+      },
+
     onDomainBlur() {
       if (this.form.domain != null) {
         let value = this.form.domain.trim();
@@ -2100,3 +2127,31 @@ export default {
   },
 }
 </script>
+<style scoped>
+/* 确保筛选表单在一行显示 */
+.bind-member-dialog :deep(.el-form--inline .el-form-item) {
+    margin-right: 0;
+}
+
+.bind-member-dialog :deep(.el-form-item__label) {
+    font-size: 13px;
+    padding-right: 8px;
+}
+
+/* 修复小屏幕下的显示问题 */
+@media (max-width: 580px) {
+    .bind-member-dialog .filter-form > div {
+        flex-direction: column;
+        align-items: stretch !important;
+    }
+
+    .bind-member-dialog .filter-form .el-form-item {
+        width: 100%;
+        margin-right: 0;
+    }
+
+    .bind-member-dialog .filter-form .el-form-item:last-child {
+        text-align: right;
+    }
+}
+</style>

+ 237 - 0
src/views/company/companyUser/profile/index.vue

@@ -105,6 +105,7 @@
           </div>
         </el-card>
       </el-col>
+
       <el-col :span="18" :xs="24">
         <el-card>
           <div slot="header" class="clearfix">
@@ -121,6 +122,177 @@
         </el-card>
       </el-col>
     </el-row>
+
+
+      <!-- 绑定会员对话框 - 优化样式,无背景色 -->
+      <el-dialog
+          v-if="member && member.hasOwnProperty('title')"
+          :title="member.title"
+          :visible.sync="member.open"
+          width="800px"
+          append-to-body
+          class="bind-member-dialog"
+          :close-on-click-modal="false"
+          @open="handleDialogOpen"
+      >
+          <!-- 筛选表单 - 无背景色,优化排版 -->
+          <div class="filter-container">
+              <el-row :gutter="16" class="filter-row" type="flex" align="middle">
+                  <el-col :span="6">
+                      <el-input
+                          v-model="memberQueryParams.userId"
+                          placeholder="会员ID"
+                          clearable
+                          @keyup.enter="handleMemberQuery"
+                          size="small"
+                          prefix-icon="el-icon-user"
+                      />
+                  </el-col>
+                  <el-col :span="6">
+                      <el-input
+                          v-model="memberQueryParams.nickName"
+                          placeholder="昵称"
+                          clearable
+                          @keyup.enter="handleMemberQuery"
+                          size="small"
+                          prefix-icon="el-icon-user"
+                      />
+                  </el-col>
+                  <el-col :span="6">
+                      <el-input
+                          v-model="memberQueryParams.phone"
+                          placeholder="手机号"
+                          clearable
+                          @keyup.enter="handleMemberQuery"
+                          size="small"
+                          prefix-icon="el-icon-phone"
+                      />
+                  </el-col>
+                  <el-col :span="6" class="filter-buttons">
+                      <el-button
+                          type="primary"
+                          icon="el-icon-search"
+                          @click="handleMemberQuery"
+                          size="small"
+                          :loading="loading"
+                      >搜索</el-button>
+                      <el-button
+                          icon="el-icon-refresh"
+                          @click="resetMemberQuery"
+                          size="small"
+                      >重置</el-button>
+                  </el-col>
+              </el-row>
+          </div>
+
+          <!-- 表格区域 -->
+          <div class="table-section">
+              <el-table
+                  :data="memberList"
+                  height="300"
+                  highlight-current-row
+                  @current-change="selectMember"
+                  v-loading="loading"
+                  border
+                  stripe
+                  size="small"
+                  class="member-table"
+              >
+                  <el-table-column
+                      property="userId"
+                      label="ID"
+                      width="70"
+                      align="center"
+                  ></el-table-column>
+
+                  <el-table-column
+                      property="nickName"
+                      label="昵称"
+                      min-width="130"
+                      show-overflow-tooltip
+                  >
+                      <template slot-scope="scope">
+              <span class="nickname-cell">
+                <i class="el-icon-user"></i>
+                {{ scope.row.nickName || '--' }}
+              </span>
+                      </template>
+                  </el-table-column>
+
+                  <el-table-column
+                      property="phone"
+                      label="手机号"
+                      width="130"
+                      align="center"
+                  >
+                      <template slot-scope="scope">
+              <span v-if="scope.row.phone" class="phone-cell">
+                <i class="el-icon-phone"></i>
+                {{ scope.row.phone }}
+              </span>
+                          <span v-else class="no-data">--</span>
+                      </template>
+                  </el-table-column>
+
+                  <el-table-column
+                      property="status"
+                      label="绑定状态"
+                      width="100"
+                      align="center"
+                  >
+                      <template slot-scope="scope">
+                          <el-tag
+                              :type="scope.row.status === 1 ? 'success' : 'info'"
+                              size="small"
+                              effect="light"
+                              class="status-tag"
+                          >
+                              <i :class="scope.row.status === 1 ? 'el-icon-check' : 'el-icon-close'"></i>
+                              {{ scope.row.status === 1 ? '已绑定' : '未绑定' }}
+                          </el-tag>
+                      </template>
+                  </el-table-column>
+              </el-table>
+
+              <!-- 分页组件 - 支持每页条数选择 -->
+              <div class="pagination-wrapper" v-if="memberTotal > 0">
+                  <pagination
+                      :total="memberTotal"
+                      :page.sync="memberQueryParams.pageNum"
+                      :limit.sync="memberQueryParams.pageSize"
+                      @pagination="getMemberList"
+                      :page-sizes="[10, 20, 50,100,500]"
+                      :layout="'total, sizes, prev, pager, next, jumper'"
+                      class="custom-pagination"
+                  />
+              </div>
+
+              <!-- 空数据提示 -->
+              <div v-if="!loading && memberList.length === 0" class="empty-data">
+                  <i class="el-icon-info"></i>
+                  <span>暂无会员数据</span>
+              </div>
+          </div>
+
+          <!-- 底部按钮 -->
+          <div slot="footer" class="dialog-footer">
+              <div class="selected-info" v-if="selectedMember">
+                  <i class="el-icon-success" style="color: #67C23A;"></i>
+                  已选中:{{ selectedMember.nickName || selectedMember.userId }}
+              </div>
+              <div class="action-buttons">
+                  <el-button @click="cancelBindMember" size="medium">取 消</el-button>
+                  <el-button
+                      type="primary"
+                      @click="confirmBindMember"
+                      size="medium"
+                      :disabled="!selectedMember"
+                      :loading="confirmLoading"
+                  >确 定</el-button>
+              </div>
+          </div>
+      </el-dialog>
+
     <el-dialog
       title="订阅服务号通知"
       :visible.sync="bindDialogVisible"
@@ -188,6 +360,65 @@ export default {
   },
   methods: {
 
+  confirmBindMember() {
+      if (!this.selectedMember) {
+          this.$message.warning('请选择要绑定的会员');
+          return;
+      }
+
+      this.confirmLoading = true;
+      const bindData = {
+          companyUserId: this.currentCompanyId,
+          userId: this.selectedMember.userId
+      };
+
+      bindSaleAndFsUser(bindData)
+          .then(response => {
+              if (response.code === 200) {
+                  this.$message.success('绑定会员成功');
+                  this.cancelBindMember();
+                  this.getUser();
+              } else {
+                  this.$message.error(response.msg || '绑定失败');
+              }
+          })
+          .catch(error => {
+              console.error('绑定会员失败:', error);
+              this.$message.error('绑定会员失败');
+          })
+          .finally(() => {
+              this.confirmLoading = false;
+          });
+  },
+
+  cancelBindMember() {
+      this.member.open = false;
+      this.memberList = [];
+      this.selectedMember = null;
+      this.currentCompanyId = null;
+      this.memberQueryParams = {
+          nickName: null,
+          phone: null,
+          userId: null,
+          pageNum: 1,
+          pageSize: 10
+      };
+  },
+
+  selectMember(member) {
+      this.selectedMember = member;
+  },
+
+  handleDialogOpen() {
+      this.selectedMember = null;
+      this.getMemberList();
+  },
+
+  handleMemberQuery() {
+      this.memberQueryParams.pageNum = 1;
+      this.getMemberList();
+  },
+
     handleBindMember() {
       this.currentCompanyId = this.user.userId;
       this.resetMemberQuery();
@@ -266,6 +497,12 @@ export default {
         this.user = response.data;
         this.roleGroup = response.roleGroup;
         this.postGroup = response.postGroup;
+          // 将 fsUserId 字符串拆分为数组
+          if (this.user.fsUserId) {
+              this.user.fsUserIdArray = this.user.fsUserId.split(',').map(id => id.trim());
+          } else {
+              this.user.fsUserIdArray = [];
+          }
       });
     },
     openWechatBindDialog() {

+ 38 - 10
src/views/company/companyVoiceRobotic/index.vue

@@ -651,24 +651,26 @@
                             <i class="el-icon-s-operation"></i>
                             当前节点:<strong>{{ record.currentNodeTypeName }}</strong>
 
-                          <el-button
+                            <el-button
+                              v-if="hasContent(record)"
                               size="mini"
                               type="primary"
                               plain
                               icon="el-icon-chat-dot-round"
                               style="margin-left: 8px;"
                               @click.stop="handleShowContent(record)">
-                              查看对话内容
-                          </el-button>
+                                查看对话内容
+                            </el-button>
                             <!-- 外呼未执行标识 -->
                             <el-button
-                              v-if="record.waitCallNode"
-                              type="danger"
-                              size="mini"
-                              icon="el-icon-phone"
-                              style="margin-left: 8px;"
-                              @click.stop="handleManualCall(record)">
-                              开始人工外呼
+                                v-if="record.waitCallNode"
+                                size="mini"
+                                type="primary"
+                                plain
+                                icon="el-icon-phone"
+                                style="margin-left: 8px;"
+                                @click.stop="handleManualCall(record)">
+                                开始人工外呼
                             </el-button>
                           </span>
                         </div>
@@ -1642,6 +1644,32 @@ export default {
           return []
       }
     },
+    hasContent(record) {
+      if (!record || !record.contentList) return false
+
+      try {
+          const parsed = typeof record.contentList === 'string'
+              ? JSON.parse(record.contentList)
+              : record.contentList
+
+          if (!Array.isArray(parsed)) return false
+
+          // 过滤 system 和空内容
+          const validList = parsed.filter(item => {
+              if (!item) return false
+              if (item.role === 'system') return false
+
+              const text = String(item.content || '').trim()
+              if (!text) return false
+
+              return true
+          })
+
+          return validList.length > 0
+      } catch (e) {
+          return false
+      }
+    }
   }
 };
 </script>

+ 65 - 18
src/views/course/userCoursePeriod/courseStatistics.vue

@@ -303,7 +303,18 @@
             </template>
           </el-table-column>
           <el-table-column label="分公司名称" align="center" prop="companyName" width="150" />
-          <el-table-column label="销售名称" align="center" prop="salesName" />
+          <el-table-column label="销售名称" align="center" prop="salesName" width="120" />
+          <el-table-column
+            label="课程评分"
+            align="center"
+            prop="courseRating"
+            min-width="260"
+            show-overflow-tooltip
+          >
+            <template slot-scope="scope">
+              <span class="course-rating-cell">{{ formatCourseRating(scope.row.courseRating) }}</span>
+            </template>
+          </el-table-column>
         </el-table>
 
         <!-- 分页 -->
@@ -532,9 +543,10 @@ export default {
       this.userDetailDialog.loading = true;
       getCourseStatisticsUserDetailList(this.userDetailDialog.queryParams).then(response => {
         if (response.code === 200 && response.data) {
-          const d = response.data;
+          const raw = response.data;
+          const d = raw.data != null && raw.list == null && raw.rows == null ? raw.data : raw;
           this.userDetailDialog.list = d.list || d.rows || [];
-          this.userDetailDialog.total = d.total ?? 0;
+          this.userDetailDialog.total = d.total != null ? d.total : 0;
         } else {
           this.userDetailDialog.list = [];
           this.userDetailDialog.total = 0;
@@ -571,23 +583,46 @@ export default {
         });
       }).catch(() => {});
     },
-      /** 格式化时长 */
-      formatDuration(seconds) {
-          if (seconds == null || isNaN(seconds)) return '0秒';
-          let total = Math.abs(seconds);
-          const hours = Math.floor(total / 3600);
-          const minutes = Math.floor((total % 3600) / 60);
-          const secs = Math.floor(total % 60);
-
-          const parts = [];
-          if (hours > 0) parts.push(`${hours}小时`);
-          if (minutes > 0) parts.push(`${minutes}分`);
-          if (secs > 0 || parts.length === 0) {
-              parts.push(`${secs}秒`);
-          }
+    /**
+     * 课程评分:后端在关闭「看课校验答案」时返回作答解析后的展示值(courseRating);否则为空
+     */
+    formatCourseRating(val) {
+      if (val == null || val === '') {
+        return '—';
+      }
+      if (typeof val === 'string') {
+        const s = val.trim();
+        if (!s) return '—';
+        try {
+          const parsed = JSON.parse(s);
+          return typeof parsed === 'object' ? JSON.stringify(parsed) : String(val);
+        } catch (e) {
+          return val;
+        }
+      }
+      try {
+        return typeof val === 'object' ? JSON.stringify(val) : String(val);
+      } catch (e) {
+        return String(val);
+      }
+    },
+    /** 格式化时长 */
+    formatDuration(seconds) {
+      if (seconds == null || isNaN(seconds)) return '0秒';
+      let total = Math.abs(seconds);
+      const hours = Math.floor(total / 3600);
+      const minutes = Math.floor((total % 3600) / 60);
+      const secs = Math.floor(total % 60);
 
-          return parts.join('');
+      const parts = [];
+      if (hours > 0) parts.push(`${hours}小时`);
+      if (minutes > 0) parts.push(`${minutes}分`);
+      if (secs > 0 || parts.length === 0) {
+        parts.push(`${secs}秒`);
       }
+
+      return parts.join('');
+    }
   }
 };
 </script>
@@ -635,4 +670,16 @@ export default {
     overflow-y: auto;
   }
 }
+
+.course-rating-cell {
+  display: inline-block;
+  max-width: 100%;
+  text-align: left;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  font-size: 12px;
+  line-height: 1.4;
+  vertical-align: middle;
+}
 </style>

+ 93 - 29
src/views/crm/customer/customerDetail.vue

@@ -294,6 +294,17 @@ import {listByCustomerId} from "../../../api/crm/customerProperty";
 import {listAnalyze} from "../../../api/crm/customerAnalyze";
 
 export default {
+    props: {
+        // 抽屉模式下由父页面传入;路由模式下可不传
+        customerId: {
+            type: [String, Number],
+            default: null
+        },
+        customerRow: {
+            type: Object,
+            default: null
+        }
+    },
     data() {
         return {
             customerUserId: null, // 客户 ID,从路由参数获取
@@ -351,44 +362,97 @@ export default {
             }
             const latestRecord = this.communicationRecords[0];
             if (latestRecord && latestRecord.customerFocusJson) {
-                try {
-                    // 如果是字符串,尝试解析为 JSON 数组
-                    if (typeof latestRecord.customerFocusJson === 'string') {
-                        const parsed = JSON.parse(latestRecord.customerFocusJson);
-                        // 如果解析后的数组为空,返回默认提示
-                        if (Array.isArray(parsed) && parsed.length > 0) {
-                            return parsed;
-                        }
-                    }
-                    // 如果已经是数组且不为空,直接返回
-                    if (Array.isArray(latestRecord.customerFocusJson) && latestRecord.customerFocusJson.length > 0) {
-                        return latestRecord.customerFocusJson;
-                    }
-                } catch (error) {
-                    console.error('解析客户关注点 JSON 失败:', error);
-                }
+                return this.normalizeFocusPoints(latestRecord.customerFocusJson);
             }
             return ['暂无分析数据'];
         }
     },
     created() {
-        // 从路由参数获取客户 ID
-        this.customerUserId = this.$route.params.customerId || this.$route.query.customerUserId;
-
-        // 从 query 参数获取列表页传递的完整客户数据
-        if (this.$route.query.customerData) {
-            try {
-                this.customerData = JSON.parse(this.$route.query.customerData);
-            } catch (error) {
-                console.error('解析客户数据失败:', error);
+        this.initFromParentOrRoute();
+    },
+    watch: {
+        customerId: {
+            immediate: false,
+            handler() {
+                // 抽屉重复打开/切换客户时刷新
+                this.initFromParentOrRoute();
             }
         }
-        // 获取客户标签
-        this.loadCustomerTags();
-        //加载客户分析信息
-        this.getCustomerInfoList();
     },
     methods: {
+        normalizeFocusPoints(value) {
+            if (value === null || value === undefined) return [];
+            if (Array.isArray(value)) {
+                return value.map(v => String(v)).filter(Boolean);
+            }
+
+            // 字符串:可能是 JSON 数组字符串,也可能是普通字符串
+            if (typeof value === 'string') {
+                const raw = value.trim();
+                if (!raw) return [];
+
+                // JSON 数组 / JSON 字符串尝试解析
+                if (
+                    (raw.startsWith('[') && raw.endsWith(']')) ||
+                    (raw.startsWith('"') && raw.endsWith('"')) ||
+                    (raw.startsWith("'") && raw.endsWith("'"))
+                ) {
+                    try {
+                        const parsed = JSON.parse(raw);
+                        if (Array.isArray(parsed)) {
+                            return parsed.map(v => String(v)).map(s => s.trim()).filter(Boolean);
+                        }
+                        if (typeof parsed === 'string') {
+                            return this.normalizeFocusPoints(parsed);
+                        }
+                    } catch (e) {
+                        // ignore,走后面的兜底清洗
+                    }
+                }
+
+                // 兜底:去掉中括号/引号后按分隔符拆分
+                let cleaned = raw;
+                if (cleaned.startsWith('[') && cleaned.endsWith(']')) {
+                    cleaned = cleaned.slice(1, -1);
+                }
+                cleaned = cleaned.replace(/["']/g, '');
+
+                const parts = cleaned
+                    .split(/[,,、;;\n]/g)
+                    .map(s => s.trim())
+                    .filter(Boolean);
+
+                return parts.length ? parts : [cleaned.trim()].filter(Boolean);
+            }
+
+            // 其它类型兜底
+            return [String(value)].filter(Boolean);
+        },
+        initFromParentOrRoute() {
+            // 优先用父组件传参(抽屉模式)
+            const idFromParent = this.customerId;
+            if (idFromParent !== null && idFromParent !== undefined && idFromParent !== '') {
+                this.customerUserId = idFromParent;
+                this.customerData = this.customerRow || null;
+            } else {
+                // 路由模式兜底
+                this.customerUserId = this.$route.params.customerId || this.$route.query.customerUserId;
+                if (this.$route.query.customerData) {
+                    try {
+                        this.customerData = JSON.parse(this.$route.query.customerData);
+                    } catch (error) {
+                        console.error('解析客户数据失败:', error);
+                    }
+                }
+            }
+
+            // 重置分页(切换客户时)
+            this.communicationRecordsPageNum = 1;
+            // 获取客户标签
+            this.loadCustomerTags();
+            // 加载客户分析信息
+            this.getCustomerInfoList();
+        },
         loadCustomerTags() {
             listByCustomerId(this.customerUserId).then((response) => {
                 if (response.code === 200) {

+ 26 - 9
src/views/crm/customer/index.vue

@@ -304,7 +304,7 @@
                 v-if="scope.row.attritionLevel !== null && scope.row.attritionLevel !== undefined"
                 size="mini"
                 type="text"
-                @click="toDetailPage(scope.row)"
+                @click="openAiDrawer(scope.row)"
                 v-hasPermi="['crm:analyze:list']"
               >AI 分析</el-button>
               <el-button
@@ -338,6 +338,19 @@
         <customer-details  ref="customerDetails" />
     </el-drawer>
 
+    <el-drawer
+      size="75%"
+      :title="aiAnalyze.title"
+      :visible.sync="aiAnalyze.open"
+      append-to-body
+    >
+      <customer-detail
+        ref="customerAiDetail"
+        :customer-id="aiAnalyze.customerId"
+        :customer-row="aiAnalyze.customerRow"
+      />
+    </el-drawer>
+
 
 
     <el-dialog :title="addSms.title" :visible.sync="addSms.open" width="1000px" append-to-body>
@@ -385,6 +398,7 @@
 import { assignToUser,recover,receive,getCustomerList ,addCustomer,updateCustomer,getCustomerDetails,exportCustomer,importVisitTemplate } from "@/api/crm/customer";
 import { getToken } from "@/utils/auth";
 import customerDetails from '../components/customerDetails.vue';
+import customerDetail from './customerDetail.vue';
 import {getCitys} from "@/api/store/city";
 import { treeselect } from "@/api/company/companyDept";
 import Treeselect from "@riophae/vue-treeselect";
@@ -396,7 +410,7 @@ import customerAssignList from '../components/customerAssignList.vue';
 import assignUser from '../components/assignUser.vue';
 export default {
   name: "Customer",
-  components: {assignUser,customerAssignList,addBatchSms,editSource, customerDetails,Treeselect,customerSource },
+  components: {assignUser,customerAssignList,addBatchSms,editSource, customerDetails, customerDetail, Treeselect,customerSource },
   data() {
     return {
       upload: {
@@ -462,6 +476,12 @@ export default {
         title:"客户详情",
         open:false,
       },
+      aiAnalyze: {
+        title: "AI 分析",
+        open: false,
+        customerId: null,
+        customerRow: null,
+      },
       // 遮罩层
       loading: true,
       // 选中数组
@@ -579,13 +599,10 @@ export default {
     this.getList();
   },
   methods: {
-    toDetailPage(row) {
-      this.$router.push({
-        path: '/crm/customer/detail/' + row.customerId,
-        query: {
-          customerData: JSON.stringify(row)
-        }
-      });
+    openAiDrawer(row) {
+      this.aiAnalyze.customerId = row.customerId;
+      this.aiAnalyze.customerRow = row;
+      this.aiAnalyze.open = true;
     },
     handleShow(row){
       this.show.open=true;