Commit 8dcb22c7 by chenjinjing

no message

parent 7b05eda2
......@@ -1360,6 +1360,11 @@
"resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz",
"integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
},
"ws": {
"version": "8.13.0",
"resolved": "https://registry.npmmirror.com/ws/-/ws-8.13.0.tgz",
"integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA=="
},
"xlsx": {
"version": "0.16.9",
"resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.16.9.tgz",
......
......@@ -21,6 +21,7 @@
"pyfl": "^1.1.4",
"request": "^2.88.0",
"svg-captcha": "^1.3.12",
"ws": "^8.13.0",
"xml2js": "^0.4.23"
},
"devDependencies": {},
......
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
<config>
<port>40006</port>
<monitorUrl>http://127.0.0.1:40001</monitorUrl>
<port>40000</port>
<monitorUrl>http://127.0.0.1:40005</monitorUrl>
<wsPath>ws://.........</wsPath>
</config>
\ No newline at end of file
/**
* 建设指挥 投资管控指标面板 合同预警弹窗 3.5 逻辑
* 建设指挥 投资管控指标面板 合同预警弹窗 4.0 逻辑
* 处理数据
*/
import { budgetwarningTableData, detailedTableData, targetcostTableData } from "../../data/table/投资管控";
import { budgetwarningTableData, detailedTableData, estimateEarlyWarningTableData, targetcostTableData } from "../../data/table/投资管控";
import { change } from "../../dataPackage/inBackOut";
import { tablePackage } from "../../dataPackage/inFrontOut";
import { getTableOut } from "../../dataPackage/out";
import { getKeyValueOut, getTableOut } from "../../dataPackage/out";
/**
* 概算预警浮窗
* @param req
* @param res
*/
export function getEstimateEarlyWarning(req, res) {
let tableData = estimateEarlyWarningTableData();
let ret:any = {};
let estimateEarlyWarning = change(["key", "value", "url"], tableData["概算预警"].bodyList);
// let estimateEarlyWarning = getKeyValueOut("概算预警", tableData['概算预警'].dataList)
ret["estimateEarlyWarning"] = estimateEarlyWarning;
res.send(ret);
}
/**
* 三级概算预警详情
* 弃用
* @param req
* @param res
*/
......@@ -28,6 +48,7 @@ export function getBudgetWarning(req, res) {
/**
* 线路概算——目标成本
* 弃用
* @param req
* @param res
*/
......@@ -53,6 +74,7 @@ export function getTargetCost(req, res) {
/**
* 线路概算——下拉选择类型
* 弃用
* @param req
* @param res
*/
......@@ -77,6 +99,7 @@ export function getType(req, res) {
/**
* 线路概算——详情
* 弃用
* @param req
* @param res
*/
......
/**
* 建设指挥 投资管控指标面板 决算弹窗 4.0 逻辑
* 处理数据
*/
import { finalAcountsTableData } from "../../data/table/投资管控";
import { change } from "../../dataPackage/inBackOut";
/**
* 概算预警浮窗
* @param req
* @param res
*/
export function getEstimateEarlyWarning(req, res) {
let tableData = finalAcountsTableData();
let ret:any = {};
let estimateEarlyWarning = change(["key", "value", "url"], tableData["概算预警"].bodyList);
ret["estimateEarlyWarning"] = estimateEarlyWarning;
res.send(ret);
}
\ No newline at end of file
/**
* 建设指挥 投资管控指标面板 3.5 逻辑
* 建设指挥 投资管控指标面板 4.0 逻辑
* 处理数据
*/
......@@ -16,6 +16,8 @@ export function getInvest(req, res) {
let result:any = {};
//规划期、线路、执行完成百分比、距计划偏差、年度用款计划、一月至今计划、一月至今累计完成、
//完成百分比、年度用款计划、年度实际用款
let paymentExecutionData = change(
[
"planningPeriod", "line", "executionCompletedProportion", "deviationFromPlan", "annualPaymentPlan1", "JanPlanToDate",
......@@ -33,28 +35,60 @@ export function getInvest(req, res) {
let dataType = item.planningPeriod;
let dataLine = item.line;
for (let name = 0; name < paymentExecutionConf.length; name++){
if (!paymentExecution[dataType]) paymentExecution[dataType] = {"全网":{"executionCompletedProportion":0, "deviationFromPlan":0, "annualPaymentPlan1":0, "JanPlanToDate":0, "JanSoFarCummulativeComplete":0}};
if (!paymentExecution[dataType][dataLine]) paymentExecution[dataType][dataLine] = {"executionCompletedProportion":0, "deviationFromPlan":0, "annualPaymentPlan1":0, "JanPlanToDate":0, "JanSoFarCummulativeComplete":0};
if (!paymentExecution[dataType]) paymentExecution[dataType] = {
"全网":{
"executionCompletedProportion":0,
"deviationFromPlan":0,
"annualPaymentPlan1":0,
"JanPlanToDate":0,
"JanSoFarCummulativeComplete":0
}
};
if (!paymentExecution[dataType][dataLine]) paymentExecution[dataType][dataLine] = {
"executionCompletedProportion":0,
"deviationFromPlan":0,
"annualPaymentPlan1":0,
"JanPlanToDate":0,
"JanSoFarCummulativeComplete":0
};
paymentExecution[dataType]["全网"][paymentExecutionConf[name]] += item[paymentExecutionConf[name]] || 0;
paymentExecution[dataType][dataLine][paymentExecutionConf[name]] += item[paymentExecutionConf[name]] || 0;
}
for (let name = 0; name < specialPurposeBondsConf.length; name++) {
if (!specialPurposeBonds[dataType]) specialPurposeBonds[dataType] = {"全网":{"completionPercentage":0, "annualPaymentPlan2":0, "annualActualExpenditure":0}};
if (!specialPurposeBonds[dataType][dataLine]) specialPurposeBonds[dataType][dataLine] = {"completionPercentage":0, "annualPaymentPlan2":0, "annualActualExpenditure":0};
if (!specialPurposeBonds[dataType]) specialPurposeBonds[dataType] = {
"全网":{
"completionPercentage":0,
"annualPaymentPlan2":0,
"annualActualExpenditure":0
}
};
if (!specialPurposeBonds[dataType][dataLine]) specialPurposeBonds[dataType][dataLine] = {
"completionPercentage":0,
"annualPaymentPlan2":0,
"annualActualExpenditure":0
};
specialPurposeBonds[dataType]["全网"][specialPurposeBondsConf[name]] += item[specialPurposeBondsConf[name]] || 0;
specialPurposeBonds[dataType][dataLine][specialPurposeBondsConf[name]] += item[specialPurposeBondsConf[name]] || 0;
}
})
paymentExecution[planningPeriod]["全网"]["executionCompletedProportion"] = (paymentExecution[planningPeriod]["全网"]["executionCompletedProportion"] / Object.keys(paymentExecution[planningPeriod]).length * 100).toFixed(2);
let planningPeriodData = paymentExecution[planningPeriod][line]; //--------报错
for (let name = 0; name < paymentExecutionConf.length; name++){
paymentExecution[planningPeriod][line][paymentExecutionConf[name]] = Math.round((planningPeriodData[paymentExecutionConf[name]] / 10000)*100)/100;
}
for (let name = 0; name < specialPurposeBondsConf.length; name++) {
specialPurposeBonds[planningPeriod][line][specialPurposeBondsConf[name]] = Math.round((specialPurposeBonds[planningPeriod][line][specialPurposeBondsConf[name]] / 10000)*100)/100;
}
paymentExecution[planningPeriod]["全网"]["executionCompletedProportion"] = ((paymentExecution[planningPeriod]["全网"]["JanSoFarCummulativeComplete"]/paymentExecution[planningPeriod]["全网"]["annualPaymentPlan1"])*100).toFixed(2);
// paymentExecution[planningPeriod]["全网"]["executionCompletedProportion"] = (paymentExecution[planningPeriod]["全网"]["executionCompletedProportion"] / Object.keys(paymentExecution[planningPeriod]).length).toFixed(2);
result["paymentExecutionTitle"] = INVEST.用款执行;
result["paymentExecution"] = paymentExecution[planningPeriod][line];
specialPurposeBonds[planningPeriod]["全网"]["completionPercentage"] = (specialPurposeBonds[planningPeriod]["全网"]["completionPercentage"] / Object.keys(specialPurposeBonds[planningPeriod]).length * 100).toFixed(2);
specialPurposeBonds[planningPeriod]["全网"]["completionPercentage"] = ((specialPurposeBonds[planningPeriod]["全网"]["annualActualExpenditure"]/specialPurposeBonds[planningPeriod]["全网"]["annualPaymentPlan2"])*100).toFixed(2);
// specialPurposeBonds[planningPeriod]["全网"]["completionPercentage"] = (specialPurposeBonds[planningPeriod]["全网"]["completionPercentage"] / Object.keys(specialPurposeBonds[planningPeriod]).length).toFixed(2);
result["specialPurposeBondsTitle"] = INVEST.专项债;
result["specialPurposeBonds"] = specialPurposeBonds[planningPeriod][line];
......
......@@ -3,11 +3,13 @@
* 处理数据
*/
import { lineConstructTableData, mapLineTableData, mapSiteTableData, mapTableData } from '../../data/table/constructData';
import { keyValuePackage } from '../../dataPackage/inFrontOut';
import { getKeyValueOut } from '../../dataPackage/out';
import { lineConstructTableData, mapLineTableData, mapSiteJsonTableData, mapSiteTableData, mapTableData } from '../../data/table/constructData';
import { keyValuePackage, stringListPackage } from '../../dataPackage/inFrontOut';
import { getKeyValueOut, getStringOut } from '../../dataPackage/out';
import { change } from '../../dataPackage/inBackOut';
import { onceSheetBecomeOfblockData } from '../../util/analysisExcel';
import { readQualityData } from '../../data/interface/writeJson';
const path = require('path');
export function getMap(req, res) {
......@@ -70,12 +72,118 @@ export function getMap(req, res) {
})
let mapChangeLineData = [];
mapLineData.forEach( data => {
data.value = data.lineList.length;
let changeData = data;
if (data.lineList) changeData.value = data.lineList.length;
mapChangeLineData.push(changeData);
})
// ret['dt'] = defaultConfig.mapDefault;
ret['dt'] = {title: "线路列表", dataList: mapLineData};
res.send(ret);
}
\ No newline at end of file
}
/**
* 警报图片
* @param req
* @param res
*/
export function getEarlyWarning(req, res) {
let ret:any = {};
let earlyWarningData = [
{
type: 'warn',
position: { //警报地址
x: 6378135.248040633,
y: -1491.9380484303829,
z: 1850.1137940254034
},
img1: 'map/警报1.png',
img2: 'map/警报2.png',
img3: 'map/警报3.png',
img4: 'map/警报4.png',
},
{
type: 'normal',
position: { //警报地址
x: 6378136.284846687,
y: 2563.7555093702085,
z: -1815.1290212400193
},
img1: 'map/正常1.png',
img2: 'map/正常2.png',
img3: 'map/正常3.png',
img4: 'map/正常4.png'
}
];
ret['earlyWarning'] = earlyWarningData;
res.send(ret);
}
/**
* 站点锚点坐标
* @param req
* @param res
*/
export function getSiteCoordinates(req, res) {
let jsonname = req.query.jsonname || "19号线线路20221212.geojson";
let siteJsonTable = mapSiteJsonTableData();
let ret:any = {};
let siteJsonDataList = siteJsonTable['坐标json数据'].dataList;
ret['siteJson'] = {title: "线路对应坐标json", dataList: siteJsonDataList};
let url = path.join(__dirname.substring(0,__dirname.indexOf("out")), "res/车站坐标json", jsonname);
let data = readQualityData(url);
let features = data["features"];
let img = [];
let siteCoordinates = [];
features.forEach( item => {
let {type, geometry, properties} = item;
let geometryType = geometry["type"];
let geometryCoordinates = geometry["coordinates"] || [0, 0, 0];
let position = {
x: geometryCoordinates[0],
y: geometryCoordinates[1],
z: geometryCoordinates[2]
};
let line = "";
siteJsonDataList.forEach( item => {
let { key, value } = item;
if (value == jsonname) {
line = key;
}
})
if (geometryType == "Point") {
let warnTypeNum = Math.floor(Math.random() + 0.5);
let warnType = "";
if (warnTypeNum > 0) {
warnType = "warn";
img = ["map/警报1.png", "map/警报2.png", "map/警报3.png", "map/警报4.png"]
} else {
warnType = "normal";
img = ["map/正常1.png", "map/正常2.png", "map/正常3.png", "map/正常4.png"];
}
siteCoordinates.push({line, site: properties["name"], warnType, position, img });
}
})
ret["siteCoordinates"] = siteCoordinates;
res.send(ret);
}
import { readFolderData } from "../data/interface/writeJson";
import { lineTableData, planningPeriodTableData, yearTableData } from "../data/table/publicData";
import { change } from "../dataPackage/inBackOut";
import { stringListPackage } from "../dataPackage/inFrontOut";
import { getStringOut } from "../dataPackage/out";
const path = require('path');
export function getLine(req, res) {
......@@ -15,6 +17,19 @@ export function getLine(req, res) {
}
export function getLineJson(req, res) {
let url = path.join(__dirname.substring(0,__dirname.indexOf("out")), "res/车站坐标json");
// let url = "";
let lineData = readFolderData(url);
let ret:any = {};
ret['lineJson'] = lineData;
res.send(ret);
}
/**年份 */
export function getYear(req, res) {
let excelData = yearTableData();
......@@ -60,7 +75,7 @@ export function getPlanningPeriod(req, res) {
* @param res
*/
export function getLineByPlanningPeriod(req, res) {
let type = req.query.type || "三期规划调整";
let planningPeriod = req.query.planningPeriod || "三期规划调整";
let excelData = planningPeriodTableData();
let ret:any = {};
......@@ -72,7 +87,7 @@ export function getLineByPlanningPeriod(req, res) {
typeList[item.type].push(item.line);
})
let lineData = typeList[type];
let lineData = typeList[planningPeriod];
let lineDataList = [];
lineData.forEach( info=> {
......
......@@ -22,10 +22,10 @@ export async function getConstructionMilestones(req, res) {
let site = req.query.site || "西岑站";
let tableData = constructionMilestonesTableData();
//"线路", "站点名称", "站点状态", "建设内容", "时间", "建设状态"
let data = change(["line", "site", "state", "constructionContent", "constructionTime", "constructionStatus"], tableData["建设里程碑数据"].bodyList );
//"线路", "站点名称", "站点状态", "建设内容", "实际完成时间", "计划完成时间", "建设状态"
let data = change(["line", "site", "state", "constructionContent", "constructionTime", "plannedCompletionTime", "constructionStatus"], tableData["建设里程碑数据"].bodyList );
let conf = ["constructionContent", "constructionTime", "constructionStatus"];
let conf = ["constructionContent", "constructionTime", "plannedCompletionTime", "constructionStatus"];
let constructionMilestones = getPopupMoreData(line, data, conf);
......
......@@ -30,7 +30,7 @@ export async function getRemainingProblems(req, res) {
let remainingProblems = getPopupMoreData(line, data, conf);
let result = {"remainingProblems": remainingProblems[site]}
result["remainingProblems"]["total"] = result["remainingProblems"]["data"].length || 0;
res.send(result);
return result;
......
import { logError } from "../util/log";
import { Socket } from "../net/socket_server";
import { getDpData } from "../data/interface/wsData";
let connectionPool = {};
let data = [
{
type:'warn',
position:{
x: 6378135.248040633,
y: -1491.9380484303829,
z: 1850.1137940254034
},
vfx: {
width: '100px',
height: '200px',
img: 'http://192.168.0.71:40001/kineticEffect/色相饱和度994.png' //图片地址
}
}
]
export function broadcastMsg(data) {
for (let key in connectionPool) {
let result = {code:200, success:true, data};
try {
connectionPool[key].send(JSON.stringify(result));
} catch(err) {
logError(`广播消息失败: ${err}`);
}
}
}
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 initSocketServer(port) {
Socket.createServer(port, function (wss) {
wss.on('connection', function(ws, req) {
let ip = analysisUserUrl(req);
connectionPool[ip] = ws;
ws.on('message', function(data) {
//回应心跳包
if (data == 'i am heart') ws.send(JSON.stringify({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);
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}));
});
});
});
}
......@@ -1369,30 +1369,24 @@ export const pipelineRelocationDetails = [
* 质量安全指标面板对接接口版本
*/
export const significantRiskDefault = {
"全网": {
"基坑": { level1MajorRisks: 0, riskTotal: 0, secure: 0, control: 0, focus: 0},
"特大桥": { level1MajorRisks: 0, riskTotal: 0, secure: 0, control: 0, focus: 0},
"区间": { level1MajorRisks: 0, riskTotal: 0, secure: 0, control: 0, focus: 0},
}
};
"基坑": { level1MajorRisks: 0, riskTotal: 0, secure: 0, control: 0, focus: 0},
"旁通道": { level1MajorRisks: 0, riskTotal: 0, secure: 0, control: 0, focus: 0},
"区间": { level1MajorRisks: 0, riskTotal: 0, secure: 0, control: 0, focus: 0},
}
export const currentRiskDefault = {
"全线网": {
outShapeValue: 3.29,
bottomLoseRate: 4.8,
dbcjVariable: 0,
}
};
outShapeValue: 1.8,
bottomLoseRate: 4.8,
dbcjVariable: 0,
}
export const currentRiskDetailDefault = {
"全网": {
pit: 0,
interval: 0,
superMajorBridge: 0,
pitCount: 0,
intervalCount: 0,
superMajorBridgeCount: 0,
}
}
pit: 0,
interval: 0,
superMajorBridge: 0,
pitCount: 0,
intervalCount: 0,
superMajorBridgeCount: 0,
}
......@@ -16,14 +16,16 @@ export async function initConfig() {
if (!configInfo || !configInfo.config) console.log("xml中无配置加载");
else {
//必要配置
let integralConfig = ["port", "monitorUrl"];
let integralConfig = ["port", "monitorUrl", "wsPath"];
checkConfig(integralConfig, configInfo.config);
let {port, monitorUrl} = configInfo.config;
let {port, monitorUrl, wsPath} = configInfo.config;
systemConfig.port = parseInt(port[0]);
systemConfig.monitorUrl = monitorUrl[0];
//ws
systemConfig.wsPath = wsPath[0];
}
} catch(err) {
......
......@@ -5,5 +5,6 @@
export class ServerConfig {
port:number;
monitorUrl:string;
qualitySafetyPanel:string //质量安全面板
qualitySafetyPanel:string; //质量安全面板
wsPath:string;
}
\ No newline at end of file
......@@ -10,9 +10,9 @@ import { INTERFACEREQUESTTYPEENUM } from "../../config/enum";
// }
// http://112.64.195.226:8899/api/openapi/v1/auth/getToken
export const Config = {
"获取token接口":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:"http://112.64.195.226:8899/api/openapi/v1/auth/getToken", reqType:"post", header:{}, body:{}},
"质量安全指标面板":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:"http://112.64.195.226:8899/api/openapi/v1/project/getSectionList", reqType:"post", header:{}, body:{}},
"获取token接口":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:"http://10.151.2.2:8899/api/openapi/v1/auth/getToken", reqType:"post", header:{}, body:{}},
"质量安全指标面板":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:"http://10.151.2.2:8899/api/openapi/v1/project/getSectionList", reqType:"post", header:{}, body:{}},
// "质量安全指标面板暂存json接口":{type:INTERFACEREQUESTTYPEENUM.即时更新, time:3600000*12, url:"http://192.168.0.71:40003/quality", reqType:"post", header:{}, body:{}},
};
......@@ -6,9 +6,12 @@
import { BizError } from "../../util/bizError";
import { readQualityData } from "./writeJson";
const path = require('path');
let url = path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", 'quality.json');
export async function getQualitySafetyPanel() {
let data = await readQualityData();
let data = await readQualityData(url);
// let data = await getInterfaceByInterfaceName("质量安全指标面板暂存json接口", {});
if (!data) throw new BizError("获取json数据失败");
......@@ -29,8 +32,14 @@ export async function getQualitySafetyPanel() {
if (!significantRisk[lineName]) significantRisk[lineName] = {};
if (sectionType != "特大桥") {
if (!significantRisk[lineName][sectionType]) significantRisk[lineName][sectionType] = {level1MajorRisks:0, riskTotal:0, secure:0, control:0, focus:0};
if (!significantRisk[lineName]["基坑"]) significantRisk[lineName]["基坑"] = {level1MajorRisks:0, riskTotal:0, secure:0, control:0, focus:0};
if (!significantRisk[lineName]["旁通道"]) significantRisk[lineName]["旁通道"] = {level1MajorRisks:0, riskTotal:0, secure:0, control:0, focus:0};
if (!significantRisk[lineName]["区间"]) significantRisk[lineName]["区间"] = {level1MajorRisks:0, riskTotal:0, secure:0, control:0, focus:0};
if (!significantRisk["全网"][sectionType]) significantRisk["全网"][sectionType] = {level1MajorRisks:0, riskTotal:0, secure:0, control:0, focus:0};
if (!significantRisk["全网"]["基坑"]) significantRisk["全网"]["基坑"] = {level1MajorRisks:0, riskTotal:0, secure:0, control:0, focus:0};
if (!significantRisk["全网"]["旁通道"]) significantRisk["全网"]["旁通道"] = {level1MajorRisks:0, riskTotal:0, secure:0, control:0, focus:0};
if (!significantRisk["全网"]["区间"]) significantRisk["全网"]["区间"] = {level1MajorRisks:0, riskTotal:0, secure:0, control:0, focus:0};
if (riskLevel == "一级重大风险") { //一级重大风险
significantRisk[lineName][sectionType].level1MajorRisks = significantRisk[lineName][sectionType].level1MajorRisks + 1;
......
......@@ -5,15 +5,14 @@
import { BizError } from "../../util/bizError";
const fs = require('fs');
const path = require('path');
const url = path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", 'quality.json');
// const path = require('path');
// const url = path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", 'quality.json');
/**
* 写入json文件
* @param data
*/
export function writeQualityDataInJson(data) {
export function writeQualityDataInJson(data, url) {
let str = JSON.stringify(data, null, "\t");
fs.writeFileSync(url, str, function(err) {
if (err) {
......@@ -28,7 +27,7 @@ export function writeQualityDataInJson(data) {
/**
* 读取json文件
*/
export function readQualityData() {
export function readQualityData(url) {
let person = JSON.parse(fs.readFileSync(url));
if (!person) throw new BizError("读取文件数据失败");
return person;
......@@ -36,9 +35,19 @@ export function readQualityData() {
/**
* 读取文件夹里所有的json文件
*/
export function readFolderData(url) {
let files = fs.readdirSync(url);
if (!files) throw new BizError("获取文件夹数据失败");
return files;
}
/**
* 读取文件然后在原有文件内容的基础上添加内容,如果key名重复则覆盖
*/
function addData(data) {
function addData(data, url) {
fs.readFile(url, "utf-8", function (err, data) {
if (err) {
console.log(err);
......
import moment = require("moment");
import { broadcastMsg } from "../../biz/wsData";
import { systemConfig } from "../../config/serverConfig";
import { logHandle } from "../../util/log";
export let vehicleLocData = [];
let lockReconnect = false;
async function reconnect() {
if(lockReconnect) return;
lockReconnect = true;
await sleep(5 * 1000);
createSocket();
}
async function sleep(ms) {
return new Promise((resolve, reject)=>{
setTimeout(async function () {
resolve(true);
}, ms);
})
}
let heartCount = 0;
//心跳
let heart = {
timeout:10*1000,//10秒一次心跳包
timeoutObj:null,
reconnectTimeout:5 * 1000, //重连延迟
start:(ws) => {
if (!heartCount) {
heartCount = 1;
}
heart.timeoutObj && clearInterval(heart.timeoutObj);
heart.timeoutObj = setInterval( () => {
//发送心跳包
console.log("本机call目标服务 发送心跳包");
ws.send("i am heart");
}, heart.timeout);
},
reset: () => {//重置
clearInterval(heart.timeoutObj);
}
}
//ws客户端
async function createSocket() {
console.log(systemConfig.wsPath);
let ws = new WebSocket(systemConfig.wsPath);
ws.onclose = async (err) => {
console.log("连接关闭: ", err);
lockReconnect = false;
heartCount = 0;
heart.reset();
//断线重连
reconnect();
}
ws.onmessage = (msg) => {
//接收数据
stats(msg.data);
}
ws.onerror = (error) => {
ws.close();
}
ws.onopen = () => {
heart.start(ws);
}
console.log(`连接汽车数据socket服务: ${systemConfig.wsPath} 成功`);
}
export async function initWSData() {
await createSocket();
}
//在线车辆
let dp = {};//数据池 {"id":{lastMs:最新的时间, list:[{},{},{}], index:0 } }
let dpNewDate = '';
//结构:{"vid":{s:{lng:, lat:''}, e:{}, t:"" , lastCheckMs:0,}}
let test = {};
// let = 0;
//模式缓存
let driveModeQueue = {};//{"vid":{driveMode, velocity}}
export function getDriveModeAndVelocity(vin) {
if (!driveModeQueue[vin]) return {driveMode:"人工", velocity:"0公里/小时"};
return {
driveMode:driveModeQueue[vin].driveMode == 1? "自动":"人工",
velocity:`${Math.round(driveModeQueue[vin].velocity)}公里/小时`
}
}
export function stats(data) {
let dateFormat = moment().format('YYYYMMDD');
if (!dpNewDate) dpNewDate = dateFormat;
if (typeof data == "string") {
try{
// console.log(data);
let dataJson = JSON.parse(data);
if (dataJson.VehicleLoc) {
let {vin, latitude, longitude, positionTime, driveMode, vehicleId, velocity, daymileage, dayduration, totalMileage, totalDuration} = dataJson.VehicleLoc;
vehicleLocData.push({vin, daymileage, dayduration, totalMileage, totalDuration}); //当日实时测试里程,当日实时测试时长,累计测试里程,累计测试时长
// console.log("收到小车位置", vin);
// broadcastMsg({lng:longitude||0.0, lat:latitude||0.0, vin, vehicleid:vehicleId});
//加入到缓存
let lastMs = positionTime || new Date().valueOf();
if ( lastMs ) {//数据包里有时间就缓存
checkData(dateFormat);
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;
driveModeQueue[vin] = {velocity, driveMode};
//==测试代码
if (!positionTime) return;
if (!test[vin] ) test[vin] = {s:{lng:longitude||0.0, lat:latitude||0.0}, e:{lng:0, lat:0}, st:positionTime, et:0, lastCheckMs:new Date().valueOf()};
if ( ( new Date().valueOf() - test[vin].lastCheckMs ) >= 1000) {
if ( !test[vin].et ) {
//初始车
test[vin].e = {lng:longitude||0.0, lat:latitude||0.0};
} else {
//非初始车
test[vin].s = test[vin].e;
test[vin].st = test[vin].et;
test[vin].e = {lng:longitude||0.0, lat:latitude||0.0};
}
test[vin].et = positionTime;
test[vin].t = test[vin].et - test[vin].st;
test[vin].lastCheckMs = new Date().valueOf();
//发送消息给小车
broadcastMsg(test[vin]);
}
//==测试代码结束
}
}
} catch(err) {
logHandle("ws 返回数据不是json --> "+ data);
}
} else {
logHandle(`ws 返回数据不符合规范 类型:${typeof data} --> `+ 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, vin, lastMs} = info;
initList.push({lng, lat, vin});
});
return {initList, count:Object.keys(dp).length};
}
export function getOnlieCarCount() {
return Object.keys(dp).length;
}
//控制端获取在线小车列表
//最后在线时间如果大于1分钟,判定为下线,不下发到控制端的小车列表里
export function controlGetOnlieCarList() {
let ms = new Date().valueOf();
let onlineCarList = [];
for (let key in dp) {
let {lastMs, list, index} = dp[key];
if ((ms -lastMs) > 1*60*1000) continue;
if (index == 0) continue;
let {vin, vehicleid} = list[index-1];
onlineCarList.push({id:vin, vehicleid});
}
return onlineCarList;
}
......@@ -269,3 +269,17 @@ export function mapSiteTableData() {
return result;
}
export function mapSiteJsonTableData() {
let blockDataList = onceSheetBecomeOfblockData('建设指挥平台/建设指挥平台地图.xlsx', '坐标json');
let keyValueOrTitleList = ["坐标json数据"];//适配 饼图 键值以及需要多个key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList =[];//适配 表格
let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
/**
/**
......@@ -39,12 +39,40 @@ export function contractWarningTableData() {
}
export function budgetwarningTableData() {
export function estimateEarlyWarningTableData() {
let blockDataList = onceSheetBecomeOfblockData('建设指挥平台/投资管控.xlsx', '合同预警');
let keyValueOrTitleList = [];//适配 饼图 键值以及需要多个key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList =["概算预警"];//适配 表格
let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function finalAcountsTableData() {
let blockDataList = onceSheetBecomeOfblockData('建设指挥平台/投资管控.xlsx', '决算');
let keyValueOrTitleList = [];//适配 饼图 键值以及需要多个key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList =["概算预警"];//适配 表格
let titltListConfig = {};
let result = packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
export function budgetwarningTableData() {
let blockDataList = onceSheetBecomeOfblockData('建设指挥平台/投资管控.xlsx', '三级概算预警');
let keyValueOrTitleList = [];//适配 饼图 键值以及需要多个key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList =["三级概算预警"];//适配 表格
let titltListConfig = {};
......
......@@ -5,11 +5,12 @@ import { httpServer } from "./net/http_server";
import { initConfig, systemConfig } from "./config/serverConfig";
import { getToken } from "./middleware/getToken";
import { writeQualityDataInJson } from "./data/interface/writeJson";
const path = require('path');
async function lanuch() {
await initConfig();
initInterfaceData();
// dataInJson();
// initInterfaceData();
dataInJson();
httpServer.createServer( systemConfig.port );
console.log('This indicates that the server is started successfully.');
......@@ -18,7 +19,16 @@ async function lanuch() {
async function dataInJson() {
let token = await getToken();
let data = await getInterfaceByInterfaceName("质量安全指标面板", {token});
writeQualityDataInJson(data);
let url = path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", 'quality.json');
writeQualityDataInJson(data, url);
}
lanuch();
function test() {
}
import * as WebSocket from 'ws';
export class Socket {
static createServer(port, callback) {
const wss = new WebSocket.Server({
port,
threshold:1024, // 大小(以字节为单位),低于此大小的消息不压缩
maxPayload:9999,
});
callback(wss);
console.log("socketServer listen on port:"+port);
}
}
\ No newline at end of file
......@@ -9,6 +9,7 @@ import * as mapBiz from '../biz/construct/map';
import * as businessfinanceBiz from '../biz/construct/businessFinance';
import * as investBiz from '../biz/construct/invest';
import * as contractWarningBiz from '../biz/construct/contractWarning';
import * as finalAcountsBiz from '../biz/construct/finalAcounts';
export function setRouter(httpServer) {
/**计划进度指标面板 */
......@@ -34,20 +35,77 @@ export function setRouter(httpServer) {
/**地图 */
httpServer.get('/construct/map', asyncHandler(mapBiz.getMap) ); //4.0
//地图预警
// httpServer.get('/construct/map/earlyWarning', asyncHandler(mapBiz.getEarlyWarning) ); //预警信息 4.0
httpServer.get('/construct/map/earlyWarning', asyncHandler(mapBiz.getSiteCoordinates) ); //站点坐标预警动效 4.0
// httpServer.get('/construct/map/sitecoordinates', asyncHandler(mapBiz.getSiteCoordinates) ); //站点坐标 4.0
// 3.0 ----------------------------------------
/**业财融合指标面板 */
/**投资管控指标面板 */
httpServer.get('/construct/businessfinance/estimate', asyncHandler(businessfinanceBiz.getEstimate) ); //概算总数
httpServer.get('/construct/businessfinance/investmentcompletion', asyncHandler(businessfinanceBiz.getInvestmentCompletion) ); //投资完成情况
/**投资管控指标面板 */
/**业财融合指标面板 */
httpServer.get('/construct/invest', asyncHandler(investBiz.getInvest) );
/**合同预警弹窗 */
httpServer.get('/construct/contractWarning/budgetwarning', asyncHandler(contractWarningBiz.getBudgetWarning) ); //三级概算预警
httpServer.get('/construct/contractWarning/targetcost', asyncHandler(contractWarningBiz.getTargetCost) ); //线路概算目标成本
httpServer.get('/construct/contractWarning/type', asyncHandler(contractWarningBiz.getType) ); //下拉选择类型
httpServer.get('/construct/contractWarning/detailed', asyncHandler(contractWarningBiz.getDetailed) ); //线路概算详情
httpServer.get('/construct/contractwarning/budgetwarning', asyncHandler(contractWarningBiz.getBudgetWarning) ); //三级概算预警详情 暂时舍弃
httpServer.get('/construct/contractwarning/targetcost', asyncHandler(contractWarningBiz.getTargetCost) ); //线路概算目标成本 暂时舍弃
httpServer.get('/construct/contractwarning/type', asyncHandler(contractWarningBiz.getType) ); //下拉选择类型 暂时舍弃
httpServer.get('/construct/contractwarning/detailed', asyncHandler(contractWarningBiz.getDetailed) ); //线路概算详情 暂时舍弃
httpServer.get('/construct/contractwarning/estimateearlywarning', asyncHandler(contractWarningBiz.getEstimateEarlyWarning) ); //概算预警
/**决算 */
httpServer.get('/construct/finalaccounts/estimateearlywarning', asyncHandler(finalAcountsBiz.getEstimateEarlyWarning) ); //概算预警
}
// export function setRouter(httpServer) {
// /**计划进度指标面板 */
// httpServer.get('/construct/prophase', asyncHandler(plannedprogressBiz.getProphase) );//证照办理
// httpServer.get('/construct/relocation', asyncHandler(plannedprogressBiz.getRelocation) );//动迁腾地
// httpServer.get('/construct/schedule', asyncHandler(plannedprogressBiz.getSchedule) );//建设计划
// // httpServer.get('/construct/plannedprogress/milestone', asyncHandler(plannedprogressBiz.getMilestone) );//里程碑节点完成情况
// /**质量安全指标面板 */
// httpServer.get('/construct/fatality', asyncHandler(qualityBiz.getFatality) );//重大风险分布
// httpServer.get('/construct/risk', asyncHandler(qualityBiz.getRisk) );//当前风险节点
// httpServer.get('/construct/engineering', asyncHandler(qualityBiz.getEngineering) );//工程安全状态
// /**投资管控指标面板 弃用 */
// // httpServer.get('/construct/invest/financialestimates', asyncHandler(investBiz.getFinancialestimates) ); //概算总数
// // httpServer.get('/construct/invest/investmentcontrol', asyncHandler(investBiz.getInvestmentcontrol) ); //投控建设
// // httpServer.get('/construct/invest/finalaccounts', asyncHandler(investBiz.getFinalaccounts) ); //决算统计
// /**业财融合指标面板 弃用 */
// // httpServer.get('/construct/businessfinance/invest', asyncHandler(businessfinanceBiz.getInvest) );//投资完成情况
// // httpServer.get('/construct/businessfinance/earlywarning', asyncHandler(businessfinanceBiz.getEarlywarning) );//合同金额预警总览
// // httpServer.get('/construct/businessfinance/detailed', asyncHandler(businessfinanceBiz.getDetailedData) );//合同金额预警总览详细浮窗
// /**地图 */
// httpServer.get('/construct/map', asyncHandler(mapBiz.getMap) ); //4.0
// //地图预警
// // httpServer.get('/construct/map/earlyWarning', asyncHandler(mapBiz.getEarlyWarning) ); //预警信息 4.0
// httpServer.get('/construct/earlyWarning', asyncHandler(mapBiz.getSiteCoordinates) ); //站点坐标预警动效 4.0
// // httpServer.get('/construct/map/sitecoordinates', asyncHandler(mapBiz.getSiteCoordinates) ); //站点坐标 4.0
// // 3.0 ----------------------------------------
// /**投资管控指标面板 */
// httpServer.get('/construct/estimate', asyncHandler(businessfinanceBiz.getEstimate) ); //概算总数
// httpServer.get('/construct/investmentcompletion', asyncHandler(businessfinanceBiz.getInvestmentCompletion) ); //投资完成情况
// /**业财融合指标面板 */
// httpServer.get('/construct/invest', asyncHandler(investBiz.getInvest) );
// /**合同预警弹窗 */
// httpServer.get('/construct/budgetwarning', asyncHandler(contractWarningBiz.getBudgetWarning) ); //三级概算预警详情 暂时舍弃
// httpServer.get('/construct/targetcost', asyncHandler(contractWarningBiz.getTargetCost) ); //线路概算目标成本 暂时舍弃
// httpServer.get('/construct/type', asyncHandler(contractWarningBiz.getType) ); //下拉选择类型 暂时舍弃
// httpServer.get('/construct/detailed', asyncHandler(contractWarningBiz.getDetailed) ); //线路概算详情 暂时舍弃
// httpServer.get('/construct/estimateearlywarning', asyncHandler(contractWarningBiz.getEstimateEarlyWarning) ); //概算预警
// /**决算 */
// httpServer.get('/construct/finalaccounts', asyncHandler(finalAcountsBiz.getEstimateEarlyWarning) ); //概算预警
// }
......@@ -8,7 +8,7 @@ import * as publicBiz from '../biz/public';
export function setRouter(httpServer) {
httpServer.get('/public/line', asyncHandler(publicBiz.getLine));//线路
// httpServer.get('/public/year', asyncHandler(publicBiz.getYear) );//下拉框选择年份
httpServer.get('/public/linejson', asyncHandler(publicBiz.getLineJson) );//下拉框选择年份
httpServer.get('/public/planningperiod', asyncHandler(publicBiz.getPlanningPeriod) );//下拉框选择规划期类型
httpServer.get('/public/lineplanningperiod', asyncHandler(publicBiz.getLineByPlanningPeriod) );//下拉框根据规划期类型选择线路
......
......@@ -46,4 +46,40 @@ export function setRouter(httpServer) {
httpServer.get('/stationpopup/remainingproblems', asyncHandler(remainingProblemsBiz.getRemainingProblems)); //遗留问题 4.0
// httpServer.get('/stationpopup/localization', asyncHandler(localizationBiz.getLocalization)); //属地化移交 4.0 设计图还没有定内容
}
\ No newline at end of file
}
// export function setRouter(httpServer) {
// httpServer.get('/stationpopup/station', asyncHandler(stationInfoBiz.getStation)); //车站信息 4.0
// httpServer.get('/stationpopup/participatingunits', asyncHandler(participatingUnitsBiz.getParticipatingUnits)); //参建单位 4.0
// httpServer.get('/stationpopup/earlycertification', asyncHandler(earlyCertificationBiz.getEarlyCertification)); //前期证照 4.0
// httpServer.get('/stationpopup/relocationtengdi', asyncHandler(relocationTengdiBiz.getRelocationTengdi)); //动迁腾地
// httpServer.get('/stationpopup/pipelinerelocation', asyncHandler(pipelineRelocationBiz.getPipelineRelocation)); //管线搬迁 4.0
// httpServer.get('/stationpopup/pipelinerelocationDetails', asyncHandler(pipelineRelocationBiz.getPipelineRelocationDetails)); //管线搬迁详情
// httpServer.get('/stationpopup/civilengineering', asyncHandler(civilEngineeringBiz.getCivilEngineering)); //土建形象进度
// httpServer.get('/stationpopup/civilengineeringDetails', asyncHandler(civilEngineeringBiz.getCivilEngineeringDetails)); //土建形象进度 工序完成情况
// httpServer.get('/stationpopup/constructionmilestones', asyncHandler(constructionMilestonesBiz.getConstructionMilestones)); //建设里程碑 4.0
// httpServer.get('/stationpopup/smartConstructionSite', asyncHandler(smartConstructionSiteBiz.getSmartConstructionSite)); //智慧工地 4.0
// httpServer.get('/stationpopup/smartConstructionSiteGateData', asyncHandler(smartConstructionSiteBiz.getGateData)); //智慧工地 人员实名制 4.0
// httpServer.get('/stationpopup/smartConstructionSiteMonitoringData', asyncHandler(smartConstructionSiteBiz.getMonitoringData)); //智慧工地 监测数据
// httpServer.get('/stationpopup/riskHazards', asyncHandler(riskHazardsBiz.getRiskHazards)); //风险预警 4.0
// httpServer.get('/stationpopup/riskHazardsDetails', asyncHandler(riskHazardsBiz.getRiskHazardsDetails)); //风险预警详情 4.0
// httpServer.get('/stationpopup/constructionMaterials', asyncHandler(constructionMaterialsBiz.getConstructionMaterials)); //建设资料
// httpServer.get('/stationpopup/constructionMaterialsDetails', asyncHandler(constructionMaterialsBiz.getConstructionMaterialsDetails)); //建设资料详情
// httpServer.get('/stationpopup/remainingproblems', asyncHandler(remainingProblemsBiz.getRemainingProblems)); //遗留问题 4.0
// // httpServer.get('/stationpopup/localization', asyncHandler(localizationBiz.getLocalization)); //属地化移交 4.0 设计图还没有定内容
// }
File added
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