|
@@ -6,15 +6,17 @@
|
|
|
<div class="content_left">
|
|
<div class="content_left">
|
|
|
<SearchBlock :searchList="headerSearchList" @searchChange="HandleBlockSearchChange">
|
|
<SearchBlock :searchList="headerSearchList" @searchChange="HandleBlockSearchChange">
|
|
|
<template #rowItem-time>
|
|
<template #rowItem-time>
|
|
|
|
|
+
|
|
|
<el-date-picker
|
|
<el-date-picker
|
|
|
v-if="listSearchParams.time == 'custom'"
|
|
v-if="listSearchParams.time == 'custom'"
|
|
|
style="height: 28px;flex-grow: 0;width: 225px;"
|
|
style="height: 28px;flex-grow: 0;width: 225px;"
|
|
|
v-model="listSearchParams.startAndEndTime"
|
|
v-model="listSearchParams.startAndEndTime"
|
|
|
- type="daterange"
|
|
|
|
|
|
|
+ type="datetimerange"
|
|
|
range-separator="至"
|
|
range-separator="至"
|
|
|
- start-placeholder="开始日期"
|
|
|
|
|
- end-placeholder="结束日期"
|
|
|
|
|
|
|
+ start-placeholder="开始时间"
|
|
|
|
|
+ end-placeholder="结束时间"
|
|
|
size="default"
|
|
size="default"
|
|
|
|
|
+ @change="(val)=>HandleBlockSearchChange({startAndEndTime:val},'startAndEndTime')"
|
|
|
/>
|
|
/>
|
|
|
</template>
|
|
</template>
|
|
|
</SearchBlock>
|
|
</SearchBlock>
|
|
@@ -37,15 +39,17 @@
|
|
|
defaultValue:'',
|
|
defaultValue:'',
|
|
|
disabled:false
|
|
disabled:false
|
|
|
}
|
|
}
|
|
|
- ]" @searchChange="HandleBlurSearchChange"/>
|
|
|
|
|
|
|
+ ]" @searchChange="HandleBlockSearchChange"/>
|
|
|
<Table :currentPage="currentPage" :pageSize="pageSize" :totalNum="totalNum"
|
|
<Table :currentPage="currentPage" :pageSize="pageSize" :totalNum="totalNum"
|
|
|
- :tableColumns="tableColumns" :tableData="tableData">
|
|
|
|
|
|
|
+ :tableColumns="tableColumns" :tableData="tableData"
|
|
|
|
|
+ @paginationChange="HandlePaginationChange">
|
|
|
<template #num="{currentIndex}">
|
|
<template #num="{currentIndex}">
|
|
|
{{ (currentPage - 1) * pageSize + currentIndex }}
|
|
{{ (currentPage - 1) * pageSize + currentIndex }}
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
- <template #followUpContent="{row}">
|
|
|
|
|
- <span class="two_line_ellipsis">{{ row.followUpContent }}</span>
|
|
|
|
|
|
|
+
|
|
|
|
|
+ <template #followContent="{row}">
|
|
|
|
|
+ <span class="two_line_ellipsis">{{ row.followContent }}</span>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<template #operation="{row}">
|
|
<template #operation="{row}">
|
|
@@ -65,9 +69,16 @@
|
|
|
title="审核申请"
|
|
title="审核申请"
|
|
|
:customFooter="true"
|
|
:customFooter="true"
|
|
|
@close="CloseAuditDialog">
|
|
@close="CloseAuditDialog">
|
|
|
- <TabSearch :tabList="tabList" :defaultTabKey="defaultAuditStatus" tab-type="box" />
|
|
|
|
|
|
|
+ <TabSearch tab-type="box" :tabList="tabList"
|
|
|
|
|
+ :defaultTabKey="defaultAuditStatus"
|
|
|
|
|
+ @tabChange="HandleTabChange" />
|
|
|
|
|
|
|
|
- <FollowCard :cardList="finalAuditRenderData"></FollowCard>
|
|
|
|
|
|
|
+ <FollowCard :cardList="auditList">
|
|
|
|
|
+ <template #operation="{row}">
|
|
|
|
|
+ <el-button class="delete_button_border_no_bg" @click="HandleAuditOperation(row,2)">驳回赢单</el-button>
|
|
|
|
|
+ <el-button class="button_border" @click="HandleAuditOperation(row,1)">通过赢单</el-button>
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </FollowCard>
|
|
|
|
|
|
|
|
<template #close>
|
|
<template #close>
|
|
|
<el-button @click="CloseAuditDialog" class="button_background" >关闭</el-button>
|
|
<el-button @click="CloseAuditDialog" class="button_background" >关闭</el-button>
|
|
@@ -76,172 +87,303 @@
|
|
|
</PreviewDialog>
|
|
</PreviewDialog>
|
|
|
|
|
|
|
|
<!-- 操作日志弹窗 -->
|
|
<!-- 操作日志弹窗 -->
|
|
|
- <PreviewDialog title="操作记录"
|
|
|
|
|
- class="operation_log_dialog"
|
|
|
|
|
- :customFooter="true"
|
|
|
|
|
- :previewVisible="operationLogDialogVisible"
|
|
|
|
|
- @close="CloseOperationLogDialog">
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- <!-- 搜索列表 -->
|
|
|
|
|
- <SearchBlock :searchList="operationLogSearchList"
|
|
|
|
|
- @searchChange="HandleLogBlockSearchChange">
|
|
|
|
|
- <template #rowItem-time>
|
|
|
|
|
- <el-date-picker
|
|
|
|
|
- v-if="logSearchParams.time === 'custom'"
|
|
|
|
|
- style="height: 28px;flex-grow: 0;width: 225px;"
|
|
|
|
|
- v-model="logSearchParams.startAndEndTime"
|
|
|
|
|
- type="daterange"
|
|
|
|
|
- range-separator="至"
|
|
|
|
|
- start-placeholder="开始日期"
|
|
|
|
|
- end-placeholder="结束日期"
|
|
|
|
|
- size="default"
|
|
|
|
|
- />
|
|
|
|
|
- </template>
|
|
|
|
|
- </SearchBlock>
|
|
|
|
|
-
|
|
|
|
|
- <FormSearchGroup :searchList="[
|
|
|
|
|
- {
|
|
|
|
|
- key:'queryStr',
|
|
|
|
|
- type:'input',
|
|
|
|
|
- placeholder:'请输入关键字搜索',
|
|
|
|
|
- hidden:false,
|
|
|
|
|
- defaultValue:'',
|
|
|
|
|
- disabled:false
|
|
|
|
|
- }
|
|
|
|
|
- ]" @searchChange="HandleLogBlurSearchChange"/>
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- <!-- 日志列表 -->
|
|
|
|
|
- <div>
|
|
|
|
|
- <FollowCard class="log_list_container" :cardList="finalOperationLogRenderData">
|
|
|
|
|
- <template #operation><i></i></template>
|
|
|
|
|
- </FollowCard>
|
|
|
|
|
-
|
|
|
|
|
- <div class="page_pagination">
|
|
|
|
|
- <span style="flex:1 1;color: #666666;font-size: 14px;">共 {{ logTotalNum }} 条数据</span>
|
|
|
|
|
- <!-- background layout="sizes, prev, pager, next" -->
|
|
|
|
|
- <el-pagination
|
|
|
|
|
- :current-page="logCurrentPage"
|
|
|
|
|
- :page-size="logPageSize"
|
|
|
|
|
- :page-sizes="[20, 50, 100]"
|
|
|
|
|
- background layout="sizes, prev, pager, next"
|
|
|
|
|
- :total="Number(logTotalNum)"
|
|
|
|
|
- @current-change="(val)=>HandleLogPaginaionChange({type:'currentPage',val})"
|
|
|
|
|
- @size-change="(val)=>HandleLogPaginaionChange({type:'pageSize',val})" />
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
-
|
|
|
|
|
- <template #close>
|
|
|
|
|
- <el-button @click="CloseOperationLogDialog" class="button_background" >关闭</el-button>
|
|
|
|
|
- </template>
|
|
|
|
|
- <template #confirm><i></i></template>
|
|
|
|
|
-
|
|
|
|
|
- </PreviewDialog>
|
|
|
|
|
-
|
|
|
|
|
|
|
+ <CustomerOperationDialog
|
|
|
|
|
+ v-if="operationLogDialogVisible"
|
|
|
|
|
+ v-model:dialogVisible="operationLogDialogVisible">
|
|
|
|
|
+ </CustomerOperationDialog>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
-import { computed, ref } from 'vue';
|
|
|
|
|
|
|
+import { computed, onMounted, ref } from 'vue';
|
|
|
|
|
+import {ElMessage} from 'element-plus'
|
|
|
import SearchBlock from '@/baseComponents/SearchBlock.vue';
|
|
import SearchBlock from '@/baseComponents/SearchBlock.vue';
|
|
|
-import {headerSearchList, operationLogSearchList} from './searchBlock'
|
|
|
|
|
|
|
+import {headerSearchList} from './searchBlock'
|
|
|
import Table from '@/baseComponents/Table.vue';
|
|
import Table from '@/baseComponents/Table.vue';
|
|
|
import FormSearchGroup from '@/baseComponents/FormSearchGroup.vue';
|
|
import FormSearchGroup from '@/baseComponents/FormSearchGroup.vue';
|
|
|
|
|
|
|
|
import PreviewDialog from '@/baseComponents/PreviewDialog.vue';
|
|
import PreviewDialog from '@/baseComponents/PreviewDialog.vue';
|
|
|
import {tableColumns} from './table'
|
|
import {tableColumns} from './table'
|
|
|
import TabSearch from '@/baseComponents/TabSearch.vue';
|
|
import TabSearch from '@/baseComponents/TabSearch.vue';
|
|
|
|
|
+import CustomerOperationDialog from '@/components/CustomerOperationDialog/index.vue'
|
|
|
|
|
|
|
|
import FollowCard from '@/components/FollowCard.vue';
|
|
import FollowCard from '@/components/FollowCard.vue';
|
|
|
|
|
+import {
|
|
|
|
|
+ getHeaderSearchOptionsApi,
|
|
|
|
|
+ getFollowInfoApi,
|
|
|
|
|
+ getCustomerWinnerApplyListApi,
|
|
|
|
|
+ updateCustomerWinnerAuditOperationStatusApi,
|
|
|
|
|
+ } from '@/api/customerFollowUp';
|
|
|
|
|
+
|
|
|
|
|
+import {
|
|
|
|
|
+ formatTime,
|
|
|
|
|
+ getTodayRange,
|
|
|
|
|
+ getThisWeekRange,
|
|
|
|
|
+ getRecentMonthsRange
|
|
|
|
|
+ } from '@/utils/timeRangeGet'
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 1. 默认列表 表格数据有关内容
|
|
|
|
|
|
|
+ * 1. 头部筛选项有关数据
|
|
|
*/
|
|
*/
|
|
|
-const tableData = ref([
|
|
|
|
|
- {
|
|
|
|
|
- id: 1,
|
|
|
|
|
- customerType: '首单客户',
|
|
|
|
|
- schoolName: '流星花园学校',
|
|
|
|
|
- contactPerson: '张三',
|
|
|
|
|
- jobTitle: '校长',
|
|
|
|
|
- educationStage: '中学',
|
|
|
|
|
- province: '北京市', // 新增列数据
|
|
|
|
|
- region: '西城区', // 新增列数据
|
|
|
|
|
- groupName: '1小组', // 新增列数据
|
|
|
|
|
- followUpUser: '张三',
|
|
|
|
|
- followUpProduct: '大数据精准教学',
|
|
|
|
|
- followUpStatus: '试用测试',
|
|
|
|
|
- followUpContent: '跟进文案跟进文案跟进文案跟进文案跟进文案跟进文案跟进文案跟进文案',
|
|
|
|
|
- followUpTime: '2026-03-11 9:00',
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id: 2,
|
|
|
|
|
- customerType: '首单客户',
|
|
|
|
|
- schoolName: '北京师达',
|
|
|
|
|
- contactPerson: '张三',
|
|
|
|
|
- jobTitle: '校长',
|
|
|
|
|
- educationStage: '中学',
|
|
|
|
|
- province: '北京市',
|
|
|
|
|
- region: '西城区',
|
|
|
|
|
- groupName: '1小组',
|
|
|
|
|
- followUpUser: '张三',
|
|
|
|
|
- followUpProduct: '大数据精准教学',
|
|
|
|
|
- followUpStatus: '试用测试',
|
|
|
|
|
- followUpContent: '跟进文案跟进文案跟进文案跟进文案...',
|
|
|
|
|
- followUpTime: '2026-03-11 9:00',
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id: 3,
|
|
|
|
|
- customerType: '首单客户',
|
|
|
|
|
- schoolName: '北京五十七中学',
|
|
|
|
|
- contactPerson: '张三',
|
|
|
|
|
- jobTitle: '校长',
|
|
|
|
|
- educationStage: '中学',
|
|
|
|
|
- province: '北京市',
|
|
|
|
|
- region: '西城区',
|
|
|
|
|
- groupName: '1小组',
|
|
|
|
|
- followUpUser: '张三',
|
|
|
|
|
- followUpProduct: '大数据精准教学',
|
|
|
|
|
- followUpStatus: '试用测试',
|
|
|
|
|
- followUpContent: '跟进文案跟进文案跟进文案',
|
|
|
|
|
- followUpTime: '2026-03-11 9:00',
|
|
|
|
|
|
|
+const provinceOption = ref([]) //省份配置项
|
|
|
|
|
+const memberOption = ref([]) //人员配置项
|
|
|
|
|
+const GetHeaderSearchOptions = async ()=>{
|
|
|
|
|
+ const res = await getHeaderSearchOptionsApi()
|
|
|
|
|
+ if(res?.code == 200){
|
|
|
|
|
+ const {
|
|
|
|
|
+ auditCount,
|
|
|
|
|
+ productData,stageData,regionData,groupData,memberData,
|
|
|
|
|
+ } = res.data
|
|
|
|
|
+ winnerOrderNum.value = auditCount || 0
|
|
|
|
|
+ const groupOption = groupData?.map(item=>{
|
|
|
|
|
+ return{
|
|
|
|
|
+ label:item.name,
|
|
|
|
|
+ value:item.id
|
|
|
|
|
+ }
|
|
|
|
|
+ }) || []
|
|
|
|
|
+
|
|
|
|
|
+ memberOption.value = memberData?.map(item=>{
|
|
|
|
|
+ return{
|
|
|
|
|
+ label:item.username,
|
|
|
|
|
+ value:item.id,
|
|
|
|
|
+ cityIds:item.cityIds,
|
|
|
|
|
+ groupIds:item.groupIds,
|
|
|
|
|
+ provinceIds:item.provinceIds,
|
|
|
|
|
+ }
|
|
|
|
|
+ }) || []
|
|
|
|
|
+
|
|
|
|
|
+ const productOption = productData?.map(item=>{
|
|
|
|
|
+ return {
|
|
|
|
|
+ label:item.name,
|
|
|
|
|
+ value:item.id,
|
|
|
|
|
+ }
|
|
|
|
|
+ }) || []
|
|
|
|
|
+
|
|
|
|
|
+ provinceOption.value = regionData?.map(item=>{
|
|
|
|
|
+ return{
|
|
|
|
|
+ label:item.name,
|
|
|
|
|
+ value:item.id,
|
|
|
|
|
+ subData:item.subData?.map(subItm=>{
|
|
|
|
|
+ return {
|
|
|
|
|
+ label:subItm.name,
|
|
|
|
|
+ value:subItm.id,
|
|
|
|
|
+ }
|
|
|
|
|
+ }) || [],
|
|
|
|
|
+ }
|
|
|
|
|
+ }) || []
|
|
|
|
|
+
|
|
|
|
|
+ const stageOption = stageData?.map(item=>{
|
|
|
|
|
+ return {
|
|
|
|
|
+ label:item.name,
|
|
|
|
|
+ value:item.id,
|
|
|
|
|
+ }
|
|
|
|
|
+ }) || []
|
|
|
|
|
+
|
|
|
|
|
+ headerSearchList.value = headerSearchList.value.map(item=>{
|
|
|
|
|
+ switch(item.key){
|
|
|
|
|
+ case 'group':
|
|
|
|
|
+ item.options = [
|
|
|
|
|
+ { label: '全部', value: 'all' },
|
|
|
|
|
+ ...groupOption,
|
|
|
|
|
+ ]
|
|
|
|
|
+ break
|
|
|
|
|
+ case 'personnel':{
|
|
|
|
|
+ item.options = [
|
|
|
|
|
+ { label: '全部', value: 'all' },
|
|
|
|
|
+ ...memberOption.value,
|
|
|
|
|
+ ]
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
|
|
+ case 'product':
|
|
|
|
|
+ item.options = [
|
|
|
|
|
+ { label: '全部', value: 'all' },
|
|
|
|
|
+ ...productOption,
|
|
|
|
|
+ ]
|
|
|
|
|
+ break
|
|
|
|
|
+ case 'province':
|
|
|
|
|
+ item.options = [
|
|
|
|
|
+ { label: '全部', value: 'all' },
|
|
|
|
|
+ ...provinceOption.value,
|
|
|
|
|
+ ]
|
|
|
|
|
+ break
|
|
|
|
|
+ case 'region':{
|
|
|
|
|
+ item.options = []
|
|
|
|
|
+ item.hidden = true
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
|
|
+ case 'educationStage':
|
|
|
|
|
+ item.options = [
|
|
|
|
|
+ { label: '全部', value: 'all' },
|
|
|
|
|
+ ...stageOption,
|
|
|
|
|
+ ]
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
|
|
+ item.defaultValue = listSearchParams.value[item.key]
|
|
|
|
|
+ return item
|
|
|
|
|
+ })
|
|
|
}
|
|
}
|
|
|
-]);
|
|
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * 2. 客户跟进列表有关数据 及操作
|
|
|
|
|
+ */
|
|
|
|
|
+const tableData = ref([]);
|
|
|
const currentPage = ref(1)
|
|
const currentPage = ref(1)
|
|
|
const pageSize = ref(20)
|
|
const pageSize = ref(20)
|
|
|
const totalNum = ref(0)
|
|
const totalNum = ref(0)
|
|
|
|
|
+// 获取客户跟进列表
|
|
|
|
|
+const GetFollowInfo = async ()=>{
|
|
|
|
|
+ let timeRange = {
|
|
|
|
|
+ startTime: '',
|
|
|
|
|
+ endTime: '',
|
|
|
|
|
+ }
|
|
|
|
|
+ switch(listSearchParams.value.time){
|
|
|
|
|
+ case 'all':
|
|
|
|
|
+ timeRange = {
|
|
|
|
|
+ startTime: '',
|
|
|
|
|
+ endTime: '',
|
|
|
|
|
+ }
|
|
|
|
|
+ break
|
|
|
|
|
+ case 'today':
|
|
|
|
|
+ timeRange = getTodayRange()
|
|
|
|
|
+ break
|
|
|
|
|
+ case 'thisWeek':
|
|
|
|
|
+ timeRange = getThisWeekRange()
|
|
|
|
|
+ break
|
|
|
|
|
+ case 'last1Month':
|
|
|
|
|
+ timeRange = getRecentMonthsRange(1)
|
|
|
|
|
+ break
|
|
|
|
|
+ case 'last3Month':
|
|
|
|
|
+ timeRange = getRecentMonthsRange(3)
|
|
|
|
|
+ break
|
|
|
|
|
+ case 'halfYear':
|
|
|
|
|
+ timeRange = getRecentMonthsRange(6)
|
|
|
|
|
+ break
|
|
|
|
|
+ case 'custom':
|
|
|
|
|
+ timeRange = {
|
|
|
|
|
+ startTime:formatTime(listSearchParams.value.startAndEndTime?.[0]),
|
|
|
|
|
+ endTime: formatTime(listSearchParams.value.startAndEndTime?.[1]),
|
|
|
|
|
+ }
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
|
|
+ listSearchParams.value.time
|
|
|
|
|
+ let params = {
|
|
|
|
|
+ startDatetime: timeRange.startTime,
|
|
|
|
|
+ endDatetime: timeRange.endTime,
|
|
|
|
|
+ // typeId: '',
|
|
|
|
|
+ stageId: listSearchParams.value.educationStage == 'all' ? '' : listSearchParams.value.educationStage,
|
|
|
|
|
+ provinceId: listSearchParams.value.province == 'all' ? '' : listSearchParams.value.province,
|
|
|
|
|
+ cityId: listSearchParams.value.region == 'all' ? '' : listSearchParams.value.region,
|
|
|
|
|
+ groupId: listSearchParams.value.group == 'all' ? '' : listSearchParams.value.group,
|
|
|
|
|
+ userId: listSearchParams.value.personnel == 'all' ? '' : listSearchParams.value.personnel,
|
|
|
|
|
+ productId: listSearchParams.value.product == 'all' ? '' : listSearchParams.value.product,
|
|
|
|
|
+ queryStr: listSearchParams.value.queryStr || '',
|
|
|
|
|
+ pageNum: currentPage.value,
|
|
|
|
|
+ pageSize: pageSize.value
|
|
|
|
|
+ }
|
|
|
|
|
+ const res = await getFollowInfoApi(params)
|
|
|
|
|
+ if(res?.code == 200){
|
|
|
|
|
+ totalNum.value = res.data.total
|
|
|
|
|
+ tableData.value = res.data.records || []
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// 表格分页变更触发的操作
|
|
|
|
|
+const HandlePaginationChange = async (params)=>{
|
|
|
|
|
+ const {type,val} = params
|
|
|
|
|
+ if(type == 'currentPage'){
|
|
|
|
|
+ currentPage.value = val
|
|
|
|
|
+ }else if(type == 'pageSize'){
|
|
|
|
|
+ pageSize.value = val
|
|
|
|
|
+ }
|
|
|
|
|
+ await GetFollowInfo()
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 2.默认列表 筛选项有关数据
|
|
|
|
|
|
|
+ * 3.默认列表 筛选项有关数据 及操作
|
|
|
*/
|
|
*/
|
|
|
-const listSearchParams = ref({})
|
|
|
|
|
-const HandleBlockSearchChange = (params,key)=>{
|
|
|
|
|
|
|
+const listSearchParams = ref({
|
|
|
|
|
+ time:'all',
|
|
|
|
|
+ group:'all',
|
|
|
|
|
+ personnel:'all',
|
|
|
|
|
+ product:'all',
|
|
|
|
|
+ province:'all',
|
|
|
|
|
+ region:'all',
|
|
|
|
|
+ educationStage:'all',
|
|
|
|
|
+ type:'all',
|
|
|
|
|
+ queryStr:'',
|
|
|
|
|
+ startAndEndTime:[]
|
|
|
|
|
+})
|
|
|
|
|
+// 筛选项变更触发的操作
|
|
|
|
|
+const HandleBlockSearchChange = async (params,key)=>{
|
|
|
listSearchParams.value = {
|
|
listSearchParams.value = {
|
|
|
...listSearchParams.value,
|
|
...listSearchParams.value,
|
|
|
...params
|
|
...params
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
-const HandleBlurSearchChange = (params,key)=>{
|
|
|
|
|
- // console.log('blurl--',params)
|
|
|
|
|
- listSearchParams.value = {
|
|
|
|
|
- ...listSearchParams.value,
|
|
|
|
|
- ...params
|
|
|
|
|
|
|
+ switch(key){
|
|
|
|
|
+ case 'group':
|
|
|
|
|
+ case 'province':
|
|
|
|
|
+ case 'region':
|
|
|
|
|
+ listSearchParams.value.personnel = 'all'
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
|
|
+ headerSearchList.value = headerSearchList.value.map(item=>{
|
|
|
|
|
+ switch(item.key){
|
|
|
|
|
+ case 'personnel':{
|
|
|
|
|
+ let finalOption = memberOption.value.filter(item=>{
|
|
|
|
|
+ return (listSearchParams.value.group == 'all' ? true : item.groupIds.includes(listSearchParams.value.group))
|
|
|
|
|
+ && (listSearchParams.value.province == 'all' ? true : item.provinceIds.includes(listSearchParams.value.province))
|
|
|
|
|
+ && (listSearchParams.value.region == 'all' ? true : item.cityIds.includes(listSearchParams.value.region))
|
|
|
|
|
+ }) || []
|
|
|
|
|
+ item.options = [
|
|
|
|
|
+ { label: '全部', value: 'all' },
|
|
|
|
|
+ ...finalOption,
|
|
|
|
|
+ ]
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
|
|
+ case 'region':{
|
|
|
|
|
+ let regionOption = provinceOption.value.find(item=>{
|
|
|
|
|
+ return item.value == listSearchParams.value.province
|
|
|
|
|
+ })?.subData || []
|
|
|
|
|
+ item.options = [
|
|
|
|
|
+ { label: '全部', value: 'all' },
|
|
|
|
|
+ ...regionOption,
|
|
|
|
|
+ ]
|
|
|
|
|
+ item.hidden = listSearchParams.value.province == 'all'
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+ item.defaultValue = listSearchParams.value[item.key]
|
|
|
|
|
+ return item
|
|
|
|
|
+ })
|
|
|
|
|
+ await GetFollowInfo()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/**
|
|
|
|
|
- * 3. 赢单申请有关数据
|
|
|
|
|
- */
|
|
|
|
|
-const winnerOrderNum = ref(5)
|
|
|
|
|
|
|
+/** 4. 获取操作记录列表*/
|
|
|
|
|
+// 操作日志弹窗数据 及相关操作
|
|
|
|
|
+const operationLogDialogVisible = ref(false)
|
|
|
|
|
+// 打开操作日志弹窗
|
|
|
|
|
+const OpenOperationLogDialog = async ()=>{
|
|
|
|
|
+ operationLogDialogVisible.value = true
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/** 5.赢单申请有关数据 */
|
|
|
|
|
+const winnerOrderNum = ref(0) //赢单申请总数
|
|
|
// 审核弹窗数据
|
|
// 审核弹窗数据
|
|
|
const auditDialogVisible = ref(false)
|
|
const auditDialogVisible = ref(false)
|
|
|
const defaultAuditStatus = ref(0)
|
|
const defaultAuditStatus = ref(0)
|
|
|
|
|
+const OpenAuditDialog = async ()=>{
|
|
|
|
|
+ auditDialogVisible.value = true
|
|
|
|
|
+ await GetWinnerApplyList()
|
|
|
|
|
+}
|
|
|
|
|
+const CloseAuditDialog = ()=>{
|
|
|
|
|
+ auditDialogVisible.value = false
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
|
|
+//审核弹窗tab切换数据 及操作
|
|
|
const waitAuditNum = ref(0)
|
|
const waitAuditNum = ref(0)
|
|
|
const auditPassNum = ref(0)
|
|
const auditPassNum = ref(0)
|
|
|
const auditRejectNum = ref(0)
|
|
const auditRejectNum = ref(0)
|
|
@@ -263,171 +405,54 @@ const tabList = computed(()=>[
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
])
|
|
])
|
|
|
-const auditList = ref([
|
|
|
|
|
- {
|
|
|
|
|
- id:'1',
|
|
|
|
|
- followUpTime: '26-02-19 19:00',
|
|
|
|
|
- schoolName: '北京师达学校',
|
|
|
|
|
- followUpProduct: '大数据精准教学',
|
|
|
|
|
- followUpStatus: '赢单',
|
|
|
|
|
- followUpUser: '张三',
|
|
|
|
|
- contactPerson: '严谨',
|
|
|
|
|
- jobTitle: '校长',
|
|
|
|
|
- followUpContent: '跟进文案跟进文案跟进文案跟进文案跟进文案北京市东城区葱店西街56号跟进文案跟进文案跟进文案跟进文案跟进文'
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id:'2',
|
|
|
|
|
- followUpTime: '26-02-19 19:00',
|
|
|
|
|
- schoolName: '北京师达学校',
|
|
|
|
|
- followUpProduct: '大数据精准教学',
|
|
|
|
|
- followUpStatus: '赢单',
|
|
|
|
|
- followUpUser: '张三',
|
|
|
|
|
- contactPerson: '严谨',
|
|
|
|
|
- jobTitle: '校长',
|
|
|
|
|
- followUpContent: '跟进文案跟进文案跟进文案跟进文案跟进文案北京市东城区葱店西街56号跟进文案跟进文案跟进文案跟进文案跟进文案北京\n文案跟进文案跟进文案北京市东城区葱店西街56号跟进文案跟进文案跟进文案跟进文案跟进文案北京市东城区葱店西街56号'
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id:'3',
|
|
|
|
|
- followUpTime: '26-02-19 19:00',
|
|
|
|
|
- schoolName: '北京师达学校',
|
|
|
|
|
- followUpProduct: '大数据精准教学',
|
|
|
|
|
- followUpStatus: '赢单',
|
|
|
|
|
- followUpUser: '张三',
|
|
|
|
|
- contactPerson: '严谨',
|
|
|
|
|
- jobTitle: '校长',
|
|
|
|
|
- followUpContent: '跟进文案跟进文案跟进文案跟进文案跟进文案北京市东城区葱店西街56号跟进文案跟进文案跟进文案跟进文案跟进文案北京\n文案跟进文案跟进文案北京市东城区葱店西街56号跟进文案跟进文案跟进文案跟进文案跟进文案北京市东城区葱店西街56号'
|
|
|
|
|
- }
|
|
|
|
|
-])
|
|
|
|
|
-
|
|
|
|
|
-const finalAuditRenderData = computed(()=>{
|
|
|
|
|
- return auditList.value.map(item=>{
|
|
|
|
|
- return {
|
|
|
|
|
- headerTitleList:[
|
|
|
|
|
- item.followUpTime,
|
|
|
|
|
- item.schoolName,
|
|
|
|
|
- item.followUpProduct
|
|
|
|
|
- ],
|
|
|
|
|
- headerTags:[
|
|
|
|
|
- item.followUpStatus,
|
|
|
|
|
- ],
|
|
|
|
|
- middleDesc:[
|
|
|
|
|
- `跟进人:${item.followUpUser}`,
|
|
|
|
|
- `联系人:${item.contactPerson}`,
|
|
|
|
|
- `职务:${item.jobTitle}`
|
|
|
|
|
- ],
|
|
|
|
|
- bottomDesc:`跟进内容:${item.followUpContent}`
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
-})
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-const OpenAuditDialog = ()=>{
|
|
|
|
|
- auditDialogVisible.value = true
|
|
|
|
|
-}
|
|
|
|
|
-const CloseAuditDialog = ()=>{
|
|
|
|
|
- auditDialogVisible.value = false
|
|
|
|
|
|
|
+const auditList = ref([]) //赢单审核列表
|
|
|
|
|
+const HandleTabChange = async (val)=>{
|
|
|
|
|
+ defaultAuditStatus.value = val
|
|
|
|
|
+ await GetWinnerApplyList()
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-/**
|
|
|
|
|
- * 4. 操作日志有关数据
|
|
|
|
|
- */
|
|
|
|
|
-const operationLogList = ref([
|
|
|
|
|
- {
|
|
|
|
|
- id:1,
|
|
|
|
|
- operationTime: '26-02-19 19:00',
|
|
|
|
|
- operatorName: '张安顺',
|
|
|
|
|
- schoolName: '北京师达学校',
|
|
|
|
|
- operationType: '编辑学校信息',
|
|
|
|
|
- operationContent: '学校名称【北京109中学】学段【初中】调整为学校名称【北京一零九中学】学段【九年一贯】。'
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id:2,
|
|
|
|
|
- operationTime: '26-02-19 19:00',
|
|
|
|
|
- operatorName: '张安顺',
|
|
|
|
|
- schoolName: '北京师达学校',
|
|
|
|
|
- operationType: '删除联系人',
|
|
|
|
|
- operationContent: '删除 姓名【张三】职务【校长】手机电话【17820681226】办公电话【17820681226】备注【文案文案】。'
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id:3,
|
|
|
|
|
- operationTime: '26-02-19 19:00',
|
|
|
|
|
- operatorName: '张安顺',
|
|
|
|
|
- schoolName: '北京师达学校',
|
|
|
|
|
- operationType: '新增联系人',
|
|
|
|
|
- operationContent: '新增 姓名【张三】职务【校长】手机电话【17820681226】办公电话【17820681226】备注【文案文案】。'
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id:4,
|
|
|
|
|
- operationTime: '26-02-19 19:00',
|
|
|
|
|
- operatorName: '张安顺',
|
|
|
|
|
- schoolName: '北京师达学校',
|
|
|
|
|
- operationType: '编辑联系人',
|
|
|
|
|
- operationContent: '联系人姓名【张三】职务【校长】手机电话【17820681226】备注【文案文案】调整为 联系人姓名【李四】职务【校长】手机电话【17820681226】备注【文案文案】。'
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- id:5,
|
|
|
|
|
- operationTime: '26-02-19 19:00',
|
|
|
|
|
- operatorName: '张安顺',
|
|
|
|
|
- schoolName: '北京师达学校',
|
|
|
|
|
- operationType: '转至公海',
|
|
|
|
|
- operationContent: '将客户转至公海。'
|
|
|
|
|
- }
|
|
|
|
|
-]);
|
|
|
|
|
-
|
|
|
|
|
-const finalOperationLogRenderData = computed(()=>{
|
|
|
|
|
- return operationLogList.value.map(item=>{
|
|
|
|
|
- return {
|
|
|
|
|
- headerTitleList:[
|
|
|
|
|
- item.operationTime,
|
|
|
|
|
- item.operatorName,
|
|
|
|
|
- item.schoolName,
|
|
|
|
|
- item.operationType
|
|
|
|
|
- ],
|
|
|
|
|
- headerTags:[],
|
|
|
|
|
- middleDesc:[],
|
|
|
|
|
- bottomDesc:`操作内容:${item.operationContent}`
|
|
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
-})
|
|
|
|
|
-
|
|
|
|
|
-//操作日志搜索项 及操作
|
|
|
|
|
-const logSearchParams = ref({})
|
|
|
|
|
-const HandleLogBlockSearchChange = (params,key)=>{
|
|
|
|
|
- logSearchParams.value = {
|
|
|
|
|
- ...logSearchParams.value,
|
|
|
|
|
- ...params
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-const HandleLogBlurSearchChange = (params,key)=>{
|
|
|
|
|
- listSearchParams.value = {
|
|
|
|
|
- ...listSearchParams.value,
|
|
|
|
|
- ...params
|
|
|
|
|
|
|
+// 获取赢单审核列表数据
|
|
|
|
|
+const GetWinnerApplyList = async ()=>{
|
|
|
|
|
+ let res = await getCustomerWinnerApplyListApi(defaultAuditStatus.value)
|
|
|
|
|
+ if(res?.code == 200){
|
|
|
|
|
+ const {audit0,audit1,audit2,auditData} = res?.data|| {}
|
|
|
|
|
+ waitAuditNum.value = audit0 || 0
|
|
|
|
|
+ auditPassNum.value = audit1 || 0
|
|
|
|
|
+ auditRejectNum.value = audit2 || 0
|
|
|
|
|
+ auditList.value = auditData?.map(item=>{
|
|
|
|
|
+ return {
|
|
|
|
|
+ headerTitleList:[
|
|
|
|
|
+ item.claimDatetime,
|
|
|
|
|
+ item.customerName,
|
|
|
|
|
+ item.productName
|
|
|
|
|
+ ],
|
|
|
|
|
+ headerTags:[
|
|
|
|
|
+ item.followName,
|
|
|
|
|
+ ],
|
|
|
|
|
+ middleDesc:[
|
|
|
|
|
+ `跟进人:${item.claimUserName}`,
|
|
|
|
|
+ `联系人:${item.customerPersonName}`,
|
|
|
|
|
+ `职务:${item.positionName}`
|
|
|
|
|
+ ],
|
|
|
|
|
+ bottomDesc:`跟进内容:${item.followContent}`,
|
|
|
|
|
+ ...item,
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// 操作日志弹窗数据 及相关操作
|
|
|
|
|
-const operationLogDialogVisible = ref(false)
|
|
|
|
|
-const OpenOperationLogDialog = ()=>{
|
|
|
|
|
- operationLogDialogVisible.value = true
|
|
|
|
|
}
|
|
}
|
|
|
-const CloseOperationLogDialog = ()=>{
|
|
|
|
|
- operationLogDialogVisible.value = false
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-// 日志分页有关数据 及操作
|
|
|
|
|
-const logCurrentPage = ref(1)
|
|
|
|
|
-const logPageSize = ref(20)
|
|
|
|
|
-const logTotalNum = ref(0)
|
|
|
|
|
-const HandleLogPaginaionChange = (params)=>{
|
|
|
|
|
- const {type,val} = params
|
|
|
|
|
- if(type == 'currentPage'){
|
|
|
|
|
- // 处理页面跳转
|
|
|
|
|
|
|
|
|
|
- }else if(type == 'pageSize'){
|
|
|
|
|
- // 处理页容量
|
|
|
|
|
|
|
+// 驳回/通过 赢单
|
|
|
|
|
+const HandleAuditOperation = async (row:any,auditStatus:any)=>{
|
|
|
|
|
+ let res = await updateCustomerWinnerAuditOperationStatusApi(row.id,auditStatus)
|
|
|
|
|
+ if(res?.code == 200){
|
|
|
|
|
+ ElMessage.success('操作成功')
|
|
|
|
|
+ await GetWinnerApplyList()
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+onMounted( async ()=>{
|
|
|
|
|
+ await GetHeaderSearchOptions()
|
|
|
|
|
+ await GetFollowInfo()
|
|
|
|
|
+})
|
|
|
|
|
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|