Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
motorCity
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
motorCity
Commits
d70bd13b
Commit
d70bd13b
authored
Aug 26, 2022
by
lixinming
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
no message
parent
10c10382
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
196 additions
and
450 deletions
+196
-450
serverConfig.xml
serverConfig.xml
+4
-3
data.ts
src/biz/jgfwnl/data.ts
+66
-40
wsData.ts
src/biz/jgfwnl/wsData.ts
+10
-75
serverConfig.ts
src/config/serverConfig.ts
+53
-41
interfaceService.ts
src/data/interface/interfaceService.ts
+3
-4
wsData.ts
src/data/interface/wsData.ts
+55
-40
excelCmd.js
src/excelCmd.js
+0
-240
main.ts
src/main.ts
+4
-6
socket_server.ts
src/net/socket_server.ts
+1
-1
No files found.
serverConfig.xml
View file @
d70bd13b
<config>
<port
Config>
30001
</portConfig
>
<socketPort
Config>
30002
</socketPortConfig
>
<port
>
30001
</port
>
<socketPort
>
30002
</socketPort
>
<rightView>
http://10.51.50.136:8090/sql/execute
</rightView>
<leftView>
<cloudResource>
http://10.51.50.140:8080/api/static/PrivateCloudUsageStatics
</cloudResource>
...
...
@@ -14,11 +14,12 @@
<broken>
3
</broken>
<token>
09a98bc555474e058ef90b6cc6e23638
</token>
</mapView>
<imagePath>
192.168.0.10
0
</imagePath>
<imagePath>
192.168.0.10
5
</imagePath>
<mapCenter>
<lng>
121.183574
</lng>
<lat>
31.291126
</lat>
</mapCenter>
<zoom>
14
</zoom>
<surveillanceVideo>
http://10.51.50.53:8278/live/13060200882000000001@31011402601318800184@34020000001320000001.m3u8?vhost=bduv0utmss4c3nzidjn.a.e-web.com.cn
</surveillanceVideo>
<wsPath>
ws://10.51.50.136:8090/ws/v1
</wsPath>
</config>
src/biz/jgfwnl/data.ts
View file @
d70bd13b
import
moment
=
require
(
"moment"
);
import
{
getChartOutData
,
getKeyValueNumberOutData
,
getListOutData
}
from
"../../cal/out"
;
import
{
separateDataAndUint
}
from
"../../cal/privateTools"
;
import
{
getImageIp
,
latConfig
,
lngConfig
,
port
,
surveillanceVideoConfig
,
zoomConfig
}
from
"../../config/serverConfig"
;
import
{
appConfig
,
getImageIp
,
systemConfig
}
from
"../../config/serverConfig"
;
import
{
getHardware
}
from
"../../data/interface/hardwareData"
;
import
{
getCsgkData
,
getDetachmentRatio
,
getTestAnalysis
,
getTestTotalTime
}
from
"../../data/interface/interfaceService"
;
import
{
getMap
}
from
"../../data/interface/mapInterfaceData"
;
...
...
@@ -25,16 +26,27 @@ export async function getYZY(req, res) {
}
//测试概况
let
csgkQueue
=
{};
let
csgkQueueTime
=
""
;
export
async
function
getCSGK
(
req
,
res
)
{
let
ret
:
any
=
{};
let
today
=
moment
().
format
(
"YYYYMMDD"
);
if
(
today
==
csgkQueueTime
)
{
let
今日数据
data
=
{
"在线车辆数"
:
`
${
getOnlieCarCount
()}
辆`
};
csgkQueue
[
"api2"
]
=
getKeyValueNumberOutData
(
"今日数据"
,
今日数据
data
);
res
.
send
(
csgkQueue
);
return
;
}
csgkQueueTime
=
today
;
let
{
测试牌照分布
data
,
result
,
今日数据
,
今日测试
,
今日功能测试
}
=
await
getCsgkData
();
let
基础数据
Info
=
[];
result
.
forEach
((
info
,
index
)
=>
{
let
{
key
,
value
}
=
info
;
let
{
dataNum
,
dataUnit
}
=
separateDataAndUint
(
value
);
基础数据
Info
.
push
({
key
,
value
:
dataNum
,
unit
:
dataUnit
,
icon
:
`http://
${
getImageIp
()}
:
${
port
}
/csgk/
${
index
+
1
}
.png`
});
基础数据
Info
.
push
({
key
,
value
:
dataNum
,
unit
:
dataUnit
,
icon
:
`http://
${
getImageIp
()}
:
${
systemConfig
.
port
}
/csgk/
${
index
+
1
}
.png`
});
});
ret
[
"api1"
]
=
({
title
:
"基础数据"
,
dataList
:
基础数据
Info
});
...
...
@@ -46,16 +58,63 @@ export async function getCSGK(req, res) {
ret
[
"api5"
]
=
getKeyValueNumberOutData
(
"测试牌照分布"
,
测试牌照分布
data
);
let
路侧监控视频
data
=
{
"src"
:
surveillanceVideoConfig
,
"type"
:
'application/x-mpegURL'
};
let
路侧监控视频
data
=
{
"src"
:
appConfig
.
surveillanceVideo
,
"type"
:
'application/x-mpegURL'
};
ret
[
"api6"
]
=
({
title
:
"路侧监控视频"
,
dataList
:
路侧监控视频
data
});
csgkQueue
=
JSON
.
parse
(
JSON
.
stringify
(
ret
));
res
.
send
(
ret
);
}
//测试分析
let
csfxQueue
=
{};
let
csfxQueueTime
=
""
;
export
async
function
getCSFX
(
req
,
res
)
{
let
ret
:
any
=
{};
let
today
=
moment
().
format
(
"YYYYMMDD"
);
if
(
today
==
csfxQueueTime
)
{
res
.
send
(
csfxQueue
);
return
;
}
csfxQueueTime
=
today
;
getDetachmentRatio
().
then
((
data
)
=>
{
let
企业脱离自动驾驶比率
data
=
data
;
企业脱离自动驾驶比率
data
.
forEach
(
item
=>
{
let
frequency
=
separateDataAndUint
(
item
.
次数
).
dataNum
;
let
kilometer
=
separateDataAndUint
(
item
.
里程
).
dataNum
;
let
ratio
=
Math
.
ceil
(
frequency
/
kilometer
*
100
);
item
[
"比率"
]
=
ratio
;
})
企业脱离自动驾驶比率
data
.
sort
((
a
,
b
)
=>
{
return
b
.
比率
-
a
.
比率
;
})
let
企业脱离自动驾驶比率
Top10
=
企业脱离自动驾驶比率
data
.
slice
(
0
,
10
);
let
企业名称
data
=
[];
let
次数
data
=
[];
let
里程
data
=
[];
let
比率
data
=
[];
企业脱离自动驾驶比率
Top10
.
forEach
(
info
=>
{
let
{
企业名称
,
次数
,
里程
,
比率
}
=
info
;
企业名称
data
.
push
(
企业名称
);
次数
data
.
push
(
次数
);
里程
data
.
push
(
里程
);
比率
data
.
push
(
比率
+
"%"
);
})
let
企业测试自动驾驶比率
Info
=
[
{
key
:
"企业名称"
,
values
:
企业名称
data
},
{
key
:
"次数"
,
values
:
次数
data
},
{
key
:
"里程"
,
values
:
里程
data
},
{
key
:
"比率"
,
values
:
比率
data
},
];
ret
[
"api5"
]
=
getListOutData
(
"企业脱离自动驾驶比率"
,
企业测试自动驾驶比率
Info
);
});
let
{
testMileage
,
functionTestMileage
,
testMileageEnterprise
,
functionTestMileageEnterprise
}
=
await
getTestAnalysis
();
let
月度测试里程分布
data
=
{
测试
:
{
unit
:
'km'
,
dataInfo
:
testMileage
},
功能测试
:
{
unit
:
'km'
,
dataInfo
:
functionTestMileage
}};
ret
[
"api1"
]
=
getChartOutData
(
"月度测试里程分布"
,
月度测试里程分布
data
);
...
...
@@ -73,41 +132,7 @@ export async function getCSFX(req, res) {
let
企业测试时长分布
data
=
{
测试
:
{
unit
:
'h'
,
dataInfo
:
testTimeEnterprise
},
功能测试
:
{
unit
:
'h'
,
dataInfo
:
functionTestTimeEnterprise
}};
ret
[
"api4"
]
=
getChartOutData
(
"企业测试时长分布"
,
企业测试时长分布
data
);
let
企业脱离自动驾驶比率
data
=
await
getDetachmentRatio
();
企业脱离自动驾驶比率
data
.
forEach
(
item
=>
{
let
frequency
=
separateDataAndUint
(
item
.
次数
).
dataNum
;
let
kilometer
=
separateDataAndUint
(
item
.
里程
).
dataNum
;
let
ratio
=
Math
.
ceil
(
frequency
/
kilometer
*
100
);
item
[
"比率"
]
=
ratio
;
})
企业脱离自动驾驶比率
data
.
sort
((
a
,
b
)
=>
{
return
b
.
比率
-
a
.
比率
;
})
let
企业脱离自动驾驶比率
Top10
=
企业脱离自动驾驶比率
data
.
slice
(
0
,
10
);
let
企业名称
data
=
[];
let
次数
data
=
[];
let
里程
data
=
[];
let
比率
data
=
[];
企业脱离自动驾驶比率
Top10
.
forEach
(
info
=>
{
let
{
企业名称
,
次数
,
里程
,
比率
}
=
info
;
企业名称
data
.
push
(
企业名称
);
次数
data
.
push
(
次数
);
里程
data
.
push
(
里程
);
比率
data
.
push
(
比率
+
"%"
);
})
let
企业测试自动驾驶比率
Info
=
[
{
key
:
"企业名称"
,
values
:
企业名称
data
},
{
key
:
"次数"
,
values
:
次数
data
},
{
key
:
"里程"
,
values
:
里程
data
},
{
key
:
"比率"
,
values
:
比率
data
},
];
ret
[
"api5"
]
=
getListOutData
(
"企业脱离自动驾驶比率"
,
企业测试自动驾驶比率
Info
);
csfxQueue
=
JSON
.
parse
(
JSON
.
stringify
(
ret
));
res
.
send
(
ret
);
}
...
...
@@ -151,9 +176,9 @@ export async function mapData(req, res) {
}
]
ret
[
"mapCenter"
]
=
{
lng
:
lngConfig
,
lat
:
latConfig
};
ret
[
"mapCenter"
]
=
{
lng
:
appConfig
.
lng
,
lat
:
appConfig
.
lat
};
ret
[
"zoom"
]
=
{
key
:
"缩放比例"
,
value
:
zoomConfig
};
ret
[
"zoom"
]
=
{
key
:
"缩放比例"
,
value
:
appConfig
.
zoom
};
res
.
send
(
ret
);
}
\ No newline at end of file
src/biz/jgfwnl/wsData.ts
View file @
d70bd13b
import
{
getDpData
}
from
"../../data/interface/wsData"
;
import
{
Socket
}
from
"../../net/socket_server"
;
import
{
logError
}
from
"../../util/log"
;
//连接池
let
connectionPool
=
{};
//数据池
let
dataQueue
=
[];
//广播消息
export
async
function
sendMsg
(
data
)
{
dataQueue
.
push
(
data
);
export
function
broadcastMsg
(
data
)
{
for
(
let
key
in
connectionPool
)
{
let
result
=
{
code
:
200
,
success
:
true
,
data
}
let
result
=
{
code
:
200
,
success
:
true
,
data
}
;
try
{
connectionPool
[
key
].
send
(
JSON
.
stringify
(
result
));
}
catch
(
err
)
{
console
.
log
(
"广播消息失败:"
,
err
);
logError
(
`广播消息失败:
${
err
}
`
);
}
}
}
...
...
@@ -30,10 +27,8 @@ export async function initSocketServer(port) {
Socket
.
createServer
(
port
,
function
(
wss
)
{
wss
.
on
(
'connection'
,
function
(
ws
,
req
)
{
let
ip
=
analysisUserUrl
(
req
);
console
.
log
(
"连接成功 => userId:"
,
ip
);
connectionPool
[
ip
]
=
ws
;
ws
.
on
(
'message'
,
function
(
data
)
{
//回应心跳包
if
(
data
==
'i am heart'
)
ws
.
send
(
JSON
.
stringify
({
success
:
true
,
code
:
199
}));
...
...
@@ -42,77 +37,18 @@ export async function initSocketServer(port) {
ws
.
on
(
'close'
,
function
(
data
){
if
(
ws
.
_socket
&&
ws
.
_socket
.
_peername
&&
ws
.
_socket
.
_peername
.
address
)
{
let
userId
=
ws
.
_socket
.
_peername
.
address
;
console
.
log
(
"close"
,
userId
,
data
);
console
.
log
(
"close"
,
userId
);
delete
connectionPool
[
userId
];
}
});
console
.
log
(
'发送初始化车辆:'
,
dataQueue
.
length
,
'辆'
);
dataQueue
.
forEach
(
info
=>
{
ws
.
send
(
JSON
.
stringify
({
code
:
200
,
success
:
true
,
data
:
info
}));
});
});
console
.
log
(
'socket server listen on port:'
,
port
);
});
}
//测试服务
let
testQueue
;
export
async
function
initSocketServertest
(
port
)
{
Socket
.
createServer
(
port
,
function
(
wss
)
{
wss
.
on
(
'connection'
,
function
(
ws
,
req
)
{
let
ip
=
analysisUserUrl
(
req
);
console
.
log
(
"连接成功 => userId:"
,
ip
);
testQueue
=
ws
;
ws
.
on
(
'message'
,
function
(
data
)
{
//回应心跳包
if
(
data
==
'i am heart'
)
ws
.
send
(
'{success:true, code:199}'
);
});
ws
.
on
(
'close'
,
function
(
data
){
if
(
ws
.
_socket
&&
ws
.
_socket
.
_peername
&&
ws
.
_socket
.
_peername
.
address
)
{
let
userId
=
ws
.
_socket
.
_peername
.
address
;
console
.
log
(
"close"
,
userId
,
data
);
delete
connectionPool
[
userId
];
}
let
{
initList
,
count
}
=
getDpData
();
console
.
log
(
`前端连接本服务成功 => userId:
${
ip
}
, 发送初始化车辆:
${
count
}
辆`
);
initList
.
forEach
(
info
=>
{
ws
.
send
(
JSON
.
stringify
({
code
:
200
,
success
:
true
,
data
:
info
}));
});
});
console
.
log
(
'socket server listen on port:'
,
port
);
});
}
export
function
callTestServer
(
num
)
{
let
latitude
=
31.177747
;
let
longitude
=
121.611986
;
let
testData
=
{
"accLat"
:
0.08
,
"accLong"
:
1.542
,
"acceleration"
:
0
,
//加速度
"altitude"
:
-
3276
,
//海拔高度
"canRecvTime"
:
1660285379691
,
//接收数据时间
"direction"
:
0
,
//方向
"drivemode"
:
0
,
//驾驶模式
"latitude"
:
31.177747
,
"longitude"
:
121.611986
,
"mileage"
:
12
,
"positiontime"
:
0
,
"vehicleid"
:
""
,
"velocity"
:
13
,
"vin"
:
"LSJE24090MS029920"
}
for
(
let
i
=
1
;
i
<=
100
;
i
++
)
{
let
addData
=
JSON
.
parse
(
JSON
.
stringify
(
testData
))
addData
.
vehicleid
=
''
+
i
;
addData
.
latitude
=
latitude
+
(
num
*
i
*
(
1
/
100000
));
addData
.
longitude
=
longitude
+
(
num
*
i
*
(
1
/
100000
));
console
.
log
(
num
+
"-"
+
i
+
' log:'
+
addData
.
longitude
+
' lat: '
+
addData
.
latitude
);
testQueue
.
send
(
JSON
.
stringify
(
addData
));
}
}
\ No newline at end of file
src/config/serverConfig.ts
View file @
d70bd13b
...
...
@@ -5,24 +5,23 @@ import { analysisXml } from "../util/myXML";
import
{
SYSTEMERRORENUM
}
from
"./errorEnum"
;
const
os
=
require
(
'os'
);
export
let
port
;
export
let
socketPort
;
export
let
systemConfig
=
{
port
:
9999
,
socketPort
:
''
};
export
let
dbConfig
;
export
let
appConfig
=
{
rightView
:
''
,
cloudResource
:
''
,
physicalResource
:
''
,
mapPort
:
''
,
wsPath
:
''
,
lng
:
""
,
//地图中心点
lat
:
""
,
//地图中心点
zoom
:
14
,
//中心点配置
surveillanceVideo
:
""
,
//监控地址
};
export
let
mongoServerConstVal
;
export
let
mySqlConfig
;
let
imagePathConfig
=
""
;
export
let
lngConfig
=
""
;
export
let
latConfig
=
""
;
export
let
zoomConfig
=
""
;
export
let
surveillanceVideoConfig
=
""
;
let
serverIp
=
""
;
const
ConfigName
=
"serverConfig.xml"
;
export
async
function
initConfig
()
{
...
...
@@ -32,23 +31,18 @@ export async function initConfig() {
let
configInfo
:
any
=
await
analysisXml
(
configStr
);
if
(
!
configInfo
||
!
configInfo
.
config
)
console
.
log
(
"xml中无配置加载"
);
else
{
let
{
portConfig
,
socketPortConfig
,
rightView
,
leftView
,
mapView
,
imagePath
,
mapCenter
,
zoom
,
surveillanceVideo
}
=
configInfo
.
config
;
if
(
!
getConf
(
portConfig
))
throw
new
SysError
(
SYSTEMERRORENUM
.
初始化配置失败
,
'serverConfig.xml中 缺少 port'
);
if
(
!
getConf
(
socketPortConfig
))
throw
new
SysError
(
SYSTEMERRORENUM
.
初始化配置失败
,
'serverConfig.xml中 缺少 sockentPort'
);
if
(
!
getConf
(
rightView
))
throw
new
SysError
(
SYSTEMERRORENUM
.
初始化配置失败
,
'serverConfig.xml中 缺少 rightView'
);
if
(
!
getConf
(
leftView
)
||
!
getConf
(
leftView
[
0
].
cloudResource
)
||
!
getConf
(
leftView
[
0
].
physicalResource
)
)
{
throw
new
SysError
(
SYSTEMERRORENUM
.
初始化配置失败
,
'serverConfig.xml中 缺少 leftView 或 physicalResource || cloudResource'
);
}
if
(
!
getConf
(
mapView
)
||
!
getConf
(
mapView
[
0
].
online
)
||
!
getConf
(
mapView
[
0
].
broken
)
||
!
getConf
(
mapView
[
0
].
token
)
)
{
throw
new
SysError
(
SYSTEMERRORENUM
.
初始化配置失败
,
'serverConfig.xml中 缺少 mapView 或 online || broken || token'
);
}
//必要配置
let
integralConfig
=
[
"port"
,
"socketPort"
,
"rightView"
,
{
"leftView"
:[
"cloudResource"
,
"physicalResource"
]
},
{
"mapView"
:[
"mapPort"
,
"online"
,
"broken"
,
"token"
]
},
"imagePath"
,
{
"mapCenter"
:[
"lng"
,
"lat"
]},
"zoom"
,
"surveillanceVideo"
,
"wsPath"
];
checkConfig
(
integralConfig
,
configInfo
.
config
);
let
{
port
,
socketPort
,
rightView
,
leftView
,
mapView
,
imagePath
,
mapCenter
,
zoom
,
surveillanceVideo
,
wsPath
}
=
configInfo
.
config
;
systemConfig
.
port
=
port
[
0
];
systemConfig
.
socketPort
=
socketPort
[
0
];
if
(
!
getConf
(
imagePath
)
)
throw
new
SysError
(
SYSTEMERRORENUM
.
初始化配置失败
,
'serverConfig.xml中 缺少 imagePath'
);
if
(
!
getConf
(
mapCenter
)
)
throw
new
SysError
(
SYSTEMERRORENUM
.
初始化配置失败
,
'serverConfig.xml中 缺少 mapCenter'
);
if
(
!
getConf
(
zoom
)
)
throw
new
SysError
(
SYSTEMERRORENUM
.
初始化配置失败
,
'serverConfig.xml中 缺少 zoom'
);
if
(
!
getConf
(
surveillanceVideo
)
)
throw
new
SysError
(
SYSTEMERRORENUM
.
初始化配置失败
,
'serverConfig.xml中 缺少 surveillanceVideo'
);
port
=
portConfig
[
0
];
socketPort
=
socketPortConfig
[
0
];
//左屏
appConfig
.
cloudResource
=
leftView
[
0
].
cloudResource
[
0
];
appConfig
.
physicalResource
=
leftView
[
0
].
physicalResource
[
0
];
...
...
@@ -59,15 +53,17 @@ export async function initConfig() {
appConfig
.
mapPort
=
mapView
[
0
].
mapPort
[
0
]
+
"&online="
+
online
+
"&broken="
+
broken
+
"&token="
+
token
||
appConfig
.
mapPort
;
//右屏接口
appConfig
.
rightView
=
rightView
[
0
];
//图片地址
imagePathConfig
=
imagePath
[
0
];
//地图中心点
lngConfi
g
=
mapCenter
[
0
].
lng
[
0
];
latConfig
=
mapCenter
[
0
].
lat
[
0
];
appConfig
.
ln
g
=
mapCenter
[
0
].
lng
[
0
];
appConfig
.
lat
=
mapCenter
[
0
].
lat
[
0
];
//缩放比
zoomConfig
=
zoom
[
0
]
;
appConfig
.
zoom
=
parseInt
(
zoom
[
0
])
;
//监控视频
surveillanceVideoConfig
=
surveillanceVideo
[
0
];
appConfig
.
surveillanceVideo
=
surveillanceVideo
[
0
];
//ws
appConfig
.
wsPath
=
wsPath
[
0
];
serverIp
=
imagePath
[
0
];
}
console
.
log
(
"config init success"
);
...
...
@@ -76,14 +72,31 @@ export async function initConfig() {
throw
new
BizError
(
"服务器配置解析错误 请检查根目录下 serverConfig.xml 文件是否正确"
);
}
}
function
checkConfig
(
config
,
configData
)
{
config
.
forEach
(
item
=>
{
if
(
typeof
item
==
"object"
)
{
for
(
let
key
in
item
)
{
if
(
!
configData
[
key
]
||
!
configData
[
key
][
0
])
{
throw
new
SysError
(
SYSTEMERRORENUM
.
初始化配置失败
,
`serverConfig.xml中 缺少
${
key
}
`
);
}
item
[
key
].
forEach
(
subItem
=>
{
if
(
!
configData
[
key
][
0
][
subItem
]
||
!
configData
[
key
][
0
][
subItem
][
0
])
{
throw
new
SysError
(
SYSTEMERRORENUM
.
初始化配置失败
,
`serverConfig.xml中
${
key
}
缺少
${
subItem
}
`
);
}
});
}
}
else
{
if
(
!
configData
[
item
]
||
!
configData
[
item
][
0
])
{
throw
new
SysError
(
SYSTEMERRORENUM
.
初始化配置失败
,
`serverConfig.xml中 缺少
${
item
}
`
);
}
}
});
}
//获取内网地址
export
function
getImageIp
()
{
return
imagePathConfig
;
return
serverIp
;
}
function
getConf
(
conf
,
index
=
0
)
{
if
(
!
conf
||
!
conf
[
index
])
return
false
;
return
true
;
}
\ No newline at end of file
src/data/interface/interfaceService.ts
View file @
d70bd13b
import
moment
=
require
(
"moment"
)
import
{
ERRORENUM
,
SYSTEMERRORENUM
}
from
"../../config/errorEnum"
;
import
{
appConfig
,
getImageIp
,
port
}
from
"../../config/serverConfig"
;
import
{
appConfig
,
getImageIp
,
systemConfig
}
from
"../../config/serverConfig"
;
import
{
BizError
,
SysError
}
from
"../../util/bizError"
;
import
{
get
}
from
"../../util/request"
;
// {key:"2021.01", count:"31km", autoCount:"45km"}, {key:"2021.02", count:"42km", autoCount:"75km"}, {key:"2020.02", count:"42km", autoCount:"75km"}, {key:"2022.08", count:"42km", autoCount:"75km"}
...
...
@@ -79,9 +79,9 @@ async function getTestLicense() {
测试牌照分布
.
forEach
(
item
=>
{
let
{
enterprise
,
cnt
}
=
item
;
let
imgItem
=
`http://
${
getImageIp
()}
:
${
port
}
/img/
${
enterprise
}
.png`
;
let
imgItem
=
`http://
${
getImageIp
()}
:
${
systemConfig
.
port
}
/img/
${
enterprise
}
.png`
;
测试牌照分布
data
[
imgItem
]
=
cnt
+
"辆"
;
测试牌照数
+=
cnt
;
测试牌照数
+=
parseInt
(
cnt
)
;
})
...
...
@@ -224,7 +224,6 @@ export async function getCsgkData() {
return
{
测试牌照分布
data
,
result
,
今日数据
,
今日测试
,
今日功能测试
};
}
//======
//月度测试时长分布
export
async
function
getTestTotalTime
()
{
...
...
src/data/interface/wsData.ts
View file @
d70bd13b
import
moment
=
require
(
"moment"
);
import
*
as
WebSocket
from
"ws"
import
{
sendMsg
}
from
"../../biz/jgfwnl/wsData"
;
import
{
broadcastMsg
}
from
"../../biz/jgfwnl/wsData"
;
import
{
appConfig
}
from
"../../config/serverConfig"
;
import
{
logConsole
,
logHandle
}
from
"../../util/log"
;
//连接锁
...
...
@@ -24,10 +26,7 @@ let heartCount = 0;
//心跳
let
heart
=
{
timeout
:
40
*
1000
,
//40秒一次心跳包
serverTimeout
:
4
*
1000
,
//心跳包超时时间
timeoutObj
:
null
,
notRespontNum
:
3
,
//未响应次数阈值
serverTimeoutObj
:
null
,
reconnectTimeout
:
5
*
1000
,
//重连延迟
start
:(
ws
)
=>
{
if
(
!
heartCount
)
{
...
...
@@ -36,61 +35,48 @@ let heart = {
}
//消除延时器
heart
.
timeoutObj
&&
clearTimeout
(
heart
.
timeoutObj
);
heart
.
serverTimeoutObj
&&
clearTimeout
(
heart
.
serverT
imeoutObj
);
heart
.
timeoutObj
&&
clearInterval
(
heart
.
t
imeoutObj
);
//次数限制
let
notRespontCount
=
heart
.
notRespontNum
;
heart
.
timeoutObj
=
set
Timeout
(
()
=>
{
heart
.
timeoutObj
=
set
Interval
(
()
=>
{
//发送心跳包
console
.
log
(
"
客户端
发送心跳包"
);
console
.
log
(
"
本机call目标服务
发送心跳包"
);
ws
.
send
(
"i am heart"
);
//计算答复时间
heart
.
serverTimeoutObj
=
setTimeout
(
()
=>
{
if
(
notRespontCount
>
0
)
notRespontCount
--
;
else
ws
.
close
();
//超过未响应阈值 关闭连接
},
heart
.
serverTimeout
);
},
heart
.
timeout
)
},
heart
.
timeout
);
},
reset
:
()
=>
{
//重置
clearTimeout
(
heart
.
serverTimeoutObj
);
clearTimeout
(
heart
.
timeoutObj
);
clearInterval
(
heart
.
timeoutObj
);
}
}
//ws客户端
async
function
createSocket
()
{
let
path
=
"ws://10.51.50.136:8090/ws/v1"
;
// let path = "ws://192.168.0.105:9797"
let
ws
=
new
WebSocket
(
path
,
{
perMessageDeflate
:
false
});
let
ws
=
new
WebSocket
(
appConfig
.
wsPath
,
{
perMessageDeflate
:
false
});
ws
.
onclose
=
async
(
err
)
=>
{
console
.
log
(
"连接关闭: "
,
err
);
lockReconnect
=
false
;
heartCount
=
0
;
heart
.
reset
();
//断线重连
reconnect
();
console
.
log
(
"客户端 关闭"
);
}
ws
.
onmessage
=
(
msg
)
=>
{
//接收数据
heart
.
start
(
ws
);
stats
(
msg
.
data
);
}
ws
.
onerror
=
(
error
)
=>
{
ws
.
close
(
error
.
message
);
ws
.
close
();
}
ws
.
onopen
=
()
=>
{
heart
.
start
(
ws
);
}
console
.
log
(
`连接汽车数据socket服务:
${
appConfig
.
wsPath
}
成功`
);
}
export
async
function
initWSData
()
{
...
...
@@ -98,33 +84,62 @@ export async function initWSData() {
}
//在线车辆
let
distinctMap
=
{};
//{id:1}
let
dp
=
{};
//数据池 {"id":{lastMs:最新的时间, list:[] } }
let
dp
=
{};
//数据池 {"id":{lastMs:最新的时间, list:[{},{},{}], index:0 } }
let
dpNewDate
=
''
;
export
function
stats
(
data
)
{
let
dateFormat
=
moment
().
format
(
'YYYYMMDD'
);
if
(
!
dpNewDate
)
dpNewDate
=
dateFormat
;
let
dataType
=
typeof
data
;
if
(
dataType
==
'object'
)
{
console
.
log
(
data
);
}
else
if
(
dataType
==
"string"
)
{
if
(
dataType
==
"string"
)
{
try
{
let
dataJson
=
JSON
.
parse
(
data
);
let
{
vehicleid
,
latitude
,
longitude
}
=
dataJson
;
distinctMap
[
vehicleid
]
=
1
;
sendMsg
({
lng
:
longitude
||
0.0
,
lat
:
latitude
||
0.0
,
vehicleid
});
let
{
vehicleid
,
latitude
,
longitude
,
positiontime
,
canRecvTime
}
=
dataJson
;
broadcastMsg
({
lng
:
longitude
||
0.0
,
lat
:
latitude
||
0.0
,
vehicleid
});
//加入到缓存
let
lastMs
=
positiontime
||
canRecvTime
;
if
(
lastMs
)
{
//数据包里有时间就缓存
checkData
(
dateFormat
);
if
(
!
dp
[
vehicleid
]
)
dp
[
vehicleid
]
=
{
lastMs
,
list
:[],
index
:
0
};
//初始化缓存
dp
[
vehicleid
].
list
[
dp
[
vehicleid
].
index
]
=
{
lng
:
longitude
||
0.0
,
lat
:
latitude
||
0.0
,
vehicleid
,
lastMs
};
dp
[
vehicleid
].
index
+=
1
;
if
(
dp
[
vehicleid
].
index
>
4
)
dp
[
vehicleid
].
index
=
0
;
}
}
catch
(
err
)
{
console
.
log
(
data
);
logHandle
(
"ws 返回数据不是json"
+
data
)
//todo 加日志
logHandle
(
"ws 返回数据不是json --> "
+
data
);
}
}
else
{
logHandle
(
`ws 返回数据不符合规范 类型:
${
dataType
}
--> `
+
data
)
}
//其他格式数据抛弃
}
function
checkData
(
time
)
{
if
(
time
!=
dpNewDate
)
{
dpNewDate
=
time
;
dp
=
{};
}
}
export
function
getDpData
()
{
let
result
=
[];
for
(
let
key
in
dp
)
{
dp
[
key
].
list
.
forEach
(
info
=>
{
result
.
push
(
info
);
});
}
result
.
sort
(
(
a
,
b
)
=>
{
return
a
.
lastMs
-
b
.
lastMs
});
let
initList
=
[];
result
.
forEach
(
info
=>
{
let
{
lng
,
lat
,
vehicleid
,
lastMs
}
=
info
;
initList
.
push
({
lng
,
lat
,
vehicleid
});
});
return
{
initList
,
count
:
Object
.
keys
(
dp
).
length
};
}
export
function
getOnlieCarCount
()
{
return
Object
.
keys
(
d
istinctMa
p
).
length
;
return
Object
.
keys
(
dp
).
length
;
}
/* data 数据长这样
...
...
src/excelCmd.js
deleted
100644 → 0
View file @
10c10382
let
fs
=
require
(
'fs'
);
const
xlsx
=
require
(
'node-xlsx'
);
const
path
=
require
(
'path'
);
//excel的名字
//const excelName = "其他数据模板.xlsx";
// const excelAnalysisName = "其他数据规则.xlsx";
const
excelName
=
"安亭汽车城数据模板.xlsx"
;
const
excelAnalysisName
=
"安亭汽车城解析规则.xlsx"
;
let
typeEnum
=
{
"柱状数据"
:
1
,
"列表数据"
:
1
,
"单轴多柱状数据"
:
1
,
"双轴多柱状数据"
:
1
,
}
function
changeDataName
(
str
)
{
let
result
=
str
.
replace
(
/
[
()""“”
/
()-
]
/
,
"_"
);
for
(
let
i
=
0
;
i
<
10
;
i
++
)
{
result
=
result
.
replace
(
/
[
()""“”
/
()-
]
/
,
"_"
);
}
return
result
;
}
let
createBizAndDataConfigMap
=
{
};
//配置解析excel
function
analysisConfigExcel
()
{
const
workSheetsFromFile
=
xlsx
.
parse
(
`../res/
${
excelAnalysisName
}
`
);
let
sheetMap
=
{};
let
sheetList
=
[];
for
(
let
i
=
0
;
i
<
workSheetsFromFile
.
length
;
i
++
)
{
let
sheetInfo
=
workSheetsFromFile
[
i
];
sheetMap
[
sheetInfo
.
name
]
=
sheetInfo
.
data
;
sheetList
.
push
(
sheetInfo
);
}
return
sheetMap
}
function
createConfig
()
{
let
excelData
=
analysisConfigExcel
();
for
(
let
configSheetName
in
excelData
)
{
let
data
=
excelData
[
configSheetName
];
for
(
let
y
=
1
;
y
<
data
.
length
;
y
++
)
{
let
valueList
=
data
[
y
];
let
pageName
=
valueList
[
0
];
let
sheetName
=
valueList
[
1
];
let
type
=
valueList
[
2
];
let
dataName
=
changeDataName
(
valueList
[
3
]);
let
title
=
valueList
[
4
];
let
unit
=
valueList
[
5
];
let
total
=
valueList
[
6
];
let
percent
=
valueList
[
7
];
let
titleList
=
valueList
[
8
]
?
JSON
.
parse
(
valueList
[
8
])
:
""
;
let
keyValueObj
=
valueList
[
9
]
?
JSON
.
parse
(
valueList
[
9
])
:
""
;
if
(
!
createBizAndDataConfigMap
[
pageName
]
)
createBizAndDataConfigMap
[
pageName
]
=
{
sheetName
,
apiList
:[]};
createBizAndDataConfigMap
[
pageName
].
apiList
.
push
({
type
,
dataName
,
title
,
unit
,
total
,
percent
,
titleList
,
keyValueObj
});
}
}
}
createConfig
();
//创建data层
function
createData
()
{
let
str
=
`
import { limitEnteNameString, changeDataName } from "../util/tools";
import { planarArrBecomeKeyValueData, planarArrBecomeChartData, planarArrBecomeStringListData, planarArrBecomeListData} from "../cal/excelEnter";
import { getExcelDataBySheetName } from "../util/analysisExcel";
`
;
for
(
let
pangeName
in
createBizAndDataConfigMap
)
{
let
{
sheetName
}
=
createBizAndDataConfigMap
[
pangeName
];
let
forKeyValueList
=
[];
let
forChartList
=
[];
let
forStringList
=
[];
let
forListData
=
[];
createBizAndDataConfigMap
[
pangeName
].
apiList
.
forEach
(
info
=>
{
if
(
info
.
type
==
"双轴多柱状数据"
||
info
.
type
==
"单轴多柱状数据"
||
info
.
type
==
"柱状数据"
)
forChartList
.
push
(
info
.
dataName
);
else
if
(
info
.
type
==
"键值数据"
)
forKeyValueList
.
push
(
info
.
dataName
);
else
if
(
info
.
type
==
"列表数据"
)
forListData
.
push
(
info
.
dataName
);
else
if
(
info
.
type
==
"字符数据"
)
forStringList
.
push
(
info
.
dataName
);
});
str
+=
`
export function get
${
sheetName
}
() {
let bolckDataList = getExcelDataBySheetName('
${
excelName
}
', '
${
sheetName
}
');
let result = {};
let forKeyValueList =
${
JSON
.
stringify
(
forKeyValueList
)}
;
let forChartList =
${
JSON
.
stringify
(
forChartList
)}
;
let forStringList =
${
JSON
.
stringify
(
forStringList
)}
;
let forListData =
${
JSON
.
stringify
(
forListData
)}
;
for (let i = 0; i < bolckDataList.length; i++) {
let {blockData, blockTitle} = bolckDataList[i];
let changeName = changeDataName(blockTitle);
if (forKeyValueList.indexOf(changeName) > -1 ) result[changeName] = planarArrBecomeKeyValueData(blockData);
if (forChartList.indexOf(changeName) > -1 ) result[changeName] = planarArrBecomeChartData(blockData);
if (forStringList.indexOf(changeName) > -1 ) result[changeName] = planarArrBecomeStringListData(blockData);
if (forListData.indexOf(changeName) > -1 ) result[changeName] = planarArrBecomeListData(blockData);
}
return result;
}`
;
}
let
path
=
`./data/analysisExcelData1.ts`
;
fs
.
access
(
path
,
(
err
)
=>
{
if
(
!
err
)
{
console
.
error
(
path
,
"文件已存在"
);
return
;
}
fs
.
writeFileSync
(
path
,
str
);
console
.
log
(
path
,
"创建文件成功"
)
});
}
//创建biz层
function
createBiz
(){
for
(
let
pageName
in
createBizAndDataConfigMap
)
{
let
{
apiList
,
sheetName
}
=
createBizAndDataConfigMap
[
pageName
];
let
thisBizData
=
getBizStr
(
apiList
,
sheetName
);
let
path
=
`./biz/
${
pageName
}
.ts`
;
fs
.
access
(
path
,
(
err
)
=>
{
if
(
!
err
)
{
console
.
error
(
path
,
"文件已存在"
);
return
;
}
fs
.
writeFileSync
(
path
,
thisBizData
);
console
.
log
(
path
,
"创建文件成功"
)
});
}
}
function
getBizStr
(
apiList
,
sheetName
)
{
let
str
=
`
import { getKeyValueNumberOutData, getChartOutData, getKeyValueNotNumberOutData, getListOutData, getScatterFigureOutData, getStringOutData } from "../cal/out";
import { get
${
sheetName
}
} from "../data/analysisExcelData";
`
;
str
+=
`
export function getData(req, res) {
let ret:any = {};
let excelData:any = get
${
sheetName
}
();
`
;
apiList
.
forEach
((
info
,
index
)
=>
{
let
{
dataName
,
unit
,
total
,
percent
,
type
,
titleList
,
keyValueObj
}
=
info
;
const
apiName
=
`api
${
index
+
1
}
`
;
let
functionStr
=
""
;
switch
(
type
)
{
case
"键值数据"
:
functionStr
=
`getKeyValueNumberOutData`
;
break
;
case
"柱状数据"
:
case
"单轴多柱状数据"
:
case
"双轴多柱状数据"
:
functionStr
=
`getChartOutData`
;
break
;
case
"列表数据"
:
functionStr
=
`getListOutData`
;
break
;
case
"字符串数据"
:
case
"图片"
:
functionStr
=
`getStringOutData`
;
break
;
};
let
subStr
=
`ret["
${
apiName
}
"] =
${
functionStr
}
("
${
dataName
}
", excelData.
${
dataName
}
);`
;
str
+=
`
${
subStr
}
`
});
str
+=
`
res.send(ret);
}
`
return
str
;
}
//创建Router层
function
createRouter
()
{
let
importName
=
``
;
let
routergetName
=
``
;
let
routerpostName
=
``
;
for
(
let
pageName
in
createBizAndDataConfigMap
)
{
importName
+=
`
import * as
${
pageName
}
Biz from '../biz/
${
pageName
}
';`
;
routergetName
+=
`
httpServer.get('/
${
pageName
}
', asyncHandler(
${
pageName
}
Biz.getData));`
;
routerpostName
+=
`
httpServer.post('/
${
pageName
}
', asyncHandler(
${
pageName
}
Biz.getData));`
;
}
let
str
=
`
import * as asyncHandler from 'express-async-handler'
${
importName
}
export function setRouter(httpServer){
${
routergetName
}
${
routerpostName
}
}`
;
let
path
=
`./routers/router1.ts`
;
fs
.
access
(
path
,
(
err
)
=>
{
if
(
!
err
)
{
console
.
error
(
path
,
"文件已存在"
);
return
;
}
fs
.
writeFileSync
(
path
,
str
);
console
.
log
(
path
,
"创建router文件成功"
)
});
}
createData
();
createBiz
();
createRouter
();
src/main.ts
View file @
d70bd13b
import
{
callTestServer
,
initSocketServer
,
initSocketServertest
}
from
"./biz/jgfwnl/wsData"
;
import
{
initConfig
,
port
,
socketPort
}
from
"./config/serverConfig"
;
import
{
initSocketServer
}
from
"./biz/jgfwnl/wsData"
;
import
{
initConfig
,
systemConfig
}
from
"./config/serverConfig"
;
import
{
getCsgkData
,
initData
}
from
"./data/interface/interfaceService"
;
import
{
initWSData
}
from
"./data/interface/wsData"
;
import
{
httpServer
}
from
"./net/http_server"
;
...
...
@@ -8,11 +8,10 @@ import { httpServer } from "./net/http_server";
async
function
lanuch
()
{
await
initConfig
();
//初始化配置解析
await
initWSData
();
httpServer
.
createServer
(
port
);
await
initSocketServer
(
socketPort
);
await
initData
();
await
initSocketServer
(
systemConfig
.
socketPort
);
httpServer
.
createServer
(
systemConfig
.
port
);
console
.
log
(
'This indicates that the server is started successfully.'
);
}
lanuch
();
\ No newline at end of file
src/net/socket_server.ts
View file @
d70bd13b
...
...
@@ -9,6 +9,6 @@ export class Socket {
maxPayload
:
9999
,
});
callback
(
wss
);
console
.
log
(
"
configCenter
socketServer listen on port:"
+
port
);
console
.
log
(
"socketServer listen on port:"
+
port
);
}
}
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