yudao-ui-admin-vue3/src/views/crm/customer/dep/tables/seven.vue

492 lines
17 KiB
Vue

<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="负责部门" prop="depId">
<el-select
v-model="queryParams.depId"
placeholder="请选择"
filterable
class="!w-120px"
>
<el-option
v-for="option in depList"
:key="option.id"
:value="option.id"
:label="option.name"
/>
</el-select>
</el-form-item>
<el-form-item label="客户经理" prop="userId">
<el-select
v-model="queryParams.userId"
placeholder="请选择"
clearable
filterable
class="!w-120px"
>
<el-option
v-for="option in userList"
:key="option.id"
:value="option.id"
:label="option.nickname"
/>
</el-select>
</el-form-item>
<el-form-item label="客户姓名" prop="customerName" >
<el-input
v-model="queryParams.customerName"
placeholder="请输入客户姓名"
clearable
class="!w-120px "
/>
</el-form-item>
<el-form-item label="手机号码" prop="mobile">
<el-input
v-model="queryParams.mobile"
placeholder="请输入手机号码"
clearable
class="!w-120px"
/>
</el-form-item>
<el-form-item label="客户类型" prop="customerTypeId">
<el-cascader
v-model="queryParams.customerTypeId"
:show-all-levels="false"
:options="customerTypeOptions"
:props="cascaderProps"
clearable
class="!w-120px"
/>
</el-form-item>
<el-form-item label="重要程度" prop="importLevelId">
<el-select
v-model="queryParams.importLevelId"
placeholder="请选择"
clearable
class="!w-120px margin-left:15px"
>
<el-option
v-for="iml in importLevelList"
:key="iml.id"
:value="iml.id"
:label="iml.name"
/>
</el-select>
</el-form-item>
<el-form-item label="跟进状态" prop="followStatusId">
<el-select
v-model="queryParams.followStatusId"
placeholder="请选择"
clearable
class="!w-120px "
>
<el-option
v-for="option in followStatusList"
:key="option.id"
:value="option.id"
:label="option.name"
/>
</el-select>
</el-form-item>
<el-form-item label="是否有车" prop="haveCar">
<el-select v-model="queryParams.haveCar" placeholder="请选择" clearable class="!w-120px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_HAVE_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="是否有房" prop="haveHouse">
<el-select v-model="queryParams.haveHouse" placeholder="请选择" clearable class="!w-120px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_HAVE_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="公积金" prop="haveProvidentFund">
<el-select v-model="queryParams.haveProvidentFund" placeholder="请选择" clearable class="!w-120px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_HAVE_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="社保" prop="haveSocialSecurity">
<el-select v-model="queryParams.haveSocialSecurity" placeholder="请选择" clearable class="!w-120px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_HAVE_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="保单" prop="haveGuaranteeSlip">
<el-select v-model="queryParams.haveGuaranteeSlip" placeholder="请选择" clearable class="!w-120px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_HAVE_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="来源标签" prop="customerSourceId">
<el-cascader
v-model="queryParams.customerSourceId"
:show-all-levels="false"
:options="customerSourceOptions"
:props="cascaderProps"
clearable
class="!w-120px"
/>
</el-form-item>
<el-form-item label="重点客户" prop="isImport">
<el-select v-model="queryParams.isImport" placeholder="请选择" clearable class="!w-120px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_IMPORT_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="是否跟进" prop="isFollow">
<el-select v-model="queryParams.isFollow" placeholder="请选择" clearable class="!w-120px">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_FOLLOW_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="最后跟进" prop="lastFollowTime">
<el-date-picker
v-model="queryParams.lastFollowTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openAllocateForm"
>
<Icon icon="ep:plus" class="mr-5px" /> 分配
</el-button>
<el-button
type="warning"
plain
@click="openTransferForm"
>
<Icon icon="ep:share" class="mr-5px" /> 转公海
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="30" />
<el-table-column label="序号" align="center" width="60" type="index" fixed/>
<el-table-column label="客户姓名" align="center" prop="customerName" width="100px" fixed/>
<el-table-column label="手机号码" align="center" prop="mobile" width="140px" fixed/>
<el-table-column label="跟进状态" align="center" prop="followStatusId" >
<template #default="scope">
<div>
{{ followStatusList.find((cs) => cs.id === scope.row.followStatusId)?.name||"未标记" }}
</div>
</template>
</el-table-column >
<el-table-column label="重要程度" align="center" prop="importLevelId" >
<template #default="scope">
<div>
{{ importLevelList.find((cs) => cs.id === scope.row.importLevelId)?.name||"未标记" }}
</div>
</template>
</el-table-column >
<el-table-column label="重点客户" align="center" prop="isImport" width="80px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_IMPORT_STATUS" :value="scope.row.isImport" />
</template>
</el-table-column >
<el-table-column label="是否跟进" align="center" prop="isFollow" width="80px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_FOLLOW_STATUS" :value="scope.row.isFollow" />
</template>
</el-table-column >
<el-table-column label="客户经理" align="center" prop="userId" >
<template #default="scope">
<div>
{{ userList.find((cs) => cs.id === scope.row.userId)?.nickname||"未分配" }}
</div>
</template>
</el-table-column >
<el-table-column label="最后跟进时间" align="center" prop="lastFollowTime" :formatter="dateFormatter" width="180px" />
<el-table-column label="最后跟进内容" align="center" prop="lastFollowContent" width="180px"/>
<el-table-column label="客户类型" align="center" prop="customerTypeId" >
<template #default="scope">
<div>
{{ (customerTypeList.find((cs: any) => cs.id === scope.row.customerTypeId) as any)?.name||"未标记" }}
</div>
</template>
</el-table-column >
<el-table-column label="是否有车" align="center" prop="haveCar" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_HAVE_STATUS" :value="scope.row.haveCar" />
</template>
</el-table-column >
<el-table-column label="是否有房" align="center" prop="haveHouse" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_HAVE_STATUS" :value="scope.row.haveHouse" />
</template>
</el-table-column >
<el-table-column label="公积金" align="center" prop="haveProvidentFund" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_HAVE_STATUS" :value="scope.row.haveProvidentFund" />
</template>
</el-table-column >
<el-table-column label="社保" align="center" prop="haveSocialSecurity" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_HAVE_STATUS" :value="scope.row.haveSocialSecurity" />
</template>
</el-table-column >
<el-table-column label="保单" align="center" prop="haveGuaranteeSlip" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.COMMON_HAVE_STATUS" :value="scope.row.haveGuaranteeSlip" />
</template>
</el-table-column >
<el-table-column label="来源标签" align="center" prop="customerSourceId" >
<template #default="scope">
<div >
{{ (customerSourceList.find((cs: any) => cs.id === scope.row.customerSourceId) as any)?.name||"无" }}
</div>
</template>
</el-table-column >
<el-table-column label="分配时间" align="center" prop="latestAllocateTime" :formatter="dateFormatter" width="180px" />
<el-table-column label="客户资料" align="center" prop="remark" min-width="400px" />
<el-table-column label="操作" align="center" width="120px" fixed="right">
<template #default="scope">
<el-button
link
type="primary"
@click="openInforForm( scope.row.id)"
>
跟进
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 客户详情抽屉 -->
<el-drawer v-model="drawerVisible" size="80%" :destroy-on-close="true" :with-header="false" :show-close="true">
<CustomerDetail :customer-id="customerId" />
</el-drawer>
<!-- 分配弹窗 -->
<AllocateForm ref="formRef" @success="getList" />
<!-- 转公海弹窗 -->
<TransferForm ref="transferFormRef" @success="getList" />
</template>
<script setup lang="ts">
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import { buildTree } from '@/utils/tree'
import { CustomerInforApi, CustomerInforVO } from '@/api/crm/customer/customer'
import CustomerDetail from '@/views/crm/components/Customer/Detail.vue'
import TransferForm from '@/views/crm/components/Transfer/TransferForm.vue'
import AllocateForm from '@/views/crm/components/Allocate/AllocateForm.vue'
import { useCrmStore } from '@/store/modules/crm'
import { storeToRefs } from 'pinia'
import dayjs from 'dayjs'
/** 客户信息 列表 */
defineOptions({ name: 'DepSevenCustomer' })
const emit = defineEmits(['update-count'])
const message = useMessage() // 消息弹窗
const { t } = useI18n() // 国际化
const loading = ref(false) // 列表的加载中状态
const list = ref<CustomerInforVO[]>([]) // 列表的数据
const total = ref(0) // 列表的总页数
const crmStore = useCrmStore()
const { importLevelList, channelList, followStatusList, customerSourceList, customerTypeList, userList, depList } = storeToRefs(crmStore)
let customerSourceOptions = ref<any>()
let customerTypeOptions = ref<any>()
const queryFormRef = ref() // 搜索的表单
const multipleSelection = ref<CustomerInforVO[]>([])
const formRef = ref() // 分配表单的 Ref
const transferFormRef = ref() // 转公海表单的 Ref
const drawerVisible = ref(false) // 抽屉是否显示
const customerId = ref<number>() // 当前查看的客户ID
const cascaderProps = {
emitPath: false
}
// 设置最近7天的时间范围
const sevenDaysAgo = dayjs().subtract(7, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
const today = dayjs().endOf('day').format('YYYY-MM-DD HH:mm:ss')
const queryParams = reactive({
pageNo: 1,
pageSize: 15,
customerName: undefined,
channelId: undefined,
mobile: undefined,
haveCar: undefined,
haveHouse: undefined,
haveProvidentFund: undefined,
haveSocialSecurity: undefined,
haveGuaranteeSlip: undefined,
customerSourceId: undefined,
customerTypeId: undefined,
importLevelId: undefined,
followStatusId: undefined,
userId: undefined,
depId: depList.value[0]?.id,
lastFollowTime: [],
lastFollowContent: undefined,
createTime: [],
isImport: undefined,
isFollow: undefined,
latestAllocateTime: [sevenDaysAgo, today]// 默认查询最近7天
})
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await CustomerInforApi.getDepCustomerPage(queryParams)
list.value = data.list
total.value = data.total
// 发送总数更新事件
emit('update-count', data.total)
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
// 保持部门ID和7天时间范围不变
if (depList.value.length > 0) {
queryParams.depId = depList.value[0].id
}
queryParams.createTime = [sevenDaysAgo, today]
handleQuery()
}
/** 打开跟进抽屉 */
const openInforForm = (id?: number) => {
customerId.value = id
drawerVisible.value = true
}
/** 打开分配弹窗 */
const openAllocateForm = () => {
if (multipleSelection.value.length === 0) {
message.error('请选择要分配的客户')
return
}
const customerIds = multipleSelection.value.map(item => item.id)
formRef.value.open(customerIds, queryParams.depId)
}
/** 打开转公海弹窗 */
const openTransferForm = () => {
if (multipleSelection.value.length === 0) {
message.error('请选择要转移的客户')
return
}
const customerIds = multipleSelection.value.map(item => item.id)
transferFormRef.value.open(customerIds, 1)
}
const handleSelectionChange = (val: CustomerInforVO[]) => {
multipleSelection.value = val
}
/** 初始化 **/
onMounted(async () => {
// 加载数据
await Promise.all([
crmStore.getImportLevelList(),
crmStore.getChannelList(),
crmStore.getFollowStatusList(),
crmStore.getCustomerSourceList(),
crmStore.getCustomerTypeList(),
crmStore.getUserList(),
crmStore.getDepListByCurUser()
])
// 构建树形结构
customerSourceOptions.value = buildTree(customerSourceList.value)
customerTypeOptions.value = buildTree(customerTypeList.value)
// 设置默认部门
if (depList.value.length > 0) {
queryParams.depId = depList.value[0].id
} else {
message.error('无部门管理权限')
return
}
// 初始化查询,会触发数据总数回写
await getList()
})
</script>