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 1 місяць тому
батько
коміт
829b831bd4

+ 11 - 0
src/router/index.js

@@ -538,6 +538,17 @@ export const asyncRoutes = [
                             permissions: ["jn_czfx_fgzyfx"],
                         },
                       },
+                      {
+                        path: "agcAnalysis",
+                        component: () =>
+                          import("@/views/economicsOperation/stationAnalyse/fjglfsAnalysis/index.vue"),
+                        name: "dataAnalysisAgcAnalysis",
+                        meta: {
+                            title: "风机功率风速分析",
+                            icon: "",
+                            permissions: ["jn_czfx_fgzyfx"],
+                        },
+                      },
                 ]
             },
             //机组分析

Різницю між файлами не показано, бо вона завелика
+ 86426 - 0
src/views/economicsOperation/stationAnalyse/fjglfsAnalysis/agcJson.json


+ 398 - 0
src/views/economicsOperation/stationAnalyse/fjglfsAnalysis/components/configStation.json

@@ -0,0 +1,398 @@
+{
+	"NSS_BT": {
+		"id": "NSS_BT",
+		"installedCapacity": 148.5,
+		"title": "牛首山第二风电场",
+		"aiPoints": [{
+			"name": "有功设定限值",
+			"tag": "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_AI1019",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "实发有功",
+			"tag": "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_AI1009",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调上限",
+			"tag": "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_AI1010",
+			"multiplier": 0.001,
+			"unit": "MW"
+		}, {
+			"name": "理论功率",
+			"tag": "NSSFCJSFW.NX_GD_NSSF_XX_XX_XXX_XXX_CI0193",
+			"multiplier": 0.001,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调下限",
+			"tag": "NSSDQN.NX_GD_NSSF_DQ_P1_L1_001_AI1011",
+			"multiplier": 0.1,
+			"unit": "MW"
+		}, {
+			"name": "预测功率",
+			"tag": "NSSFGL.NX_GD_NSSF_YC_P1_L1_001_CDQ001",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}]
+	},
+	"QS_BT": {
+		"id": "QS_BT",
+		"installedCapacity": 99.0,
+		"title": "麻黄山第六风电场",
+		"aiPoints": [{
+			"name": "有功设定限值",
+			"tag": "QSDQ.NX_GD_QSF_DQ_P1_L1_001_AI1281",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "实发有功",
+			"tag": "QSDQ.NX_GD_QSF_DQ_P1_L1_001_AI1282",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调上限",
+			"tag": "QSDQ.NX_GD_QSF_DQ_P1_L1_001_AI1284",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "理论功率",
+			"tag": "QSFCJSFW.NX_GD_QSF_FJ_P1_XXX_XXX_CI0192,QSFCJSFW.NX_GD_QSF_FJ_P2_XXX_XXX_CI0192",
+			"multiplier": 0.001,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调下限",
+			"tag": "QSDQ.NX_GD_QSF_DQ_P1_L1_001_AI1285",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "预测功率",
+			"tag": "QSFGL.NX_GD_QSF_YC_P1_L1_001_CDQ001",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}]
+	},
+	"XS_BT": {
+		"id": "XS_BT",
+		"installedCapacity": 99.0,
+		"title": "香山第五风电场",
+		"aiPoints": [{
+			"name": "有功设定限值",
+			"tag": "XSDQ.NX_GD_XSF_DQ_P1_L1_001_AI0411",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "实发有功",
+			"tag": "XSDQ.NX_GD_XSF_DQ_P1_L1_001_AI0415",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调上限",
+			"tag": "XSDQ.NX_GD_XSF_DQ_P1_L1_001_AI0412",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "理论功率",
+			"tag": "XSFCJSFW.NX_GD_XSF_XX_XX_XXX_XXX_CI0193",
+			"multiplier": 0.001,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调下限",
+			"tag": "XSDQ.NX_GD_XSF_DQ_P1_L1_001_AI0413",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "预测功率",
+			"tag": "XSFGL.NX_GD_XSF_YC_P1_L1_001_CDQ001",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}]
+	},
+	"MHS_BT": {
+		"id": "MHS_BT",
+		"installedCapacity": 69.5,
+		"title": "麻黄山第二风电场",
+		"aiPoints": [{
+			"name": "有功设定限值",
+			"tag": "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_AI0296",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "实发有功",
+			"tag": "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_AI0013",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调上限",
+			"tag": "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_AI0294",
+			"multiplier": 0.1,
+			"unit": "MW"
+		}, {
+			"name": "理论功率",
+			"tag": "MHSFCJSFW.NX_GD_MHSF_XX_XX_XXX_XXX_CI0193",
+			"multiplier": 0.001,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调下限",
+			"tag": "MHSDQ.NX_GD_MHSF_DQ_P1_L1_001_AI0295",
+			"multiplier": 0.01,
+			"unit": "MW"
+		}, {
+			"name": "预测功率",
+			"tag": "MHSFGL.NX_GD_MHSF_YC_P1_L1_001_CDQ001",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}]
+	},
+	"XH_BT": {
+		"id": "XH_BT",
+		"installedCapacity": 20.0,
+		"title": "宣和光伏电站",
+		"aiPoints": [{
+			"name": "有功设定限值",
+			"tag": "XHDQ.NX_GD_XHG_DQ_P1_L1_001_AI0204",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "实发有功",
+			"tag": "XHDQ.NX_GD_XHG_DQ_P1_L1_001_AI0193",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调上限",
+			"tag": "XHDQ.NX_GD_XHG_DQ_P1_L1_001_AI0194",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "理论功率",
+			"tag": "XHGDCJSFW.NX_GD_XHG_XX_XX_XXX_XXX_CI0192",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调下限",
+			"tag": "XHDQ.NX_GD_XHG_DQ_P1_L1_001_AI0195",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "预测功率",
+			"tag": "XHGGL.NX_GD_XHG_YC_P1_L1_001_CDQ001",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}]
+	},
+	"SL_BT": {
+		"id": "SL_BT",
+		"installedCapacity": 49.5,
+		"title": "宋堡第六风电场",
+		"aiPoints": [{
+			"name": "有功设定限值",
+			"tag": "SLAGC.NX_GD_QSF_DQ_P1_L1_001_AI0052",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "实发有功",
+			"tag": "SLDQ.NX_GD_QSF_DQ_P1_L1_001_AI0013",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调上限",
+			"tag": "SLAGC.NX_GD_QSF_DQ_P1_L1_001_AI0053",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "理论功率",
+			"tag": "QSFCJSFW.NX_GD_QSF_FJ_P3_XXX_XXX_CI0192",
+			"multiplier": 0.001,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调下限",
+			"tag": "SLAGC.NX_GD_QSF_DQ_P1_L1_001_AI0054",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "预测功率",
+			"tag": "SLFGL.NX_GD_QSF_YC_P1_L1_001_LCDQ01",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}]
+	},
+	"HZJ_BT": {
+		"id": "HZJ_BT",
+		"installedCapacity": 50.0,
+		"title": "海子井光伏电站",
+		"aiPoints": [{
+			"name": "有功设定限值",
+			"tag": "HZJAGC.NX_GD_HZJG_DQ_P1_L1_001_AI0016",
+			"multiplier": 0.001,
+			"unit": "MW"
+		}, {
+			"name": "实发有功",
+			"tag": "HZJAGC.NX_GD_HZJG_DQ_P1_L1_001_AI0015",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调上限",
+			"tag": "HZJAGC.NX_GD_HZJG_DQ_P1_L1_001_AI0021",
+			"multiplier": 0.001,
+			"unit": "MW"
+		}, {
+			"name": "理论功率",
+			"tag": "HZJAGC.NX_GD_HZJG_DQ_P1_L1_001_AI0214",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调下限",
+			"tag": "HZJAGC.NX_GD_HZJG_DQ_P1_L1_001_AI0022",
+			"multiplier": 0.001,
+			"unit": "MW"
+		}, {
+			"name": "预测功率",
+			"tag": "HZJGGL.NX_GD_HZJG_YC_P1_L1_001_CDQ001",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}]
+	},
+	"XN6_BT": {
+		"id": "XN6_BT",
+		"installedCapacity": 49.5,
+		"title": "星能第六风电场",
+		"aiPoints": [{
+			"name": "有功设定限值",
+			"tag": "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0818",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "实发有功",
+			"tag": "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0012",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调上限",
+			"tag": "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0819",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "理论功率",
+			"tag": "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0826",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调下限",
+			"tag": "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0820",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "预测功率",
+			"tag": "SBQXLDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0827",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}]
+	},
+	"N5_BT": {
+		"id": "N5_BT",
+		"installedCapacity": 149.0,
+		"title": "牛首山第五风电场",
+		"aiPoints": [{
+			"name": "有功设定限值",
+			"tag": "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0818",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "实发有功",
+			"tag": "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0817",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调上限",
+			"tag": "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0819",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "理论功率",
+			"tag": "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0830",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调下限",
+			"tag": "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0820",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "预测功率",
+			"tag": "SBQNWDQ.NX_GD_SBQF_DQ_P1_L1_001_AI0831",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}]
+	},
+	"DWK_BT": {
+		"id": "DWK_BT",
+		"installedCapacity": 10.0,
+		"title": "大武口光伏电站",
+		"aiPoints": [{
+			"name": "有功设定限值",
+			"tag": "",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "实发有功",
+			"tag": "",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调上限",
+			"tag": "DWKDQ.NX_GD_DWKG_DQ_P1_L1_001_AI0838",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "理论功率",
+			"tag": "DWKGDCJSFW.NX_GD_DWKG_XX_XX_XXX_XXX_CI0192",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调下限",
+			"tag": "DWKDQ.NX_GD_DWKG_DQ_P1_L1_001_AI0839",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "预测功率",
+			"tag": "DWKGGL.NX_GD_DWKG_YC_P1_L1_001_CDQ001",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}]
+	},
+	"PL_BT": {
+		"id": "PL_BT",
+		"installedCapacity": 30.0,
+		"title": "平罗光伏电站",
+		"aiPoints": [{
+			"name": "有功设定限值",
+			"tag": "PLSJ1.NX_GD_PLG_DQ_P1_L1_001_AI0838",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "实发有功",
+			"tag": "PLSJ1.NX_GD_PLG_DQ_P1_L1_001_AI0835",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调上限",
+			"tag": "PLSJ1.NX_GD_PLG_DQ_P1_L1_001_AI0836",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "理论功率",
+			"tag": "PLGDCJSFW.NX_GD_PLG_XX_XX_XXX_XXX_CI0192",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "AGC可调下限",
+			"tag": "PLSJ1.NX_GD_PLG_DQ_P1_L1_001_AI0837",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}, {
+			"name": "预测功率",
+			"tag": "PLGGL.NX_GD_PLG_YC_P1_L1_001_CDQ0001",
+			"multiplier": 1.0,
+			"unit": "MW"
+		}]
+	}
+}

+ 387 - 0
src/views/economicsOperation/stationAnalyse/fjglfsAnalysis/components/current-scatter-chart.json

@@ -0,0 +1,387 @@
+{
+	"textStyle": {},
+	"title": {
+		"textStyle": {
+			"color": "#333333"
+		},
+		"subtextStyle": {
+			"color": "#aaaaaa"
+		}
+	},
+	"line": {
+		"itemStyle": {
+			"borderWidth": 1
+		},
+		"lineStyle": {
+			"width": 2
+		},
+		"symbolSize": 4,
+		"symbol": "emptyCircle",
+		"smooth": false
+	},
+	"radar": {
+		"itemStyle": {
+			"borderWidth": 1
+		},
+		"lineStyle": {
+			"width": 2
+		},
+		"symbolSize": 4,
+		"symbol": "emptyCircle",
+		"smooth": false
+	},
+	"bar": {
+		"itemStyle": {
+			"barBorderWidth": 0,
+			"barBorderColor": "#ccc"
+		}
+	},
+	"pie": {
+		"itemStyle": {
+			"borderWidth": 0,
+			"borderColor": "#ccc"
+		}
+	},
+	"scatter": {
+		"itemStyle": {
+			"borderWidth": 0,
+			"borderColor": "#ccc"
+		}
+	},
+	"boxplot": {
+		"itemStyle": {
+			"borderWidth": 0,
+			"borderColor": "#ccc"
+		}
+	},
+	"parallel": {
+		"itemStyle": {
+			"borderWidth": 0,
+			"borderColor": "#ccc"
+		}
+	},
+	"sankey": {
+		"itemStyle": {
+			"borderWidth": 0,
+			"borderColor": "#ccc"
+		}
+	},
+	"funnel": {
+		"itemStyle": {
+			"borderWidth": 0,
+			"borderColor": "#ccc"
+		}
+	},
+	"gauge": {
+		"itemStyle": {
+			"borderWidth": 0,
+			"borderColor": "#ccc"
+		}
+	},
+	"candlestick": {
+		"itemStyle": {
+			"color": "#c12e34",
+			"color0": "#2b821d",
+			"borderColor": "#c12e34",
+			"borderColor0": "#2b821d",
+			"borderWidth": 1
+		}
+	},
+	"graph": {
+		"itemStyle": {
+			"borderWidth": 0,
+			"borderColor": "#ccc"
+		},
+		"lineStyle": {
+			"width": 1,
+			"color": "#aaaaaa"
+		},
+		"symbolSize": 4,
+		"symbol": "emptyCircle",
+		"smooth": false,
+		"color": [
+			"#c12e34",
+			"#e6b600",
+			"#0098d9",
+			"#50ec39",
+			"#005eaa",
+			"#339ca8",
+			"#cda819",
+			"#32a487"
+		],
+		"label": {
+			"color": "#eeeeee"
+		}
+	},
+	"map": {
+		"itemStyle": {
+			"areaColor": "#ddd",
+			"borderColor": "#eee",
+			"borderWidth": 0.5
+		},
+		"label": {
+			"color": "#c12e34"
+		},
+		"emphasis": {
+			"itemStyle": {
+				"areaColor": "#e6b600",
+				"borderColor": "#ddd",
+				"borderWidth": 1
+			},
+			"label": {
+				"color": "#c12e34"
+			}
+		}
+	},
+	"geo": {
+		"itemStyle": {
+			"areaColor": "#ddd",
+			"borderColor": "#eee",
+			"borderWidth": 0.5
+		},
+		"label": {
+			"color": "#c12e34"
+		},
+		"emphasis": {
+			"itemStyle": {
+				"areaColor": "#e6b600",
+				"borderColor": "#ddd",
+				"borderWidth": 1
+			},
+			"label": {
+				"color": "#c12e34"
+			}
+		}
+	},
+	"categoryAxis": {
+		"axisLine": {
+			"show": true,
+			"lineStyle": {
+				"color": "#838383"
+			}
+		},
+		"axisTick": {
+			"show": true,
+			"lineStyle": {
+				"color": "#838383"
+			}
+		},
+		"axisLabel": {
+			"show": true,
+			"color": "#838383"
+		},
+		"splitLine": {
+			"show": false,
+			"lineStyle": {
+				"color": [
+					"#838383"
+				]
+			}
+		},
+		"splitArea": {
+			"show": false,
+			"areaStyle": {
+				"color": [
+					"rgba(250,250,250,0.3)",
+					"rgba(200,200,200,0.3)"
+				]
+			}
+		}
+	},
+	"valueAxis": {
+		"axisLine": {
+			"show": true,
+			"lineStyle": {
+				"color": "#838383"
+			}
+		},
+		"axisTick": {
+			"show": true,
+			"lineStyle": {
+				"color": "#838383"
+			}
+		},
+		"axisLabel": {
+			"show": true,
+			"color": "#838383"
+		},
+		"splitLine": {
+			"show": true,
+			"lineStyle": {
+				"color": [
+					"#ccc"
+				]
+			}
+		},
+		"splitArea": {
+			"show": false,
+			"areaStyle": {
+				"color": [
+					"rgba(250,250,250,0.3)",
+					"rgba(200,200,200,0.3)"
+				]
+			}
+		}
+	},
+	"logAxis": {
+		"axisLine": {
+			"show": true,
+			"lineStyle": {
+				"color": "#333"
+			}
+		},
+		"axisTick": {
+			"show": true,
+			"lineStyle": {
+				"color": "#333"
+			}
+		},
+		"axisLabel": {
+			"show": true,
+			"color": "#333"
+		},
+		"splitLine": {
+			"show": true,
+			"lineStyle": {
+				"color": [
+					"#ccc"
+				]
+			}
+		},
+		"splitArea": {
+			"show": false,
+			"areaStyle": {
+				"color": [
+					"rgba(250,250,250,0.3)",
+					"rgba(200,200,200,0.3)"
+				]
+			}
+		}
+	},
+	"timeAxis": {
+		"axisLine": {
+			"show": true,
+			"lineStyle": {
+				"color": "#838383"
+			}
+		},
+		"axisTick": {
+			"show": true,
+			"lineStyle": {
+				"color": "#838383"
+			}
+		},
+		"axisLabel": {
+			"show": true,
+			"color": "#838383"
+		},
+		"splitLine": {
+			"show": true,
+			"lineStyle": {
+				"color": [
+					"#838383"
+				]
+			}
+		},
+		"splitArea": {
+			"show": false,
+			"areaStyle": {
+				"color": [
+					"rgba(250,250,250,0.3)",
+					"rgba(200,200,200,0.3)"
+				]
+			}
+		}
+	},
+	"toolbox": {
+		"iconStyle": {
+			"borderColor": "#06467c"
+		},
+		"emphasis": {
+			"iconStyle": {
+				"borderColor": "#4187c2"
+			}
+		},
+		"textStyle": {
+			"color": "#838383"
+		}
+	},
+	"legend": {
+		"textStyle": {
+			"color": "#838383"
+		}
+	},
+	"tooltip": {
+		"axisPointer": {
+			"lineStyle": {
+				"color": "#cccccc",
+				"width": 1
+			},
+			"crossStyle": {
+				"color": "#cccccc",
+				"width": 1
+			}
+		}
+	},
+	"timeline": {
+		"lineStyle": {
+			"color": "#005eaa",
+			"width": 1
+		},
+		"itemStyle": {
+			"color": "#005eaa",
+			"borderWidth": 1
+		},
+		"controlStyle": {
+			"color": "#005eaa",
+			"borderColor": "#005eaa",
+			"borderWidth": 0.5
+		},
+		"checkpointStyle": {
+			"color": "#005eaa",
+			"borderColor": "#316bc2"
+		},
+		"label": {
+			"color": "#005eaa"
+		},
+		"emphasis": {
+			"itemStyle": {
+				"color": "#005eaa"
+			},
+			"controlStyle": {
+				"color": "#005eaa",
+				"borderColor": "#005eaa",
+				"borderWidth": 0.5
+			},
+			"label": {
+				"color": "#005eaa"
+			}
+		}
+	},
+	"visualMap": {
+		"color": [
+			"#1790cf",
+			"#a2d4e6"
+		]
+	},
+	"dataZoom": {
+		"backgroundColor": "rgba(47,69,84,0)",
+		"dataBackgroundColor": "rgba(47,69,84,0.3)",
+		"fillerColor": "rgba(167,183,204,0.4)",
+		"handleColor": "#a7b7cc",
+		"handleSize": "100%",
+		"textStyle": {
+			"color": "#333333"
+		}
+	},
+	"markPoint": {
+		"label": {
+			"color": "#eeeeee"
+		},
+		"emphasis": {
+			"label": {
+				"color": "#eeeeee"
+			}
+		}
+	}
+}

+ 517 - 0
src/views/economicsOperation/stationAnalyse/fjglfsAnalysis/components/current-scatter-chart.vue

@@ -0,0 +1,517 @@
+<template>
+  <div class="chart" :id="id" :style="`width:${width}; height:${height}`"></div>
+</template>
+
+<script>
+import util from "@tools/util";
+import partten from "@tools/partten";
+import * as echarts from "echarts";
+import chartTheme from "./current-scatter-chart.json";
+
+export default {
+  name: "currentScatterChart",
+  props: {
+    // 图表宽度
+    width: {
+      type: String,
+      default: "100%",
+    },
+    // 图表高度
+    height: {
+      type: String,
+      default: "350px",
+    },
+    // 图表主标题
+    chartTitle: {
+      type: String,
+      default: "自定义图表组件",
+    },
+    // X 轴配置项
+    xAxisData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // Y 轴配置项
+    yAxisData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    dataSet: {
+      type: String,
+      default: "",
+    },
+    // 图表核心数据
+    seriesData: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    // 是否显示图表图例
+    showLegend: {
+      type: Boolean,
+      default: true,
+    },
+    // 是否默认采用笔刷模式
+    brushSelected: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      id: "",
+      chart: null,
+      theme: "light",
+      color: [],
+      linearGradientColor: [],
+      chartData: [],
+      markItem: {},
+    };
+  },
+  computed: {
+    collapse() {
+      return this.$store.state.collapse;
+    },
+  },
+  watch: {
+    height() {
+      if (this.chart) {
+        this.chart.resize();
+      }
+    },
+    collapse(val) {
+      if (this.chart) {
+        setTimeout(() => {
+          this.chart.resize();
+        }, 300);
+      }
+    },
+  },
+  methods: {
+    resize() {},
+
+    setMarkItem(markItem) {
+      this.markItem = markItem;
+    },
+
+    initChart(markItem = {}) {
+      const that = this;
+      document.getElementById(this.id).removeAttribute("_echarts_instance_");
+      that.chart = null;
+      const theme = sessionStorage.getItem("theme") === "true" ? true : false;
+
+      this.$nextTick(() => {
+        that.chartData.forEach((ele) => {
+          ele.emphasis = {
+            focus: "none", // 取消高亮
+            itemStyle: {
+              color: null, // 不改变颜色
+              borderColor: null, // 不改变边框颜色
+              borderWidth: 0, // 不改变边框宽度
+              shadowBlur: 0, // 不添加阴影
+              shadowColor: null, // 不改变阴影颜色
+              opacity: 1, // 不改变透明度
+            },
+          };
+          ele.large = true; // 开启大数据模式
+          ele.progressive = 300; // 每次渲染的数据点数量
+          ele.progressiveChunkMode = "sequential"; // 顺序分批渲染
+          ele.silent = true;
+
+          if (ele.name === "偏差上限") {
+            ele.areaStyle = that.linearGradientColor[0];
+            ele.silent = true;
+          } else if (ele.name === "偏差下限") {
+            ele.areaStyle = that.linearGradientColor[1];
+            ele.silent = true;
+          }
+
+          if (ele.name === "实发有功" && markItem.res) {
+            this.markItem = markItem;
+            ele.markPoint = {
+              symbolSize: 36,
+              itemStyle: {
+                color: this.$store.state.theme ? "#eb4d4b" : "#ff7979", // 特殊颜色
+              },
+              emphasis: {
+                focus: "none", // 取消高亮
+                silent: true, // 禁用 markPoint 的所有鼠标事件
+                itemStyle: {
+                  color: "#fff", // 不改变颜色
+                  borderColor: null, // 不改变边框颜色
+                  borderWidth: 0, // 不改变边框宽度
+                  shadowBlur: 0, // 不添加阴影
+                  shadowColor: null, // 不改变阴影颜色
+                  opacity: 1, // 不改变透明度
+                },
+              },
+              blur: {
+                itemStyle: {
+                  opacity: 1,
+                },
+              },
+              data: [
+                {
+                  name: `${markItem.date} 异常点`,
+                  value: ele.data[markItem.dataIndex],
+                  xAxis: markItem.dataIndex, // 使用索引作为 x 坐标
+                  yAxis: ele.data[markItem.dataIndex], // 使用实际值作为 y 坐标
+                  label: {
+                    formatter: markItem.res,
+                    position: "top",
+                  },
+                },
+              ],
+            };
+          }
+        });
+        let myChart = echarts.init(document.getElementById(this.id));
+        that.chart = myChart;
+        //指定图表的配置项和数据
+        const option = {
+          //标题
+          color: this.color,
+          title: {
+            text: that.chartTitle,
+            right: 440,
+            top: 4,
+            textStyle: {
+              fontSize: 14,
+              color: theme ? "#000" : "#fff",
+            },
+          },
+          //工具箱
+          toolbox: {
+            show: false,
+            x: "right",
+            position: [10, 10],
+            // backgroundColor:'rgba(0,0,0,0.4)',
+            borderColor: theme ? "#000" : "#fff",
+            textStyle: {
+              fontSize: util.vh(16),
+              color: theme ? "#000" : "#fff",
+            },
+            iconStyle: {
+              borderColor: theme ? "#000" : "#fff",
+            },
+            emphasis: {
+              iconStyle: {
+                borderColor: theme ? "#000" : "#fff",
+              },
+            },
+          },
+          tooltip: {
+            trigger: "axis",
+            axisPointer: {
+              type: "cross",
+            },
+            formatter(data) {
+              let label = ``;
+              data.forEach((ele, index) => {
+                label += `<p>
+                              <span style="background:${
+                                that.color[index]
+                              };margin-right:5px;display:inline-block;width:10px;height:10px;border-radius:50%;over-flow:hidden;"></span>
+                              <span>${
+                                ele.seriesName
+                              }:<span style="font-weight: 700;margin-left:10px">${
+                  ele.value || 0
+                }</span></span>
+                            </p>`;
+              });
+              return label;
+            },
+          },
+          brush: {
+            seriesIndex: [2, 3],
+            yAxisIndex: 0,
+            transformable: true,
+            throttleType: "debounce",
+            throttleDelay: 1000,
+            removeOnClick: true,
+            brushType: "polygon",
+            brushMode: "multiple",
+            brushStyle: {
+              borderWidth: 1,
+              borderColor: "#ff2424",
+            },
+          },
+          dataZoom: [
+            {
+              type: "inside", //图表下方的伸缩条
+              show: false, //是否显示
+              realtime: true, //拖动时,是否实时更新系列的视图
+              start: 0, //伸缩条开始位置(1-100),可以随时更改
+              end: 100, //伸缩条结束位置(1-100),可以随时更改
+            },
+            {
+              type: "slider", //图表下方的伸缩条
+              show: false, //是否显示
+              realtime: true, //拖动时,是否实时更新系列的视图
+              start: 0, //伸缩条开始位置(1-100),可以随时更改
+              end: 100, //伸缩条结束位置(1-100),可以随时更改
+            },
+          ],
+          textStyle: {
+            fontSize: util.vh(16),
+            color: theme ? "#fff" : "#000",
+            rich: {
+              a: {
+                fontSize: 15,
+                width: 110,
+                color: theme ? "#000" : "#fff",
+              },
+            },
+          },
+          //图例-每一条数据的名字
+          legend: {
+            show: that.showLegend,
+            // right: 170,
+            right: 70,
+            type: "scroll",
+            top: "5",
+            icon: "circle",
+            itemWidth: 6,
+            inactiveColor: theme ? "#000" : "#fff",
+            textStyle: {
+              color: theme ? "#000" : "#fff",
+              fontSize: 12,
+            },
+            // formatter(name) {
+            //   return [`{a| ${name}}`].join(" ");
+            // },
+          },
+          grid: {
+            top: 58,
+            left: 40,
+            right: 48,
+            bottom: 24,
+          },
+          //x轴
+          xAxis: [
+            {
+              name: "时间",
+              nameTextStyle: {
+                color: theme ? "#000" : "#fff",
+              },
+              type: "category",
+              boundaryGap: true,
+              data: that.xAxisData || [],
+              axisLabel: {
+                formatter: "{value}",
+                color: theme ? "#000" : "#fff",
+              },
+              splitLine: {
+                show: false,
+              },
+              smooth: true,
+              textStyle: {
+                color: theme ? "#000" : "#fff",
+              },
+            },
+          ],
+          //y轴没有显式设置,根据值自动生成y轴
+          yAxis: [
+            {
+              splitLine: {
+                show: false,
+              },
+              position: "left",
+              min: 0,
+              name: "MW",
+              nameTextStyle: {
+                color: theme ? "#000" : "#fff",
+              },
+              axisLabel: {
+                color: theme ? "#000" : "#fff",
+              },
+            },
+          ],
+          animation: true,
+          dataset: that.dataSet.length ? JSON.parse(that.dataSet) : [],
+          //数据-data是最终要显示的数据
+          series: that.chartData,
+        };
+
+        that.resize = function () {
+          myChart.resize();
+        };
+
+        window.addEventListener("resize", that.resize);
+
+        if (markItem.res) {
+          option.dataZoom = that.handleRowClick(markItem);
+        }
+
+        myChart.setOption(option);
+
+        myChart.off("brushSelected");
+        // myChart.on("brushSelected", (params) => {
+        //   that.$emit("getSelected", params.batch || []);
+        // });
+        myChart.off("legendselectchanged");
+      });
+    },
+
+    changeColor() {
+      if (this.$store.state.theme) {
+        this.color = [
+          "#67c23a",
+          "rgb(242.5, 208.5, 157.5)",
+          "#f56c6c",
+          "rgb(135, 0, 157)",
+          "rgb(116, 21, 219)",
+        ];
+
+        this.linearGradientColor = [
+          {
+            opacity: 0.5,
+            color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
+              {
+                offset: 0,
+                color: "rgb(255, 0, 135)",
+              },
+              {
+                offset: 1,
+                color: "rgb(135, 0, 157)",
+              },
+            ]),
+          },
+          // {
+          //   opacity: 0.5,
+          //   color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
+          //     {
+          //       offset: 0,
+          //       color: "rgb(55, 162, 255)",
+          //     },
+          //     {
+          //       offset: 1,
+          //       color: "rgb(116, 21, 219)",
+          //     },
+          //   ]),
+          // },
+          {
+            opacity: 1,
+            color: "#fff",
+          },
+        ];
+      } else {
+        this.color = [
+          "#67c23a",
+          "rgb(242.5, 208.5, 157.5)",
+          "#f56c6c",
+          "rgb(77, 119, 255)",
+          "rgb(1, 191, 236)",
+        ];
+        this.linearGradientColor = [
+          {
+            opacity: 0.5,
+            color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
+              {
+                offset: 0,
+                color: "rgb(0, 221, 255)",
+              },
+              {
+                offset: 1,
+                color: "rgb(77, 119, 255)",
+              },
+            ]),
+          },
+          // {
+          //   opacity: 0.5,
+          //   color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
+          //     {
+          //       offset: 0,
+          //       color: "rgb(128, 255, 165)",
+          //     },
+          //     {
+          //       offset: 1,
+          //       color: "rgb(1, 191, 236)",
+          //     },
+          //   ]),
+          // },
+          {
+            opacity: 1,
+            color: "rgb(33,34,35)",
+          },
+        ];
+      }
+    },
+
+    // 处理表格行点击事件
+    handleRowClick(row) {
+      const that = this;
+      const index = row.dataIndex;
+      const totalDataLength = that.chartData[1].data.length;
+
+      // 计算点击点周围的缩放范围
+      let zoomRange = 300; // 可视区域包含的数据点数量
+      // let startIndex = Math.max(index - Math.floor(zoomRange / 2), 0);
+      // let endIndex = Math.min(startIndex + zoomRange, totalDataLength);
+      let startIndex = index - zoomRange / 2 < 0 ? 0 : index - zoomRange / 2;
+      let endIndex =
+        index + zoomRange / 2 > totalDataLength
+          ? totalDataLength
+          : index + zoomRange / 2;
+
+      // 将百分比转换为相对于数据集的百分比
+      let startPercent = parseInt((startIndex / totalDataLength) * 100);
+      let endPercent = parseInt((endIndex / totalDataLength) * 100);
+      return [
+        {
+          // type: "slider",
+          type: "inside",
+          show: false,
+          realtime: true, //拖动时,是否实时更新系列的视图
+          start: startPercent,
+          end: endPercent,
+        },
+      ];
+    },
+  },
+  created() {
+    this.id = "chart-" + util.newGUID();
+    this.changeColor();
+    this.chartData = JSON.parse(JSON.stringify(this.seriesData));
+  },
+  mounted() {
+    this.$el.style.width = this.width;
+    this.$el.style.height = this.height;
+    this.initChart();
+  },
+  updated() {
+    let myChart = echarts.init(document.getElementById(this.id));
+    myChart.dispose();
+    this.$nextTick(() => {
+      this.initChart(this.markItem);
+    });
+  },
+  unmounted() {
+    this.markItem = {};
+    window.removeEventListener("resize", this.resize);
+  },
+
+  watch: {
+    "$store.state.theme"() {
+      this.changeColor();
+      this.initChart(this.markItem);
+    },
+    seriesData(data) {
+      this.chartData = JSON.parse(JSON.stringify(this.seriesData));
+    },
+  },
+};
+</script>
+
+<style lang="less">
+.chart {
+  width: 100%;
+  height: 100%;
+  display: inline-block;
+}
+</style>

Різницю між файлами не показано, бо вона завелика
+ 3895 - 0
src/views/economicsOperation/stationAnalyse/fjglfsAnalysis/components/data.json


+ 133 - 0
src/views/economicsOperation/stationAnalyse/fjglfsAnalysis/components/search.vue

@@ -0,0 +1,133 @@
+<template>
+  <div class="seach">
+    <el-form class="generat-seach" :inline="true" :model="queryForm">
+      <el-form-item label="场站" class="!mb-0">
+        <el-select
+          style="width: 120px"
+          v-model="queryForm.station"
+          class="w-[150px]"
+          @change="getWtList"
+        >
+          <el-option
+            v-for="item in stationList"
+            :key="item.id"
+            :label="item.title"
+            :value="item.id"
+          >
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="风机" class="!mb-0">
+        <el-select
+          style="width: 120px"
+          v-model="queryForm.wt"
+          class="w-[150px]"
+          multiple
+        >
+          <el-option
+            v-for="item in wtList"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id"
+          >
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="开始时间" class="!mb-0">
+        <el-date-picker
+          type="date"
+          class="!w-[150px]"
+          v-model="queryForm.st"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item label="结束时间" class="!mb-0">
+        <el-date-picker
+          type="date"
+          class="!w-[150px]"
+          v-model="queryForm.et"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item label="等间隔" class="!mb-0">
+        <el-radio-group v-model="queryForm.interval">
+          <el-radio :label="1">一秒钟</el-radio>
+          <el-radio :label="2">一分钟</el-radio>
+          <el-radio :label="3">十分钟</el-radio>
+          <el-radio :label="4">十五分钟</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item class="!mb-0">
+        <el-button type="primary" @click="funSubmit">执行</el-button>
+      </el-form-item>
+    </el-form>
+  </div>
+</template>
+<script setup name="search">
+import { onMounted, reactive, ref } from "vue";
+import httpRequest from "@/utils/request.js";
+import SubmitBtn from "@/components/generatingCapacityComponent/SubmitBtn.vue";
+// import configStationJson from './configStation.json'
+
+const queryForm = reactive({
+  station: "",
+  wt: [],
+  st: Date.now() - 10 * 24 * 60 * 60 * 1000,
+  et: Date.now(),
+  interval: 3,
+});
+/**场站 */
+const stationList = ref([]);
+const wtList = ref([]);
+const funGetStation = async () => {
+  const res = await httpRequest.get("/agc/config");
+  // stationList.value = Object.values(configStationJson) // configStationJson
+  stationList.value = Object.values(res);
+  if (stationList.value.length) {
+    queryForm.station = stationList.value[0].id;
+  }
+
+  getWtList();
+};
+const getWtList = async () => {
+  const res = await httpRequest.get("/base/windturbine", {
+    wpids: queryForm.station,
+  });
+  wtList.value = Object.values(res);
+  if (wtList.value.length) {
+    let wt = [];
+    wtList.value.forEach((item) => {
+      wt.push(item.id);
+    });
+    queryForm.wt = wt;
+  }
+
+  funSubmit();
+};
+/**导出 */
+const emits = defineEmits(["submit"]);
+const funSubmit = async () => {
+  const startDate = new Date(queryForm.st).setHours(0, 0, 0, 0);
+  const endDate = new Date(queryForm.et).setHours(0, 0, 0, 0);
+  const query = {
+    id: queryForm.station,
+    startTs: new Date(startDate).getTime(),
+    endTs: new Date(endDate).getTime(),
+    interval: queryForm.interval,
+  };
+  switch (queryForm.interval) {
+    case 2:
+      query.interval = 60;
+      break;
+    case 3:
+      query.interval = 600;
+      break;
+    case 4:
+      query.interval = 900;
+      break;
+  }
+  emits("submit", query);
+};
+/**created */
+onMounted(() => {
+  funGetStation();
+});
+</script>

Різницю між файлами не показано, бо вона завелика
+ 1 - 0
src/views/economicsOperation/stationAnalyse/fjglfsAnalysis/components/submitRES.json


+ 88 - 0
src/views/economicsOperation/stationAnalyse/fjglfsAnalysis/components/table.vue

@@ -0,0 +1,88 @@
+<script setup name="table">
+import {outExportExcel} from '@/utils/exportExcel.js'
+import {ref, computed} from 'vue'
+const props = defineProps({
+  height: {
+    type: String,
+    default: '800px'
+  },
+  data: {
+    type: Array,
+    default: () => ([]),
+  },
+  column: {
+    type: Array,
+    default: () => ([]),
+  },
+  tableName: {
+    type: String,
+    default: '',
+  },
+  tableId: {
+    type: String,
+    default: '',
+  },
+  loading: {
+    type: Boolean,
+    default: false,
+  },
+  showSummary:{
+    type: Boolean,
+    default: false,
+  },
+  summaryMethod: {
+    type: Function,
+    default: () => () => {}
+  }
+})
+const emits = defineEmits(['export'])
+const funExport = () => {
+  const columns = props.column.map(o => {
+    return {
+      ...o,
+      property: o.prop
+    }
+  })
+  let summary = []
+  const summaryObj = {}
+  const tHeader = []
+  const tHeaderKeys = []
+  const tableData = []
+  if(props.showSummary && props.summaryMethod){
+    summary = props.summaryMethod({columns,data: props.data})
+  }
+  for(const key in props.column){
+    tHeader.push(props.column[key].label)
+    tHeaderKeys.push(props.column[key].prop)
+    if(props.showSummary && props.summaryMethod){
+      summaryObj[props.column[key].prop] = summary[key] 
+    }
+  }
+  const exportName = props.tableName
+  tableData.push(...props.data)
+  if(props.showSummary && props.summaryMethod){
+    tableData.push(summaryObj)
+  }
+  outExportExcel(tHeader,tHeaderKeys,tableData,exportName)
+}
+const tableRef = ref('')
+const tableHeight =  computed(() => {
+  return tableRef.value.offsetHeight? tableRef.value.offsetHeight - 46 : 705
+})
+</script>
+<template>
+  <div ref="tableRef" class="p-[10px]"
+    :style="{ height: typeof props.height === 'string' ? props.height : props.height + 'px' }">
+    <div class="flex justify-between items-center pb-[10px]">
+      <h3>{{props.tableName}}</h3>
+      <el-button size="small" type="primary" @click="funExport" :disabled="!props.tableId">数据导出</el-button>
+    </div>
+    <el-table :data="props.data"
+      stripe
+      size="small" v-loading="props.loading"
+      :max-height="tableHeight"
+      :style="{ width: '100%'}">
+      <el-table-column align="center" show-overflow-tooltip v-for="item in props.column" :prop="item.prop" :label="item.label" sortable resizable :min-width="item.width? item.width : 80" />
+    </el-table>
+  </div>
+</template>

+ 788 - 0
src/views/economicsOperation/stationAnalyse/fjglfsAnalysis/index.vue

@@ -0,0 +1,788 @@
+<template>
+    <div class="dataAnalysisAgcAna" :class="!theme ? 'themeDark' : 'themeLight'">
+        <div class="dataAnalysisAgcAnaMain">
+            <div class="main_top">
+                <p class="topPsty">风机功率风速分析</p>
+                <search-cop @submit="funSubmit"> </search-cop>
+            </div>
+            <div class="main">
+                <div class="tableDataMain">
+                    <el-tabs v-model="activeTab" style="width: 100%">
+                        <el-tab-pane label="图表展示" name="2">
+                            <div :style="{
+                  height:
+                    typeof tableHeight === 'string'
+                      ? 'calc(' + tableHeight + ' + ' + paginationHeight + 'px)'
+                      : tableHeight + paginationHeight + 'px',
+                  width: '100%',
+                }" class="p-[10px]">
+                                <CurrentScatterChart ref="chartRef" :width="tableWidth"
+                                    :height="`calc( ${tableHeight} + ${paginationHeight}px - 20px)`" :chartTitle="''"
+                                    :xAxisData="xAxisData" :yAxisData="{ splitLine: { show: false } }"
+                                    :seriesData="seriesData" :showLegend="true" :brushSelected="false"
+                                    :dataSet="dataSet" @getSelected="funChartSelect" />
+                            </div>
+                        </el-tab-pane>
+                        <el-tab-pane :label="`表格数据${
+                tableData?.length ? ' (' + tableData.length + '个)' : ''
+              }`" name="1">
+                            <table-cop :data="tableData" :loading="tableLoading" :column="tableColumn"
+                                :height="tableHeight" :tableId="tableShowId" :tableName="tableName" fromTableId="7"
+                                :showHj="false" style="position: relative; top: -10px">
+                            </table-cop>
+                            <el-pagination layout="prev, pager, next" :total="50" />
+                        </el-tab-pane>
+                        <el-tab-pane :label="`超限测点 (${abnormalPoint.length}个)`" name="3">
+                            <el-table :data="abnormalPoint" style="width: 100%" :max-height="tableHeight">
+                                <el-table-column prop="date" label="时间" width="180" align="center" />
+                                <el-table-column filter-class-name="currentFilter" prop="name" label="超限原因 (点击定位至图表位置)"
+                                    width="400" align="center" :filters="[
+                    { text: '低于下限', value: '低于下限' },
+                    { text: '高于上限', value: '高于上限' },
+                  ]" :filter-method="tableFilterMethod">
+                                    <template #default="scoped">
+                                        <p style="cursor: pointer" @click="createMark(scoped.row)">
+                                            <span :style="`color:${scoped.row.color}; margin-right: 8px;`">
+                                                {{ scoped.row.res }}
+                                            </span>
+                                            <el-icon>
+                                                <component :is="scoped.row.icon" :color="scoped.row.color" />
+                                            </el-icon>
+                                        </p>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column prop="value" label="测点值" width="180" align="center" />
+                                <el-table-column prop="jud" label="限值" width="180" align="center" />
+                            </el-table>
+                            <!-- <el-pagination
+                layout="total, sizes, prev, pager, next, jumper"
+                v-model:current-page="paginationCurrentPage"
+                v-model:page-size="paginationPageSize"
+                :total="paginationTotal"
+                :page-sizes="[50, 100, 200, 500, 1000]"
+                @size-change="paginationSizeChange"
+                @current-change="paginationCurrentChange"
+              /> -->
+                        </el-tab-pane>
+                    </el-tabs>
+                </div>
+            </div>
+        </div>
+    </div>
+</template>
+<script setup name="prepare">
+    import searchCop from "./components/search.vue";
+    import tableCop from "@/components/generatingCapacityComponent/table.vue";
+    import {
+        ElMessage
+    } from "element-plus";
+    import {
+        onMounted,
+        ref,
+        onActivated,
+        watch
+    } from "vue";
+    import {
+        useStore
+    } from "vuex";
+    import CurrentScatterChart from "./components/current-scatter-chart.vue";
+    import httpRequest from "@/utils/request.js";
+    import dayjs from "dayjs";
+    import agcJson from "./agcJson.json";
+    import * as echarts from "echarts";
+    import jsonData from "./components/data.json";
+
+    const tableDataSource = ref([]);
+    const paginationCurrentPage = ref(1);
+    const paginationPageSize = ref(100);
+    const paginationTotal = ref(0);
+
+    const paginationSizeChange = (size) => {};
+
+    const paginationCurrentChange = (page) => {};
+
+    const tableFilterMethod = (value, row) => {
+        return row.res === value;
+    };
+
+    /**配置参数 */
+    const paginationHeight = ref(10);
+    const tableWidth = ref(window.innerWidth - 200 + "px");
+    const tableHeight = ref(
+        window.innerHeight - 170 - paginationHeight.value + "px"
+    );
+    const treeHeight = ref(window.innerHeight - 170 + "px"); //tree高度
+    const excelHeight = ref(window.innerHeight - 170 + "px"); //excel高度
+    /**excel 开始 */
+    const excelList = ref([]);
+    const funExcelChange = async (obj) => {
+        //点击excel项时
+        activeTab.value = "1";
+        tableShowId.value = obj.id;
+        tableName.value = obj.name;
+        tableLoading.value = true;
+        const res = await httpRequest.get("/power/prepare/show", {
+            params: {
+                id: obj.id,
+            },
+        });
+        if (res.code === 200) {
+            tableColumn.value = res.data.title.map((o) => {
+                return {
+                    prop: o.key,
+                    label: o.des,
+                    width: o.des === "时间" ? 100 : 80,
+                };
+            });
+            tableData.value = res.data.data;
+            tableLoading.value = false;
+        } else {
+            tableLoading.value = false;
+        }
+    };
+    /**tree 开始 */
+    const treeData = ref([]);
+    const funRepeatMap = (arr) => {
+        return arr.map((o) => {
+            if (o.children) {
+                const findIndex = o.children.findIndex((p) => !!p.type);
+                if (findIndex !== -1) {
+                    o.childs = o.children;
+                    o.children = [];
+                }
+            }
+            return {
+                ...o,
+                children: o.children.length ? funRepeatMap(o.children) : [],
+            };
+        });
+    };
+    const funGetTree = async () => {
+        const res = await httpRequest.get("/power/prepare/tree");
+        treeData.value = funRepeatMap(res.data);
+        excelList.value = [];
+    };
+    const funCurrentChange = ({
+        current,
+        currentNode
+    }) => {
+        if (current.childs) {
+            excelList.value = current.childs.map((o) => {
+                return {
+                    id: o.id,
+                    interval: o.interval,
+                    path: o.path,
+                    prepareid: o.prepareid,
+                    station: o.station,
+                    time: o.time,
+                    type: o.type,
+                    windturbine: o.windturbine,
+                    name: o.path.substring(
+                        o.path.indexOf(o.station + "_") + (o.station + "_").length
+                    ),
+                };
+            });
+        } else {
+            excelList.value = [];
+        }
+    };
+    /**table 开始 */
+    const tableShowId = ref("");
+    const tableName = ref("");
+    const tableColumn = ref([]);
+    const tableLoading = ref(false);
+    const tableData = ref([]);
+    /**tab  */
+    const activeTab = ref("1");
+    /**chart Data */
+    const xAxisData = ref([]);
+    const chartRef = ref(); //chart 的ref
+    const seriesData = ref([]);
+    const dataSet = ref("");
+    const funChartSelect = async (batch) => {
+        return false;
+    };
+
+    const createMark = (markInfo) => {
+        activeTab.value = "2";
+        chartRef.value.initChart(markInfo);
+    };
+    /**submit */
+    const funSubmit = (params) => {
+        activeTab.value = "2";
+        tableShowId.value = "";
+        tableName.value = "AGC";
+        tableLoading.value = true;
+        httpRequest
+            .get("/agc/deviate", {
+                params: params,
+            })
+            .then((res) => {
+                // const res = agcJson
+                tableColumn.value = [{
+                        prop: "ts",
+                        label: "时间",
+                        width: 100,
+                    },
+                    {
+                        prop: "ygsdxz",
+                        label: "有功设定限值",
+                        width: 80,
+                    },
+                    {
+                        prop: "sfyg",
+                        label: "实发有功",
+                        width: 80,
+                    },
+                    {
+                        prop: "cz",
+                        label: "差值",
+                        width: 80,
+                    },
+                    {
+                        prop: "llgl",
+                        label: "理论功率",
+                        width: 80,
+                    },
+                    {
+                        prop: "pcsx",
+                        label: "偏差上限",
+                        width: 80,
+                    },
+                    {
+                        prop: "pcxx",
+                        label: "偏差下限",
+                        width: 100,
+                    },
+                ];
+                const tableArr = [];
+                const tsArr = [];
+                const ygsdxz = [];
+                const sfyg = [];
+                const llgl = [];
+                const pcsx = [];
+                const pcxx = [];
+                res["有功设定限值"].values.map((o, index) => {
+                    tsArr.push(dayjs(o.ts).format("YYYY-MM-DD HH:mm:ss"));
+                    ygsdxz.push(Number(o.value).toFixed(2));
+                    if (res["实发有功"].values.length > 0) {
+                        sfyg.push(Number(res["实发有功"].values[index].value).toFixed(2));
+                    }
+                    if (res["理论功率"].values.length > 0) {
+                        llgl.push(Number(res["理论功率"].values[index].value).toFixed(2));
+                    }
+                    if (res["偏差上限"].values.length > 0) {
+                        pcsx.push(Number(res["偏差上限"].values[index].value).toFixed(2));
+                    }
+                    if (res["偏差下限"].values.length > 0) {
+                        pcxx.push(Number(res["偏差下限"].values[index].value).toFixed(2));
+                    }
+                    tableArr.push({
+                        ts: dayjs(o.ts).format("YYYY-MM-DD HH:mm:ss"),
+                        ygsdxz: Number(o.value).toFixed(2),
+                        sfyg: res["实发有功"].values.length > 0 ?
+                            Number(res["实发有功"].values[index].value).toFixed(2) : "-",
+                        llgl: res["理论功率"].values.length > 0 ?
+                            Number(res["理论功率"].values[index].value).toFixed(2) : "-",
+                        pcsx: res["偏差上限"].values.length > 0 ?
+                            Number(res["偏差上限"].values[index].value).toFixed(2) : "-",
+                        pcxx: res["偏差下限"].values.length > 0 ?
+                            Number(res["偏差下限"].values[index].value).toFixed(2) : "-",
+                        cz: res["有功设定限值"].values.length && res["实发有功"].values.length ?
+                            (
+                                Number(res["有功设定限值"].values[index].value) -
+                                Number(res["实发有功"].values[index].value)
+                            ).toFixed(2) : "-",
+                    });
+                });
+                xAxisData.value = tableArr.map((o) => o.ts);
+                seriesData.value = [{
+                        name: "有功设定限值",
+                        type: "line",
+                        symbol: "line", //设定为实心点
+                        symbolSize: 0, //设定实心点的大小
+                        smooth: false, //这个是把线变成曲线
+                        data: ygsdxz,
+                        xAxisIndex: 0,
+                        lineStyle: {
+                            color: "#67c23a"
+                        },
+                        large: true,
+                    },
+                    {
+                        name: "实发有功",
+                        type: "line",
+                        symbol: "line", //设定为实心点
+                        symbolSize: 0, //设定实心点的大小
+                        smooth: false, //这个是把线变成曲线
+                        data: sfyg,
+                        xAxisIndex: 0,
+                        lineStyle: {
+                            color: "rgb(242.5, 208.5, 157.5)"
+                        },
+                        large: true,
+                        markPoint: {
+                            symbolSize: 36,
+                            itemStyle: {
+                                color: "#f60", // 特殊颜色
+                            },
+                            emphasis: {
+                                itemStyle: {
+                                    color: "#fff",
+                                },
+                            },
+                            blur: {
+                                itemStyle: {
+                                    opacity: 1,
+                                },
+                            },
+                            data: [],
+                        },
+                    },
+                    {
+                        name: "理论功率",
+                        type: "line",
+                        symbol: "line", //设定为实心点
+                        symbolSize: 0, //设定实心点的大小
+                        smooth: false, //这个是把线变成曲线
+                        data: llgl,
+                        xAxisIndex: 0,
+                        lineStyle: {
+                            color: "#f56c6c"
+                        },
+                        large: true,
+                    },
+                    {
+                        name: "偏差上限",
+                        type: "line",
+                        symbol: "line", //设定为实心点
+                        symbolSize: 0, //设定实心点的大小
+                        smooth: false, //这个是把线变成曲线
+                        data: pcsx,
+                        xAxisIndex: 0,
+                        lineStyle: {
+                            color: "#64b5f6",
+                            opacity: 0
+                        },
+                        symbol: "none",
+                        large: true,
+                    },
+                    {
+                        name: "偏差下限",
+                        type: "line",
+                        symbol: "line", //设定为实心点
+                        symbolSize: 0, //设定实心点的大小
+                        smooth: false, //这个是把线变成曲线
+                        data: pcxx,
+                        xAxisIndex: 0,
+                        lineStyle: {
+                            color: "#ffb74d",
+                            opacity: 0
+                        },
+                        symbol: "none",
+                        large: true,
+                    },
+                ];
+                tableData.value = tableArr;
+                tableLoading.value = false;
+                tableShowId.value = "1";
+
+                let abnormalPointTemp = [];
+                seriesData.value[1].data.forEach((ele, index) => {
+                    if (
+                        parseFloat(seriesData.value[2].data[index]) >
+                        parseFloat(seriesData.value[0].data[index])
+                    ) {
+                        if (parseFloat(ele) > parseFloat(seriesData.value[3].data[index])) {
+                            abnormalPointTemp.push({
+                                date: tsArr[index],
+                                value: parseFloat(ele),
+                                jud: seriesData.value[3].data[index],
+                                res: "高于上限",
+                                color: "#f25656",
+                                icon: "Top",
+                                dataIndex: index,
+                            });
+                        } else if (
+                            parseFloat(ele) < parseFloat(seriesData.value[4].data[index])
+                        ) {
+                            abnormalPointTemp.push({
+                                date: tsArr[index],
+                                value: parseFloat(ele),
+                                jud: seriesData.value[4].data[index],
+                                res: "低于下限",
+                                color: "#1890ff",
+                                icon: "Bottom",
+                                dataIndex: index,
+                            });
+                        }
+                    }
+                });
+                abnormalPoint.value = abnormalPointTemp;
+            })
+            .catch(() => {
+                initPageData();
+            });
+
+        // if (res.code === 200) {
+        // if(res.data.sjgl?.length){
+        // 	for(const wtObj of res.data.sjgl){
+        // 		seriesData.value.push(
+        // 			{
+        // 				name: wtObj.obj.windturbine + "\n实际功率",
+        // 				type: "line",
+        // 				symbol: "line", //设定为实心点
+        // 				symbolSize: 0, //设定实心点的大小
+        // 				smooth: true, //这个是把线变成曲线
+        // 				data: wtObj.sjgl || [],
+        // 				xAxisIndex: 0,
+        // 			},
+        // 		)
+        // 		wtData.value.push(wtObj.obj)
+        // 	}
+        // }
+        // }
+    };
+    /**created */
+    // funGetTree()
+    const theme = ref(null);
+    const echartsTheme = ref("");
+    const store = useStore();
+    watch(
+        () => store.state.theme,
+        (newVal, oldVal) => {
+            theme.value = newVal;
+            echartsTheme.value = !newVal ? "dark" : "";
+            // funSubmit();
+        }, {
+            deep: true,
+        }
+    );
+    const abnormalPoint = ref([]);
+    const initPageData = () => {
+        activeTab.value = "2";
+        tableShowId.value = "";
+        tableName.value = "AGC";
+        tableLoading.value = true;
+        const res = JSON.parse(JSON.stringify(jsonData.deviateData));
+        // const res = agcJson
+        tableColumn.value = [{
+                prop: "ts",
+                label: "时间",
+                width: 100,
+            },
+            {
+                prop: "ygsdxz",
+                label: "有功设定限值",
+                width: 80,
+            },
+            {
+                prop: "sfyg",
+                label: "实发有功",
+                width: 80,
+            },
+            {
+                prop: "llgl",
+                label: "理论功率",
+                width: 80,
+            },
+            {
+                prop: "pcsx",
+                label: "偏差上限",
+                width: 80,
+            },
+            {
+                prop: "pcxx",
+                label: "偏差下限",
+                width: 100,
+            },
+        ];
+        const tableArr = [];
+        const tsArr = [];
+        const ygsdxz = [];
+        const sfyg = [];
+        const llgl = [];
+        const pcsx = [];
+        const pcxx = [];
+        res["有功设定限值"].values.map((o, index) => {
+            tsArr.push(dayjs(o.ts).format("YYYY-MM-DD HH:mm:ss"));
+            ygsdxz.push(Number(o.value).toFixed(2));
+            if (res["实发有功"].values.length > 0) {
+                sfyg.push(Number(res["实发有功"].values[index].value).toFixed(2));
+            }
+            if (res["理论功率"].values.length > 0) {
+                llgl.push(Number(res["理论功率"].values[index].value).toFixed(2));
+            }
+            if (res["偏差上限"].values.length > 0) {
+                pcsx.push(Number(res["偏差上限"].values[index].value).toFixed(2));
+            }
+            if (res["偏差下限"].values.length > 0) {
+                pcxx.push(Number(res["偏差下限"].values[index].value).toFixed(2));
+            }
+            tableArr.push({
+                ts: dayjs(o.ts).format("YYYY-MM-DD HH:mm:ss"),
+                ygsdxz: Number(o.value).toFixed(2),
+                sfyg: res["实发有功"].values.length > 0 ?
+                    Number(res["实发有功"].values[index].value).toFixed(2) : "-",
+                llgl: res["理论功率"].values.length > 0 ?
+                    Number(res["理论功率"].values[index].value).toFixed(2) : "-",
+                pcsx: res["偏差上限"].values.length > 0 ?
+                    Number(res["偏差上限"].values[index].value).toFixed(2) : "-",
+                pcxx: res["偏差下限"].values.length > 0 ?
+                    Number(res["偏差下限"].values[index].value).toFixed(2) : "-",
+            });
+        });
+        xAxisData.value = tableArr.map((o) => o.ts);
+        seriesData.value = [{
+                name: "有功设定限值",
+                type: "line",
+                symbol: "line", //设定为实心点
+                symbolSize: 0, //设定实心点的大小
+                smooth: false, //这个是把线变成曲线
+                data: ygsdxz,
+                xAxisIndex: 0,
+                lineStyle: {
+                    color: "#67c23a"
+                },
+                large: true,
+            },
+            {
+                name: "实发有功",
+                type: "line",
+                symbol: "line", //设定为实心点
+                symbolSize: 0, //设定实心点的大小
+                smooth: false, //这个是把线变成曲线
+                data: sfyg,
+                xAxisIndex: 0,
+                lineStyle: {
+                    color: "rgb(242.5, 208.5, 157.5)"
+                },
+                large: true,
+                markPoint: {
+                    symbolSize: 36,
+                    itemStyle: {
+                        color: "#f60", // 特殊颜色
+                    },
+                    emphasis: {
+                        itemStyle: {
+                            color: "#fff",
+                        },
+                    },
+                    blur: {
+                        itemStyle: {
+                            opacity: 1,
+                        },
+                    },
+                    data: [],
+                },
+            },
+            {
+                name: "理论功率",
+                type: "line",
+                symbol: "line", //设定为实心点
+                symbolSize: 0, //设定实心点的大小
+                smooth: false, //这个是把线变成曲线
+                data: llgl,
+                xAxisIndex: 0,
+                lineStyle: {
+                    color: "#f56c6c"
+                },
+                large: true,
+            },
+            {
+                name: "偏差上限",
+                type: "line",
+                symbol: "line", //设定为实心点
+                symbolSize: 0, //设定实心点的大小
+                smooth: false, //这个是把线变成曲线
+                data: pcsx,
+                xAxisIndex: 0,
+                lineStyle: {
+                    color: "#64b5f6",
+                    opacity: 0
+                },
+                symbol: "none",
+                large: true,
+            },
+            {
+                name: "偏差下限",
+                type: "line",
+                symbol: "line", //设定为实心点
+                symbolSize: 0, //设定实心点的大小
+                smooth: false, //这个是把线变成曲线
+                data: pcxx,
+                xAxisIndex: 0,
+                lineStyle: {
+                    color: "#ffb74d",
+                    opacity: 0
+                },
+                symbol: "none",
+                large: true,
+            },
+        ];
+        tableData.value = tableArr;
+        tableLoading.value = false;
+        tableShowId.value = "1";
+
+        let abnormalPointTemp = [];
+        seriesData.value[1].data.forEach((ele, index) => {
+            if (parseFloat(ele) > parseFloat(seriesData.value[3].data[index])) {
+                abnormalPointTemp.push({
+                    date: tsArr[index],
+                    value: parseFloat(ele),
+                    jud: seriesData.value[3].data[index],
+                    res: "高于上限",
+                    color: "#f25656",
+                    icon: "Top",
+                    dataIndex: index,
+                });
+            } else if (parseFloat(ele) < parseFloat(seriesData.value[4].data[index])) {
+                abnormalPointTemp.push({
+                    date: tsArr[index],
+                    value: parseFloat(ele),
+                    jud: seriesData.value[4].data[index],
+                    res: "低于下限",
+                    color: "#1890ff",
+                    icon: "Bottom",
+                    dataIndex: index,
+                });
+            }
+        });
+        abnormalPoint.value = abnormalPointTemp;
+    };
+
+    /**mounted */
+    onMounted(() => {
+        // funSubmit();
+        theme.value = store.state.theme;
+        echartsTheme.value = !theme.value ? "dark" : "";
+        tableWidth.value = "100%";
+        tableHeight.value = window.innerHeight - 170 - paginationHeight.value + "px";
+        excelHeight.value = window.innerHeight - 170 + "px";
+        treeHeight.value = window.innerHeight - 170 + "px";
+        window.addEventListener("resize", () => {
+            tableWidth.value = "100%";
+            tableHeight.value =
+                window.innerHeight - 170 - paginationHeight.value + "px";
+            excelHeight.value = window.innerHeight - 170 + "px";
+            treeHeight.value = window.innerHeight - 170 + "px";
+        });
+    });
+    /**activated */
+    onActivated(() => {
+        // funGetTree()
+        // funSubmit()
+    });
+</script>
+<style lang="less" scoped>
+    .dataAnalysisAgcAna {
+        height: 100%;
+
+        .dataAnalysisAgcAnaMain {
+            height: 100%;
+
+            .main_top {
+                height: 40px;
+                display: flex;
+                align-items: center;
+
+                .topPsty {
+                    position: relative;
+                    top: 5px;
+                    padding: 7px 20px;
+                    font-size: 12px;
+                    font-weight: 600;
+                    margin-left: 10px;
+                    border-radius: 3px;
+                }
+
+                .seach {
+                    padding: 20px 0 0 20px;
+                }
+            }
+
+            .main {
+                display: flex;
+                justify-content: space-between;
+                // width: calc(100% - 40px);
+                width: 100%;
+
+                .tableDataMain {
+                    padding: 10px;
+                    border-radius: 10px;
+                    width: calc(100% - 20px);
+                    position: relative;
+
+                    .el-tabs__content,
+                    .el-tab-pane {
+                        width: 100%;
+                    }
+
+                    .butten_com {
+                        position: absolute;
+                        right: 20px;
+                        z-index: 111111;
+                    }
+                }
+            }
+        }
+    }
+
+    .themeDark {
+        .dataAnalysisAgcAnaMain {
+            .main_top {
+                .topPsty {
+                    color: #1c99ff;
+                    background: #1e2126;
+                }
+            }
+
+            .main {
+                background: #13171e;
+
+                .treeDataMain {
+                    background: transparent;
+                }
+
+                .excelDataMain {
+                    background: #313233;
+                }
+
+                .tableDataMain {
+                    margin-top: 5px;
+                    background: #212223;
+                }
+            }
+        }
+    }
+
+    .themeLight {
+        padding: 0;
+
+        .dataAnalysisAgcAnaMain {
+            .main_top {
+                .topPsty {
+                    color: #2778ff;
+                    background: #ffffff;
+                }
+            }
+
+            .main {
+                background: #e6e8f2;
+
+                .treeDataMain {
+                    background: transparent;
+                }
+
+                .excelDataMain {
+                    background: #f4f6fb;
+                }
+
+                .tableDataMain {
+                    background: #fff;
+                    margin-top: 5px;
+                }
+            }
+        }
+    }
+</style>