Commit 50b2c849 by lixinming

no message

parent 9aede30e
...@@ -6,4 +6,5 @@ ...@@ -6,4 +6,5 @@
/logs /logs
/video /video
*test* *test*
*.log *.log
\ No newline at end of file dist/嘉定汽车城用户手册.docx
{ {
"name": "gameserver", "name": "screen",
"version": "1.0.0", "version": "1.0.0",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
...@@ -253,6 +253,15 @@ ...@@ -253,6 +253,15 @@
"resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz", "resolved": "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz",
"integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
}, },
"call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"requires": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
}
},
"caseless": { "caseless": {
"version": "0.12.0", "version": "0.12.0",
"resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", "resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz",
...@@ -589,6 +598,21 @@ ...@@ -589,6 +598,21 @@
"universalify": "^0.1.0" "universalify": "^0.1.0"
} }
}, },
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"get-intrinsic": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
"integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
"requires": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.3"
}
},
"getpass": { "getpass": {
"version": "0.1.7", "version": "0.1.7",
"resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", "resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz",
...@@ -616,6 +640,19 @@ ...@@ -616,6 +640,19 @@
"har-schema": "^2.0.0" "har-schema": "^2.0.0"
} }
}, },
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"requires": {
"function-bind": "^1.1.1"
}
},
"has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
},
"http-errors": { "http-errors": {
"version": "1.7.2", "version": "1.7.2",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
...@@ -976,6 +1013,11 @@ ...@@ -976,6 +1013,11 @@
"resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz", "resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz",
"integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=" "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU="
}, },
"object-inspect": {
"version": "1.12.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
"integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
},
"on-finished": { "on-finished": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
...@@ -1047,9 +1089,12 @@ ...@@ -1047,9 +1089,12 @@
"integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=" "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew="
}, },
"qs": { "qs": {
"version": "6.5.2", "version": "6.11.0",
"resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=" "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"requires": {
"side-channel": "^1.0.4"
}
}, },
"range-parser": { "range-parser": {
"version": "1.2.1", "version": "1.2.1",
...@@ -1123,6 +1168,13 @@ ...@@ -1123,6 +1168,13 @@
"tough-cookie": "~2.5.0", "tough-cookie": "~2.5.0",
"tunnel-agent": "^0.6.0", "tunnel-agent": "^0.6.0",
"uuid": "^3.3.2" "uuid": "^3.3.2"
},
"dependencies": {
"qs": {
"version": "6.5.3",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
"integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
}
} }
}, },
"require_optional": { "require_optional": {
...@@ -1216,6 +1268,16 @@ ...@@ -1216,6 +1268,16 @@
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
}, },
"side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"requires": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
}
},
"sift": { "sift": {
"version": "7.0.1", "version": "7.0.1",
"resolved": "https://registry.npm.taobao.org/sift/download/sift-7.0.1.tgz", "resolved": "https://registry.npm.taobao.org/sift/download/sift-7.0.1.tgz",
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
"mysql": "^2.18.1", "mysql": "^2.18.1",
"node-xlsx": "^0.16.1", "node-xlsx": "^0.16.1",
"nodemailer": "^6.1.1", "nodemailer": "^6.1.1",
"qs": "^6.11.0",
"request": "^2.88.0", "request": "^2.88.0",
"svg-captcha": "^1.3.12", "svg-captcha": "^1.3.12",
"ws": "^5.2.2", "ws": "^5.2.2",
...@@ -32,13 +33,13 @@ ...@@ -32,13 +33,13 @@
"license": "ISC", "license": "ISC",
"bin": "./out/main.js", "bin": "./out/main.js",
"pkg": { "pkg": {
"scripts":"out/**/*.js", "scripts": "out/**/*.js",
"assets": [ "assets": [
"public/**/*", "public/**/*",
"res/**/*", "res/**/*",
"images/**/*", "images/**/*",
"video/**/*" "video/**/*"
], ],
"outputPath": "dist" "outputPath": "dist"
} }
} }
<config> <config>
<port>30001</port> <port>30001</port>
<socketPort>30002</socketPort> <socketPort>30002</socketPort>
<rightView>http://10.51.50.136:8090/sql/execute</rightView> <controlSocketPort>30003</controlSocketPort>
<!-- <port>30004</port>
<socketPort>30005</socketPort>
<controlSocketPort>30006</controlSocketPort> -->
<dataCenterInterface>
<!-- 测试企业及车辆数量 -->
<enterpriseVehicleAmount>http://10.51.50.203:8000/icv-openapi/v1/static/enterpriseVehicleAmount</enterpriseVehicleAmount>
<!-- 总实时测试概况接口 -->
<testStatusTotal>http://10.51.50.203:8000/icv-openapi/v1/realtime/statistics/testStatusTotal</testStatusTotal>
<!-- 今日实时测试概况接口 -->
<todayTestStatusTotal>http://10.51.50.203:8000/icv-openapi/v1/realtime/statistics/todayTestStatusTotal</todayTestStatusTotal>
<!-- 企业历史里程及时长统计信息接口-->
<enterpriseTestStatus>http://10.51.50.203:8000/icv-openapi/v1/history/statistics/enterpriseTestStatus</enterpriseTestStatus>
<!-- 月度历史里程及时长统计信息接口 -->
<monthlyTestStatus>http://10.51.50.203:8000/icv-openapi/v1/history/statistics/monthlyTestStatus</monthlyTestStatus>
<!-- 企业历史脱离率统计接口 -->
<enterpriseExitRate>http://10.51.50.203:8000/icv-openapi/v1/history/statistics/enterpriseExitRate</enterpriseExitRate>
<!-- 获取小车详情 -->
<vehicleInfo>http://10.51.50.203:8000/icv-openapi/v1/vehicle/info</vehicleInfo>
<!-- 小车历史测试信息 -->
<testHistory>http://10.51.50.203:8000/icv-openapi/v1/vehicle/testHistory</testHistory>
<!-- 违规信息 -->
<vehicleAlert>http://10.51.50.203:8000/icv-openapi/v1/vehicle/alert</vehicleAlert>
<!-- 车辆监控视频 -->
<videoPlay>http://10.51.50.203:8000/icv-openapi/v1/video/play</videoPlay>
</dataCenterInterface>
<leftView> <leftView>
<!-- 云资源数据 -->
<cloudResource>http://10.51.50.140:8080/api/static/PrivateCloudUsageStatics</cloudResource> <cloudResource>http://10.51.50.140:8080/api/static/PrivateCloudUsageStatics</cloudResource>
<!-- 物理资源数据 -->
<physicalResource>http://10.51.50.140:8080/api/v1/PrivateCloudCurrentUsages</physicalResource> <physicalResource>http://10.51.50.140:8080/api/v1/PrivateCloudCurrentUsages</physicalResource>
<!-- <cloudResource>http://192.168.0.27:8080/api/static/PrivateCloudUsageStatics</cloudResource>
<physicalResource>http://192.168.0.27:8080/api/v1/PrivateCloudCurrentUsages</physicalResource> -->
</leftView> </leftView>
<!-- 地图中间数据 -->
<mapView> <mapView>
<mapPort>http://10.51.48.213/nlink/v2/getAllDevicesInfo?prjid=0255e1f7515348cc87c7bb2cc6341fer</mapPort> <mapPort>http://10.51.48.213/nlink/v2/getAllDevicesInfo?prjid=0255e1f7515348cc87c7bb2cc6341fer</mapPort>
<online>3</online> <online>3</online>
<broken>3</broken> <broken>3</broken>
<token>09a98bc555474e058ef90b6cc6e23638</token> <token>09a98bc555474e058ef90b6cc6e23638</token>
</mapView> </mapView>
<imagePath>192.168.0.47</imagePath> <!-- 图片地址 这里填本机地址 -->
<imagePath>192.168.0.105</imagePath>
<!-- 地图中心点 -->
<mapCenter> <mapCenter>
<lng>121.183574</lng> <lng>121.183574</lng>
<lat>31.291126</lat> <lat>31.291126</lat>
</mapCenter> </mapCenter>
<!-- 地图初始比例 -->
<zoom>14</zoom> <zoom>14</zoom>
<!-- 路测监控 -->
<surveillanceVideo>http://10.51.50.53:8278/live/13060200882000000001@31011402601318800184@34020000001320000001.m3u8?vhost=bduv0utmss4c3nzidjn.a.e-web.com.cn</surveillanceVideo> <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> <!-- 地图socket数据 -->
<!-- <wsPath>ws://10.51.50.136:8090/ws/v1</wsPath> -->
<wsPath>ws://10.51.50.203:8000/icv-openapi/v1/locWebSocket</wsPath>
</config> </config>
import { controlGetOnlieCarList } from "../data/interface/wsData";
import { Socket } from "../net/socket_server";
import { logError } from "../util/log";
let qs = require('qs');
let viewPool = {};//展示端连接池
let controlWs;
//广播消息
export function broadcastMsg(data) {
for (let userId in viewPool) {
viewPool[userId].send(JSON.stringify(data));
console.log(data);
}
}
function analysisUserUrl(req) {
let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress;
return ip;
}
export async function initControlSocketServer(port) {
Socket.createServer(port, function (wss) {
wss.on('connection', function(ws, req) {
let ip = analysisUserUrl(req);
if (req.url.indexOf('connect') == -1 ) {
//非连接
console.log("连接错误", req.url);
return;
}
let paramater = qs.parse(req.url.split('?')[1]);
if (!paramater.role || (paramater.role != "view" && paramater.role != "control") ) {
console.log("连接参数错误");
return;
} else if (paramater.role == "view" && !paramater.pageName) {
console.log("展示端无页面参数");
return;
}
let userId =`${paramater.role}${ip}`;
ws.userId = userId;
ws.userType = paramater.role;
if (paramater.role == "view") {
viewPool[userId] = ws;
console.log(`连接成功至:${paramater.pageName}页面`);
} else {
if (controlWs) console.log("重复连接");
controlWs = ws;
console.log(`控制端已连接:${userId}`);
}
//==============连接成功
ws.on('message', function(msg) {
let {type, pageName, data} = JSON.parse(msg);
if (type == 'heart') { //回应心跳包
ws.send(JSON.stringify({success:true, code:199}));
return;
}
//接收控制端消息 判断控制端还是展示端
if (ws.userType != "control") {
return;
}
//下发消息给展示端
broadcastMsg(data);
});
ws.on('close', function (data){
if ( ws._socket && ws._socket._peername && ws._socket._peername.address ) {
let userId = ws.userId;
if (ws.userType == "control") {
controlWs = null;
} else {
delete viewPool[userId];
}
console.log("close", userId);
}
});
});
});
}
//控制端获取小车列表
export async function controlGetCarList(req, res) {
//todo 最后加鉴权
let carList = controlGetOnlieCarList();
res.send({carList});
}
\ No newline at end of file
//大事记
import { getListOutData } from "../cal/out";
import { get大事记 } from "../data/analysisExcelData";
export async function getData(req, res) {
let excelData:any = get大事记();
let list = getListOutData("大事记节点",excelData["大事记节点内容"]);
let result = [];
let titleConfig = {
"节点名称":"nodeName",
"标题内容":"title",
"图片名称":"titleImgUrl",
"是否有弹框":"havePop",
"弹框视频/图片内容":"popInfo",
"弹框内容":"popDes",
};
list.valueList.forEach(info => {
let onceNode = {};
info.forEach((item, index) => {
let title = titleConfig[list.titleList[index]];
if (title == "popInfo") {
let splitStrList = splitStr(item);
let {videoList, imgList} = urlSortOut(splitStrList);
onceNode["popVideoUrl"] = videoList;
onceNode["popImgUrl"] = imgList;
return
}
onceNode[title] = item;
});
onceNode["title"] = splitStr(onceNode["title"]);
onceNode["titleImgUrl"] = splitStr(onceNode["titleImgUrl"]);
onceNode["popDes"] = splitDesStr(onceNode["popDes"]);
result.push(onceNode);
});
res.send({"dsjList":result});
}
function splitStr(str) {
let splitList = str.split("\r\n");
return splitList
}
function splitDesStr(str) {
let splitList = str.split("\r\n");
let list = [];
splitList.forEach(info => {
if (info) list.push(info);
});
return list;
}
function urlSortOut(urlList) {
let videoList = [];
let imgList = [];
if (!urlList) return {videoList, imgList}
urlList.forEach(urlStr => {
if (!urlStr) return;
if (urlStr.indexOf(".mp4") >= 0) {
videoList.push(urlStr)
} else {
imgList.push(urlStr)
}
});
return {videoList, imgList}
}
\ No newline at end of file
//-----------已舍弃
//云资源 //云资源
export async function getYZY(req, res) { export async function getYZY(req, res) {
let ret:any = {}; let ret:any = {};
......
...@@ -2,12 +2,3 @@ export enum INTERFACEREQUESTTYPEENUM { ...@@ -2,12 +2,3 @@ export enum INTERFACEREQUESTTYPEENUM {
即时更新 = 1, 即时更新 = 1,
定时更新 定时更新
} }
export enum CODEEENUM {
"请求成功" = 200,
"请求未鉴权" = 401,
"请求路径不存在" = 404,
"请求频率过高" = 503
}
...@@ -4,6 +4,10 @@ export enum ERRORENUM { ...@@ -4,6 +4,10 @@ export enum ERRORENUM {
export enum SYSTEMERRORENUM { export enum SYSTEMERRORENUM {
初始化配置失败 = 1, 初始化配置失败 = 1,
获取第三方接口数据失败, 获取第三方接口数据失败,
未按接口协议返回,
请求未鉴权 = 401,
请求路径不存在 = 404,
请求频率过高 = 503
} }
let bizErrorMsgMap = {}; let bizErrorMsgMap = {};
...@@ -12,8 +16,8 @@ for (let key in ERRORENUM) { ...@@ -12,8 +16,8 @@ for (let key in ERRORENUM) {
} }
let systemErrorMsgMap = {}; let systemErrorMsgMap = {};
for (let key in ERRORENUM) { for (let key in SYSTEMERRORENUM) {
systemErrorMsgMap[ERRORENUM[key]] = key; systemErrorMsgMap[SYSTEMERRORENUM[key]] = key;
} }
export function getBizMsg(param) { export function getBizMsg(param) {
......
...@@ -7,11 +7,11 @@ const os = require('os'); ...@@ -7,11 +7,11 @@ const os = require('os');
export let systemConfig = { export let systemConfig = {
port:9999, port:9999,
socketPort:'' socketPort:'',
controlSocketPort:''
}; };
export let appConfig = { export let appConfig = {
rightView:'',
cloudResource:'', cloudResource:'',
physicalResource:'', physicalResource:'',
mapPort:'', mapPort:'',
...@@ -21,6 +21,26 @@ export let appConfig = { ...@@ -21,6 +21,26 @@ export let appConfig = {
zoom: 14,//中心点配置 zoom: 14,//中心点配置
surveillanceVideo: "",//监控地址 surveillanceVideo: "",//监控地址
}; };
//数据中心接口
export let dataCenterInterfaceConfig = {
enterpriseVehicleAmount:"",//测试企业及车辆数量
testStatusTotal:"",//总实时测试概况接口
todayTestStatusTotal:"",//今日实时测试概况接口
enterpriseTestStatus:"",//企业历史里程及时长统计信息接口
monthlyTestStatus:"",//月度历史里程及时长统计信息接口
enterpriseExitRate:"",//企业历史脱离率统计接口
vehicleInfo:"",//汽车详情
testHistory:"",//小车历史测试数据
vehicleAlert:"",//车辆违规信息
videoPlay:"",//小车监控
};
//todo 地图数据
export let mapDataInterfaceConfig = {
};
let serverIp = ""; let serverIp = "";
const ConfigName = "serverConfig.xml"; const ConfigName = "serverConfig.xml";
...@@ -34,15 +54,31 @@ export async function initConfig() { ...@@ -34,15 +54,31 @@ export async function initConfig() {
else { else {
//必要配置 //必要配置
let integralConfig = [ let integralConfig = [
"port", "socketPort", "rightView", {"leftView":["cloudResource", "physicalResource"] }, "port", "socketPort",
{
"dataCenterInterface":[
"enterpriseVehicleAmount",
"testStatusTotal",
"todayTestStatusTotal",
"enterpriseTestStatus",
"monthlyTestStatus",
"enterpriseExitRate",
"vehicleInfo",
"testHistory",
"vehicleAlert",
"videoPlay"
]}, {"leftView":["cloudResource", "physicalResource"] },
{"mapView":["mapPort", "online","broken", "token" ] }, "imagePath", {"mapCenter":["lng", "lat"]}, "zoom", {"mapView":["mapPort", "online","broken", "token" ] }, "imagePath", {"mapCenter":["lng", "lat"]}, "zoom",
"surveillanceVideo", "wsPath" "surveillanceVideo", "wsPath"
]; ];
checkConfig(integralConfig, configInfo.config); checkConfig(integralConfig, configInfo.config);
let {port, socketPort, rightView, leftView, mapView, imagePath, mapCenter, zoom, surveillanceVideo, wsPath} = configInfo.config; let {port, socketPort, dataCenterInterface, leftView, mapView, imagePath, mapCenter, zoom, surveillanceVideo, wsPath, controlSocketPort} = configInfo.config;
systemConfig.port = port[0]; systemConfig.port = port[0];
systemConfig.socketPort = socketPort[0]; systemConfig.socketPort = socketPort[0];
systemConfig.controlSocketPort = controlSocketPort[0];
//左屏 //左屏
appConfig.cloudResource = leftView[0].cloudResource[0]; appConfig.cloudResource = leftView[0].cloudResource[0];
...@@ -52,8 +88,18 @@ export async function initConfig() { ...@@ -52,8 +88,18 @@ export async function initConfig() {
let broken = mapView[0].broken[0]; let broken = mapView[0].broken[0];
let token = mapView[0].token[0]; let token = mapView[0].token[0];
appConfig.mapPort = mapView[0].mapPort[0] + "&online=" + online + "&broken=" + broken + "&token=" + token || appConfig.mapPort; appConfig.mapPort = mapView[0].mapPort[0] + "&online=" + online + "&broken=" + broken + "&token=" + token || appConfig.mapPort;
//右屏接口 //数据中心接口
appConfig.rightView = rightView[0]; dataCenterInterfaceConfig.enterpriseVehicleAmount = dataCenterInterface[0].enterpriseVehicleAmount[0];
dataCenterInterfaceConfig.testStatusTotal = dataCenterInterface[0].testStatusTotal[0];
dataCenterInterfaceConfig.todayTestStatusTotal = dataCenterInterface[0].todayTestStatusTotal[0];
dataCenterInterfaceConfig.enterpriseTestStatus = dataCenterInterface[0].enterpriseTestStatus[0];
dataCenterInterfaceConfig.monthlyTestStatus = dataCenterInterface[0].monthlyTestStatus[0];
dataCenterInterfaceConfig.enterpriseExitRate = dataCenterInterface[0].enterpriseExitRate[0];
dataCenterInterfaceConfig.vehicleInfo = dataCenterInterface[0].vehicleInfo[0];
dataCenterInterfaceConfig.testHistory = dataCenterInterface[0].testHistory[0];
dataCenterInterfaceConfig.vehicleAlert = dataCenterInterface[0].vehicleAlert[0];
dataCenterInterfaceConfig.videoPlay = dataCenterInterface[0].videoPlay[0];
//地图中心点 //地图中心点
appConfig.lng = mapCenter[0].lng[0]; appConfig.lng = mapCenter[0].lng[0];
appConfig.lat = mapCenter[0].lat[0]; appConfig.lat = mapCenter[0].lat[0];
......
import { limitEnteNameString, changeDataName } from "../util/tools"; import { limitEnteNameString, changeDataName } from "../util/tools";
import { planarArrBecomeKeyValueData, planarArrBecomeChartData, planarArrBecomeStringListData, planarArrBecomeListData} from "../cal/excelEnter"; import { planarArrBecomeKeyValueData, planarArrBecomeChartData, planarArrBecomeStringListData, planarArrBecomeListData} from "../cal/excelEnter";
import { getExcelDataBySheetName } from "../util/analysisExcel"; import { getExcelDataBySheetName } from "../util/analysisExcel";
export function get监管服务能力_云资源() { export function get监管服务能力_云资源() {
let bolckDataList = getExcelDataBySheetName('安亭汽车城数据模板.xlsx', '监管服务能力_云资源'); let bolckDataList = getExcelDataBySheetName('安亭汽车城数据模板.xlsx', '监管服务能力_云资源');
...@@ -130,4 +131,27 @@ ...@@ -130,4 +131,27 @@
} }
return result; return result;
} }
\ No newline at end of file
export function get大事记() {
let bolckDataList = getExcelDataBySheetName('大事记节点.xlsx', '大事记');
let result = {};
let forKeyValueList = [];
let forChartList = [];
let forStringList = [];
let 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;
}
\ No newline at end of file
//接口任务 定期更新 //接口任务 定期更新
import moment = require('moment');
import * as request from 'request'; import * as request from 'request';
import { INTERFACEREQUESTTYPEENUM } from "../config/enum"; import { INTERFACEREQUESTTYPEENUM } from "../config/enum";
import { BizError } from "../util/bizError"; import { BizError } from "../util/bizError";
import { logError } from '../util/log';
import { Config } from './interfaceConfig'; import { Config } from './interfaceConfig';
//初始化接口数据 let accToken = "";//todo token
export async function initInterfaceData() {
const InitTaskSuccess = await taskUpdate();
// if (!InitTaskSuccess) throw new BizError("服务器启动失败: 初始化定时接口数据时出现问题 请检查目标服务器或本地请求配置");
const InitRealTimeSuccess = await initRealTime();
// if (!InitRealTimeSuccess) throw new BizError("服务器启动失败: 初始化实时接口数据时出现问题 请检查目标服务器或本地请求配置");
console.log("初始化接口数据成功");
setInterval(() => {
taskUpdate();
}, 10000);
}
//异常接口 不更新数据
let errorInterfaceInfo = {};
//定时接口 数据更新情况
let updateInfo = {
"接口名称":{lastTime:0, updateUseTime:0},//使用时间是毫秒
};
//定时接口 缓存数据
let dataQueue = {};
async function taskUpdate() {
let thisTaskInfo = [];//此次任务
let defaultUseTime = 60000;
let thisTime = new Date().valueOf(); export async function getInterfaceByInterfaceName(url, body) {
let {data, code}:any = await get(url, body, {});
let initSuccess = true; switch (code) {
case 401: throw new BizError(`${url} 请求未鉴权`);
for (let interfaceName in Config) { case 404: throw new BizError(`${url} 请求路径不存在`);
const LastReqError = errorInterfaceInfo[interfaceName]; case 503: throw new BizError(`${url} 请求频率过高`);
if (LastReqError) {
console.log(`${interfaceName} 请求时出现过 ${LastReqError} 异常 保险起见此次更新不再请求`);
continue;
}
const ThisConfig = Config[interfaceName];
if (ThisConfig.type == INTERFACEREQUESTTYPEENUM.即时更新) continue;
let lastTaskInfo = updateInfo[interfaceName];
if ( !lastTaskInfo ) thisTaskInfo.push({name:defaultUseTime, useTime:defaultUseTime});
else if ( lastTaskInfo && (thisTime - lastTaskInfo) > ThisConfig.time ) {
thisTaskInfo.push({name:defaultUseTime, useTime:lastTaskInfo.updateUseTime});
}
defaultUseTime += 1;
} }
thisTaskInfo.sort((a, b) => {return a.useTime - b.useTime});//耗时短的优先 if (!data) throw new BizError(`${url} 缺少返回参数 data`);
for (let i = 0; i < thisTaskInfo.length; i++) { //更新数据
let {name} = thisTaskInfo[i];
const ThisConfig = Config[name];
const StartTime = new Date().valueOf();
let reqRes;
switch(ThisConfig.reqType) {
case "get": reqRes = await get(ThisConfig.url, ThisConfig.body, ThisConfig.header); break;
case "post": reqRes = await post(ThisConfig.url, ThisConfig.body, ThisConfig.header); break;
case "postForm": reqRes = await postForm(ThisConfig.url, ThisConfig.body); break;
}
const UseTime = new Date().valueOf() - StartTime;
if (reqRes.success) {
if (!updateInfo[name]) updateInfo[name] = {lastTime:thisTime, updateUseTime:UseTime};
else {
updateInfo[name].lastTime = thisTime;
updateInfo[name].updateUseTime = UseTime;
}
if (dataQueue[name]) delete dataQueue[name];
dataQueue[name] = JSON.stringify(reqRes.body);//放入缓存
} else {
let errorMsg = reqRes.message;
if (reqRes.message && reqRes.message.code == "ESOCKETTIMEDOUT") errorMsg = "超时";
console.log(`接口 ${name} 请求失败 失败原因${errorMsg}`);
if (["404", "503"].indexOf(errorMsg) > -1) { //下次不再请求
errorInterfaceInfo[name] = errorMsg;
}
initSuccess = false;
}
}
return initSuccess;
}
//即时数据缓存 当请求失败时会用到这里的数据
let realTimeDataQueue = {};
//即时数据初始化
async function initRealTime() {
let initSuccess = true;
for (let interfaceName in Config) {
const ThisConfig = Config[interfaceName];
if (ThisConfig.type == INTERFACEREQUESTTYPEENUM.定时更新) continue;
let reqRes;
switch(ThisConfig.reqType) {
case "get": reqRes = await get(ThisConfig.url, ThisConfig.body, ThisConfig.header); break;
case "post": reqRes = await post(ThisConfig.url, ThisConfig.body, ThisConfig.header); break;
case "postForm": reqRes = await postForm(ThisConfig.url, ThisConfig.body); break;
}
if (!reqRes.success) {
console.log(`${interfaceName} 接口请求失败 请求地址为 ${ThisConfig.url} 失败原因 ${reqRes.message}`);
initSuccess = false;
}
realTimeDataQueue[interfaceName] = reqRes.data;
}
return initSuccess;
}
export async function getInterfaceByInterfaceName(name, body?, header?) {
const ThisConfig = Config[name];
let data:any;
if (ThisConfig.type == INTERFACEREQUESTTYPEENUM.即时更新) {
let reqRes;
let reqBody = Object.assign( ThisConfig.body|| {}, body || {});
let reqHeader = Object.assign( ThisConfig.header|| {}, header || {});
switch(ThisConfig.reqType) {
case "get": reqRes = await get(ThisConfig.url, reqBody, reqHeader); break;
case "post": reqRes = await post(ThisConfig.url, reqBody, reqHeader); break;
case "postForm": reqRes = await postForm(ThisConfig.url, reqBody ); break;
}
if (reqRes.success) {
data = reqRes.data;
} else {
data = realTimeDataQueue[name];
}
} else data = dataQueue[name];
return data; return data;
} }
function get(url:string, query?, headers?, timeOut?) { function get(url:string, query?, headers?, timeOut?) {
timeOut = timeOut || 5000; timeOut = timeOut || 5000;
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误"); if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
...@@ -143,9 +31,7 @@ function get(url:string, query?, headers?, timeOut?) { ...@@ -143,9 +31,7 @@ function get(url:string, query?, headers?, timeOut?) {
if (query) paramater.qs = query; if (query) paramater.qs = query;
if (headers) paramater.headers = headers; if (headers) paramater.headers = headers;
request.get(paramater, function (err, res, data) { request.get(paramater, function (err, res, data) {
const success = !err && res && res.statusCode == 200; resolve(data);
let message = err || res.statusCode || "";
resolve({success, message, data});
}) })
}) })
} }
......
import moment = require("moment");
import { SYSTEMERRORENUM } from "../../config/errorEnum";
import { dataCenterInterfaceConfig } from "../../config/serverConfig";
import { SysError } from "../../util/bizError";
import { getInterfaceByInterfaceName } from "../cronJob";
//测试分析
//企业测试
export async function getQycs() {
const interfaceName = "企业历史里程及时长统计信息接口";
let startTime = moment().format("YYYY-MM") + "-01";
let endTime = moment().format('YYYY-MM-DD');
let data = await getInterfaceByInterfaceName( dataCenterInterfaceConfig.enterpriseTestStatus, { startTime, endTime } );
let { enterpriseTestStatusList } = data;
if ( !Array.isArray(enterpriseTestStatusList) ) throw new SysError(SYSTEMERRORENUM.未按接口协议返回, interfaceName, "enterpriseTestStatusList 不是数组", enterpriseTestStatusList);
let 企业测试时长数据 = [];
let 企业测试时长功能数据 = [];
let 企业测试里程数据 = [];
let 企业测试里程功能数据 = [];
enterpriseTestStatusList.forEach( info => {
let { enterpriseName, testStatistics } = info;
if ( !enterpriseName || !testStatistics )
企业测试时长数据.push({ key: enterpriseName, value: testStatistics.duration } );
企业测试时长功能数据.push({ key: enterpriseName, value: testStatistics.autoDuration } );
企业测试里程数据.push({ key: enterpriseName, value: testStatistics.mileage } );
企业测试里程功能数据.push({ key: enterpriseName, value: testStatistics.autoMileage } );
});
return { 企业测试时长数据, 企业测试时长功能数据, 企业测试里程数据, 企业测试里程功能数据 };
}
//月度测试
export async function getYdcs() {
const interfaceName = "月度历史里程及时长统计信息接口";
let 月度测试时长数据 = [];
let 月度测试时长功能数据 = [];
let 月度测试里程数据 = [];
let 月度测试里程功能数据 = [];
let startTime = moment().subtract(22, 'months').format("YYYY-M");
let endTime = moment().format("YYYY-M");
let 月度历史里程及时长 = await getInterfaceByInterfaceName(dataCenterInterfaceConfig.monthlyTestStatus, { startTime, endTime });
let { monthlyTestStatusList } = 月度历史里程及时长;
if ( !Array.isArray(monthlyTestStatusList) ) throw new SysError(SYSTEMERRORENUM.未按接口协议返回, interfaceName, "monthlyTestStatusList 不是数组", monthlyTestStatusList);
//100个月
let nowTime = new Date( moment().format('YYYY-MM') ).valueOf();
monthlyTestStatusList.forEach( info => {
let { date, testStatistics } = info;
let timeMs = new Date( moment(date).add(21, 'months').format('YYYY-MM') ).valueOf();
if (timeMs < nowTime) return;
月度测试时长数据.push({key: date, value: testStatistics.duration});
月度测试时长功能数据.push({key: date, value: testStatistics.autoDuration});
月度测试里程数据.push({key: date, value: testStatistics.mileage});
月度测试里程功能数据.push({key: date, value: testStatistics.autoMileage});
});
return {月度测试时长数据, 月度测试时长功能数据, 月度测试里程数据, 月度测试里程功能数据};
}
//企业脱离自动驾驶比率
export async function getQytlzdjs() {
// "企业历史脱离率统计接口";
let startTime = moment().format("YYYY-MM") + "-01";
let endTime = moment().format('YYYY-MM-DD');
let data = await getInterfaceByInterfaceName(dataCenterInterfaceConfig.enterpriseExitRate, {startTime, endTime});
let { enterpriseExitList } = data;
enterpriseExitList.sort( (a, b) => {
if ( !a.ratio ) a.ratio = Math.ceil((a.exitCount/a.autoMileage)*100/100);
if ( !b.ratio ) b.ratio = Math.ceil((b.exitCount/b.autoMileage)*100/100);
let aRatio = a.ratio;
let bRatio = b.ratio;
return bRatio - aRatio;
});
let 企业名称data = [];
let 次数data = [];
let 里程data = [];
let 比率data = [];
let enterpriseExitListTop10 = enterpriseExitList.slice(0, 10);
enterpriseExitListTop10.forEach( info => {
let {autoMileage, enterpriseName, exitCount, ratio} = info;
企业名称data.push(enterpriseName);
次数data.push(exitCount + "次");
里程data.push(autoMileage + "公里");
比率data.push(ratio + "%")
});
let 企业测试自动驾驶比率 = [
{key:"企业名称", values: 企业名称data},
{key:"次数", values: 次数data},
{key:"里程", values: 里程data},
{key:"比率", values: 比率data},
];
return 企业测试自动驾驶比率;
}
\ No newline at end of file
import { dataCenterInterfaceConfig } from "../../config/serverConfig";
import { getInterfaceByInterfaceName } from "../cronJob";
//测试概况
export async function getInterfaceData() {
//"测试企业及车辆数量接口";
let enterpriseVehicleAmountData = await getInterfaceByInterfaceName(dataCenterInterfaceConfig.enterpriseVehicleAmount, {});
let {enterpriseVehicleList, totalEnterprise, totalVehicle} = enterpriseVehicleAmountData;
//"总实时测试概况接口"
let testStatusTotalData = await getInterfaceByInterfaceName(dataCenterInterfaceConfig.testStatusTotal, {});
let {autoDuration, autoMileage, duration, mileage} = testStatusTotalData;
let jcsjData = [
{key: "测试企业数", value: totalEnterprise + "家"},
{key: "企业牌照数", value: totalVehicle + "个"},
{key: "测试总里程", value: mileage + "km"},
{key: "测试总时长", value: duration + "h"},
{key: "功能测试总里程", value: autoMileage + "km"},
{key: "功能测试总时长", value: autoDuration + "h"}
];
let cspzData = {};
enterpriseVehicleList.forEach (info => {
let {enterpriseLogo, totalVehicle} = info;
if(enterpriseLogo) cspzData[enterpriseLogo] = totalVehicle + "辆";
})
return {cspzData, jcsjData};
}
//今日数据
export async function getJrsj() {
let data = await getInterfaceByInterfaceName(dataCenterInterfaceConfig.todayTestStatusTotal, {});
let {autoDuration, autoMileage, duration, mileage} = data;
let 今日数据 = {"在线车辆数": ""}
let 今日测试 = { "里程": mileage + 'km', "时长": duration + 'h'};
let 今日功能测试 = { "里程": autoMileage + 'km', "时长": autoDuration + 'h'};
return {今日数据, 今日测试, 今日功能测试};
}
...@@ -53,7 +53,8 @@ let heart = { ...@@ -53,7 +53,8 @@ let heart = {
//ws客户端 //ws客户端
async function createSocket() { async function createSocket() {
let ws = new WebSocket(appConfig.wsPath, {perMessageDeflate: false}); console.log(appConfig.wsPath);
let ws = new WebSocket(appConfig.wsPath);
ws.onclose = async (err) => { ws.onclose = async (err) => {
console.log("连接关闭: ", err); console.log("连接关闭: ", err);
...@@ -84,34 +85,40 @@ export async function initWSData() { ...@@ -84,34 +85,40 @@ export async function initWSData() {
} }
//在线车辆 //在线车辆
let dp = {};//数据池 {"id":{lastMs:最新的时间, list:[{},{},{}], index:0 } } let dp = {};//数据池 {"id":{lastMs:最新的时间, list:[{},{},{}], index:0 } }
let dpNewDate = ''; let dpNewDate = '';
export function stats(data) { export function stats(data) {
let dateFormat = moment().format('YYYYMMDD'); let dateFormat = moment().format('YYYYMMDD');
if (!dpNewDate) dpNewDate = dateFormat; if (!dpNewDate) dpNewDate = dateFormat;
let dataType = typeof data;
if (dataType == "string") { if (typeof data == "string") {
try{ try{
// console.log(data);
let dataJson = JSON.parse(data); let dataJson = JSON.parse(data);
let {vehicleid, latitude, longitude, positiontime, canRecvTime} = dataJson;
broadcastMsg({lng:longitude||0.0, lat:latitude||0.0, vehicleid}); dataJson.VehicleLoc.forEach(info => {
//加入到缓存 let {vin, latitude, longitude, positiontime, vehicleId} = info;
let lastMs = positiontime || canRecvTime;
if ( lastMs ) {//数据包里有时间就缓存 broadcastMsg({lng:longitude||0.0, lat:latitude||0.0, vin});
checkData(dateFormat); //加入到缓存
if ( !dp[vehicleid] ) dp[vehicleid] = {lastMs, list:[], index:0 };//初始化缓存 let lastMs = positiontime || new Date().valueOf();
dp[vehicleid].list[dp[vehicleid].index] = {lng:longitude||0.0, lat:latitude||0.0, vehicleid, lastMs}; if ( lastMs ) {//数据包里有时间就缓存
dp[vehicleid].index += 1; checkData(dateFormat);
if (dp[vehicleid].index > 4) dp[vehicleid].index = 0; if ( !dp[vin] ) dp[vin] = {lastMs, list:[], index:0 };//初始化缓存
} //每个小车缓存4个数据,新连接进来的时候下发缓存好的数据,看起来不会很突兀
dp[vin].list[dp[vin].index] = {lng:longitude||0.0, lat:latitude||0.0, vin, lastMs, vehicleid:vehicleId};
dp[vin].index += 1;
if (dp[vin].index >= 4) dp[vin].index = 0;
}
});
} catch(err) { } catch(err) {
logHandle("ws 返回数据不是json --> "+ data); logHandle("ws 返回数据不是json --> "+ data);
} }
} else { } else {
logHandle(`ws 返回数据不符合规范 类型:${dataType} --> `+ data) logHandle(`ws 返回数据不符合规范 类型:${typeof data} --> `+ data)
} }
} }
...@@ -132,7 +139,7 @@ export function getDpData() { ...@@ -132,7 +139,7 @@ export function getDpData() {
result.sort( (a, b) => {return a.lastMs - b.lastMs}); result.sort( (a, b) => {return a.lastMs - b.lastMs});
let initList = []; let initList = [];
result.forEach(info => { result.forEach(info => {
let {lng, lat,vehicleid, lastMs} = info; let {lng, lat, vehicleid, lastMs} = info;
initList.push({lng, lat, vehicleid}); initList.push({lng, lat, vehicleid});
}); });
return {initList, count:Object.keys(dp).length}; return {initList, count:Object.keys(dp).length};
...@@ -142,23 +149,16 @@ export function getOnlieCarCount() { ...@@ -142,23 +149,16 @@ export function getOnlieCarCount() {
return Object.keys(dp).length; return Object.keys(dp).length;
} }
/* data 数据长这样 //控制端获取在线小车列表
{ //最后在线时间如果大于1分钟,判定为下线,不下发到控制端的小车列表里
"accLat":0.08, export function controlGetOnlieCarList() {
"accLong":1.542, let ms = new Date().valueOf();
"acceleration":0,加速度 let onlineCarList = [];
"altitude":-3276,海拔高度 for (let key in dp) {
"canRecvTime":1660285379691,//接收数据时间 let {lastMs, list, index} = dp[key];
"direction":0,//方向 if ((ms -lastMs) > 5*60*1000) continue;
"drivemode":0,//驾驶模式 let {vin, vehicleid} = list[index];
"latitude":纬度, onlineCarList.push({id:vin, vehicleid});
"longitude":经度, }
"mileage":里程, return onlineCarList;
"positiontime":时间戳,
"vehicleid":"车辆id",
"velocity":速度,
"vin":"LSJE24090MS029920"
} }
*/
import { INTERFACEREQUESTTYPEENUM } from "../config/enum"; import { INTERFACEREQUESTTYPEENUM } from "../config/enum";
import { dataCenterInterfaceConfig } from "../config/serverConfig";
//配置 //配置
// "接口名称":{ // "接口名称":{
// type:"1是即时更新 2是即时更新 使用 INTERFACErEQUESTTYPEENUM", // type:"1是即时更新 2是即时更新 使用 INTERFACErEQUESTTYPEENUM",
...@@ -8,18 +9,25 @@ import { INTERFACEREQUESTTYPEENUM } from "../config/enum"; ...@@ -8,18 +9,25 @@ import { INTERFACEREQUESTTYPEENUM } from "../config/enum";
// header:{}, // header:{},
// body:{} // body:{}
// } // }
export const Config = {
// "事件督办处置接口":{ type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*24, url:"url地址", reqType:"post", header:{}, body:{} },
// "事件接口":{ type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*24, url:"url地址", reqType:"post", header:{}, body:{} },
// "舆情督办处置接口":{ type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*24, url:"url地址", reqType:"post", header:{}, body:{} },
// "舆情接口":{ type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*24, url:"url地址", reqType:"post", header:{}, body:{} },
//新左屏
"鉴权url接口":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*24, url:"http://10.51.50.203:8000/get_token", reqType:"get", header:{}, body:{apikey:"301bigscreen", key:"edd1c9f034335f136f8"}},
"测试企业及车辆数量接口":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*24, url:"http://10.51.50.203:8000/icv-openapi/v1/static/enterpriseVehicleAmount", reqType:"get", header:{}, body:{token:"1v5ds654rg8ewrd14vg"}},
"总实时测试概况接口":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*24, url:"http://10.51.50.203:8000/icv-openapi/v1/realtime/statistics/testStatusTotal", reqType:"get", header:{}, body:{token:"1v5ds654rg8ewrd14vg"}},
"今日实时测试概况接口":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*24, url:"http://10.51.50.203:8000/icv-openapi/v1/realtime/statistics/todayTestStatusTotal", reqType:"get", header:{}, body:{token:"1v5ds654rg8ewrd14vg"}},
"企业历史里程及时长统计信息接口":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*24, url:"http://10.51.50.203:8000/icv-openapi/v1/history/statistics/enterpriseTestStatus", reqType:"get", header:{}, body:{token:"1v5ds654rg8ewrd14vg"}},
"月度历史里程及时长统计信息接口":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*24, url:"http://10.51.50.203:8000/icv-openapi/v1/history/statistics/monthlyTestStatus", reqType:"get", header:{}, body:{token:"1v5ds654rg8ewrd14vg"}},
"企业历史脱离率统计接口":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*24, url:"http://10.51.50.203:8000/icv-openapi/v1/history/statistics/enterpriseExitRate", reqType:"get", header:{}, body:{token:"1v5ds654rg8ewrd14vg"}},
export const Config = {
"测试企业及车辆数量接口":{
url:dataCenterInterfaceConfig.enterpriseVehicleAmount, reqType:"get", header:{}, body:{}
},
"总实时测试概况接口":{
url:dataCenterInterfaceConfig.testStatusTotal, reqType:"get", header:{}, body:{}
},
"今日实时测试概况接口":{
url:dataCenterInterfaceConfig.todayTestStatusTotal, reqType:"get", header:{}, body:{}
},
"企业历史里程及时长统计信息接口":{
url:dataCenterInterfaceConfig.enterpriseTestStatus, reqType:"get", header:{}, body:{}
},
"月度历史里程及时长统计信息接口":{
url:dataCenterInterfaceConfig.monthlyTestStatus, reqType:"get", header:{}, body:{}
},
"企业历史脱离率统计接口":{
url:dataCenterInterfaceConfig.enterpriseExitRate, reqType:"get", header:{}, body:{}
},
}; };
\ No newline at end of file
import moment = require("moment");
import { BizError } from "../../util/bizError";
import { getInterfaceByInterfaceName } from "../cronJob";
import { getToken } from "./tokenData";
let token = getToken();
//企业测试
export async function getQycs() {
let startTime = moment().format("YYYY-MM") + "-01";
let endTime = moment().format('YYYY-MM-DD');
let data = await getData("企业历史里程及时长统计信息接口", {token, startTime, endTime});
let {enterpriseTestStatusList} = data;
let 企业测试时长数据 = [];
let 企业测试时长功能数据 = [];
let 企业测试里程数据 = [];
let 企业测试里程功能数据 = [];
enterpriseTestStatusList.forEach( info => {
let {enterpriseName, testStatistics} = info;
企业测试时长数据.push({key: enterpriseName, value: testStatistics.duration});
企业测试时长功能数据.push({key: enterpriseName, value: testStatistics.autoDuration});
企业测试里程数据.push({key: enterpriseName, value: testStatistics.mileage});
企业测试里程功能数据.push({key: enterpriseName, value: testStatistics.autoMileage});
})
return {企业测试时长数据, 企业测试时长功能数据, 企业测试里程数据, 企业测试里程功能数据};
}
//月度测试
export async function getYdcs() {
let interfaceName = "月度历史里程及时长统计信息接口";
let 月度测试时长数据 = [];
let 月度测试时长功能数据 = [];
let 月度测试里程数据 = [];
let 月度测试里程功能数据 = [];
let 月度历史里程及时长 = await getData(interfaceName, {token});
let {monthlyTestStatusList} = 月度历史里程及时长;
monthlyTestStatusList.forEach( info => {
let {date, testStatistics} = info;
for (let i = 20; i >= 0; i--) {
let time = moment().subtract(i, 'months').format('YYYY-MM');
if (date == time) {
月度测试时长数据.push({key: date, value: testStatistics.duration});
月度测试时长功能数据.push({key: date, value: testStatistics.autoDuration});
月度测试里程数据.push({key: date, value: testStatistics.mileage});
月度测试里程功能数据.push({key: date, value: testStatistics.autoMileage});
}
}
})
// let startTime = moment().format("YYYY-MM") + "-01";
// let endTime = moment().format('YYYY-MM-DD');
// let monthData = await getInterfaceByInterfaceName(interfaceName, {token, startTime, endTime});
// let {monthlyTestStatusList} = monthData;
// monthlyTestStatusList.forEach( info => {
// let {date, testStatistics} = info;
// 月度测试时长数据.push({key: date, value: testStatistics.duration});
// 月度测试时长功能数据.push({key: date, value: testStatistics.autoDuration});
// 月度测试里程数据.push({key: date, value: testStatistics.mileage});
// 月度测试里程功能数据.push({key: date, value: testStatistics.autoMileage});
// })
return {月度测试时长数据, 月度测试时长功能数据, 月度测试里程数据, 月度测试里程功能数据};
}
//企业脱离自动驾驶比率
export async function getQytlzdjs() {
let startTime = moment().format("YYYY-MM") + "-01";
let endTime = moment().format('YYYY-MM-DD');
let data = await getData("企业历史脱离率统计接口", {token, startTime, endTime});
let {enterpriseExitList} = data;
let 企业名称data = [];
let 次数data = [];
let 里程data = [];
let 比率data = [];
enterpriseExitList.forEach( info => {
let {autoMileage, exitCount} = info;
// let ratio = Math.ceil(exitCount/autoMileage);
let ratio = Math.ceil((exitCount/autoMileage)*100/100);
if (autoMileage == 0 || exitCount == 0) ratio = 0;
if (ratio > 100) ratio = 100;
info["ratio"] = ratio;
})
enterpriseExitList.sort((a, b) => {
return b.ratio - a.ratio;
})
let enterpriseExitListTop10 = enterpriseExitList.slice(0, 10);
enterpriseExitListTop10.forEach( info => {
let {autoMileage, enterpriseName, exitCount, ratio} = info;
企业名称data.push(enterpriseName);
次数data.push(exitCount + "次");
里程data.push(autoMileage + "公里");
比率data.push(ratio + "%")
});
let 企业测试自动驾驶比率 = [
{key:"企业名称", values: 企业名称data},
{key:"次数", values: 次数data},
{key:"里程", values: 里程data},
{key:"比率", values: 比率data},
];
return 企业测试自动驾驶比率;
}
async function getData(interfaceName, body) {
let {code, data} = await getInterfaceByInterfaceName(interfaceName, body);
if (!code) throw new BizError(`${interfaceName} 缺少参数 code`);
if (code == 401) throw new BizError(`${interfaceName} 请求未鉴权`);
if (code == 404) throw new BizError(`${interfaceName} 请求路径不存在`);
if (code == 503) throw new BizError(`${interfaceName} 请求频率过高`);
if (!data) throw new BizError(`${interfaceName} 缺少参数 data`);
return data;
}
import { BizError } from "../../util/bizError";
import { getInterfaceByInterfaceName } from "../cronJob";
import { getToken } from "./tokenData";
let token = getToken();
//测试牌照分布
export async function getCspzfb() {
let data = await getData("测试企业及车辆数量接口", token);
let {enterpriseVehicleList} = data;
let cspzData = {};
enterpriseVehicleList.forEach (info => {
let {enterpriseLogo, totalVehicle} = info;
if(enterpriseLogo) cspzData[enterpriseLogo] = totalVehicle + "辆";
})
return cspzData;
}
//基础数据
export async function getJcsj() {
let qyData = await getData("测试企业及车辆数量接口", token);
let {totalEnterprise, totalVehicle} = qyData;
let 测试企业数 = totalEnterprise;
let 企业牌照数 = totalVehicle;
let data = await getData("总实时测试概况接口", token);
let {autoDuration, autoMileage, duration, mileage} = data;
let result = [
{key: "测试企业数", value: 测试企业数 + "家"},
{key: "企业牌照数", value: 企业牌照数 + "个"},
{key: "测试总里程", value: mileage + "km"},
{key: "测试总时长", value: duration + "h"},
{key: "功能测试总里程", value: autoMileage + "km"},
{key: "功能测试总时长", value: autoDuration + "h"}
];
return result;
}
//今日数据
export async function getJrsj() {
let data = await getData("今日实时测试概况接口", token);
let {autoDuration, autoMileage, duration, mileage} = data;
let 今日数据 = {"在线车辆数": ""}
let 今日测试 = { "里程": mileage + 'km', "时长": duration + 'h'};
let 今日功能测试 = { "里程": autoMileage + 'km', "时长": autoDuration + 'h'};
return {今日数据, 今日测试, 今日功能测试};
}
async function getData(interfaceName, token) {
let {code, data} = await getInterfaceByInterfaceName(interfaceName, {token});
if (code == 401) throw new BizError(`${interfaceName} 请求未鉴权`);
if (code == 404) throw new BizError(`${interfaceName} 请求路径不存在`);
if (code == 503) throw new BizError(`${interfaceName} 请求频率过高`);
if (!data) throw new BizError(`${interfaceName} 缺少参数 data`);
return data;
}
\ No newline at end of file
import { initControlSocketServer } from "./biz/control";
import { initSocketServer } from "./biz/jgfwnl/wsData"; import { initSocketServer } from "./biz/jgfwnl/wsData";
import { initConfig, systemConfig} from "./config/serverConfig"; import { initConfig, systemConfig} from "./config/serverConfig";
import { getCsgkData, initData } from "./data/interface/interfaceService";
import { initWSData } from "./data/interface/wsData"; import { initWSData } from "./data/interface/wsData";
import { httpServer } from "./net/http_server"; import { httpServer } from "./net/http_server";
async function lanuch() { async function lanuch() {
await initConfig();//初始化配置解析 await initConfig();//初始化配置解析
await initWSData(); await initWSData();
// await initData();
await initSocketServer(systemConfig.socketPort); await initSocketServer(systemConfig.socketPort);
await initControlSocketServer(systemConfig.controlSocketPort);
httpServer.createServer(systemConfig.port); httpServer.createServer(systemConfig.port);
console.log('This indicates that the server is started successfully.'); console.log('This indicates that the server is started successfully.');
} }
function test() {
let enterpriseVehicleList = [
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGN9jCqAPEVpAAAm6sRT_IA756.jpg",
"enterpriseName": "云骥",
"totalVehicle": 1
},
{
"enterpriseLogo": null,
"enterpriseName": "临港公交",
"totalVehicle": 3
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM2lHCASyYTAAEDUVmM2m0938.png",
"enterpriseName": "上汽乘用车",
"totalVehicle": 6
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM1ch-AcgrDAAByDdvtn6k677.png",
"enterpriseName": "酷移",
"totalVehicle": 3
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM1ciyAedpJAAG2siiJo0w193.png",
"enterpriseName": "友道",
"totalVehicle": 44
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM1LK-AIsLkAAAKYhI9eR0154.png",
"enterpriseName": "临港捷运",
"totalVehicle": 1
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM1LGWATddkAAEK1eJjpVM191.png",
"enterpriseName": "依行",
"totalVehicle": 2
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-b6ALJEbAAH7eWqp0bE733.png",
"enterpriseName": "赛可",
"totalVehicle": 118
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-duARquaAAC8mHN7yqg957.png",
"enterpriseName": "小马",
"totalVehicle": 28
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-gGAcBiPAADtjwwbuqE946.png",
"enterpriseName": "百度",
"totalVehicle": 106
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-g6AJtXIAANj_AVn0wM695.png",
"enterpriseName": "商汤",
"totalVehicle": 9
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-hyAefROAABWKnMLAdo369.png",
"enterpriseName": "阿利昂斯",
"totalVehicle": 4
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-i2ANds6AADLub0EZT0345.png",
"enterpriseName": "通用中国",
"totalVehicle": 1
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-r6AL0T0AAApBxEtDUU721.png",
"enterpriseName": "上汽大通",
"totalVehicle": 2
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-myAIhJ5AAAqjEIMfFw960.png",
"enterpriseName": "丰田",
"totalVehicle": 7
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-nqALg--AAC0YqlTbOQ313.png",
"enterpriseName": "AutoX",
"totalVehicle": 81
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-pOADhIiAAFDNIhavW8152.png",
"enterpriseName": "上汽通用",
"totalVehicle": 1
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-qyAez_GAAALxjs3x4I609.png",
"enterpriseName": "中智行",
"totalVehicle": 5
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-tiAT8XYAAAiB_U3mkY795.png",
"enterpriseName": "深兰",
"totalVehicle": 1
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-uqAMfpIAAAjg9Trrt0609.png",
"enterpriseName": "吉利",
"totalVehicle": 2
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-v-ACoYtAAAdSG61mok324.png",
"enterpriseName": "滴滴",
"totalVehicle": 60
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-w-AC-UOAAA9n932Q5U842.png",
"enterpriseName": "上汽大众",
"totalVehicle": 6
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-ySAWzDmAAAsek9ZJXk572.png",
"enterpriseName": "华为",
"totalVehicle": 1
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM1LMGAXySoAAGXZUOHtgA299.png",
"enterpriseName": "图森",
"totalVehicle": 12
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-2CAWHJMAAA6TBhy5EE928.png",
"enterpriseName": "仙途",
"totalVehicle": 2
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-2yAeap1AAA6yCs-OLw861.png",
"enterpriseName": "宝马",
"totalVehicle": 2
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-32ACnKgAACRLkClP-M405.png",
"enterpriseName": "蔚来",
"totalVehicle": 1
},
{
"enterpriseLogo": "https://management.icv-sh.com:9991/data/file/download?url=group1/M00/00/00/CjMyvGM0-5OAfEi2AAD3V0bQ31A753.png",
"enterpriseName": "初速度",
"totalVehicle": 1
}
];
let urlMap = {};
enterpriseVehicleList.forEach( info => {
let {enterpriseLogo, enterpriseName} = info;
// if (enterpriseLogo) urlMap[enterpriseLogo] = enterpriseName;
console.log(`"${enterpriseLogo}":"${enterpriseName}.png"`);
});
console.log(JSON.stringify(urlMap) );
console.log();
}
lanuch(); lanuch();
\ No newline at end of file
...@@ -11,4 +11,4 @@ export class Socket { ...@@ -11,4 +11,4 @@ export class Socket {
callback(wss); callback(wss);
console.log("socketServer listen on port:"+port); console.log("socketServer listen on port:"+port);
} }
} }
\ No newline at end of file
...@@ -8,6 +8,9 @@ import * as jgfwnl_qycsfxBiz from '../biz/jgfwnl_qycsfx'; ...@@ -8,6 +8,9 @@ import * as jgfwnl_qycsfxBiz from '../biz/jgfwnl_qycsfx';
import * as jgfwnl_clcszlBiz from '../biz/jgfwnl_clcszl'; import * as jgfwnl_clcszlBiz from '../biz/jgfwnl_clcszl';
import * as jgfwnl_RSUfslBiz from '../biz/jgfwnl_RSUfsl'; import * as jgfwnl_RSUfslBiz from '../biz/jgfwnl_RSUfsl';
import * as jgfwnlBiz from '../biz/jgfwnl/data'; import * as jgfwnlBiz from '../biz/jgfwnl/data';
import * as controlBiz from '../biz/control';
import * as dsjBiz from '../biz/dsj';
export function setRouter(httpServer){ export function setRouter(httpServer){
httpServer.get('/jgfwnl_yzy', asyncHandler(jgfwnl_yzyBiz.getData)); httpServer.get('/jgfwnl_yzy', asyncHandler(jgfwnl_yzyBiz.getData));
...@@ -28,12 +31,9 @@ export function setRouter(httpServer){ ...@@ -28,12 +31,9 @@ export function setRouter(httpServer){
httpServer.get('/yzy', asyncHandler(jgfwnlBiz.getYZY)); httpServer.get('/yzy', asyncHandler(jgfwnlBiz.getYZY));
httpServer.get('/csgk', asyncHandler(jgfwnlBiz.getCSGK)); httpServer.get('/csgk', asyncHandler(jgfwnlBiz.getCSGK));
httpServer.get('/csfx', asyncHandler(jgfwnlBiz.getCSFX)); httpServer.get('/csfx', asyncHandler(jgfwnlBiz.getCSFX));
httpServer.post('/yzy', asyncHandler(jgfwnlBiz.getYZY));
httpServer.post('/csgk', asyncHandler(jgfwnlBiz.getCSGK));
httpServer.post('/csfx', asyncHandler(jgfwnlBiz.getCSFX));
httpServer.get('/mapdata', asyncHandler(jgfwnlBiz.mapData)); httpServer.get('/mapdata', asyncHandler(jgfwnlBiz.mapData));
httpServer.post('/mapdata', asyncHandler(jgfwnlBiz.mapData)); httpServer.post('/carinfo', asyncHandler(jgfwnlBiz.carInfo));
httpServer.get('/dsj', asyncHandler(dsjBiz.getData));
//控制端小车列表接口
httpServer.get('/carlist', asyncHandler(controlBiz.controlGetCarList));
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment