修改全局报表功能

This commit is contained in:
guanj
2026-01-27 16:32:33 +08:00
parent def48e9c84
commit 46124f0ea5
27 changed files with 654 additions and 309 deletions

View File

@@ -103,6 +103,14 @@ export function getTemplateByDept(params) {
params params
}) })
} }
// 获取模版
export function querySysExcel(params) {
return createAxios({
url: '/cs-harmonic-boot/sysExcel/querySysExcel',
method: 'post',
params
})
}
//资源管理 查询数据 //资源管理 查询数据
export function queryData(data) { export function queryData(data) {
return createAxios({ return createAxios({
@@ -168,3 +176,43 @@ export function terminalChooseTree() {
method: 'get' method: 'get'
}) })
} }
//新增模版
export function addSysExcel(data:any) {
return createAxios({
url: '/cs-harmonic-boot/sysExcel/addSysExcel',
method: 'post',
data
})
}
//修改模版
export function updateSysExcel(data:any) {
return createAxios({
url: '/cs-harmonic-boot/sysExcel/updateSysExcel',
method: 'post',
data
})
}
//删除模版
export function deleteSysExcel(params:any) {
return createAxios({
url: '/cs-harmonic-boot/sysExcel/deleteSysExcel',
method: 'post',
params
})
}
//查詢綁定
export function queryList(params:any) {
return createAxios({
url: '/cs-harmonic-boot/sysExcelRelation/queryList',
method: 'post',
params
})
}
//綁定
export function bandRelation(data:any) {
return createAxios({
url: '/cs-harmonic-boot/sysExcelRelation/bandRelation',
method: 'post',
data
})
}

View File

@@ -116,8 +116,8 @@ const tableStore: any = new TableStore({
loadCallback: () => { loadCallback: () => {
const gongData = gongfunction(tableStore.table.data) const gongData = gongfunction(tableStore.table.data)
data.gs = tableStore.table.data.length data.gs = tableStore.table.data.length
data.krr = gongData.pointI.length data.krr = gongData.pointF.length
data.bkrr = gongData.pointIun.length data.bkrr = gongData.pointFun.length
echartList.value = { echartList.value = {
title: { title: {
text: `F47曲线` text: `F47曲线`
@@ -215,15 +215,7 @@ const tableStore: any = new TableStore({
// [0.4, 50, '2023-01-01 11:00:00'] // [0.4, 50, '2023-01-01 11:00:00']
// ], // ],
legendSymbol: 'circle', legendSymbol: 'circle',
emphasis: {
focus: 'series',
itemStyle: {
borderColor: '#fff',
borderWidth: 2,
shadowBlur: 10,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
},
tooltip: { tooltip: {
show: true, show: true,
trigger: 'item', trigger: 'item',

View File

@@ -3,9 +3,9 @@
<!--治理效果报表 --> <!--治理效果报表 -->
<TableHeader :showReset="false" :timeKeyList="prop.timeKey" ref="TableHeaderRef" datePicker @selectChange="selectChange" v-if="fullscreen"> <TableHeader :showReset="false" :timeKeyList="prop.timeKey" ref="TableHeaderRef" datePicker @selectChange="selectChange" v-if="fullscreen">
<template v-slot:select> <template v-slot:select>
<el-form-item label="报表模板"> <el-form-item label="模板策略">
<el-select filterable v-model="tableStore.table.params.tempId" placeholder="请选择报表模板" clearable> <el-select filterable v-model="tableStore.table.params.tempId" placeholder="请选择模板策略" clearable>
<el-option v-for="item in templateList" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in templateList" :key="item.id" :label="item.excelName" :value="item.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="监测对象"> <el-form-item label="监测对象">
@@ -34,7 +34,7 @@ import { ref, onMounted, provide, reactive, watch, h, computed, nextTick } from
import TableStore from '@/utils/tableStore' import TableStore from '@/utils/tableStore'
import { exportExcel } from '@/views/govern/reportForms/export.js' import { exportExcel } from '@/views/govern/reportForms/export.js'
import TableHeader from '@/components/table/header/index.vue' import TableHeader from '@/components/table/header/index.vue'
import { getTemplateList } from '@/api/harmonic-boot/luckyexcel' import { querySysExcel } from '@/api/harmonic-boot/luckyexcel'
import { getListByIds } from '@/api/harmonic-boot/cockpit/cockpit' import { getListByIds } from '@/api/harmonic-boot/cockpit/cockpit'
import { getTime } from '@/utils/formatTime' import { getTime } from '@/utils/formatTime'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
@@ -71,8 +71,8 @@ const initListByIds = () => {
} }
const templateListData = () => { const templateListData = () => {
getTemplateList({}).then(res => { querySysExcel({}).then(res => {
templateList.value = res.data.filter(item => item.reportForm == 4) templateList.value = res.data.filter(item => item.excelType == 4)
if (!tableStore.table.params.tempId && templateList.value?.length > 0) { if (!tableStore.table.params.tempId && templateList.value?.length > 0) {
tableStore.table.params.tempId = templateList.value[0].id tableStore.table.params.tempId = templateList.value[0].id
} }

View File

@@ -66,7 +66,7 @@
<el-option <el-option
v-for="vv in item.countOptions" v-for="vv in item.countOptions"
:key="vv" :key="vv"
:label="item.name.includes('间谐波') ? vv - 0.5 : vv" :label="item.name.includes('间谐波') ? vv - 0.5 : vv"
:value="vv" :value="vv"
></el-option> ></el-option>
</el-select> </el-select>
@@ -82,11 +82,7 @@
</TableHeader> </TableHeader>
</div> </div>
<div class="history_chart" :style="pageHeight" v-loading="loading"> <div class="history_chart" :style="pageHeight" v-loading="loading">
<MyEchart <MyEchart ref="historyChart" :options="echartsData" v-if="showEchart" />
ref="historyChart"
:options="echartsData"
v-if="showEchart"
/>
<el-empty :style="pageHeight" v-else description="暂无数据" /> <el-empty :style="pageHeight" v-else description="暂无数据" />
</div> </div>
</el-dialog> </el-dialog>
@@ -160,28 +156,40 @@ const countOptions: any = ref([])
const legendDictList: any = ref([]) const legendDictList: any = ref([])
const initCode = (field: string, title: string) => { const initCode = (field: string, title: string) => {
queryByCode('steady_state_limit_trend').then(res => { queryByCode('gridSide_exceedTheLimit').then(res => {
queryCsDictTree(res.data.id).then(item => { queryCsDictTree(res.data.id).then(item => {
//排序 //排序
indexOptions.value = item.data.sort((a: any, b: any) => { indexOptions.value = item.data.sort((a: any, b: any) => {
return a.sort - b.sort return a.sort - b.sort
}) })
const titleMap: Record<string, number> = { let codeKey = field.includes('flickerOvertime')
flickerOvertime: 0, ? '闪变'
uaberranceOvertime: 3, : field.includes('uharm')
ubalanceOvertime: 4, ? '谐波电压'
freqDevOvertime: 5 : field.includes('iharm')
} ? '谐波电流'
: field.includes('voltageDevOvertime')
? '电压偏差'
: field.includes('ubalanceOvertime')
? '不平衡'
: ''
let defaultIndex = 0 // 默认值 // const titleMap: Record<string, number> = {
// flickerOvertime: 0,
// uaberranceOvertime: 3,
// ubalanceOvertime: 4,
// freqDevOvertime: 5
// }
if (field in titleMap) { // let defaultIndex = 0 // 默认值
defaultIndex = titleMap[field] let defaultIndex = indexOptions.value.findIndex((item: any) => item.name.includes(codeKey)) || 0
} else if (field.includes('uharm')) { // if (field in titleMap) {
defaultIndex = 1 // defaultIndex = titleMap[field]
} else if (field.includes('iharm')) { // } else if (field.includes('uharm')) {
defaultIndex = 2 // defaultIndex = indexOptions.value.findIndex((item: any) => item.code === 'uharm')
} // } else if (field.includes('iharm')) {
// defaultIndex = indexOptions.value.findIndex((item: any) => item.code === 'iharm')
// }
searchForm.value.index[0] = indexOptions.value[defaultIndex].id searchForm.value.index[0] = indexOptions.value[defaultIndex].id
}) })
@@ -205,7 +213,7 @@ const initCode = (field: string, title: string) => {
if (kk.harmStart && kk.harmEnd) { if (kk.harmStart && kk.harmEnd) {
range(0, 0, 0) range(0, 0, 0)
if (kk.showName == '间谐波电压含有率') { if (kk.showName.includes('间谐波电压')) {
countDataCopy.value[index].countOptions = range(kk.harmStart, kk.harmEnd, 1).map( countDataCopy.value[index].countOptions = range(kk.harmStart, kk.harmEnd, 1).map(
(item: any) => { (item: any) => {
return item - 0.5 return item - 0.5
@@ -287,14 +295,15 @@ const init = async () => {
let lists: any = [] let lists: any = []
let frequencys: any = null let frequencys: any = null
countData.value.map((item: any, index: any) => { countData.value.map((item: any, index: any) => {
if (item.name.includes('谐波含有率')) { if (item.name.includes('谐波')) {
frequencys = item.count frequencys = item.count
} else { } else {
frequencys = '' frequencys = ''
} }
lists[index] = { lists[index] = {
statisticalId: item.index, statisticalId: item.index,
frequency: frequencys !== null && frequencys !== undefined ? String(frequencys) : '' frequency: frequencys !== null && frequencys !== undefined ? String(frequencys) : ''
} }
}) })
let obj = { let obj = {
@@ -600,12 +609,12 @@ const formatCountOptions = () => {
}) })
countData.value.map((item: any, key: any) => { countData.value.map((item: any, key: any) => {
if (item.name == '谐波电流有效值') { if (item.name.includes('谐波电压')) {
item.name = '谐波电流次数'
} else if (item.name == '谐波电压含有率') {
item.name = '谐波电压次数'
} else if (item.name == '间谐波电压含有率') {
item.name = '间谐波电压次数' item.name = '间谐波电压次数'
} else if (item.name.includes('谐波电流')) {
item.name = '谐波电流次数'
} else if (item.name.includes('谐波电压')) {
item.name = '谐波电压次数'
} }
}) })
} }

View File

@@ -14,7 +14,7 @@
<el-option <el-option
v-for="item in options" v-for="item in options"
:key="item.lineId" :key="item.lineId"
:label="item.name" :label="item.lineName"
:value="item.lineId" :value="item.lineId"
/> />
</el-select> </el-select>
@@ -101,16 +101,7 @@ const tableStore: any = new TableStore({
title: '谐波电流越限(%)', title: '谐波电流越限(%)',
children: loop50('iharm') children: loop50('iharm')
}, },
{ {
title: '三相不平衡度越限(%)',
field: 'ubalanceOvertime',
width: '100',
render: 'customTemplate',
customTemplate: (row: any) => {
return `<span style='cursor: pointer;text-decoration: underline;'>${row.ubalanceOvertime}</span>`
}
},
{
title: '电压偏差越限(%)', title: '电压偏差越限(%)',
field: 'voltageDevOvertime', field: 'voltageDevOvertime',
width: '100', width: '100',
@@ -120,14 +111,24 @@ const tableStore: any = new TableStore({
} }
}, },
{ {
title: '频率偏差越限(%)', title: '三相不平衡度越限(%)',
field: 'freqDevOvertime', field: 'ubalanceOvertime',
width: '100', width: '100',
render: 'customTemplate', render: 'customTemplate',
customTemplate: (row: any) => { customTemplate: (row: any) => {
return `<span style='cursor: pointer;text-decoration: underline;'>${row.freqDevOvertime}</span>` return `<span style='cursor: pointer;text-decoration: underline;'>${row.ubalanceOvertime}</span>`
} }
} },
// {
// title: '频率偏差越限(%)',
// field: 'freqDevOvertime',
// width: '100',
// render: 'customTemplate',
// customTemplate: (row: any) => {
// return `<span style='cursor: pointer;text-decoration: underline;'>${row.freqDevOvertime}</span>`
// }
// }
], ],
beforeSearchFun: () => { beforeSearchFun: () => {
}, },
@@ -139,9 +140,10 @@ const tableStore: any = new TableStore({
provide('tableStore', tableStore) provide('tableStore', tableStore)
tableStore.table.params.sortBy = '' tableStore.table.params.sortBy = ''
tableStore.table.params.orderBy = '' tableStore.table.params.orderBy = ''
const open = async (row: any,searchBeginTime:any,searchEndTime:any,interval:any) => { const open = async (row: any,searchBeginTime:any,searchEndTime:any,interval:any,list:any) => {
dialogVisible.value = true dialogVisible.value = true
initCSlineList() options.value = list
// initCSlineList()
tableStore.table.params.lineId = row.lineId tableStore.table.params.lineId = row.lineId
nextTick(() => { nextTick(() => {

View File

@@ -217,7 +217,8 @@ const cellClickEvent = ({ row, column }: any) => {
row, row,
tableStore.table.params.searchBeginTime || prop.timeValue?.[0], tableStore.table.params.searchBeginTime || prop.timeValue?.[0],
tableStore.table.params.searchEndTime || prop.timeValue?.[1], tableStore.table.params.searchEndTime || prop.timeValue?.[1],
tableStore.table.params.interval || prop.interval tableStore.table.params.interval || prop.interval,
tableStore.table.data
) )
} }

View File

@@ -177,8 +177,8 @@ const onHarmonicRatioClose = () => {
} }
const initCSlineList = async () => { const initCSlineList = async () => {
const res = await cslineList({}) // const res = await cslineList({})
options.value = res.data // options.value = res.data
} }

View File

@@ -6,7 +6,7 @@
:timeKeyList="prop.timeKey" :timeKeyList="prop.timeKey"
@selectChange="selectChange" @selectChange="selectChange"
v-if="fullscreen" v-if="fullscreen"
datePicker
ref="TableHeaderRef" ref="TableHeaderRef"
> >
<template v-slot:select> <template v-slot:select>
@@ -29,7 +29,7 @@ import { ref, onMounted, provide, reactive, watch, nextTick } from 'vue'
import TableStore from '@/utils/tableStore' import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue' import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue' import TableHeader from '@/components/table/header/index.vue'
import { getTime } from '@/utils/formatTime' import { getTimeOfTheMonth } from '@/utils/formatTime'
import OverLimitDetails from '@/components/cockpit/indicatorFittingChart/components/overLimitDetails.vue' import OverLimitDetails from '@/components/cockpit/indicatorFittingChart/components/overLimitDetails.vue'
import { useRoute } from 'vue-router' import { useRoute } from 'vue-router'
import { useTimeCacheStore } from '@/stores/timeCache' import { useTimeCacheStore } from '@/stores/timeCache'
@@ -66,11 +66,11 @@ const fullscreen = computed(() => {
const selectChange = (showSelect: any, height: any, datePickerValue?: any) => { const selectChange = (showSelect: any, height: any, datePickerValue?: any) => {
headerHeight.value = height headerHeight.value = height
if (datePickerValue && datePickerValue.timeValue) { // if (datePickerValue && datePickerValue.timeValue) {
// 更新时间参数 // // 更新时间参数
tableStore.table.params.searchBeginTime = datePickerValue.timeValue[0] // tableStore.table.params.searchBeginTime = datePickerValue.timeValue[0]
tableStore.table.params.searchEndTime = datePickerValue.timeValue[1] // tableStore.table.params.searchEndTime = datePickerValue.timeValue[1]
} // }
} }
const tableStore: any = new TableStore({ const tableStore: any = new TableStore({
@@ -132,32 +132,34 @@ provide('tableStore', tableStore)
// 点击行 // 点击行
const cellClickEvent = ({ row, column }: any) => { const cellClickEvent = ({ row, column }: any) => {
if (column.field == 'lineName') { if (column.field == 'lineName') {
let time = getTimeOfTheMonth('3');
OverLimitDetailsRef.value.open( OverLimitDetailsRef.value.open(
row, row,
tableStore.table.params.searchBeginTime || prop.timeValue?.[0], time[0],
tableStore.table.params.searchEndTime || prop.timeValue?.[1], time[1],
tableStore.table.data tableStore.table.data
) )
} }
} }
const setTime = () => { const setTime = () => {
const time = getTime( // const time = getTime(
(TableHeaderRef.value?.datePickerRef.interval || prop.interval) ?? 0, // (TableHeaderRef.value?.datePickerRef.interval || prop.interval) ?? 0,
prop.timeKey, // prop.timeKey,
fullscreen.value // fullscreen.value
? [tableStore.table.params.searchBeginTime, tableStore.table.params.searchEndTime] // ? [tableStore.table.params.searchBeginTime, tableStore.table.params.searchEndTime]
: prop.timeValue // : prop.timeValue
) // )
if (Array.isArray(time)) { // if (Array.isArray(time)) {
tableStore.table.params.searchBeginTime = time[0] // tableStore.table.params.searchBeginTime = time[0]
tableStore.table.params.searchEndTime = time[1] // tableStore.table.params.searchEndTime = time[1]
// TableHeaderRef.value?.setInterval(time[2] - 0) // // TableHeaderRef.value?.setInterval(time[2] - 0)
// TableHeaderRef.value?.setTimeInterval([time[0], time[1]]) // // TableHeaderRef.value?.setTimeInterval([time[0], time[1]])
} else { // } else {
console.warn('获取时间失败time 不是一个有效数组') // console.warn('获取时间失败time 不是一个有效数组')
} // }
} }
// 在组件挂载时设置缓存值到 DatePicker // 在组件挂载时设置缓存值到 DatePicker

View File

@@ -5,7 +5,7 @@
ref="TableHeaderRef" ref="TableHeaderRef"
:showReset="false" :showReset="false"
@selectChange="selectChange" @selectChange="selectChange"
datePicker
v-if="fullscreen" v-if="fullscreen"
:timeKeyList="prop.timeKey" :timeKeyList="prop.timeKey"
></TableHeader> ></TableHeader>
@@ -86,11 +86,11 @@ const fileList = ref([])
const selectChange = (showSelect: any, height: any, datePickerValue?: any) => { const selectChange = (showSelect: any, height: any, datePickerValue?: any) => {
headerHeight.value = height headerHeight.value = height
if (datePickerValue && datePickerValue.timeValue) { // if (datePickerValue && datePickerValue.timeValue) {
// 更新时间参数 // // 更新时间参数
tableStore.table.params.searchBeginTime = datePickerValue.timeValue[0] // tableStore.table.params.searchBeginTime = datePickerValue.timeValue[0]
tableStore.table.params.searchEndTime = datePickerValue.timeValue[1] // tableStore.table.params.searchEndTime = datePickerValue.timeValue[1]
} // }
} }
// 计算是否全屏展示 // 计算是否全屏展示
@@ -297,22 +297,22 @@ tableStore.table.params.keywords = ''
provide('tableStore', tableStore) provide('tableStore', tableStore)
const setTime = () => { const setTime = () => {
const time = getTime( // const time = getTime(
(TableHeaderRef.value?.datePickerRef.interval || prop.interval) ?? 0, // (TableHeaderRef.value?.datePickerRef.interval || prop.interval) ?? 0,
prop.timeKey, // prop.timeKey,
fullscreen.value // fullscreen.value
? [tableStore.table.params.searchBeginTime, tableStore.table.params.searchEndTime] // ? [tableStore.table.params.searchBeginTime, tableStore.table.params.searchEndTime]
: prop.timeValue // : prop.timeValue
) // )
if (Array.isArray(time)) { // if (Array.isArray(time)) {
tableStore.table.params.searchBeginTime = time[0] // tableStore.table.params.searchBeginTime = time[0]
tableStore.table.params.searchEndTime = time[1] // tableStore.table.params.searchEndTime = time[1]
TableHeaderRef.value?.setInterval(time[2] - 0) // TableHeaderRef.value?.setInterval(time[2] - 0)
TableHeaderRef.value?.setTimeInterval([time[0], time[1]]) // TableHeaderRef.value?.setTimeInterval([time[0], time[1]])
} else { // } else {
console.warn('获取时间失败time 不是一个有效数组') // console.warn('获取时间失败time 不是一个有效数组')
} // }
} }
// 点击行 // 点击行

View File

@@ -82,11 +82,7 @@
</TableHeader> </TableHeader>
</div> </div>
<div class="history_chart" :style="pageHeight" v-loading="loading"> <div class="history_chart" :style="pageHeight" v-loading="loading">
<MyEchart <MyEchart ref="historyChart" :options="echartsData" v-if="showEchart" />
ref="historyChart"
:options="echartsData"
v-if="showEchart"
/>
<el-empty :style="pageHeight" v-else description="暂无数据" /> <el-empty :style="pageHeight" v-else description="暂无数据" />
</div> </div>
</el-dialog> </el-dialog>
@@ -160,28 +156,40 @@ const countOptions: any = ref([])
const legendDictList: any = ref([]) const legendDictList: any = ref([])
const initCode = (field: string, title: string) => { const initCode = (field: string, title: string) => {
queryByCode('steady_state_limit_trend').then(res => { queryByCode('gridSide_exceedTheLimit').then(res => {
queryCsDictTree(res.data.id).then(item => { queryCsDictTree(res.data.id).then(item => {
//排序 //排序
indexOptions.value = item.data.sort((a: any, b: any) => { indexOptions.value = item.data.sort((a: any, b: any) => {
return a.sort - b.sort return a.sort - b.sort
}) })
const titleMap: Record<string, number> = { // const titleMap: Record<string, number> = {
flickerOvertime: 0, // flickerOvertime: 0,
uaberranceOvertime: 3, // uaberranceOvertime: 3,
ubalanceOvertime: 4, // ubalanceOvertime: 4,
freqDevOvertime: 5 // freqDevOvertime: 5
} // }
let defaultIndex = 0 // 默认值 // let defaultIndex = 0 // 默认值
if (field in titleMap) { // if (field in titleMap) {
defaultIndex = titleMap[field] // defaultIndex = titleMap[field]
} else if (field.includes('uharm')) { // } else if (field.includes('uharm')) {
defaultIndex = 1 // defaultIndex = 1
} else if (field.includes('iharm')) { // } else if (field.includes('iharm')) {
defaultIndex = 2 // defaultIndex = 2
} // }
let codeKey = field.includes('flickerOvertime')
? '闪变'
: field.includes('uharm')
? '谐波电压'
: field.includes('iharm')
? '谐波电流'
: field.includes('voltageDevOvertime')
? '电压偏差'
: field.includes('ubalanceOvertime')
? '不平衡'
: ''
let defaultIndex = indexOptions.value.findIndex((item: any) => item.name.includes(codeKey)) || 0
searchForm.value.index[0] = indexOptions.value[defaultIndex].id searchForm.value.index[0] = indexOptions.value[defaultIndex].id
}) })
@@ -205,7 +213,7 @@ const initCode = (field: string, title: string) => {
if (kk.harmStart && kk.harmEnd) { if (kk.harmStart && kk.harmEnd) {
range(0, 0, 0) range(0, 0, 0)
if (kk.showName == '间谐波电压含有率') { if (kk.showName.includes('间谐波电压')) {
countDataCopy.value[index].countOptions = range(kk.harmStart, kk.harmEnd, 1).map( countDataCopy.value[index].countOptions = range(kk.harmStart, kk.harmEnd, 1).map(
(item: any) => { (item: any) => {
return item - 0.5 return item - 0.5
@@ -294,7 +302,7 @@ const init = async () => {
} }
lists[index] = { lists[index] = {
statisticalId: item.index, statisticalId: item.index,
frequency: frequencys !== null && frequencys !== undefined ? String(frequencys) : '' frequency: frequencys !== null && frequencys !== undefined ? String(frequencys) : ''
} }
}) })
let obj = { let obj = {
@@ -600,12 +608,12 @@ const formatCountOptions = () => {
}) })
countData.value.map((item: any, key: any) => { countData.value.map((item: any, key: any) => {
if (item.name == '谐波电流有效值') { if (item.name.includes('谐波电压')) {
item.name = '谐波电流次数'
} else if (item.name == '谐波电压含有率') {
item.name = '谐波电压次数'
} else if (item.name == '间谐波电压含有率') {
item.name = '间谐波电压次数' item.name = '间谐波电压次数'
} else if (item.name.includes('谐波电流')) {
item.name = '谐波电流次数'
} else if (item.name.includes('谐波电压')) {
item.name = '谐波电压次数'
} }
}) })
} }

View File

@@ -101,16 +101,7 @@ const tableStore: any = new TableStore({
title: '谐波电流越限(%)', title: '谐波电流越限(%)',
children: loop50('iharm') children: loop50('iharm')
}, },
{ {
title: '三相不平衡度越限(%)',
field: 'ubalanceOvertime',
width: '100',
render: 'customTemplate',
customTemplate: (row: any) => {
return `<span style='cursor: pointer;text-decoration: underline;'>${row.ubalanceOvertime}</span>`
}
},
{
title: '电压偏差越限(%)', title: '电压偏差越限(%)',
field: 'voltageDevOvertime', field: 'voltageDevOvertime',
width: '100', width: '100',
@@ -120,14 +111,24 @@ const tableStore: any = new TableStore({
} }
}, },
{ {
title: '频率偏差越限(%)', title: '三相不平衡度越限(%)',
field: 'freqDevOvertime', field: 'ubalanceOvertime',
width: '100', width: '100',
render: 'customTemplate', render: 'customTemplate',
customTemplate: (row: any) => { customTemplate: (row: any) => {
return `<span style='cursor: pointer;text-decoration: underline;'>${row.freqDevOvertime}</span>` return `<span style='cursor: pointer;text-decoration: underline;'>${row.ubalanceOvertime}</span>`
} }
} },
// {
// title: '频率偏差越限(%)',
// field: 'freqDevOvertime',
// width: '100',
// render: 'customTemplate',
// customTemplate: (row: any) => {
// return `<span style='cursor: pointer;text-decoration: underline;'>${row.freqDevOvertime}</span>`
// }
// }
], ],
beforeSearchFun: () => { beforeSearchFun: () => {
}, },

View File

@@ -5,7 +5,7 @@
ref="TableHeaderRef" ref="TableHeaderRef"
:showReset="false" :showReset="false"
@selectChange="selectChange" @selectChange="selectChange"
datePicker
v-if="fullscreen" v-if="fullscreen"
:timeKeyList="prop.timeKey" :timeKeyList="prop.timeKey"
></TableHeader> ></TableHeader>
@@ -45,11 +45,11 @@ const sensitiveUserType = dictData.getBasicData('Interference_Source')
const selectChange = (showSelect: any, height: any, datePickerValue?: any) => { const selectChange = (showSelect: any, height: any, datePickerValue?: any) => {
headerHeight.value = height headerHeight.value = height
if (datePickerValue && datePickerValue.timeValue) { // if (datePickerValue && datePickerValue.timeValue) {
// 更新时间参数 // // 更新时间参数
tableStore.table.params.searchBeginTime = datePickerValue.timeValue[0] // tableStore.table.params.searchBeginTime = datePickerValue.timeValue[0]
tableStore.table.params.searchEndTime = datePickerValue.timeValue[1] // tableStore.table.params.searchEndTime = datePickerValue.timeValue[1]
} // }
} }
// 计算是否全屏展示 // 计算是否全屏展示
@@ -130,22 +130,22 @@ const cellClickEvent = ({ row, column }: any) => {
} }
const setTime = () => { const setTime = () => {
const time = getTime( // const time = getTime(
(TableHeaderRef.value?.datePickerRef.interval || prop.interval) ?? 0, // (TableHeaderRef.value?.datePickerRef.interval || prop.interval) ?? 0,
prop.timeKey, // prop.timeKey,
fullscreen.value // fullscreen.value
? [tableStore.table.params.searchBeginTime, tableStore.table.params.searchEndTime] // ? [tableStore.table.params.searchBeginTime, tableStore.table.params.searchEndTime]
: prop.timeValue // : prop.timeValue
) // )
if (Array.isArray(time)) { // if (Array.isArray(time)) {
tableStore.table.params.searchBeginTime = time[0] // tableStore.table.params.searchBeginTime = time[0]
tableStore.table.params.searchEndTime = time[1] // tableStore.table.params.searchEndTime = time[1]
TableHeaderRef.value?.setInterval(time[2] - 0) // TableHeaderRef.value?.setInterval(time[2] - 0)
TableHeaderRef.value?.setTimeInterval([time[0], time[1]]) // TableHeaderRef.value?.setTimeInterval([time[0], time[1]])
} else { // } else {
console.warn('获取时间失败time 不是一个有效数组') // console.warn('获取时间失败time 不是一个有效数组')
} // }
} }
onMounted(() => { onMounted(() => {

View File

@@ -325,7 +325,6 @@ const setEchart = () => {
const xname = params[0].value[0] const xname = params[0].value[0]
let str = `${xname}<br>` let str = `${xname}<br>`
params.forEach((el: any, index: any) => { params.forEach((el: any, index: any) => {
console.log('🚀 ~ setEchart ~ el:', el)
let marker = '' let marker = ''
marker = `<span style="display:inline-block;border: 2px ${el.color} ${el.value[3]};margin-right:5px;width:40px;height:0px;background-color:#ffffff00;"></span>` marker = `<span style="display:inline-block;border: 2px ${el.color} ${el.value[3]};margin-right:5px;width:40px;height:0px;background-color:#ffffff00;"></span>`

View File

@@ -7,7 +7,7 @@ import { ref, nextTick, onMounted, defineProps } from 'vue'
import Tree from '../index.vue' import Tree from '../index.vue'
import { getLineTree,getCldTree } from '@/api/cs-device-boot/csLedger' import { getLineTree,getCldTree } from '@/api/cs-device-boot/csLedger'
import { useConfig } from '@/stores/config' import { useConfig } from '@/stores/config'
import { getTemplateByDept } from '@/api/harmonic-boot/luckyexcel' import { querySysExcel } from '@/api/harmonic-boot/luckyexcel'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
interface Props { interface Props {
@@ -158,7 +158,7 @@ const onAdd = () => {
emit('onAdd') emit('onAdd')
} }
if (props.template) { if (props.template) {
getTemplateByDept({ id: dictData.state.area[0]?.id }) querySysExcel({ id: dictData.state.area[0]?.id })
.then((res: any) => { .then((res: any) => {
emit('Policy', res.data) emit('Policy', res.data)
info() info()

View File

@@ -15,7 +15,7 @@ import { ref, nextTick, onMounted, defineProps } from 'vue'
import Tree from '../index.vue' import Tree from '../index.vue'
import { getLineTree, objTree } from '@/api/cs-device-boot/csLedger' import { getLineTree, objTree } from '@/api/cs-device-boot/csLedger'
import { useConfig } from '@/stores/config' import { useConfig } from '@/stores/config'
import { getTemplateByDept } from '@/api/harmonic-boot/luckyexcel' import { querySysExcel } from '@/api/harmonic-boot/luckyexcel'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
interface Props { interface Props {
@@ -85,7 +85,7 @@ const onAdd = () => {
emit('onAdd') emit('onAdd')
} }
if (props.template) { if (props.template) {
getTemplateByDept({ id: dictData.state.area[0]?.id }) querySysExcel({ id: dictData.state.area[0]?.id })
.then((res: any) => { .then((res: any) => {
emit('Policy', res.data) emit('Policy', res.data)
info() info()

View File

@@ -7,7 +7,7 @@ import { ref, nextTick, onMounted, defineProps } from 'vue'
import Tree from '../point.vue' import Tree from '../point.vue'
import { getLineTree } from '@/api/cs-device-boot/csLedger' import { getLineTree } from '@/api/cs-device-boot/csLedger'
import { useConfig } from '@/stores/config' import { useConfig } from '@/stores/config'
import { getTemplateByDept } from '@/api/harmonic-boot/luckyexcel' import { querySysExcel } from '@/api/harmonic-boot/luckyexcel'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
// const props = defineProps(['template']) // const props = defineProps(['template'])
interface Props { interface Props {
@@ -138,7 +138,7 @@ const changePointType = (val: any, obj: any) => {
emit('pointTypeChange', val, obj) emit('pointTypeChange', val, obj)
} }
if (props.template) { if (props.template) {
getTemplateByDept({ id: dictData.state.area[0]?.id }) querySysExcel({ id: dictData.state.area[0]?.id })
.then((res: any) => { .then((res: any) => {
emit('Policy', res.data) emit('Policy', res.data)
info() info()

View File

@@ -53,7 +53,7 @@ import { getSchemeTree, getTestRecordInfo } from '@/api/cs-device-boot/planData'
import { useConfig } from '@/stores/config' import { useConfig } from '@/stores/config'
import useCurrentInstance from '@/utils/useCurrentInstance' import useCurrentInstance from '@/utils/useCurrentInstance'
import { ElTree } from 'element-plus' import { ElTree } from 'element-plus'
import { getTemplateByDept } from '@/api/harmonic-boot/luckyexcel' import { querySysExcel } from '@/api/harmonic-boot/luckyexcel'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
defineOptions({ defineOptions({
name: 'govern/schemeTree' name: 'govern/schemeTree'
@@ -157,7 +157,7 @@ const clickNode = (e: anyObj) => {
} }
if (props.template) { if (props.template) {
getTemplateByDept({ id: dictData.state.area[0]?.id }) querySysExcel({ id: dictData.state.area[0]?.id })
.then((res: any) => { .then((res: any) => {
emit('Policy', res.data) emit('Policy', res.data)
getTreeList() getTreeList()

View File

@@ -230,14 +230,14 @@
</el-form-item> </el-form-item>
<el-form-item <el-form-item
class="form-item" class="form-item"
label="地:" label="地:"
:prop="'projectInfoList[' + index + '].area'" :prop="'projectInfoList[' + index + '].area'"
:rules="[{ required: true, message: '请输入地', trigger: 'blur' }]" :rules="[{ required: true, message: '请输入地', trigger: 'blur' }]"
> >
<el-input <el-input
clearable clearable
v-model="item.area" v-model="item.area"
placeholder="请输入地" placeholder="请输入地"
:disabled=" :disabled="
!( !(
(nodeLevel == 2 && pageStatus == 3) || (nodeLevel == 2 && pageStatus == 3) ||

View File

@@ -16,14 +16,19 @@
<el-button type="primary" :icon="Setting" @click="handleUpDevice">补召</el-button> <el-button type="primary" :icon="Setting" @click="handleUpDevice">补召</el-button>
<el-button :icon="Back" @click="go(-1)">返回</el-button> <el-button :icon="Back" @click="go(-1)">返回</el-button>
</template> </template>
</TableHeader> </TableHeader>
<!-- 设备补召 --> <!-- 设备补召 -->
<div class=" current_device" v-loading="loading"> <div class="current_device" v-loading="loading">
<div class="current_body" ref="tbodyRef"> <div class="current_body" ref="tbodyRef">
<vxe-table border ref="tableRef" :data="dirList" align="center" height="auto" <vxe-table
:style="{ height: tableHeight }" @radio-change="radioChangeEvent"> border
ref="tableRef"
:data="dirList"
align="center"
height="auto"
:style="{ height: tableHeight }"
@radio-change="radioChangeEvent"
>
<vxe-column type="radio" width="60"> <vxe-column type="radio" width="60">
<template #header> <template #header>
<vxe-button mode="text" @click="clearRadioRowEvent" :disabled="!selectRow">取消</vxe-button> <vxe-button mode="text" @click="clearRadioRowEvent" :disabled="!selectRow">取消</vxe-button>
@@ -34,13 +39,20 @@
<vxe-column field="status" title="补召进度"> <vxe-column field="status" title="补召进度">
<template #default="{ row }"> <template #default="{ row }">
<div class="finish" v-if="row.status == 100"> <div class="finish" v-if="row.status == 100">
<SuccessFilled style="width: 16px;" /><span class="ml5">补召完成</span> <SuccessFilled style="width: 16px" />
<span class="ml5">补召完成</span>
</div> </div>
<el-progress v-model.trim="row.status" v-else :class="row.status == 100 ? 'progress' : ''" <el-progress
:format="format" :stroke-width="10" striped :percentage="row.status" :duration="30" v-model.trim="row.status"
striped-flow /> v-else
:class="row.status == 100 ? 'progress' : ''"
:format="format"
:stroke-width="10"
striped
:percentage="row.status"
:duration="30"
striped-flow
/>
</template> </template>
</vxe-column> </vxe-column>
<vxe-column field="startTime" title="起始时间"></vxe-column> <vxe-column field="startTime" title="起始时间"></vxe-column>
@@ -58,10 +70,7 @@ import { useRouter, useRoute } from 'vue-router'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import { VxeUI, VxeTableInstance, VxeTableEvents } from 'vxe-table' import { VxeUI, VxeTableInstance, VxeTableEvents } from 'vxe-table'
import { SuccessFilled } from '@element-plus/icons-vue' import { SuccessFilled } from '@element-plus/icons-vue'
import { import { Back, Setting, Search } from '@element-plus/icons-vue'
Back,
Setting, Search
} from '@element-plus/icons-vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import mqtt from 'mqtt' import mqtt from 'mqtt'
defineOptions({ defineOptions({
@@ -75,7 +84,7 @@ const loading = ref(false)
const dirList = ref([]) const dirList = ref([])
const route: any = ref({}) const route: any = ref({})
const datePickerRef = ref() const datePickerRef = ref()
const format = (percentage) => (percentage === 100 ? '完成' : `${percentage}%`) const format = percentage => (percentage === 100 ? '完成' : `${percentage}%`)
const getMakeUpDataList = (row: any) => { const getMakeUpDataList = (row: any) => {
route.value = row route.value = row
loading.value = true loading.value = true
@@ -139,11 +148,11 @@ const handleUpDevice = () => {
} }
const radioChangeEvent: VxeTableEvents.RadioChange = ({ row }) => { const radioChangeEvent: VxeTableEvents.RadioChange = ({ row }) => {
datePickerRef.value.timeValue = [row.startTime.split(' ')[0] , row.endTime.split(' ')[0] ]
selectRow.value = row selectRow.value = row
// console.log('单选事件') // console.log('单选事件')
} }
const clearRadioRowEvent = () => { const clearRadioRowEvent = () => {
const $table = tableRef.value const $table = tableRef.value
if ($table) { if ($table) {
@@ -152,7 +161,7 @@ const clearRadioRowEvent = () => {
} }
} }
const mqttRef = ref() const mqttRef = ref()
const url: any = window.localStorage.getItem('MQTTURL') const url: any = window.localStorage.getItem('MQTTURL')
const connectMqtt = () => { const connectMqtt = () => {
if (mqttRef.value) { if (mqttRef.value) {
if (mqttRef.value.connected) { if (mqttRef.value.connected) {
@@ -173,10 +182,10 @@ const connectMqtt = () => {
const handleSearch = () => { const handleSearch = () => {
getMakeUpDataList(route.value) getMakeUpDataList(route.value)
} }
function parseStringToObject(str:string) { function parseStringToObject(str: string) {
const content = str.replace(/^{|}$/g, '') const content = str.replace(/^{|}$/g, '')
const pairs = content.split(',') const pairs = content.split(',')
const result:any = {} const result: any = {}
pairs.forEach(pair => { pairs.forEach(pair => {
const [key, value] = pair.split(':') const [key, value] = pair.split(':')
// 尝试将数字转换为Number类型 // 尝试将数字转换为Number类型
@@ -210,7 +219,6 @@ mqttRef.value.on('message', (topic: any, message: any) => {
let percentage = parseInt(Number((mqttMessage.value.nowStep / mqttMessage.value.allStep) * 100)) || 0 let percentage = parseInt(Number((mqttMessage.value.nowStep / mqttMessage.value.allStep) * 100)) || 0
if (percentage > 5) { if (percentage > 5) {
item.status = percentage item.status = percentage
} }
} }
// }) // })
@@ -226,6 +234,8 @@ mqttRef.value.on('close', function () {
console.log('mqtt客户端已断开连接.....') console.log('mqtt客户端已断开连接.....')
}) })
onMounted(() => { onMounted(() => {
datePickerRef.value.setInterval(5)
datePickerRef.value.setTimeOptions([{ label: '自定义', value: 5 }])
}) })
onBeforeUnmount(() => { onBeforeUnmount(() => {
if (mqttRef.value) { if (mqttRef.value) {
@@ -261,14 +271,21 @@ defineExpose({ getMakeUpDataList })
// } // }
// } // }
:deep(.el-progress-bar__inner--striped) { :deep(.el-progress-bar__inner--striped) {
background-image: linear-gradient(45deg, rgba(255, 255, 255, .3) 25%, transparent 0, transparent 50%, rgba(255, 255, 255, .3) 0, rgba(255, 255, 255, .3) 75%, transparent 0, transparent); background-image: linear-gradient(
45deg,
rgba(255, 255, 255, 0.3) 25%,
transparent 0,
transparent 50%,
rgba(255, 255, 255, 0.3) 0,
rgba(255, 255, 255, 0.3) 75%,
transparent 0,
transparent
);
} }
:deep(.progress) { :deep(.progress) {
.el-progress__text { .el-progress__text {
color: green; color: green;
} }
} }
@@ -276,6 +293,6 @@ defineExpose({ getMakeUpDataList })
display: flex; display: flex;
justify-content: center; justify-content: center;
font-weight: 550; font-weight: 550;
color: #009688 color: #009688;
} }
</style> </style>

View File

@@ -11,7 +11,7 @@
<template v-slot:select> <template v-slot:select>
<el-form-item label="模板策略"> <el-form-item label="模板策略">
<el-select v-model.trim="Template" @change="changetype" placeholder="请选择模版" value-key="id"> <el-select v-model.trim="Template" @change="changetype" placeholder="请选择模版" value-key="id">
<el-option v-for="item in templatePolicy" :key="item.id" :label="item.name" <el-option v-for="item in templatePolicy" :key="item.id" :label="item.excelName"
:value="item"></el-option> :value="item"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@@ -35,7 +35,6 @@ import PointTree from '@/components/tree/govern/pointTree.vue'
import TableHeader from '@/components/table/header/index.vue' import TableHeader from '@/components/table/header/index.vue'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import { getTemplateByDept } from '@/api/harmonic-boot/luckyexcel'
import { exportExcel } from '@/views/system/reportForms/export.js' import { exportExcel } from '@/views/system/reportForms/export.js'
import 'splitpanes/dist/splitpanes.css' import 'splitpanes/dist/splitpanes.css'
import { Splitpanes, Pane } from 'splitpanes' import { Splitpanes, Pane } from 'splitpanes'
@@ -106,16 +105,11 @@ onMounted(() => {
} }
}) })
// getTemplateByDept({ id: dictData.state.area[0].id }).then((res: any) => {
// templatePolicy.value = res.data
// })
const stencil = (val: any) => { const stencil = (val: any) => {
templatePolicy.value = val templatePolicy.value = val
Template.value = val[0] Template.value = val[0]
reportForm.value = val[0]?.reportForm reportForm.value = val[0]?.excelType
} }

View File

@@ -14,7 +14,7 @@
</el-form-item> </el-form-item>
<el-form-item label="模板策略"> <el-form-item label="模板策略">
<el-select v-model.trim="Template" @change="changetype" placeholder="请选择模版" value-key="id"> <el-select v-model.trim="Template" @change="changetype" placeholder="请选择模版" value-key="id">
<el-option v-for="item in templatePolicy" :key="item.id" :label="item.name" <el-option v-for="item in templatePolicy" :key="item.id" :label="item.excelName"
:value="item"></el-option> :value="item"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@@ -40,7 +40,6 @@ import pointTreeWx from '@/components/tree/govern/pointTreeWx.vue'
import TableHeader from '@/components/table/header/index.vue' import TableHeader from '@/components/table/header/index.vue'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import { getTemplateByDept } from '@/api/harmonic-boot/luckyexcel'
import { exportExcel } from '@/views/system/reportForms/export.js' import { exportExcel } from '@/views/system/reportForms/export.js'
import 'splitpanes/dist/splitpanes.css' import 'splitpanes/dist/splitpanes.css'
import DatePicker from '@/components/form/datePicker/time.vue' import DatePicker from '@/components/form/datePicker/time.vue'
@@ -112,21 +111,16 @@ onMounted(() => {
}) })
}) })
// getTemplateByDept({ id: dictData.state.area[0].id }).then((res: any) => {
// templatePolicy.value = res.data
// })
const stencil = (val: any) => { const stencil = (val: any) => {
templatePolicy.value = val templatePolicy.value = val
Template.value = val[0] Template.value = val[0]
reportForm.value = val[0]?.reportForm reportForm.value = val[0]?.excelType
} }
const changetype = (val: any) => { const changetype = (val: any) => {
reportForm.value = val.reportForm reportForm.value = val.excelType
} }
const handleNodeClick = (data: any, node: any) => { const handleNodeClick = (data: any, node: any) => {

View File

@@ -29,7 +29,7 @@
<el-option <el-option
v-for="item in templatePolicy" v-for="item in templatePolicy"
:key="item.id" :key="item.id"
:label="item.name" :label="item.excelName"
:value="item" :value="item"
></el-option> ></el-option>
</el-select> </el-select>
@@ -62,7 +62,6 @@ import pointTreeWx from '@/components/tree/govern/pointTreeWx.vue'
import TableHeader from '@/components/table/header/index.vue' import TableHeader from '@/components/table/header/index.vue'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import { getTemplateByDept } from '@/api/harmonic-boot/luckyexcel'
import { exportExcel } from '@/views/system/reportForms/export.js' import { exportExcel } from '@/views/system/reportForms/export.js'
import 'splitpanes/dist/splitpanes.css' import 'splitpanes/dist/splitpanes.css'
import DatePicker from '@/components/form/datePicker/time.vue' import DatePicker from '@/components/form/datePicker/time.vue'
@@ -144,15 +143,11 @@ onMounted(() => {
}) })
}) })
// getTemplateByDept({ id: dictData.state.area[0].id }).then((res: any) => {
// templatePolicy.value = res.data
// })
const stencil = (val: any) => { const stencil = (val: any) => {
templatePolicy.value = val.filter((item: any) => item.reportForm != '4') templatePolicy.value = val.filter((item: any) => item.excelType != '4')
Template.value = templatePolicy.value[0] Template.value = templatePolicy.value[0]
reportForm.value = templatePolicy.value[0]?.reportForm reportForm.value = templatePolicy.value[0]?.excelType
} }
const changetype = (val: any) => { const changetype = (val: any) => {

View File

@@ -29,7 +29,7 @@
<el-option <el-option
v-for="item in templatePolicy" v-for="item in templatePolicy"
:key="item.id" :key="item.id"
:label="item.name" :label="item.excelName"
:value="item" :value="item"
></el-option> ></el-option>
</el-select> </el-select>
@@ -72,7 +72,6 @@ import pointTreeWx from '@/components/tree/govern/pointTreeWx.vue'
import TableHeader from '@/components/table/header/index.vue' import TableHeader from '@/components/table/header/index.vue'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import { mainHeight } from '@/utils/layout' import { mainHeight } from '@/utils/layout'
import { getTemplateByDept } from '@/api/harmonic-boot/luckyexcel'
import { exportExcel } from '@/views/system/reportForms/export.js' import { exportExcel } from '@/views/system/reportForms/export.js'
import 'splitpanes/dist/splitpanes.css' import 'splitpanes/dist/splitpanes.css'
import DatePicker from '@/components/form/datePicker/time.vue' import DatePicker from '@/components/form/datePicker/time.vue'
@@ -154,10 +153,6 @@ onMounted(() => {
}) })
}) })
// getTemplateByDept({ id: dictData.state.area[0].id }).then((res: any) => {
// templatePolicy.value = res.data
// })
const idList = ref([]) const idList = ref([])
// 监测对象 // 监测对象
const initListByIds = () => { const initListByIds = () => {
@@ -174,13 +169,13 @@ const initListByIds = () => {
} }
const stencil = (val: any) => { const stencil = (val: any) => {
console.log('🚀 ~ stencil ~ val:', val) console.log('🚀 ~ stencil ~ val:', val)
templatePolicy.value = val.filter((item: any) => item.reportForm == '4') templatePolicy.value = val.filter((item: any) => item.excelType == '4')
Template.value = templatePolicy.value[0] Template.value = templatePolicy.value[0]
reportForm.value = templatePolicy.value[0]?.reportForm reportForm.value = templatePolicy.value[0]?.excelType
} }
const changetype = (val: any) => { const changetype = (val: any) => {
reportForm.value = val.reportForm reportForm.value = val.excelType
} }
const handleNodeClick = (data: any, node: any) => { const handleNodeClick = (data: any, node: any) => {

View File

@@ -0,0 +1,111 @@
<template>
<el-dialog class="cn-operate-dialog" width="500px" v-model.trim="dialogVisible" :title="title">
<el-form :inline="false" ref="formRef" :model="form" label-width="auto" class="form-one" :rules="rules">
<el-form-item label="报表名称" prop="modelTypeName">
<el-input
maxlength="32"
show-word-limit
v-model.trim="form.modelTypeName"
placeholder="请输入菜单名称"
/>
</el-form-item>
<el-form-item label="报表类型" prop="modelType">
<el-select style="width: 100%" v-model.trim="form.modelType" placeholder="请选择报表类型">
<el-option
v-for="item in reportFormList"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input maxlength="32" show-word-limit-number v-model.number="form.sort" :min="0" />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submit">确认</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, inject } from 'vue'
import { reactive } from 'vue'
import TableStore from '@/utils/tableStore'
import { ElMessage } from 'element-plus'
import { add, update } from '@/api/user-boot/role'
import { useAdminInfo } from '@/stores/adminInfo'
import { updateSysExcel, addSysExcel } from '@/api/harmonic-boot/luckyexcel'
const adminInfo = useAdminInfo()
const tableStore = inject('tableStore') as TableStore
// do not use same name with ref
const form = reactive({
modelTypeName: '',
id: '',
sort: 100,
modelType: ''
})
const reportFormList = [
{
value: '1',
label: '分析报表'
},
{
value: '2',
label: '统计报表'
},
{
value: '4',
label: '治理前后对比报表'
},
{
value: '3',
label: '自定义报表'
}
]
const rules = {
modelTypeName: [{ required: true, message: '请输入报表名称', trigger: 'blur' }],
modelType: [{ required: true, message: '请选择报表类型', trigger: 'change' }],
sort: [{ required: true, message: '请输入排序', trigger: 'blur' }]
}
const dialogVisible = ref(false)
const title = ref('新增菜单')
const formRef = ref()
const open = (text: string, data?: anyObj) => {
formRef.value?.resetFields()
title.value = text
dialogVisible.value = true
if (data) {
form.id = data.id
form.modelTypeName = data.excelName
form.modelType = data.excelType
form.sort = data.sort
} else {
form.id = ''
form.modelTypeName = ''
form.modelType =''
form.sort = 100
}
}
const submit = async () => {
formRef.value.validate(async valid => {
if (valid) {
if (form.id) {
await updateSysExcel(form)
} else {
await addSysExcel(form)
}
ElMessage.success('保存成功')
tableStore.index()
dialogVisible.value = false
}
})
}
defineExpose({ open })
</script>

View File

@@ -2,8 +2,13 @@
<el-dialog draggable :title="title" v-model.trim="formVisible" width="500px" :before-close="closeDialog"> <el-dialog draggable :title="title" v-model.trim="formVisible" width="500px" :before-close="closeDialog">
<el-form :model="formdata" label-width="100px" :rules="rules" ref="ruleForm" class="form-one"> <el-form :model="formdata" label-width="100px" :rules="rules" ref="ruleForm" class="form-one">
<el-form-item label="模板名称:" prop="name"> <el-form-item label="模板名称:" prop="name">
<el-input maxlength="32" show-word-limit placeholder="模板名称" v-model.trim="formdata.name" <el-input
style="width: 100%"></el-input> maxlength="32"
show-word-limit
placeholder="模板名称"
v-model.trim="formdata.name"
style="width: 100%"
></el-input>
</el-form-item> </el-form-item>
<!-- <el-form-item label="部门:" prop="deptId"> <!-- <el-form-item label="部门:" prop="deptId">
<Area v-model.trim="formdata.deptId" style="width: 100%" collapse-tags <Area v-model.trim="formdata.deptId" style="width: 100%" collapse-tags
@@ -12,16 +17,37 @@
<el-form-item label="模板类型:" prop="reportType"> <el-form-item label="模板类型:" prop="reportType">
<el-select style="width: 100%" v-model.trim="formdata.reportType" placeholder="请选择模板类型"> <el-select style="width: 100%" v-model.trim="formdata.reportType" placeholder="请选择模板类型">
<el-option v-for="item in classificationData" :key="item.id" :label="item.label" <el-option
:value="item.id"></el-option> v-for="item in classificationData"
:key="item.id"
:label="item.label"
:value="item.id"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="报表类型:" prop="reportForm"> <el-form-item label="报表类型:" prop="reportForm">
<el-select style="width: 100%" v-model.trim="formdata.reportForm" placeholder="请选择报表类型"> <el-select style="width: 100%" v-model.trim="formdata.reportForm" placeholder="请选择报表类型">
<el-option v-for="item in reportFormList" :key="item.value" :label="item.label" <el-option
:value="item.value"></el-option> v-for="item in reportFormList"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="接线方式:" prop="wiringMethod">
<el-select style="width: 100%" v-model.trim="formdata.wiringMethod" placeholder="请选择接线方式">
<el-option
v-for="item in volConTypeList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="排序" prop="sort">
<el-input maxlength="32" show-word-limit-number v-model.number="formdata.sort" :min="0" />
</el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
<el-button @click="closeDialog"> </el-button> <el-button @click="closeDialog"> </el-button>
@@ -37,6 +63,9 @@ const emit = defineEmits(['submitForm'])
const title = ref('') const title = ref('')
const list = ref({}) const list = ref({})
const ruleForm = ref() const ruleForm = ref()
import { useDictData } from '@/stores/dictData'
const dictData = useDictData()
const volConTypeList: any = dictData.getBasicData('Dev_Connect')
const formVisible = ref(false) const formVisible = ref(false)
const classificationData = [ const classificationData = [
{ {
@@ -56,34 +85,37 @@ const reportFormList = [
{ {
value: '2', value: '2',
label: '统计报表' label: '统计报表'
}, { },
{
value: '4', value: '4',
label: '治理前后对比报表' label: '治理前后对比报表'
}, },
{ {
value: '3', value: '3',
label: '自定义报表' label: '自定义报表'
}, }
] ]
const rules = { const rules = {
name: [{ required: true, message: '请输入模板名称', trigger: 'blur' }], name: [{ required: true, message: '请输入模板名称', trigger: 'blur' }],
deptId: [{ required: true, message: '请选择部门', trigger: 'change' }], deptId: [{ required: true, message: '请选择部门', trigger: 'change' }],
reportType: [{ required: true, message: '请选择模板类型', trigger: 'change' }], reportType: [{ required: true, message: '请选择模板类型', trigger: 'change' }],
reportForm: [{ required: true, message: '请选择报表类型', trigger: 'change' }] reportForm: [{ required: true, message: '请选择报表类型', trigger: 'change' }],
wiringMethod: [{ required: true, message: '请选择接线方式', trigger: 'change' }],
sort: [{ required: true, message: '请输入排序', trigger: 'blur' }]
} }
const formdata = ref({ const formdata = ref({
name: '', name: '',
deptId: [], deptId: [],
reportType: '', reportType: '',
reportForm: '' reportForm: '',
wiringMethod: '',
sort: 100
}) })
// 确定 // 确定
const preservation = () => { const preservation = () => {
ruleForm.value.validate((valid: boolean) => { ruleForm.value.validate((valid: boolean) => {
if (valid) { if (valid) {
emit('submitForm', formdata.value, title.value) emit('submitForm', formdata.value, title.value)
} }
}) })
} }
@@ -106,6 +138,6 @@ const open = (text: string, row?: any) => {
formVisible.value = true formVisible.value = true
} }
defineExpose({ open,shutDown }) defineExpose({ open, shutDown })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>

View File

@@ -1,69 +1,155 @@
<template> <template>
<div class="default-main"> <div class="default-main">
<div v-show="show && lookShow"> <div v-show="show && lookShow" style="display: flex">
<TableHeader ref="TableHeaderRef"> <div style="width: 600px">
<template #operation> <div class="custom-table-header">
<el-button icon="el-icon-Plus" type="primary" @click="add">新增</el-button> <div class="title">报表列表</div>
</template> <el-button :icon="Plus" type="primary" @click="addRole" class="ml10">新增报表</el-button>
</TableHeader> </div>
<Table ref="tableRef" /> <Table ref="tableRef" @currentChange="currentChange" />
</div>
<div style="flex: 1">
<div class="custom-table-header">
<div class="title">模版绑定</div>
<el-button type="primary" icon="el-icon-Plus" @click="add">新增模版</el-button>
<el-button type="primary" icon="el-icon-Select" @click="save">保存</el-button>
</div>
<div :style="height">
<vxe-table
ref="tableRef1"
v-bind="defaultAttribute"
:data="templateList"
height="auto"
style="width: 100%"
>
<vxe-column type="checkbox" width="60"></vxe-column>
<vxe-column field="name" title="模版名称"></vxe-column>
<vxe-column field="wiringMethod" title="接线方式">
<template #default="{ row }">
{{ volConTypeList.find(item => item.id == row.wiringMethod)?.name || '/' }}
</template>
</vxe-column>
<!-- <vxe-column field="createTime" title="创建时间"></vxe-column> -->
<vxe-column field="sort" title="排序" width="80px"></vxe-column>
<vxe-column field="createTime" title="操作" width="180px">
<template #default="{ row }">
<el-button type="primary" link @click="lookView(row)" size="small">查看</el-button>
<el-button
style="margin-left: 4px"
type="primary"
link
size="small"
@click="templateModification(row)"
class="ml10 mr10"
>
编辑
</el-button>
<el-popconfirm
@confirm="templateRemove(row)"
title="确定删除吗?"
confirm-button-type="danger"
>
<template #reference>
<el-button style="margin-left: 4px" type="danger" size="small" link>
刪除
</el-button>
</template>
</el-popconfirm>
</template>
</vxe-column>
</vxe-table>
</div>
</div>
</div> </div>
<luckysheet ref="luckysheetRef" v-if="!show" @shutDown="shutDown" /> <luckysheet ref="luckysheetRef" v-if="!show" @shutDown="shutDown" />
<!-- 查看 --> <!-- 查看 -->
<look ref="lookRef" v-if="!lookShow" @shutDown="shutDown" /> <look ref="lookRef" v-if="!lookShow" @shutDown="shutDown" />
<!-- 绑定 --> <!-- 绑定 -->
<department ref="departmentRef" /> <department ref="departmentRef" />
<PopupForm ref="popupRef"></PopupForm>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted, provide, nextTick } from 'vue' import { ref, onMounted, provide, nextTick } from 'vue'
import { Plus } from '@element-plus/icons-vue'
import TableStore from '@/utils/tableStore' import TableStore from '@/utils/tableStore'
import Table from '@/components/table/index.vue' import Table from '@/components/table/index.vue'
import TableHeader from '@/components/table/header/index.vue' import TableHeader from '@/components/table/header/index.vue'
import { delTemplate } from '@/api/harmonic-boot/luckyexcel' import { delTemplate, deleteSysExcel, getTemplateList, bandRelation, queryList } from '@/api/harmonic-boot/luckyexcel'
import { useDictData } from '@/stores/dictData' import { useDictData } from '@/stores/dictData'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { defaultAttribute } from '@/components/table/defaultAttribute'
import luckysheet from './luckysheet.vue' import luckysheet from './luckysheet.vue'
import look from './look.vue' import look from './look.vue'
import { mainHeight } from '@/utils/layout'
import PopupForm from './PopupForm.vue'
import department from './department.vue' import department from './department.vue'
const dictData = useDictData()
defineOptions({ defineOptions({
name: 'govern/reportForms/index' name: 'govern/reportForms/index'
}) })
const height = mainHeight(80)
const volConTypeList: any = dictData.getBasicData('Dev_Connect')
const luckysheetRef = ref() const luckysheetRef = ref()
const lookRef = ref() const lookRef = ref()
const departmentRef = ref() const departmentRef = ref()
const show = ref(true) const show = ref(true)
const lookShow = ref(true) const lookShow = ref(true)
const popupRef = ref()
const tableRef = ref()
const tableRef1 = ref()
const templateList = ref([])
const menuListId = ref([])
const defaultProps = {
children: 'children',
label: 'name'
}
const reportFormList = [
{
value: '1',
label: '分析报表'
},
{
value: '2',
label: '统计报表'
},
{
value: '4',
label: '治理前后对比报表'
},
{
value: '3',
label: '自定义报表'
}
]
const tableStore: any = new TableStore({ const tableStore: any = new TableStore({
url: '/cs-harmonic-boot/customReport/getTemplateList', // url: '/cs-harmonic-boot/customReport/getTemplateList',
url: '/cs-harmonic-boot/sysExcel/querySysExcel',
method: 'POST', method: 'POST',
isWebPaging: true, publicHeight: 60,
showPage: false,
column: [ column: [
{ field: 'name', title: '模板名称' }, { field: 'excelName', title: '报表名称' },
{ field: 'reportForm', title: '模板类型',formatter: (row) => {
return row.cellValue == 1 ? '分析报表' : row.cellValue == 2 ? '统计报表' : row.cellValue == 3 ? '自定义报表' : '治理前后对比报表'
} },
{ field: 'updateBy', title: '更新用户' },
{ field: 'createTime', title: '创建时间' , sortable: true},
{ field: 'updateTime', title: '更新时间', sortable: true },
{ {
title: '操作', fixed: 'right', field: 'excelType',
width: '220', title: '报表类型',
formatter: row => {
return reportFormList.filter(item => item.value == row.cellValue)[0]?.label || '/' //row.cellValue
}
},
{
field: 'sort',
title: '排序',
width: '80px'
},
{
title: '操作',
fixed: 'right',
width: '150',
render: 'buttons', render: 'buttons',
buttons: [ buttons: [
{
name: 'edit',
title: '查看 ',
type: 'primary',
icon: 'el-icon-Plus',
render: 'basicButton',
click: row => {
lookShow.value = false
setTimeout(() => {
lookRef.value.open(row)
}, 10)
}
},
{ {
name: 'edit', name: 'edit',
title: '编辑', title: '编辑',
@@ -71,22 +157,10 @@ const tableStore: any = new TableStore({
icon: 'el-icon-Plus', icon: 'el-icon-Plus',
render: 'basicButton', render: 'basicButton',
click: row => { click: row => {
show.value = false popupRef.value.open('编辑报表', row)
setTimeout(() => {
luckysheetRef.value.open('编辑报表模板', row)
}, 10)
} }
}, },
// {
// name: 'edit',
// title: '绑定',
// type: 'primary',
// icon: 'el-icon-Plus',
// render: 'basicButton',
// click: row => {
// departmentRef.value.open(row)
// }
// },
{ {
name: 'del', name: 'del',
text: '删除', text: '删除',
@@ -100,7 +174,7 @@ const tableStore: any = new TableStore({
title: '确定删除?' title: '确定删除?'
}, },
click: row => { click: row => {
delTemplate({ tempId: row.id, deptId: row.deptId }).then(res => { deleteSysExcel({ id: row.id }).then(res => {
ElMessage.success('删除成功') ElMessage.success('删除成功')
tableStore.index() tableStore.index()
}) })
@@ -110,18 +184,45 @@ const tableStore: any = new TableStore({
} }
], ],
loadCallback: () => {} loadCallback: () => {
tableRef.value.getRef().setCurrentRow(tableStore.table.data[0])
currentChange({
row: tableStore.table.data[0]
})
}
}) })
tableStore.table.params = {}
tableStore.table.params.pageSize = 20
tableStore.table.params.pageNum = 1
provide('tableStore', tableStore) provide('tableStore', tableStore)
// 查看
const lookView = (row: any) => {
lookShow.value = false
setTimeout(() => {
lookRef.value.open(row)
}, 10)
}
// 修改模版
const templateModification = (row: any) => {
show.value = false
setTimeout(() => {
luckysheetRef.value.open('编辑报表模板', row)
}, 10)
}
// 删除模版
const templateRemove = (row: any) => {
delTemplate({ tempId: row.id, deptId: row.deptId }).then(res => {
ElMessage.success('删除成功')
getTemplate()
})
}
// 关闭 // 关闭
const shutDown = () => { const shutDown = () => {
show.value = true show.value = true
lookShow.value = true lookShow.value = true
tableStore.index() getTemplate()
}
const addRole = () => {
// add()
popupRef.value.open('新增报表')
} }
const add = () => { const add = () => {
show.value = false show.value = false
@@ -129,7 +230,49 @@ const add = () => {
luckysheetRef.value.open('新增报表模板') luckysheetRef.value.open('新增报表模板')
}, 10) }, 10)
} }
// 查询绑定模版
const currentChange = (data: any) => {
tableRef1.value.clearCheckboxRow()
menuListId.value = data.row.id
queryList({ id: data.row.id }).then((res: any) => {
let ids = res.data.map(item => item.id)
tableRef1.value.setCheckboxRow(
templateList.value.filter(item => ids.includes(item.id)),
true
)
})
}
// 保存模版
const save = () => {
bandRelation({
modelIds: tableRef1.value.getCheckboxRecords().map(item => item.id),
id: menuListId.value
})
.then(() => {
ElMessage.success('操作成功!')
})
.catch(() => {})
}
const getTemplate = () => {
getTemplateList({
pageNum: 1,
pageSize: 10000
}).then(res => {
templateList.value = res.data
})
}
onMounted(() => { onMounted(() => {
getTemplate()
tableStore.index() tableStore.index()
}) })
</script> </script>
<style scoped>
.custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
padding-right: 8px;
}
</style>

View File

@@ -123,6 +123,8 @@ const submitForm = (formdata: any, text: string) => {
params.append('name', formdata.name) params.append('name', formdata.name)
params.append('reportType', formdata.reportType) params.append('reportType', formdata.reportType)
params.append('reportForm', formdata.reportForm) params.append('reportForm', formdata.reportForm)
params.append('wiringMethod', formdata.wiringMethod)
params.append('sort', formdata.sort)
ElMessage.info('正在保存请稍等!') ElMessage.info('正在保存请稍等!')
if (text == '新增报表模板') { if (text == '新增报表模板') {
addTemplate(params) addTemplate(params)