Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
sportsschoolserver
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
node_server
sportsschoolserver
Commits
adbb018c
Commit
adbb018c
authored
Nov 04, 2021
by
chenjinjing
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
no message
parent
476f9d1a
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
783 additions
and
2 deletions
+783
-2
xsxxfx.ts
src/biz/xsxxfx.ts
+36
-0
ydygl.ts
src/biz/ydygl.ts
+51
-0
analysisData.ts
src/data/analysisData.ts
+78
-0
analysisExcel.ts
src/util/analysisExcel.ts
+176
-2
tools.ts
src/util/tools.ts
+442
-0
No files found.
src/biz/xsxxfx.ts
0 → 100644
View file @
adbb018c
import
{
info
}
from
"console"
;
import
{
get
选手详细分析
}
from
"../data/analysisData"
;
import
{
getChartData
,
objKeyReplace
,
getKeyValue
,
getSingleYAndMoreData
,
getListData
,
getMoreYChartData
}
from
"../util/tools"
;
export
function
getData
(
req
,
res
)
{
let
ret
:
any
=
{};
let
excelData
:
any
=
get
选手详细分析
();
let
基础信息
DataAndUnit
=
objKeyReplace
(
excelData
.
基础信息
);
ret
[
"api1"
]
=
getKeyValue
(
"基础信息"
,
基础信息
DataAndUnit
.
dataMap
,
基础信息
DataAndUnit
.
unitMap
,
false
,
false
);
let
技术特点评分
DataAndUnit
=
objKeyReplace
(
excelData
.
技术特点评分
);
ret
[
"api2"
]
=
getKeyValue
(
"技术特点评分"
,
技术特点评分
DataAndUnit
.
dataMap
,
技术特点评分
DataAndUnit
.
unitMap
,
false
,
false
);
ret
[
"api3"
]
=
getListData
(
"近期比赛概览"
,
excelData
.
近期比赛概览
,
[
"状态"
,
"球员"
,
"照片"
,
"球员得分"
,
"对手得分"
,
"比赛日期"
,
"对手照片"
,
"对手姓名"
],
{
"状态"
:
"state"
,
"球员"
:
"selfName"
,
"照片"
:
"selfPic"
,
"球员得分"
:
"selfScore"
,
"对手得分"
:
"opponentScore"
,
"比赛日期"
:
"pkTime"
,
"对手照片"
:
"opponentPic"
,
"对手姓名"
:
"oppenentName"
}
);
let
比赛视频
DataAndUnit
=
objKeyReplace
(
excelData
.
比赛视频
);
ret
[
"api4"
]
=
getKeyValue
(
"比赛视频"
,
比赛视频
DataAndUnit
.
dataMap
,
比赛视频
DataAndUnit
.
unitMap
,
false
,
false
);
ret
[
"api5"
]
=
getSingleYAndMoreData
(
"左侧爆发能量"
,
excelData
.
左侧爆发能量
,
false
,
false
);
ret
[
"api6"
]
=
getSingleYAndMoreData
(
"右侧爆发能量"
,
excelData
.
右侧爆发能量
,
false
,
false
);
ret
[
"api7"
]
=
getSingleYAndMoreData
(
"左侧球移动速度"
,
excelData
.
左侧球移动速度
,
false
,
false
);
ret
[
"api8"
]
=
getSingleYAndMoreData
(
"右侧球移动速度"
,
excelData
.
右侧球移动速度
,
false
,
false
);
let
攻击落点
DataAndUnit
=
objKeyReplace
(
excelData
.
攻击落点
);
ret
[
"api9"
]
=
getKeyValue
(
"攻击落点"
,
攻击落点
DataAndUnit
.
dataMap
,
攻击落点
DataAndUnit
.
unitMap
,
false
,
false
);
let
防守落点
DataAndUnit
=
objKeyReplace
(
excelData
.
防守落点
);
ret
[
"api10"
]
=
getKeyValue
(
"防守落点"
,
防守落点
DataAndUnit
.
dataMap
,
防守落点
DataAndUnit
.
unitMap
,
false
,
false
);
let
选手站位热力发布
DataAndUnit
=
objKeyReplace
(
excelData
.
选手站位热力发布
);
ret
[
"api11"
]
=
getKeyValue
(
"选手站位热力发布"
,
选手站位热力发布
DataAndUnit
.
dataMap
,
选手站位热力发布
DataAndUnit
.
unitMap
,
false
,
false
);
}
src/biz/ydygl.ts
0 → 100644
View file @
adbb018c
import
{
get
运动员概览
}
from
"../data/analysisData"
;
import
{
getChartData
,
objKeyReplace
,
getKeyValue
,
getSingleYAndMoreData
,
getListData
}
from
"../util/tools"
;
export
function
getData
(
req
,
res
)
{
let
ret
:
any
=
{};
let
excelData
:
any
=
get
运动员概览
();
let
左上数据
DataAndUnit
=
objKeyReplace
(
excelData
.
左上数据
);
ret
[
"api1"
]
=
getKeyValue
(
"左上数据"
,
左上数据
DataAndUnit
.
dataMap
,
左上数据
DataAndUnit
.
unitMap
,
false
,
false
);
let
运动员年龄分布
DataAndUnit
=
objKeyReplace
(
excelData
.
运动员年龄分布
);
ret
[
"api2"
]
=
getKeyValue
(
"运动员年龄分布"
,
运动员年龄分布
DataAndUnit
.
dataMap
,
运动员年龄分布
DataAndUnit
.
unitMap
,
false
,
false
);
let
运动员性别占比
DataAndUnit
=
objKeyReplace
(
excelData
.
运动员性别占比
);
ret
[
"api3"
]
=
getKeyValue
(
"运动员性别占比"
,
运动员性别占比
DataAndUnit
.
dataMap
,
运动员性别占比
DataAndUnit
.
unitMap
,
false
,
false
);
let
训练类型
DataAndUnit
=
objKeyReplace
(
excelData
.
训练类型
);
ret
[
"api4"
]
=
getKeyValue
(
"训练类型"
,
训练类型
DataAndUnit
.
dataMap
,
训练类型
DataAndUnit
.
unitMap
,
false
,
false
);
let
动作模型练习
DataAndUnit
=
objKeyReplace
(
excelData
.
动作模型练习
);
ret
[
"api5"
]
=
getKeyValue
(
"动作模型练习"
,
动作模型练习
DataAndUnit
.
dataMap
,
动作模型练习
DataAndUnit
.
unitMap
,
false
,
false
);
ret
[
"api6"
]
=
getSingleYAndMoreData
(
"男女训练成绩对比"
,
excelData
.
男女训练成绩对比
,
false
,
false
);
ret
[
"api7"
]
=
getSingleYAndMoreData
(
"月训练量趋势"
,
excelData
.
月训练量趋势
,
false
,
false
);
let
训练成绩优秀榜
DataAndUnit
=
objKeyReplace
(
excelData
.
训练成绩优秀榜
);
ret
[
"api8"
]
=
getKeyValue
(
"训练成绩优秀榜"
,
训练成绩优秀榜
DataAndUnit
.
dataMap
,
训练成绩优秀榜
DataAndUnit
.
unitMap
,
false
,
false
);
let
右上数据
DataAndUnit
=
objKeyReplace
(
excelData
.
右上数据
);
ret
[
"api9"
]
=
getKeyValue
(
"右上数据"
,
右上数据
DataAndUnit
.
dataMap
,
右上数据
DataAndUnit
.
unitMap
,
false
,
false
);
let
比赛类型
DataAndUnit
=
objKeyReplace
(
excelData
.
比赛类型
);
ret
[
"api10"
]
=
getKeyValue
(
"比赛类型"
,
比赛类型
DataAndUnit
.
dataMap
,
比赛类型
DataAndUnit
.
unitMap
,
false
,
false
);
let
参赛性别占比
DataAndUnit
=
objKeyReplace
(
excelData
.
参赛性别占比
);
ret
[
"api11"
]
=
getKeyValue
(
"参赛性别占比"
,
参赛性别占比
DataAndUnit
.
dataMap
,
参赛性别占比
DataAndUnit
.
unitMap
,
false
,
false
);
ret
[
"api12"
]
=
getListData
(
"校内积分赛"
,
excelData
.
校内积分赛
,
[
"排名"
,
"球员"
,
"场次"
,
"胜场"
,
"负场"
,
"积分"
],
{
"排名"
:
"rank"
,
"球员"
:
"trainee"
,
"场次"
:
"session"
,
"胜场"
:
"win"
,
"负场"
:
"lose"
,
"积分"
:
"points"
}
);
ret
[
"api13"
]
=
getListData
(
"淘汰赛"
,
excelData
.
淘汰赛
,
[
"排名"
,
"球员"
,
"场次"
,
"胜场"
,
"负场"
,
"积分"
],
{
"排名"
:
"rank"
,
"学员"
:
"trainee"
,
"场次"
:
"session"
,
"胜场"
:
"win"
,
"负场"
:
"lose"
,
"积分"
:
"points"
}
);
let
学员库
DataAndUnit
=
objKeyReplace
(
excelData
.
学员库
);
ret
[
"api14"
]
=
getListData
(
"基本信息"
,
excelData
.
基本信息
,
[
"球员"
,
"球员得分"
,
"对手得分"
,
"对手"
,
"胜负"
],
{
"球员"
:
"selfName"
,
"球员得分"
:
"selfScore"
,
"对手得分"
:
"opponentScore"
,
"对手"
:
"oppenentName"
,
"胜负"
:
"winorlose"
}
);
//ret["api11"] = getListData("近期比赛", excelData.近期比赛, ["学员1","比分","场次","胜/平/负","积分"], false, false );
}
src/data/analysisData.ts
0 → 100644
View file @
adbb018c
import
{
changeDataName
}
from
"../util/tools"
;
import
{
getExcelDataBySheetName
,
analysisExcelDataOfObject
,
analysisExcelDataOfMoreObject
,
analysisExcelDataOfList
,
analysisExcelDataOfStringList
,
analysisExcelDataTime
}
from
"../util/analysisExcel"
;
export
function
get
运动员概览
()
{
let
bolckDataList
=
getExcelDataBySheetName
(
'数据库'
,
''
);
let
result
=
{};
let
ofMoreObjList
=
[];
let
ofObjList
=
[
"左上数据"
,
"运动员年龄分布"
,
"运动员性别占比"
,
"训练类型"
,
"动作模型练习"
,
"男女训练成绩对比"
,
"月训练量趋势"
,
"训练成绩优秀榜"
,
"右上数据"
,
"比赛类型"
,
"参赛性别占比"
];
let
listDataAnalysisInfo
=
{
"校内积分赛"
:{
"titleList"
:[
"排名"
,
"球员"
,
"场次"
,
"胜场"
,
"负场"
,
"积分"
],
"keyValueObj"
:{
"排名"
:
"rank"
,
"球员"
:
"trainee"
,
"场次"
:
"session"
,
"胜场"
:
"win"
,
"负场"
:
"lose"
,
"积分"
:
"integral"
}
},
"淘汰赛"
:{
"titleList"
:[
"排名"
,
"球员"
,
"场次"
,
"胜场"
,
"负场"
,
"积分"
],
"keyValueObj"
:{
"排名"
:
"rank"
,
"球员"
:
"trainee"
,
"场次"
:
"session"
,
"胜场"
:
"win"
,
"负场"
:
"lose"
,
"积分"
:
"integral"
}
}
};
let
dataValue
=
[
"基本信息"
,{
"近期比赛"
:{
"titleList"
:[
"球员"
,
"球员得分"
,
"对手得分"
,
"对手"
,
"胜负"
],
"keyValueObj"
:{
"球员"
:
"selfName"
,
"球员得分"
:
"selfScore"
,
"对手得分"
:
"opponentScore"
,
"对手"
:
"oppenentName"
,
"胜负"
:
"winorlose"
}
}
}]
// let dataValue = {
// "学员库":{
// "学员姓名":{
// "基本信息":{
// "titleList":["出生日期", "惯用手", "比赛场次", "胜场", "胜率", "近期比赛"],
// "keyValueObj":{"出生日期":"birthday", "惯用手":"dominsnthand", "比赛场次":"matches", "胜场":"winfield", "胜率":"winrate"}
// },
// "近期比赛":{
// "titleList":["球员", "球员得分", "对手得分", "对手", "胜负"],
// "keyValueObj":{"球员":"selfName", "球员得分":"selfScore", "对手得分":"opponentScore", "对手":"oppenentName", "胜负":"winorlose"}
// }
// }
// }
// }
for
(
let
i
=
0
;
i
<
bolckDataList
.
length
;
i
++
)
{
let
{
blockData
,
blockTitle
}
=
bolckDataList
[
i
];
let
changeName
=
changeDataName
(
blockTitle
);
if
(
ofMoreObjList
.
indexOf
(
changeName
)
>
-
1
)
result
[
changeName
]
=
analysisExcelDataOfMoreObject
(
blockData
,
false
);
if
(
ofObjList
.
indexOf
(
changeName
)
>
-
1
)
result
[
changeName
]
=
analysisExcelDataOfObject
(
blockData
,
true
,
false
);
if
(
listDataAnalysisInfo
[
changeName
])
result
[
changeName
]
=
analysisExcelDataOfList
(
blockData
,
listDataAnalysisInfo
[
blockTitle
].
keyValueObj
,
false
);
}
return
result
;
}
export
function
get
选手详细分析
(){
let
bolckDataList
=
getExcelDataBySheetName
(
'数据库'
,
''
);
let
result
=
{};
let
ofMoreObjList
=
[
"左侧爆发能量"
,
"右侧爆发能量"
,
"左侧球移动速度"
,
"右侧球移动速度"
];
let
ofObjList
=
[
"基础信息"
,
"技术特点评分"
,
"比赛视频"
,
"攻击落点"
,
"防守落点"
,
"选手站位热力发布"
];
let
listDataAnalysisInfo
=
{
"近期比赛概览"
:{
"titleList"
:[
"状态"
,
"球员"
,
"照片"
,
"球员得分"
,
"对手得分"
,
"比赛日期"
,
"对手照片"
,
"对手姓名"
],
"keyValueObj"
:{
"状态"
:
"state"
,
"球员"
:
"selfName"
,
"照片"
:
"selfPic"
,
"球员得分"
:
"selfScore"
,
"对手得分"
:
"opponentScore"
,
"比赛日期"
:
"pkTime"
,
"对手照片"
:
"opponentPic"
,
"对手姓名"
:
"oppenentName"
}
}
};
for
(
let
i
=
0
;
i
<
bolckDataList
.
length
;
i
++
)
{
let
{
blockData
,
blockTitle
}
=
bolckDataList
[
i
];
let
changeName
=
changeDataName
(
blockTitle
);
if
(
ofMoreObjList
.
indexOf
(
changeName
)
>
-
1
)
result
[
changeName
]
=
analysisExcelDataOfMoreObject
(
blockData
,
false
);
if
(
ofObjList
.
indexOf
(
changeName
)
>
-
1
)
result
[
changeName
]
=
analysisExcelDataOfObject
(
blockData
,
true
,
false
);
if
(
listDataAnalysisInfo
[
changeName
])
result
[
changeName
]
=
analysisExcelDataOfList
(
blockData
,
listDataAnalysisInfo
[
blockTitle
].
keyValueObj
,
false
);
}
return
result
;
}
\ No newline at end of file
src/util/analysisExcel.ts
View file @
adbb018c
...
@@ -28,6 +28,179 @@ export function getBlockDataByData(dataList) {
...
@@ -28,6 +28,179 @@ export function getBlockDataByData(dataList) {
}
}
/**
/**
* analysisExcelDataOfObject 将excel解出来的数据块按需求解析成可用数据
* @param dataList excel解出来的数据
* @param isJumpTitle 是否跳过解析表头
* @param keyInX key是否横向排列
* @returns 返回 {"数据标题":数据对象 }
*/
export
function
analysisExcelDataOfObject
(
dataList
,
isJumpTitle
?,
keyInX
?)
{
let
result
=
{};
if
(
keyInX
)
{
let
keyList
=
dataList
[
0
];
let
valueList
=
dataList
[
1
];
let
i
=
isJumpTitle
?
1
:
0
;
for
(;
i
<
keyList
.
length
;
i
++
)
{
let
key
=
keyList
[
i
];
let
value
=
valueList
[
i
]
||
null
;
result
[
key
]
=
value
;
}
}
else
{
let
y
=
isJumpTitle
?
1
:
0
;
for
(;
y
<
dataList
.
length
;
y
++
)
{
let
childList
=
dataList
[
y
];
let
key
=
childList
[
0
];
let
value
=
childList
[
1
]
||
null
;
result
[
key
]
=
value
;
}
}
return
result
;
}
export
function
analysisExcelDataTime
(
dataList
,
isJumpTitle
?,
keyInX
?)
{
const
HOURS
=
new
Date
().
getHours
()
+
1
;
//获取当前时间
let
result
=
{};
if
(
keyInX
)
{
let
keyList
=
dataList
[
0
];
let
valueList
=
dataList
[
1
];
let
i
=
isJumpTitle
?
1
:
0
;
for
(;
i
<
keyList
.
length
;
i
++
)
{
let
key
=
keyList
[
i
];
let
value
=
valueList
[
i
]
||
null
;
result
[
key
]
=
value
;
}
}
else
{
let
y
=
isJumpTitle
?
1
:
0
;
for
(;
y
<=
HOURS
;
y
++
)
{
let
childList
=
dataList
[
y
];
let
key
=
childList
[
0
];
let
value
=
childList
[
1
]
||
null
;
result
[
key
]
=
value
;
}
}
return
result
;
}
/**
* analysisExcelDataOfMoreObject 将excel解出来的数据块按需求解析成可用数据
* @param dataList excel解出来的数据
* @param isJumpTitle 是否跳过解析表头
* @param headerInx 第一个表头数据是否横向排列
* @returns 返回 {"第一个表头数据":{"表头数据":值...} }
*/
export
function
analysisExcelDataOfMoreObject
(
dataList
,
headerInx
?)
{
let
result
=
{};
let
titleList
=
dataList
[
0
];
if
(
!
headerInx
)
{
for
(
let
y
=
1
;
y
<
dataList
.
length
;
y
++
)
{
let
dataTitle
=
dataList
[
y
][
0
];
let
thisData
=
{};
for
(
let
x
=
1
;
x
<
dataList
[
y
].
length
;
x
++
)
{
let
key
=
titleList
[
x
];
thisData
[
key
]
=
dataList
[
y
][
x
];
}
result
[
dataTitle
]
=
thisData
;
}
}
else
{
let
indexKeyMap
=
{};
titleList
.
forEach
((
thisTitle
,
index
)
=>
{
if
(
!
index
)
return
;
indexKeyMap
[
index
]
=
thisTitle
;
result
[
thisTitle
]
=
{};
});
for
(
let
y
=
1
;
y
<
dataList
.
length
;
y
++
)
{
let
thisKey
=
dataList
[
y
][
0
];
for
(
let
x
=
1
;
x
<
dataList
[
y
].
length
;
x
++
)
{
let
thisTitle
=
indexKeyMap
[
x
];
result
[
thisTitle
][
thisKey
]
=
dataList
[
y
][
x
];
}
}
}
return
result
;
}
/**
* analysisExcelDataOfList 将excel解出来的数据块按需求解析成可用数据
* @param dataList excel解出来的数据
* @param keyObject 对应关系 {dataList表头名称: 英文}
* @param headerInx 第一个表头数据是否横向排列
* @returns 返回 {"第一个表头数据":{"表头数据":值...} }
*/
export
function
analysisExcelDataOfList
(
dataList
,
keyObject
,
headerInx
?)
{
let
result
=
[];
if
(
!
headerInx
)
{
//在y轴上排列
let
titleList
=
dataList
[
0
];
let
indexKeyNameMap
=
{};
titleList
.
forEach
(
(
info
,
index
)
=>
{
indexKeyNameMap
[
index
+
1
]
=
info
;
});
for
(
let
i
=
1
;
i
<
dataList
.
length
;
i
++
)
{
let
onceInfo
=
{};
let
subList
=
dataList
[
i
];
subList
.
forEach
(
(
info
,
index
)
=>
{
let
key
=
indexKeyNameMap
[
index
+
1
];
let
checkKey
=
keyObject
[
key
];
onceInfo
[
checkKey
]
=
info
;
});
result
.
push
(
onceInfo
);
}
}
else
{
//在x轴上排列
let
indexKeyNameMap
=
{};
dataList
.
forEach
(
(
info
,
index
)
=>
{
indexKeyNameMap
[
index
+
1
]
=
info
[
0
];
});
let
dataMap
=
{};
for
(
let
y
=
0
;
y
<
dataList
.
length
;
y
++
)
{
let
xList
=
dataList
[
y
];
for
(
let
x
=
1
;
x
<
xList
.
length
;
x
++
)
{
if
(
!
dataMap
[
x
])
dataMap
[
x
]
=
{};
let
key
=
indexKeyNameMap
[
y
+
1
];
let
checkKey
=
keyObject
[
key
];
dataMap
[
x
][
checkKey
]
=
xList
[
x
];
}
}
result
=
Object
.
values
(
dataMap
);
}
return
result
;
}
export
function
analysisExcelDataOfStringList
(
dataList
)
{
let
result
=
[];
for
(
let
i
=
0
;
i
<
dataList
.
length
;
i
++
)
{
if
(
!
i
)
continue
;
let
subList
=
dataList
[
i
];
result
.
push
(
subList
[
1
]);
}
return
result
;
}
export
function
testmain
()
{
let
{
sheetMap
,
sheetList
}
=
getExcel
(
`
${
__dirname
.
substring
(
0
,
__dirname
.
indexOf
(
"out"
))}
res\\数据模板.xlsx`
);
//根据配置表解析成对应数据
let
resultMap
=
{};
for
(
let
sheetName
in
sheetMap
)
{
let
thisSheetBlockList
=
getBlockData
(
sheetMap
[
sheetName
]);
resultMap
[
sheetName
]
=
thisSheetBlockList
;
}
console
.
log
(
resultMap
);
return
resultMap
;
}
/**
* getBlockData 数据分块
* getBlockData 数据分块
* @param dataList 解析出来的excel二维数组
* @param dataList 解析出来的excel二维数组
* @returns 返回数据块集合 格式:blockList = [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
* @returns 返回数据块集合 格式:blockList = [ {blockData:数据块(二维数组), blockTitle:"数据标题"}]
...
@@ -177,6 +350,8 @@ function checkBlock(dataList) {
...
@@ -177,6 +350,8 @@ function checkBlock(dataList) {
return
{
blockData
,
blockTitle
,
delDataList
:
dataList
,
notItem
};
return
{
blockData
,
blockTitle
,
delDataList
:
dataList
,
notItem
};
}
}
//获取单个excel文件的数据
//获取单个excel文件的数据
function
getExcel
(
filePath
)
{
function
getExcel
(
filePath
)
{
const
workSheetsFromFile
=
xlsx
.
parse
(
filePath
);
const
workSheetsFromFile
=
xlsx
.
parse
(
filePath
);
...
@@ -190,4 +365,4 @@ function getExcel(filePath) {
...
@@ -190,4 +365,4 @@ function getExcel(filePath) {
}
}
return
{
sheetMap
,
sheetList
}
return
{
sheetMap
,
sheetList
}
}
}
\ No newline at end of file
src/util/tools.ts
View file @
adbb018c
export
function
limitEnteNameString
(
name
,
number
?)
{
number
=
number
?
number
:
13
;
if
(
name
.
length
>
number
)
return
`
${
name
.
substring
(
0
,
number
-
2
)}
...`
;
return
name
;
}
const
moneyStrConfig
=
{
"万亿"
:
13
,
"萬億"
:
13
,
"千亿"
:
12
,
"千億"
:
12
,
"百亿"
:
11
,
"佰億"
:
11
,
"十亿"
:
10
,
"拾億"
:
10
,
"亿"
:
9
,
"億"
:
9
,
"千万"
:
8
,
"千萬"
:
8
,
"百万"
:
7
,
"佰萬"
:
7
,
"十万"
:
6
,
"拾萬"
:
6
,
"万"
:
5
,
"萬"
:
5
,
"千"
:
4
,
"百"
:
3
,
"十"
:
2
,
"美元"
:
1
,
"人名币"
:
1
,
"元"
:
1
,
};
// 汇率
let
dollarRate
=
6.4731
;
//解析金额
export
function
analysisMoneyStr
(
mnyStr
:
string
)
{
let
zeroNum
=
1
;
let
moneyNumber
=
0
;
for
(
let
key
in
moneyStrConfig
)
{
let
checkNum
=
mnyStr
.
indexOf
(
key
);
if
(
checkNum
>
-
1
)
{
zeroNum
=
moneyStrConfig
[
key
];
moneyNumber
=
parseFloat
(
mnyStr
.
slice
(
0
,
checkNum
));
break
;
}
}
if
(
mnyStr
.
replace
(
/
[^
0-9
]
/ig
,
""
)
==
""
)
return
0
;
if
(
zeroNum
>
1
)
{
let
count
=
1
;
for
(
let
i
=
1
;
i
<
zeroNum
;
i
++
)
{
count
=
count
*
10
;
}
zeroNum
=
count
;
}
let
money
=
parseInt
(
`
${
zeroNum
*
moneyNumber
}
`
);
if
(
mnyStr
.
indexOf
(
'美元'
))
money
=
parseInt
(
`
${
money
*
dollarRate
}
`
);
return
money
;
}
//缩略金额
export
function
simplifyMoney
(
mny
:
number
,
str
:
string
)
{
let
num
=
moneyStrConfig
[
str
];
let
count
=
1
;
for
(
let
i
=
1
;
i
<
num
;
i
++
)
{
count
=
count
*
10
;
}
return
mny
/
count
;
}
//分离 带单位的数据
function
separateDataAndUint
(
str
)
{
if
(
!
str
)
return
{
data
:
0
,
unit
:
""
};
let
data
=
str
.
replace
(
/
[\u
4E00-
\u
9FA5a-zA-Z
]
+/
,
""
);
let
unit
=
str
.
replace
(
/^
(
-
)?\d
+
(\.\d
+
)?
/
,
""
);
return
{
data
,
unit
};
}
//object key替换 带单位
export
function
objKeyReplace
(
object
,
keyInfo
=
{},
isString
=
true
)
{
if
(
isString
)
{
//校验字符
for
(
let
key
in
object
)
{
if
(
!
object
[
key
])
object
[
key
]
=
''
;
}
}
else
{
//校验数字
for
(
let
key
in
object
)
{
if
(
!
object
[
key
])
object
[
key
]
=
'0'
;
}
}
let
unitMap
=
{};
let
dataMap
=
{};
for
(
let
key
in
object
)
{
let
newKey
=
keyInfo
[
key
]
||
key
;
let
{
data
,
unit
}
=
separateDataAndUint
(
`
${
object
[
key
]}
`
||
""
);
unitMap
[
newKey
]
=
unit
;
dataMap
[
newKey
]
=
parseFloat
(
data
);
}
return
{
dataMap
,
unitMap
};
}
//返回特定key和value的obj
export
function
objKeyAndValue
(
dataMap
,
...
keyList
)
{
let
result
=
{};
for
(
let
key
in
dataMap
)
{
if
(
keyList
.
indexOf
(
key
)
>
-
1
)
result
[
key
]
=
dataMap
[
key
];
}
return
result
;
}
//获取键值数据 percent =>为数字的时候 保留几位小数
export
function
getKeyValue
(
title
,
dataMap
,
unit
,
total
,
percent
)
{
let
data
=
{
title
,
subTitle
:
title
,
total
:
0
,
list
:
[]
};
let
count
=
0
;
for
(
let
key
in
dataMap
)
{
let
value
=
parseFloat
(
dataMap
[
key
]);
count
+=
value
;
if
(
total
)
data
.
total
+=
value
;
}
for
(
let
key
in
dataMap
)
{
let
thisUnit
=
""
;
if
(
unit
)
{
if
(
typeof
unit
==
"string"
)
thisUnit
=
unit
;
else
thisUnit
=
unit
[
key
];
}
let
value
=
parseFloat
(
dataMap
[
key
]);
if
(
percent
)
{
thisUnit
=
'%'
;
value
=
getDecimalForN
(
value
/
count
,
percent
);
}
let
onceInfo
:
any
=
{
key
,
value
,
unit
:
thisUnit
};
data
.
list
.
push
(
onceInfo
);
}
return
data
;
}
export
function
getKeyStringValue
(
title
,
dataMap
)
{
let
data
=
{
title
,
subTitle
:
title
,
total
:
0
,
list
:
[]
};
for
(
let
key
in
dataMap
)
{
data
.
list
.
push
({
key
,
value
:
dataMap
[
key
]
});
}
return
data
;
}
function
getChartMin
(
num
)
{
if
(
num
>
0
)
return
0
;
return
Math
.
floor
(
num
);
}
export
function
getChartData
(
title
,
dataMap
,
unit
,
percent
)
{
unit
=
unit
||
""
;
let
data
=
{
title
,
yMaxValue
:
0
,
yMinValue
:
new
Date
().
valueOf
(),
yStepValue
:
0
,
unit
:
percent
?
"%"
:
unit
,
data
:
{
title
:
title
,
total
:
0
,
list
:
[
]
}
}
let
count
=
0
;
for
(
let
key
in
dataMap
)
{
let
value
=
parseFloat
(
dataMap
[
key
]
||
0
);
data
.
yMaxValue
=
Math
.
max
(
data
.
yMaxValue
,
value
);
data
.
yMinValue
=
Math
.
min
(
data
.
yMinValue
,
value
);
count
+=
1
;
data
.
data
.
total
+=
value
;
}
for
(
let
key
in
dataMap
)
{
let
value
=
parseFloat
(
dataMap
[
key
]);
let
thisUnit
=
unit
;
if
(
percent
)
{
thisUnit
=
'%'
;
value
=
getDecimalForN
(
value
/
count
,
percent
);
}
let
onceInfo
=
{
key
,
unit
:
thisUnit
,
value
};
data
.
data
.
list
.
push
(
onceInfo
)
}
data
.
yMinValue
=
getChartMin
(
data
.
yMinValue
);
data
.
yStepValue
=
getChartStepNumber
(
Math
.
ceil
((
data
.
yMaxValue
-
data
.
yMinValue
)
/
count
));
let
maxVal
=
Math
.
ceil
(
data
.
yMaxValue
);
data
.
yMaxValue
=
maxVal
+
(
data
.
yStepValue
-
(
maxVal
%
data
.
yStepValue
));
return
data
;
}
export
function
getListData
(
title
,
dataList
,
titleList
,
titleValueObj
)
{
let
data
=
{
title
,
subTitle
:
title
,
total
:
dataList
.
length
,
titleList
,
valueList
:[]
};
dataList
.
forEach
(
info
=>
{
let
onceList
=
[];
titleList
.
forEach
(
titleName
=>
{
onceList
.
push
(
info
[
titleValueObj
[
titleName
]
]);
});
data
.
valueList
.
push
(
onceList
);
});
return
data
;
}
//多个y轴的条柱状图 dataMap => {"name":{"key1":1111,"key2":232, "key3":dsfs, ... }, ... }
export
function
getMoreYChartData
(
title
,
dataMap
,
percent
,
unit
)
{
let
data
=
{
title
,
dataList
:
[]
};
for
(
let
subDataName
in
dataMap
)
{
let
onceData
=
{
title
:
subDataName
,
yMaxValue
:
0
,
yMinValue
:
new
Date
().
valueOf
(),
yStepValue
:
0
,
unit
:
""
,
total
:
0
,
list
:
[
]
};
let
thisDataInfo
=
dataMap
[
subDataName
];
let
thisCount
=
0
;
for
(
let
key
in
thisDataInfo
)
{
let
value
=
parseFloat
(
thisDataInfo
[
key
]);
onceData
.
yMaxValue
=
Math
.
max
(
onceData
.
yMaxValue
,
value
);
onceData
.
yMinValue
=
Math
.
min
(
onceData
.
yMinValue
,
value
);
onceData
.
total
+=
value
;
thisCount
+=
1
;
}
onceData
.
yStepValue
=
getChartStepNumber
(
Math
.
ceil
(
(
onceData
.
yMaxValue
-
onceData
.
yMinValue
)
/
thisCount
)
);
let
thisUnit
;
if
(
percent
)
{
thisUnit
=
"%"
;
onceData
.
yMaxValue
=
100
;
onceData
.
yStepValue
=
Math
.
ceil
(
(
100
-
onceData
.
yMinValue
)
/
onceData
.
total
)
;
}
else
if
(
typeof
unit
==
'object'
)
{
thisUnit
=
unit
[
subDataName
]
||
""
;
}
else
thisUnit
=
unit
||
""
;
for
(
let
key
in
thisDataInfo
)
{
let
value
;
if
(
percent
)
value
=
getDecimalForN
(
value
/
onceData
.
total
,
percent
);
else
value
=
parseFloat
(
thisDataInfo
[
key
]);
let
onceInfo
=
{
key
,
unit
:
thisUnit
,
value
};
onceData
.
list
.
push
(
onceInfo
)
}
onceData
.
total
=
getDecimalForN
(
onceData
.
total
,
1
);
let
maxVal
=
Math
.
ceil
(
onceData
.
yMaxValue
);
onceData
.
yMinValue
=
getChartMin
(
onceData
.
yMinValue
);
onceData
.
yMaxValue
=
maxVal
+
(
onceData
.
yStepValue
-
(
maxVal
%
onceData
.
yStepValue
));
data
.
dataList
.
push
(
onceData
);
}
return
data
;
}
//一个y轴的多个数据的柱状图
export
function
getSingleYAndMoreData
(
title
,
dataMap
,
percent
,
unit
)
{
let
data
=
{
title
,
dataList
:[],
yMaxValue
:
0
,
yMinValue
:
new
Date
().
valueOf
(),
yStepValue
:
0
,
unit
:
""
,
total
:
0
};
let
maxCount
=
0
;
for
(
let
subDataName
in
dataMap
)
{
let
onceData
=
{
title
:
subDataName
,
list
:[]
};
let
thisDataCount
=
0
;
let
analysisMap
=
objKeyReplace
(
dataMap
[
subDataName
])
let
thisData
=
analysisMap
.
dataMap
;
let
thisMax
=
0
;
for
(
let
key
in
thisData
)
{
let
value
=
parseFloat
(
dataMap
[
key
]);
thisDataCount
+=
value
;
thisMax
+=
1
;
}
maxCount
=
Math
.
max
(
maxCount
,
thisMax
);
let
thisUnit
;
if
(
percent
)
thisUnit
=
"%"
;
else
if
(
typeof
unit
==
'object'
)
{
thisUnit
=
unit
[
subDataName
]
||
""
;
}
else
thisUnit
=
unit
||
""
;
for
(
let
key
in
thisData
)
{
let
value
;
if
(
percent
)
value
=
getDecimalForN
(
value
/
thisDataCount
,
percent
);
else
value
=
parseFloat
(
thisData
[
key
]);
data
.
yMaxValue
=
Math
.
max
(
data
.
yMaxValue
,
value
);
data
.
yMinValue
=
Math
.
min
(
data
.
yMinValue
,
value
);
data
.
total
+=
value
;
let
onceInfo
=
{
key
,
unit
:
thisUnit
,
value
};
onceData
.
list
.
push
(
onceInfo
)
}
data
.
dataList
.
push
(
onceData
);
}
data
.
yMinValue
=
getChartMin
(
data
.
yMinValue
);
data
.
yMaxValue
=
Math
.
ceil
(
data
.
yMaxValue
);
data
.
yStepValue
=
getChartStepNumber
(
Math
.
ceil
((
data
.
yMaxValue
-
data
.
yMinValue
)
/
maxCount
));
return
data
;
}
function
getChartStepNumber
(
number
)
{
let
lenth
=
`
${
number
}
`
.
length
;
let
count
=
1
;
for
(
let
i
=
1
;
i
<
lenth
;
i
++
)
{
count
=
count
*
10
;
}
return
number
+
(
count
-
(
number
%
count
)
);
}
//字符模板
export
function
getStringMoreData
(
title
,
valueList
)
{
let
result
=
{
title
,
data
:{}
};
valueList
.
forEach
(
(
info
,
index
)
=>
{
let
key
=
index
+
1
result
.
data
[
`
${
key
}
`
]
=
info
;
});
return
result
;
}
//撒点图 cutApartXAndY:[分割的x坐标,分割的y坐标]
export
function
getDropMoreData
(
dataList
,
title
,
subTitle
,
cutApartXAndY
?)
{
let
data
:
any
=
{
title
,
subTitle
,
dataList
:[],
xMax
:
0
,
xMin
:
new
Date
().
valueOf
(),
yMax
:
0
,
yMin
:
new
Date
().
valueOf
()
};
dataList
.
forEach
(
info
=>
{
let
{
x
,
y
}
=
info
;
let
thisDropXInfo
=
separateDataAndUint
(
`
${
x
}
`
);
let
thisDropX
=
parseFloat
(
thisDropXInfo
.
data
);
let
thisDropYInfo
=
separateDataAndUint
(
`
${
y
}
`
);
let
thisDropY
=
parseFloat
(
thisDropYInfo
.
data
);
data
.
xMax
=
Math
.
max
(
thisDropX
,
data
.
xMax
);
data
.
xMin
=
Math
.
min
(
thisDropX
,
data
.
xMin
);
data
.
yMax
=
Math
.
max
(
thisDropY
,
data
.
yMax
);
data
.
yMin
=
Math
.
min
(
thisDropY
,
data
.
yMin
);
let
value
=
[
thisDropX
,
thisDropY
];
let
type
=
1
;
if
(
cutApartXAndY
)
{
let
cutX
=
cutApartXAndY
[
0
];
let
cutY
=
cutApartXAndY
[
1
];
if
(
thisDropX
<
cutX
&&
thisDropY
>
cutY
)
type
=
1
;
else
if
(
thisDropX
>
cutX
&&
thisDropY
>
cutY
)
type
=
2
;
else
if
(
thisDropX
<
cutX
&&
thisDropY
<
cutY
)
type
=
3
;
else
type
=
4
;
}
data
.
dataList
.
push
({
value
,
name
:
info
.
name
||
""
,
type
});
});
if
(
cutApartXAndY
)
{
data
.
cutApartX
=
cutApartXAndY
[
0
];
data
.
cutApartY
=
cutApartXAndY
[
1
];
}
let
count
=
dataList
.
length
;
let
xAvg
=
Math
.
ceil
((
data
.
xMax
-
data
.
xMin
)
/
count
);
data
.
xMax
=
Math
.
floor
(
data
.
xMax
+
xAvg
);
data
.
xMin
=
Math
.
floor
(
data
.
xMin
-
xAvg
);
let
yAvg
=
Math
.
ceil
((
data
.
yMax
-
data
.
yMin
)
/
count
);
data
.
yMax
=
Math
.
floor
(
data
.
yMax
+
yAvg
);
data
.
yMin
=
Math
.
floor
(
data
.
yMin
-
yAvg
);
return
data
;
}
//按需取保留小数长度 tenNumber保留小数位 1位就填1
export
function
getDecimalForN
(
number
,
n
)
{
let
ten
=
1
;
for
(
let
i
=
0
;
i
<
n
;
i
++
)
{
ten
=
ten
*
10
;
}
return
Math
.
ceil
(
number
*
ten
)
/
ten
}
//生日获取时间段
export
function
getAgeByBirthday
(
birthday
:
string
)
{
let
b
=
new
Date
(
birthday
).
valueOf
();
let
d
=
new
Date
().
valueOf
();
let
onceYear
=
365
*
24
*
3600
*
1000
;
let
age
=
Math
.
floor
(
(
d
-
b
)
/
onceYear
);
if
(
age
>=
21
&&
age
<=
30
)
return
"21-30"
;
else
if
(
age
>=
31
&&
age
<=
40
)
return
"35-45"
;
else
if
(
age
>=
41
&&
age
<=
50
)
return
"46-55"
;
else
if
(
age
>
50
)
return
"50岁以上"
;
else
return
'其他'
;
}
export
function
analysisAddOrRMData
(
str
)
{
str
=
`
${
str
}
`
;
let
checkStr
=
str
.
replace
(
/增加/
,
""
);
let
result
=
checkStr
.
replace
(
/减少/
,
"-"
);
return
result
;
}
export
function
changeDataName
(
str
)
{
let
result
=
str
.
replace
(
/
[
()""“”()-
]
/
,
"_"
);
for
(
let
i
=
0
;
i
<
10
;
i
++
)
{
result
=
result
.
replace
(
/
[
()""“”()-
]
/
,
"_"
);
}
return
result
;
}
//数据保留两位小数
export
function
getDataMapDecimalForN
(
dataMap
,
number
?)
{
let
tenCount
=
number
?
number
:
2
;
let
result
=
{};
for
(
let
key
in
dataMap
)
{
let
value
=
dataMap
[
key
];
if
(
typeof
value
==
'string'
)
{
let
{
data
}
=
separateDataAndUint
(
value
);
value
=
parseFloat
(
data
);
}
result
[
key
]
=
getDecimalForN
(
value
,
tenCount
);
}
return
result
;
}
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