| | |
| | | |
| | | import useStation from "@/hooks/useStationList.js"; |
| | | const { provice, city, country, stationName, stationId, powerId, |
| | | proviceList, cityList, countryList, stationList, powerList, isManual, |
| | | proviceList, cityList, countryList, stationList, powerList, isManual, |
| | | getPowerList, |
| | | whenLoaded, |
| | | } = useStation(); |
| | |
| | | |
| | | |
| | | import { |
| | | confirmBattAlm, |
| | | getBattAlmHis, |
| | | getPwrAlmParam, |
| | | getPwrAllAlmParam, |
| | | getPwrtAlmAnalyse, |
| | | getDevAlmAnalyse, |
| | | getBattAlmAnalyse, |
| | | getHisRealInAlm, |
| | | getAlmSummaryParam, |
| | | } from "@/api/alarm.js"; |
| | | |
| | | import { |
| | |
| | | const flag = ref(Math.random()); |
| | | |
| | | |
| | | const headers = [ |
| | | { |
| | | prop: "fullName", |
| | | label: "机房名称", |
| | | width: "220", |
| | | }, |
| | | { |
| | | prop: "powerName", |
| | | label: "电源名称", |
| | | width: "80", |
| | | }, |
| | | { |
| | | prop: "alarmName", |
| | | label: "告警名称", |
| | | width: "160", |
| | | }, |
| | | { |
| | | prop: "alarmLimithUpper", |
| | | label: "上上限阈值", |
| | | width: "120", |
| | | }, |
| | | { |
| | | prop: "alarmLimithUpperLevelStr", |
| | | label: "上上限等级", |
| | | width: "120", |
| | | }, |
| | | { |
| | | prop: "alarmLimithUpperEnStr", |
| | | label: "上上限使能", |
| | | width: "120", |
| | | }, |
| | | { |
| | | prop: "alarmLimith", |
| | | label: "上限阈值", |
| | | width: "120", |
| | | }, |
| | | { |
| | | prop: "alarmLimithLevelStr", |
| | | label: "上限等级", |
| | | width: "120", |
| | | }, |
| | | { |
| | | prop: "alarmLimithEnStr", |
| | | label: "上限使能", |
| | | width: "120", |
| | | }, |
| | | { |
| | | prop: "alarmLimitl", |
| | | label: "下限阈值", |
| | | width: "120", |
| | | }, |
| | | { |
| | | prop: "alarmLimitlLevelStr", |
| | | label: "下限等级", |
| | | width: "120", |
| | | }, |
| | | { |
| | | prop: "alarmLimitlEnStr", |
| | | label: "下限使能", |
| | | width: "120", |
| | | }, |
| | | { |
| | | prop: "alarmLimitlLower", |
| | | label: "下下限阈值", |
| | | width: "120", |
| | | }, |
| | | { |
| | | prop: "alarmLimitlLowerLevelStr", |
| | | label: "下下限等级", |
| | | width: "120", |
| | | }, |
| | | { |
| | | prop: "alarmLimitlLowerEnStr", |
| | | label: "下下限使能", |
| | | width: "120", |
| | | }, |
| | | const headers0 = [ |
| | | { |
| | | prop: "fullName", |
| | | label: "机房名称", |
| | | width: "220", |
| | | }, |
| | | { |
| | | prop: "powerName", |
| | | label: "电源名称", |
| | | width: "80", |
| | | }, |
| | | { |
| | | prop: "almName", |
| | | label: "告警名称", |
| | | width: "160", |
| | | }, |
| | | { |
| | | prop: "almLevelStr", |
| | | label: "告警等级", |
| | | width: "120", |
| | | }, |
| | | { |
| | | prop: "almStartTime", |
| | | label: "告警开始时间", |
| | | width: "120", |
| | | }, |
| | | ]; |
| | | |
| | | // const pageCurr = ref(1); |
| | | // const pageSize = ref(10); |
| | | // const total = ref(0); |
| | | const pageNum0 = ref(1); |
| | | const pageSize0 = ref(10); |
| | | const total0 = ref(0); |
| | | const addEditVisible = ref(false); |
| | | const dialogTitle = ref(""); |
| | | const datas = reactive({ |
| | | tableData: [], |
| | | rowData: {}, |
| | | const datas0 = reactive({ |
| | | tableData: [], |
| | | rowData: {}, |
| | | }); |
| | | |
| | | const currentRow = ref({}); |
| | |
| | | |
| | | const alarmId = ref(''); |
| | | |
| | | function getList() { |
| | | let params = { |
| | | almIdList: alarmId.value ? [alarmId.value] : undefined, |
| | | provice: provice.value || undefined, |
| | | city: city.value || undefined, |
| | | country: country.value || undefined, |
| | | stationId: stationId.value || undefined, |
| | | powerId: powerId.value || undefined, |
| | | }; |
| | | |
| | | if (!powerId.value) { |
| | | $message.error('请选择电源'); |
| | | return false; |
| | | } |
| | | // 电源告警列表 |
| | | function getList0() { |
| | | let params = { |
| | | almIdList: alarmId.value ? [alarmId.value] : undefined, |
| | | provice: provice.value || undefined, |
| | | city: city.value || undefined, |
| | | country: country.value || undefined, |
| | | stationId: stationId.value || undefined, |
| | | powerId: powerId.value || undefined, |
| | | almLevel: alarmLevel.value, |
| | | pageNum: pageNum0.value, |
| | | pageSize: pageSize0.value, |
| | | }; |
| | | |
| | | let loading = $loading(); |
| | | getPwrAlmParam(params).then((res) => { |
| | | let { code, data, data2, data3 } = res; |
| | | let list = []; |
| | | // let _total = 0; |
| | | getPwrtAlmAnalyse(params).then((res) => { |
| | | let { code, data, data2 } = res; |
| | | let list = []; |
| | | // let _total0 = 0; |
| | | loading.close(); |
| | | if (code && data) { |
| | | // console.log(data); |
| | | let bInf = data3; |
| | | list = data2.map(v => ({ |
| | | if (code && data) { |
| | | // console.log(data); |
| | | list = data2.list.map(v => ({ |
| | | ...v, |
| | | fullName: bInf.fullName, |
| | | powerName: bInf.powerName, |
| | | alarmLimithUpperLevelStr: ['', '一级告警', '二级告警', '三级告警', '四级告警'][v.alarmLimithUpperLevel], |
| | | alarmLimithUpperEnStr: ['不启用', '启用'][v.alarmLimithUpperEn], |
| | | alarmLimithLevelStr: ['', '一级告警', '二级告警', '三级告警', '四级告警'][v.alarmLimithLevel], |
| | | alarmLimithEnStr: ['不启用', '启用'][v.alarmLimithEn], |
| | | alarmLimitlLevelStr: ['', '一级告警', '二级告警', '三级告警', '四级告警'][v.alarmLimitlLevel], |
| | | alarmLimitlEnStr: ['不启用', '启用'][v.alarmLimitlEn], |
| | | alarmLimitlLowerLevelStr: ['', '一级告警', '二级告警', '三级告警', '四级告警'][v.alarmLimitlLowerLevel], |
| | | alarmLimitlLowerEnStr: ['不启用', '启用'][v.alarmLimitlLowerEn], |
| | | })); |
| | | // _total = data2.total; |
| | | } |
| | | datas.tableData = list; |
| | | // total.value = _total; |
| | | }) |
| | | .catch((err) => { |
| | | console.log(err); |
| | | }); |
| | | almLevelStr: ['', '一级告警', '二级告警', '三级告警', '四级告警'][v.almLevel], |
| | | |
| | | })); |
| | | // _total0 = data2.total0; |
| | | } |
| | | datas0.tableData = list; |
| | | // total0.value = _total0; |
| | | }) |
| | | .catch((err) => { |
| | | console.log(err); |
| | | }); |
| | | } |
| | | |
| | | |
| | | const allProps = ref([]); |
| | | // 查询属性对应关系 |
| | | async function getAllProps() { |
| | | let res = await getAlmSummaryParam(); |
| | | let { code, data, data2 } = res; |
| | | let list = []; |
| | | if (code && data) { |
| | | list = data2; |
| | | } |
| | | allProps.value = list; |
| | | } |
| | | |
| | | // 查询告警类型 |
| | | async function getAlarmType() { |
| | | let res = await getPowerAlmIdType(); |
| | | let { code, data, data2 } = res; |
| | | let list = []; |
| | | if (code && data) { |
| | | Object.keys(data2).map((key) => { |
| | | let res = await getPowerAlmIdType(); |
| | | let { code, data, data2 } = res; |
| | | let list = []; |
| | | if (code && data) { |
| | | Object.keys(data2).map((key) => { |
| | | Object.keys(data2[key]).map((key2) => { |
| | | list.push({ |
| | | value: key2, |
| | |
| | | }); |
| | | }) |
| | | }); |
| | | } |
| | | alarmTypeList.value = list; |
| | | } |
| | | alarmTypeList.value = list; |
| | | } |
| | | |
| | | |
| | | // 展示数据数量 |
| | | // function handleSizeChange(val) { |
| | | // pageSize.value = val; |
| | | // getList(); |
| | | // } |
| | | // 翻页 |
| | | // function handleCurrentChange(val) { |
| | | // pageCurr.value = val; |
| | | // getList(); |
| | | // } |
| | | |
| | | const alarmType = ref(0); |
| | | const acTab = ref('power'); |
| | | const alarmLevel = ref(1); |
| | | |
| | | function edit(record) { |
| | | dialogTitle.value = `编辑告警参数--${record.alarmName}`; |
| | | alarmType.value = record.alarmType; |
| | | addEditVisible.value = true; |
| | | currentRow.value = record; |
| | | // console.log('record', record, '============='); |
| | | |
| | | async function view(record) { |
| | | let params = { |
| | | powerId: record.powerId, |
| | | almId: record.almId, |
| | | startTime: record.almStartTime, |
| | | battgroupId: record.battgroupIdList.length ? record.battgroupIdList[0] : 0, |
| | | } |
| | | let res = await getHisRealInAlm(params); |
| | | } |
| | | |
| | | function onOk() { |
| | | addEditVisible.value = false; |
| | | // handleCurrentChange(1); |
| | | } |
| | | function onCanel() { |
| | | addEditVisible.value = false; |
| | | } |
| | | |
| | | function exportExcel() { |
| | | let _headers = headers.map(v => { |
| | | let prop = v.prop; |
| | | let label = v.label; |
| | | if (prop == 'almIsConfirmed') { |
| | | prop = 'almIsConfirmedStr'; |
| | | } |
| | | return { |
| | | prop, |
| | | label |
| | | }; |
| | | }); |
| | | ExportFile(_headers, datas.tableData, "电源告警参数"); |
| | | } |
| | | |
| | | async function exportExcelAll() { |
| | | let res = await getPwrAllAlmParam(); |
| | | let { code, data, data2 } = res; |
| | | let list = []; |
| | | if (code && data) { |
| | | list = data2.map(v => ({ |
| | | ...v, |
| | | alarmLimithUpperLevelStr: ['', '一级告警', '二级告警', '三级告警', '四级告警'][v.alarmLimithUpperLevel], |
| | | alarmLimithUpperEnStr: ['不启用', '启用'][v.alarmLimithUpperEn], |
| | | alarmLimithLevelStr: ['', '一级告警', '二级告警', '三级告警', '四级告警'][v.alarmLimithLevel], |
| | | alarmLimithEnStr: ['不启用', '启用'][v.alarmLimithEn], |
| | | alarmLimitlLevelStr: ['', '一级告警', '二级告警', '三级告警', '四级告警'][v.alarmLimitlLevel], |
| | | alarmLimitlEnStr: ['不启用', '启用'][v.alarmLimitlEn], |
| | | alarmLimitlLowerLevelStr: ['', '一级告警', '二级告警', '三级告警', '四级告警'][v.alarmLimitlLowerLevel], |
| | | alarmLimitlLowerEnStr: ['不启用', '启用'][v.alarmLimitlLowerEn], |
| | | })); |
| | | } |
| | | let _headers = headers.map(v => { |
| | | let _headers = headers0.map(v => { |
| | | let prop = v.prop; |
| | | let label = v.label; |
| | | if (prop == 'almIsConfirmed') { |
| | | prop = 'almIsConfirmedStr'; |
| | | } |
| | | return { |
| | | prop, |
| | | label |
| | | }; |
| | | }); |
| | | ExportFile(_headers, list, "电源告警参数-全部"); |
| | | ExportFile(_headers, datas0.tableData, "电源告警"); |
| | | } |
| | | |
| | | // 展示数据数量 |
| | | function handleSizeChange0(val) { |
| | | pageSize0.value = val; |
| | | getList0(); |
| | | } |
| | | // 翻页 |
| | | function handleCurrentChange0(val) { |
| | | pageNum0.value = val; |
| | | getList0(); |
| | | } |
| | | |
| | | async function exportExcelAll() { |
| | | // let res = await getPwrAllAlmParam(); |
| | | // let { code, data, data2 } = res; |
| | | // let list = []; |
| | | // if (code && data) { |
| | | // list = data2.map(v => ({ |
| | | // ...v, |
| | | // almLevelStr: ['', '一级告警', '二级告警', '三级告警', '四级告警'][v.almLevel], |
| | | // })); |
| | | // } |
| | | // let _headers = headers0.map(v => { |
| | | // let prop = v.prop; |
| | | // let label = v.label; |
| | | // return { |
| | | // prop, |
| | | // label |
| | | // }; |
| | | // }); |
| | | // ExportFile(_headers, list, "电源告警-全部"); |
| | | } |
| | | |
| | | |
| | | // 获取属性对应的中文名称 |
| | | function getPropName(prop) { |
| | | let name = ''; |
| | | let obj = allProps.value.filter(v => v.fieldName == prop); |
| | | if (obj.length) { |
| | | name = obj[0].fieldNameZh; |
| | | } |
| | | return name; |
| | | } |
| | | |
| | | const name0 = ref('主属性曲线'); |
| | | const subProp = ref([]); |
| | | |
| | | subProp.value = [1]; |
| | | // subProp.value = [1, 2]; |
| | | // subProp.value = [1, 2, 3]; |
| | | // subProp.value = [1, 2, 3, 4]; |
| | | |
| | | let obj = [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]; |
| | | let i = 0; |
| | | onMounted(async () => { |
| | | await getAlarmType(); |
| | | // getList(); |
| | | console.log('stationList', stationList, '===========1=='); |
| | | await getAlarmType(); |
| | | getAllProps(); |
| | | getList0(); |
| | | |
| | | setInterval(() => { |
| | | i++; |
| | | i%=4; |
| | | subProp.value.length = obj[i]; |
| | | }, 5000); |
| | | }); |
| | | |
| | | onActivated(async () => { |
| | | let pageFlag = getQueryString("pageFlag"); |
| | | // console.log('pageFlag', pageFlag, flag.value, '============='); |
| | | await nextTick(); |
| | | await whenLoaded(); |
| | | // onActivated(async () => { |
| | | // let pageFlag = getQueryString("pageFlag"); |
| | | // // console.log('pageFlag', pageFlag, flag.value, '============='); |
| | | // await nextTick(); |
| | | // await whenLoaded(); |
| | | |
| | | if (pageFlag && pageFlag != flag.value) { |
| | | // let provice, city, country, stationName, battId; |
| | | // if (pageFlag && pageFlag != flag.value) { |
| | | // // let provice, city, country, stationName, battId; |
| | | |
| | | if (getQueryString('stationId')) { |
| | | let statId = getQueryString('stationId'); |
| | | let stat = stationList.value.find(v => v.stationId == statId); |
| | | if (stat) { |
| | | isManual.value = true; |
| | | stationName.value = stat.stationName; |
| | | await getPowerList(); |
| | | } |
| | | } |
| | | if (getQueryString('powerId')) { |
| | | powerId.value = getQueryString('powerId') * 1; |
| | | // console.log('battId', battId.value, battList.value, '============='); |
| | | } |
| | | getList(); |
| | | flag.value = pageFlag; |
| | | } |
| | | }); |
| | | // if (getQueryString('stationId')) { |
| | | // let statId = getQueryString('stationId'); |
| | | // let stat = stationList.value.find(v => v.stationId == statId); |
| | | // if (stat) { |
| | | // isManual.value = true; |
| | | // stationName.value = stat.stationName; |
| | | // await getPowerList(); |
| | | // } |
| | | // } |
| | | // if (getQueryString('powerId')) { |
| | | // powerId.value = getQueryString('powerId') * 1; |
| | | // // console.log('battId', battId.value, battList.value, '============='); |
| | | // } |
| | | // getList(); |
| | | // flag.value = pageFlag; |
| | | // } |
| | | // }); |
| | | </script> |
| | | |
| | | <template> |
| | |
| | | <!-- <div class="page-header"> |
| | | </div> --> |
| | | <div class="page-content"> |
| | | <yc-card is-full> |
| | | <div class="page-content-wrapper"> |
| | | <el-tabs tab-position="left" v-model="acTab" type="card" class="main-tabs"> |
| | | <el-tab-pane name="power" class="tab-pane" label="电源告警"> |
| | | <div class="page-content-wrapper"> |
| | | <div class="page-content-tools page-filter"> |
| | | <div class="grid-container" :style="{'--counter': 8}"> |
| | | <div class="grid-container" :style="{'--counter': 9}"> |
| | | <div class="grid-item"> |
| | | <div class="label">省</div> |
| | | <div class="value"> |
| | |
| | | </el-select> |
| | | </div> |
| | | </div> |
| | | <div class="grid-item"> |
| | | <!-- <div class="label">一级告警</div> |
| | | <div class="label">二级告警</div> |
| | | <div class="label">三级告警</div> |
| | | <div class="label">四级告警</div> --> |
| | | <el-radio-group v-model="alarmLevel" size="small" style="grid-column: span 6;"> |
| | | <el-radio-button :label="1">一级告警</el-radio-button> |
| | | <el-radio-button :label="2">二级告警</el-radio-button> |
| | | <el-radio-button :label="3">三级告警</el-radio-button> |
| | | <el-radio-button :label="4">四级告警</el-radio-button> |
| | | </el-radio-group> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="page-content-table"> |
| | |
| | | stripe |
| | | height="100%" |
| | | size="small" |
| | | :data="datas.tableData" |
| | | :data="datas0.tableData" |
| | | style="width: 100%" |
| | | > |
| | | <el-table-column |
| | |
| | | width="60" |
| | | ></el-table-column> |
| | | <el-table-column |
| | | v-for="header in headers" |
| | | v-for="header in headers0" |
| | | :key="header.prop" |
| | | :prop="header.prop" |
| | | :label="header.label" |
| | |
| | | <el-table-column |
| | | label="操作" |
| | | fixed="right" |
| | | width="240" |
| | | width="120" |
| | | align="center" |
| | | > |
| | | <template #default="scope"> |
| | | <el-button |
| | | type="primary" |
| | | type="warning" |
| | | size="small" |
| | | @click="edit(scope.row)" |
| | | >修改</el-button |
| | | @click="view(scope.row)" |
| | | >查看详情</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | |
| | | type="primary" |
| | | round |
| | | size="small" |
| | | @click="getList" |
| | | @click="getList0" |
| | | :icon="Search" |
| | | >查询</el-button |
| | | > |
| | | </div> |
| | | <div class="el-page-container"> |
| | | <el-pagination v-model:current-page="pageNum0" v-model:page-size="pageSize0" |
| | | :page-sizes="[20, 40, 60, 80, 100, 200, 300, 400]" size="small" layout="total, sizes, prev, pager, next, jumper" :total="total0" |
| | | @size-change="handleSizeChange0" @current-change="handleCurrentChange0" /> |
| | | </div> |
| | | <div class="page-tool"> |
| | | <el-button type="primary" round size="small" @click="exportExcel" |
| | | <!-- <el-button type="primary" round size="small" @click="exportExcel" |
| | | >导出</el-button |
| | | > |
| | | <el-button type="primary" round size="small" @click="exportExcelAll" |
| | | >导出全部</el-button |
| | | > |
| | | > --> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </yc-card> |
| | | </el-tab-pane> |
| | | <el-tab-pane name="dev" label="设备告警">设备告警</el-tab-pane> |
| | | <el-tab-pane name="batt" label="电池告警">电池告警</el-tab-pane> |
| | | </el-tabs> |
| | | </div> |
| | | <div class="page-footer"> |
| | | |
| | | <div class="left"> |
| | | <card :title="name0"></card> |
| | | </div> |
| | | <div class="right"> |
| | | <div class="btn-grp"> |
| | | <!-- <div class="item"> |
| | | <div class="label">选择电池组</div> |
| | | <div class="value"> |
| | | <el-select |
| | | v-model="battId" |
| | | size="small" |
| | | clearable |
| | | placeholder="请选择电池组" |
| | | > |
| | | <el-option |
| | | v-for="item in battList" |
| | | :key="'l5_' + item.powerId" |
| | | :label="`${item.stationName}-${item.powerName}`" |
| | | :value="item.powerId" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </div> |
| | | </div> |
| | | <div class="item"> |
| | | <div class="label">设置时间周期</div> |
| | | <div class="value"> |
| | | {{ 132 }} |
| | | </div> |
| | | </div> |
| | | <div class="item"> |
| | | <div class="label">关注属性</div> |
| | | </div> --> |
| | | </div> |
| | | <!-- 一个就分一块 两个就分两列一行 两个以上就两列两行 --> |
| | | <div :class="['contain', { 'grid1': subProp.length == 1, 'grid2': subProp.length == 2, 'grid3': subProp.length > 2}]"> |
| | | <template v-for="(sub, idx) in subProp" :key="'sub_' + idx"> |
| | | <card :title="'次属性' + (idx + 1)"> |
| | | <line-chart :ref="() => chartRefs[idx]"></line-chart> |
| | | </card> |
| | | </template> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- 弹窗 --> |
| | | <el-dialog |
| | |
| | | <style scoped lang="less"> |
| | | .page-wrapper { |
| | | display: flex; |
| | | flex-direction: row; |
| | | // padding: 8px; |
| | | flex-direction: column; |
| | | padding: 8px; |
| | | height: 100%; |
| | | |
| | | .page-content { |
| | | flex: 1; |
| | | .main-tabs { |
| | | height: 100%; |
| | | :deep(.el-tabs__header) { |
| | | |
| | | border-bottom: 0 none; |
| | | } |
| | | :deep(.el-tabs__header) { |
| | | .el-tabs__nav { |
| | | border: 0 none; |
| | | } |
| | | .el-tabs__item { |
| | | background: #21487e; |
| | | color: #fff; |
| | | border: 0 none; |
| | | &.is-active { |
| | | background: #409EFF; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .page-footer { |
| | | flex: 2; |
| | | display: flex; |
| | | .left { |
| | | flex: 1; |
| | | } |
| | | .right { |
| | | flex: 1.6; |
| | | margin-left: 10px; |
| | | display: flex; |
| | | flex-direction: column; |
| | | .btn-grp { |
| | | display: flex; |
| | | justify-content: flex-end; |
| | | padding: 8px; |
| | | } |
| | | .contain { |
| | | flex: 1; |
| | | display: grid; |
| | | grid-column-gap: 8px; |
| | | grid-row-gap: 8px; |
| | | &.grid1 { |
| | | grid-template-columns: repeat(1, 1fr); |
| | | } |
| | | &.grid2 { |
| | | grid-template-columns: repeat(2, 1fr); |
| | | grid-template-rows: repeat(1, 1fr); |
| | | } |
| | | &.grid3 { |
| | | grid-template-columns: repeat(2, 1fr); |
| | | grid-template-rows: repeat(2, 1fr); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .tab-pane { |
| | | height: 100%; |
| | | } |
| | | } |
| | | |