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
00762362
authored
Apr 25, 2024
by
puhui999
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'refs/remotes/yudao/dev' into dev-crm
parents
ae53ca6f
f55c9b72
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
58 additions
and
55 deletions
+58
-55
.env.dev
+0
-3
.env.local-dev
+0
-3
.env.prod
+0
-3
.env.stage
+0
-3
.env.test
+0
-3
src/views/crm/statistics/performance/components/ContractCountPerformance.vue
+9
-7
src/views/crm/statistics/performance/components/ContractPricePerformance.vue
+8
-6
src/views/crm/statistics/performance/components/ReceivablePricePerformance.vue
+12
-7
src/views/crm/statistics/performance/index.vue
+25
-15
src/views/mp/components/wx-reply/components/TabImage.vue
+1
-1
src/views/mp/components/wx-reply/components/TabMusic.vue
+1
-1
src/views/mp/components/wx-reply/components/TabVideo.vue
+1
-1
src/views/mp/components/wx-reply/components/TabVoice.vue
+1
-1
types/env.d.ts
+0
-1
No files found.
.env.dev
View file @
00762362
...
...
@@ -12,9 +12,6 @@ VITE_UPLOAD_TYPE=server
# 上传路径
VITE_UPLOAD_URL='http://api-dashboard.yudao.iocoder.cn/admin-api/infra/file/upload'
# 接口前缀
VITE_API_BASEPATH=/dev-api
# 接口地址
VITE_API_URL=/admin-api
...
...
.env.local-dev
View file @
00762362
...
...
@@ -11,9 +11,6 @@ VITE_UPLOAD_TYPE=server
# 上传路径
VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
# 接口前缀
VITE_API_BASEPATH=/dev-api
# 接口地址
VITE_API_URL=/admin-api
...
...
.env.prod
View file @
00762362
...
...
@@ -11,9 +11,6 @@ VITE_UPLOAD_TYPE=server
# 上传路径
VITE_UPLOAD_URL='http://localhost:48080/admin-api/infra/file/upload'
# 接口前缀
VITE_API_BASEPATH=
# 接口地址
VITE_API_URL=/admin-api
...
...
.env.stage
View file @
00762362
...
...
@@ -11,9 +11,6 @@ VITE_UPLOAD_TYPE=server
# 上传路径
VITE_UPLOAD_URL='http://api-dashboard.yudao.iocoder.cn/admin-api/infra/file/upload'
# 接口前缀
VITE_API_BASEPATH=
# 接口地址
VITE_API_URL=/admin-api
...
...
.env.test
View file @
00762362
...
...
@@ -11,9 +11,6 @@ VITE_UPLOAD_TYPE=server
# 上传路径
VITE_UPLOAD_URL
=
'http://localhost:48080/admin-api/infra/file/upload'
# 接口前缀
VITE_API_BASEPATH
=
# 接口地址
VITE_API_URL
=/
admin
-
api
...
...
src/views/crm/statistics/performance/components/ContractCountPerformance.vue
View file @
00762362
<!-- 客户总量统计 -->
<!-- 员工业绩统计 -->
<!-- TODO @scholar:参考 ReceivablePricePerformance 建议改 -->
<
template
>
<!-- Echarts图 -->
<el-card
shadow=
"never"
>
...
...
@@ -7,7 +8,7 @@
</el-skeleton>
</el-card>
<!-- 统计列表
TODO @scholar:统计列表的展示不对
-->
<!-- 统计列表 -->
<el-card
shadow=
"never"
class=
"mt-16px"
>
<el-table
v-loading=
"loading"
:data=
"tableData"
>
<el-table-column
...
...
@@ -186,6 +187,7 @@ const loadData = async () => {
// 2.2 更新列表数据
list
.
value
=
performanceList
convertListData
()
loading
.
value
=
false
}
...
...
@@ -199,9 +201,10 @@ const tableData = reactive([
{
title
:
'环比增长率(%)'
}
])
// 定义
init 方法
const
init
=
()
=>
{
// 定义
convertListData 方法,数据行列转置,展示每月数据
const
convertListData
=
()
=>
{
const
columnObj
=
{
label
:
'日期'
,
prop
:
'title'
}
columnsData
.
splice
(
0
,
columnsData
.
length
)
//清空数组
columnsData
.
push
(
columnObj
)
list
.
value
.
forEach
((
item
,
index
)
=>
{
...
...
@@ -211,9 +214,9 @@ const init = () => {
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'
tableData
[
4
][
'prop'
+
index
]
=
item
.
lastYearCount
!==
0
?
(
item
.
currentMonthCount
/
item
.
lastYearCount
).
toFixed
(
2
)
:
'NULL'
})
}
...
...
@@ -222,6 +225,5 @@ defineExpose({ loadData })
/** 初始化 */
onMounted
(
async
()
=>
{
await
loadData
()
init
()
})
</
script
>
src/views/crm/statistics/performance/components/ContractPricePerformance.vue
View file @
00762362
<!-- 客户总量统计 -->
<!-- 员工业绩统计 -->
<!-- TODO @scholar:参考 ReceivablePricePerformance 建议改 -->
<
template
>
<!-- Echarts图 -->
<el-card
shadow=
"never"
>
...
...
@@ -7,7 +8,7 @@
</el-skeleton>
</el-card>
<!-- 统计列表
TODO @scholar:统计列表的展示不对
-->
<!-- 统计列表 -->
<el-card
shadow=
"never"
class=
"mt-16px"
>
<el-table
v-loading=
"loading"
:data=
"tableData"
>
<el-table-column
...
...
@@ -186,6 +187,7 @@ const loadData = async () => {
// 2.2 更新列表数据
list
.
value
=
performanceList
convertListData
()
loading
.
value
=
false
}
...
...
@@ -200,8 +202,9 @@ const tableData = reactive([
])
// 定义 init 方法
const
init
=
()
=>
{
const
convertListData
=
()
=>
{
const
columnObj
=
{
label
:
'日期'
,
prop
:
'title'
}
columnsData
.
splice
(
0
,
columnsData
.
length
)
//清空数组
columnsData
.
push
(
columnObj
)
list
.
value
.
forEach
((
item
,
index
)
=>
{
...
...
@@ -211,9 +214,9 @@ const init = () => {
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'
tableData
[
4
][
'prop'
+
index
]
=
item
.
lastYearCount
!==
0
?
(
item
.
currentMonthCount
/
item
.
lastYearCount
).
toFixed
(
2
)
:
'NULL'
})
}
...
...
@@ -222,6 +225,5 @@ defineExpose({ loadData })
/** 初始化 */
onMounted
(
async
()
=>
{
await
loadData
()
init
()
})
</
script
>
src/views/crm/statistics/performance/components/ReceivablePricePerformance.vue
View file @
00762362
<!--
客户总量
统计 -->
<!--
员工业绩
统计 -->
<
template
>
<!-- Echarts图 -->
<el-card
shadow=
"never"
>
...
...
@@ -7,7 +7,7 @@
</el-skeleton>
</el-card>
<!-- 统计列表
TODO @scholar:统计列表的展示不对
-->
<!-- 统计列表 -->
<el-card
shadow=
"never"
class=
"mt-16px"
>
<el-table
v-loading=
"loading"
:data=
"tableData"
>
<el-table-column
...
...
@@ -17,6 +17,7 @@
:prop=
"item.prop"
align=
"center"
>
<!-- TODO @scholar:IDEA 爆红的处理 -->
<template
#
default=
"scope"
>
{{
scope
.
row
[
item
.
prop
]
}}
</
template
>
...
...
@@ -120,6 +121,7 @@ const echartsOption = reactive<EChartsOption>({
type
:
'value'
,
name
:
''
,
axisTick
:
{
// TODO @scholar:IDEA 爆红的处理
alignWithLabel
:
true
,
lineStyle
:
{
width
:
0
...
...
@@ -186,11 +188,13 @@ const loadData = async () => {
// 2.2 更新列表数据
list
.
value
=
performanceList
convertListData
()
loading
.
value
=
false
}
// 初始化数据
const
columnsData
=
reactive
([])
// TODO @scholar:加个 as any[],避免 idea 爆红
const
columnsData
=
reactive
([]
as
any
[])
const
tableData
=
reactive
([
{
title
:
'当月回款金额统计(元)'
},
{
title
:
'上月回款金额统计(元)'
},
...
...
@@ -200,8 +204,9 @@ const tableData = reactive([
])
// 定义 init 方法
const
init
=
()
=>
{
const
convertListData
=
()
=>
{
const
columnObj
=
{
label
:
'日期'
,
prop
:
'title'
}
columnsData
.
splice
(
0
,
columnsData
.
length
)
//清空数组
columnsData
.
push
(
columnObj
)
list
.
value
.
forEach
((
item
,
index
)
=>
{
...
...
@@ -210,10 +215,11 @@ const init = () => {
tableData
[
0
][
'prop'
+
index
]
=
item
.
currentMonthCount
tableData
[
1
][
'prop'
+
index
]
=
item
.
lastMonthCount
tableData
[
2
][
'prop'
+
index
]
=
item
.
lastYearCount
// TODO @scholar:百分比,使用 erpCalculatePercentage 直接计算;如果是 0,则返回 0,统一就好哈;
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'
tableData
[
4
][
'prop'
+
index
]
=
item
.
lastYearCount
!==
0
?
(
item
.
currentMonthCount
/
item
.
lastYearCount
).
toFixed
(
2
)
:
'NULL'
})
}
...
...
@@ -222,6 +228,5 @@ defineExpose({ loadData })
/** 初始化 */
onMounted
(
async
()
=>
{
await
loadData
()
init
()
})
</
script
>
src/views/crm/statistics/performance/index.vue
View file @
00762362
<!-- 数据统计 - 员工
客户
分析 -->
<!-- 数据统计 - 员工
业绩
分析 -->
<
template
>
<ContentWrap>
<!-- 搜索工作栏 -->
...
...
@@ -9,16 +9,13 @@
:inline=
"true"
label-width=
"68px"
>
<el-form-item
label=
"
时间范围
"
prop=
"orderDate"
>
<el-form-item
label=
"
选择年份
"
prop=
"orderDate"
>
<el-date-picker
v-model=
"queryParams.times"
:shortcuts=
"defaultShortcuts"
v-model=
"queryParams.times[0]"
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')]"
type=
"year"
value-format=
"YYYY"
:default-time=
"[new Date().getFullYear()]"
/>
</el-form-item>
<el-form-item
label=
"归属部门"
prop=
"deptId"
>
...
...
@@ -62,7 +59,7 @@
<ContractPricePerformance
:query-params=
"queryParams"
ref=
"ContractPricePerformanceRef"
/>
</el-tab-pane>
<!-- 员工回款金额统计 -->
<el-tab-pane
label=
"员工回款金额统计"
name=
"
followupTyp
e"
lazy
>
<el-tab-pane
label=
"员工回款金额统计"
name=
"
ReceivablePricePerformanc
e"
lazy
>
<ReceivablePricePerformance
:query-params=
"queryParams"
ref=
"ReceivablePricePerformanceRef"
...
...
@@ -76,21 +73,20 @@
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
{
beginOfDay
,
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'
defineOptions
({
name
:
'CrmStatistics
Performance
'
})
defineOptions
({
name
:
'CrmStatistics
Customer
'
})
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
)))
// 默认显示当年的数据
formatDate
(
beginOfDay
(
new
Date
(
new
Date
().
getTime
()
-
3600
*
1000
*
24
*
7
)))
]
})
...
...
@@ -104,6 +100,7 @@ const userListByDeptId = computed(() =>
:
[]
)
// TODO @scholar:改成尾注释,保证 vue 内容短一点;变量名小写
// 活跃标签
const
activeTab
=
ref
(
'ContractCountPerformance'
)
// 1.员工合同数量统计
...
...
@@ -115,6 +112,19 @@ const ReceivablePricePerformanceRef = ref()
/** 搜索按钮操作 */
const
handleQuery
=
()
=>
{
// 从 queryParams.times[0] 中获取到了年份
const
selectYear
=
parseInt
(
queryParams
.
times
[
0
])
// 创建一个新的 Date 对象,设置为指定的年份的第一天
const
fullDate
=
new
Date
(
selectYear
,
0
,
1
,
0
,
0
,
0
)
// 将完整的日期时间格式化为需要的字符串形式,比如 2004-01-01 00:00:00
// TODO @scholar:看看,是不是可以使用 year 哈
queryParams
.
times
[
0
]
=
`
${
fullDate
.
getFullYear
()}
-
${
String
(
fullDate
.
getMonth
()
+
1
).
padStart
(
2
,
'0'
)}
-
${
String
(
fullDate
.
getDate
()).
padStart
(
2
,
'0'
)}
${
String
(
fullDate
.
getHours
()).
padStart
(
2
,
'0'
)}
:
${
String
(
fullDate
.
getMinutes
()).
padStart
(
2
,
'0'
)}
:
${
String
(
fullDate
.
getSeconds
()).
padStart
(
2
,
'0'
)}
`
switch
(
activeTab
.
value
)
{
case
'ContractCountPerformance'
:
ContractCountPerformanceRef
.
value
?.
loadData
?.()
...
...
src/views/mp/components/wx-reply/components/TabImage.vue
View file @
00762362
...
...
@@ -63,7 +63,7 @@ import { getAccessToken } from '@/utils/auth'
import
{
Reply
}
from
'./types'
const
message
=
useMessage
()
const
UPLOAD_URL
=
import
.
meta
.
env
.
VITE_
API_BASEPATH
+
'/admin-api/mp/material/upload-temporary'
const
UPLOAD_URL
=
import
.
meta
.
env
.
VITE_
BASE_URL
+
'/admin-api/mp/material/upload-temporary'
const
HEADERS
=
{
Authorization
:
'Bearer '
+
getAccessToken
()
}
// 设置上传的请求头部
const
props
=
defineProps
<
{
...
...
src/views/mp/components/wx-reply/components/TabMusic.vue
View file @
00762362
...
...
@@ -67,7 +67,7 @@ import { Reply } from './types'
const
message
=
useMessage
()
const
UPLOAD_URL
=
import
.
meta
.
env
.
VITE_
API_BASEPATH
+
'/admin-api/mp/material/upload-temporary'
const
UPLOAD_URL
=
import
.
meta
.
env
.
VITE_
BASE_URL
+
'/admin-api/mp/material/upload-temporary'
const
HEADERS
=
{
Authorization
:
'Bearer '
+
getAccessToken
()
}
// 设置上传的请求头部
const
props
=
defineProps
<
{
...
...
src/views/mp/components/wx-reply/components/TabVideo.vue
View file @
00762362
...
...
@@ -58,7 +58,7 @@ import { Reply } from './types'
const
message
=
useMessage
()
const
UPLOAD_URL
=
import
.
meta
.
env
.
VITE_
API_BASEPATH
+
'/admin-api/mp/material/upload-temporary'
const
UPLOAD_URL
=
import
.
meta
.
env
.
VITE_
BASE_URL
+
'/admin-api/mp/material/upload-temporary'
const
HEADERS
=
{
Authorization
:
'Bearer '
+
getAccessToken
()
}
const
props
=
defineProps
<
{
...
...
src/views/mp/components/wx-reply/components/TabVoice.vue
View file @
00762362
...
...
@@ -61,7 +61,7 @@ import { getAccessToken } from '@/utils/auth'
import
{
Reply
}
from
'./types'
const
message
=
useMessage
()
const
UPLOAD_URL
=
import
.
meta
.
env
.
VITE_
API_BASEPATH
+
'/admin-api/mp/material/upload-temporary'
const
UPLOAD_URL
=
import
.
meta
.
env
.
VITE_
BASE_URL
+
'/admin-api/mp/material/upload-temporary'
const
HEADERS
=
{
Authorization
:
'Bearer '
+
getAccessToken
()
}
// 设置上传的请求头部
const
props
=
defineProps
<
{
...
...
types/env.d.ts
View file @
00762362
...
...
@@ -17,7 +17,6 @@ interface ImportMetaEnv {
readonly
VITE_APP_DOCALERT_ENABLE
:
string
readonly
VITE_BASE_URL
:
string
readonly
VITE_UPLOAD_URL
:
string
readonly
VITE_API_BASEPATH
:
string
readonly
VITE_API_URL
:
string
readonly
VITE_BASE_PATH
:
string
readonly
VITE_DROP_DEBUGGER
:
string
...
...
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