You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
270 lines
8.1 KiB
270 lines
8.1 KiB
<template> |
|
|
|
|
|
|
|
<ContentWrap> |
|
<!-- 搜索工作栏 --> |
|
<el-form |
|
class="-mb-15px" |
|
:model="queryParams" |
|
ref="queryFormRef" |
|
:inline="true" |
|
label-width="68px" |
|
> |
|
<el-form-item label="线索名称" prop="name"> |
|
<el-input |
|
v-model="queryParams.name" |
|
placeholder="请输入线索名称" |
|
clearable |
|
@keyup.enter="handleQuery" |
|
class="!w-240px" |
|
/> |
|
</el-form-item> |
|
<el-form-item label="转化状态" prop="transformStatus"> |
|
<el-select v-model="queryParams.transformStatus" class="!w-240px"> |
|
<el-option :value="false" label="未转化" /> |
|
<el-option :value="true" label="已转化" /> |
|
</el-select> |
|
</el-form-item> |
|
<el-form-item label="手机号" prop="mobile"> |
|
<el-input |
|
v-model="queryParams.mobile" |
|
placeholder="请输入手机号" |
|
clearable |
|
@keyup.enter="handleQuery" |
|
class="!w-240px" |
|
/> |
|
</el-form-item> |
|
<el-form-item label="电话" prop="telephone"> |
|
<el-input |
|
v-model="queryParams.telephone" |
|
placeholder="请输入电话" |
|
clearable |
|
@keyup.enter="handleQuery" |
|
class="!w-240px" |
|
/> |
|
</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" @click="openForm('create')" v-hasPermi="['crm:clue:create']"> |
|
<Icon icon="ep:plus" class="mr-5px" /> 新增 |
|
</el-button> |
|
<el-button |
|
type="success" |
|
plain |
|
@click="handleExport" |
|
:loading="exportLoading" |
|
v-hasPermi="['crm:clue:export']" |
|
> |
|
<Icon icon="ep:download" class="mr-5px" /> 导出 |
|
</el-button> |
|
</el-form-item> |
|
</el-form> |
|
</ContentWrap> |
|
|
|
<!-- 列表 --> |
|
<ContentWrap> |
|
<el-tabs v-model="activeName" @tab-click="handleTabClick"> |
|
<el-tab-pane label="我负责的" name="1" /> |
|
<el-tab-pane label="我参与的" name="2" /> |
|
<el-tab-pane label="下属负责的" name="3" /> |
|
</el-tabs> |
|
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true"> |
|
<el-table-column label="线索名称" align="center" prop="name" fixed="left" width="160"> |
|
<template #default="scope"> |
|
<el-link :underline="false" type="primary" @click="openDetail(scope.row.id)"> |
|
{{ scope.row.name }} |
|
</el-link> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="线索来源" align="center" prop="source" width="100"> |
|
<template #default="scope"> |
|
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_SOURCE" :value="scope.row.source" /> |
|
</template> |
|
</el-table-column> |
|
<el-table-column label="手机" align="center" prop="mobile" width="120" /> |
|
<el-table-column label="电话" align="center" prop="telephone" width="130" /> |
|
<el-table-column label="邮箱" align="center" prop="email" width="180" /> |
|
<el-table-column label="地址" align="center" prop="detailAddress" width="180" /> |
|
<el-table-column align="center" label="客户行业" prop="industryId" width="100"> |
|
<template #default="scope"> |
|
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_INDUSTRY" :value="scope.row.industryId" /> |
|
</template> |
|
</el-table-column> |
|
<el-table-column align="center" label="客户级别" prop="level" width="135"> |
|
<template #default="scope"> |
|
<dict-tag :type="DICT_TYPE.CRM_CUSTOMER_LEVEL" :value="scope.row.level" /> |
|
</template> |
|
</el-table-column> |
|
<el-table-column |
|
:formatter="dateFormatter" |
|
align="center" |
|
label="下次联系时间" |
|
prop="contactNextTime" |
|
width="180px" |
|
/> |
|
<el-table-column align="center" label="备注" prop="remark" width="200" /> |
|
<el-table-column |
|
label="最后跟进时间" |
|
align="center" |
|
prop="contactLastTime" |
|
:formatter="dateFormatter" |
|
width="180px" |
|
/> |
|
<el-table-column align="center" label="最后跟进记录" prop="contactLastContent" width="200" /> |
|
<el-table-column align="center" label="负责人" prop="ownerUserName" width="100px" /> |
|
<el-table-column align="center" label="所属部门" prop="ownerUserDeptName" width="100" /> |
|
<el-table-column |
|
label="更新时间" |
|
align="center" |
|
prop="updateTime" |
|
:formatter="dateFormatter" |
|
width="180px" |
|
/> |
|
<el-table-column |
|
label="创建时间" |
|
align="center" |
|
prop="createTime" |
|
:formatter="dateFormatter" |
|
width="180px" |
|
/> |
|
<el-table-column align="center" label="创建人" prop="creatorName" width="100px" /> |
|
<el-table-column label="操作" align="center" min-width="110" fixed="right"> |
|
<template #default="scope"> |
|
<el-button |
|
link |
|
type="primary" |
|
@click="openForm('update', scope.row.id)" |
|
v-hasPermi="['crm:clue:update']" |
|
> |
|
编辑 |
|
</el-button> |
|
<el-button |
|
link |
|
type="danger" |
|
@click="handleDelete(scope.row.id)" |
|
v-hasPermi="['crm:clue:delete']" |
|
> |
|
删除 |
|
</el-button> |
|
</template> |
|
</el-table-column> |
|
</el-table> |
|
<!-- 分页 --> |
|
<Pagination |
|
:total="total" |
|
v-model:page="queryParams.pageNo" |
|
v-model:limit="queryParams.pageSize" |
|
@pagination="getList" |
|
/> |
|
</ContentWrap> |
|
|
|
<!-- 表单弹窗:添加/修改 --> |
|
<ClueForm ref="formRef" @success="getList" /> |
|
</template> |
|
|
|
<script setup lang="ts"> |
|
import { DICT_TYPE } from '@/utils/dict' |
|
import { dateFormatter } from '@/utils/formatTime' |
|
import download from '@/utils/download' |
|
import * as ClueApi from '@/api/crm/clue' |
|
import ClueForm from './ClueForm.vue' |
|
import { TabsPaneContext } from 'element-plus' |
|
|
|
defineOptions({ name: 'CrmClue' }) |
|
|
|
const message = useMessage() // 消息弹窗 |
|
const { t } = useI18n() // 国际化 |
|
|
|
const loading = ref(true) // 列表的加载中 |
|
const total = ref(0) // 列表的总页数 |
|
const list = ref([]) // 列表的数据 |
|
const queryParams = reactive({ |
|
pageNo: 1, |
|
pageSize: 10, |
|
sceneType: '1', // 默认和 activeName 相等 |
|
name: null, |
|
telephone: null, |
|
mobile: null, |
|
transformStatus: false |
|
}) |
|
const queryFormRef = ref() // 搜索的表单 |
|
const exportLoading = ref(false) // 导出的加载中 |
|
const activeName = ref('1') // 列表 tab |
|
|
|
/** 查询列表 */ |
|
const getList = async () => { |
|
loading.value = true |
|
try { |
|
const data = await ClueApi.getCluePage(queryParams) |
|
list.value = data.list |
|
total.value = data.total |
|
} finally { |
|
loading.value = false |
|
} |
|
} |
|
|
|
/** 搜索按钮操作 */ |
|
const handleQuery = () => { |
|
queryParams.pageNo = 1 |
|
getList() |
|
} |
|
|
|
/** 重置按钮操作 */ |
|
const resetQuery = () => { |
|
queryFormRef.value.resetFields() |
|
handleQuery() |
|
} |
|
|
|
/** tab 切换 */ |
|
const handleTabClick = (tab: TabsPaneContext) => { |
|
queryParams.sceneType = tab.paneName |
|
handleQuery() |
|
} |
|
|
|
/** 打开线索详情 */ |
|
const { push } = useRouter() |
|
const openDetail = (id: number) => { |
|
push({ name: 'CrmClueDetail', params: { id } }) |
|
} |
|
|
|
/** 添加/修改操作 */ |
|
const formRef = ref() |
|
const openForm = (type: string, id?: number) => { |
|
formRef.value.open(type, id) |
|
} |
|
|
|
/** 删除按钮操作 */ |
|
const handleDelete = async (id: number) => { |
|
try { |
|
// 删除的二次确认 |
|
await message.delConfirm() |
|
// 发起删除 |
|
await ClueApi.deleteClue(id) |
|
message.success(t('common.delSuccess')) |
|
// 刷新列表 |
|
await getList() |
|
} catch {} |
|
} |
|
|
|
/** 导出按钮操作 */ |
|
const handleExport = async () => { |
|
try { |
|
// 导出的二次确认 |
|
await message.exportConfirm() |
|
// 发起导出 |
|
exportLoading.value = true |
|
const data = await ClueApi.exportClue(queryParams) |
|
download.excel(data, '线索.xls') |
|
} catch { |
|
} finally { |
|
exportLoading.value = false |
|
} |
|
} |
|
|
|
/** 初始化 **/ |
|
onMounted(() => { |
|
getList() |
|
}) |
|
</script>
|
|
|