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
b57a2c50
authored
Apr 03, 2024
by
scholar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
CRM员工业绩统计分析v2.0
parent
1a0f0a11
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
826 additions
and
0 deletions
+826
-0
src/api/crm/statistics/performance.ts
+33
-0
src/views/crm/statistics/performance/components/ContractCountPerformance.vue
+215
-0
src/views/crm/statistics/performance/components/ContractPricePerformance.vue
+215
-0
src/views/crm/statistics/performance/components/ReceivablePricePerformance.vue
+215
-0
src/views/crm/statistics/performance/index.vue
+148
-0
No files found.
src/api/crm/statistics/performance.ts
0 → 100644
View file @
b57a2c50
import
request
from
'@/config/axios'
export
interface
StatisticsPerformanceRespVO
{
time
:
string
currentMonthCount
:
number
lastMonthCount
:
number
lastYearCount
:
number
}
// 排行 API
export
const
StatisticsPerformanceApi
=
{
// 员工获得合同金额统计
getContractPricePerformance
:
(
params
:
any
)
=>
{
return
request
.
get
({
url
:
'/crm/statistics-performance/get-contract-price-performance'
,
params
})
},
// 员工获得回款统计
getReceivablePricePerformance
:
(
params
:
any
)
=>
{
return
request
.
get
({
url
:
'/crm/statistics-performance/get-receivable-price-performance'
,
params
})
},
//员工获得签约合同数量统计
getContractCountPerformance
:
(
params
:
any
)
=>
{
return
request
.
get
({
url
:
'/crm/statistics-performance/get-contract-count-performance'
,
params
})
}
}
src/views/crm/statistics/performance/components/ContractCountPerformance.vue
0 → 100644
View file @
b57a2c50
<!-- 客户总量统计 -->
<
template
>
<!-- Echarts图 -->
<el-card
shadow=
"never"
>
<el-skeleton
:loading=
"loading"
animated
>
<Echart
:height=
"500"
:options=
"echartsOption"
/>
</el-skeleton>
</el-card>
<!-- 统计列表 -->
<el-card
shadow=
"never"
class=
"mt-16px"
>
<el-table
v-loading=
"loading"
:data=
"tableData"
>
<el-table-column
v-for=
"item in columnsData"
:key=
"item.prop"
:label=
"item.label"
:prop=
"item.prop"
align=
"center"
>
<template
#
default=
"scope"
>
{{
scope
.
row
[
item
.
prop
]
}}
</
template
>
</el-table-column>
</el-table>
</el-card>
</template>
<
script
setup
lang=
"ts"
>
import
{
EChartsOption
}
from
'echarts'
import
{
StatisticsPerformanceApi
,
StatisticsPerformanceRespVO
}
from
"@/api/crm/statistics/performance"
defineOptions
({
name
:
'ContractCountPerformance'
})
const
props
=
defineProps
<
{
queryParams
:
any
}
>
()
// 搜索参数
const
loading
=
ref
(
false
)
// 加载中
const
list
=
ref
<
StatisticsPerformanceRespVO
[]
>
([])
// 列表的数据
/** 柱状图配置:纵向 */
const
echartsOption
=
reactive
<
EChartsOption
>
({
grid
:
{
left
:
20
,
right
:
20
,
bottom
:
20
,
containLabel
:
true
},
legend
:
{},
series
:
[
{
name
:
'当月合同数量(个)'
,
type
:
'line'
,
data
:
[]
},
{
name
:
'上月合同数量(个)'
,
type
:
'line'
,
data
:
[]
},
{
name
:
'去年同月合同数量(个)'
,
type
:
'line'
,
data
:
[]
},
{
name
:
'同比增长率(%)'
,
type
:
'line'
,
yAxisIndex
:
1
,
data
:
[]
},
{
name
:
'环比增长率(%)'
,
type
:
'line'
,
yAxisIndex
:
1
,
data
:
[]
}
],
toolbox
:
{
feature
:
{
dataZoom
:
{
xAxisIndex
:
false
// 数据区域缩放:Y 轴不缩放
},
brush
:
{
type
:
[
'lineX'
,
'clear'
]
// 区域缩放按钮、还原按钮
},
saveAsImage
:
{
show
:
true
,
name
:
'客户总量分析'
}
// 保存为图片
}
},
tooltip
:
{
trigger
:
'axis'
,
axisPointer
:
{
type
:
'shadow'
}
},
yAxis
:
[{
type
:
'value'
,
name
:
'数量(个)'
,
axisTick
:
{
show
:
false
},
axisLabel
:
{
color
:
'#BDBDBD'
,
formatter
:
'{value}'
},
/** 坐标轴轴线相关设置 */
axisLine
:
{
lineStyle
:
{
color
:
'#BDBDBD'
}
},
splitLine
:
{
show
:
true
,
lineStyle
:
{
color
:
'#e6e6e6'
}
}
},
{
type
:
'value'
,
name
:
''
,
axisTick
:
{
alignWithLabel
:
true
,
lineStyle
:
{
width
:
0
}
},
axisLabel
:
{
color
:
'#BDBDBD'
,
formatter
:
'{value}%'
},
/** 坐标轴轴线相关设置 */
axisLine
:
{
lineStyle
:
{
color
:
'#BDBDBD'
}
},
splitLine
:
{
show
:
true
,
lineStyle
:
{
color
:
'#e6e6e6'
}
}
}],
xAxis
:
{
type
:
'category'
,
name
:
'日期'
,
data
:
[]
}
})
as
EChartsOption
/** 获取统计数据 */
const
loadData
=
async
()
=>
{
// 1. 加载统计数据
loading
.
value
=
true
const
performanceList
=
await
StatisticsPerformanceApi
.
getContractCountPerformance
(
props
.
queryParams
)
// 2.1 更新 Echarts 数据
if
(
echartsOption
.
xAxis
&&
echartsOption
.
xAxis
[
'data'
])
{
echartsOption
.
xAxis
[
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
time
)
}
if
(
echartsOption
.
series
&&
echartsOption
.
series
[
0
]
&&
echartsOption
.
series
[
0
][
'data'
])
{
echartsOption
.
series
[
0
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
currentMonthCount
)
}
if
(
echartsOption
.
series
&&
echartsOption
.
series
[
1
]
&&
echartsOption
.
series
[
1
][
'data'
])
{
echartsOption
.
series
[
1
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
lastMonthCount
)
echartsOption
.
series
[
3
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
lastMonthCount
!==
0
?
(
s
.
currentMonthCount
/
s
.
lastMonthCount
*
100
).
toFixed
(
2
)
:
'NULL'
)
}
if
(
echartsOption
.
series
&&
echartsOption
.
series
[
2
]
&&
echartsOption
.
series
[
2
][
'data'
])
{
echartsOption
.
series
[
2
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
lastYearCount
)
echartsOption
.
series
[
4
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
lastYearCount
!==
0
?
(
s
.
currentMonthCount
/
s
.
lastYearCount
*
100
).
toFixed
(
2
)
:
'NULL'
)
}
// 2.2 更新列表数据
list
.
value
=
performanceList
loading
.
value
=
false
}
// 初始化数据
const
columnsData
=
reactive
([]);
const
tableData
=
reactive
([{
title
:
'当月合同数量统计(个)'
},
{
title
:
'上月合同数量统计(个)'
},
{
title
:
'去年当月合同数量统计(个)'
},
{
title
:
'同比增长率(%)'
},
{
title
:
'环比增长率(%)'
}])
// 定义 init 方法
const
init
=
()
=>
{
const
columnObj
=
{
label
:
'日期'
,
prop
:
'title'
}
columnsData
.
push
(
columnObj
)
list
.
value
.
forEach
((
item
,
index
)
=>
{
const
columnObj
=
{
label
:
item
.
time
,
prop
:
'prop'
+
index
}
columnsData
.
push
(
columnObj
)
tableData
[
0
][
'prop'
+
index
]
=
item
.
currentMonthCount
tableData
[
1
][
'prop'
+
index
]
=
item
.
lastMonthCount
tableData
[
2
][
'prop'
+
index
]
=
item
.
lastYearCount
tableData
[
3
][
'prop'
+
index
]
=
item
.
lastYearCount
!==
0
?
(
item
.
currentMonthCount
/
item
.
lastYearCount
).
toFixed
(
2
)
:
'NULL'
tableData
[
4
][
'prop'
+
index
]
=
item
.
lastMonthCount
!==
0
?
(
item
.
currentMonthCount
/
item
.
lastMonthCount
).
toFixed
(
2
)
:
'NULL'
})
}
defineExpose
({
loadData
})
/** 初始化 */
onMounted
(
async
()
=>
{
await
loadData
()
init
()
})
</
script
>
src/views/crm/statistics/performance/components/ContractPricePerformance.vue
0 → 100644
View file @
b57a2c50
<!-- 客户总量统计 -->
<
template
>
<!-- Echarts图 -->
<el-card
shadow=
"never"
>
<el-skeleton
:loading=
"loading"
animated
>
<Echart
:height=
"500"
:options=
"echartsOption"
/>
</el-skeleton>
</el-card>
<!-- 统计列表 -->
<el-card
shadow=
"never"
class=
"mt-16px"
>
<el-table
v-loading=
"loading"
:data=
"tableData"
>
<el-table-column
v-for=
"item in columnsData"
:key=
"item.prop"
:label=
"item.label"
:prop=
"item.prop"
align=
"center"
>
<template
#
default=
"scope"
>
{{
scope
.
row
[
item
.
prop
]
}}
</
template
>
</el-table-column>
</el-table>
</el-card>
</template>
<
script
setup
lang=
"ts"
>
import
{
EChartsOption
}
from
'echarts'
import
{
StatisticsPerformanceApi
,
StatisticsPerformanceRespVO
}
from
"@/api/crm/statistics/performance"
defineOptions
({
name
:
'ContractPricePerformance'
})
const
props
=
defineProps
<
{
queryParams
:
any
}
>
()
// 搜索参数
const
loading
=
ref
(
false
)
// 加载中
const
list
=
ref
<
StatisticsPerformanceRespVO
[]
>
([])
// 列表的数据
/** 柱状图配置:纵向 */
const
echartsOption
=
reactive
<
EChartsOption
>
({
grid
:
{
left
:
20
,
right
:
20
,
bottom
:
20
,
containLabel
:
true
},
legend
:
{},
series
:
[
{
name
:
'当月合同金额(元)'
,
type
:
'line'
,
data
:
[]
},
{
name
:
'上月合同金额(元)'
,
type
:
'line'
,
data
:
[]
},
{
name
:
'去年同月合同金额(元)'
,
type
:
'line'
,
data
:
[]
},
{
name
:
'同比增长率(%)'
,
type
:
'line'
,
yAxisIndex
:
1
,
data
:
[]
},
{
name
:
'环比增长率(%)'
,
type
:
'line'
,
yAxisIndex
:
1
,
data
:
[]
}
],
toolbox
:
{
feature
:
{
dataZoom
:
{
xAxisIndex
:
false
// 数据区域缩放:Y 轴不缩放
},
brush
:
{
type
:
[
'lineX'
,
'clear'
]
// 区域缩放按钮、还原按钮
},
saveAsImage
:
{
show
:
true
,
name
:
'客户总量分析'
}
// 保存为图片
}
},
tooltip
:
{
trigger
:
'axis'
,
axisPointer
:
{
type
:
'shadow'
}
},
yAxis
:
[{
type
:
'value'
,
name
:
'金额(元)'
,
axisTick
:
{
show
:
false
},
axisLabel
:
{
color
:
'#BDBDBD'
,
formatter
:
'{value}'
},
/** 坐标轴轴线相关设置 */
axisLine
:
{
lineStyle
:
{
color
:
'#BDBDBD'
}
},
splitLine
:
{
show
:
true
,
lineStyle
:
{
color
:
'#e6e6e6'
}
}
},
{
type
:
'value'
,
name
:
''
,
axisTick
:
{
alignWithLabel
:
true
,
lineStyle
:
{
width
:
0
}
},
axisLabel
:
{
color
:
'#BDBDBD'
,
formatter
:
'{value}%'
},
/** 坐标轴轴线相关设置 */
axisLine
:
{
lineStyle
:
{
color
:
'#BDBDBD'
}
},
splitLine
:
{
show
:
true
,
lineStyle
:
{
color
:
'#e6e6e6'
}
}
}],
xAxis
:
{
type
:
'category'
,
name
:
'日期'
,
data
:
[]
}
})
as
EChartsOption
/** 获取统计数据 */
const
loadData
=
async
()
=>
{
// 1. 加载统计数据
loading
.
value
=
true
const
performanceList
=
await
StatisticsPerformanceApi
.
getContractPricePerformance
(
props
.
queryParams
)
// 2.1 更新 Echarts 数据
if
(
echartsOption
.
xAxis
&&
echartsOption
.
xAxis
[
'data'
])
{
echartsOption
.
xAxis
[
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
time
)
}
if
(
echartsOption
.
series
&&
echartsOption
.
series
[
0
]
&&
echartsOption
.
series
[
0
][
'data'
])
{
echartsOption
.
series
[
0
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
currentMonthCount
)
}
if
(
echartsOption
.
series
&&
echartsOption
.
series
[
1
]
&&
echartsOption
.
series
[
1
][
'data'
])
{
echartsOption
.
series
[
1
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
lastMonthCount
)
echartsOption
.
series
[
3
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
lastMonthCount
!==
0
?
(
s
.
currentMonthCount
/
s
.
lastMonthCount
*
100
).
toFixed
(
2
)
:
'NULL'
)
}
if
(
echartsOption
.
series
&&
echartsOption
.
series
[
2
]
&&
echartsOption
.
series
[
2
][
'data'
])
{
echartsOption
.
series
[
2
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
lastYearCount
)
echartsOption
.
series
[
4
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
lastYearCount
!==
0
?
(
s
.
currentMonthCount
/
s
.
lastYearCount
*
100
).
toFixed
(
2
)
:
'NULL'
)
}
// 2.2 更新列表数据
list
.
value
=
performanceList
loading
.
value
=
false
}
// 初始化数据
const
columnsData
=
reactive
([]);
const
tableData
=
reactive
([{
title
:
'当月合同金额统计(元)'
},
{
title
:
'上月合同金额统计(元)'
},
{
title
:
'去年当月合同金额统计(元)'
},
{
title
:
'同比增长率(%)'
},
{
title
:
'环比增长率(%)'
}])
// 定义 init 方法
const
init
=
()
=>
{
const
columnObj
=
{
label
:
'日期'
,
prop
:
'title'
}
columnsData
.
push
(
columnObj
)
list
.
value
.
forEach
((
item
,
index
)
=>
{
const
columnObj
=
{
label
:
item
.
time
,
prop
:
'prop'
+
index
}
columnsData
.
push
(
columnObj
)
tableData
[
0
][
'prop'
+
index
]
=
item
.
currentMonthCount
tableData
[
1
][
'prop'
+
index
]
=
item
.
lastMonthCount
tableData
[
2
][
'prop'
+
index
]
=
item
.
lastYearCount
tableData
[
3
][
'prop'
+
index
]
=
item
.
lastYearCount
!==
0
?
(
item
.
currentMonthCount
/
item
.
lastYearCount
).
toFixed
(
2
)
:
'NULL'
tableData
[
4
][
'prop'
+
index
]
=
item
.
lastMonthCount
!==
0
?
(
item
.
currentMonthCount
/
item
.
lastMonthCount
).
toFixed
(
2
)
:
'NULL'
})
}
defineExpose
({
loadData
})
/** 初始化 */
onMounted
(
async
()
=>
{
await
loadData
()
init
()
})
</
script
>
src/views/crm/statistics/performance/components/ReceivablePricePerformance.vue
0 → 100644
View file @
b57a2c50
<!-- 客户总量统计 -->
<
template
>
<!-- Echarts图 -->
<el-card
shadow=
"never"
>
<el-skeleton
:loading=
"loading"
animated
>
<Echart
:height=
"500"
:options=
"echartsOption"
/>
</el-skeleton>
</el-card>
<!-- 统计列表 -->
<el-card
shadow=
"never"
class=
"mt-16px"
>
<el-table
v-loading=
"loading"
:data=
"tableData"
>
<el-table-column
v-for=
"item in columnsData"
:key=
"item.prop"
:label=
"item.label"
:prop=
"item.prop"
align=
"center"
>
<template
#
default=
"scope"
>
{{
scope
.
row
[
item
.
prop
]
}}
</
template
>
</el-table-column>
</el-table>
</el-card>
</template>
<
script
setup
lang=
"ts"
>
import
{
EChartsOption
}
from
'echarts'
import
{
StatisticsPerformanceApi
,
StatisticsPerformanceRespVO
}
from
"@/api/crm/statistics/performance"
defineOptions
({
name
:
'ContractPricePerformance'
})
const
props
=
defineProps
<
{
queryParams
:
any
}
>
()
// 搜索参数
const
loading
=
ref
(
false
)
// 加载中
const
list
=
ref
<
StatisticsPerformanceRespVO
[]
>
([])
// 列表的数据
/** 柱状图配置:纵向 */
const
echartsOption
=
reactive
<
EChartsOption
>
({
grid
:
{
left
:
20
,
right
:
20
,
bottom
:
20
,
containLabel
:
true
},
legend
:
{},
series
:
[
{
name
:
'当月回款金额(元)'
,
type
:
'line'
,
data
:
[]
},
{
name
:
'上月回款金额(元)'
,
type
:
'line'
,
data
:
[]
},
{
name
:
'去年同月回款金额(元)'
,
type
:
'line'
,
data
:
[]
},
{
name
:
'同比增长率(%)'
,
type
:
'line'
,
yAxisIndex
:
1
,
data
:
[]
},
{
name
:
'环比增长率(%)'
,
type
:
'line'
,
yAxisIndex
:
1
,
data
:
[]
}
],
toolbox
:
{
feature
:
{
dataZoom
:
{
xAxisIndex
:
false
// 数据区域缩放:Y 轴不缩放
},
brush
:
{
type
:
[
'lineX'
,
'clear'
]
// 区域缩放按钮、还原按钮
},
saveAsImage
:
{
show
:
true
,
name
:
'客户总量分析'
}
// 保存为图片
}
},
tooltip
:
{
trigger
:
'axis'
,
axisPointer
:
{
type
:
'shadow'
}
},
yAxis
:
[{
type
:
'value'
,
name
:
'金额(元)'
,
axisTick
:
{
show
:
false
},
axisLabel
:
{
color
:
'#BDBDBD'
,
formatter
:
'{value}'
},
/** 坐标轴轴线相关设置 */
axisLine
:
{
lineStyle
:
{
color
:
'#BDBDBD'
}
},
splitLine
:
{
show
:
true
,
lineStyle
:
{
color
:
'#e6e6e6'
}
}
},
{
type
:
'value'
,
name
:
''
,
axisTick
:
{
alignWithLabel
:
true
,
lineStyle
:
{
width
:
0
}
},
axisLabel
:
{
color
:
'#BDBDBD'
,
formatter
:
'{value}%'
},
/** 坐标轴轴线相关设置 */
axisLine
:
{
lineStyle
:
{
color
:
'#BDBDBD'
}
},
splitLine
:
{
show
:
true
,
lineStyle
:
{
color
:
'#e6e6e6'
}
}
}],
xAxis
:
{
type
:
'category'
,
name
:
'日期'
,
data
:
[]
}
})
as
EChartsOption
/** 获取统计数据 */
const
loadData
=
async
()
=>
{
// 1. 加载统计数据
loading
.
value
=
true
const
performanceList
=
await
StatisticsPerformanceApi
.
getReceivablePricePerformance
(
props
.
queryParams
)
// 2.1 更新 Echarts 数据
if
(
echartsOption
.
xAxis
&&
echartsOption
.
xAxis
[
'data'
])
{
echartsOption
.
xAxis
[
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
time
)
}
if
(
echartsOption
.
series
&&
echartsOption
.
series
[
0
]
&&
echartsOption
.
series
[
0
][
'data'
])
{
echartsOption
.
series
[
0
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
currentMonthCount
)
}
if
(
echartsOption
.
series
&&
echartsOption
.
series
[
1
]
&&
echartsOption
.
series
[
1
][
'data'
])
{
echartsOption
.
series
[
1
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
lastMonthCount
)
echartsOption
.
series
[
3
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
lastMonthCount
!==
0
?
(
s
.
currentMonthCount
/
s
.
lastMonthCount
*
100
).
toFixed
(
2
)
:
'NULL'
)
}
if
(
echartsOption
.
series
&&
echartsOption
.
series
[
2
]
&&
echartsOption
.
series
[
1
][
'data'
])
{
echartsOption
.
series
[
2
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
lastYearCount
)
echartsOption
.
series
[
4
][
'data'
]
=
performanceList
.
map
(
(
s
:
StatisticsPerformanceRespVO
)
=>
s
.
lastYearCount
!==
0
?
(
s
.
currentMonthCount
/
s
.
lastYearCount
*
100
).
toFixed
(
2
)
:
'NULL'
)
}
// 2.2 更新列表数据
list
.
value
=
performanceList
loading
.
value
=
false
}
// 初始化数据
const
columnsData
=
reactive
([]);
const
tableData
=
reactive
([{
title
:
'当月回款金额统计(元)'
},
{
title
:
'上月回款金额统计(元)'
},
{
title
:
'去年当月回款金额统计(元)'
},
{
title
:
'同比增长率(%)'
},
{
title
:
'环比增长率(%)'
}]);
// 定义 init 方法
const
init
=
()
=>
{
const
columnObj
=
{
label
:
'日期'
,
prop
:
'title'
}
columnsData
.
push
(
columnObj
)
list
.
value
.
forEach
((
item
,
index
)
=>
{
const
columnObj
=
{
label
:
item
.
time
,
prop
:
'prop'
+
index
}
columnsData
.
push
(
columnObj
)
tableData
[
0
][
'prop'
+
index
]
=
item
.
currentMonthCount
tableData
[
1
][
'prop'
+
index
]
=
item
.
lastMonthCount
tableData
[
2
][
'prop'
+
index
]
=
item
.
lastYearCount
tableData
[
3
][
'prop'
+
index
]
=
item
.
lastYearCount
!==
0
?
(
item
.
currentMonthCount
/
item
.
lastYearCount
).
toFixed
(
2
)
:
'NULL'
tableData
[
4
][
'prop'
+
index
]
=
item
.
lastMonthCount
!==
0
?
(
item
.
currentMonthCount
/
item
.
lastMonthCount
).
toFixed
(
2
)
:
'NULL'
})
}
defineExpose
({
loadData
})
/** 初始化 */
onMounted
(
async
()
=>
{
await
loadData
()
init
()
})
</
script
>
src/views/crm/statistics/performance/index.vue
0 → 100644
View file @
b57a2c50
<!-- 数据统计 - 员工客户分析 -->
<
template
>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class=
"-mb-15px"
:model=
"queryParams"
ref=
"queryFormRef"
:inline=
"true"
label-width=
"68px"
>
<el-form-item
label=
"时间范围"
prop=
"orderDate"
>
<el-date-picker
v-model=
"queryParams.times"
:shortcuts=
"defaultShortcuts"
class=
"!w-240px"
end-placeholder=
"结束日期"
start-placeholder=
"开始日期"
type=
"daterange"
value-format=
"YYYY-MM-DD HH:mm:ss"
:default-time=
"[new Date('1 00:00:00'), new Date('1 23:59:59')]"
/>
</el-form-item>
<el-form-item
label=
"归属部门"
prop=
"deptId"
>
<el-tree-select
v-model=
"queryParams.deptId"
class=
"!w-240px"
:data=
"deptList"
:props=
"defaultProps"
check-strictly
node-key=
"id"
placeholder=
"请选择归属部门"
@
change=
"queryParams.userId = undefined"
/>
</el-form-item>
<el-form-item
label=
"员工"
prop=
"userId"
>
<el-select
v-model=
"queryParams.userId"
class=
"!w-240px"
placeholder=
"员工"
clearable
>
<el-option
v-for=
"(user, index) in userListByDeptId"
:label=
"user.nickname"
:value=
"user.id"
:key=
"index"
/>
</el-select>
</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-form-item>
</el-form>
</ContentWrap>
<!-- 员工业绩统计 -->
<el-col>
<el-tabs
v-model=
"activeTab"
>
<!-- 员工合同统计 -->
<el-tab-pane
label=
"员工合同数量统计"
name=
"ContractCountPerformance"
lazy
>
<ContractCountPerformance
:query-params=
"queryParams"
ref=
"ContractCountPerformanceRef"
/>
</el-tab-pane>
<!-- 员工合同金额统计 -->
<el-tab-pane
label=
"员工合同金额统计"
name=
"ContractPricePerformance"
lazy
>
<ContractPricePerformance
:query-params=
"queryParams"
ref=
"ContractPricePerformanceRef"
/>
</el-tab-pane>
<!-- 员工回款金额统计 -->
<el-tab-pane
label=
"员工回款金额统计"
name=
"followupType"
lazy
>
<ReceivablePricePerformance
:query-params=
"queryParams"
ref=
"ReceivablePricePerformanceRef"
/>
</el-tab-pane>
</el-tabs>
</el-col>
</
template
>
<
script
lang=
"ts"
setup
>
import
*
as
DeptApi
from
'@/api/system/dept'
import
*
as
UserApi
from
'@/api/system/user'
import
{
useUserStore
}
from
'@/store/modules/user'
import
{
beginOfDay
,
defaultShortcuts
,
endOfDay
,
formatDate
}
from
'@/utils/formatTime'
import
{
defaultProps
,
handleTree
}
from
'@/utils/tree'
import
ContractCountPerformance
from
'./components/ContractCountPerformance.vue'
import
ContractPricePerformance
from
'./components/ContractPricePerformance.vue'
import
ReceivablePricePerformance
from
'./components/ReceivablePricePerformance.vue'
import
CustomerFollowupType
from
'./components/CustomerFollowupType.vue'
import
CustomerConversionStat
from
'./components/CustomerConversionStat.vue'
import
CustomerDealCycle
from
'./components/CustomerDealCycle.vue'
defineOptions
({
name
:
'CrmStatisticsCustomer'
})
const
queryParams
=
reactive
({
deptId
:
useUserStore
().
getUser
.
deptId
,
userId
:
undefined
,
times
:
[
// 默认显示最近一周的数据
formatDate
(
beginOfDay
(
new
Date
(
new
Date
().
getTime
()
-
3600
*
1000
*
24
*
7
))),
formatDate
(
endOfDay
(
new
Date
(
new
Date
().
getTime
()
-
3600
*
1000
*
24
)))
]
})
const
queryFormRef
=
ref
()
// 搜索的表单
const
deptList
=
ref
<
Tree
[]
>
([])
// 部门树形结构
const
userList
=
ref
<
UserApi
.
UserVO
[]
>
([])
// 全量用户清单
// 根据选择的部门筛选员工清单
const
userListByDeptId
=
computed
(()
=>
queryParams
.
deptId
?
userList
.
value
.
filter
((
u
:
UserApi
.
UserVO
)
=>
u
.
deptId
===
queryParams
.
deptId
)
:
[]
)
// 活跃标签
const
activeTab
=
ref
(
'ContractCountPerformance'
)
// 1.员工合同数量统计
const
ContractCountPerformanceRef
=
ref
()
// 2.员工合同金额统计
const
ContractPricePerformanceRef
=
ref
()
// 3.员工回款金额统计
const
ReceivablePricePerformanceRef
=
ref
()
/** 搜索按钮操作 */
const
handleQuery
=
()
=>
{
switch
(
activeTab
.
value
)
{
case
'ContractCountPerformance'
:
ContractCountPerformanceRef
.
value
?.
loadData
?.()
break
case
'ContractPricePerformance'
:
ContractPricePerformanceRef
.
value
?.
loadData
?.()
break
case
'ReceivablePricePerformance'
:
ReceivablePricePerformanceRef
.
value
?.
loadData
?.()
break
}
}
// 当 activeTab 改变时,刷新当前活动的 tab
watch
(
activeTab
,
()
=>
{
handleQuery
()
})
/** 重置按钮操作 */
const
resetQuery
=
()
=>
{
queryFormRef
.
value
.
resetFields
()
handleQuery
()
}
// 加载部门树
onMounted
(
async
()
=>
{
deptList
.
value
=
handleTree
(
await
DeptApi
.
getSimpleDeptList
())
userList
.
value
=
handleTree
(
await
UserApi
.
getSimpleUserList
())
})
</
script
>
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