lmx hai 3 semanas
pai
achega
eee4b932ba

+ 20 - 0
src/views/company/companyVoiceRobotic/index.vue

@@ -638,6 +638,16 @@
               </el-input>
             </el-form-item>
 
+            <el-form-item label="加密手机号">
+              <el-input
+                v-model="execLogs.encryptPhone"
+                placeholder="请输入加密手机号"
+                clearable
+                @keyup.enter.native="handleSearch"
+                style="width: 240px">
+              </el-input>
+            </el-form-item>
+
             <el-form-item>
               <span style="margin-right: 8px;">只看待执行外呼任务</span>
               <el-checkbox v-model="execLogs.onlyCallNode"></el-checkbox>
@@ -1081,6 +1091,7 @@ export default {
         currentTaskId: null,
         customerName: '',
         customerPhone: '',
+        encryptPhone: '',
         onlyCallNode: false
       },
       manualCallDialog: {
@@ -1194,6 +1205,7 @@ export default {
           // 清空搜索条件
           this.execLogs.customerName = ''
           this.execLogs.customerPhone = ''
+          this.execLogs.encryptPhone = ''
           this.execLogs.pageNum = 1
           this.execLogs.onlyCallNode = false
 
@@ -1571,6 +1583,7 @@ export default {
         this.$refs.appendCustomer.setRowsDesignatedCompany([], this.currentCompanyId);
         this.$nextTick(() => {
           this.$refs.appendCustomer.setExcludeCustomerIds(existingIds);
+          this.$refs.appendCustomer.setTaskId(row.id);
         });
       }).catch(() => {
         this.$refs.appendCustomer.setRowsDesignatedCompany([], this.currentCompanyId);
@@ -1781,6 +1794,11 @@ export default {
     },
     async getExecLogs() {
       this.execLogs.loading = true
+      // 同时输入手机号与加密手机号时,仅以加密手机号为准
+      if (this.execLogs.customerPhone && this.execLogs.encryptPhone) {
+        this.execLogs.customerPhone = ''
+        this.$message.info('已同时输入手机号与加密手机号,将以加密手机号为查询条件')
+      }
       try {
         const res = await getExecRecords({
           roboticId: this.execLogs.currentTaskId,
@@ -1788,6 +1806,7 @@ export default {
           pageSize: this.execLogs.pageSize,
           customerName: this.execLogs.customerName,
           customerPhone: this.execLogs.customerPhone,
+          encryptPhone: this.execLogs.encryptPhone,
           onlyCallNode: this.execLogs.onlyCallNode
         })
         this.execLogs.list = (res.rows || []).map(item => ({
@@ -1833,6 +1852,7 @@ export default {
     handleReset() {
       this.execLogs.customerName = ''
       this.execLogs.customerPhone = ''
+      this.execLogs.encryptPhone = ''
       this.execLogs.pageNum = 1
       this.execLogs.onlyCallNode = false
       this.getExecLogs()

+ 92 - 17
src/views/crm/components/AppendCustomerSelect.vue

@@ -1,7 +1,7 @@
 <template>
   <el-drawer size="75%" title="追加客户选择" :visible.sync="shows" append-to-body>
     <div class="app-container">
-      <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="82px">
         <el-form-item label="公司名" prop="companyId">
           <el-select filterable v-model="queryParams.companyId" :disabled="designatedCompany" placeholder="请选择公司名" @change="companyChange" clearable size="small">
             <el-option
@@ -24,7 +24,13 @@
             @keyup.enter.native="handleQuery"
           />
         </el-form-item>
-        <el-form-item label="客户状态" prop="status">
+        <el-form-item label="是否可追加" prop="taskCustomerFilter">
+          <el-select v-model="taskCustomerFilter" placeholder="请选择是否可追加" clearable size="small" @change="handleQuery">
+            <el-option label="不在任务(可追加)" value="notInTask" />
+            <el-option label="已在任务(不可追加)" value="inTask" />
+          </el-select>
+        </el-form-item>
+        <!-- <el-form-item label="客户状态" prop="status">
           <el-select v-model="queryParams.status" placeholder="请选择客户状态" clearable size="small">
             <el-option
               v-for="item in statusOptions"
@@ -43,7 +49,7 @@
               :value="item.dictValue"
             />
           </el-select>
-        </el-form-item>
+        </el-form-item> -->
         <el-form-item label="创建时间" prop="createTime">
           <el-date-picker clearable size="small" style="width: 205.4px"
                           v-model="dateRange"
@@ -82,6 +88,15 @@
               :value="item.dictLabel"
             />
           </el-select>
+        </el-form-item>
+                <el-form-item label="自定义标签" prop="customTag">
+          <el-input
+            v-model="customTag"
+            placeholder="输入标签关键词模糊搜索"
+            clearable
+            size="small"
+            @keyup.enter.native="handleQuery"
+          />
         </el-form-item>
         <el-form-item>
           <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -103,35 +118,71 @@
       </el-row>
       <el-table border v-loading="loading" :data="customerList" :row-key="getRowKeys" @selection-change="handleSelectionChange" size="mini" ref="table" height="450" :selectable="canSelect">
         <el-table-column type="selection" width="55" align="center" :reserve-selection="true" :selectable="canSelect" />
-        <el-table-column label="ID" align="center" prop="customerId" />
-        <el-table-column label="所属公司" align="center" prop="companyName" width="300"/>
-        <el-table-column label="客户编码" align="center" prop="customerCode" width="150"/>
-        <el-table-column label="客户名称" align="center" prop="customerName" />
-        <el-table-column label="手机" align="center" prop="mobile" width="90"/>
+        <el-table-column label="ID" align="center" prop="customerId" width="65" />
+        <el-table-column label="所属公司" align="center" prop="companyName" width="220"/>
+        <!-- <el-table-column label="客户编码" align="center" prop="customerCode" width="150"/> -->
+        <el-table-column label="客户名称" align="center" prop="customerName" width="110"/>
+        <el-table-column label="手机" align="center" prop="mobile" width="110"/>
         <el-table-column label="性别" align="center" prop="sex" width="55">
           <template slot-scope="scope">
             <el-tag prop="sex" v-for="(item, index) in sexOptions" :key="'sex'+index" v-if="scope.row.sex==item.dictValue">{{item.dictLabel}}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="微信号" align="center" prop="weixin" width="95"/>
-        <el-table-column label="所在地" align="center" prop="address" />
+        <!-- <el-table-column label="微信号" align="center" prop="weixin" width="95"/> -->
+        <!-- <el-table-column label="所在地" align="center" prop="address" /> -->
         <el-table-column label="标签" align="center" prop="tags" width="100" :show-overflow-tooltip="true"/>
-        <el-table-column label="客户来源" align="center" prop="source">
+        <el-table-column label="客户来源" align="center" prop="source" width="100">
           <template slot-scope="scope">
             <el-tag prop="source" v-for="(item, index) in sourceOptions" :key="'source'+index" v-if="scope.row.source==item.dictValue">{{item.dictLabel}}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="客户类型" align="center" prop="customerType">
+        <!-- <el-table-column label="客户类型" align="center" prop="customerType"> -->
+        <!--   <template slot-scope="scope"> -->
+        <!--     <el-tag prop="customerType" v-for="(item, index) in typeOptions" :key="'customerType'+index" v-if="scope.row.customerType==item.dictValue">{{item.dictLabel}}</el-tag> -->
+        <!--   </template> -->
+        <!-- </el-table-column> -->
+        <!-- <el-table-column label="客户状态" align="center" prop="status"> -->
+        <!--   <template slot-scope="scope"> -->
+        <!--     <el-tag prop="status" v-for="(item, index) in statusOptions" :key="'status'+index" v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag> -->
+        <!--   </template> -->
+        <!-- </el-table-column> -->
+        <el-table-column label="认领人" align="center" prop="companyUserNickName" width="90"/>
+        <el-table-column align="center" width="120">
+          <template slot="header">
+            <div>今日手动外呼</div>
+            <div style="font-size:11px;color:#909399">(接通/总数)</div>
+          </template>
+          <template slot-scope="scope">
+            {{ (scope.row.todayManualConnectCount || 0) }}/{{ (scope.row.todayManualTotalCount || 0) }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" width="120">
+          <template slot="header">
+            <div>今日AI外呼</div>
+            <div style="font-size:11px;color:#909399">(接通/总数)</div>
+          </template>
           <template slot-scope="scope">
-            <el-tag prop="customerType" v-for="(item, index) in typeOptions" :key="'customerType'+index" v-if="scope.row.customerType==item.dictValue">{{item.dictLabel}}</el-tag>
+            {{ (scope.row.todayAiConnectCount || 0) }}/{{ (scope.row.todayAiTotalCount || 0) }}
           </template>
         </el-table-column>
-        <el-table-column label="客户状态" align="center" prop="status">
+        <el-table-column align="center" width="120">
+          <template slot="header">
+            <div>累计手动外呼</div>
+            <div style="font-size:11px;color:#909399">(接通/总数)</div>
+          </template>
           <template slot-scope="scope">
-            <el-tag prop="status" v-for="(item, index) in statusOptions" :key="'status'+index" v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag>
+            {{ (scope.row.totalManualConnectCount || 0) }}/{{ (scope.row.totalManualTotalCount || 0) }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" width="120">
+          <template slot="header">
+            <div>累计AI外呼</div>
+            <div style="font-size:11px;color:#909399">(接通/总数)</div>
+          </template>
+          <template slot-scope="scope">
+            {{ (scope.row.totalAiConnectCount || 0) }}/{{ (scope.row.totalAiTotalCount || 0) }}
           </template>
         </el-table-column>
-        <el-table-column label="认领人" align="center" prop="companyUserNickName" />
         <el-table-column label="状态" align="center" width="80">
           <template slot-scope="scope">
             <el-tag v-if="isExcluded(scope.row.customerId)" type="info" size="small">已添加</el-tag>
@@ -200,6 +251,7 @@ export default {
       citys: [],
       tags: [],
       tagIds: [],
+      customTag: null,
       inputVisible: false,
       inputValue: '',
       statusOptions: [],
@@ -208,6 +260,8 @@ export default {
       sexOptions: [],
       pageSizes: [10, 20, 30, 50, 100, 500],
       submitLoading: false,
+      roboticId: null,
+      taskCustomerFilter: null,
       _excludeCustomerIds: [],
       show: {
         title: "客户详情",
@@ -254,7 +308,8 @@ export default {
         companyId: null,
         isLine: null,
         source: null,
-        tags: null
+        tags: null,
+        companyUserNickName: null
       },
       form: {},
       rules: {
@@ -267,6 +322,8 @@ export default {
       }
     };
   },
+  computed: {
+  },
   created() {
     this.getDicts("crm_customer_tag").then((response) => {
       this.tagsOptions = response.data;
@@ -296,6 +353,9 @@ export default {
     setExcludeCustomerIds(ids) {
       this._excludeCustomerIds = ids || [];
     },
+    setTaskId(roboticId) {
+      this.roboticId = roboticId;
+    },
     canSelect(row) {
       return !this.isExcluded(row.customerId);
     },
@@ -341,6 +401,9 @@ export default {
     },
     buildQueryParams(extraParams = {}) {
       const params = Object.assign({}, this.queryParams, extraParams);
+      params.taskCustomerFilter = this.taskCustomerFilter || null;
+      params.roboticId = this.roboticId || null;
+      params.customTag = this.customTag || null;
       if (this.receiveTimeRange != null && this.receiveTimeRange.length === 2) {
         params.receiveTimeRange = this.receiveTimeRange[0] + "--" + this.receiveTimeRange[1];
       } else {
@@ -399,6 +462,18 @@ export default {
     },
     resetQuery() {
       this.resetForm("queryForm");
+      this.dateRange = [];
+      this.receiveTimeRange = [];
+      this.ctsTypeArr = [];
+      this.sourceArr = [];
+      this.tagIds = [];
+      this.customTag = null;
+      this.taskCustomerFilter = null;
+      if (!this.designatedCompany) {
+        this.queryParams.companyId = null;
+      }
+      this.queryParams.deptId = undefined;
+      this.handleQuery();
     },
     handleSelectionChange(selection) {
       if (this.isSyncingSelection) {

+ 84 - 28
src/views/crm/components/CustomerSelect.vue

@@ -1,7 +1,7 @@
 <template>
   <el-drawer size="75%" title="客户选择" :visible.sync="shows" append-to-body>
     <div class="app-container">
-      <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="82px">
         <el-form-item label="公司名" prop="companyId">
           <el-select filterable  v-model="queryParams.companyId" :disabled="designatedCompany" placeholder="请选择公司名"  @change="companyChange" clearable size="small">
             <el-option
@@ -24,7 +24,7 @@
             @keyup.enter.native="handleQuery"
           />
         </el-form-item>
-        <el-form-item label="客户状态" prop="status">
+        <!-- <el-form-item label="客户状态" prop="status">
           <el-select v-model="queryParams.status" placeholder="请选择客户状态" clearable size="small">
             <el-option
               v-for="item in statusOptions"
@@ -43,7 +43,7 @@
               :value="item.dictValue"
             />
           </el-select>
-        </el-form-item>
+        </el-form-item> -->
 
         <el-form-item label="创建时间" prop="createTime">
           <el-date-picker clearable size="small" style="width: 205.4px"
@@ -83,6 +83,15 @@
               :value="item.dictLabel"
             />
           </el-select>
+        </el-form-item>
+                <el-form-item label="自定义标签" prop="customTag">
+          <el-input
+            v-model="customTag"
+            placeholder="输入标签关键词模糊搜索"
+            clearable
+            size="small"
+            @keyup.enter.native="handleQuery"
+          />
         </el-form-item>
         <el-form-item>
           <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -104,44 +113,77 @@
     </el-row>
       <el-table border v-loading="loading" :data="customerList" :row-key="getRowKeys" @selection-change="handleSelectionChange" size="mini" ref="table" height="450">
         <el-table-column type="selection" width="55" align="center" :reserve-selection="true" />
-        <el-table-column label="ID" align="center" prop="customerId" />
-        <el-table-column label="所属公司" align="center" prop="companyName" width="300"/>
-        <el-table-column label="客户编码" align="center" prop="customerCode" width="150"/>
-        <el-table-column label="客户名称" align="center" prop="customerName" />
-        <el-table-column label="手机" align="center" prop="mobile" width="90"/>
-        <el-table-column  label="性别" align="center" prop="sex" width="55">
+        <el-table-column label="ID" align="center" prop="customerId" width="65" />
+        <el-table-column label="所属公司" align="center" prop="companyName" width="220"/>
+        <!-- <el-table-column label="客户编码" align="center" prop="customerCode" width="150"/> -->
+        <el-table-column label="客户名称" align="center" prop="customerName" width="110"/>
+        <el-table-column label="手机" align="center" prop="mobile" width="110"/>
+        <el-table-column label="性别" align="center" prop="sex" width="55">
           <template slot-scope="scope">
-            <el-tag prop="sex" v-for="(item, index) in sexOptions" :key="'sex'+index"   v-if="scope.row.sex==item.dictValue">{{item.dictLabel}}</el-tag>
+            <el-tag prop="sex" v-for="(item, index) in sexOptions" :key="'sex'+index" v-if="scope.row.sex==item.dictValue">{{item.dictLabel}}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column label="微信号" align="center" prop="weixin" width="95"/>
-        <el-table-column label="所在地" align="center" prop="address" />
+        <!-- <el-table-column label="微信号" align="center" prop="weixin" width="95"/> -->
+        <!-- <el-table-column label="所在地" align="center" prop="address" /> -->
         <el-table-column label="标签" align="center" prop="tags" width="100" :show-overflow-tooltip="true"/>
-        <el-table-column  label="客户来源" align="center" prop="source">
+        <el-table-column label="客户来源" align="center" prop="source" width="100">
           <template slot-scope="scope">
-            <el-tag prop="source" v-for="(item, index) in sourceOptions"  :key="'source'+index"    v-if="scope.row.source==item.dictValue">{{item.dictLabel}}</el-tag>
+            <el-tag prop="source" v-for="(item, index) in sourceOptions" :key="'source'+index" v-if="scope.row.source==item.dictValue">{{item.dictLabel}}</el-tag>
           </template>
         </el-table-column>
-
-        <el-table-column  label="客户类型" align="center" prop="customerType">
+        <!-- <el-table-column label="客户类型" align="center" prop="customerType"> -->
+        <!--   <template slot-scope="scope"> -->
+        <!--     <el-tag prop="customerType" v-for="(item, index) in typeOptions" :key="'customerType'+index" v-if="scope.row.customerType==item.dictValue">{{item.dictLabel}}</el-tag> -->
+        <!--   </template> -->
+        <!-- </el-table-column> -->
+        <!-- <el-table-column label="客户状态" align="center" prop="status"> -->
+        <!--   <template slot-scope="scope"> -->
+        <!--     <el-tag prop="status" v-for="(item, index) in statusOptions" :key="'status'+index" v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag> -->
+        <!--   </template> -->
+        <!-- </el-table-column> -->
+        <el-table-column label="认领人" align="center" prop="companyUserNickName" width="90"/>
+        <el-table-column align="center" width="120">
+          <template slot="header">
+            <div>今日手动外呼</div>
+            <div style="font-size:11px;color:#909399">(接通/总数)</div>
+          </template>
           <template slot-scope="scope">
-            <el-tag prop="customerType" v-for="(item, index) in typeOptions" :key="'customerType'+index"   v-if="scope.row.customerType==item.dictValue">{{item.dictLabel}}</el-tag>
+            {{ (scope.row.todayManualConnectCount || 0) }}/{{ (scope.row.todayManualTotalCount || 0) }}
           </template>
         </el-table-column>
-
-        <el-table-column  label="客户状态" align="center" prop="status">
+        <el-table-column align="center" width="120">
+          <template slot="header">
+            <div>今日AI外呼</div>
+            <div style="font-size:11px;color:#909399">(接通/总数)</div>
+          </template>
           <template slot-scope="scope">
-            <el-tag prop="status" v-for="(item, index) in statusOptions"  :key="'status'+index"  v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag>
+            {{ (scope.row.todayAiConnectCount || 0) }}/{{ (scope.row.todayAiTotalCount || 0) }}
           </template>
         </el-table-column>
-
-        <el-table-column label="认领人" align="center" prop="companyUserNickName" />
-        <el-table-column label="领取时间" align="center" prop="receiveTime"  width="135"/>
-        <el-table-column label="创建时间" align="center" prop="createTime" width="135"/>
-        <el-table-column label="最后一次跟进时间" align="center" prop="lastTime" width="180">
+        <el-table-column align="center" width="120">
+          <template slot="header">
+            <div>累计手动外呼</div>
+            <div style="font-size:11px;color:#909399">(接通/总数)</div>
+          </template>
+          <template slot-scope="scope">
+            {{ (scope.row.totalManualConnectCount || 0) }}/{{ (scope.row.totalManualTotalCount || 0) }}
+          </template>
         </el-table-column>
-        <el-table-column label="入公海时间" align="center" prop="poolTime" width="180" />
-        <el-table-column label="操作" fixed="right" width="180px" align="center" class-name="small-padding fixed-width">
+        <el-table-column align="center" width="120">
+          <template slot="header">
+            <div>累计AI外呼</div>
+            <div style="font-size:11px;color:#909399">(接通/总数)</div>
+          </template>
+          <template slot-scope="scope">
+            {{ (scope.row.totalAiConnectCount || 0) }}/{{ (scope.row.totalAiTotalCount || 0) }}
+          </template>
+        </el-table-column>
+        <el-table-column label="领取时间" align="center" prop="receiveTime" width="145"/>
+        <el-table-column label="创建时间" align="center" prop="createTime" width="145"/>
+        <!-- <el-table-column label="最后一次跟进时间" align="center" prop="lastTime" width="180"> -->
+        <!-- </el-table-column> -->
+        <!-- <el-table-column label="入公海时间" align="center" prop="poolTime" width="180" /> -->
+        <el-table-column label="操作" fixed="right" width="80px" align="center" class-name="small-padding fixed-width">
           <template slot-scope="scope">
             <el-button
               size="mini"
@@ -207,6 +249,7 @@ export default {
       citys:[],
       tags:[],
       tagIds:[],
+      customTag: null,
       inputVisible: false,
       inputValue: '',
       statusOptions:[],
@@ -270,7 +313,8 @@ export default {
         companyId: null,
         isLine: null,
         source: null,
-        tags: null
+        tags: null,
+        companyUserNickName: null
       },
       // 表单参数
       form: {},
@@ -372,6 +416,7 @@ export default {
       } else {
         params.tags = null;
       }
+      params.customTag = this.customTag || null;
       return params;
     },
     getRowKeys(item){
@@ -457,6 +502,17 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
+      this.dateRange = [];
+      this.receiveTimeRange = [];
+      this.ctsTypeArr = [];
+      this.sourceArr = [];
+      this.tagIds = [];
+      this.customTag = null;
+      if (!this.designatedCompany) {
+        this.queryParams.companyId = null;
+      }
+      this.queryParams.deptId = undefined;
+      this.handleQuery();
     },
     // 多选框选中数据
     handleSelectionChange(selection) {

+ 1 - 1
src/views/taskStatistics/callLog/index.vue

@@ -286,7 +286,7 @@
                     </template>
                 </el-table-column>
                 <el-table-column label="时长(秒)" align="center" prop="callTime" width="80" />
-                <el-table-column label="金额" align="center" prop="cost" width="70" />
+                <!-- <el-table-column label="金额" align="center" prop="cost" width="70" /> -->
                 <el-table-column label="公司名称" align="center" prop="companyName" min-width="100" show-overflow-tooltip />
                 <el-table-column label="销售名称" align="center" prop="companyUserName" min-width="80" show-overflow-tooltip />
                 <el-table-column label="录音" align="center" show-overflow-tooltip width="350">