Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
9628517b
authored
Jan 20, 2024
by
puhui999
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
CRM: 跟进组件完善
parent
f88b26e3
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
183 additions
and
92 deletions
+183
-92
src/views/crm/followup/FollowUpRecordForm.vue
+11
-10
src/views/crm/followup/components/BusinessList.vue
+1
-1
src/views/crm/followup/components/BusinessListSelectForm.vue
+0
-79
src/views/crm/followup/components/BusinessTableSelect.vue
+84
-0
src/views/crm/followup/components/ContactList.vue
+1
-1
src/views/crm/followup/components/ContactTableSelect.vue
+83
-0
src/views/crm/followup/components/index.ts
+3
-1
No files found.
src/views/crm/followup/FollowUpRecordForm.vue
View file @
9628517b
...
@@ -31,7 +31,6 @@
...
@@ -31,7 +31,6 @@
/>
/>
</el-form-item>
</el-form-item>
</el-col>
</el-col>
<!-- TODO @puhui999:不搞富文本哈;然后加个附件、图片两个 form-item 哈 -->
<el-col
:span=
"24"
>
<el-col
:span=
"24"
>
<el-form-item
label=
"跟进内容"
prop=
"content"
>
<el-form-item
label=
"跟进内容"
prop=
"content"
>
<el-input
v-model=
"formData.content"
:rows=
"3"
type=
"textarea"
/>
<el-input
v-model=
"formData.content"
:rows=
"3"
type=
"textarea"
/>
...
@@ -72,13 +71,13 @@
...
@@ -72,13 +71,13 @@
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
</
template
>
</
template
>
</Dialog>
</Dialog>
<ContactTableSelect
ref=
"contactTableSelectRef"
v-model=
"formData.contactIds"
/>
<BusinessTableSelect
ref=
"businessTableSelectRef"
v-model=
"formData.businessIds"
/>
</template>
</template>
<
script
lang=
"ts"
setup
>
<
script
lang=
"ts"
setup
>
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
{
FollowUpRecordApi
,
FollowUpRecordVO
}
from
'@/api/crm/followup'
import
{
FollowUpRecordApi
,
FollowUpRecordVO
}
from
'@/api/crm/followup'
import
{
BusinessList
,
ContactList
}
from
'./components'
import
{
BusinessList
,
BusinessTableSelect
,
ContactList
,
ContactTableSelect
}
from
'./components'
import
*
as
ContactApi
from
'@/api/crm/contact'
import
*
as
BusinessApi
from
'@/api/crm/business'
defineOptions
({
name
:
'FollowUpRecordForm'
})
defineOptions
({
name
:
'FollowUpRecordForm'
})
...
@@ -97,8 +96,6 @@ const formRules = reactive({
...
@@ -97,8 +96,6 @@ const formRules = reactive({
})
})
const
formRef
=
ref
()
// 表单 Ref
const
formRef
=
ref
()
// 表单 Ref
const
allContactList
=
ref
<
ContactApi
.
ContactVO
[]
>
([])
// 所有联系人列表
const
allBusinessList
=
ref
<
BusinessApi
.
BusinessVO
[]
>
([])
// 所有商家列表
/** 打开弹窗 */
/** 打开弹窗 */
const
open
=
async
(
bizType
:
number
,
bizId
:
number
,
type
:
string
,
id
?:
number
)
=>
{
const
open
=
async
(
bizType
:
number
,
bizId
:
number
,
type
:
string
,
id
?:
number
)
=>
{
...
@@ -108,8 +105,6 @@ const open = async (bizType: number, bizId: number, type: string, id?: number) =
...
@@ -108,8 +105,6 @@ const open = async (bizType: number, bizId: number, type: string, id?: number) =
resetForm
()
resetForm
()
formData
.
value
.
bizType
=
bizType
formData
.
value
.
bizType
=
bizType
formData
.
value
.
bizId
=
bizId
formData
.
value
.
bizId
=
bizId
allContactList
.
value
=
await
ContactApi
.
getSimpleContactList
()
allBusinessList
.
value
=
await
BusinessApi
.
getSimpleBusinessList
()
// 修改时,设置数据
// 修改时,设置数据
if
(
id
)
{
if
(
id
)
{
formLoading
.
value
=
true
formLoading
.
value
=
true
...
@@ -146,8 +141,14 @@ const submitForm = async () => {
...
@@ -146,8 +141,14 @@ const submitForm = async () => {
}
}
}
}
const
handleAddContact
=
()
=>
{}
const
contactTableSelectRef
=
ref
<
InstanceType
<
typeof
ContactTableSelect
>>
()
const
handleAddBusiness
=
()
=>
{}
const
handleAddContact
=
()
=>
{
contactTableSelectRef
.
value
?.
open
()
}
const
businessTableSelectRef
=
ref
<
InstanceType
<
typeof
BusinessTableSelect
>>
()
const
handleAddBusiness
=
()
=>
{
businessTableSelectRef
.
value
?.
open
()
}
/** 重置表单 */
/** 重置表单 */
const
resetForm
=
()
=>
{
const
resetForm
=
()
=>
{
formRef
.
value
?.
resetFields
()
formRef
.
value
?.
resetFields
()
...
...
src/views/crm/followup/components/BusinessList.vue
View file @
9628517b
...
@@ -52,7 +52,7 @@ watch(
...
@@ -52,7 +52,7 @@ watch(
if
(
!
val
||
val
.
length
===
0
)
{
if
(
!
val
||
val
.
length
===
0
)
{
return
return
}
}
list
.
value
=
BusinessApi
.
getBusinessListByIds
(
val
)
as
unknown
as
BusinessApi
.
BusinessVO
[]
list
.
value
=
BusinessApi
.
getBusinessListByIds
(
unref
(
val
)
)
as
unknown
as
BusinessApi
.
BusinessVO
[]
}
}
)
)
const
emits
=
defineEmits
<
{
const
emits
=
defineEmits
<
{
...
...
src/views/crm/followup/components/BusinessListSelectForm.vue
deleted
100644 → 0
View file @
f88b26e3
<
template
>
<Dialog
v-model=
"dialogVisible"
:title=
"dialogTitle"
width=
"50%"
>
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"跟进类型"
prop=
"type"
>
<el-select
v-model=
"formData.type"
placeholder=
"请选择跟进类型"
>
<el-option
v-for=
"dict in getIntDictOptions(DICT_TYPE.CRM_FOLLOW_UP_TYPE)"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
<el-form-item
label=
"下次联系时间"
prop=
"nextTime"
>
<el-date-picker
v-model=
"formData.nextTime"
placeholder=
"选择下次联系时间"
type=
"date"
value-format=
"x"
/>
</el-form-item>
</el-col>
</el-row>
<template
#
footer
>
<el-button
:disabled=
"formLoading"
type=
"primary"
@
click=
"submitForm"
>
确 定
</el-button>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
</
template
>
</Dialog>
</template>
<
script
lang=
"ts"
setup
>
/** 跟进记录 表单 */
defineOptions
({
name
:
'BusinessListSelectForm'
})
const
dialogVisible
=
ref
(
false
)
// 弹窗的是否展示
const
dialogTitle
=
ref
(
''
)
// 弹窗的标题
const
formLoading
=
ref
(
false
)
// 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const
formData
=
ref
([])
/** 打开弹窗 */
const
open
=
async
(
type
:
string
,
id
?:
number
)
=>
{
dialogVisible
.
value
=
true
dialogTitle
.
value
=
t
(
'action.'
+
type
)
formType
.
value
=
type
resetForm
()
// 修改时,设置数据
if
(
id
)
{
formLoading
.
value
=
true
try
{
formData
.
value
=
await
FollowUpRecordApi
.
getFollowUpRecord
(
id
)
}
finally
{
formLoading
.
value
=
false
}
}
}
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
/** 提交表单 */
const
emit
=
defineEmits
([
'success'
])
// 定义 success 事件,用于操作成功后的回调
const
submitForm
=
async
()
=>
{
// 校验表单
await
formRef
.
value
.
validate
()
// 提交请求
formLoading
.
value
=
true
try
{
// 发送操作成功的事件
emit
(
'success'
)
}
finally
{
formLoading
.
value
=
false
}
}
/** 重置表单 */
const
resetForm
=
()
=>
{
formRef
.
value
?.
resetFields
()
}
</
script
>
src/views/crm/followup/components/BusinessTableSelect.vue
0 → 100644
View file @
9628517b
<
template
>
<Dialog
v-model=
"dialogVisible"
:appendToBody=
"true"
title=
"选择商机"
width=
"700"
>
<el-table
ref=
"multipleTableRef"
v-loading=
"loading"
:data=
"list"
:show-overflow-tooltip=
"true"
:stripe=
"true"
@
selection-change=
"handleSelectionChange"
>
<el-table-column
type=
"selection"
width=
"55"
/>
<el-table-column
align=
"center"
label=
"商机名称"
prop=
"name"
/>
<el-table-column
align=
"center"
label=
"客户名称"
prop=
"customerName"
/>
<el-table-column
align=
"center"
label=
"商机金额"
prop=
"price"
/>
<el-table-column
:formatter=
"dateFormatter"
align=
"center"
label=
"预计成交日期"
prop=
"dealTime"
width=
"180px"
/>
<el-table-column
align=
"center"
label=
"备注"
prop=
"remark"
/>
</el-table>
<template
#
footer
>
<el-button
:disabled=
"formLoading"
type=
"primary"
@
click=
"submitForm"
>
确 定
</el-button>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
</
template
>
</Dialog>
</template>
<
script
lang=
"ts"
setup
>
import
*
as
BusinessApi
from
'@/api/crm/business'
import
{
dateFormatter
}
from
'@/utils/formatTime'
import
{
ElTable
}
from
'element-plus'
defineOptions
({
name
:
'BusinessTableSelect'
})
withDefaults
(
defineProps
<
{
modelValue
:
number
[]
}
>
(),
{
modelValue
:
()
=>
[]
})
const
list
=
ref
<
BusinessApi
.
BusinessVO
[]
>
([])
// 列表的数据
const
loading
=
ref
(
false
)
// 列表的加载中
const
dialogVisible
=
ref
(
false
)
// 弹窗的是否展示
const
formLoading
=
ref
(
false
)
// 确认选择时的触发事件
const
emits
=
defineEmits
<
{
(
e
:
'update:modelValue'
,
v
:
number
[]):
void
}
>
()
const
multipleTableRef
=
ref
<
InstanceType
<
typeof
ElTable
>>
()
const
multipleSelection
=
ref
<
BusinessApi
.
BusinessVO
[]
>
([])
const
handleSelectionChange
=
(
val
:
BusinessApi
.
BusinessVO
[])
=>
{
multipleSelection
.
value
=
val
}
/** 触发 */
const
submitForm
=
()
=>
{
formLoading
.
value
=
true
try
{
emits
(
'update:modelValue'
,
multipleSelection
.
value
.
map
((
item
)
=>
item
.
id
)
)
}
finally
{
formLoading
.
value
=
false
// 关闭弹窗
dialogVisible
.
value
=
false
}
}
const
getList
=
async
()
=>
{
loading
.
value
=
true
try
{
list
.
value
=
await
BusinessApi
.
getSimpleBusinessList
()
}
finally
{
loading
.
value
=
false
}
}
/** 打开弹窗 */
const
open
=
async
()
=>
{
dialogVisible
.
value
=
true
await
nextTick
()
if
(
multipleSelection
.
value
.
length
>
0
)
{
multipleTableRef
.
value
!
.
clearSelection
()
}
await
getList
()
}
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
</
script
>
src/views/crm/followup/components/ContactList.vue
View file @
9628517b
...
@@ -69,7 +69,7 @@ const props = withDefaults(defineProps<{ contactIds: number[] }>(), {
...
@@ -69,7 +69,7 @@ const props = withDefaults(defineProps<{ contactIds: number[] }>(), {
const
list
=
ref
<
ContactApi
.
ContactVO
[]
>
([]
as
ContactApi
.
ContactVO
[])
const
list
=
ref
<
ContactApi
.
ContactVO
[]
>
([]
as
ContactApi
.
ContactVO
[])
const
getContactList
=
async
()
=>
{
const
getContactList
=
async
()
=>
{
list
.
value
=
(
await
ContactApi
.
getContactListByIds
(
list
.
value
=
(
await
ContactApi
.
getContactListByIds
(
props
.
contactIds
unref
(
props
.
contactIds
)
))
as
unknown
as
ContactApi
.
ContactVO
[]
))
as
unknown
as
ContactApi
.
ContactVO
[]
}
}
watch
(
watch
(
...
...
src/views/crm/followup/components/ContactTableSelect.vue
0 → 100644
View file @
9628517b
<
template
>
<Dialog
v-model=
"dialogVisible"
:appendToBody=
"true"
title=
"选择联系人"
width=
"700"
>
<el-table
ref=
"multipleTableRef"
v-loading=
"loading"
:data=
"list"
:show-overflow-tooltip=
"true"
:stripe=
"true"
@
selection-change=
"handleSelectionChange"
>
<el-table-column
type=
"selection"
width=
"55"
/>
<el-table-column
align=
"center"
fixed=
"left"
label=
"姓名"
prop=
"name"
width=
"140"
/>
<el-table-column
align=
"center"
fixed=
"left"
label=
"客户名称"
prop=
"customerName"
width=
"120"
/>
<el-table-column
align=
"center"
label=
"手机"
prop=
"mobile"
width=
"120"
/>
<el-table-column
align=
"center"
label=
"电话"
prop=
"telephone"
width=
"120"
/>
<el-table-column
align=
"center"
label=
"邮箱"
prop=
"email"
width=
"120"
/>
<el-table-column
align=
"center"
label=
"职位"
prop=
"post"
width=
"120"
/>
</el-table>
<template
#
footer
>
<el-button
:disabled=
"formLoading"
type=
"primary"
@
click=
"submitForm"
>
确 定
</el-button>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
</
template
>
</Dialog>
</template>
<
script
lang=
"ts"
setup
>
import
*
as
ContactApi
from
'@/api/crm/contact'
import
{
ElTable
}
from
'element-plus'
defineOptions
({
name
:
'ContactTableSelect'
})
withDefaults
(
defineProps
<
{
modelValue
:
number
[]
}
>
(),
{
modelValue
:
()
=>
[]
})
const
list
=
ref
<
ContactApi
.
ContactVO
[]
>
([])
// 列表的数据
const
loading
=
ref
(
false
)
// 列表的加载中
const
dialogVisible
=
ref
(
false
)
// 弹窗的是否展示
const
formLoading
=
ref
(
false
)
// 确认选择时的触发事件
const
emits
=
defineEmits
<
{
(
e
:
'update:modelValue'
,
v
:
number
[]):
void
}
>
()
const
multipleTableRef
=
ref
<
InstanceType
<
typeof
ElTable
>>
()
const
multipleSelection
=
ref
<
ContactApi
.
ContactVO
[]
>
([])
const
handleSelectionChange
=
(
val
:
ContactApi
.
ContactVO
[])
=>
{
multipleSelection
.
value
=
val
}
/** 触发 */
const
submitForm
=
()
=>
{
formLoading
.
value
=
true
try
{
emits
(
'update:modelValue'
,
multipleSelection
.
value
.
map
((
item
)
=>
item
.
id
)
)
}
finally
{
formLoading
.
value
=
false
// 关闭弹窗
dialogVisible
.
value
=
false
}
}
const
getList
=
async
()
=>
{
loading
.
value
=
true
try
{
list
.
value
=
await
ContactApi
.
getSimpleContactList
()
}
finally
{
loading
.
value
=
false
}
}
/** 打开弹窗 */
const
open
=
async
()
=>
{
dialogVisible
.
value
=
true
await
nextTick
()
if
(
multipleSelection
.
value
.
length
>
0
)
{
multipleTableRef
.
value
!
.
clearSelection
()
}
await
getList
()
}
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
</
script
>
src/views/crm/followup/components/index.ts
View file @
9628517b
import
BusinessList
from
'./BusinessList.vue'
import
BusinessList
from
'./BusinessList.vue'
import
BusinessTableSelect
from
'./BusinessTableSelect.vue'
import
ContactList
from
'./ContactList.vue'
import
ContactList
from
'./ContactList.vue'
import
ContactTableSelect
from
'./ContactTableSelect.vue'
export
{
BusinessList
,
ContactLis
t
}
export
{
BusinessList
,
BusinessTableSelect
,
ContactList
,
ContactTableSelec
t
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment