Commit cf7c4dc5 by chenjinjing

no message

parent baa4449d
...@@ -16,14 +16,15 @@ ...@@ -16,14 +16,15 @@
"md5": "^2.2.1", "md5": "^2.2.1",
"moment": "^2.24.0", "moment": "^2.24.0",
"mongoose": "^6.2.3", "mongoose": "^6.2.3",
"node-cache": "^5.1.2",
"node-schedule": "^2.1.1",
"node-xlsx": "^0.16.1", "node-xlsx": "^0.16.1",
"nodemailer": "^6.1.1", "nodemailer": "^6.1.1",
"pyfl": "^1.1.4", "pyfl": "^1.1.4",
"request": "^2.88.0", "request": "2.88.2",
"svg-captcha": "^1.3.12", "svg-captcha": "^1.3.12",
"xml2js": "^0.4.23" "xml2js": "^0.4.23"
}, },
"devDependencies": {},
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
......
No preview for this file type
No preview for this file type
/**
* 左屏
*/
import { systemConfig } from "../config/serverConfig";
import { get2, getGuangFu } from "../data/interface/dataInterface";
import { getKeyValueOut, getOnceYBarChartOut } from "../dataPackage/out";
import { get } from "../util/request";
let guangfuData = {
jbqk: [
{
key: "安全运行天数",
value: 62,
unit:"天"
},
{
key: "组件总功率",
value: 1024,
unit:"kWp"
},
{
key: "设备总数",
value: 23,
unit:"台"
},
],
nhfx: {
count: [
{key: '年用电量', value: '85693.7', unit:"kwp"},
{key: '光伏发电量', value: '85872.1', unit:"kwp"}
],
charData: [
{key: 2019, value: 0},
{key: 2020, value: 0},
{key: 2021, value: 0},
{key: 2022, value: 0},
{key: 2023, value: 0},
{key: 2024, value: 0.49},
{key: 2025, value: 234.78},
],
dayData: [
{key: '05:00', value: 0},
{key: '06:00', value: 74494.85},
{key: '07:00', value: 1274767.62},
{key: '08:00', value: 3469207.81},
{key: '09:00', value: 5133055.46},
{key: '10:00', value: 6363192.78},
],
},
trsy: {
count: [
{key: '光伏投入成本', value: '307', unit:"万"},
{key: '运维成本', value: '5', unit:"万/年"},
{key: '发电量', value: '85872.1', unit:"kwh"},
{key: '发电时长', value: 1473.64, unit:"h"},
],
charData: [
{key: '2020', value: '0'},
{key: '2021', value: '0'},
{key: '2022', value: '0'},
{key: '2023', value: '0'},
{key: '2024', value: '0'},
{key: '2025', value: '237'},
],
},
ztsj: [
{
key: "装机容量",
value: 848,
unit: "",
},
{
key: "总发电量",
value: "85871.3",
unit: "KW",
},
{
key: "实时功率",
value: 5.80,
unit: "KW",
},
],
xyfxfd: {
count: [
{key: '今日发电', value: '3773.4', unit:"kwh"},
{key: '日功率', value: 4.49, unit:"kw"},
{key: '当前功率', value: 2.56, unit:"kw"},
{key: '等效小时数', value: 0, unit:"h"},
],
chartData: [
{key: '02-11', value: '1167.9'},
{key: '02-12', value: '687.5'},
{key: '02-13', value: '3749.7'},
{key: '02-14', value: '1060.7'},
{key: '02-15', value: '364.8'},
{key: '02-16', value: '3257.1'},
{key: '02-17', value: '2940.3'},
{key: '02-18', value: '3773.6'},
],
},
xyfx: {
count: [
{key: '今日收益', value: 2263.62},
{key: '当月收益', value: 26519.58},
{key: '累计收益', value: '123'},
],
chartData: {
"今年": [
{key: '02-11', value: 700.74},
{key: '02-12', value: 412.5},
{key: '02-13', value: 2249.81},
{key: '02-14', value: 636.42},
{key: '02-15', value: 218.88},
{key: '02-16', value: 1954.25},
{key: '02-17', value: 1764.18},
{key: '02-18', value: 2264.16},
],
"去年": [
{key: '02-11', value: 0},
{key: '02-12', value: 0},
{key: '02-13', value: 0},
{key: '02-14', value: 0},
{key: '02-15', value: 0},
{key: '02-16', value: 0},
{key: '02-17', value: 0},
{key: '02-18', value: 0},
],
},
},
jnjp: {
count: [
{
key: "二氧化碳",
value: "832克/千瓦时",
},
{
key: "氮氧化物",
value: "0.179克/千瓦时",
},
{
key: "二氧化硫",
value: "0.16克/千瓦时",
},
{
key: "电力烟尘",
value: "0.032克/千瓦时",
},
],
chartData: [
],
},
};
/**
* 初始化接口数据
*/
export async function guangfuInit() {
await getGuangFu();
await get2();
console.log();
}
/**
* 左屏
* @param req
* @param res
*/
export async function getLeft(req, res) {
let ret: any = {};
ret['jbqk'] = getKeyValueOut('基本情况', guangfuData.jbqk);
ret['fdglpjzfx'] = getKeyValueOut('能耗分析', guangfuData.nhfx.count);
ret['fdglpjzfxqst'] = getKeyValueOut('发电功率平均值分析趋势图', guangfuData.nhfx.charData);
ret['fdgldtgl'] = getKeyValueOut('发电功率当天分析', guangfuData.nhfx.dayData)
ret['trsy'] = getKeyValueOut('投入使用', guangfuData.trsy.count);
ret['trsyqst'] = getKeyValueOut('投入使用趋势', guangfuData.trsy.charData);
res.send(ret);
}
/**
* 中间
* @param req
* @param res
*/
export async function getData(req, res) {
let ret: any = {};
ret['ztsj'] = getKeyValueOut('整体数据', guangfuData.ztsj);
//source=pc&weather_type=observe&province=上海&city=上海&county=浦东新区
let query = {
source: "pc",
weather_type: "observe",
province: "上海",
city: "上海",
county: "浦东新区"
}
let weatherData: any = await get("https://wis.qq.com/weather/common", query);
let weather = {
"天气": "",
"温度": "",
"风向": "",
"风力等级": "",
"湿度": "",
"降水量": "",
"图片": "",
"光照": ""
}
if (weatherData) {
let observe = weatherData.body.observe;
weather = {
"天气": observe.weather,
"温度": observe.degree,
"风向": observe.wind_direction_name,
"风力等级": observe.wind_power,
"湿度": observe.humidity,
"降水量": observe.precipitation,
"图片": `${systemConfig.imgPath}/天气/${observe.weather}.png`,
"光照": "2000lux"
}
}
ret['weather'] = { title: "天气", dataList: weather };
res.send(ret);
}
/**
* 右屏
* @param req
* @param res
*/
export async function getRight(req, res) {
let ret: any = {};
ret['xyfxfd'] = getKeyValueOut('效益分析-发电量', guangfuData.xyfxfd.count);
ret['xyfxfdqst'] = getKeyValueOut('效益分析-发电量趋势', guangfuData.xyfxfd.chartData);
ret['xyfx'] = getKeyValueOut('效益分析', guangfuData.xyfx.count);
ret['xyfxqst'] = { title: "效益分析趋势", dataList: guangfuData.xyfx.chartData }
ret['jnjp'] = getKeyValueOut('节能减排', guangfuData.jnjp.count);
ret['jnjpqst'] = getKeyValueOut('节能减排趋势', guangfuData.jnjp.chartData);
res.send(ret);
}
...@@ -3,12 +3,12 @@ ...@@ -3,12 +3,12 @@
*/ */
import { getGuiYuLeftData } from "../data/interface/guiyu"; import { getGuiYuLeftData } from "../data/interface/guiyu";
import { keyValuePackage, onceYBarChartPackage } from "../dataPackage/inFrontOut"; import { guiYuTableData } from "../data/table/tableData";
import { getKeyValueOut, getOnceYBarChartOut } from "../dataPackage/out"; import { keyValuePackage, onceYBarChartPackage, tablePackage } from "../dataPackage/inFrontOut";
import { getKeyValueOut, getOnceYBarChartOut, getTableOut } from "../dataPackage/out";
export async function getData(req, res) { export async function getData(req, res) {
let ret:any = {}; let ret:any = {};
let guiYuDataInfo = await getGuiYuLeftData(); let guiYuDataInfo = await getGuiYuLeftData();
...@@ -51,5 +51,71 @@ export async function getData(req, res) { ...@@ -51,5 +51,71 @@ export async function getData(req, res) {
ret["txcqs"] = {name:"圆形池水质变化趋势", data:[yxcswqsChartData, yxcphqsChartData, yxcdoqsChartData]}; ret["txcqs"] = {name:"圆形池水质变化趋势", data:[yxcswqsChartData, yxcphqsChartData, yxcdoqsChartData]};
ret["renwu"] = guiYuDataInfo.任务列表; ret["renwu"] = guiYuDataInfo.任务列表;
res.send(ret); res.send(ret);
} }
export async function getGuiYuExcel(req, res) {
let ret:any = {};
let excelData = await guiYuTableData();
let hzsjData = keyValuePackage(excelData["汇总数据"].dataList);
ret['hzsj'] = getKeyValueOut('汇总数据', hzsjData);
let qbcyData = keyValuePackage(excelData["亲本成鱼"].dataList);
ret['qbcy'] = getKeyValueOut('亲本成鱼', qbcyData);
let qbcyclqsData = keyValuePackage(excelData["亲本成鱼近5年产量趋势"].dataList);
ret['qbcyclqs'] = getKeyValueOut('亲本成鱼近5年产量趋势', qbcyclqsData);
let scyzData = keyValuePackage(excelData["水产养殖"].dataList);
ret['scyz'] = getKeyValueOut('水产养殖', scyzData);
let scyz = excelData["养殖记录"].dataList;
let ymyzsl = [];
scyz.forEach( info => {
let {yzzl, sl} = info;
ymyzsl.push({key:yzzl, value:sl});
});
let ymyzslData = keyValuePackage(ymyzsl);
ret['ymyzsl'] = getKeyValueOut('鱼苗养殖数量', ymyzslData);
let xsjlTableData = tablePackage(excelData["销售记录"].headerList[0], excelData["销售记录"].bodyList);
ret['xsjl'] = getTableOut( '销售记录', xsjlTableData);
let scjl = {};
ymyzslData.forEach( info => {
if (!scjl[info.key]) scjl[info.key] = {yzsl:0, xssl:0};
let yzsl = info.value * 10000; //万尾转成尾
scjl[info.key].yzsl += yzsl;
})
xsjlTableData.dataList.forEach( info => {
if (!scjl[info.key]) scjl[info.key] = {yzsl:0, xssl:0};
scjl[info.key].xssl += info.value;
})
let kcjlData = [];
for (let name in scjl) {
let kcsl = scjl[name].yzsl - scjl[name].xssl;
kcjlData.push({key:name, value:kcsl, unit:"尾"});
}
ret["ymkc"] = getKeyValueOut('鱼苗库存', kcjlData);
res.send(ret);
}
...@@ -5,7 +5,6 @@ import { BizError } from "../../util/bizError"; ...@@ -5,7 +5,6 @@ import { BizError } from "../../util/bizError";
import { guangfuTableData } from "../table/tableData"; import { guangfuTableData } from "../table/tableData";
export async function get2() { export async function get2() {
let nowTimeMs = new Date().valueOf(); let nowTimeMs = new Date().valueOf();
let nowTime = moment().format("YYYY-MM-DD"); let nowTime = moment().format("YYYY-MM-DD");
...@@ -99,11 +98,7 @@ export async function get2() { ...@@ -99,11 +98,7 @@ export async function get2() {
* @returns * @returns
*/ */
export async function getGuangFu() { export async function getGuangFu() {
// return
return
let result = { let result = {
jbqk:[], //基本情况 jbqk:[], //基本情况
nhfx:{count:[], charData:[], dayData:[]}, //能耗分析 nhfx:{count:[], charData:[], dayData:[]}, //能耗分析
...@@ -355,6 +350,9 @@ export async function getGuangFu() { ...@@ -355,6 +350,9 @@ export async function getGuangFu() {
/** /**
......
import moment = require("moment");
import { dataCenterInterfaceConfig, systemConfig } from "../../config/serverConfig";
import { get } from "../../util/request";
import { guangfuTableData } from "../table/tableData";
import { readDataFile } from "./guangFuWithCache";
import { keyValuePackage } from "../../dataPackage/inFrontOut";
/**
* 获取光伏数据
*/
export async function getGuangFu() {
let apiData = readDataFile();
let nongTouData = apiData["870209"];
let result = {
/**新设计稿 */
jbqk:[], //基本情况
sssb:{count:[], chartData:{设备类型分布:[], 设备在线状态分布趋势:[], 设备在线状态表格:{headerList:["名称", "时间", "状态"], bodyList:[]}}}, //设施设备
trsy:{count:[], chartData:[]}, //投入使用
ztsj:[], //整体数据
xyfx:{count:[], chartData:[]}, //效益分析
syfx:{count:[], chartData:{}}, //收益分析
jnjp:{count:[], chartData:[]} //节能减排
};
//基本情况
let jbqkData:any = {
安全运行天数:0,
组件总功率:'1024kWp',//万雷提供的常量 1577号是 849kWp 2195号是 175kWp
年发电量:0
};
//设施设备
let sssbData = {
设备总数:0
};
//设备类型分布
let sblxfbConf = ["逆变器", "储能机", "其他设备", "单MAX", "SPH", "SPA", "MIN", "PCS", "HPS", "PBD"];
//设备在线状态分布趋势
let sbzxztfbqs = {
在线:0,
断开:0
};
/**获取站点下的设备列表 */
let nthqdzsblb:any = nongTouData.hqdzsblb;
let deviceList = nthqdzsblb.data ? nthqdzsblb.data.devices || [] : [];
sssbData.设备总数 = deviceList.length;
//设备总数
for (let key in sssbData) {
result.sssb.count.push({key, value:sssbData[key]});
}
//设备类型分布
let sblxfbInfo = {1:[], 2:[], 3:[], 4:[], 5:[], 6:[], 7:[], 8:[], 9:[], 10:[]};
deviceList.forEach( info => {
sblxfbInfo[info.type].push(info);
if (info.lpst == 0) sbzxztfbqs.在线 += 1;
else sbzxztfbqs.断开 += 1
})
for (let i = 0; i < sblxfbConf.length; i++) {
result.sssb.chartData.设备类型分布.push({key:sblxfbConf[i], value:sblxfbInfo[i+1].length});
}
//设备在线状态分布趋势
for (let key in sbzxztfbqs) {
result.sssb.chartData.设备在线状态分布趋势.push({key, value:sbzxztfbqs[key]});
}
//设备在线状态表格
for (let key in sblxfbInfo) {
sblxfbInfo[key].forEach( info => {
let lostStr = "";
if (info.lpst == 0) lostStr = "在线";
else lostStr = "断开";
let laseTime = moment(info.last_update_time).format("YYYY年MM月DD日 HH:mm:ss");
let index = parseInt(key) -1;
result.sssb.chartData.设备在线状态表格.bodyList.push([sblxfbConf[index], laseTime, lostStr])
})
}
/**获取某电站基本信息 */
let hqmdzjbxx:any = nongTouData.hqmdzjbxx;
let aqyxts = 0;
if (hqmdzjbxx.data.create_date) {
let diffDay = moment(moment()).diff(hqmdzjbxx.data.create_date, 'days');
aqyxts = Math.max(jbqkData.安全运行天数, diffDay);
jbqkData.安全运行天数 = aqyxts + "天";
}
/**获取某电站数据概览 */
let hqmdzsjgl:any = nongTouData.hqmdzsjgl;
jbqkData.年发电量 = `${((hqmdzsjgl.data.yearly_energy) / 10000).toFixed(2)}万kWh`; //万kWh
//基本情况
for (let key in jbqkData) {
result.jbqk.push( {key, value:jbqkData[key]} );
}
result.jbqk = keyValuePackage(result.jbqk);
/**投入使用 */
let excelData = guangfuTableData();
let trsyCount:any = {
发电量:0,
发电时长:0
}
trsyCount.发电量 = hqmdzsjgl.data.total_energy + "kWh";
trsyCount.发电时长 = aqyxts * 24 + "h"; //当前安全运行天数,天换算成小时
for (let key in trsyCount) {
excelData["投入使用"].dataList.push({key, value:trsyCount[key]});
}
//投入使用基础数据
result.trsy.count = keyValuePackage(excelData["投入使用"].dataList);
//发电时长趋势 todo 未接入
result.trsy.chartData = [{key:"2020", value:"0"}, {key:"2021", value:"0"}, {key:"2022", value:"0"}, {key:"2023", value:"0"}, {key:"2024", value:"0"}, {key:"2025", value:"0"}];
/**整体数据 */
let ztData:any = {
装机容量:0,
总发电量:0,
实时功率:0
};
if (hqmdzsjgl.data) {
ztData.装机容量 = hqmdzsjgl.data.peak_power_actual;
ztData.总发电量 = hqmdzsjgl.data.total_energy + "kWh";
ztData.实时功率 = (hqmdzsjgl.data.current_power).toFixed(2) + "kWh";
}
for (let key in ztData) {
let unit = "";
if(key != "装机容量") unit = "kW";
result.ztsj.push({key, value:ztData[key], unit});
}
result.ztsj = keyValuePackage(result.ztsj);
/**效益分析 */
let xyfxfdData:any = {
今日发电:0,
日功率:0,
当前功率:0,
等效小时数:"8.5h" //todo 未接入
}
let hqmdzmytglData:any = nongTouData.hqmdzmytgl;
if (hqmdzmytglData.data) {
hqmdzmytglData.data.powers.forEach( info => {
xyfxfdData.日功率 += info.power;
})
}
xyfxfdData.日功率 = xyfxfdData.日功率.toFixed(2) + "W";
if (hqmdzsjgl.data) {
xyfxfdData.今日发电 = hqmdzsjgl.data.today_energy + "kWh";
xyfxfdData.当前功率 = hqmdzsjgl.data.current_power.toFixed(2) + "kWh";
}
/**发电量趋势-近一周 */
let hqmdzlsfdlData:any = nongTouData.hqmdzlsfdl;
hqmdzlsfdlData.data.energys.forEach( info => {
let {date, energy} = info;
result.xyfx.chartData.push({key:date, value:energy});
})
for (let key in xyfxfdData) {
result.xyfx.count.push( {key, value:xyfxfdData[key]} );
}
result.xyfx.count = keyValuePackage(result.xyfx.count);
/**收益分析 */
let syfxData:any = {
今日收益:0,
当月收益:0,
累计收益:0
};
let price = 0;
let ljsy = 0;
excelData["收益分析"].dataList.forEach( info => {
if (info.key == "电价") price = info.value; //今日电价
if (info.key == "累计收益") ljsy = info.value;
})
if (hqmdzsjgl.data) {
syfxData.今日收益 = (hqmdzsjgl.data.today_energy * price).toFixed(2) + "元"; //当天发电量(kWh) * 表格数据电价
syfxData.当月收益 = (hqmdzsjgl.data.monthly_energy * price).toFixed(2) + "元"; //当月发电量(kWh) * 表格数据电价
syfxData.累计收益 = (hqmdzsjgl.data.total_energy * price).toFixed(2) + "元"; //累计发电量(kWh) * 表格数据电价
}
for (let key in syfxData) {
result.syfx.count.push({key, value:syfxData[key]});
}
result.syfx.count = keyValuePackage(result.syfx.count);
/**日收益趋势-近7天日收益 */
let thisYear = [];
hqmdzlsfdlData.data.energys.forEach( info => {
let {date, energy} = info;
let thisPrice = energy * price;
thisYear.push({key: date, value:thisPrice});
});
result.syfx.chartData = thisYear;
/**节能减排 = 发电量 * 0.583(电网排放因子平均排放量) */
let jnjppfyz = excelData["节能减排"].dataList;
let jnjpData = [];
/**节能减排趋势图 */
let jnjpChart = {};
jnjppfyz.forEach( info => {
let jnjp = (hqmdzsjgl.data.today_energy * info.value).toFixed(2);
jnjpData.push({key:info.key, value:jnjp});
if (!jnjpChart[info.key]) jnjpChart[info.key] = [];
hqmdzlsfdlData.data.energys.forEach( chart => {
let {date, energy} = chart;
let thisJnjp = (energy * info.value).toFixed(2);
jnjpChart[info.key].push({key:date, value:thisJnjp});
});
})
result.jnjp.count = jnjpData;
let jnjpChartData = [];
for (let key in jnjpChart) {
jnjpChartData.push({name:key, dataList:jnjpChart[key]});
}
result.jnjp.chartData = jnjpChartData;
console.log();
return result;
}
import moment = require("moment");
import { dataCenterInterfaceConfig, systemConfig } from "../../config/serverConfig";
import { get, getRequest, postRequest } from "../../util/request";
import { guangfuTableData } from "../table/tableData";
const fs = require('fs');
const path = require('path');
// JSON文件路径
const DATA_FILE_PATH = path.join(__dirname.substring(0,__dirname.indexOf("out")), "res", 'apiDataStorage.json' );
// {
// "870225":{
// "hqmdzsjgl": { "data": null, "lastUpdated": null},
// "hqmgyhddzlb": { "data": null, "lastUpdated": null},
// "hqmdzlsfdl": { "data": null, "lastUpdated": null},
// "hqmdzmytgl": { "data": null, "lastUpdated": null},
// "hqmdzjbxx": { "data": null, "lastUpdated": null},
// "hqdzsblb": { "data": null, "lastUpdated": null}
// },
// "870209":{
// "hqmdzsjgl": { "data": null, "lastUpdated": null},
// "hqmgyhddzlb": { "data": null, "lastUpdated": null},
// "hqmdzlsfdl": { "data": null, "lastUpdated": null},
// "hqmdzmytgl": { "data": null, "lastUpdated": null},
// "hqmdzjbxx": { "data": null, "lastUpdated": null},
// "hqdzsblb": { "data": null, "lastUpdated": null}
// }
// }
// 初始化数据文件结构
async function initDataFile() {
let nowTime = new Date().valueOf();
let yearAgo = moment(moment().subtract(1, 'years')).format("YYYY");
let dayAgo = moment().subtract(7, 'days');
let startDate = moment(dayAgo).format("YYYY-MM-DD");
let endDate = moment(new Date()).format("YYYY-MM-DD");
let nowYearAgo = moment(nowTime).format("YYYY-MM-DD");
const InterfaceConfig = [
{key:"hqmdzsjgl", name:"获取某电站数据概览", url:dataCenterInterfaceConfig.hqmdzsjgl, requestMethod:"get", body:{}},
// {key:"hqmgyhddzlb", name:"获取某个用户的电站列表", url:dataCenterInterfaceConfig.hqmgyhddzlb, requestMethod:"post", body:{user_name:systemConfig.userName}},
{key:"hqmdzlsfdl", name:"获取某电站历史发电量", url:dataCenterInterfaceConfig.hqmdzlsfdl, requestMethod:"get", body:{start_date:startDate, end_date:endDate, time_unit:"day"}},
{key:"hqmdzmytgl", name:"获取某电站某一天功率数据", url:dataCenterInterfaceConfig.hqmdzmytgl, requestMethod:"get", body:{date:nowYearAgo}},
{key:"hqmdzjbxx", name:"获取某电站基本信息", url:dataCenterInterfaceConfig.hqmdzjbxx, requestMethod:"get", body:{}},
{key:"hqdzsblb", name:"获取电站设备列表", url:dataCenterInterfaceConfig.hqdzsblb, requestMethod:"get", body:{}},
]
let idList= [870225, 870209];
console.log(`开始刷新缓存数据:${moment(nowTime).format("YYYY-MM-DD HH:mm:ss")}`)
for (let i = 0; i < idList.length; i++) {
let plant_id = idList[i];
for(let conf = 0; conf < InterfaceConfig.length; conf++) {
await callApiAndUpdate(InterfaceConfig[conf].key, InterfaceConfig[conf].name, InterfaceConfig[conf].url, InterfaceConfig[conf].requestMethod, plant_id, InterfaceConfig[conf].body);
}
}
console.log("刷新缓存数据结束")
}
/**
* 接口更新
* 设置定时器,每一小时刷新一次数据
*/
export async function initApiDataStorage() {
await initDataFile();
setInterval(async function () {
await initDataFile();
}, 3600 * 1000);
}
// 调用API并更新数据
async function callApiAndUpdate(apiKey, apiName, apiUrl, requestMethod, plant_id, body) {
// 读取当前数据
const currentData = readDataFile();
if (!currentData) {
console.error('Failed to read current data');
return;
}
// 调用API
let headers = {token:systemConfig.token};
let params = Object.assign({plant_id, perpage:100}, body);
let response:any = {};
if (requestMethod == "get") {
response = await getRequest(apiUrl, params, headers);
}
if (requestMethod == "post") {
response = await postRequest(apiUrl, params, headers);
}
// 更新数据
if (response.success) {
currentData[plant_id][apiKey] = {
data: response.data,
lastUpdated: moment(new Date().valueOf()).format("YYYY-MM-DD HH:mm:ss")
};
// 写入文件
if (writeDataFile(currentData)) {
console.log(`更新json文件接口数据: ${plant_id}-${apiKey}-${apiName}`);
}
} else {
console.error(`API请求失败: ${plant_id}-${apiKey}-${apiName}:${apiUrl}`, response);
// 失败时使用原有数据
console.log(`使用缓存数据:${plant_id}-${apiKey}-${apiName}`);
}
}
// 读取JSON文件
export function readDataFile() {
try {
const rawData = fs.readFileSync(DATA_FILE_PATH);
return JSON.parse(rawData);
} catch (error) {
console.error('Error reading data file:', error);
return null;
}
}
// 写入JSON文件
function writeDataFile(data) {
try {
fs.writeFileSync(DATA_FILE_PATH, JSON.stringify(data, null, 2));
return true;
} catch (error) {
console.error('Error writing data file:', error);
return false;
}
}
...@@ -28,7 +28,7 @@ function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList, ...@@ -28,7 +28,7 @@ function packageDataProcess(blockDataList, titltListConfig, keyValueOrTitleList,
export function guangfuTableData() { export function guangfuTableData() {
let blockDataList = onceSheetBecomeOfblockData('光伏.xlsx', 'Sheet1'); let blockDataList = onceSheetBecomeOfblockData('光伏.xlsx', 'Sheet1');
let keyValueOrTitleList = ['投入使用', '投入使用趋势', '益分析', '节能减排']; //适配 饼图 键值以及需要多个Key的 let keyValueOrTitleList = ['投入使用', '投入使用趋势', '益分析', '节能减排']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图 let barChartList = []; //适配 柱状图 折线图
let stringList = []; let stringList = [];
let decollatePlanarList = []; //适配 表格 let decollatePlanarList = []; //适配 表格
...@@ -54,5 +54,20 @@ export function jiQiRenTableData() { ...@@ -54,5 +54,20 @@ export function jiQiRenTableData() {
} }
export function guiYuTableData() {
let blockDataList = onceSheetBecomeOfblockData('鳜鱼.xlsx', 'Sheet1');
let keyValueOrTitleList = ['汇总数据', '亲本成鱼', '水产养殖', '养殖记录', '亲本成鱼近5年产量趋势']; //适配 饼图 键值以及需要多个Key的
let barChartList = []; //适配 柱状图 折线图
let stringList = [];
let decollatePlanarList = ['销售记录']; //适配 表格
let titleListConfig = {};
let result = packageDataProcess(blockDataList, titleListConfig, keyValueOrTitleList, barChartList, stringList, decollatePlanarList);
return result;
}
...@@ -2,10 +2,12 @@ ...@@ -2,10 +2,12 @@
import { initInterfaceData } from "./data/interface/cronJob"; import { initInterfaceData } from "./data/interface/cronJob";
import { httpServer } from "./net/http_server"; import { httpServer } from "./net/http_server";
import { initConfig, systemConfig } from "./config/serverConfig"; import { initConfig, systemConfig } from "./config/serverConfig";
import { guangfuInit } from "./biz/getData"; import { guangfuInit } from "./biz/gfny";
import { initToken, tokenTask } from "./data/interface/chuanGanqi"; import { initToken, tokenTask } from "./data/interface/chuanGanqi";
import { initDeviceMap, 温湿度变化趋势变化趋势,光照变化, 土壤温度变化趋势, initCGQData } from "./biz/chuanGanQi/cgq"; import { initDeviceMap, 温湿度变化趋势变化趋势,光照变化, 土壤温度变化趋势, initCGQData } from "./biz/chuanGanQi/cgq";
import { getGuangFu } from "./data/interface/dataInterface"; // import { getGuangFu } from "./data/interface/dataInterface";
import { getGuangFu } from "./data/interface/guangFuData";
import { initApiDataStorage } from "./data/interface/guangFuWithCache";
async function lanuch() { async function lanuch() {
await initConfig(); await initConfig();
...@@ -14,7 +16,6 @@ async function lanuch() { ...@@ -14,7 +16,6 @@ async function lanuch() {
// await guangfuInit(); // await guangfuInit();
await systemTask(); await systemTask();
console.log('This indicates that the server is started successfully.'); console.log('This indicates that the server is started successfully.');
} }
//缓存数据 //缓存数据
...@@ -28,6 +29,8 @@ async function systemTask() { ...@@ -28,6 +29,8 @@ async function systemTask() {
// await 土壤温度变化趋势(); // await 土壤温度变化趋势();
// await guangfuInit(); // await guangfuInit();
await initCGQData(); await initCGQData();
await initApiDataStorage();
console.log("数据初始化成功"); console.log("数据初始化成功");
} }
......
import * as asyncHandler from 'express-async-handler' import * as asyncHandler from 'express-async-handler'
import * as leftBiz from '../biz/getData'; import * as leftBiz from '../biz/gfny';
import * as jiQiRenBiz from '../biz/jiQiRen'; import * as jiQiRenBiz from '../biz/jiQiRen';
import * as cyszhglBiz from '../biz/cyszhgl'; import * as cyszhglBiz from '../biz/cyszhgl';
...@@ -44,6 +44,7 @@ export function setRouter(httpServer){ ...@@ -44,6 +44,7 @@ export function setRouter(httpServer){
httpServer.post('/gbzscbgjdAq', asyncHandler(gbzscbgjdAqBiz.getData)); httpServer.post('/gbzscbgjdAq', asyncHandler(gbzscbgjdAqBiz.getData));
httpServer.post('/gbzscbgjdBq', asyncHandler(gbzscbgjdBqBiz.getData)); httpServer.post('/gbzscbgjdBq', asyncHandler(gbzscbgjdBqBiz.getData));
httpServer.post('/guiyu', asyncHandler(guiYuBiz.getData)); httpServer.post('/guiyu', asyncHandler(guiYuBiz.getData));
httpServer.post('/guiyuexcel', asyncHandler(guiYuBiz.getGuiYuExcel));
//======get //======get
httpServer.get('/cyszhgl', asyncHandler(cyszhglBiz.getData)); httpServer.get('/cyszhgl', asyncHandler(cyszhglBiz.getData));
httpServer.get('/zzqk', asyncHandler(cyszhglBiz.zzqk)); httpServer.get('/zzqk', asyncHandler(cyszhglBiz.zzqk));
...@@ -58,5 +59,6 @@ export function setRouter(httpServer){ ...@@ -58,5 +59,6 @@ export function setRouter(httpServer){
httpServer.get('/gbzscbgjdAq', asyncHandler(gbzscbgjdAqBiz.getData)); httpServer.get('/gbzscbgjdAq', asyncHandler(gbzscbgjdAqBiz.getData));
httpServer.get('/gbzscbgjdBq', asyncHandler(gbzscbgjdBqBiz.getData)); httpServer.get('/gbzscbgjdBq', asyncHandler(gbzscbgjdBqBiz.getData));
httpServer.get('/guiyu', asyncHandler(guiYuBiz.getData)); httpServer.get('/guiyu', asyncHandler(guiYuBiz.getData));
httpServer.get('/guiyuexcel', asyncHandler(guiYuBiz.getGuiYuExcel));
} }
\ No newline at end of file
import * as request from 'request'; import * as request from 'request';
import { BizError } from './bizError'; import { BizError } from './bizError';
export function getRequest(url, params?, headers?, timeOut?) {
timeOut = timeOut || 5000;
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
return new Promise((resolve) => {
const options = {
url,
qs: params, // 查询参数(自动拼接到 URL)
headers,
json: true, // 自动解析 JSON 响应
timeout:timeOut
};
request.get(options, (error, response, body) => {
if (error) {
console.error('Request Error:', error);
resolve({
success: false,
error: {
type: 'REQUEST_ERROR',
message: error.message || 'Request failed',
details: error
}
});
return;
}
// 检查 HTTP 状态码(如 200, 404, 500 等)
if (response.statusCode !== 200) {
const errMsg = `HTTP Error: ${response.statusCode}`;
console.error(errMsg);
resolve({
success: false,
error: {
type: 'HTTP_ERROR',
statusCode: response.statusCode,
message: response.statusMessage || errMsg,
details: response
}
});
return;
}
// 检查业务错误码(假设 API 返回 { error_code: 0 } 表示成功)
if (body?.error_code !== undefined && body.error_code !== 0) {
const errMsg = `API Error: ${body.error_msg || 'Unknown error'}`;
console.error(errMsg);
resolve({
success: false,
error: {
type: 'API_ERROR',
errorCode: body.error_code,
message: body.error_msg || errMsg,
details: body
}
});
return;
}
// 返回成功结果
resolve({
success: true,
data: body.data
});
});
});
}
export function postRequest(url, reqbody, headers?, timeOut?) {
timeOut = timeOut || 5000;
if (!url || (url.search(/http:/) === -1 && url.search(/https:/) === -1)) {
throw new BizError(!url ? "请求地址为空" : "请求地址错误");
}
return new Promise((resolve) => {
const options = {
url,
method: "POST",
json: true,
headers: Object.assign({ "content-type": "application/json" }, headers),
body: reqbody,
timeout: timeOut
};
request(options, (error, response, body) => {
if (error) {
console.error('Request Error:', error);
resolve({
success: false,
error: {
type: 'REQUEST_ERROR',
message: error.message || 'Request failed',
details: error
}
});
return;
}
// 检查 HTTP 状态码
if (response.statusCode !== 200) {
const errMsg = `HTTP Error: ${response.statusCode}`;
console.error(errMsg);
resolve({
success: false,
error: {
type: 'HTTP_ERROR',
statusCode: response.statusCode,
message: response.statusMessage || errMsg,
details: response
}
});
return;
}
// 检查业务错误码(和 GET 方法保持一致)
if (body?.error_code !== undefined && body.error_code !== 0) {
const errMsg = `API Error: ${body.error_msg || 'Unknown error'}`;
console.error(errMsg);
resolve({
success: false,
error: {
type: 'API_ERROR',
errorCode: body.error_code,
message: body.error_msg || errMsg,
details: body
}
});
return;
}
// 返回成功结果
resolve({
success: true,
data: body.data // 和 GET 方法一样,假设数据在 body.data 里
});
});
});
}
export function get(url:string, query?, headers?, timeOut?) { export 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 ? "请求地址为空" : "请求地址错误");
...@@ -51,6 +194,8 @@ export function post(url, reqbody, headers) { ...@@ -51,6 +194,8 @@ export function post(url, reqbody, headers) {
}) })
} }
export function postForm(url, body) { export function postForm(url, body) {
if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误"); if (!url || (url.search(/http:/) && url.search(/https:/)) ) throw new BizError(!url ? "请求地址为空" : "请求地址错误");
return new Promise((resolve, reject)=>{ return new Promise((resolve, reject)=>{
...@@ -66,3 +211,10 @@ export function postForm(url, body) { ...@@ -66,3 +211,10 @@ export function postForm(url, body) {
}); });
}) })
} }
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