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
6baeadc8
authored
Feb 21, 2024
by
YunaiV
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
✨
CRM:完善商机状态的实现
parent
a2443e48
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
92 additions
and
96 deletions
+92
-96
src/api/crm/business/status/index.ts
+37
-0
src/api/crm/businessStatusType/index.ts
+0
-48
src/views/crm/business/BusinessForm.vue
+2
-2
src/views/crm/business/status/BusinessStatusForm.vue
+35
-24
src/views/crm/business/status/index.vue
+18
-22
No files found.
src/api/crm/business/status/index.ts
0 → 100644
View file @
6baeadc8
import
request
from
'@/config/axios'
export
interface
BusinessStatusTypeVO
{
id
:
number
name
:
string
deptIds
:
number
[]
statuses
?:
{
id
:
number
name
:
string
percent
:
number
}
}
// 查询商机状态组列表
export
const
getBusinessStatusPage
=
async
(
params
:
any
)
=>
{
return
await
request
.
get
({
url
:
`/crm/business-status/page`
,
params
})
}
// 新增商机状态组
export
const
createBusinessStatus
=
async
(
data
:
BusinessStatusTypeVO
)
=>
{
return
await
request
.
post
({
url
:
`/crm/business-status/create`
,
data
})
}
// 修改商机状态组
export
const
updateBusinessStatus
=
async
(
data
:
BusinessStatusTypeVO
)
=>
{
return
await
request
.
put
({
url
:
`/crm/business-status/update`
,
data
})
}
// 查询商机状态类型详情
export
const
getBusinessStatus
=
async
(
id
:
number
)
=>
{
return
await
request
.
get
({
url
:
`/crm/business-status/get?id=`
+
id
})
}
// 获得商机状态组列表
export
const
getBusinessStatusTypeSimpleList
=
async
()
=>
{
return
await
request
.
get
({
url
:
`/crm/business-status/type-simple-list`
})
}
src/api/crm/businessStatusType/index.ts
deleted
100644 → 0
View file @
a2443e48
import
request
from
'@/config/axios'
export
interface
BusinessStatusTypeVO
{
id
:
number
name
:
string
deptIds
:
number
[]
status
:
boolean
}
// 查询商机状态类型列表
export
const
getBusinessStatusTypePage
=
async
(
params
)
=>
{
return
await
request
.
get
({
url
:
`/crm/business-status-type/page`
,
params
})
}
// 查询商机状态类型详情
export
const
getBusinessStatusType
=
async
(
id
:
number
)
=>
{
return
await
request
.
get
({
url
:
`/crm/business-status-type/get?id=`
+
id
})
}
// 新增商机状态类型
export
const
createBusinessStatusType
=
async
(
data
:
BusinessStatusTypeVO
)
=>
{
return
await
request
.
post
({
url
:
`/crm/business-status-type/create`
,
data
})
}
// 修改商机状态类型
export
const
updateBusinessStatusType
=
async
(
data
:
BusinessStatusTypeVO
)
=>
{
return
await
request
.
put
({
url
:
`/crm/business-status-type/update`
,
data
})
}
// 删除商机状态类型
export
const
deleteBusinessStatusType
=
async
(
id
:
number
)
=>
{
return
await
request
.
delete
({
url
:
`/crm/business-status-type/delete?id=`
+
id
})
}
// 导出商机状态类型 Excel
export
const
exportBusinessStatusType
=
async
(
params
)
=>
{
return
await
request
.
download
({
url
:
`/crm/business-status-type/export-excel`
,
params
})
}
// 获取商机状态类型信息列表
export
const
getBusinessStatusTypeList
=
async
()
=>
{
return
await
request
.
get
({
url
:
`/crm/business-status-type/get-simple-list`
})
}
// 根据类型ID获取商机状态信息列表
export
const
getBusinessStatusListByTypeId
=
async
(
typeId
:
number
)
=>
{
return
await
request
.
get
({
url
:
`/crm/business-status-type/get-status-list?typeId=`
+
typeId
})
}
src/views/crm/business/BusinessForm.vue
View file @
6baeadc8
...
@@ -131,7 +131,7 @@
...
@@ -131,7 +131,7 @@
</template>
</template>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
*
as
BusinessApi
from
'@/api/crm/business'
import
*
as
BusinessApi
from
'@/api/crm/business'
import
*
as
BusinessStatus
TypeApi
from
'@/api/crm/businessStatusType
'
import
*
as
BusinessStatus
Api
from
'@/api/crm/business/status
'
import
*
as
CustomerApi
from
'@/api/crm/customer'
import
*
as
CustomerApi
from
'@/api/crm/customer'
import
*
as
UserApi
from
'@/api/system/user'
import
*
as
UserApi
from
'@/api/system/user'
import
{
useUserStore
}
from
'@/store/modules/user'
import
{
useUserStore
}
from
'@/store/modules/user'
...
@@ -212,7 +212,7 @@ const open = async (type: string, id?: number) => {
...
@@ -212,7 +212,7 @@ const open = async (type: string, id?: number) => {
}
}
customerList
.
value
=
await
CustomerApi
.
getCustomerSimpleList
()
customerList
.
value
=
await
CustomerApi
.
getCustomerSimpleList
()
// 加载商机状态类型列表
// 加载商机状态类型列表
statusTypeList
.
value
=
await
BusinessStatus
TypeApi
.
getBusinessStatusTyp
eList
()
statusTypeList
.
value
=
await
BusinessStatus
Api
.
getBusinessStatusTypeSimpl
eList
()
// 获得用户列表
// 获得用户列表
userOptions
.
value
=
await
UserApi
.
getSimpleUserList
()
userOptions
.
value
=
await
UserApi
.
getSimpleUserList
()
// 默认新建时选中自己
// 默认新建时选中自己
...
...
src/views/crm/business
StatusType/BusinessStatusType
Form.vue
→
src/views/crm/business
/status/BusinessStatus
Form.vue
View file @
6baeadc8
...
@@ -7,10 +7,13 @@
...
@@ -7,10 +7,13 @@
label-width=
"100px"
label-width=
"100px"
v-loading=
"formLoading"
v-loading=
"formLoading"
>
>
<el-form-item
label=
"状态
类型
名"
prop=
"name"
>
<el-form-item
label=
"状态
组
名"
prop=
"name"
>
<el-input
v-model=
"formData.name"
placeholder=
"请输入状态
类型
名"
/>
<el-input
v-model=
"formData.name"
placeholder=
"请输入状态
组
名"
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"应用部门"
prop=
"deptIds"
>
<el-form-item
label=
"应用部门"
prop=
"deptIds"
>
<template
#
label
>
<Tooltip
message=
"不选择部门时,默认全公司生效"
title=
"应用部门"
/>
</
template
>
<el-tree
<el-tree
ref=
"treeRef"
ref=
"treeRef"
:data=
"deptList"
:data=
"deptList"
...
@@ -21,31 +24,39 @@
...
@@ -21,31 +24,39 @@
show-checkbox
show-checkbox
/>
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"
状态设置"
prop=
"statusList
"
>
<el-form-item
label=
"
阶段设置"
prop=
"statuses
"
>
<el-table
border
style=
"width: 100%"
:data=
"formData.status
List
"
>
<el-table
border
style=
"width: 100%"
:data=
"formData.status
es
"
>
<el-table-column
align=
"center"
label=
"
状态"
width=
"120"
prop=
"star
"
>
<el-table-column
align=
"center"
label=
"
阶段"
width=
"70
"
>
<
template
#
default=
"scope"
>
<
template
#
default=
"scope"
>
<el-text>
状态
{{
scope
.
$index
+
1
}}
</el-text>
<el-text>
阶段
{{
scope
.
$index
+
1
}}
</el-text>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
align=
"center"
label=
"
状态名称"
width=
"12
0"
prop=
"name"
>
<el-table-column
align=
"center"
label=
"
阶段名称"
width=
"16
0"
prop=
"name"
>
<
template
#
default=
"{ row }"
>
<
template
#
default=
"{ row }"
>
<el-input
v-model=
"row.name"
placeholder=
"请输入状态名称"
/>
<el-input
v-model=
"row.name"
placeholder=
"请输入状态名称"
/>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
width=
"1
2
0"
align=
"center"
label=
"赢单率"
prop=
"percent"
>
<el-table-column
width=
"1
4
0"
align=
"center"
label=
"赢单率"
prop=
"percent"
>
<
template
#
default=
"{ row }"
>
<
template
#
default=
"{ row }"
>
<el-input
v-model=
"row.percent"
placeholder=
"请输入赢单率"
/>
<el-input-number
v-model=
"row.percent"
placeholder=
"请输入赢单率"
controls-position=
"right"
:min=
"0"
:max=
"100"
:precision=
"2"
class=
"!w-1/1"
/>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
<el-table-column
label=
"操作"
align=
"center"
>
<el-table-column
label=
"操作"
width=
"110"
align=
"center"
>
<
template
#
default=
"scope"
>
<
template
#
default=
"scope"
>
<el-button
link
type=
"primary"
@
click=
"addStatusArea(scope.$index)"
>
添加
</el-button>
<el-button
link
type=
"primary"
@
click=
"addStatusArea(scope.$index)"
>
添加
</el-button>
<el-button
<el-button
link
link
type=
"danger"
type=
"danger"
@
click=
"deleteStatusArea(scope.$index)"
@
click=
"deleteStatusArea(scope.$index)"
v-show=
"scope.$index > 0
"
:disabled=
"formData.statuses.length
<
=
1
"
>
>
删除
删除
</el-button>
</el-button>
...
@@ -61,7 +72,7 @@
...
@@ -61,7 +72,7 @@
</Dialog>
</Dialog>
</template>
</template>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
*
as
BusinessStatus
TypeApi
from
'@/api/crm/businessStatusType
'
import
*
as
BusinessStatus
Api
from
'@/api/crm/business/status
'
import
{
defaultProps
,
handleTree
}
from
'@/utils/tree'
import
{
defaultProps
,
handleTree
}
from
'@/utils/tree'
import
*
as
DeptApi
from
'@/api/system/dept'
import
*
as
DeptApi
from
'@/api/system/dept'
...
@@ -71,15 +82,15 @@ const message = useMessage() // 消息弹窗
...
@@ -71,15 +82,15 @@ const message = useMessage() // 消息弹窗
const
dialogVisible
=
ref
(
false
)
// 弹窗的是否展示
const
dialogVisible
=
ref
(
false
)
// 弹窗的是否展示
const
dialogTitle
=
ref
(
''
)
// 弹窗的标题
const
dialogTitle
=
ref
(
''
)
// 弹窗的标题
const
formLoading
=
ref
(
false
)
// 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const
formLoading
=
ref
(
false
)
// 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const
formType
=
ref
(
''
)
// 表单的
类型
:create - 新增;update - 修改
const
formType
=
ref
(
''
)
// 表单的
组
:create - 新增;update - 修改
const
formData
=
ref
({
const
formData
=
ref
({
id
:
0
,
id
:
0
,
name
:
''
,
name
:
''
,
deptIds
:
[],
deptIds
:
[],
status
List
:
[]
status
es
:
[]
})
})
const
formRules
=
reactive
({
const
formRules
=
reactive
({
name
:
[{
required
:
true
,
message
:
'状态
类型
名不能为空'
,
trigger
:
'blur'
}]
name
:
[{
required
:
true
,
message
:
'状态
组
名不能为空'
,
trigger
:
'blur'
}]
})
})
const
formRef
=
ref
()
// 表单 Ref
const
formRef
=
ref
()
// 表单 Ref
const
deptList
=
ref
<
Tree
[]
>
([])
// 树形结构
const
deptList
=
ref
<
Tree
[]
>
([])
// 树形结构
...
@@ -96,9 +107,9 @@ const open = async (type: string, id?: number) => {
...
@@ -96,9 +107,9 @@ const open = async (type: string, id?: number) => {
if
(
id
)
{
if
(
id
)
{
formLoading
.
value
=
true
formLoading
.
value
=
true
try
{
try
{
formData
.
value
=
await
BusinessStatus
TypeApi
.
getBusinessStatusType
(
id
)
formData
.
value
=
await
BusinessStatus
Api
.
getBusinessStatus
(
id
)
treeRef
.
value
.
setCheckedKeys
(
formData
.
value
.
deptIds
)
treeRef
.
value
.
setCheckedKeys
(
formData
.
value
.
deptIds
)
if
(
formData
.
value
.
status
List
.
length
==
0
)
{
if
(
formData
.
value
.
status
es
.
length
==
0
)
{
addStatusArea
(
0
)
addStatusArea
(
0
)
}
}
}
finally
{
}
finally
{
...
@@ -120,13 +131,13 @@ const submitForm = async () => {
...
@@ -120,13 +131,13 @@ const submitForm = async () => {
// 提交请求
// 提交请求
formLoading
.
value
=
true
formLoading
.
value
=
true
try
{
try
{
const
data
=
formData
.
value
as
unknown
as
BusinessStatus
Type
Api
.
BusinessStatusTypeVO
const
data
=
formData
.
value
as
unknown
as
BusinessStatusApi
.
BusinessStatusTypeVO
data
.
deptIds
=
treeRef
.
value
.
getCheckedKeys
(
false
)
data
.
deptIds
=
treeRef
.
value
.
getCheckedKeys
(
false
)
if
(
formType
.
value
===
'create'
)
{
if
(
formType
.
value
===
'create'
)
{
await
BusinessStatus
TypeApi
.
createBusinessStatusType
(
data
)
await
BusinessStatus
Api
.
createBusinessStatus
(
data
)
message
.
success
(
t
(
'common.createSuccess'
))
message
.
success
(
t
(
'common.createSuccess'
))
}
else
{
}
else
{
await
BusinessStatus
TypeApi
.
updateBusinessStatusType
(
data
)
await
BusinessStatus
Api
.
updateBusinessStatus
(
data
)
message
.
success
(
t
(
'common.updateSuccess'
))
message
.
success
(
t
(
'common.updateSuccess'
))
}
}
dialogVisible
.
value
=
false
dialogVisible
.
value
=
false
...
@@ -144,7 +155,7 @@ const resetForm = () => {
...
@@ -144,7 +155,7 @@ const resetForm = () => {
id
:
0
,
id
:
0
,
name
:
''
,
name
:
''
,
deptIds
:
[],
deptIds
:
[],
status
List
:
[]
status
es
:
[]
}
}
treeRef
.
value
?.
setCheckedNodes
([])
treeRef
.
value
?.
setCheckedNodes
([])
formRef
.
value
?.
resetFields
()
formRef
.
value
?.
resetFields
()
...
@@ -153,15 +164,15 @@ const resetForm = () => {
...
@@ -153,15 +164,15 @@ const resetForm = () => {
/** 添加状态 */
/** 添加状态 */
const
addStatusArea
=
()
=>
{
const
addStatusArea
=
()
=>
{
const
data
=
formData
.
value
const
data
=
formData
.
value
data
.
status
List
.
push
({
data
.
status
es
.
push
({
name
:
''
,
name
:
''
,
percent
:
''
percent
:
undefined
})
})
}
}
/** 删除状态 */
/** 删除状态 */
const
deleteStatusArea
=
(
index
:
number
)
=>
{
const
deleteStatusArea
=
(
index
:
number
)
=>
{
const
data
=
formData
.
value
const
data
=
formData
.
value
data
.
status
List
.
splice
(
index
,
1
)
data
.
status
es
.
splice
(
index
,
1
)
}
}
</
script
>
</
script
>
src/views/crm/business
StatusType
/index.vue
→
src/views/crm/business
/status
/index.vue
View file @
6baeadc8
...
@@ -9,25 +9,14 @@
...
@@ -9,25 +9,14 @@
label-width=
"68px"
label-width=
"68px"
>
>
<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
<el-button
type=
"primary"
type=
"primary"
plain
plain
@
click=
"openForm('create')"
@
click=
"openForm('create')"
v-hasPermi=
"['crm:business-status
-type
:create']"
v-hasPermi=
"['crm:business-status:create']"
>
>
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
</el-button>
</el-button>
<el-button
type=
"success"
plain
@
click=
"handleExport"
:loading=
"exportLoading"
v-hasPermi=
"['crm:business-status-type:export']"
>
<Icon
icon=
"ep:download"
class=
"mr-5px"
/>
导出
</el-button>
</el-form-item>
</el-form-item>
</el-form>
</el-form>
</ContentWrap>
</ContentWrap>
...
@@ -35,8 +24,15 @@
...
@@ -35,8 +24,15 @@
<!-- 列表 -->
<!-- 列表 -->
<ContentWrap>
<ContentWrap>
<el-table
v-loading=
"loading"
:data=
"list"
:stripe=
"true"
:show-overflow-tooltip=
"true"
>
<el-table
v-loading=
"loading"
:data=
"list"
:stripe=
"true"
:show-overflow-tooltip=
"true"
>
<el-table-column
label=
"状态类型名"
align=
"center"
prop=
"name"
/>
<el-table-column
label=
"状态组名"
align=
"center"
prop=
"name"
/>
<el-table-column
label=
"使用的部门"
align=
"center"
prop=
"deptNames"
/>
<el-table-column
label=
"应用部门"
align=
"center"
prop=
"deptNames"
>
<template
#
default=
"scope"
>
<span
v-if=
"scope.row?.deptNames?.length > 0"
>
{{
scope
.
row
.
deptNames
.
join
(
' '
)
}}
</span>
<span
v-else
>
全公司
</span>
</
template
>
</el-table-column>
<el-table-column
label=
"创建人"
align=
"center"
prop=
"creator"
/>
<el-table-column
label=
"创建人"
align=
"center"
prop=
"creator"
/>
<el-table-column
<el-table-column
label=
"创建时间"
label=
"创建时间"
...
@@ -51,7 +47,7 @@
...
@@ -51,7 +47,7 @@
link
link
type=
"primary"
type=
"primary"
@
click=
"openForm('update', scope.row.id)"
@
click=
"openForm('update', scope.row.id)"
v-hasPermi=
"['crm:business-status
-type
:update']"
v-hasPermi=
"['crm:business-status:update']"
>
>
编辑
编辑
</el-button>
</el-button>
...
@@ -59,7 +55,7 @@
...
@@ -59,7 +55,7 @@
link
link
type=
"danger"
type=
"danger"
@
click=
"handleDelete(scope.row.id)"
@
click=
"handleDelete(scope.row.id)"
v-hasPermi=
"['crm:business-status
-type
:delete']"
v-hasPermi=
"['crm:business-status:delete']"
>
>
删除
删除
</el-button>
</el-button>
...
@@ -76,16 +72,16 @@
...
@@ -76,16 +72,16 @@
</ContentWrap>
</ContentWrap>
<!-- 表单弹窗:添加/修改 -->
<!-- 表单弹窗:添加/修改 -->
<BusinessStatus
Type
Form
ref=
"formRef"
@
success=
"getList"
/>
<BusinessStatusForm
ref=
"formRef"
@
success=
"getList"
/>
</template>
</template>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
{
dateFormatter
}
from
'@/utils/formatTime'
import
{
dateFormatter
}
from
'@/utils/formatTime'
import
download
from
'@/utils/download'
import
download
from
'@/utils/download'
import
*
as
BusinessStatus
TypeApi
from
'@/api/crm/businessStatusType
'
import
*
as
BusinessStatus
Api
from
'@/api/crm/business/status
'
import
BusinessStatus
TypeForm
from
'./BusinessStatusType
Form.vue'
import
BusinessStatus
Form
from
'./BusinessStatus
Form.vue'
defineOptions
({
name
:
'
BusinessStatusType
'
})
defineOptions
({
name
:
'
CrmBusinessStatus
'
})
const
message
=
useMessage
()
// 消息弹窗
const
message
=
useMessage
()
// 消息弹窗
const
{
t
}
=
useI18n
()
// 国际化
const
{
t
}
=
useI18n
()
// 国际化
...
@@ -104,7 +100,7 @@ const exportLoading = ref(false) // 导出的加载中
...
@@ -104,7 +100,7 @@ const exportLoading = ref(false) // 导出的加载中
const
getList
=
async
()
=>
{
const
getList
=
async
()
=>
{
loading
.
value
=
true
loading
.
value
=
true
try
{
try
{
const
data
=
await
BusinessStatus
TypeApi
.
getBusinessStatusType
Page
(
queryParams
)
const
data
=
await
BusinessStatus
Api
.
getBusinessStatus
Page
(
queryParams
)
list
.
value
=
data
.
list
list
.
value
=
data
.
list
total
.
value
=
data
.
total
total
.
value
=
data
.
total
}
finally
{
}
finally
{
...
@@ -157,7 +153,7 @@ const handleExport = async () => {
...
@@ -157,7 +153,7 @@ const handleExport = async () => {
// 发起导出
// 发起导出
exportLoading
.
value
=
true
exportLoading
.
value
=
true
const
data
=
await
BusinessStatusTypeApi
.
exportBusinessStatusType
(
queryParams
)
const
data
=
await
BusinessStatusTypeApi
.
exportBusinessStatusType
(
queryParams
)
download
.
excel
(
data
,
'商机状态
类型
.xls'
)
download
.
excel
(
data
,
'商机状态
组
.xls'
)
}
catch
{
}
catch
{
}
finally
{
}
finally
{
exportLoading
.
value
=
false
exportLoading
.
value
=
false
...
...
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