src/utils/time.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exception/FlightInspection.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exception/components/AnalysisCard.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exception/components/CompDialogDetail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exception/components/CompFlightInspection.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/exception/components/DustExceptionText.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/utils/time.js
@@ -1,7 +1,9 @@ /* 时间函数 */ import dayjs from 'dayjs' import lineChart from '@/utils/chartFunction/lineChart.js' import customParseFormat from 'dayjs/plugin/customParseFormat' import dayjs from 'dayjs' dayjs.extend(customParseFormat) export default { // 判断已选的月份是否大于当前月份 judgeDateValid(date) { @@ -83,7 +85,26 @@ return time }, /** * 返回有效的时间点 * @param:扬尘数据 * @returns:升序的时间点 */ validTime(dustData) { // 参数为空则退出 if (!dustData.length) { return [] } let time = [] dustData.forEach((item) => { if (item.flag != 'A') { time.push(item.lst) } }) return time }, /** * 取指定间隔的时间为连续时间,放在数组中。 孤立的时间点与自身算一个连续 * 目的是构造有效率缺失的颜色背景区间 @@ -142,5 +163,81 @@ result.push(temp) } return result }, /** *判断是否是有意义的日期 * @param: * @returns: */ judgeTimeValid(time) { let r1 = dayjs(time, 'YYYY-MM-DD HH:mm:ss', true).isValid() let r2 = dayjs(time, 'YYYY-MM-DD', true).isValid() // 两种日期格式都无效时 if (!r1 && !r2) { return false } // 符合任意一种格式 return true }, /** * 'YYYY-MM-DD HH:mm:ss'返回true * @param: * @returns: */ judgeTimeFormat(time) { // 'YYYY-MM-DD HH:mm:ss' const dateTimeRegex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/ // 'YYYY-MM-DD' const dateRegex = /^\d{4}-\d{2}-\d{2}$/ if (dateTimeRegex.test(time)) { return true } else if (dateRegex.test(time)) { return false } }, /** * 找到在给定的开始时间bt和结束时间et之间缺失的时间区间 * @param:开始时间,结束时间,在这个时间范围内已有的时间(时间字符串数组),数组中时间的间隔 * @returns: */ getMissingDays(bt, et, timeArr, minutesNum = 1440) { // 判断日期是否有意义 if (!this.judgeTimeValid(bt) || !this.judgeTimeValid(et)) { return false } // 存储缺失的时间区间 const r = [] const begin = dayjs(bt) const end = dayjs(et) // 开始时间 let current = begin for (const time of timeArr) { const currentTime = dayjs(time) if (currentTime.isBefore(current)) { continue } if (currentTime.isAfter(current)) { r.push([current, currentTime]) } current = currentTime.add(minutesNum, 'minute') } if (end.isAfter(current)) { r.push([current, end]) } let f = this.judgeTimeFormat(bt) ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD' for (let i = 0; i < r.length; i++) { for (let j = 0; j < r[i].length; j++) { r[i][j] = r[i][j].format(f) } } return r } } src/views/exception/FlightInspection.vue
@@ -1,1353 +1,12 @@ <!-- <script> import CompFlightInspection from '@/views/exception/components/CompFlightInspection.vue' export default { components: { CompFlightInspection }, data() { return{ } }, mounted() { }, methods: { } <script> import CompFlightInspection from '@/views/exception/components/CompFlightInspection.vue' export default { components: { CompFlightInspection } } </script> <template> <CompFlightInspection :show-all="true"> </CompFlightInspection> <CompFlightInspection :show-all="true"> </CompFlightInspection> </template> <style scoped> </style> --> <script> import { defineAsyncComponent } from 'vue' import TimeShortCuts from '@/sfc/TimeShortCuts.vue' import { useCommonFunction } from '@/utils/common.js' import AreaAndmonitorType from '@/sfc/AreaAndmonitorType.vue' import ButtonClick from '@/sfc/ButtonClick.vue' import index from '@/utils/exception_common_function/index.js' // 异常图形异步组件 const DustLineChart = defineAsyncComponent(() => import('@/views/exception/components/DustLineChart.vue')) import exceptionApi from '@/api/exceptionApi.js' import dayjs from 'dayjs' import { ElMessage } from 'element-plus' import AnalysisCard from '@/views/exception/components/AnalysisCard.vue' import DutyCompany from '@/sfc/DutyCompany.vue' import StreetInfo from '@/sfc/StreetInfo.vue' import historyApi from '@/api/historyApi.js' import time from '@/utils/time.js' import lineChart from '@/utils/chartFunction/lineChart.js' import exceptionOption from '@/utils/chartFunction/exceptionOption.js' import exception0 from '@/assets/exception/exception0.png' import exception1 from '@/assets/exception/exception1.png' import exception2 from '@/assets/exception/exception2.png' import exception3 from '@/assets/exception/exception3.png' import exception4 from '@/assets/exception/exception4.png' import exception5 from '@/assets/exception/exception5.png' import exception6 from '@/assets/exception/exception6.png' import exception7 from '@/assets/exception/exception7.png' import CompDialogDetail from '@/views/exception/components/CompDialogDetail.vue' export default { props: { // 点位名字 siteName: { type: String, default: '' }, // 日时间或者月时间 time:{ type:String, default:'' }, // 展示页面的全部 showAll: { type: Boolean, default: true }, // 0代表日时间,1代表月时间 timeType:{ type:Number, default:-1 } }, components: { TimeShortCuts, DustLineChart, ButtonClick, AreaAndmonitorType, AnalysisCard, DutyCompany, StreetInfo, CompDialogDetail }, data() { return { // 表单内容 form: { // 站点名称 name: '', // 运维商 dutyCompany: [], // 街道 street: [], // 选择的异常类型 exceptionName: [] }, beginTime: '', endTime: '', // 返回的数据 tableData: [], // 表格展示的数据 displayData: [], // 表格高度 tableHeight: 400, // 表格显示 isTableShow: false, // 审核辅助按钮显示 auditButton: false, // 当前页 currentPage: 1, // 每页条数 pageSize: 20, // 表格的总记录数 total: 0, // 查询按钮无数据时 isNoData: { exception0: true, exception1: true, exception2: true, exception3: true, exception4: true, exception5: true, exception6: true, exception7: true, exception8: true }, // eslint-disable-next-line no-undef // 对话框显示 dialogTableVisible: false, // 保存异常对应的店铺名称和设备编号 exception: { // 断电或断网 exception0: [], // 数据超低 exception1: [], // 超标 exception2: [], // 数据长时段无波动 exception3: [], // 量级突变异常 exception4: [], // 临近超标异常 exception5: [], // 单日超标次数临界异常 exception6: [], // 滑动平均值异常 exception7: [], // 有效率异常 exception8: [], // 该时段的异常数量 exception0Num: 0, exception1Num: 0, exception2Num: 0, exception3Num: 0, exception4Num: 0, exception5Num: 0, exception6Num: 0, exception7Num: 0, exception8Num: 0 }, // 站点总数量 siteTotal: 0, // 选中表格当前行的数据 tableCurrentRowData: null, // 选中表格当前行的索引 selectedRowIndex: -2, // 页面上的按钮加载状态 loading: { // 查询按钮 queryButton: false, // 表格加载中 tableLoading: false, // 上一条按钮 preButton: false, // 下一条按钮 afterButton: false, // 折线图 lineChart: false }, dialog: { // 打开对话框请求该区间的历史数据 historyData: [], // 该时间段的异常条数 exceptionTotal: 0, // 折线图配置项 option: {}, // ’上一条‘按钮是否可以被点击状态 isPreCantouch: false, // ’下一条‘按钮是否可以被点击状态 isNextCantouch: false, // 异常的前中后区间所有数据 allExceptionTimeData: [] }, // 标记位 flag: { // 数据加载时 上下条按钮不能再点击 banTouch: 0, // 0代表分页,1代表不分页 originClick: 0 }, areaColor: null } }, setup() { const { isExceedOneMonth } = useCommonFunction() return { isExceedOneMonth } }, // 监听 判断按钮是否可点击 watch: { selectedRowIndex(newVaue) { // 处于表格的最后一条数据 设置‘上一条’按钮不可点 if (newVaue === 0) { this.dialog.isPreCantouch = true //用户先点了第一条,pre为true,然后点击最后一条,next为true。此时两个按钮都被封锁 if (this.dialog.isNextCantouch == true) { this.dialog.isNextCantouch = false } } // 处于表格第一条数据 设置‘上一条’按钮不可点 else if (newVaue === this.displayData.length - 1) { this.dialog.isNextCantouch = true //用户先点了表格最后一条,next为true,然后点击第一条,pre为true。此时两个按钮都被封锁 if (this.dialog.isPreCantouch == true) { this.dialog.isPreCantouch = false } } // 处于表格的中间行 将按钮设置为可点击状态 else { this.dialog.isPreCantouch = false this.dialog.isNextCantouch = false } }, dialogTableVisible() { window.addEventListener('resize', this.updateChart) }, // 页面加载时showAll才会变化一次 // 为true表示的飞行巡检页面 showAll(){ if(this.showAll){ this.backExceptionDataAWeekAgo() } }, // siteName(){ // if(this.siteName!=''){ // this.beginTime = dayjs(this.month).startOf('month').format('YYYY-MM-DD HH:mm:ss') // this.endTime = dayjs(this.month).endOf('month').format('YYYY-MM-DD HH:mm:ss') // this.backExceptionDataAWeekAgo() // this.getShopNames() // } // }, timeType(){ if(this.timeType == '0'){ this.beginTime = dayjs(this.time).format('YYYY-MM-DD 00:00:00') this.endTime = dayjs(this.time).format('YYYY-MM-DD 23:59:59') }else if(this.timeType == '1'){ this.beginTime = dayjs(this.time).startOf('month').format('YYYY-MM-DD HH:mm:ss') this.endTime = dayjs(this.time).endOf('month').format('YYYY-MM-DD HH:mm:ss') } this.backExceptionDataAWeekAgo() this.getShopNames() }, watch:{ dialogTableVisible:{ handler(newValue){ console.log('真假1',this.dialogTableVisible); } } }, }, computed: { exceptionAllNum() { let sum = this.exception.exception0Num + this.exception.exception1Num + this.exception.exception2Num + this.exception.exception3Num + this.exception.exception4Num + this.exception.exception5Num + this.exception.exception6Num + this.exception.exception7Num + this.exception.exception8Num if (sum == 0) { return 1 } else { return sum } }, long_time_notchange() { let sum = this.exception.exception0Num + this.exception.exception1Num + this.exception.exception2Num + this.exception.exception3Num + this.exception.exception4Num + this.exception.exception5Num + this.exception.exception6Num + this.exception.exception7Num + this.exception.exception8Num if (sum == 0) { return 0 } else { return ( 100 - (this.exception.exception0Num / this.exceptionAllNum) * 100 - (this.exception.exception1Num / this.exceptionAllNum) * 100 - (this.exception.exception2Num / this.exceptionAllNum) * 100 - (this.exception.exception4Num / this.exceptionAllNum) * 100 - (this.exception.exception5Num / this.exceptionAllNum) * 100 - (this.exception.exception6Num / this.exceptionAllNum) * 100 - (this.exception.exception7Num / this.exceptionAllNum) * 100 - (this.exception.exception8Num / this.exceptionAllNum) * 100 ).toFixed(1) } }, // 第一排卡片 cardRow() { return [ { siteName: this.exception.exception4, exceptionType: '4', exceptionName: '量级突变', iconSrc: exception4, siteNum: this.exception.exception4.length, exceptionNum: this.exception.exception4Num, isNoDataStatus: this.isNoData.exception4, span: 5 }, { siteName: this.exception.exception5, exceptionType: '5', exceptionName: '临近超标异常', iconSrc: exception5, siteNum: this.exception.exception5.length, exceptionNum: this.exception.exception5Num, isNoDataStatus: this.isNoData.exception5, span: 5 }, { siteName: this.exception.exception8, exceptionType: '8', exceptionName: '有效率异常', iconSrc: exception0, siteNum: this.exception.exception8.length, exceptionNum: this.exception.exception8Num, isNoDataStatus: this.isNoData.exception8, span: 5 }, { siteName: this.exception.exception6, exceptionType: '6', exceptionName: '单日超标次数临界异常', iconSrc: exception6, siteNum: this.exception.exception6.length, exceptionNum: this.exception.exception6Num, isNoDataStatus: this.isNoData.exception6, span: 5 }, { siteName: this.exception.exception7, exceptionType: '7', exceptionName: '变化趋势异常', iconSrc: exception7, siteNum: this.exception.exception7.length, exceptionNum: this.exception.exception7Num, isNoDataStatus: this.isNoData.exception7, span: 4 }, { siteName: this.exception.exception0, exceptionType: '0', exceptionName: '数据缺失异常', iconSrc: exception0, siteNum: this.exception.exception0.length, exceptionNum: this.exception.exception0Num, isNoDataStatus: this.isNoData.exception0, span: 6 }, { siteName: this.exception.exception1, exceptionType: '1', exceptionName: '数据超低', iconSrc: exception1, siteNum: this.exception.exception1.length, exceptionNum: this.exception.exception1Num, isNoDataStatus: this.isNoData.exception1, span: 6 }, { siteName: this.exception.exception2, exceptionType: '2', exceptionName: '超标', iconSrc: exception2, siteNum: this.exception.exception2.length, exceptionNum: this.exception.exception2Num, isNoDataStatus: this.isNoData.exception2, span: 6 }, { siteName: this.exception.exception3, exceptionType: '3', exceptionName: '数据长时段无波动', iconSrc: exception3, siteNum: this.exception.exception3.length, exceptionNum: this.exception.exception3Num, isNoDataStatus: this.isNoData.exception3, span: 6 } ] }, }, mounted() { this.getSiteNume() // 飞行巡检页面,进去加载 if(this.showAll == true){ this.backExceptionDataAWeekAgo() this.getShopNames() } }, methods: { /** * 有效率异常 设置折线图配置项 * @param: * @returns: */ validProcess() { // x轴数据 let xList = time.ascTime( this.tableCurrentRowData.beginTime, this.tableCurrentRowData.endTime, 15 ) // y轴数据 let yList = [] xList.forEach((item) => { // 查找该时间的数据 let r = lineChart.findDate(this.dialog.historyData, item) if (r) { yList.push(r.dustValue) } else { yList.push(null) } }) // 颜色背景区间 // 得到无数据的时间点或flag不等于N的时间点 let noDataTime = time.invalidTime(this.dialog.historyData, xList) let rangeTime = time.seriesTime(noDataTime, 15) // let rangeTime_1 = time.splitTime(rangeTime) // 得到背景区间的配置 let areaObj = lineChart.getMarkArea(rangeTime, '异常') // let lineColor = lineChart.getLineColor(rangeTime,xList) let lineColor = [] // console.log('线段',lineColor); // 传入参数 this.dialog.option = exceptionOption.setExceptionChartOption( xList, yList, '', '', '', '', this.tableCurrentRowData.exception, areaObj, lineColor, this.tableCurrentRowData.exceptionType ) }, getImageUrl(name) { return new URL(`../../lib/Carousel/assets/${name}`, import.meta.url).href }, // 放回站点总数量 getSiteNume() { exceptionApi.getSitesNum().then((res) => { this.siteTotal = res.data.data.length }) }, /** * description:点击异常站点名字时 返回的数据 * @param: * @createTime:2023-08-17 * @returns: */ getAbnormalDataByClick(val) { this.flag.originClick = 1 // 显示表格 this.isTableShow = true this.tableData = val this.total = this.tableData.length // 默认显示第一页 this.handleCurrentChange(1) }, // 点击表格的行时 selectTableRow() { // 获取当前行的索引 this.selectedRowIndex = this.displayData.indexOf(this.tableCurrentRowData) }, /** * description:断电或断网时设置的表格数据 */ setOfflineTbleData() { // 无数据时的时间数组 时间相差15分钟 const abnormalTimeTenMinute = index.descFiftyTime( this.tableCurrentRowData.beginTime, this.tableCurrentRowData.endTime ) // 保存无数据时表格条数 this.dialog.exceptionTotal = abnormalTimeTenMinute.length // 去除供电异常和掉线区间的第一个有元素的值 this.dialog.historyData = [] for (let i = 0; i < abnormalTimeTenMinute.length; i++) { this.dialog.historyData.push({ name: this.tableCurrentRowData.name, mnCode: this.tableCurrentRowData.mnCode, dutyCompany: this.tableCurrentRowData.dutyCompany, lst: abnormalTimeTenMinute[i], dustValue: '' }) } }, // 段电或断网区间无数据,需要补充。其他的都有数据,直接一次请求全部时段就好 // 根据异常区间构造前后端首尾 前区间 中间区间 后区间 // 判断是段电或断网?是则请求前后区间,否则只请求一次完整的 // 得到最终数据 // 再判断异常种类 ,进行设置配置项 /** * description:一次请求回前中后区间的数据,对数据进行分析 * @param: 前中后区间的请求参数,前中后的总区间时间,异常开始时间,一场结束时间 */ otherExceptionRequest(allTimeArgs, allTime, exceptionBT, exceptionET) { // 折线图加载中效果 this.loading.lineChart = true historyApi.queryHistoryData(allTimeArgs).then((result) => { this.dialog.allExceptionTimeData = result.data.data // 数据缺失异常时重新设置表格 if (this.tableCurrentRowData.exceptionType == '0') { this.setOfflineTbleData() } // x轴日期时间 let dateList = [] // y轴 超标油烟浓度 let dustValue = [] let timeAndValue = {} // 从添加了首位区间的开始和结束时间进行遍历 保证时间以15分钟为间隔 timeAndValue = index.keepContinuousByEachFiftyMinutes( allTime[0], allTime[3], this.dialog.allExceptionTimeData ) dateList = timeAndValue['xAxis'] dustValue = timeAndValue['yAxis'] // 提取异常起始时间点在整个区间内的数据索引 let startIndex = dateList.findIndex((item) => item === exceptionBT) let endIndex = dateList.findIndex((item) => item === exceptionET) // 设置折线图配置项 // this.reSetChart(dateList, dustValue, exceptionBT, exceptionET, startIndex, endIndex) this.dialog.option = exceptionOption.setExceptionChartOption( dateList, dustValue, exceptionBT, exceptionET, startIndex, endIndex, this.tableCurrentRowData.exception, '', '', this.tableCurrentRowData.exceptionType ) this.flag.banTouch = 0 this.loading.lineChart = false }) }, /** * description:划分出异常起始时间,构造请求前中后的参数 */ timeAndDataProcessed() { //异常的开始时间 结束时间 let exceptionBeginTime = this.tableCurrentRowData.beginTime let exceptionEndTime = this.tableCurrentRowData.endTime // beforeAndAfterTime[0]:前45分钟的时间点 // beforeAndAfterTime[1]:前15分钟的时间点 // beforeAndAfterTime[2]:后15分钟的时间点 // beforeAndAfterTime[3]:后45分钟的时间点 let beforeAndAfterTime = index.before45AndAfter45(exceptionBeginTime, exceptionEndTime) // 构造异常时间前后区间数据请求参数(除了断网中都用到) let paramsAllTime = index.requestGetParms( this.tableCurrentRowData.name, beforeAndAfterTime[0], beforeAndAfterTime[3] ) // 将异常数据进行预处理,随后将结果作为折线图的配置项 this.otherExceptionRequest( paramsAllTime, beforeAndAfterTime, exceptionBeginTime, exceptionEndTime ) }, /** * description:获取下一条异常信息 */ getPreviousRowData() { // // 不是表格的最后一行 if (this.selectedRowIndex < this.displayData.length - 1) { // 点击过程中 锁住上下条按钮 在设置完图形配置项后解锁 this.flag.banTouch = 1 //得到上一行数据索引 this.selectedRowIndex = this.selectedRowIndex + 1 // 得到上一行的数据 this.tableCurrentRowData = this.displayData[this.selectedRowIndex] this.loading.preButton = true historyApi .queryHistoryData({ siteName: this.tableCurrentRowData.name, beginTime: this.tableCurrentRowData.beginTime, endTime: this.tableCurrentRowData.endTime }) .then((response) => { // 保存返回的超标数据 this.dialog.historyData = response.data.data this.dialog.exceptionTotal = response.data.data.length // 逻辑处理 if (this.tableCurrentRowData.exceptionType != '8') { this.timeAndDataProcessed() } else { this.loading.lineChart = true this.validProcess() this.loading.lineChart = false this.flag.banTouch = 0 } this.loading.preButton = false }) } }, /** * description:获取下一条异常信息 */ getNextRowData() { // 不是表格的第一行 if (this.selectedRowIndex !== 0) { // 点击过程中 锁住上下条按钮 在设置完图形配置项后解锁 this.flag.banTouch = 1 //得到上一行数据索引 this.selectedRowIndex = this.selectedRowIndex - 1 // 得到上一行的数据 this.tableCurrentRowData = this.displayData[this.selectedRowIndex] this.loading.afterButton = true historyApi .queryHistoryData({ siteName: this.tableCurrentRowData.name, beginTime: this.tableCurrentRowData.beginTime, endTime: this.tableCurrentRowData.endTime }) .then((response) => { // 保存返回的超标数据 this.dialog.historyData = response.data.data this.dialog.exceptionTotal = response.data.data.length // 逻辑处理 if (this.tableCurrentRowData.exceptionType != '8') { this.timeAndDataProcessed() } else { this.loading.lineChart = true this.validProcess() this.loading.lineChart = false this.flag.banTouch = 0 } this.loading.afterButton = false }) } }, /** * description:从子组件获得某站点该时段的异常数据 * @createTime:2023-08-18 */ backExceptionData(val1, val2) { this.displayData = val1 this.total = val2 }, // 查询异常数据的站点名字和数量 queryExceptionSite(url, exceptionType) { let params = {} params['beginTime'] = this.beginTime params['endTime'] = this.endTime params['exceptionType'] = exceptionType if(this.siteName){ params['siteName'] = this.siteName } // if (this.form.street.length != 0) { // params['street'] = this.form.street.join() // } if (this.form.dutyCompany.length != 0) { params['dutyCompany'] = this.form.dutyCompany.join() } return this.$http.get(url, { params: params }) }, /** * description:当用户改变查询的时间区间时,会根据该区间查询各异常的站点,查询该时间区间的各异常数量 * @createTime:2023-08-18 */ getShopNames() { /* 查询异常的站点 */ this.queryExceptionSite('/dust/sitenamecode', 0).then((result) => { this.exception.exception0 = result.data.data if (result.data.data.length == 0) { this.isNoData.exception0 = true return } this.isNoData.exception0 = false }) this.queryExceptionSite('/dust/sitenamecode', 1).then((result) => { this.exception.exception1 = result.data.data if (result.data.data.length == 0) { this.isNoData.exception1 = true return } this.isNoData.exception1 = false }) this.queryExceptionSite('/dust/sitenamecode', 2).then((result) => { this.exception.exception2 = result.data.data if (result.data.data.length == 0) { this.isNoData.exception2 = true return } this.isNoData.exception2 = false }) this.queryExceptionSite('/dust/sitenamecode', 3).then((result) => { this.exception.exception3 = result.data.data if (result.data.data.length == 0) { this.isNoData.exception3 = true return } this.isNoData.exception3 = false }) this.queryExceptionSite('/dust/sitenamecode', 4).then((result) => { this.exception.exception4 = result.data.data if (result.data.data.length == 0) { this.isNoData.exception4 = true return } this.isNoData.exception4 = false }) this.queryExceptionSite('/dust/sitenamecode', 5).then((result) => { this.exception.exception5 = result.data.data if (result.data.data.length == 0) { this.isNoData.exception5 = true return } this.isNoData.exception5 = false }) this.queryExceptionSite('/dust/sitenamecode', 6).then((result) => { this.exception.exception6 = result.data.data if (result.data.data.length == 0) { this.isNoData.exception6 = true return } this.isNoData.exception6 = false }) this.queryExceptionSite('/dust/sitenamecode', 7).then((result) => { this.exception.exception7 = result.data.data if (result.data.data.length == 0) { this.isNoData.exception7 = true return } this.isNoData.exception7 = false }) this.queryExceptionSite('/dust/sitenamecode', 8).then((result) => { this.exception.exception8 = result.data.data if (result.data.data.length == 0) { this.isNoData.exception8 = true return } this.isNoData.exception8 = false }) /* 异常异常数量 */ this.queryExceptionSite('/dust/exceptionnum', 0).then((result) => { this.exception.exception0Num = result.data.data }) this.queryExceptionSite('/dust/exceptionnum', 1).then((result) => { this.exception.exception1Num = result.data.data }) this.queryExceptionSite('/dust/exceptionnum', 2).then((result) => { this.exception.exception2Num = result.data.data }) this.queryExceptionSite('/dust/exceptionnum', 3).then((result) => { this.exception.exception3Num = result.data.data }) this.queryExceptionSite('/dust/exceptionnum', 4).then((result) => { this.exception.exception4Num = result.data.data }) this.queryExceptionSite('/dust/exceptionnum', 5).then((result) => { this.exception.exception5Num = result.data.data }) this.queryExceptionSite('/dust/exceptionnum', 6).then((result) => { this.exception.exception6Num = result.data.data }) this.queryExceptionSite('/dust/exceptionnum', 7).then((result) => { this.exception.exception7Num = result.data.data }) this.queryExceptionSite('/dust/exceptionnum', 8).then((result) => { this.exception.exception8Num = result.data.data }) }, /** * description:显示对话框,返回该异常时间段的所有数据 * @param:点击‘查看详情’的该行所有字段数据 * @createTime:2023-08-18 */ showDialog(row) { // 打开对话框 this.dialogTableVisible = true // 保存当前行数据 this.tableCurrentRowData = row // // 获取当前行的索引 // this.selectedRowIndex = this.displayData.indexOf(row) // //根据当前行的编号,起始时间来 请求异常数据 // // 对请求到的数据进行首尾拼接 // // 得到前后完整数据进行绘制图形 // historyApi // .queryHistoryData({ // siteName: row.name, // beginTime: row.beginTime, // endTime: row.endTime // }) // .then((response) => { // // 保存返回的超标数据 // this.dialog.historyData = response.data.data // this.dialog.exceptionTotal = response.data.data.length // // 逻辑处理 // if (this.tableCurrentRowData.exceptionType != '8') { // this.timeAndDataProcessed() // } else { // this.loading.lineChart = true // this.validProcess() // this.loading.lineChart = false // this.flag.banTouch = 0 // } // }) }, /** * description:条件查询异常的数据 * @createTime:2023-08-18 */ handleSubmit() { if (this.isExceedOneMonth(this.beginTime, this.endTime)) { alert('时间跨度不能超过一个月') return } // 更新异常分析 this.getShopNames() this.loading.queryButton = true this.flag.originClick = 0 this.loading.tableLoading = true let params = {} params['page'] = this.currentPage params['pageSize'] = this.pageSize if (this.siteName) { params['siteName'] = this.siteName } // if (this.form.street.length != 0) { // params['street'] = this.form.street.join() // } if (this.form.dutyCompany.length != 0) { params['dutyCompany'] = this.form.dutyCompany.join() } params['beginTime'] = this.beginTime params['endTime'] = this.endTime this.$http.get('/dust/exceptiondata2', { params: params }).then((response) => { // 保存返回的 this.displayData = response.data.data.rows this.loading.queryButton = false this.loading.tableLoading = false if (response.data.data.total == 0) { ElMessage('该时段无数据') this.isTableShow = false return } this.isTableShow = true this.total = response.data.data.total // 移除空数据状态 }) }, /** * description:打开页面默认加载最近一周的异常数据 * @createTime:2023-08-18 */ backExceptionDataAWeekAgo() { this.loading.tableLoading = true let params = {} if (this.siteName) { params['siteName'] = this.siteName } params['beginTime'] = this.beginTime params['endTime'] = this.endTime console.log('name',this.siteName) this.$http.get('/dust/exceptiondata', { params: params }).then((response) => { // 保存返回的 // this.tableData = response.data.data.rows; this.displayData = response.data.data.rows this.loading.tableLoading = false if (response.data.data.total == 0) { ElMessage('该时段无数据') this.isTableShow = false return } this.isTableShow = true this.total = response.data.data.total }) }, /** * description:将中国标准时间转为指定格式(该组件返回的标准时间的格式,所以必须的加这个函数) * @createTime:2023-08-17 */ giveTime(val) { this.beginTime = dayjs(val[0]).format('YYYY-MM-DD HH:mm:ss') this.endTime = dayjs(val[1]).format('YYYY-MM-DD HH:mm:ss') }, // 功能:表格高度根据内容自适应 calTableHeight() { const h1 = this.$refs.h1.$el.offsetHeight const h2 = this.$refs.h2.$el.offsetHeight const h3 = this.$refs.h3.$el.offsetHeight const h4 = this.$refs.h4.$el.offsetHeight // 其中一个40是盒子的总外边距 this.tableHeight = `calc(100vh - ${h1}px - ${h2}px - ${h3}px - ${h4}px - 40px - var(--el-main-padding) * 2)` }, // 页大小改变时触发 handleSizeChange(val) { this.pageSize = val // 改变每页显示数目时跳到当前页 this.handleCurrentChange(1) }, // 页号改变时触发 /** * description:页号改变时触发 * @param: 当前页,标记位(0代表是点击‘查询’触发的,1代表时点击异常站点文本按钮触发的) * @createTime:2023-08-17 * @returns: */ handleCurrentChange(val) { // 将当前页号给currentPage this.currentPage = val // 页面变化时调用 查询数据函数 if (this.flag.originClick == 0) { this.handleSubmit() } else if (this.flag.originClick == 1) { const startIndex = (val - 1) * this.pageSize const endIndex = startIndex + this.pageSize this.displayData = this.tableData.slice(startIndex, endIndex) } }, // 表格序号递增 indexMethod1(index) { return index + 1 + (this.currentPage - 1) * this.pageSize }, // 表格序号递增 indexMethod2(index) { return index + 1 } } } </script> <template> <div class="all-container"> <el-row ref="h1"> <el-col> <el-form :inline="true"> <div class="head-container-text"> <el-form-item> <AreaAndmonitorType></AreaAndmonitorType> </el-form-item> <el-form-item v-show="!showAll"> <span class="site-text"> 点位名称:</span> <span> {{ this.siteName }}</span> </el-form-item> <el-form-item v-show="showAll"> <DutyCompany @submitDutyCompanyValue="(n) => (form.dutyCompany = n)"> </DutyCompany> </el-form-item> <!-- <el-form-item v-show="showAll"> <StreetInfo @submitStreetValue="(n) => (form.street = n)"> </StreetInfo> </el-form-item> --> <el-form-item> <TimeShortCuts timeType="day" @submit-time="giveTime" :beginAndEndTime="[beginTime,endTime]"></TimeShortCuts> </el-form-item> <el-form-item> <ButtonClick content="风险评估" type="warning" color="rgb(12,104,165)" :loading="loading.queryButton" :havaIcon="false" @do-search="handleSubmit" ><img src="@/assets/exception/riskButton.png" height="24" class="img-button" /></ButtonClick> </el-form-item> </div> </el-form> </el-col> </el-row> <!-- 时间摘要 --> <el-row class="head-describtion-text" ref="h2"> <el-row> <span> 金山区 {{ beginTime }} —— {{ endTime }} 扬尘监测异常信息汇总</span> </el-row> </el-row> <!-- 异常分析 --> <el-row ref="h3"> <el-col> <el-card class="card-container"> <template #header> <div class="card-header">异常分析</div> </template> <el-row :gutter="20"> <el-col v-for="item in cardRow" :key="item.exceptionType" :span="item.span"> <AnalysisCard :site-name="item.siteName" :exception-type="item.exceptionType" :begin-time="beginTime" :end-time="endTime" :exception-name="item.exceptionName" :site-num="item.siteNum" :exception-num="item.exceptionNum" :exception-all-num="exceptionAllNum" :site-num-all="siteTotal" :isNoDataStatus="item.isNoDataStatus" :icon="item.iconSrc" @get-abnormal-data-by-click="getAbnormalDataByClick" class="card-row" > > </AnalysisCard> </el-col> </el-row> </el-card> </el-col> </el-row> <el-button-group> <el-button color="#626aef" plain @click="isTableShow = true" v-show="!isTableShow"> 显示异常清单<el-icon class="i-ep-Arrow"><i-ep-ArrowUp /></el-icon> </el-button> <el-button color="#626aef" plain @click="isTableShow = false" v-show="isTableShow"> 隐藏异常清单<el-icon class="i-ep-Arrow"><i-ep-ArrowDown /></el-icon> </el-button> </el-button-group> <!-- 表格 --> <el-row v-show="isTableShow"> <el-col> <el-table ref="table" :data="displayData" :height="tableHeight" :highlight-current-row="true" size="default" v-loading="loading.tableLoading" border > <el-table-column type="index" label="序号" width="60px" align="center" fixed :index="indexMethod1" /> <el-table-column prop="name" label="点位名称" show-overflow-tooltip /> <el-table-column prop="mnCode" label="设备编码" align="center" show-overflow-tooltip /> <el-table-column prop="exception" label="异常类型" align="center" show-overflow-tooltip /> <el-table-column prop="region" label="区县" align="center" show-overflow-tooltip /> <el-table-column prop="beginTime" label="开始时间" align="center" show-overflow-tooltip /> <el-table-column prop="endTime" label="结束时间" align="center" show-overflow-tooltip /> <el-table-column prop="typename" label="场景" align="center" width="82" show-overflow-tooltip /> <el-table-column prop="address" label="地址" align="center" show-overflow-tooltip /> <el-table-column prop="dutyCompany" label="运维商" align="center" show-overflow-tooltip /> <el-table-column label="操作" align="center"> <template #default="{ row }"> <el-button type="primary" class="table-button" @click="showDialog(row)" >查看详情</el-button > </template> </el-table-column> </el-table> <el-pagination ref="h4" background layout="total, sizes, prev, pager, next, jumper" v-model:current-page="currentPage" v-model:page-size="pageSize" :total="total" :page-sizes="[10, 20, 50, 100]" @size-change="handleSizeChange" @current-change="handleCurrentChange" > </el-pagination> </el-col> </el-row> <CompDialogDetail :row="tableCurrentRowData" v-model="dialogTableVisible"/> </div> </template> <style lang="scss" scoped> .el-row { margin-left: 10px; } /* 条件查询模块的样式 */ .el-form { margin: 10px; } img { margin-right: 5px; } .head-container-search { float: right; } .head-describtion-text { justify-content: flex-end; margin-bottom: 2px; margin-right: 20px; font-size: 14px; color: gray; } .button-set { margin: 10px; } /* 条件查询模块结束 */ /* 异常分析模块的样式 */ .card-text1 { /* 黑体的异常名字部分 */ margin: 10px; } .card-text1 + div { /* 黑体的异常名字下面的 */ margin: 12px; } .card-exception-buttom { /* 异常站点文本按钮区域 */ padding: 11px; } .card-header { margin-left: 5px; font-size: 18px; font-weight: bold; } .card-content-unnormal { min-height: 200px; border: 2px solid #ffcf8b; border-radius: 20px; } .card-content-normal { min-height: 200px; border: 2px solid red; border-radius: 20px; } .card-header-text { font-size: 16px; font-weight: bold; margin-top: 4px; margin-left: 4px; } .card-content-text { white-space: nowrap; } .card-exceptionname-text1 { /* 异常站点占比 */ font-size: 14px; white-space: nowrap; } .card-exceptionname-text2 { /* 异常数占比的外边距 */ font-size: 14px; white-space: nowrap; } .text-blank { /* 逗号 */ margin-right: 10px; color: #000000; } .card-row { margin-bottom: 10px; } /* 异常分析模块结束 */ /* 隐藏表格按钮组样式 */ .el-button-group { margin: 10px 0px 10px 10px; } .i-ep-Arrow { margin-left: 6px; margin-bottom: 2px; font-size: 1.2em; } /* 隐藏表格按钮组样式结束 */ /* 表格模块的样式 */ .el-table { color: #333333; } /* 表格模块结束 */ /* 查看详情对话框模块的样式 */ .diag-head { /* 对话框头部区域 */ min-height: 200px; } .diag-head-text1 { /* 对话框头部的属性字段加粗 */ font-weight: bold; } .diag-head-text > div { /* 对话框异常时间段 */ margin-top: 15px; } .diag-head-text { margin: 10px; padding: 10px; background: linear-gradient(90deg, #00c9ff 0%, #92fe9d 100%); border: 2px solid #7bc0fc; } .chart-jump-button { display: flex; justify-content: right; } .mx-1 { /* position: absolute; left: 10px; bottom: 10px; */ justify-content: flex-start; } .dialog-footer{ display: flex; } .dialog-footer-text { justify-content: flex-end; margin-left: auto; font-size: 14px; /* color: #333333; */ } /* 查看详情对话框模块结束 */ </style> src/views/exception/components/AnalysisCard.vue
@@ -6,26 +6,26 @@ export default { props: { // 异常的站点名称 siteName:{ type:Array, default:()=>{ return ['站点1','站点2'] } siteName: { type: Array, default: () => { return ['站点1', '站点2'] } }, // 异常类型 exceptionType:{ type:String, default:'0' exceptionType: { type: String, default: '0' }, // 开始时间 beginTime:{ type:String, default:'2023-09-11 00:00:00' beginTime: { type: String, default: '2023-09-11 00:00:00' }, // 结束时间 endTime:{ type:String, default:'2023-09-15 00:00:00' endTime: { type: String, default: '2023-09-15 00:00:00' }, // 异常的名字 exceptionName: { @@ -48,39 +48,35 @@ default: 90 }, // 该异常在某段时间的数量 exceptionNum:{ type:Number, default:10 exceptionNum: { type: Number, default: 10 }, // 所有异常在某段时间数量的累加和 exceptionAllNum :{ type:Number, default:100 exceptionAllNum: { type: Number, default: 100 }, // 是否无数据 isNoDataStatus:{ type:Boolean, default:false isNoDataStatus: { type: Boolean, default: false } }, emits:['getAbnormalDataByClick'], emits: ['getAbnormalDataByClick'], components: { DustExceptionText, NoDataStatus }, data() { return { // 审核辅助按钮显示 // auditButton:false, } return {} }, computed: { auditButton_1() { let today = dayjs().subtract(1,'day').format('YYYY-MM-DD 00:00:00') if(this.beginTime >= today && this.isNoDataStatus == false) { return true let today = dayjs().subtract(1, 'day').format('YYYY-MM-DD 00:00:00') if (this.beginTime >= today && this.isNoDataStatus == false) { return true } return false } @@ -88,7 +84,7 @@ mounted() {}, methods: { getAbnormalDataByClick(val) { this.$emit('getAbnormalDataByClick',val) this.$emit('getAbnormalDataByClick', val) }, openDetail() { this.$router.push(`/AuditDetail/${this.beginTime}/${this.endTime}/${this.exceptionType}`) @@ -100,67 +96,77 @@ <template> <el-card> <template #header> <div class="icon-text"> <!-- <slot/> --> <img :src="icon" height="24" width="24" /> <div class="exception-name">{{ exceptionName }}</div> <el-button type="danger" size="small" class="audit-button" v-show="auditButton_1" @click="openDetail">审核</el-button> </div> <div class="icon-text"> <!-- <slot/> --> <img :src="icon" height="24" width="24" /> <div class="exception-name">{{ exceptionName }}</div> <el-button type="danger" size="small" class="audit-button" v-show="auditButton_1" @click="openDetail" >审核</el-button > </div> <div class="exception-num"> <div><span class="exception-num-text">异常站点占比</span> <span>{{ siteNum }}/{{ siteNumAll }}</span> <span> ({{ ((siteNum/siteNumAll) * 100).toFixed(1) }}%)</span> <div> <span class="exception-num-text">异常站点占比</span> <span>{{ siteNum }}/{{ siteNumAll }}</span> <span> ({{ ((siteNum / siteNumAll) * 100).toFixed(1) }}%)</span> </div> <div><span class="exception-num-text">异常数占比</span> <span>{{ ((exceptionNum / exceptionAllNum) * 100).toFixed(1) }}%</span></div> <div> <span class="exception-num-text">异常数占比</span> <span>{{ ((exceptionNum / exceptionAllNum) * 100).toFixed(1) }}%</span> </div> </div> </template> <div class="card-exception-buttom" v-show="!isNoDataStatus" > <el-scrollbar max-height="190px"> <DustExceptionText :site-name="item.name" :exception-type=exceptionType :begin-time="beginTime" :end-time="endTime" @submit-exception-data="getAbnormalDataByClick" v-for="(item, index) in siteName" :key="item" >{{ item.name }} <span v-if="index < siteName.length - 1" class="text-blank">,</span> </DustExceptionText> </el-scrollbar> <div class="card-exception-buttom" v-show="!isNoDataStatus"> <el-scrollbar max-height="190px"> <DustExceptionText :site-name="item.name" :exception-type="exceptionType" :begin-time="beginTime" :end-time="endTime" @submit-exception-data="getAbnormalDataByClick" v-for="(item, index) in siteName" :key="item" >{{ item.name }} <span v-if="index < siteName.length - 1" class="text-blank">,</span> </DustExceptionText> </el-scrollbar> </div> <NoDataStatus :is-no-data="isNoDataStatus"></NoDataStatus> </el-card> </template> <style scoped> .el-card{ height:300px; .el-card { height: 300px; } .icon-text { display:flex; margin-bottom:10px; display: flex; margin-bottom: 10px; } .audit-button { margin-left:auto; margin-left: auto; } .exception-name { font-size:18px; font-weight:600; color:#333333; letter-spacing:3px; font-size: 18px; font-weight: 600; color: #333333; letter-spacing: 3px; } .exception-num { display: flex; justify-content: space-between; font-size:14px; color:#666666; display: flex; justify-content: space-between; font-size: 14px; color: #666666; } .exception-num-text { margin-right: 4px margin-right: 4px; } </style> src/views/exception/components/CompDialogDetail.vue
@@ -1,31 +1,39 @@ <!-- 点击 ”查看详细” 的对话框 --> <!-- 上一条下一条由子组件传递给父组件,父组件监听信号 --> <script> import exceptionOption from '@/utils/chartFunction/exceptionOption.js' import index from '@/utils/exception_common_function/index.js' import DustLineChart from '@/views/exception/components/DustLineChart.vue' import historyApi from '@/api/historyApi.js' import lineChartFunc from '@/utils/chartFunction/lineChart.js' import time from '@/utils/time.js' export default { props: { // 表格的一行数据 row: { type: Object, default: {} default() { return {} } }, // 对话框是否显示 dialogTableVisible: { type: Boolean, default: false }, buttonDisabled: { type: Object, default() { return { pre: false, next: false } } } }, components: { DustLineChart }, emits: ['update:dialogTableVisible'], emits: ['update:dialogTableVisible', 'getPreRowData', 'getNextRowData'], computed: { dialogTableVisible: { visible: { get() { return this.dialogTableVisible }, @@ -36,7 +44,7 @@ }, watch: { row: { handler(newValue) { handler() { this.display() }, deep: true @@ -48,33 +56,34 @@ historyData: [], // 折线图配置项 lineChartOption: {}, // 按钮,图形加载中 loading: { // 上一条按钮 preButton: false, // 下一条按钮 afterButton: false, nextButton: false, // 折线图 lineChart: false }, // 标记位 flag: { // 数据加载时 上下条按钮不能再点击 banTouch: 0, pre: false, next: false }, isPreCantouch:false, isNextCantouch:false isPreCanTouch: false, isNextCanTouch: false } }, mounted() {}, methods: { display() { async display() { // 表格数据 this.getExceptionTableDataByCurrenrRow(this.row) await this.getExceptionTableDataByCurrentRow(this.row) // 折线图数据 this.setLineChart(this.row) @@ -85,15 +94,23 @@ * @param: 点位名称,异常开始时间,异常结束时间 * @returns: */ async getExceptionTableDataByCurrenrRow({ name, beginTime, endTime, exceptionType }) { async getExceptionTableDataByCurrentRow({ name, exceptionType, beginTime, endTime }) { if (!name || !beginTime || !endTime) { return } console.log('异常为', exceptionType) // 数据缺失异常时,构造表格数据 if (this.exceptionType == '0') { this.setOfflineTbleData(this.row) if (exceptionType == '0') { this.setOfflineTableData(this.row) return } // 有效率异常时 设置折线图加载中效果 if (exceptionType == '8') { this.loading.lineChart = true } this.loading.preButton = true this.loading.nextButton = true // 根据异常的点位名称、开始、结束时间,查询该时段的颗粒物浓度数据 const response = await historyApi.queryHistoryData({ @@ -103,6 +120,12 @@ }) // 异常表格得到数据 this.historyData = response.data.data this.flag.pre = false this.flag.next = false this.loading.preButton = false this.loading.nextButton = false }, /* *********************************************************************************** 折线图 */ @@ -111,19 +134,20 @@ * @param: * @returns: */ async setLineChart({ beginTime, endTime }) { async setLineChart({ exception, exceptionType, beginTime, endTime }) { if (exceptionType == '8') { this.validProcess(this.historyData, { exception, exceptionType, beginTime, endTime }) this.loading.lineChart = false return } // 计算异常区间的前后45分钟 const beforeAndAfterTime = index.before45AndAfter45(beginTime, endTime) // 请求整段时间段的颗粒物浓度数据 // 对请求回的数据进行划分 const chartParams = await this.organizeLineChartsOptionParams(beforeAndAfterTime, this.row) this.lineChartOption = exceptionOption.setExceptionChartOption(chartParams) }, /** * 构建折线图的配置项的参数 @@ -187,7 +211,7 @@ /** * description:数据缺失异常时,设置的表格数据 */ setOfflineTbleData({ name, mnCode, dutyCompany, beginTime, endTime }) { setOfflineTableData({ name, mnCode, dutyCompany, beginTime, endTime }) { // 无数据时的时间数组 时间相差15分钟 const abnormalTimeTenMinute = index.descFiftyTime(beginTime, endTime) @@ -202,6 +226,65 @@ yData: '' }) } }, /** * 有效率异常 设置折线图配置项 * @param: * @returns: */ validProcess(historyData, { exception, exceptionType, beginTime, endTime }) { // x轴数据 let xData = time.ascTime(beginTime, endTime, 15) // y轴数据 let yData = [] xData.forEach((item) => { // 查找该时间的数据 let r = lineChartFunc.findDate(historyData, item) if (r) { yData.push(r.dustValue) } else { yData.push(null) } }) // 得到有效数据的时间点 let DataTime = time.validTime(historyData) let rangeTime = time.getMissingDays(xData[0], xData[xData.length - 1], DataTime, 15) console.log('无数据时间', rangeTime) // 得到背景区间的配置 let areaObj = lineChartFunc.getMarkArea(rangeTime, '异常') let lineColor = [] // 传入参数 this.lineChartOption = exceptionOption.setExceptionChartOption({ xData, yData, exceptionBeginTime: beginTime, exceptionEndTime: endTime, beginIndex: '', endIndex: '', exceptionName: exception, areaObj, lineColor, exceptionType }) }, /** * 点击“上一条” * @param: * @returns: */ clickPre() { this.flag.pre = true this.$emit('getPreRowData') }, /** * 点击“下一条” * @param: * @returns: */ clickNext() { this.flag.next = true this.$emit('getNextRowData') } } } @@ -210,14 +293,12 @@ <template> <el-dialog class="exception-dialog" v-model="dialogTableVisible" v-model="visible" draggable align-center height="700px" width="700px" > <!-- 头 --> <template #header> <div class="diag-head"> @@ -231,28 +312,25 @@ </div> </div> </div> <!-- <div class="chart-jump-button"> <div class="chart-jump-button"> <el-button type="danger" :loading="loading.preButton" :disabled="isPreCantouch || flag.banTouch" @click="getNextRowData" :loading="flag.pre && loading.preButton" :disabled="buttonDisabled.pre" @click="clickPre" >上条异常</el-button > <el-button type="danger" :loading="loading.afterButton" :disabled="isNextCantouch || flag.banTouch" @click="getPreviousRowData" :loading="flag.next && loading.nextButton" :disabled="buttonDisabled.next" @click="clickNext" >下条异常</el-button > </div> --> </div> </template> <!-- 图形 --> <DustLineChart :option="lineChartOption" v-loading="loading.lineChart"></DustLineChart> @@ -277,7 +355,7 @@ <template #footer> <div class="dialog-footer"> <el-tag type="success" class="mx-1" effect="dark" round ><span class="table-line-lable" v-show="row.exceptionType == '0'">缺失数据: </span> ><span v-show="row.exceptionType == '0'">缺失数据: </span> <span v-show=" row.exceptionType == '1' || @@ -291,7 +369,7 @@ " >异常数据:</span > <span class="table-line-num">{{ historyData.length }}条</span> <span class="table-line-num">{{ historyData?.length }}条</span> <span v-show="row.exceptionType == '0'"> (逻辑计算)</span> </el-tag> <el-text v-show="row.exceptionType == '8'" type="warning" class="dialog-footer-text" @@ -299,14 +377,11 @@ > </div> </template> </el-dialog> </template> <style scoped> /* 查看详情对话框模块的样式 */ .diag-head { /* 对话框头部区域 */ min-height: 200px; @@ -332,9 +407,6 @@ } .mx-1 { /* position: absolute; left: 10px; bottom: 10px; */ justify-content: flex-start; } .dialog-footer { src/views/exception/components/CompFlightInspection.vue
@@ -1,23 +1,15 @@ <!-- 飞行巡检页面 --> <script> import { defineAsyncComponent } from 'vue' import TimeShortCuts from '@/sfc/TimeShortCuts.vue' import { useCommonFunction } from '@/utils/common.js' import AreaAndmonitorType from '@/sfc/AreaAndmonitorType.vue' import AreaAndMonitorType from '@/sfc/AreaAndmonitorType.vue' import ButtonClick from '@/sfc/ButtonClick.vue' import index from '@/utils/exception_common_function/index.js' // 异常图形异步组件 const DustLineChart = defineAsyncComponent(() => import('@/views/exception/components/DustLineChart.vue')) import exceptionApi from '@/api/exceptionApi.js' import dayjs from 'dayjs' import { ElMessage } from 'element-plus' import AnalysisCard from './AnalysisCard.vue' import AnalysisCard from '@/views/exception/components/AnalysisCard.vue' import DutyCompany from '@/sfc/DutyCompany.vue' import StreetInfo from '@/sfc/StreetInfo.vue' import historyApi from '@/api/historyApi.js' import time from '@/utils/time.js' import lineChart from '@/utils/chartFunction/lineChart.js' import exceptionOption from '@/utils/chartFunction/exceptionOption.js' import exception0 from '@/assets/exception/exception0.png' import exception1 from '@/assets/exception/exception1.png' import exception2 from '@/assets/exception/exception2.png' @@ -26,6 +18,8 @@ import exception5 from '@/assets/exception/exception5.png' import exception6 from '@/assets/exception/exception6.png' import exception7 from '@/assets/exception/exception7.png' import CompDialogDetail from '@/views/exception/components/CompDialogDetail.vue' export default { props: { // 点位名字 @@ -34,37 +28,34 @@ default: '' }, // 日时间或者月时间 time:{ type:String, default:'' time: { type: String, default: '' }, // 展示页面的全部 showAll: { type: Boolean, default: true }, // 0代表日时间,1代表月时间 timeType:{ type:Number, default:-1 timeType: { type: Number, default: -1 } }, components: { TimeShortCuts, DustLineChart, ButtonClick, AreaAndmonitorType, AreaAndMonitorType, AnalysisCard, DutyCompany, StreetInfo CompDialogDetail }, data() { return { // 表单内容 form: { // 站点名称 name: '', // 运维商 dutyCompany: [], // 街道 @@ -103,7 +94,6 @@ exception7: true, exception8: true }, // eslint-disable-next-line no-undef // 对话框显示 dialogTableVisible: false, // 保存异常对应的店铺名称和设备编号 @@ -150,38 +140,13 @@ // 查询按钮 queryButton: false, // 表格加载中 tableLoading: false, // 上一条按钮 preButton: false, // 下一条按钮 afterButton: false, // 折线图 lineChart: false tableLoading: false }, dialog: { // 打开对话框请求该区间的历史数据 historyData: [], // 该时间段的异常条数 exceptionTotal: 0, // 折线图配置项 option: {}, // ’上一条‘按钮是否可以被点击状态 isPreCantouch: false, // ’下一条‘按钮是否可以被点击状态 isNextCantouch: false, // 异常的前中后区间所有数据 allExceptionTimeData: [] }, // 标记位 flag: { // 数据加载时 上下条按钮不能再点击 banTouch: 0, // 0代表分页,1代表不分页 originClick: 0 }, areaColor: null } } }, setup() { @@ -192,55 +157,19 @@ }, // 监听 判断按钮是否可点击 watch: { selectedRowIndex(newVaue) { // 处于表格的最后一条数据 设置‘上一条’按钮不可点 if (newVaue === 0) { this.dialog.isPreCantouch = true //用户先点了第一条,pre为true,然后点击最后一条,next为true。此时两个按钮都被封锁 if (this.dialog.isNextCantouch == true) { this.dialog.isNextCantouch = false } // 页面加载时showAll才会变化一次 // 为true表示的飞行巡检页面 showAll() { if (this.showAll) { this.backExceptionDataAWeekAgo() } // 处于表格第一条数据 设置‘上一条’按钮不可点 else if (newVaue === this.displayData.length - 1) { this.dialog.isNextCantouch = true //用户先点了表格最后一条,next为true,然后点击第一条,pre为true。此时两个按钮都被封锁 if (this.dialog.isPreCantouch == true) { this.dialog.isPreCantouch = false } } // 处于表格的中间行 将按钮设置为可点击状态 else { this.dialog.isPreCantouch = false this.dialog.isNextCantouch = false } }, dialogTableVisible() { window.addEventListener('resize', this.updateChart) }, // 页面加载时showAll才会变化一次 // 为true表示的飞行巡检页面 showAll(){ if(this.showAll){ this.backExceptionDataAWeekAgo() } }, // siteName(){ // if(this.siteName!=''){ // this.beginTime = dayjs(this.month).startOf('month').format('YYYY-MM-DD HH:mm:ss') // this.endTime = dayjs(this.month).endOf('month').format('YYYY-MM-DD HH:mm:ss') // this.backExceptionDataAWeekAgo() // this.getShopNames() // } // }, timeType(){ if(this.timeType == '0'){ timeType() { if (this.timeType == '0') { this.beginTime = dayjs(this.time).format('YYYY-MM-DD 00:00:00') this.endTime = dayjs(this.time).format('YYYY-MM-DD 23:59:59') }else if(this.timeType == '1'){ } else if (this.timeType == '1') { this.beginTime = dayjs(this.time).startOf('month').format('YYYY-MM-DD HH:mm:ss') this.endTime = dayjs(this.time).endOf('month').format('YYYY-MM-DD HH:mm:ss') } @@ -249,6 +178,23 @@ } }, computed: { // 设置对话框中的按钮是否能被点击 buttonDisabled() { // 表格只有一条数据时 if (this.selectedRowIndex === 0 && this.selectedRowIndex === this.displayData.length - 1) { return { pre: true, next: true } } else if (this.selectedRowIndex === 0) { return { pre: true, next: false } } // 处于表格第一条数据 设置‘上一条’按钮不可点 else if (this.selectedRowIndex === this.displayData.length - 1) { return { pre: false, next: true } } // 处于表格的中间行 将按钮设置为可点击状态 else { return { pre: false, next: false } } }, exceptionAllNum() { let sum = this.exception.exception0Num + @@ -266,34 +212,8 @@ return sum } }, long_time_notchange() { let sum = this.exception.exception0Num + this.exception.exception1Num + this.exception.exception2Num + this.exception.exception3Num + this.exception.exception4Num + this.exception.exception5Num + this.exception.exception6Num + this.exception.exception7Num + this.exception.exception8Num if (sum == 0) { return 0 } else { return ( 100 - (this.exception.exception0Num / this.exceptionAllNum) * 100 - (this.exception.exception1Num / this.exceptionAllNum) * 100 - (this.exception.exception2Num / this.exceptionAllNum) * 100 - (this.exception.exception4Num / this.exceptionAllNum) * 100 - (this.exception.exception5Num / this.exceptionAllNum) * 100 - (this.exception.exception6Num / this.exceptionAllNum) * 100 - (this.exception.exception7Num / this.exceptionAllNum) * 100 - (this.exception.exception8Num / this.exceptionAllNum) * 100 ).toFixed(1) } }, // 第一排卡片 // 卡片数据 cardRow() { return [ { @@ -388,74 +308,21 @@ span: 6 } ] }, } }, mounted() { this.getSiteNume() this.getSiteNum() // 飞行巡检页面,进去加载 if(this.showAll == true){ if (this.showAll == true) { this.backExceptionDataAWeekAgo() this.getShopNames() } }, methods: { /** * 有效率异常 设置折线图配置项 * @param: * @returns: */ validProcess() { // x轴数据 let xList = time.ascTime( this.tableCurrentRowData.beginTime, this.tableCurrentRowData.endTime, 15 ) // y轴数据 let yList = [] xList.forEach((item) => { // 查找该时间的数据 let r = lineChart.findDate(this.dialog.historyData, item) if (r) { yList.push(r.dustValue) } else { yList.push(null) } }) // 颜色背景区间 // 得到无数据的时间点或flag不等于N的时间点 let noDataTime = time.invalidTime(this.dialog.historyData, xList) let rangeTime = time.seriesTime(noDataTime, 15) // let rangeTime_1 = time.splitTime(rangeTime) // 得到背景区间的配置 let areaObj = lineChart.getMarkArea(rangeTime, '异常') // let lineColor = lineChart.getLineColor(rangeTime,xList) let lineColor = [] // console.log('线段',lineColor); // 传入参数 this.dialog.option = exceptionOption.setExceptionChartOption( xList, yList, '', '', '', '', this.tableCurrentRowData.exception, areaObj, lineColor, this.tableCurrentRowData.exceptionType ) }, getImageUrl(name) { return new URL(`../../lib/Carousel/assets/${name}`, import.meta.url).href }, // 放回站点总数量 getSiteNume() { getSiteNum() { exceptionApi.getSitesNum().then((res) => { this.siteTotal = res.data.data.length }) @@ -476,36 +343,6 @@ // 默认显示第一页 this.handleCurrentChange(1) }, // 点击表格的行时 selectTableRow() { // 获取当前行的索引 this.selectedRowIndex = this.displayData.indexOf(this.tableCurrentRowData) }, /** * description:断电或断网时设置的表格数据 */ setOfflineTbleData() { // 无数据时的时间数组 时间相差15分钟 const abnormalTimeTenMinute = index.descFiftyTime( this.tableCurrentRowData.beginTime, this.tableCurrentRowData.endTime ) // 保存无数据时表格条数 this.dialog.exceptionTotal = abnormalTimeTenMinute.length // 去除供电异常和掉线区间的第一个有元素的值 this.dialog.historyData = [] for (let i = 0; i < abnormalTimeTenMinute.length; i++) { this.dialog.historyData.push({ name: this.tableCurrentRowData.name, mnCode: this.tableCurrentRowData.mnCode, dutyCompany: this.tableCurrentRowData.dutyCompany, lst: abnormalTimeTenMinute[i], dustValue: '' }) } }, // 段电或断网区间无数据,需要补充。其他的都有数据,直接一次请求全部时段就好 @@ -515,168 +352,18 @@ // 再判断异常种类 ,进行设置配置项 /** * description:一次请求回前中后区间的数据,对数据进行分析 * @param: 前中后区间的请求参数,前中后的总区间时间,异常开始时间,一场结束时间 */ otherExceptionRequest(allTimeArgs, allTime, exceptionBT, exceptionET) { // 折线图加载中效果 this.loading.lineChart = true historyApi.queryHistoryData(allTimeArgs).then((result) => { this.dialog.allExceptionTimeData = result.data.data // 数据缺失异常时重新设置表格 if (this.tableCurrentRowData.exceptionType == '0') { this.setOfflineTbleData() } // x轴日期时间 let dateList = [] // y轴 超标油烟浓度 let dustValue = [] let timeAndValue = {} // 从添加了首位区间的开始和结束时间进行遍历 保证时间以15分钟为间隔 timeAndValue = index.keepContinuousByEachFiftyMinutes( allTime[0], allTime[3], this.dialog.allExceptionTimeData ) dateList = timeAndValue['xAxis'] dustValue = timeAndValue['yAxis'] // 提取异常起始时间点在整个区间内的数据索引 let startIndex = dateList.findIndex((item) => item === exceptionBT) let endIndex = dateList.findIndex((item) => item === exceptionET) // 设置折线图配置项 this.dialog.option = exceptionOption.setExceptionChartOption( dateList, dustValue, exceptionBT, exceptionET, startIndex, endIndex, this.tableCurrentRowData.exception, '', '', this.tableCurrentRowData.exceptionType ) this.flag.banTouch = 0 this.loading.lineChart = false }) }, /** * description:划分出异常起始时间,构造请求前中后的参数 */ timeAndDataProcessed() { //异常的开始时间 结束时间 let exceptionBeginTime = this.tableCurrentRowData.beginTime let exceptionEndTime = this.tableCurrentRowData.endTime // beforeAndAfterTime[0]:前45分钟的时间点 // beforeAndAfterTime[1]:前15分钟的时间点 // beforeAndAfterTime[2]:后15分钟的时间点 // beforeAndAfterTime[3]:后45分钟的时间点 let beforeAndAfterTime = index.before45AndAfter45(exceptionBeginTime, exceptionEndTime) // 构造异常时间前后区间数据请求参数(除了断网中都用到) let paramsAllTime = index.requestGetParms( this.tableCurrentRowData.name, beforeAndAfterTime[0], beforeAndAfterTime[3] ) // 将异常数据进行预处理,随后将结果作为折线图的配置项 this.otherExceptionRequest( paramsAllTime, beforeAndAfterTime, exceptionBeginTime, exceptionEndTime ) }, /** * description:获取下一条异常信息 */ getPreviousRowData() { // // 不是表格的最后一行 if (this.selectedRowIndex < this.displayData.length - 1) { // 点击过程中 锁住上下条按钮 在设置完图形配置项后解锁 this.flag.banTouch = 1 //得到上一行数据索引 this.selectedRowIndex = this.selectedRowIndex + 1 // 得到上一行的数据 this.tableCurrentRowData = this.displayData[this.selectedRowIndex] this.loading.preButton = true historyApi .queryHistoryData({ siteName: this.tableCurrentRowData.name, beginTime: this.tableCurrentRowData.beginTime, endTime: this.tableCurrentRowData.endTime }) .then((response) => { // 保存返回的超标数据 this.dialog.historyData = response.data.data this.dialog.exceptionTotal = response.data.data.length // 逻辑处理 if (this.tableCurrentRowData.exceptionType != '8') { this.timeAndDataProcessed() } else { this.loading.lineChart = true this.validProcess() this.loading.lineChart = false this.flag.banTouch = 0 } this.loading.preButton = false }) } this.selectedRowIndex < this.displayData.length - 1 ? this.showDialog(this.selectedRowIndex + 1) : '' }, /** * description:获取下一条异常信息 */ getNextRowData() { // 不是表格的第一行 if (this.selectedRowIndex !== 0) { // 点击过程中 锁住上下条按钮 在设置完图形配置项后解锁 this.flag.banTouch = 1 //得到上一行数据索引 this.selectedRowIndex = this.selectedRowIndex - 1 // 得到上一行的数据 this.tableCurrentRowData = this.displayData[this.selectedRowIndex] this.loading.afterButton = true historyApi .queryHistoryData({ siteName: this.tableCurrentRowData.name, beginTime: this.tableCurrentRowData.beginTime, endTime: this.tableCurrentRowData.endTime }) .then((response) => { // 保存返回的超标数据 this.dialog.historyData = response.data.data this.dialog.exceptionTotal = response.data.data.length // 逻辑处理 if (this.tableCurrentRowData.exceptionType != '8') { this.timeAndDataProcessed() } else { this.loading.lineChart = true this.validProcess() this.loading.lineChart = false this.flag.banTouch = 0 } this.loading.afterButton = false }) } this.selectedRowIndex > 0 ? this.showDialog(this.selectedRowIndex - 1) : '' }, /** @@ -695,12 +382,9 @@ params['endTime'] = this.endTime params['exceptionType'] = exceptionType if(this.siteName){ if (this.siteName) { params['siteName'] = this.siteName } // if (this.form.street.length != 0) { // params['street'] = this.form.street.join() // } if (this.form.dutyCompany.length != 0) { params['dutyCompany'] = this.form.dutyCompany.join() } @@ -826,41 +510,14 @@ * @param:点击‘查看详情’的该行所有字段数据 * @createTime:2023-08-18 */ showDialog(row) { showDialog(rowIndex) { // 当前表格行的索引 this.selectedRowIndex = rowIndex // 打开对话框 this.dialogTableVisible = true // 保存当前行数据 this.tableCurrentRowData = row // 获取当前行的索引 this.selectedRowIndex = this.displayData.indexOf(row) //根据当前行的编号,起始时间来 请求异常数据 // 对请求到的数据进行首尾拼接 // 得到前后完整数据进行绘制图形 historyApi .queryHistoryData({ siteName: row.name, beginTime: row.beginTime, endTime: row.endTime }) .then((response) => { // 保存返回的超标数据 this.dialog.historyData = response.data.data this.dialog.exceptionTotal = response.data.data.length // 逻辑处理 if (this.tableCurrentRowData.exceptionType != '8') { this.timeAndDataProcessed() } else { this.loading.lineChart = true this.validProcess() this.loading.lineChart = false this.flag.banTouch = 0 } }) this.tableCurrentRowData = this.displayData[rowIndex] }, /** * description:条件查询异常的数据 @@ -883,9 +540,7 @@ if (this.siteName) { params['siteName'] = this.siteName } // if (this.form.street.length != 0) { // params['street'] = this.form.street.join() // } if (this.form.dutyCompany.length != 0) { params['dutyCompany'] = this.form.dutyCompany.join() } @@ -922,10 +577,8 @@ params['beginTime'] = this.beginTime params['endTime'] = this.endTime console.log('name',this.siteName) this.$http.get('/dust/exceptiondata', { params: params }).then((response) => { // 保存返回的 // this.tableData = response.data.data.rows; this.displayData = response.data.data.rows this.loading.tableLoading = false @@ -991,10 +644,6 @@ // 表格序号递增 indexMethod1(index) { return index + 1 + (this.currentPage - 1) * this.pageSize }, // 表格序号递增 indexMethod2(index) { return index + 1 } } } @@ -1007,7 +656,7 @@ <el-form :inline="true"> <div class="head-container-text"> <el-form-item> <AreaAndmonitorType></AreaAndmonitorType> <AreaAndMonitorType></AreaAndMonitorType> </el-form-item> <el-form-item v-show="!showAll"> @@ -1020,11 +669,15 @@ </el-form-item> <!-- <el-form-item v-show="showAll"> <StreetInfo @submitStreetValue="(n) => (form.street = n)"> </StreetInfo> </el-form-item> --> <StreetInfo @submitStreetValue="(n) => (form.street = n)"> </StreetInfo> </el-form-item> --> <el-form-item> <TimeShortCuts timeType="day" @submit-time="giveTime" :beginAndEndTime="[beginTime,endTime]"></TimeShortCuts> <TimeShortCuts timeType="day" @submit-time="giveTime" :beginAndEndTime="[beginTime, endTime]" ></TimeShortCuts> </el-form-item> <el-form-item> @@ -1044,7 +697,7 @@ </el-row> <!-- 时间摘要 --> <el-row class="head-describtion-text" ref="h2"> <el-row class="head-description-text" ref="h2"> <el-row> <span> 金山区 {{ beginTime }} —— {{ endTime }} 扬尘监测异常信息汇总</span> </el-row> @@ -1129,8 +782,8 @@ <el-table-column prop="dutyCompany" label="运维商" align="center" show-overflow-tooltip /> <el-table-column label="操作" align="center"> <template #default="{ row }"> <el-button type="primary" class="table-button" @click="showDialog(row)" <template #default="{ $index }"> <el-button type="primary" class="table-button" @click="showDialog($index)" >查看详情</el-button > </template> @@ -1151,108 +804,13 @@ </el-pagination> </el-col> </el-row> <!-- 对话框 --> <el-dialog class="exception-dialog" <CompDialogDetail :row="tableCurrentRowData" :button-disabled="buttonDisabled" v-model="dialogTableVisible" draggable align-center height="700px" width="700px" > <!-- 头 --> <template #header> <div class="diag-head"> <div class="diag-head-text"> <div><span class="diag-head-text1">站点名称:</span>{{ tableCurrentRowData.name }}</div> <div> <span class="diag-head-text1">设备编号:</span>{{ tableCurrentRowData.mnCode }} </div> <div> <span class="diag-head-text1">运维商:</span>{{ tableCurrentRowData.dutyCompany }} </div> <div> <span class="diag-head-text1">异常时间段:</span>{{ tableCurrentRowData.beginTime }} ~ {{ tableCurrentRowData.endTime }} </div> </div> <div class="chart-jump-button"> <el-button type="danger" :loading="loading.preButton" :disabled="dialog.isPreCantouch || flag.banTouch" @click="getNextRowData" >上条异常</el-button > <el-button type="danger" :loading="loading.afterButton" :disabled="dialog.isNextCantouch || flag.banTouch" @click="getPreviousRowData" >下条异常</el-button > </div> </div> </template> <!-- 图形 --> <DustLineChart :option="dialog.option" :is-open-dialog="dialogTableVisible" v-loading="loading.lineChart" ></DustLineChart> <!-- 表格 --> <div> <el-table :data="dialog.historyData" size="default" height="200" border> <el-table-column type="index" label="序号" width="60px" align="center" fixed :index="indexMethod2" ></el-table-column> <el-table-column prop="lst" label="采集时间" align="center" show-overflow-tooltip /> <el-table-column prop="dustValue" label="TSP(mg/m³)" align="center" show-overflow-tooltip /> <el-table-column prop="flag" label="数据标识" align="center" show-overflow-tooltip /> </el-table> </div> <template #footer> <div class="dialog-footer"> <el-tag type="success" class="mx-1" effect="dark" round ><span class="table-line-lable" v-show="tableCurrentRowData.exceptionType == '0'" >缺失数据: </span> <span v-show=" tableCurrentRowData.exceptionType == '1' || tableCurrentRowData.exceptionType == '2' || tableCurrentRowData.exceptionType == '3' || tableCurrentRowData.exceptionType == '4' || tableCurrentRowData.exceptionType == '5' || tableCurrentRowData.exceptionType == '6' || tableCurrentRowData.exceptionType == '7' || tableCurrentRowData.exceptionType == '8' " >异常数据:</span > <span class="table-line-num">{{ dialog.exceptionTotal }}条</span> <span v-show="tableCurrentRowData.exceptionType == '0'"> (逻辑计算)</span> </el-tag> <el-text v-show="tableCurrentRowData.exceptionType == '8'" type="warning" class="dialog-footer-text">数据标识A为数据长期缺失,系统自动补全</el-text> </div> </template> </el-dialog> @get-pre-row-data="getNextRowData" @get-next-row-data="getPreviousRowData" /> </div> </template> @@ -1265,90 +823,37 @@ .el-form { margin: 10px; } img { margin-right: 5px; } .head-container-search { float: right; } .head-describtion-text { .head-description-text { justify-content: flex-end; margin-bottom: 2px; margin-right: 20px; font-size: 14px; color: gray; } .button-set { margin: 10px; } /* 条件查询模块结束 */ /* 异常分析模块的样式 */ .card-text1 { /* 黑体的异常名字部分 */ margin: 10px; } .card-text1 + div { /* 黑体的异常名字下面的 */ margin: 12px; } .card-exception-buttom { /* 异常站点文本按钮区域 */ padding: 11px; } .card-header { margin-left: 5px; font-size: 18px; font-weight: bold; } .card-content-unnormal { min-height: 200px; border: 2px solid #ffcf8b; border-radius: 20px; } .card-content-normal { min-height: 200px; border: 2px solid red; border-radius: 20px; } .card-header-text { font-size: 16px; font-weight: bold; margin-top: 4px; margin-left: 4px; } .card-content-text { white-space: nowrap; } .card-exceptionname-text1 { /* 异常站点占比 */ font-size: 14px; white-space: nowrap; } .card-exceptionname-text2 { /* 异常数占比的外边距 */ font-size: 14px; white-space: nowrap; } .text-blank { /* 逗号 */ margin-right: 10px; color: #000000; } .card-row { margin-bottom: 10px; } /* 异常分析模块结束 */ /* 隐藏表格按钮组样式 */ .el-button-group { margin: 10px 0px 10px 10px; } .i-ep-Arrow { margin-left: 6px; margin-bottom: 2px; @@ -1361,49 +866,4 @@ color: #333333; } /* 表格模块结束 */ /* 查看详情对话框模块的样式 */ .diag-head { /* 对话框头部区域 */ min-height: 200px; } .diag-head-text1 { /* 对话框头部的属性字段加粗 */ font-weight: bold; } .diag-head-text > div { /* 对话框异常时间段 */ margin-top: 15px; } .diag-head-text { margin: 10px; padding: 10px; background: linear-gradient(90deg, #00c9ff 0%, #92fe9d 100%); border: 2px solid #7bc0fc; } .chart-jump-button { display: flex; justify-content: right; } .mx-1 { /* position: absolute; left: 10px; bottom: 10px; */ justify-content: flex-start; } .dialog-footer{ display: flex; } .dialog-footer-text { justify-content: flex-end; margin-left: auto; font-size: 14px; /* color: #333333; */ } /* 查看详情对话框模块结束 */ </style> src/views/exception/components/DustExceptionText.vue
@@ -35,7 +35,6 @@ .then((result) => { //将返回的结果传递给父组件 this.$emit('submitExceptionData', result.data.data); // this.$emit('subloading',false) }); } }