Преглед изворни кода

优化销售端sop任务客户电话展示逻辑

cgp пре 3 недеља
родитељ
комит
42e2ac1aff

+ 41 - 67
src/views/qw/companyUserTask/index.vue

@@ -56,6 +56,30 @@
       <el-table-column type="selection" width="55" align="center"/>
       <el-table-column label="医生" align="center" prop="doctorName"/>
       <el-table-column label="客户" align="center" prop="name"/>
+      <el-table-column label="电话" align="center" prop="phone">
+        <template slot-scope="scope">
+          <div style="display: flex; align-items: center; gap: 8px;">
+            <!-- 显示解密后的电话,或原始加密电话,或占位符 -->
+            <span class="detail-value">
+        {{ scope.row._decryptedPhone !== undefined
+              ? (scope.row._decryptedPhone || '—')
+              : (scope.row.phone ? '******' : '—') }}
+      </span>
+
+            <!-- 放大镜图标按钮 -->
+            <el-button
+              v-if="scope.row.id"
+              type="text"
+              icon="el-icon-search"
+              size="mini"
+              :loading="scope.row._phoneLoading"
+              @click="fetchDecryptedPhoneForRow(scope.row)"
+              title="点击查看真实号码"
+              style="padding: 0; margin-left: 0;"
+            ></el-button>
+          </div>
+        </template>
+      </el-table-column>
       <el-table-column label="客户头像" align="center" prop="avatar" width="100px">
         <template slot-scope="scope">
           <el-popover
@@ -107,60 +131,6 @@
       @pagination="getList"
     />
 
-    <!-- 销售处理sop任务详情对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
-      <el-form :model="form" label-width="100px" size="small">
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="医生:">
-              <span class="detail-value">{{ form.doctorName || '—' }}</span>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="客户:">
-              <span class="detail-value">{{ form.name || '—' }}</span>
-            </el-form-item>
-          </el-col>
-
-          <el-col :span="12">
-            <el-form-item label="客户电话:">
-              <div style="display: flex; align-items: center; gap: 8px;">
-                <span class="detail-value">
-                  {{ decryptedPhone || (form.phone ? '******' : '—') }}
-                </span>
-                <el-button
-                  v-if="form.id"
-                  type="text"
-                  icon="el-icon-search"
-                  size="mini"
-                  @click="fetchDecryptedPhone(form.id)"
-                  :loading="phoneLoading"
-                  title="点击查看真实号码"
-                  style="padding: 0; margin-left: 0;"
-                ></el-button>
-              </div>
-            </el-form-item>
-          </el-col>
-
-          <el-col :span="12">
-            <el-form-item label="处理状态:">
-              <dict-tag :options="statusOptions" :value="form.status"/>
-            </el-form-item>
-          </el-col>
-
-          <el-col :span="24">
-            <el-form-item label="备注:">
-              <span class="detail-value">{{ form.remark || '—' }}</span>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="cancel">关 闭</el-button>
-      </div>
-    </el-dialog>
-
     <!-- 会员详情抽屉 -->
     <el-drawer
       :title="show.title"
@@ -214,10 +184,6 @@ export default {
       open: false,
       // 处理状态字典
       statusOptions: [],
-      // 用于存储解密后的电话
-      decryptedPhone: '',
-      // 电话加载状态
-      phoneLoading: false,
       // 会员详情抽屉
       show: {
         title: "会员详情",
@@ -261,7 +227,11 @@ export default {
     getList() {
       this.loading = true;
       listCompanyUserTask(this.queryParams).then(response => {
-        this.companyUserTaskList = response.rows;
+        // 清理每行的临时解密字段(避免旧数据显示)
+        this.companyUserTaskList = (response.rows || []).map(row => {
+          const { _decryptedPhone, _phoneLoading, ...cleanRow } = row; // 移除临时字段
+          return { ...cleanRow };
+        });
         this.total = response.total;
         this.loading = false;
       });
@@ -377,18 +347,22 @@ export default {
       this.queryParams.pageNum = 1; // 切换时重置页码
       this.getList();
     },
-    /** 获取并显示解密后的电话 */
-    async fetchDecryptedPhone(id) {
-      if (!id) return;
-      this.phoneLoading = true;
+    /** 获取并显示当前行解密后的电话 */
+    async fetchDecryptedPhoneForRow(row) {
+      if (!row.id || row._phoneLoading) return;
+
+      // 避免重复请求
+      this.$set(row, '_phoneLoading', true);
+
       try {
-        const response = await getUserPhone(id);
-        this.decryptedPhone = response.userPhone || '—';
+        const response = await getUserPhone(row.id);
+        const phone = response.userPhone || '—';
+        this.$set(row, '_decryptedPhone', phone);
       } catch (error) {
         this.$message.error('获取电话失败');
-        this.decryptedPhone = '获取失败';
+        this.$set(row, '_decryptedPhone', '获取失败');
       } finally {
-        this.phoneLoading = false;
+        this.$set(row, '_phoneLoading', false);
       }
     },
   }

+ 41 - 79
src/views/qw/companyUserTaskStatsOverview/index.vue

@@ -56,17 +56,30 @@
       <el-table-column type="selection" width="55" align="center"/>
       <el-table-column label="医生" align="center" prop="doctorName"/>
       <el-table-column label="客户" align="center" prop="name"/>
-<!--      <el-table-column label="客户头像" align="center" prop="avatar" width="100px">-->
-<!--        <template slot-scope="scope">-->
-<!--          <el-popover-->
-<!--            placement="right"-->
-<!--            title=""-->
-<!--            trigger="hover">-->
-<!--            <img slot="reference" :src="scope.row.avatar" width="60px">-->
-<!--            <img :src="scope.row.avatar" style="max-width: 200px;">-->
-<!--          </el-popover>-->
-<!--        </template>-->
-<!--      </el-table-column>-->
+      <el-table-column label="电话" align="center" prop="phone">
+        <template slot-scope="scope">
+          <div style="display: flex; align-items: center; gap: 8px;">
+            <!-- 显示解密后的电话,或原始加密电话,或占位符 -->
+            <span class="detail-value">
+        {{ scope.row._decryptedPhone !== undefined
+              ? (scope.row._decryptedPhone || '—')
+              : (scope.row.phone ? '******' : '—') }}
+      </span>
+
+            <!-- 放大镜图标按钮 -->
+            <el-button
+              v-if="scope.row.id"
+              type="text"
+              icon="el-icon-search"
+              size="mini"
+              :loading="scope.row._phoneLoading"
+              @click="fetchDecryptedPhoneForRow(scope.row)"
+              title="点击查看真实号码"
+              style="padding: 0; margin-left: 0;"
+            ></el-button>
+          </div>
+        </template>
+      </el-table-column>
       <el-table-column label="升单类型" align="center" prop="type">
         <template slot-scope="scope">
           <dict-tag :options="typeOptions" :value="scope.row.type"/>
@@ -79,7 +92,6 @@
       </el-table-column>
       <el-table-column label="派发时间" align="center" prop="createTime"/>
       <el-table-column label="处理时间" align="center" prop="updateTime"/>
-      <el-table-column label="处理耗时" align="center" prop="name"/>
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
@@ -101,60 +113,6 @@
       @pagination="getList"
     />
 
-    <!-- 销售处理sop任务详情对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
-      <el-form :model="form" label-width="100px" size="small">
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="医生:">
-              <span class="detail-value">{{ form.doctorName || '—' }}</span>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="客户:">
-              <span class="detail-value">{{ form.name || '—' }}</span>
-            </el-form-item>
-          </el-col>
-
-          <el-col :span="12">
-            <el-form-item label="客户电话:">
-              <div style="display: flex; align-items: center; gap: 8px;">
-                <span class="detail-value">
-                  {{ decryptedPhone || (form.phone ? '******' : '—') }}
-                </span>
-                <el-button
-                  v-if="form.id"
-                  type="text"
-                  icon="el-icon-search"
-                  size="mini"
-                  @click="fetchDecryptedPhone(form.id)"
-                  :loading="phoneLoading"
-                  title="点击查看真实号码"
-                  style="padding: 0; margin-left: 0;"
-                ></el-button>
-              </div>
-            </el-form-item>
-          </el-col>
-
-          <el-col :span="12">
-            <el-form-item label="处理状态:">
-              <dict-tag :options="statusOptions" :value="form.status"/>
-            </el-form-item>
-          </el-col>
-
-          <el-col :span="24">
-            <el-form-item label="备注:">
-              <span class="detail-value">{{ form.remark || '—' }}</span>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="cancel">关 闭</el-button>
-      </div>
-    </el-dialog>
-
     <!-- 会员详情抽屉 -->
     <el-drawer
       :title="show.title"
@@ -205,10 +163,6 @@ export default {
       open: false,
       // 处理状态字典
       statusOptions: [],
-      // 用于存储解密后的电话
-      decryptedPhone: '',
-      // 电话加载状态
-      phoneLoading: false,
       // 会员详情抽屉
       show: {
         title: "会员详情",
@@ -252,7 +206,11 @@ export default {
     getList() {
       this.loading = true;
       statsOverviewList(this.queryParams).then(response => {
-        this.companyUserTaskList = response.rows;
+        // 清理每行的临时解密字段(避免旧数据显示)
+        this.companyUserTaskList = (response.rows || []).map(row => {
+          const { _decryptedPhone, _phoneLoading, ...cleanRow } = row; // 移除临时字段
+          return { ...cleanRow };
+        });
         this.total = response.total;
         this.loading = false;
       });
@@ -310,18 +268,22 @@ export default {
       this.queryParams.pageNum = 1; // 切换时重置页码
       this.getList();
     },
-    /** 获取并显示解密后的电话 */
-    async fetchDecryptedPhone(id) {
-      if (!id) return;
-      this.phoneLoading = true;
+    /** 获取并显示当前行解密后的电话 */
+    async fetchDecryptedPhoneForRow(row) {
+      if (!row.id || row._phoneLoading) return;
+
+      // 避免重复请求
+      this.$set(row, '_phoneLoading', true);
+
       try {
-        const response = await getUserPhone(id);
-        this.decryptedPhone = response.userPhone || '—';
+        const response = await getUserPhone(row.id);
+        const phone = response.userPhone || '—';
+        this.$set(row, '_decryptedPhone', phone);
       } catch (error) {
         this.$message.error('获取电话失败');
-        this.decryptedPhone = '获取失败';
+        this.$set(row, '_decryptedPhone', '获取失败');
       } finally {
-        this.phoneLoading = false;
+        this.$set(row, '_phoneLoading', false);
       }
     },
     /** 会员详情按钮操作 */

+ 1 - 1
src/views/qw/companyUserTaskStatsOverview/overviewUserDetails.vue

@@ -2,7 +2,7 @@
   <div>
     <div style="background-color: #f0f2f5; padding-bottom: 20px; min-height: 100%; " >
       <div style="padding: 20px; background-color: #fff;">
-        会员详情
+        用户详情
       </div>
     </div>
     <template>