|
@@ -1,34 +1,41 @@
|
|
|
<script setup name="prepare">
|
|
|
-import searchCop from './components/search.vue'
|
|
|
import excelCop from '@/components/excel.vue'
|
|
|
import treeCop from '@/components/tree.vue'
|
|
|
-import tableCop from './components/table.vue'
|
|
|
+import barChartCop from './components/barChart.vue'
|
|
|
+import lineChartCop from './components/lineChart.vue'
|
|
|
import SubmitBtn from '@/components/SubmitBtn.vue'
|
|
|
-import { ref, nextTick, onActivated, onMounted, reactive } from 'vue'
|
|
|
+import { shallowRef, ref, nextTick, onActivated, onMounted, reactive } from 'vue'
|
|
|
import request from '@/api/axios.js'
|
|
|
+import tools from '@tools/htmlToPdf.js'
|
|
|
import { ElMessage } from 'element-plus'
|
|
|
import util from "@tools/util";
|
|
|
import CurrentScatterChart from './components/current-scatter-chart.vue'
|
|
|
-// import dotRes from '@/data/dot.json'
|
|
|
-// import tableRes from '@/data/table.json'
|
|
|
-// import areaDataRes from '@/data/areaData.json'
|
|
|
/**配置参数 */
|
|
|
const treeHeight = ref(window.innerHeight - 150 + 'px') //tree高度
|
|
|
const excelHeight = ref(window.innerHeight - 150 + 'px') //excel高度
|
|
|
const tableHeight = ref(window.innerHeight - 204 + 'px')
|
|
|
+/** 额定功率 */
|
|
|
+const powerproduction = ref("")
|
|
|
/**excel 开始 */
|
|
|
const excelCheckboxShow = ref(false)
|
|
|
-const excelType = ref('')
|
|
|
const excelCheckIds = ref([])
|
|
|
const excelList = ref([])
|
|
|
const funExcelChange = async (obj) => { //点击excel项时
|
|
|
+ /**次代码供温度功率曲线分析使用 */
|
|
|
+ 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()
|
|
|
+ /**---------------------------- */
|
|
|
activeTab.value = '1'
|
|
|
isChartArea.value = false
|
|
|
- tableShowId.value = obj.id
|
|
|
- tableName.value = obj.name
|
|
|
- excelType.value = obj.type // 接收excel的type 用于控制右侧tab展示
|
|
|
|
|
|
- let res = null
|
|
|
let chartRes = {
|
|
|
scatterhs: [[]],
|
|
|
scatterls: [[]],
|
|
@@ -37,29 +44,9 @@ const funExcelChange = async (obj) => { //点击excel项时
|
|
|
cpz: [[]]
|
|
|
}
|
|
|
let chartResponse = null
|
|
|
- tableLoading.value = true
|
|
|
- if (obj.type === 'process') {
|
|
|
- res = await request.get('/power/process/show', { params: { id: obj.id } })
|
|
|
- } else if (obj.type === 'fitting') {
|
|
|
- activeTab.value = '2'
|
|
|
- res = await request.get('/power/fitting/show', { params: { id: obj.id } })
|
|
|
- // res = tableRes
|
|
|
- // chartResponse = dotRes
|
|
|
+ if (obj.type === 'fitting') {
|
|
|
chartResponse = await request.get('/temperature/curve/analysis', { params: { id: obj.id, p: 1 } })
|
|
|
}
|
|
|
- if(res.code === 200){
|
|
|
- tableColumn.value = res.data.title.map(o => {
|
|
|
- return {
|
|
|
- prop: o.key,
|
|
|
- width: o.des==='时间'? 100: 80,
|
|
|
- label: o.des,
|
|
|
- }
|
|
|
- })
|
|
|
- tableData.value = res.data.data
|
|
|
- tableLoading.value = false
|
|
|
- }else{
|
|
|
- tableLoading.value = false
|
|
|
- }
|
|
|
|
|
|
if (chartResponse && chartResponse.code === 200) {
|
|
|
chartRes = chartResponse.data
|
|
@@ -118,37 +105,30 @@ const funExcelChange = async (obj) => { //点击excel项时
|
|
|
]
|
|
|
}
|
|
|
}
|
|
|
-const funExcelCheckChange = ({ checkArr, data }) => { //bug
|
|
|
+const funExcelCheckChange = ({ checkArr, data }) => {
|
|
|
excelCheckIds.value = checkArr
|
|
|
}
|
|
|
-/**excel fitData */
|
|
|
-const excelFitList = ref([])
|
|
|
/**prepare tree 开始 */
|
|
|
const treeData = ref([])
|
|
|
const actTreeNode = ref(null) //当前激活的treeNode
|
|
|
-const funRepeatMap = (arr, type='prepare') => {
|
|
|
+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 && type === 'process'){ //判断当且仅有process获取tree时 赋值
|
|
|
+ if(!actTreeNode.value){ //判断当且仅有process获取tree时 赋值
|
|
|
actTreeNode.value = o
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return {
|
|
|
...o,
|
|
|
- children: o.children ? funRepeatMap(o.children, type) : []
|
|
|
+ children: o.children ? funRepeatMap(o.children) : []
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
-const funGetTree = async () => {
|
|
|
- const res = await request.get("/power/process/tree")
|
|
|
- treeData.value = funRepeatMap(res.data)
|
|
|
- excelList.value = []
|
|
|
-}
|
|
|
const funCurrentChange = ({ current, currentNode }) => {
|
|
|
excelCheckboxShow.value = true
|
|
|
if (current.childs) {
|
|
@@ -169,28 +149,14 @@ const funCurrentChange = ({ current, currentNode }) => {
|
|
|
excelList.value = []
|
|
|
}
|
|
|
}
|
|
|
-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
|
|
|
-}
|
|
|
|
|
|
/**process tree 开始 */
|
|
|
const processTreeData = ref([])
|
|
|
-const funGetProcessTree = async (flag = true) => { //flag控制是否获取tree的第一项 true为可获取
|
|
|
+const funGetProcessTree = async () => { //flag控制是否获取tree的第一项 true为可获取
|
|
|
actTreeNode.value = null
|
|
|
const res = await request.get("/power/fitting/tree")
|
|
|
- excelFitList.value = []
|
|
|
- processTreeData.value = funRepeatMap(res.data, flag? 'process' : 'prepare') //flag控制对actTreeNode赋值
|
|
|
+ excelList.value = []
|
|
|
+ processTreeData.value = funRepeatMap(res.data) //flag控制对actTreeNode赋值
|
|
|
if(actTreeNode.value){
|
|
|
funProcessCurrentChange({current: actTreeNode.value, currentNode: null})
|
|
|
const child = actTreeNode.value.childs[0]
|
|
@@ -210,7 +176,7 @@ const funGetProcessTree = async (flag = true) => { //flag控制是否获取tree
|
|
|
}
|
|
|
const funProcessCurrentChange = ({ current, currentNode }) => {
|
|
|
if (current.childs) {
|
|
|
- excelFitList.value = current.childs.map(o => {
|
|
|
+ excelList.value = current.childs.map(o => {
|
|
|
return {
|
|
|
id: o.id,
|
|
|
interval: o.interval,
|
|
@@ -224,41 +190,189 @@ const funProcessCurrentChange = ({ current, currentNode }) => {
|
|
|
}
|
|
|
})
|
|
|
} else {
|
|
|
- excelFitList.value = []
|
|
|
+ excelList.value = []
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/**table 开始 */
|
|
|
-const tableShowId = ref('')
|
|
|
-const tableColumn = ref([])
|
|
|
-const tableLoading = ref(false)
|
|
|
-const tableName = ref('')
|
|
|
-const tableData = ref([])
|
|
|
-/**table 结束 */
|
|
|
+/**chart */
|
|
|
+let chartId = 1
|
|
|
+const powerproductionNum = ref(0)
|
|
|
/**search 开始 */
|
|
|
-const funSubmit = async (query) => {
|
|
|
- if (!excelCheckIds.value.length) {
|
|
|
- ElMessage.error('请勾选要预处理的项')
|
|
|
- return false
|
|
|
+const funSubmit = async () => {
|
|
|
+ const tempRes = await request.get('/temperature/rated/power', {
|
|
|
+ params: {
|
|
|
+ ids: excelCheckIds.value.join(','),
|
|
|
+ }
|
|
|
+ })
|
|
|
+ if (tempRes.code === 200) {
|
|
|
+ if (tempRes.data?.length) {
|
|
|
+ for (const chart of tempRes.data) {
|
|
|
+ powerproduction.value = `(额定功率=${chart.power.powerproduction}kW)`
|
|
|
+ powerproductionNum.value = chart.power.powerproduction
|
|
|
+ barxAxis.data = Object.keys(chart.res1)
|
|
|
+ barSeries[0].data = Object.values(chart.res1)
|
|
|
+ barSeries[0].markLine.data = [{
|
|
|
+ yAxis: 0,
|
|
|
+ }]
|
|
|
+ chartId++
|
|
|
+ lineSeries.value = [
|
|
|
+ {
|
|
|
+ type: 'effectScatter',
|
|
|
+ showEffectOn: "emphasis",
|
|
|
+ rippleEffect: {
|
|
|
+ scale: 1
|
|
|
+ },
|
|
|
+ legendHoverLink: false,
|
|
|
+ name: '',
|
|
|
+ symbolSize: 5,
|
|
|
+ data: chart.res2,
|
|
|
+ yAxisIndex: 0,
|
|
|
+ markLine: {
|
|
|
+ symbol: 'none',
|
|
|
+ label: {
|
|
|
+ show: false,
|
|
|
+ },
|
|
|
+ lineStyle: {
|
|
|
+ color: '#F72C5B'
|
|
|
+ },
|
|
|
+ data: [{
|
|
|
+ yAxis: powerproductionNum.value,
|
|
|
+ }]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ chartId++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+/**lineChart */
|
|
|
+const linexAxis = reactive({
|
|
|
+ type: 'value',
|
|
|
+ name: '°C',
|
|
|
+ splitLine: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ axisTick: {
|
|
|
+ show: true
|
|
|
+ },
|
|
|
+ axisLine: {
|
|
|
+ onZero: false
|
|
|
}
|
|
|
- const params = {
|
|
|
- ...query,
|
|
|
- ids: excelCheckIds.value.join(',')
|
|
|
+})
|
|
|
+const lineyAxis = reactive([
|
|
|
+ {
|
|
|
+ type: 'value',
|
|
|
+ name: 'kW',
|
|
|
+ splitLine: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ axisTick: {
|
|
|
+ show: true
|
|
|
+ },
|
|
|
+ axisLine: {
|
|
|
+ onZero: false
|
|
|
}
|
|
|
- const res = await request.get('/power/fitting/data', { params: params })
|
|
|
- if (res.code === 200) {
|
|
|
- ElMessage.success(res.msg)
|
|
|
- funGetProcessTree(false) //阻止获取tree第一项数据及图表
|
|
|
- const excelInfo = res.data
|
|
|
-
|
|
|
- /**拟合完成后 显示右侧图表及数据 */
|
|
|
- funExcelChange({
|
|
|
- id: excelInfo.id,
|
|
|
- name: excelInfo.path.substring(excelInfo.path.indexOf(excelInfo.station + '_') + (excelInfo.station + '_').length),
|
|
|
- type: 'fitting'
|
|
|
- })
|
|
|
+ }
|
|
|
+])
|
|
|
+const lineSeries = ref([])
|
|
|
+const lineDataSet = reactive([
|
|
|
+ {
|
|
|
+ source: []
|
|
|
+ }
|
|
|
+])
|
|
|
+// 圈选散点触发函数
|
|
|
+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: 'kW',
|
|
|
+ splitLine: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ axisTick: {
|
|
|
+ show: true
|
|
|
+ },
|
|
|
+ axisLine: {
|
|
|
+ onZero: false
|
|
|
+ }
|
|
|
+})
|
|
|
+const barSeries = reactive([{
|
|
|
+ name: "",
|
|
|
+ type: "bar",
|
|
|
+ data: [],
|
|
|
+ markLine: {
|
|
|
+ symbol: 'none',
|
|
|
+ label: {
|
|
|
+ show: false,
|
|
|
+ },
|
|
|
+ lineStyle: {
|
|
|
+ color: '#F72C5B'
|
|
|
+ },
|
|
|
+ data: []
|
|
|
+ }
|
|
|
+}])
|
|
|
/**chart Data */
|
|
|
const avgObj = reactive({ //平均cpz等
|
|
|
title: '',
|
|
@@ -277,7 +391,7 @@ const chartRef = ref() //chart 的ref
|
|
|
const seriesData = ref([])
|
|
|
const isChartArea = ref(false) // 用来控制图表是否区域划分
|
|
|
const dataSet = ref('')
|
|
|
-const funChartSelect = async (batch) => {
|
|
|
+const funhotChartSelect = async (batch) => {
|
|
|
const wDataArr = []
|
|
|
const yDataArr = []
|
|
|
let scatterls = []
|
|
@@ -436,10 +550,187 @@ const funChartArea = () => {
|
|
|
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(lineChartCop)
|
|
|
+ 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 = '/temperature/rated/power'
|
|
|
+ break
|
|
|
+ case 'lineChartCop':
|
|
|
+ url = '/temperature/rated/power'
|
|
|
+ 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){
|
|
|
+
|
|
|
+ if(actChartName.value==='barChartCop'){
|
|
|
+ actCopList.value.push({
|
|
|
+ id: chartId,
|
|
|
+ isBrush: false,
|
|
|
+ actCop: shallowRef(barChartCop),
|
|
|
+ title: chart.wt,
|
|
|
+ subtext: `平均功率-额定功率(额定功率=${chart.power.powerproduction}kW)`,
|
|
|
+ xAxis: {
|
|
|
+ ...barxAxis,
|
|
|
+ data: Object.keys(chart.res1)
|
|
|
+ },
|
|
|
+ yAxis: baryAxis,
|
|
|
+ series: [{
|
|
|
+ name: "",
|
|
|
+ type: "bar",
|
|
|
+ data: Object.values(chart.res1),
|
|
|
+ markLine: {
|
|
|
+ symbol: 'none',
|
|
|
+ label: {
|
|
|
+ show: false,
|
|
|
+ },
|
|
|
+ lineStyle: {
|
|
|
+ color: '#F72C5B'
|
|
|
+ },
|
|
|
+ data: [{
|
|
|
+ yAxis: 0,
|
|
|
+ }]
|
|
|
+ }
|
|
|
+ }]
|
|
|
+ })
|
|
|
+ chartId++
|
|
|
+ }
|
|
|
+ if(actChartName.value === 'lineChartCop'){
|
|
|
+ actCopList.value.push({
|
|
|
+ id: chartId,
|
|
|
+ isBrush: false,
|
|
|
+ actCop: shallowRef(lineChartCop),
|
|
|
+ title: chart.wt,
|
|
|
+ subtext: `额定功率温度分析(额定功率=${chart.power.powerproduction}kW)`,
|
|
|
+ xAxis: linexAxis,
|
|
|
+ yAxis: lineyAxis,
|
|
|
+ dataset: lineDataSet,
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ type: 'effectScatter',
|
|
|
+ showEffectOn: "emphasis",
|
|
|
+ rippleEffect: {
|
|
|
+ scale: 1
|
|
|
+ },
|
|
|
+ legendHoverLink: false,
|
|
|
+ name: '',
|
|
|
+ symbolSize: 5,
|
|
|
+ data: chart.res2,
|
|
|
+ yAxisIndex: 0,
|
|
|
+ markLine: {
|
|
|
+ symbol: 'none',
|
|
|
+ label: {
|
|
|
+ show: false,
|
|
|
+ },
|
|
|
+ lineStyle: {
|
|
|
+ color: '#F72C5B'
|
|
|
+ },
|
|
|
+ data: [{
|
|
|
+ yAxis: chart.power.powerproduction,
|
|
|
+ }]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]
|
|
|
+
|
|
|
+ })
|
|
|
+ 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]
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
/**tab */
|
|
|
const activeTab = ref('1')
|
|
|
/**created */
|
|
|
-// funGetTree()
|
|
|
// funGetProcessTree()
|
|
|
/**mounted */
|
|
|
onMounted(() => {
|
|
@@ -460,7 +751,6 @@ onMounted(() => {
|
|
|
})
|
|
|
/**activated */
|
|
|
onActivated(() => {
|
|
|
- // funGetTree()
|
|
|
funGetProcessTree()
|
|
|
})
|
|
|
</script>
|
|
@@ -468,6 +758,27 @@ onActivated(() => {
|
|
|
<div class="bg-white py-[10px] px-[10px]">
|
|
|
<!-- <search-cop class="mb-[20px] shadow rounded-[6px] shadow-blue-500" @submit="funSubmit">
|
|
|
</search-cop> -->
|
|
|
+ <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>
|
|
|
<el-dialog v-model="wtDialog" draggable title="风机功率点位">
|
|
|
<el-tabs v-model="wtTab">
|
|
|
<el-tab-pane label="数据" name="table">
|
|
@@ -492,33 +803,45 @@ onActivated(() => {
|
|
|
<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="true" :height="treeHeight"
|
|
|
- @currentChange="funCurrentChange" @refresh="funGetTree"></tree-cop> -->
|
|
|
<tree-cop :data="processTreeData" :height="treeHeight"
|
|
|
@currentChange="funProcessCurrentChange" @refresh="funGetProcessTree"></tree-cop>
|
|
|
</el-col>
|
|
|
<el-col :span="3">
|
|
|
- <!-- <excel-cop :checkIds="excelCheckIds" :showCheckbox="excelCheckboxShow" :data="excelList" :height="excelHeight"
|
|
|
- @excelChange="funExcelChange" @checkChange="funExcelCheckChange"></excel-cop> -->
|
|
|
- <excel-cop :data="excelFitList" :height="excelHeight" @excelChange="funExcelChange">
|
|
|
+ <excel-cop :data="excelList" :height="excelHeight" @excelChange="funExcelChange">
|
|
|
</excel-cop>
|
|
|
</el-col>
|
|
|
<el-col :span="16">
|
|
|
<div class="px-[10px] shadow rounded-[6px] shadow-blue-500 ">
|
|
|
<!-- <SubmitBtn class="absolute right-[16px] top-[6px] z-10" desc="区域划分" v-if="activeTab === '2' && excelType === 'fitting'" @click="funChartArea"></SubmitBtn> -->
|
|
|
<el-tabs v-model="activeTab">
|
|
|
- <el-tab-pane label="表格数据" name="1">
|
|
|
+ <el-tab-pane label="温度与功率" name="1">
|
|
|
</el-tab-pane>
|
|
|
- <el-tab-pane label="图表展示" name="2" v-if="excelType === 'fitting'">
|
|
|
+ <el-tab-pane label="温度曲线" name="2">
|
|
|
</el-tab-pane>
|
|
|
- <table-cop v-show="activeTab === '1'" :data="tableData" :loading="tableLoading" :column="tableColumn"
|
|
|
- :height="tableHeight" :tableId="tableShowId" :tableName="tableName"></table-cop>
|
|
|
- <div v-show="activeTab === '2'"
|
|
|
+ <div v-show="activeTab === '1'" :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="`平均功率-额定功率 ${powerproduction}`" :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>
|
|
|
+ <line-chart-cop class="" height="100%" width="100%" :xAxis="linexAxis" :yAxis="lineyAxis"
|
|
|
+ :series="lineSeries" :subtext="`额定功率温度分析 ${powerproduction}`" :dataset="lineDataSet"></line-chart-cop>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="activeTab === '2'"
|
|
|
:style="{ height: typeof tableHeight === 'string' ? tableHeight : tableHeight + 'px' }"
|
|
|
class="p-[10px]">
|
|
|
<CurrentScatterChart ref="chartRef" width="100%" :height="`calc( ${tableHeight} - 20px )`" :chartTitle="avgObj.title+ ' ' +'平均Cp值:'+avgObj.cpavg+'; 静风频率:'+avgObj.frequency+'%; 曲线偏差率:'+avgObj.pcratio+'%'"
|
|
|
:xAxisData="xAxisData" :yAxisData="{ splitLine: { show: false } }" :seriesData="seriesData"
|
|
|
- :showLegend="true" :brushSelected="false" :dataSet="dataSet" @getSelected="funChartSelect" />
|
|
|
+ :showLegend="true" :brushSelected="false" :dataSet="dataSet" @getSelected="funhotChartSelect" />
|
|
|
</div>
|
|
|
</el-tabs>
|
|
|
</div>
|