Commit 08bb022c by YunaiV

CRM:完善联系人的编辑、详情

parent 094b1925
...@@ -2,29 +2,34 @@ import request from '@/config/axios' ...@@ -2,29 +2,34 @@ import request from '@/config/axios'
import { TransferReqVO } from '@/api/crm/customer' import { TransferReqVO } from '@/api/crm/customer'
export interface ContactVO { export interface ContactVO {
name: string id: number // 编号
nextTime: Date name: string // 联系人名称
mobile: string customerId: number // 客户编号
telephone: string customerName?: string // 客户名称
email: string contactLastTime: Date // 最后跟进时间
post: string contactLastContent: string // 最后跟进内容
customerId: number contactNextTime: Date // 下次联系时间
detailAddress: string ownerUserId: number // 负责人的用户编号
remark: string ownerUserName?: string // 负责人的用户名称
ownerUserId: string ownerUserDept?: string // 负责人的部门名称
lastTime: Date mobile: string // 手机号
id: number telephone: string // 电话
parentId: number qq: string // QQ
qq: number wechat: string // wechat
wechat: string email: string // email
sex: number areaId: number // 所在地
master: boolean areaName?: string // 所在地名称
creatorName: string detailAddress: string // 详细地址
updateTime?: Date sex: number // 性别
createTime?: Date master: boolean // 是否主联系人
customerName: string post: string // 职务
areaName: string parentId: number // 上级联系人编号
ownerUserName: string parentName?: string // 上级联系人名称
remark: string // 备注
creator: string // 创建人
creatorName?: string // 创建人名称
createTime: Date // 创建时间
updateTime: Date // 更新时间
} }
export interface ContactBusinessReqVO { export interface ContactBusinessReqVO {
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
ref="permissionListRef" ref="permissionListRef"
:biz-id="clue.id!" :biz-id="clue.id!"
:biz-type="BizTypeEnum.CRM_CLUE" :biz-type="BizTypeEnum.CRM_CLUE"
:show-action="!permissionListRef?.isPool || false" :show-action="true"
@quit-team="close" @quit-team="close"
/> />
</el-tab-pane> </el-tab-pane>
......
...@@ -16,17 +16,11 @@ ...@@ -16,17 +16,11 @@
</div> </div>
<ContentWrap class="mt-10px"> <ContentWrap class="mt-10px">
<el-descriptions :column="5" direction="vertical"> <el-descriptions :column="5" direction="vertical">
<el-descriptions-item label="客户"> <el-descriptions-item label="客户名称">{{ contact.customerName }}</el-descriptions-item>
{{ contact.customerName }} <el-descriptions-item label="职务">{{ contact.post }}</el-descriptions-item>
</el-descriptions-item> <el-descriptions-item label="手机">{{ contact.mobile }}</el-descriptions-item>
<el-descriptions-item label="职务">
{{ contact.post }}
</el-descriptions-item>
<el-descriptions-item label="手机">
{{ contact.mobile }}
</el-descriptions-item>
<el-descriptions-item label="创建时间"> <el-descriptions-item label="创建时间">
{{ contact.createTime ? formatDate(contact.createTime) : '空' }} {{ formatDate(contact.createTime) }}
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
</ContentWrap> </ContentWrap>
......
...@@ -6,60 +6,49 @@ ...@@ -6,60 +6,49 @@
<span class="text-base font-bold">基本信息</span> <span class="text-base font-bold">基本信息</span>
</template> </template>
<el-descriptions :column="4"> <el-descriptions :column="4">
<el-descriptions-item label="姓名"> <el-descriptions-item label="姓名">{{ contact.name }}</el-descriptions-item>
{{ contact.name }} <el-descriptions-item label="客户名称">{{ contact.customerName }}</el-descriptions-item>
</el-descriptions-item> <el-descriptions-item label="手机">{{ contact.mobile }}</el-descriptions-item>
<el-descriptions-item label="客户"> <el-descriptions-item label="电话">{{ contact.telephone }}</el-descriptions-item>
{{ contact.customerName }} <el-descriptions-item label="邮箱">{{ contact.email }}</el-descriptions-item>
</el-descriptions-item> <el-descriptions-item label="QQ">{{ contact.qq }}</el-descriptions-item>
<el-descriptions-item label="手机"> <el-descriptions-item label="微信">{{ contact.wechat }}</el-descriptions-item>
{{ contact.mobile }} <el-descriptions-item label="地址">
</el-descriptions-item> {{ contact.areaName }} {{ contact.detailAddress }}
<el-descriptions-item label="座机"> </el-descriptions-item>
{{ contact.telephone }} <el-descriptions-item label="职务">{{ contact.post }}</el-descriptions-item>
</el-descriptions-item> <el-descriptions-item label="直属上级">{{ contact.parentName }}</el-descriptions-item>
<el-descriptions-item label="邮箱"> <el-descriptions-item label="关键决策人">
{{ contact.email }} <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="contact.master" />
</el-descriptions-item>
<el-descriptions-item label="QQ">
{{ contact.qq }}
</el-descriptions-item>
<el-descriptions-item label="微信">
{{ contact.wechat }}
</el-descriptions-item>
<el-descriptions-item label="下次联系时间">
{{ contact.nextTime ? formatDate(contact.nextTime) : '空' }}
</el-descriptions-item>
<el-descriptions-item label="所在地">
{{ contact.areaName }}
</el-descriptions-item>
<el-descriptions-item label="详细地址">
{{ contact.detailAddress }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="性别"> <el-descriptions-item label="性别">
<dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="contact.sex" /> <dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="contact.sex" />
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="备注"> <el-descriptions-item label="下次联系时间">
{{ contact.remark }} {{ formatDate(contact.contactNextTime) }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="备注">{{ contact.remark }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-collapse-item> </el-collapse-item>
<el-collapse-item name="systemInfo"> <el-collapse-item name="systemInfo">
<template #title> <template #title>
<span class="text-base font-bold">系统信息</span> <span class="text-base font-bold">系统信息</span>
</template> </template>
<el-descriptions :column="2"> <el-descriptions :column="4">
<el-descriptions-item label="负责人"> <el-descriptions-item label="负责人">{{ contact.ownerUserName }}</el-descriptions-item>
{{ contact.ownerUserName }} <el-descriptions-item label="最后跟进记录">
{{ contact.contactLastContent }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="创建人"> <el-descriptions-item label="最后跟进时间">
{{ contact.creatorName }} {{ formatDate(contact.contactLastTime) }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="">&nbsp;</el-descriptions-item>
<el-descriptions-item label="创建人">{{ contact.creatorName }}</el-descriptions-item>
<el-descriptions-item label="创建时间"> <el-descriptions-item label="创建时间">
{{ contact.createTime ? formatDate(contact.createTime) : '空' }} {{ formatDate(contact.createTime) }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="更新时间"> <el-descriptions-item label="更新时间">
{{ contact.updateTime ? formatDate(contact.updateTime) : '空' }} {{ formatDate(contact.updateTime) }}
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-collapse-item> </el-collapse-item>
......
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
</ContactDetailsHeader> </ContactDetailsHeader>
<el-col> <el-col>
<el-tabs> <el-tabs>
<el-tab-pane label="跟进记录">
<FollowUpList :biz-id="contactId" :biz-type="BizTypeEnum.CRM_CONTACT" />
</el-tab-pane>
<el-tab-pane label="详细资料"> <el-tab-pane label="详细资料">
<ContactDetailsInfo :contact="contact" /> <ContactDetailsInfo :contact="contact" />
</el-tab-pane> </el-tab-pane>
...@@ -20,7 +23,7 @@ ...@@ -20,7 +23,7 @@
ref="permissionListRef" ref="permissionListRef"
:biz-id="contact.id!" :biz-id="contact.id!"
:biz-type="BizTypeEnum.CRM_CONTACT" :biz-type="BizTypeEnum.CRM_CONTACT"
:show-action="!permissionListRef?.isPool || false" :show-action="true"
@quit-team="close" @quit-team="close"
/> />
</el-tab-pane> </el-tab-pane>
...@@ -34,8 +37,8 @@ ...@@ -34,8 +37,8 @@
</el-tabs> </el-tabs>
</el-col> </el-col>
<!-- 表单弹窗:添加/修改 --> <!-- 表单弹窗:添加/修改 -->
<ContactForm ref="formRef" @success="getContactData(contact.id)" /> <ContactForm ref="formRef" @success="getContact(contact.id)" />
<CrmTransferForm ref="crmTransferFormRef" @success="close" /> <CrmTransferForm ref="transferFormRef" @success="close" />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { useTagsViewStore } from '@/store/modules/tagsView' import { useTagsViewStore } from '@/store/modules/tagsView'
...@@ -49,18 +52,19 @@ import { OperateLogV2VO } from '@/api/system/operatelog' ...@@ -49,18 +52,19 @@ import { OperateLogV2VO } from '@/api/system/operatelog'
import { getOperateLogPage } from '@/api/crm/operateLog' import { getOperateLogPage } from '@/api/crm/operateLog'
import ContactForm from '@/views/crm/contact/ContactForm.vue' import ContactForm from '@/views/crm/contact/ContactForm.vue'
import CrmTransferForm from '@/views/crm/permission/components/TransferForm.vue' import CrmTransferForm from '@/views/crm/permission/components/TransferForm.vue'
import FollowUpList from '@/views/crm/followup/index.vue'
defineOptions({ name: 'CrmContactDetail' }) defineOptions({ name: 'CrmContactDetail' })
const route = useRoute()
const message = useMessage() const message = useMessage()
const id = Number(route.params.id) // 联系人编号
const contactId = ref(0) // 线索编号
const loading = ref(true) // 加载中 const loading = ref(true) // 加载中
const contact = ref<ContactApi.ContactVO>({} as ContactApi.ContactVO) // 联系人详情 const contact = ref<ContactApi.ContactVO>({} as ContactApi.ContactVO) // 联系人详情
const permissionListRef = ref<InstanceType<typeof PermissionList>>() // 团队成员列表 Ref const permissionListRef = ref<InstanceType<typeof PermissionList>>() // 团队成员列表 Ref
/** 获取详情 */ /** 获取详情 */
const getContactData = async (id: number) => { const getContact = async (id: number) => {
loading.value = true loading.value = true
try { try {
contact.value = await ContactApi.getContact(id) contact.value = await ContactApi.getContact(id)
...@@ -77,9 +81,9 @@ const openForm = (type: string, id?: number) => { ...@@ -77,9 +81,9 @@ const openForm = (type: string, id?: number) => {
} }
/** 联系人转移 */ /** 联系人转移 */
const crmTransferFormRef = ref<InstanceType<typeof CrmTransferForm>>() // 联系人转移表单 ref const transferFormRef = ref<InstanceType<typeof CrmTransferForm>>() // 联系人转移表单 ref
const transfer = () => { const transfer = () => {
crmTransferFormRef.value?.open('联系人转移', contact.value.id, ContactApi.transferContact) transferFormRef.value?.open('联系人转移', contact.value.id, ContactApi.transferContact)
} }
/** 获取操作日志 */ /** 获取操作日志 */
...@@ -96,19 +100,21 @@ const getOperateLog = async (contactId: number) => { ...@@ -96,19 +100,21 @@ const getOperateLog = async (contactId: number) => {
} }
/** 关闭窗口 */ /** 关闭窗口 */
const { delView } = useTagsViewStore() // 视图操作
const { currentRoute } = useRouter() // 路由
const close = () => { const close = () => {
delView(unref(currentRoute)) delView(unref(currentRoute))
} }
/** 初始化 */ /** 初始化 */
const { delView } = useTagsViewStore() // 视图操作 const { params } = useRoute()
const { currentRoute } = useRouter() // 路由
onMounted(async () => { onMounted(async () => {
if (!id) { if (!params.id) {
message.warning('参数错误,联系人不能为空!') message.warning('参数错误,联系人不能为空!')
close() close()
return return
} }
await getContactData(id) contactId.value = params.id as unknown as number
await getContact(contactId.value)
}) })
</script> </script>
...@@ -53,15 +53,6 @@ ...@@ -53,15 +53,6 @@
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item label="QQ" prop="qq">
<el-input
v-model="queryParams.qq"
class="!w-240px"
clearable
placeholder="请输入QQ"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="微信" prop="wechat"> <el-form-item label="微信" prop="wechat">
<el-input <el-input
v-model="queryParams.wechat" v-model="queryParams.wechat"
...@@ -109,6 +100,11 @@ ...@@ -109,6 +100,11 @@
<!-- 列表 --> <!-- 列表 -->
<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" :show-overflow-tooltip="true" :stripe="true"> <el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" :stripe="true">
<el-table-column align="center" fixed="left" label="联系人姓名" prop="name" width="160"> <el-table-column align="center" fixed="left" label="联系人姓名" prop="name" width="160">
<template #default="scope"> <template #default="scope">
...@@ -224,6 +220,7 @@ import * as ContactApi from '@/api/crm/contact' ...@@ -224,6 +220,7 @@ import * as ContactApi from '@/api/crm/contact'
import ContactForm from './ContactForm.vue' import ContactForm from './ContactForm.vue'
import { DICT_TYPE } from '@/utils/dict' import { DICT_TYPE } from '@/utils/dict'
import * as CustomerApi from '@/api/crm/customer' import * as CustomerApi from '@/api/crm/customer'
import { TabsPaneContext } from 'element-plus'
defineOptions({ name: 'CrmContact' }) defineOptions({ name: 'CrmContact' })
...@@ -237,16 +234,17 @@ const customerList = ref<CustomerApi.CustomerVO[]>([]) // 客户列表 ...@@ -237,16 +234,17 @@ const customerList = ref<CustomerApi.CustomerVO[]>([]) // 客户列表
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, pageNo: 1,
pageSize: 10, pageSize: 10,
sceneType: '1', // 默认和 activeName 相等
mobile: undefined, mobile: undefined,
telephone: undefined, telephone: undefined,
email: undefined, email: undefined,
customerId: undefined, customerId: undefined,
name: undefined, name: undefined,
qq: undefined,
wechat: undefined wechat: undefined
}) })
const queryFormRef = ref() // 搜索的表单 const queryFormRef = ref() // 搜索的表单
const exportLoading = ref(false) // 导出的加载中 const exportLoading = ref(false) // 导出的加载中
const activeName = ref('1') // 列表 tab
/** 查询列表 */ /** 查询列表 */
const getList = async () => { const getList = async () => {
...@@ -272,6 +270,12 @@ const resetQuery = () => { ...@@ -272,6 +270,12 @@ const resetQuery = () => {
handleQuery() handleQuery()
} }
/** tab 切换 */
const handleTabClick = (tab: TabsPaneContext) => {
queryParams.sceneType = tab.paneName
handleQuery()
}
/** 添加/修改操作 */ /** 添加/修改操作 */
const formRef = ref() const formRef = ref()
const openForm = (type: string, id?: number) => { const openForm = (type: string, id?: number) => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment