Browse Source

2023-03-07 update

1. 新增毛容量分析页
2. lineAnalysis 增加额定功率图表
3. 注释console.log  以提升性能
moccus 2 years ago
parent
commit
e348927cec
29 changed files with 1783 additions and 101 deletions
  1. 0 2
      src/App.vue
  2. 0 3
      src/assets/excel/Export2Excel.js
  3. 0 1
      src/components/Header.vue
  4. 1 1
      src/components/chart/combination/area-line-chart.vue
  5. 1 1
      src/components/chart/line/multiple-y-line-chart-normal.vue
  6. 1 1
      src/components/chart/line/multiple-y-line-chart.vue
  7. 2 2
      src/components/tree.vue
  8. 2 2
      src/components/vpro-materials/vpro-table/vProTable.vue
  9. 1 1
      src/pages/dataAnalysis/agcAnalysis/components/current-scatter-chart.vue
  10. 2 2
      src/pages/dataAnalysis/combine/components/current-scatter-chart.vue
  11. 2 2
      src/pages/dataAnalysis/hotAnalysis/components/current-scatter-chart.vue
  12. 1 1
      src/pages/dataAnalysis/hotAnalysis/index.vue
  13. 2 2
      src/pages/dataAnalysis/lineAnalysis/components/current-scatter-chart.vue
  14. 163 58
      src/pages/dataAnalysis/lineAnalysis/index.vue
  15. 1 1
      src/pages/dataAnalysis/rateAnalysis/components/scatterSingleChart.vue
  16. 1 1
      src/pages/dataAnalysis/rateAnalysis/index.vue
  17. 397 0
      src/pages/dataAnalysis/spaceAnalysis/components/barChart.json
  18. 199 0
      src/pages/dataAnalysis/spaceAnalysis/components/barChart.vue
  19. 29 0
      src/pages/dataAnalysis/spaceAnalysis/components/search.vue
  20. 565 0
      src/pages/dataAnalysis/spaceAnalysis/index.vue
  21. 393 0
      src/pages/dataAnalysis/spaceAnalysis/rateAnalysis.json
  22. 1 1
      src/pages/dataAnalysis/tempAnalysis/index.vue
  23. 1 1
      src/pages/lightAnalysis/glAnalysis/components/current-scatter-chart.vue
  24. 1 1
      src/pages/lightAnalysis/glAnalysis/index.vue
  25. 2 2
      src/pages/lightAnalysis/glHotAnalysis/components/current-scatter-chart.vue
  26. 12 12
      src/router/index.js
  27. 1 1
      src/tools/htmlToPdf.js
  28. 1 1
      src/tools/js-xlsx.js
  29. 1 1
      src/websocket/index.js

+ 0 - 2
src/App.vue

@@ -21,7 +21,6 @@ sessionStorage.setItem("identity", res.data.identity);
 // const pointX = 0.01
 // const pointY = 0.1
 // const dotRes = []
-// console.log('dotList', dotList)
 // for (const dotValue of dotList) {
 //   const xPage = Math.floor((dotValue.s) / pointX)
 //   const minX = xPage * pointX
@@ -48,7 +47,6 @@ sessionStorage.setItem("identity", res.data.identity);
 //     })
 //   }
 // }
-// console.log(dotRes)
 </script>
 
 <style>

+ 0 - 3
src/assets/excel/Export2Excel.js

@@ -93,14 +93,12 @@ function s2ab(s) {
 
 export function export_table_to_excel(id) {
     var theTable = document.getElementById(id);
-    console.log('a')
     var oo = generateArray(theTable);
     var ranges = oo[1];
 
     /* original data */
     var data = oo[0];
     var ws_name = "SheetJS";
-    console.log(data);
 
     var wb = new Workbook(),
         ws = sheet_from_array_of_arrays(data);
@@ -119,7 +117,6 @@ export function export_table_to_excel(id) {
 }
 
 function formatJson(jsonData) {
-    console.log(jsonData)
 }
 export function export_json_to_excel(th, jsonData, defaultTitle) {
 

+ 0 - 1
src/components/Header.vue

@@ -134,7 +134,6 @@ const submitForm = (formEl) => {
     if (valid) {
       edit();
     } else {
-      console.log("error submit!!");
       return false;
     }
   });

+ 1 - 1
src/components/chart/combination/area-line-chart.vue

@@ -292,7 +292,7 @@ export default {
       );
     },
     initChart () {
-      console.log("units:",this.units)
+      // console.log("units:",this.units)
       let that = this;
       let chart = echarts.init(this.$el);
 

+ 1 - 1
src/components/chart/line/multiple-y-line-chart-normal.vue

@@ -306,7 +306,7 @@ export default {
     xdata() {
       if (this.list.length > 1) {
         // this.list[1].value.forEach((lEle, lIndex) => {
-        //   console.log(
+        //   // console.log(
         //     this.list[1].value.indexOf(
         //       this.list[1].value[lIndex].text == "00:00"
         //     )

+ 1 - 1
src/components/chart/line/multiple-y-line-chart.vue

@@ -239,7 +239,7 @@
                 const chart = echarts.init(this.$el);
 
                 let option = this.option(themeName);
-                console.log(option)
+                // console.log(option)
                 chart.clear();
                 chart.setOption(option);
 

+ 2 - 2
src/components/tree.vue

@@ -204,10 +204,10 @@ const funCommand = async ({ type, data, node }) => {
 };
 
 const getCheckedNodes = () => {
-	console.log(treeRef.value!.getCheckedNodes(false, false));
+	// // console.log(treeRef.value!.getCheckedNodes(false, false));
 };
 const getCheckedKeys = () => {
-	console.log(treeRef.value!.getCheckedKeys(false));
+	// // console.log(treeRef.value!.getCheckedKeys(false));
 };
 const setCheckedNodes = () => {
 	treeRef.value!.setCheckedNodes(

+ 2 - 2
src/components/vpro-materials/vpro-table/vProTable.vue

@@ -496,7 +496,7 @@ export default {
     },
     onCopyError(event, action, row) {
       /** 复制粘贴-失败 **/
-      // console.log('复制失败', event)
+      // // console.log('复制失败', event)
       this.$message.error("复制失败");
       if (action.copyError) {
         action.copyError(event, row);
@@ -504,7 +504,7 @@ export default {
     },
     onCopySuccess(event, action, row) {
       /** 复制粘贴-成功 **/
-      // console.log('复制成功', event)
+      // // console.log('复制成功', event)
       this.$message.success("复制成功");
       if (action.copySuccess) {
         action.copySuccess(event, row);

+ 1 - 1
src/pages/dataAnalysis/agcAnalysis/components/current-scatter-chart.vue

@@ -331,7 +331,7 @@ export default {
     // });
   },
   updated() {
-    console.log('update')
+    // console.log('update')
     let myChart = echarts.init(document.getElementById(this.id));
     myChart.dispose();
     this.$nextTick(() => {

+ 2 - 2
src/pages/dataAnalysis/combine/components/current-scatter-chart.vue

@@ -310,7 +310,7 @@ export default {
       });
       myChart.off('click')
       myChart.on('click', params => {
-          console.log(params)
+          // console.log(params)
           if(params.componentType === 'markArea'){
             myChart.dispatchAction({
               type: 'brush',
@@ -340,7 +340,7 @@ export default {
     // });
   },
   updated() {
-    console.log('update')
+    // console.log('update')
     let myChart = echarts.init(document.getElementById(this.id));
     myChart.dispose();
     this.$nextTick(() => {

+ 2 - 2
src/pages/dataAnalysis/hotAnalysis/components/current-scatter-chart.vue

@@ -329,7 +329,7 @@ export default {
       });
       // myChart.off('click')
       // myChart.on('click', params => {
-      //     console.log(params)
+      //     // console.log(params)
       //     if(params.componentType === 'markArea'){
       //       myChart.dispatchAction({
       //         type: 'brush',
@@ -356,7 +356,7 @@ export default {
     // });
   },
   updated() {
-    console.log('update')
+    // console.log('update')
     let myChart = echarts.init(document.getElementById(this.id));
     myChart.dispose();
     this.$nextTick(() => {

+ 1 - 1
src/pages/dataAnalysis/hotAnalysis/index.vue

@@ -596,7 +596,7 @@ const funActCop = (obj, type) => {
 			break
 		// case 'CurrentScatterChartCop':
 		// 	actChartName.value = 'CurrentScatterChartCop'
-		// 	obj.actCop = shallowRef(CurrentScatte		console.log(res)rChartCop)
+		// 	obj.actCop = shallowRef(CurrentScatte		// console.log(res)rChartCop)
 		// 	actDiaTitle.value = '静态偏航对风分析图'
 		// 	break
 	}

+ 2 - 2
src/pages/dataAnalysis/lineAnalysis/components/current-scatter-chart.vue

@@ -205,7 +205,7 @@ export default {
         legend: {
           show: that.showLegend,
           // data: [ "拟合功率", "保证功率","无用点", "有用点", "Cp值"],
-          right: 170,
+          right: 260,
           type: 'scroll',
           top: "5",
           // icon: "circle",
@@ -334,7 +334,7 @@ export default {
     // });
   },
   updated() {
-    console.log('update')
+    // console.log('update')
     let myChart = echarts.init(document.getElementById(this.id));
     myChart.dispose();
     this.$nextTick(() => {

+ 163 - 58
src/pages/dataAnalysis/lineAnalysis/index.vue

@@ -28,6 +28,7 @@ const funExcelCheckChange = ({ checkArr, data }) => {   //bug
 }
 /**prepare tree 开始 */
 const treeData = ref([])
+const treeCopRef = ref()  //treeCop ref
 const actTreeNode = ref(null) //当前激活的treeNode
 const funRepeatMap = (arr, type='fitting') => {
 	return arr.map(o => {
@@ -48,9 +49,18 @@ const funRepeatMap = (arr, type='fitting') => {
 	})
 }
 const funGetTree = async () => {
+	actTreeNode.value = null
 	const res = await request.get("/power/fitting/tree")
 	treeData.value = funRepeatMap(res.data)
 	excelList.value = []
+	if(actTreeNode.value){
+		funCurrentChange({current: actTreeNode.value, currentNode: null})
+		if(treeCopRef.value){
+			treeCopRef.value.setCheckedKeys([actTreeNode.value.id])
+			excelCheckIds.value = actTreeNode.value.childs.map(o => o.id)
+			funSubmit()
+		}
+	}
 }
 const funCurrentChange = ({ current, currentNode }) => {
 	excelCheckboxShow.value = true
@@ -248,12 +258,80 @@ const funChartArea = () => {
 		}
 	}
 }
+/**tmdialog 数据 */
+const tmDialog = ref(false)
+const barxAxis = reactive({
+	type: 'category',
+	data: [],
+	splitLine: {
+		show: false
+	},
+	axisTick: {
+		show: true
+	}
+})
+const baryAxis = ref({
+		type: 'value',
+		name: '小时',
+		splitLine: {
+		show: false
+	},
+	axisTick: {
+		show: true
+	}
+})
+const barSeries = ref([{
+	name: "不运行",
+	type: "bar",
+	stack: 'a',
+	data: [],
+},{
+	name: "3~5m风速",
+	type: "bar",
+	stack: 'a',
+	data: [],
+},{
+	name: "5~10m风速",
+	type: "bar",
+	stack: 'a',
+	data: [],
+},{
+	name: "10~12m风速",
+	type: "bar",
+	stack: 'a',
+	data: [],
+},{
+	name: "12~25m风速",
+	type: "bar",
+	stack: 'a',
+	data: [],
+}])
+const barUnWorkSeries = ref([{
+	name: "3~5m风速",
+	type: "bar",
+	stack: 'a',
+	data: [],
+},{
+	name: "5~10m风速",
+	type: "bar",
+	stack: 'a',
+	data: [],
+},{
+	name: "10~12m风速",
+	type: "bar",
+	stack: 'a',
+	data: [],
+},{
+	name: "12~25m风速",
+	type: "bar",
+	stack: 'a',
+	data: [],
+}])
 const funTimeArea = async () => {
 	if(seriesData.value?.length){
 		activeTab.value = '1'
 		//获取数据
 		const res = await request.get('/power/fitting/time',{params: {ids: excelCheckIds.value.join(',')}})
-		console.log(res)
 		if(res.code===200){
 			barxAxis.data = []
 			barSeries.value = [{
@@ -316,13 +394,10 @@ const funTimeArea = async () => {
 		}
 	}
 }
-/**dialog 数据 */
-const wtDialog = ref(false)
-const wtData = ref([])
-const activeTab = ref('1')
-/**tmdialog 数据 */
-const tmDialog = ref(false)
-const barxAxis = reactive({
+
+/**额定功率 */
+const powerDialog = ref(false)
+const powerxAxis = reactive({
 	type: 'category',
 	data: [],
 	splitLine: {
@@ -332,63 +407,84 @@ const barxAxis = reactive({
 		show: true
 	}
 })
-const baryAxis = ref({
-		type: 'value',
-		name: '小时',
-		splitLine: {
+const poweryAxis = ref({
+	type: 'value',
+	name: 'kW',
+	max: null,
+	splitLine: {
 		show: false
 	},
 	axisTick: {
 		show: true
 	}
 })
-const barSeries = ref([{
-	name: "不运行",
-	type: "bar",
-	stack: 'a',
-	data: [],
-},{
-	name: "3~5m风速",
-	type: "bar",
-	stack: 'a',
-	data: [],
-},{
-	name: "5~10m风速",
+const powerSeries = ref([{
+	name: "平均全功率",
 	type: "bar",
-	stack: 'a',
-	data: [],
-},{
-	name: "10~12m风速",
-	type: "bar",
-	stack: 'a',
-	data: [],
-},{
-	name: "12~25m风速",
-	type: "bar",
-	stack: 'a',
-	data: [],
-}])
-const barUnWorkSeries = ref([{
-	name: "3~5m风速",
-	type: "bar",
-	stack: 'a',
-	data: [],
-},{
-	name: "5~10m风速",
-	type: "bar",
-	stack: 'a',
-	data: [],
-},{
-	name: "10~12m风速",
-	type: "bar",
-	stack: 'a',
-	data: [],
-},{
-	name: "12~25m风速",
-	type: "bar",
-	stack: 'a',
 	data: [],
+	markLine: {}
 }])
+const funPower = async () => {
+	if(seriesData.value?.length){
+		//获取数据
+		const res = await request.get('/rated/power',{params: {ids: excelCheckIds.value.join(',')}})
+		if(res.code===200){
+			powerxAxis.data = []
+			powerSeries.value = [{
+				name: "平均全功率",
+				type: "bar",
+				data: [],
+				markLine: {
+					symbol: 'none',
+					label: {
+						show: true
+					},
+					lineStyle: {
+						color: 'rgba(96,174,255, 1)'
+					},
+					data: [],
+				}
+			}]
+			if(res.data.data){
+				powerxAxis.data = Object.keys(res.data.data)
+				const seriesArr = Object.values(res.data.data)
+				powerSeries.value[0].data = seriesArr.map(o => {
+					return {
+						value: o,
+						itemStyle: {
+							color: o < res.data.avg ? 'rgb(197,78,82)' : 'rgb(50,93,171)'
+						}
+					}
+				})
+				let maxValue = Math.max(...seriesArr)
+				if(res.data.power > maxValue){
+					maxValue = res.data.power
+				}else{
+					maxValue = null
+				}
+				poweryAxis.value.max = maxValue
+				powerSeries.value[0].markLine.data = [{
+					yAxis: res.data.avg,
+					name: `平均额定功率${res.data.avg}`,
+					lineStyle: {
+						color: 'green'
+					}
+				},{
+					yAxis: res.data.power,
+					name: `额定功率${res.data.power}`,
+					lineStyle: {
+						color: 'red'
+					}
+				}]
+			}
+			powerDialog.value = true
+		}
+	}
+}
+/**dialog 数据 */
+const wtDialog = ref(false)
+const wtData = ref([])
+const activeTab = ref('1')
 /**created */
 // funGetTree()
 // funGetProcessTree()
@@ -429,6 +525,9 @@ onActivated(() => {
 				</div>
 			</el-tabs>
 		</el-dialog>
+		<el-dialog draggable width="1000px" v-model="powerDialog" title="额定功率">
+			<bar-chart-cop height="700px" :colors='[]' width="100%" :xAxis="powerxAxis" :yAxis="poweryAxis" :series="powerSeries"></bar-chart-cop>
+		</el-dialog>
     <el-dialog draggable v-model="wtDialog" title="曲线偏差率">
 			<el-table :data="wtData" row-key="id" :max-height="550">
 				<el-table-column property="windturbine" align="center" label="风机" />
@@ -481,6 +580,7 @@ onActivated(() => {
       <el-row :gutter="10">
         <el-col :span="5">
           <tree-cop
+						ref="treeCopRef" 
             :data="treeData"
             @checkChange="funTreeCheckChange"
             :show-checkbox="true"
@@ -502,15 +602,20 @@ onActivated(() => {
         <el-col :span="16">
           <div class="px-[10px] shadow rounded-[6px] shadow-blue-500">
             <SubmitBtn
-              class="absolute right-[106px] top-[6px] z-10"
+              class="absolute right-[196px] top-[6px] z-10"
               desc="区域划分"
               @click="funChartArea"
             ></SubmitBtn>
 						<SubmitBtn
-              class="absolute right-[16px] top-[6px] z-10"
+              class="absolute right-[106px] top-[6px] z-10"
               desc="时间占比"
               @click="funTimeArea"
             ></SubmitBtn>
+						<SubmitBtn
+              class="absolute right-[16px] top-[6px] z-10"
+              desc="额定功率"
+              @click="funPower"
+            ></SubmitBtn>
             <div
               :style="{
                 height:

+ 1 - 1
src/pages/dataAnalysis/rateAnalysis/components/scatterSingleChart.vue

@@ -115,7 +115,7 @@ const option = computed({
 })
 watch(() => option, (newVal, oldVal) => {
 	if (chartIns.value) {
-		console.log(newVal)
+		// console.log(newVal)
 		const echartIns = toRaw(chartIns.value)
 		echartIns.setOption(toRaw(newVal.value))
 	}

+ 1 - 1
src/pages/dataAnalysis/rateAnalysis/index.vue

@@ -158,7 +158,7 @@ const funSubmit = async () => {
 	// const lineRes = lineChartRes
 	if (rosesRes.code === 200) {
 		if (rosesRes.data?.length) {
-			console.log(rosesRes.data)
+			// console.log(rosesRes.data)
 			chartData.value = []
 			for (const chart of rosesRes.data) {
 				chartData.value.push({

+ 397 - 0
src/pages/dataAnalysis/spaceAnalysis/components/barChart.json

@@ -0,0 +1,397 @@
+
+{
+	"color": [
+			"#db60c8",
+			"#c12e34",
+			"#e6b600d9",
+			"#0098d9",
+			"#465a83",
+			"#005eaa",
+			"#cda819",
+			"#32a487"
+	],
+	"backgroundColor": "rgba(0,0,0,0)",
+	"textStyle": {},
+	"title": {
+			"textStyle": {
+					"color": "#000"
+			},
+			"subtextStyle": {
+					"color": "#000"
+			}
+	},
+	"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"
+			},
+			"barMaxWidth": 50
+	},
+	"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": [
+									"#ccc"
+							]
+					}
+			},
+			"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": "#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)"
+							]
+					}
+			}
+	},
+	"timeAxis": {
+			"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)"
+							]
+					}
+			}
+	},
+	"toolbox": {
+			"iconStyle": {
+					"borderColor": "#06467c"
+			},
+			"emphasis": {
+					"iconStyle": {
+							"borderColor": "#4187c2"
+					}
+			}
+	},
+	"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": "#838383B3B3B3"
+			}
+	},
+	"markPoint": {
+			"label": {
+					"color": "#eeeeee"
+			},
+			"emphasis": {
+					"label": {
+							"color": "#eeeeee"
+					}
+			}
+	}
+}

+ 199 - 0
src/pages/dataAnalysis/spaceAnalysis/components/barChart.vue

@@ -0,0 +1,199 @@
+<script setup>
+import util from "@tools/util";
+import chartTheme from './barChart.json'
+import { ref, toRaw, computed, onMounted, watch, nextTick } from 'vue';
+import {useStore} from 'vuex'
+import * as echarts from 'echarts'
+const chartId = 'chart-' + util.newGUID(); //chartId
+const chartIns = ref(null)  //chart 实例
+const emits = defineEmits(['getSelected'])
+const props = defineProps({
+	xAxis: {
+		type: Object,
+		required: true,
+		default: () => ({})
+	},
+	yAxis: {
+		type: Array,
+		required: false
+	},
+	series: {
+		type: Array,
+		required: true
+	},
+	dataset: {
+		type: Array,
+		required: false,
+		default: () => ([])
+	},
+	height: {
+		type: String,
+		required: false,
+		default: '500px'
+	},
+	width: {
+		type: String,
+		required: false,
+		default: '500px'
+	},
+	title: {
+		type: String,
+		required: false
+	},
+	subtext: {
+		type: String,
+		required: false
+	},
+	brush: {
+		type: Boolean,
+		required: false,
+		default: false
+	}
+})
+
+/**定义option */
+const option = computed({
+	get() {
+		return {
+			color:[
+				"rgb(50,93,171)",
+				"#0098d980",
+				"#626c91",
+				"#a0a7e6",
+				"#c4ebad",
+				"#96dee8"
+			],
+			title: {
+				text: props.title || '',
+				subtext: props.subtext || '',
+				top: 6,
+				left: '5%',
+			},
+			xAxis: props.xAxis || {},
+			yAxis: props.yAxis || {},
+			brush: {
+          seriesIndex: [1],
+          yAxisIndex: 0,
+          transformable: true,
+          throttleType: "debounce",
+          throttleDelay: 1000,
+          removeOnClick: true,
+          brushType: props.brush? "polygon" : false,
+          brushMode: "multiple",
+          brushStyle: {
+            borderWidth: 1,
+            borderColor: "#ff2424",
+          },
+        },
+			toolbox:{
+				show: props.brush,
+			},
+			tooltip: {
+				confine: true,
+				trigger: "axis",
+			},
+			dataset: props.dataset || [],
+			series: props.series || [],
+			legend: {
+				right: "120",
+				top: "5",
+				itemWidth: 6,
+			},
+			grid: {
+				top: 80,
+				left: 40,
+				right: 40,
+				bottom: 40,
+			},
+			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),可以随时更改
+          },
+        ],
+		}
+	},
+	set(val) { }
+})
+watch(() => option, (newVal, oldVal) => {
+	if (chartIns.value) {
+		const echartIns = toRaw(chartIns.value)
+		echartIns.setOption(toRaw(newVal.value))
+	}
+}, { deep: true })
+
+watch([() => props.width, () => props.height],(newVal, oldVal) => {
+	if(chartIns.value){
+		const echartIns = toRaw(chartIns.value)
+		nextTick(() => echartIns.resize())
+	}
+})
+const store = useStore()
+const collapse = computed({
+	get(){
+		return store.state.collapse
+	},
+	set(val){}
+})
+watch(collapse, (val) => {
+	if(chartIns.value){
+		setTimeout(() => {
+			chartIns.value?.resize()
+		},300)
+	}
+})
+const funBrushChange = (flag) => {
+	const echartIns = toRaw(chartIns.value)
+	echartIns.dispatchAction({
+			type: "takeGlobalCursor",
+			// 如果想变为“可刷选状态”,必须设置。不设置则会关闭“可刷选状态”。
+			key: "brush",
+			brushOption: {
+				seriesIndex: [1],
+				yAxisIndex: 0,
+				transformable: true,
+				throttleType: "debounce",
+				throttleDelay: 1000,
+				removeOnClick: true,
+				brushType: flag? "polygon" : false,
+				brushMode: "multiple",
+				brushStyle: {
+					borderWidth: 1,
+					color: "rgba(255,36,36,0.2)",
+					borderColor: "#ff2424",
+				},
+			},
+		});
+	echartIns.off("brushSelected");
+	echartIns.on("brushSelected", (params) => {
+		emits("getSelected", params.batch || []);
+	});
+}
+watch(() => props.brush, (newVal, oldVal) => funBrushChange(newVal))
+
+onMounted(() => {
+	nextTick(() => {
+		echarts.registerTheme('chartTheme', chartTheme)
+		const echartIns =	echarts.init(document.getElementById(chartId),'chartTheme') 
+		chartIns.value = echartIns
+		echartIns.setOption(option.value)
+		funBrushChange(props.brush)
+		window.addEventListener('resize', () => {
+			echartIns.resize()
+		})
+	})
+})
+</script>
+<template>
+	<div :id="chartId" :style="{ height: props.height, width: props.width }"></div>
+</template>

+ 29 - 0
src/pages/dataAnalysis/spaceAnalysis/components/search.vue

@@ -0,0 +1,29 @@
+<script setup name="search">
+import SubmitBtn from '@com/SubmitBtn.vue'
+import { onMounted, reactive, ref } from 'vue'
+
+const queryForm = reactive({
+	mode: 0
+})
+/**执行 */
+const emits = defineEmits(['submit'])
+const funSubmit = async () => {
+	emits('submit', queryForm)
+}
+</script>
+<template>
+	<div class="pl-[20px] flex items-center h-[80px] relative">
+		<div class="absolute top-[-7px] left-[20px] text-[#838383] text-[14px]">操作面板</div>
+		<el-form class="whitespace-nowrap" :inline="true" :model="queryForm">
+			<el-form-item label="合并方式" class="!mb-0">
+				<el-select v-model="queryForm.mode">
+					<el-option :value="0" label="多表单台"></el-option>
+					<el-option :value="1" label="单表多台"></el-option>
+				</el-select>
+			</el-form-item>
+			<el-form-item class="!mb-0">
+				<submit-btn v-prevdbclick:5000="funSubmit" desc="执行"></submit-btn>
+			</el-form-item>
+		</el-form>
+	</div>
+</template>

+ 565 - 0
src/pages/dataAnalysis/spaceAnalysis/index.vue

@@ -0,0 +1,565 @@
+<script setup name="rateAnalysis">
+import excelCop from '@/components/excel.vue'
+import treeCop from '@/components/tree.vue'
+import barChartCop from './components/barChart.vue'
+import SubmitBtn from '../../../components/SubmitBtn.vue'
+// import { ElMessage } from 'element-plus';
+import { onMounted, ref, onActivated, shallowRef, reactive, nextTick } from 'vue'
+import request from '@/api/axios.js'
+import tools from '@tools/htmlToPdf.js'
+// import flowerRes from '@/data/flower.json'
+// import lineChartRes from '@/data/lineNew.json'
+/**配置参数 */
+const treeHeight = ref(window.innerHeight - 150 + 'px') //tree高度
+const excelHeight = ref(window.innerHeight - 150 + 'px') //excel高度
+const tableHeight = ref(window.innerHeight - 150 + 'px')
+/**excel 开始 */
+const excelCheckIds = ref([])
+const excelList = ref([])
+/** 额定功率 */
+const powerproduction = ref("")
+//点击excel项时
+const funExcelChange = async (obj) => { 
+	excelCheckIds.value = [obj.id] //当为单选展示风机图表时
+	chartExcelList.value = excelList.value.map(o=> {
+		return {
+			...o,
+			name: o.windturbine
+		}
+	})  // 选中excel当前项时, excel列表赋值给dialog 下拉框
+	queryForm.checkIds = excelList.value.map(o => o.id)
+	checkAll.value = true
+	funSubmit()
+}
+const funExcelCheckChange = ({ checkArr, data }) => {
+	excelCheckIds.value = checkArr
+}
+/**tree 开始 */
+const treeData = ref([])
+const actTreeNode = ref(null)
+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 = []
+				if(!actTreeNode.value){
+					actTreeNode.value = o
+				}
+			}
+		}
+		return {
+			...o,
+			children: o.children?.length ? funRepeatMap(o.children) : []
+		}
+	})
+}
+const funGetTree = async () => {
+	const res = await request.get("/power/prepare/tree")
+	actTreeNode.value = null
+	excelList.value = []
+	treeData.value = funRepeatMap(res.data)
+	if(actTreeNode.value){
+		funCurrentChange({current: actTreeNode.value, currentNode: null})
+		funExcelChange({id: actTreeNode.value.childs[0].id})
+	}
+}
+const funTreeCheckChange = ({ current, checkedNodes, checkedKeys, halfCheckedNodes, halfCheckedKeys }) => {  //tree change  -> excel change
+	funCurrentChange({ current, currentNode: '' })
+	const checkIds = []
+	if (checkedNodes.length) {
+		for (const node of checkedNodes) {
+			if (node.childs && node.childs.length) {
+				for (const child of node.childs) {
+					checkIds.push(child.id)
+				}
+			}
+		}
+	}
+	excelCheckIds.value = checkIds
+}
+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 = []
+	}
+}
+/**chart */
+let chartId = 1
+const powerproductionNum = ref(0)
+/**submit */
+const funSubmit = async () => {
+	const tempRes = await request.get('/wind/avg/speed', {
+		params: {
+			ids: excelCheckIds.value.join(','),
+		}
+	})
+	if (tempRes.code === 200) {
+		if (tempRes.data?.length) {
+			for (const chart of tempRes.data) {
+				chart.currentData.sort((a,b) => {
+					return new Date(a.time).getTime() - new Date(b.time).getTime()
+				})
+				chart.preData.sort((a,b) => {
+					return new Date(a.time).getTime() - new Date(b.time).getTime()
+				})
+				const xAxisData = [], barData1 = [], barData2 = [], lineData1 = [], lineData2 = []
+				for(const current of chart.currentData){
+					xAxisData.push(current.time)
+					barData1.push(current.avgspeed)
+					lineData1.push(current.mrxs)
+				}
+				for(const current of chart.preData){
+					barData2.push(current.avgspeed)
+					lineData2.push(current.mrxs)
+				}
+				barxAxis.data = xAxisData
+				linexAxis.data = xAxisData
+				barSeries[0].data = barData1
+				barSeries[1].data = barData2
+				chartId++
+				lineSeries[0].data = lineData1
+				lineSeries[1].data = lineData2
+				chartId++
+			}
+		}
+	}
+}
+/**lineChart */
+const linexAxis = reactive({
+	type: 'category',
+	name: '月',
+	data: [],
+	splitLine: {
+		show: false
+	},
+	axisTick: {
+		show: true
+	},
+	axisLine: {
+		onZero: false
+	}
+})
+const lineyAxis = reactive({
+		type: 'value',
+		name: '%',
+		splitLine: {
+		show: false
+	},
+	axisTick: {
+		show: true
+	},
+	axisLine: {
+		onZero: false
+	}
+})
+const lineSeries = reactive([{
+	name: "每月NCF(最新)",
+	type: "line",
+	data: [],
+	symbol: "line", //设定为实心点
+	symbolSize: 0, //设定实心点的大小
+	markLine: {
+		symbol: 'none',
+		label: {
+			show: false,
+		},
+		lineStyle: {
+			color: '#F72C5B'
+		},
+		data: []
+	}
+},{
+	name: "每月NCF(历史)",
+	type: "line",
+	data: [],
+	symbol: "line", //设定为实心点
+	symbolSize: 0, //设定实心点的大小
+	markLine: {
+		symbol: 'none',
+		label: {
+			show: false,
+		},
+		lineStyle: {
+			color: '#F72C5B'
+		},
+		data: []
+	}
+}])
+// 圈选散点触发函数
+const funChartSelect = async (batch) => {
+	const wDataArr = []
+	const yDataArr = []
+	let scatterls = []
+	let dataSetObj = []
+	wtData.value = []
+	if (batch?.length && actCopList.value[0]?.dataset) {
+		scatterls = batch[0].selected[1].dataIndex
+		if (scatterls?.length) {
+			dataSetObj = JSON.parse(actCopList.value[0].dataset)
+			if (scatterls?.length) {
+				for (const scatterIndex of scatterls) {
+					wDataArr.push(dataSetObj[0].source[scatterIndex].k)
+				}
+			}
+			const wtRes = await request.get('/power/fitting/filter', { params: { yk: yDataArr.join(','), wk: wDataArr.join(',') } })
+			if (wtRes.code === 200) {
+				let id = 1
+				const tempArr = [] //用于以风机id 聚合dataArr
+				if (wtRes.data?.length) {
+					for (const data of wtRes.data) {
+						if (tempArr.length) {
+							const findIndex = tempArr.findIndex(o => o.wtId === data.wtId)
+							if (findIndex !== -1) {
+								if (!tempArr[findIndex].children) {
+									tempArr[findIndex].children = []
+								}
+								tempArr[findIndex].children.push({ ...data, id: id, filter: data.filter === 0 ? '是' : '否' })
+								id++
+							} else {
+								tempArr.push({ ...data, id: id, filter: data.filter === 0 ? '是' : '否' })
+								id++
+							}
+						} else {
+							tempArr.push({ ...data, id: id, filter: data.filter === 0 ? '是' : '否' })
+							id++
+						}
+					}
+					wtDialog.value = true
+					nextTick(() => {
+						wtTab.value = 'table'
+						wtData.value = tempArr
+					})
+				}
+			}
+		}
+	}
+}
+/**barChart */
+const barxAxis = reactive({
+	type: 'category',
+	name: '月',
+	data: [],
+	splitLine: {
+		show: false
+	},
+	axisTick: {
+		show: true
+	},
+	axisLine: {
+		onZero: false
+	}
+})
+const baryAxis = reactive({
+		type: 'value',
+		name: 'm/s',
+		splitLine: {
+		show: false
+	},
+	axisTick: {
+		show: true
+	},
+	axisLine: {
+		onZero: false
+	}
+})
+const barSeries = reactive([{
+	name: "机舱风速(最近)",
+	type: "line",
+	symbol: "line", //设定为实心点
+	symbolSize: 0, //设定实心点的大小
+	data: [],
+	markLine: {
+		symbol: 'none',
+		label: {
+			show: false,
+		},
+		lineStyle: {
+			color: '#F72C5B'
+		},
+		data: []
+	}
+},{
+	name: "机舱风速(历史)",
+	type: "line",
+	symbol: "line", //设定为实心点
+	symbolSize: 0, //设定实心点的大小
+	data: [],
+	markLine: {
+		symbol: 'none',
+		label: {
+			show: false,
+		},
+		lineStyle: {
+			color: '#F72C5B'
+		},
+		data: []
+	}
+}])
+/**dialog 数据 */
+const wtDialog = ref(false)
+const wtData = ref([])
+const wtTab = ref('table')
+/**dialog */
+const dialog = ref(false)
+const actChartName = ref('')
+const actDiaTitle = ref('')
+const diaPanelRef = ref()
+const exportLoading = ref(false)
+const actCopList = ref([
+	// {
+	// 	xAxis: [],
+	// 	subtext: '',
+	// 	title: '',
+	// 	isRadar: false,
+	// 	series: [],
+	// 	yAxis: [],
+	// 	dataset: []
+	// }
+])
+// 作为actCopList的备份 在actCopList赋值多个时 同时赋值, 在dialog弹出时清空. 作用: 在actCopList变化时, 重新赋值原始数据
+const actCopListBak = ref([]) 
+const checkAll = ref(true)
+const queryForm = reactive({
+	checkIds: []
+})
+const funCheckAll = () => {
+	checkAll.value = !checkAll.value
+	if(checkAll.value){
+		queryForm.checkIds = chartExcelList.value.map(o => o.id)
+	}else{
+		queryForm.checkIds = []
+	}
+}
+const chartExcelList = ref([]) //dialog 下拉项
+const funActCop = (obj, type) => {
+	switch(type){
+		case 'barChartCop':
+			actChartName.value = 'barChartCop'
+			obj.actCop = shallowRef(barChartCop)
+			actDiaTitle.value = '月平均风速'
+			break
+		case 'lineChartCop':
+			actChartName.value = 'lineChartCop'
+			obj.actCop = shallowRef(barChartCop)
+			actDiaTitle.value = '毛容量系数'
+			break
+		// case 'CurrentScatterChartCop':
+		// 	actChartName.value = 'CurrentScatterChartCop'
+		// 	obj.actCop = shallowRef(CurrentScatte		// console.log(res)rChartCop)
+		// 	actDiaTitle.value = '静态偏航对风分析图'
+		// 	break
+	}
+	obj.isBrush = false
+	obj.id = chartId
+	chartId ++
+	dialog.value = true
+	actCopListBak.value = []
+	nextTick(() => {
+		actCopList.value = [obj]
+	})
+}
+const funDiaSubmit = async () => {
+	let url = ''
+	switch(actChartName.value){
+		case 'barChartCop':
+			url = '/wind/avg/speed'
+			break
+		case 'lineChartCop':
+			url = '/wind/avg/speed'
+			break
+		// case 'CurrentScatterChartCop':
+		// 	url = '' //暂无接口
+		// 	break
+	}
+	if(url){
+		const res = await request.get(url, {
+			params: {
+				ids: queryForm.checkIds.join(','),
+				mode: 0
+			}
+		})
+		if(res.code===200){
+			actCopList.value = []
+			actCopListBak.value = [] //清空备份
+			if(res.data?.length){
+				for(const chart of res.data){
+					chart.currentData.sort((a,b) => {
+						return new Date(a.time).getTime() - new Date(b.time).getTime()
+					})
+					chart.preData.sort((a,b) => {
+						return new Date(a.time).getTime() - new Date(b.time).getTime()
+					})
+					const xAxisData = [], barData1 = [], barData2 = [], lineData1 = [], lineData2 = []
+					for(const current of chart.currentData){
+						xAxisData.push(current.time)
+						barData1.push(current.avgspeed)
+						lineData1.push(current.mrxs)
+					}
+					for(const current of chart.preData){
+						barData2.push(current.avgspeed)
+						lineData2.push(current.mrxs)
+					}
+					if(actChartName.value==='barChartCop'){
+						actCopList.value.push({
+							id: chartId,
+							isBrush: false,
+							actCop: shallowRef(barChartCop),
+							title: chart.windturbine,
+							subtext: `月平均风速`,
+							xAxis: {
+								...barxAxis,
+								data: xAxisData
+							},
+							yAxis: baryAxis,
+							series: [{
+								...barSeries[0],
+								data: barData1
+							},{
+								...barSeries[1],
+								data: barData2
+							}]
+						})
+						chartId++
+					}
+					if(actChartName.value === 'lineChartCop'){
+						actCopList.value.push({
+							id: chartId,
+							isBrush: false,
+							actCop: shallowRef(barChartCop),
+							title: chart.windturbine,
+							subtext: `毛容量系数`,
+							xAxis: {
+								...linexAxis,
+								data: xAxisData
+							},
+							yAxis: lineyAxis,
+							series: [{
+								...lineSeries[0],
+								data: lineData1
+							},{
+								...lineSeries[1],
+								data: lineData2
+							}]
+
+						})
+						chartId++
+					}
+				}
+				actCopListBak.value = actCopList.value
+			}
+		}
+	}
+}
+const funDiaExport = () => {
+	exportLoading.value = true
+	tools.scrollToPDF(diaPanelRef.value, actDiaTitle.value, () => {
+		exportLoading.value = false
+	})
+}
+const funDbClick = (obj) => {
+	if(actCopListBak.value.length > 1){ //判断大于1时, 才有双击放大功能
+		if(actCopList.value.length === 1){
+			actCopList.value = actCopListBak.value
+		}else{
+			actCopList.value = [obj]
+		}
+	}
+}
+/**created */
+// funGetTree()
+/**activated */
+onMounted(() => {
+	//test
+	// funSubmit()
+	//
+	tableHeight.value = window.innerHeight - 150 + 'px'
+	excelHeight.value =(window.innerHeight - 150) + 'px'
+	treeHeight.value = (window.innerHeight - 150) + 'px'
+	window.addEventListener('resize', () => {
+		tableHeight.value = window.innerHeight - 150 + 'px'
+		excelHeight.value = (window.innerHeight - 150) + 'px'
+		treeHeight.value = (window.innerHeight - 150)  + 'px'
+	})
+})
+onActivated(() => {
+	funGetTree()
+})
+</script>
+<template>
+	<div class="bg-white py-[10px] px-[10px] relative s-dialog-body">
+		<el-dialog draggable width="80%" v-model="dialog" :title="actDiaTitle">
+			<el-form class="whitespace-nowrap" :inline="true" :model="queryForm">
+				<el-form-item label="" class="!mb-0">
+					<el-select v-model="queryForm.checkIds" clearable @clear="checkAll = false" collapse-tags multiple>
+						<el-option label="全选" :class="{'selected': checkAll}" @click="funCheckAll"></el-option>
+						<el-option v-for="item in chartExcelList" :key="item.id" :value="item.id" :label="item.name"></el-option>
+					</el-select>
+				</el-form-item>
+				<el-form-item class="!mb-0">
+					<submit-btn desc="查询" @click="funDiaSubmit"></submit-btn>
+					<submit-btn desc="导出" @click="funDiaExport"></submit-btn>
+				</el-form-item>
+			</el-form>
+			<div v-loading="exportLoading">
+				<div ref="diaPanelRef" class="flex flex-wrap justify-center items-center h-[650px] overflow-y-auto overflow-x-hidden">
+					<component :is="item.actCop" :width="actCopList.length > 1 ? '50%' : '100%'" height="100%" v-for="item in actCopList"
+						:key="item.id" :xAxis="item.xAxis" :subtext="item.subtext" :title="item.title"
+						:series="item.series" :isDiaAlone="(actCopList.length === 1)" @dblclick="funDbClick(item)" :yAxis="item.yAxis" :dataset="item.dataset" :brush="item.isBrush" @getSelected="funChartSelect"></component>
+				</div>
+			</div>
+		</el-dialog>
+		<div class="relative shadow rounded-[6px] shadow-blue-500 px-[10px] pt-[10px] pb-[10px]">
+			<div class="text-[14px] absolute top-[-7px] text-[#838383] left-[20px]">数据展示</div>
+			<el-row :gutter="10">
+				<el-col :span="5">
+					<tree-cop :data="treeData" @checkChange="funTreeCheckChange" :show-checkbox="false" :height="treeHeight"
+						@currentChange="funCurrentChange" @refresh="funGetTree">
+					</tree-cop>
+				</el-col>
+				<el-col :span="3">
+					<excel-cop :checkIds="excelCheckIds" :showCheckbox="false" :data="excelList" :height="excelHeight"
+						@excelChange="funExcelChange" @checkChange="funExcelCheckChange"></excel-cop>
+				</el-col>
+				<el-col :span="16">
+					<div :style="{ height: tableHeight }"
+						class="flex flex-wrap justify-center items-center overflow-x-hidden overflow-y-auto ">
+						<div class="mb-[10px] w-[100%] h-[49%] flex flex-col items-end shadow rounded-[6px] shadow-blue-500">
+							<el-icon class="mr-[10px] mt-[10px] cursor-pointer" size="18"
+								@click="funActCop({xAxis:barxAxis, yAxis:baryAxis, series: barSeries}, 'barChartCop')">
+								<ZoomIn />
+							</el-icon>
+							<bar-chart-cop width="100%" height="100%" :subtext="`月平均风速`" :xAxis="barxAxis" :yAxis="baryAxis" :series="barSeries"></bar-chart-cop>
+						</div>
+						<div class="w-[100%] h-[49%] flex flex-col items-end shadow rounded-[6px] shadow-blue-500">
+							<el-icon class="mr-[10px] mt-[10px] cursor-pointer" size="18"
+								@click="funActCop({xAxis:linexAxis, yAxis:lineyAxis, series: lineSeries}, 'lineChartCop')">
+								<ZoomIn />
+							</el-icon>
+							<bar-chart-cop width="100%" height="100%" :subtext="`毛容量系数`" :xAxis="linexAxis" :yAxis="lineyAxis" :series="lineSeries"></bar-chart-cop>
+						</div>
+					</div>
+				</el-col>
+			</el-row>
+		</div>
+	</div>
+</template>
+<style scoped>
+.s-dialog-body /deep/ .el-dialog__body{
+	padding: 0px 20px;
+}
+</style>

+ 393 - 0
src/pages/dataAnalysis/spaceAnalysis/rateAnalysis.json

@@ -0,0 +1,393 @@
+
+{
+	"color": [
+			"#3fb1e3",
+			"#6be6c1",
+			"#626c91",
+			"#a0a7e6",
+			"#c4ebad",
+			"#96dee8"
+	],
+	"backgroundColor": "rgba(252,252,252,0)",
+	"textStyle": {},
+	"title": {
+			"textStyle": {
+					"color": "#000"
+			},
+			"subtextStyle": {
+					"color": "#000"
+			}
+	},
+	"line": {
+			"itemStyle": {
+					"borderWidth": "2"
+			},
+			"lineStyle": {
+					"width": "2"
+			},
+			"symbolSize": "8",
+			"symbol": "emptyCircle",
+			"smooth": true
+	},
+	"radar": {
+			"itemStyle": {
+					"borderWidth": "2"
+			},
+			"lineStyle": {
+					"width": "3"
+			},
+			"symbolSize": "8",
+			"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": "#e6a0d2",
+					"color0": "transparent",
+					"borderColor": "#e6a0d2",
+					"borderColor0": "#3fb1e3",
+					"borderWidth": "2"
+			}
+	},
+	"graph": {
+			"itemStyle": {
+					"borderWidth": 0,
+					"borderColor": "#ccc"
+			},
+			"lineStyle": {
+					"width": "1",
+					"color": "#cccccc"
+			},
+			"symbolSize": "8",
+			"symbol": "emptyCircle",
+			"smooth": false,
+			"color": [
+					"#3fb1e3",
+					"#6be6c1",
+					"#626c91",
+					"#a0a7e6",
+					"#c4ebad",
+					"#96dee8"
+			],
+			"label": {
+					"color": "#ffffff"
+			}
+	},
+	"map": {
+			"itemStyle": {
+					"areaColor": "#eeeeee",
+					"borderColor": "#aaaaaa",
+					"borderWidth": 0.5
+			},
+			"label": {
+					"color": "#ffffff"
+			},
+			"emphasis": {
+					"itemStyle": {
+							"areaColor": "rgba(63,177,227,0.25)",
+							"borderColor": "#3fb1e3",
+							"borderWidth": 1
+					},
+					"label": {
+							"color": "#3fb1e3"
+					}
+			}
+	},
+	"geo": {
+			"itemStyle": {
+					"areaColor": "#eeeeee",
+					"borderColor": "#aaaaaa",
+					"borderWidth": 0.5
+			},
+			"label": {
+					"color": "#ffffff"
+			},
+			"emphasis": {
+					"itemStyle": {
+							"areaColor": "rgba(63,177,227,0.25)",
+							"borderColor": "#3fb1e3",
+							"borderWidth": 1
+					},
+					"label": {
+							"color": "#3fb1e3"
+					}
+			}
+	},
+	"categoryAxis": {
+			"axisLine": {
+					"show": true,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisTick": {
+					"show": false,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisLabel": {
+					"show": true,
+					"color": "#838383"
+			},
+			"splitLine": {
+					"show": true,
+					"lineStyle": {
+							"color": [
+									"#838383"
+							]
+					}
+			},
+			"splitArea": {
+					"show": false,
+					"areaStyle": {
+							"color": [
+									"rgba(250,250,250,0.05)",
+									"rgba(200,200,200,0.02)"
+							]
+					}
+			}
+	},
+	"valueAxis": {
+			"axisLine": {
+					"show": true,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisTick": {
+					"show": false,
+					"lineStyle": {
+							"color": "#838383"
+					}
+			},
+			"axisLabel": {
+					"show": true,
+					"color": "#838383",
+					"fontSize": 10
+			},
+			"splitLine": {
+					"show": true,
+					"lineStyle": {
+							"color": [
+									"#838383"
+							]
+					}
+			},
+			"splitArea": {
+					"show": false,
+					"areaStyle": {
+							"color": [
+									"rgba(250,250,250,0.05)",
+									"rgba(200,200,200,0.02)"
+							]
+					}
+			}
+	},
+	"logAxis": {
+			"axisLine": {
+					"show": true,
+					"lineStyle": {
+							"color": "#cccccc"
+					}
+			},
+			"axisTick": {
+					"show": false,
+					"lineStyle": {
+							"color": "#333"
+					}
+			},
+			"axisLabel": {
+					"show": true,
+					"color": "#999999"
+			},
+			"splitLine": {
+					"show": true,
+					"lineStyle": {
+							"color": [
+									"#eeeeee"
+							]
+					}
+			},
+			"splitArea": {
+					"show": false,
+					"areaStyle": {
+							"color": [
+									"rgba(250,250,250,0.05)",
+									"rgba(200,200,200,0.02)"
+							]
+					}
+			}
+	},
+	"timeAxis": {
+			"axisLine": {
+					"show": true,
+					"lineStyle": {
+							"color": "#cccccc"
+					}
+			},
+			"axisTick": {
+					"show": false,
+					"lineStyle": {
+							"color": "#333"
+					}
+			},
+			"axisLabel": {
+					"show": true,
+					"color": "#999999"
+			},
+			"splitLine": {
+					"show": true,
+					"lineStyle": {
+							"color": [
+									"#eeeeee"
+							]
+					}
+			},
+			"splitArea": {
+					"show": false,
+					"areaStyle": {
+							"color": [
+									"rgba(250,250,250,0.05)",
+									"rgba(200,200,200,0.02)"
+							]
+					}
+			}
+	},
+	"toolbox": {
+			"iconStyle": {
+					"borderColor": "#999999"
+			},
+			"emphasis": {
+					"iconStyle": {
+							"borderColor": "#666666"
+					}
+			}
+	},
+	"legend": {
+			"textStyle": {
+					"color": "#999999"
+			}
+	},
+	"tooltip": {
+			"axisPointer": {
+					"lineStyle": {
+							"color": "#cccccc",
+							"width": 1
+					},
+					"crossStyle": {
+							"color": "#cccccc",
+							"width": 1
+					}
+			}
+	},
+	"timeline": {
+			"lineStyle": {
+					"color": "#626c91",
+					"width": 1
+			},
+			"itemStyle": {
+					"color": "#626c91",
+					"borderWidth": 1
+			},
+			"controlStyle": {
+					"color": "#626c91",
+					"borderColor": "#626c91",
+					"borderWidth": 0.5
+			},
+			"checkpointStyle": {
+					"color": "#3fb1e3",
+					"borderColor": "#3fb1e3"
+			},
+			"label": {
+					"color": "#626c91"
+			},
+			"emphasis": {
+					"itemStyle": {
+							"color": "#626c91"
+					},
+					"controlStyle": {
+							"color": "#626c91",
+							"borderColor": "#626c91",
+							"borderWidth": 0.5
+					},
+					"label": {
+							"color": "#626c91"
+					}
+			}
+	},
+	"visualMap": {
+			"color": [
+					"#2a99c9",
+					"#afe8ff"
+			]
+	},
+	"dataZoom": {
+			"backgroundColor": "rgba(255,255,255,0)",
+			"dataBackgroundColor": "rgba(222,222,222,1)",
+			"fillerColor": "rgba(114,230,212,0.25)",
+			"handleColor": "#cccccc",
+			"handleSize": "100%",
+			"textStyle": {
+					"color": "#999999"
+			}
+	},
+	"markPoint": {
+			"label": {
+					"color": "#ffffff"
+			},
+			"emphasis": {
+					"label": {
+							"color": "#ffffff"
+					}
+			}
+	}
+}

+ 1 - 1
src/pages/dataAnalysis/tempAnalysis/index.vue

@@ -328,7 +328,7 @@ const funActCop = (obj, type) => {
 			break
 		// case 'CurrentScatterChartCop':
 		// 	actChartName.value = 'CurrentScatterChartCop'
-		// 	obj.actCop = shallowRef(CurrentScatte		console.log(res)rChartCop)
+		// 	obj.actCop = shallowRef(CurrentScatte		// console.log(res)rChartCop)
 		// 	actDiaTitle.value = '静态偏航对风分析图'
 		// 	break
 	}

+ 1 - 1
src/pages/lightAnalysis/glAnalysis/components/current-scatter-chart.vue

@@ -337,7 +337,7 @@ export default {
     // });
   },
   updated() {
-    console.log('update')
+    // console.log('update')
     let myChart = echarts.init(document.getElementById(this.id));
     myChart.dispose();
     this.$nextTick(() => {

+ 1 - 1
src/pages/lightAnalysis/glAnalysis/index.vue

@@ -135,7 +135,7 @@ const funSubmit = async () => {
 		for(const index in wtIds){
 			const llgl = []
 			const sjgl = []
-			console.log(wtIds[index],res.data.data[wtIds[index]])
+			// console.log(wtIds[index],res.data.data[wtIds[index]])
 			for(const o of res.data.data[wtIds[index]]){
 				if(index === '0'){
 					xAxis.push(o.datetime)

+ 2 - 2
src/pages/lightAnalysis/glHotAnalysis/components/current-scatter-chart.vue

@@ -329,7 +329,7 @@ export default {
       });
       // myChart.off('click')
       // myChart.on('click', params => {
-      //     console.log(params)
+      //     // console.log(params)
       //     if(params.componentType === 'markArea'){
       //       myChart.dispatchAction({
       //         type: 'brush',
@@ -356,7 +356,7 @@ export default {
     // });
   },
   updated() {
-    console.log('update')
+    // console.log('update')
     let myChart = echarts.init(document.getElementById(this.id));
     myChart.dispose();
     this.$nextTick(() => {

+ 12 - 12
src/router/index.js

@@ -122,18 +122,18 @@ const routes = [{
                             '../pages/dataAnalysis/hotAnalysis/index.vue'
                         ),
                 },
-                // {
-                //     icon: 'el-icon-s-home',
-                //     path: '/dataAnalysis/tempAnalysis',
-                //     name: 'dataAnalysistempAnalysis',
-                //     meta: {
-                //         title: '温度与功率曲线分析',
-                //     },
-                //     component: () =>
-                //         import(
-                //             '../pages/dataAnalysis/tempAnalysis/index.vue'
-                //         ),
-                // },
+                {
+                    icon: 'el-icon-s-home',
+                    path: '/dataAnalysis/spaceAnalysis',
+                    name: 'dataAnalysisspaceAnalysis',
+                    meta: {
+                        title: '毛容量分析',
+                    },
+                    component: () =>
+                        import(
+                            '../pages/dataAnalysis/spaceAnalysis/index.vue'
+                        ),
+                },
                 {
                     icon: 'el-icon-s-home',
                     path: '/dataAnalysis/agcAnalysis',

+ 1 - 1
src/tools/htmlToPdf.js

@@ -24,7 +24,7 @@ function downloadPDF(ele, pdfName) {
     if (win_out > win_in) {
         // abs = (win_o - win_i)/2;    // 获得滚动条长度的一半
         abs = (win_out - win_in) / 2; // 获得滚动条宽度的一半
-        // console.log(a, '新abs');
+        // // console.log(a, '新abs');
     }
 
     canvas.width = eleW * 2; // 将画布宽&&高放大两倍

File diff suppressed because it is too large
+ 1 - 1
src/tools/js-xlsx.js


+ 1 - 1
src/websocket/index.js

@@ -35,5 +35,5 @@ function reflexWindturbineBasicInformation(stompMessage) {
 }
 // ============================  其他  ============================
 function debugX(text) {
-    console.log(text);
+    // console.log(text);
 }