bug修复

This commit is contained in:
jiangjunhong 2025-04-27 01:36:42 +08:00
parent f1ab5eeaf4
commit c1fc0f9764
13 changed files with 293 additions and 34 deletions

View File

@ -66,7 +66,7 @@ export const CustomerInforApi = {
// 修改客户信息
updateCustomer: async (data: CustomerInforVO) => {
updateCustomer: async (data: any) => {
return await request.put({ url: `/crm/customer/update`, data })
},
// 分配客户

View File

@ -6,6 +6,7 @@ export interface FollwRecordVO {
customerId: number // 客户ID
content: string // 跟进内容
userId: number // 客户经理
createTime: number // 创建时间
}
// 跟进记录 API
@ -16,7 +17,7 @@ export const FollwRecordApi = {
},
// 新增跟进记录
createFollwRecord: async (data: FollwRecordVO) => {
createFollwRecord: async (data: any) => {
return await request.post({ url: `/crm/follw-record/create`, data })
},

View File

@ -80,6 +80,8 @@ declare module 'vue' {
ElCheckTag: typeof import('element-plus/es')['ElCheckTag']
ElCol: typeof import('element-plus/es')['ElCol']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
ElDialog: typeof import('element-plus/es')['ElDialog']
ElDivider: typeof import('element-plus/es')['ElDivider']
ElDrawer: typeof import('element-plus/es')['ElDrawer']

View File

@ -62,7 +62,7 @@
<div class="w-[300px]">
<el-tabs>
<el-tab-pane label="跟进记录">
<FollowRecord :customer-id="props.customerId" />
<FollowRecord ref="followRecordRef" :customer-id="props.customerId" />
</el-tab-pane>
<el-tab-pane label="流转记录">
<TransferRecord :customer-id="props.customerId" />
@ -75,7 +75,11 @@
<el-tabs>
<el-tab-pane label="客户资料">
<div class="mt-4">
<QuickFollow :customer-id="props.customerId" :customer-form="customerForm" />
<QuickFollow
:customer-id="props.customerId"
:customer-form="customerForm"
@save-success="followRecordRef?.refresh()"
/>
<Infor :customer-id="props.customerId" :customer-form="customerForm" />
</div>
</el-tab-pane>
@ -112,6 +116,7 @@ const emit = defineEmits(['prev', 'next'])
const formRef = ref() // Ref
const transferFormRef = ref() // Ref
const followRecordRef = ref()
//
const customerForm = ref({

View File

@ -35,6 +35,16 @@ const props = defineProps<{
customerId?: number
}>()
//
defineExpose({
refresh: () => {
resetData()
if (props.customerId) {
loadData()
}
}
})
const followRecordList = ref<FollwRecordVO[]>([])
const pageNo = ref(1)
const pageSize = ref(10)
@ -74,6 +84,15 @@ const loadData = async () => {
}
}
//
const resetData = () => {
followRecordList.value = []
pageNo.value = 1
total.value = 0
finished.value = false
loading.value = false
}
//
const loadMore = async () => {
if (finished.value) return
@ -82,13 +101,14 @@ const loadMore = async () => {
}
// customerId
watch(() => props.customerId, async (id) => {
if (id) {
pageNo.value = 1
finished.value = false
//
await crmStore.getUserList()
await loadData()
watch(() => props.customerId, async (newId, oldId) => {
if (newId !== oldId) {
resetData()
if (newId) {
//
await crmStore.getUserList()
await loadData()
}
}
}, { immediate: true })
</script>

View File

@ -103,11 +103,11 @@
<div class="flex items-center gap-2">
<el-date-picker
v-model="form.nextFollowTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="datetime"
placeholder="请选择时间"
class="!w-[150px]"
size="small"
size="small"
value-format="x"
/>
<el-button
type="danger"
@ -216,7 +216,7 @@ const props = defineProps<{
customerForm: any
}>()
const emit = defineEmits(['prev', 'next'])
const emit = defineEmits(['prev', 'next', 'save-success'])
const message = useMessage()
@ -247,7 +247,7 @@ const form = ref<{
importLevelId: number | undefined
isImport: number | undefined
customerLabelIds: number[]
nextFollowTime: string | undefined
nextFollowTime: number | null
}>({
id: 0,
haveCar: undefined,
@ -259,7 +259,7 @@ const form = ref<{
importLevelId: undefined,
isImport: undefined,
customerLabelIds: [],
nextFollowTime: undefined
nextFollowTime: null
})
//
@ -314,8 +314,8 @@ const handleCustomerLablesChange = (labelId: number, checked: boolean) => {
//
const setNextFollowTime = (minutes: number) => {
form.value.nextFollowTime = minutes ? dayjs().add(minutes, 'minute').format('YYYY-MM-DD HH:mm:ss') : undefined
}
form.value.nextFollowTime = minutes ? dayjs().add(minutes, 'minute').valueOf() : undefined
}
//
const handleSave = async () => {
@ -333,16 +333,23 @@ const handleSave = async () => {
//2:
if (content.value) {
const followRecord: FollwRecordVO = {
id: 0,
await FollwRecordApi.createFollwRecord({
customerId: props.customerId!,
content: content.value,
userId: userStore.getUser.id
}
await FollwRecordApi.createFollwRecord(followRecord)
})
console.log("content:"+content.value);
//3:
await CustomerInforApi.updateCustomer({
id: props.customerId!,
lastFollowTime: dayjs().valueOf(),
lastFollowContent: content.value
});
emit('save-success')
}
//3:
//4:
if (props.customerId && customerLabels.value.length > 0) {
await request.post({
url: '/crm/customer-labels/create',
@ -354,6 +361,9 @@ const handleSave = async () => {
}
message.success('保存成功')
//
content.value = ''
} catch (error: any) {
//
if (error?.message) {

View File

@ -302,7 +302,13 @@
<!-- 客户详情抽屉 -->
<el-drawer v-model="drawerVisible" size="80%" :destroy-on-close="true" :with-header="false" :show-close="true">
<CustomerDetail :customer-id="customerId" />
<CustomerDetail
:customer-id="customerId"
:prev-id="prevId"
:next-id="nextId"
@prev="handlePrevNextClick('prev')"
@next="handlePrevNextClick('next')"
/>
</el-drawer>
<!-- 转公海弹窗 -->
@ -314,6 +320,7 @@
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import { buildTree } from '@/utils/tree'
import { handlePrevNext } from '@/utils/crm'
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'
@ -363,6 +370,8 @@ let customerSourceOptions = ref<any>();
let customerTypeOptions = ref<any>();
const drawerVisible = ref(false) //
const customerId = ref<number>() // ID
const prevId = ref<number>(0) // ID
const nextId = ref<number>(0) // ID
const cascaderProps= {
emitPath: false,
}
@ -395,9 +404,31 @@ const resetQuery = () => {
/** 打开跟进抽屉 */
const openInforForm = (id?: number) => {
customerId.value = id
//
const currentIndex = list.value.findIndex(item => item.id === id)
// ID
prevId.value = currentIndex > 0 ? list.value[currentIndex - 1].id : 0
nextId.value = currentIndex < list.value.length - 1 ? list.value[currentIndex + 1].id : 0
drawerVisible.value = true
}
/** 处理上一条/下一条切换 */
const handlePrevNextClick = (type: 'prev' | 'next') => {
if (customerId.value === undefined) return
handlePrevNext(type, {
list: list.value,
currentId: customerId.value,
onUpdateIds: ({ currentId, prevId: newPrevId, nextId: newNextId }) => {
customerId.value = currentId
prevId.value = newPrevId
nextId.value = newNextId
}
})
}
/** 打开转公海弹窗 */
const openTransferForm = () => {
if (multipleSelection.value.length === 0) {

View File

@ -281,7 +281,13 @@
<!-- 客户详情抽屉 -->
<el-drawer v-model="drawerVisible" size="80%" :destroy-on-close="true" :with-header="false" :show-close="true">
<CustomerDetail :customer-id="customerId" />
<CustomerDetail
:customer-id="customerId"
:prev-id="prevId"
:next-id="nextId"
@prev="handlePrevNextClick('prev')"
@next="handlePrevNextClick('next')"
/>
</el-drawer>
<!-- 转公海弹窗 -->
@ -293,6 +299,7 @@
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import { buildTree } from '@/utils/tree'
import { handlePrevNext } from '@/utils/crm'
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'
@ -342,6 +349,8 @@ let customerSourceOptions = ref<any>()
let customerTypeOptions = ref<any>()
const drawerVisible = ref(false) //
const customerId = ref<number>() // ID
const prevId = ref<number>(0) // ID
const nextId = ref<number>(0) // ID
const cascaderProps= {
emitPath: false,
}
@ -375,9 +384,31 @@ const resetQuery = () => {
/** 打开跟进抽屉 */
const openInforForm = (id?: number) => {
customerId.value = id
//
const currentIndex = list.value.findIndex(item => item.id === id)
// ID
prevId.value = currentIndex > 0 ? list.value[currentIndex - 1].id : 0
nextId.value = currentIndex < list.value.length - 1 ? list.value[currentIndex + 1].id : 0
drawerVisible.value = true
}
/** 处理上一条/下一条切换 */
const handlePrevNextClick = (type: 'prev' | 'next') => {
if (customerId.value === undefined) return
handlePrevNext(type, {
list: list.value,
currentId: customerId.value,
onUpdateIds: ({ currentId, prevId: newPrevId, nextId: newNextId }) => {
customerId.value = currentId
prevId.value = newPrevId
nextId.value = newNextId
}
})
}
/** 打开转公海弹窗 */
const openTransferForm = () => {
if (multipleSelection.value.length === 0) {

View File

@ -280,7 +280,13 @@
<!-- 客户详情抽屉 -->
<el-drawer v-model="drawerVisible" size="80%" :destroy-on-close="true" :with-header="false" :show-close="true">
<CustomerDetail :customer-id="customerId" />
<CustomerDetail
:customer-id="customerId"
:prev-id="prevId"
:next-id="nextId"
@prev="handlePrevNextClick('prev')"
@next="handlePrevNextClick('next')"
/>
</el-drawer>
<!-- 转公海弹窗 -->
@ -298,6 +304,7 @@ import TransferForm from '@/views/crm/components/Transfer/TransferForm.vue'
import { useCrmStore } from '@/store/modules/crm'
import { storeToRefs } from 'pinia'
import dayjs from 'dayjs'
import { handlePrevNext } from '@/utils/crm'
/** 客户信息 列表 */
defineOptions({ name: 'AllCustomer' })
@ -342,6 +349,8 @@ let customerSourceOptions = ref<any>()
let customerTypeOptions = ref<any>()
const drawerVisible = ref(false) //
const customerId = ref<number>() // ID
const prevId = ref<number>(0) // ID
const nextId = ref<number>(0) // ID
const cascaderProps= {
emitPath: false,
}
@ -380,9 +389,31 @@ const resetQuery = () => {
/** 打开跟进抽屉 */
const openInforForm = (id?: number) => {
customerId.value = id
//
const currentIndex = list.value.findIndex(item => item.id === id)
// ID
prevId.value = currentIndex > 0 ? list.value[currentIndex - 1].id : 0
nextId.value = currentIndex < list.value.length - 1 ? list.value[currentIndex + 1].id : 0
drawerVisible.value = true
}
/** 处理上一条/下一条切换 */
const handlePrevNextClick = (type: 'prev' | 'next') => {
if (customerId.value === undefined) return
handlePrevNext(type, {
list: list.value,
currentId: customerId.value,
onUpdateIds: ({ currentId, prevId: newPrevId, nextId: newNextId }) => {
customerId.value = currentId
prevId.value = newPrevId
nextId.value = newNextId
}
})
}
/** 打开转公海弹窗 */
const openTransferForm = () => {
if (multipleSelection.value.length === 0) {

View File

@ -280,7 +280,13 @@
<!-- 客户详情抽屉 -->
<el-drawer v-model="drawerVisible" size="80%" :destroy-on-close="true" :with-header="false" :show-close="true">
<CustomerDetail :customer-id="customerId" />
<CustomerDetail
:customer-id="customerId"
:prev-id="prevId"
:next-id="nextId"
@prev="handlePrevNextClick('prev')"
@next="handlePrevNextClick('next')"
/>
</el-drawer>
<!-- 转公海弹窗 -->
@ -298,6 +304,7 @@ import TransferForm from '@/views/crm/components/Transfer/TransferForm.vue'
import { useCrmStore } from '@/store/modules/crm'
import { storeToRefs } from 'pinia'
import dayjs from 'dayjs'
import { handlePrevNext } from '@/utils/crm'
/** 客户信息 列表 */
defineOptions({ name: 'AllCustomer' })
@ -342,6 +349,8 @@ let customerSourceOptions = ref<any>()
let customerTypeOptions = ref<any>()
const drawerVisible = ref(false) //
const customerId = ref<number>() // ID
const prevId = ref<number>(0) // ID
const nextId = ref<number>(0) // ID
const cascaderProps= {
emitPath: false,
}
@ -380,9 +389,31 @@ const resetQuery = () => {
/** 打开跟进抽屉 */
const openInforForm = (id?: number) => {
customerId.value = id
//
const currentIndex = list.value.findIndex(item => item.id === id)
// ID
prevId.value = currentIndex > 0 ? list.value[currentIndex - 1].id : 0
nextId.value = currentIndex < list.value.length - 1 ? list.value[currentIndex + 1].id : 0
drawerVisible.value = true
}
/** 处理上一条/下一条切换 */
const handlePrevNextClick = (type: 'prev' | 'next') => {
if (customerId.value === undefined) return
handlePrevNext(type, {
list: list.value,
currentId: customerId.value,
onUpdateIds: ({ currentId, prevId: newPrevId, nextId: newNextId }) => {
customerId.value = currentId
prevId.value = newPrevId
nextId.value = newNextId
}
})
}
/** 打开转公海弹窗 */
const openTransferForm = () => {
if (multipleSelection.value.length === 0) {

View File

@ -277,7 +277,13 @@
<!-- 客户详情抽屉 -->
<el-drawer v-model="drawerVisible" size="80%" :destroy-on-close="true" :with-header="false" :show-close="true">
<CustomerDetail :customer-id="customerId" />
<CustomerDetail
:customer-id="customerId"
:prev-id="prevId"
:next-id="nextId"
@prev="handlePrevNextClick('prev')"
@next="handlePrevNextClick('next')"
/>
</el-drawer>
<!-- 转公海弹窗 -->
@ -289,6 +295,7 @@
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import { buildTree } from '@/utils/tree'
import { handlePrevNext } from '@/utils/crm'
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'
@ -338,6 +345,8 @@ let customerSourceOptions = ref<any>()
let customerTypeOptions = ref<any>()
const drawerVisible = ref(false) //
const customerId = ref<number>() // ID
const prevId = ref<number>(0) // ID
const nextId = ref<number>(0) // ID
const cascaderProps= {
emitPath: false,
}
@ -372,9 +381,31 @@ const resetQuery = () => {
/** 打开跟进抽屉 */
const openInforForm = (id?: number) => {
customerId.value = id
//
const currentIndex = list.value.findIndex(item => item.id === id)
// ID
prevId.value = currentIndex > 0 ? list.value[currentIndex - 1].id : 0
nextId.value = currentIndex < list.value.length - 1 ? list.value[currentIndex + 1].id : 0
drawerVisible.value = true
}
/** 处理上一条/下一条切换 */
const handlePrevNextClick = (type: 'prev' | 'next') => {
if (customerId.value === undefined) return
handlePrevNext(type, {
list: list.value,
currentId: customerId.value,
onUpdateIds: ({ currentId, prevId: newPrevId, nextId: newNextId }) => {
customerId.value = currentId
prevId.value = newPrevId
nextId.value = newNextId
}
})
}
/** 打开转公海弹窗 */
const openTransferForm = () => {
if (multipleSelection.value.length === 0) {

View File

@ -263,9 +263,15 @@
@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 v-model="drawerVisible" size="80%" :destroy-on-close="true" :with-header="false" :show-close="true">
<CustomerDetail
:customer-id="customerId"
:prev-id="prevId"
:next-id="nextId"
@prev="handlePrevNextClick('prev')"
@next="handlePrevNextClick('next')"
/>
</el-drawer>
<!-- 分配弹窗 -->
@ -274,6 +280,7 @@
<script setup lang="ts">
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { handlePrevNext } from '@/utils/crm'
import { dateFormatter } from '@/utils/formatTime'
import { buildTree } from '@/utils/tree'
import { CustomerInforApi, CustomerInforVO } from '@/api/crm/customer/customer'
@ -284,7 +291,7 @@ import AllocateForm from '@/views/crm/components/Allocate/AllocateForm.vue'
/** 客户信息 列表 */
defineOptions({ name: 'AllCustomer' })
const message = useMessage() //
const { t } = useI18n() //
@ -302,9 +309,14 @@ let customerTypeOptions = ref<any>()
const drawerVisible = ref(false) //
const customerId = ref<number>() // ID
const prevId = ref<number>(0) // ID
const nextId = ref<number>(0) // ID
const multipleSelection = ref<CustomerInforVO[]>([])
const formRef = ref() // Ref
const cascaderProps= {
emitPath: false,
}
@ -358,6 +370,13 @@ const resetQuery = () => {
/** 打开跟进抽屉 */
const openInforForm = (id?: number) => {
customerId.value = id
//
const currentIndex = list.value.findIndex(item => item.id === id)
// ID
prevId.value = currentIndex > 0 ? list.value[currentIndex - 1].id : 0
nextId.value = currentIndex < list.value.length - 1 ? list.value[currentIndex + 1].id : 0
drawerVisible.value = true
}
/** 打开分配弹窗 */
@ -417,4 +436,18 @@ const handleReceive = async () => {
message.error('领取失败')
}
}
/** 处理上一条/下一条切换 */
const handlePrevNextClick = (type: 'prev' | 'next') => {
if (customerId.value === undefined) return
handlePrevNext(type, {
list: list.value,
currentId: customerId.value,
onUpdateIds: ({ currentId, prevId: newPrevId, nextId: newNextId }) => {
customerId.value = currentId
prevId.value = newPrevId
nextId.value = newNextId
}
})
}
</script>

View File

@ -265,7 +265,13 @@
</ContentWrap>
<!-- 客户详情抽屉 -->
<el-drawer v-model="drawerVisible" size="80%" :destroy-on-close="true" :with-header="false" :show-close="true">
<CustomerDetail :customer-id="customerId" />
<CustomerDetail
:customer-id="customerId"
:prev-id="prevId"
:next-id="nextId"
@prev="handlePrevNextClick('prev')"
@next="handlePrevNextClick('next')"
/>
</el-drawer>
<!-- 分配弹窗 -->
@ -274,6 +280,7 @@
<script setup lang="ts">
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { handlePrevNext } from '@/utils/crm'
import { dateFormatter } from '@/utils/formatTime'
import { buildTree } from '@/utils/tree'
import { CustomerInforApi, CustomerInforVO } from '@/api/crm/customer/customer'
@ -303,6 +310,9 @@ let customerTypeOptions = ref<any>()
const drawerVisible = ref(false) //
const customerId = ref<number>() // ID
const prevId = ref<number>(0) // ID
const nextId = ref<number>(0) // ID
const multipleSelection = ref<CustomerInforVO[]>([])
const formRef = ref() // Ref
@ -357,8 +367,16 @@ const resetQuery = () => {
handleQuery()
}
/** 打开跟进抽屉 */
/** 打开跟进抽屉 */
const openInforForm = (id?: number) => {
customerId.value = id
//
const currentIndex = list.value.findIndex(item => item.id === id)
// ID
prevId.value = currentIndex > 0 ? list.value[currentIndex - 1].id : 0
nextId.value = currentIndex < list.value.length - 1 ? list.value[currentIndex + 1].id : 0
drawerVisible.value = true
}
/** 打开分配弹窗 */
@ -418,4 +436,19 @@ const handleReceive = async () => {
message.error('领取失败')
}
}
/** 处理上一条/下一条切换 */
const handlePrevNextClick = (type: 'prev' | 'next') => {
if (customerId.value === undefined) return
handlePrevNext(type, {
list: list.value,
currentId: customerId.value,
onUpdateIds: ({ currentId, prevId: newPrevId, nextId: newNextId }) => {
customerId.value = currentId
prevId.value = newPrevId
nextId.value = newNextId
}
})
}
</script>