修改全局报表功能
This commit is contained in:
@@ -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
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 = '谐波电压次数'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(() => {
|
||||||
|
|||||||
@@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 不是一个有效数组')
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
// 点击行
|
// 点击行
|
||||||
|
|||||||
@@ -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 = '谐波电压次数'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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: () => {
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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(() => {
|
||||||
|
|||||||
@@ -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>`
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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) ||
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
111
src/views/govern/reportForms/PopupForm.vue
Normal file
111
src/views/govern/reportForms/PopupForm.vue
Normal 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>
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user