修改测试问题
This commit is contained in:
@@ -37,7 +37,7 @@ import TableHeader from '@/components/table/header/index.vue'
|
||||
import { getTemplateList } from '@/api/harmonic-boot/luckyexcel'
|
||||
import { getListByIds } from '@/api/harmonic-boot/cockpit/cockpit'
|
||||
import { getTime } from '@/utils/formatTime'
|
||||
|
||||
import { ElMessage } from 'element-plus'
|
||||
const prop = defineProps({
|
||||
w: { type: [String, Number] },
|
||||
h: { type: [String, Number] },
|
||||
@@ -118,12 +118,15 @@ const tableStore: any = new TableStore({
|
||||
column: [],
|
||||
beforeSearchFun: () => {
|
||||
setTime()
|
||||
if (!tableStore.table.params.sensitiveUserId && idList.value?.length > 0) {
|
||||
tableStore.table.params.sensitiveUserId = idList.value[0].id
|
||||
}
|
||||
if (!tableStore.table.params.tempId && templateList.value?.length > 0) {
|
||||
tableStore.table.params.tempId = templateList.value[0].id
|
||||
}
|
||||
// if (!tableStore.table.params.sensitiveUserId && idList.value?.length > 0) {
|
||||
// tableStore.table.params.sensitiveUserId = idList.value[0].id
|
||||
// }
|
||||
// if (!tableStore.table.params.tempId && templateList.value?.length > 0) {
|
||||
// tableStore.table.params.tempId = templateList.value[0].id
|
||||
// }
|
||||
// if( !tableStore.table.params.tempId){
|
||||
// return ElMessage.warning('请选择模板')
|
||||
// }
|
||||
},
|
||||
loadCallback: () => {
|
||||
luckysheet.create({
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<el-option
|
||||
v-for="item in options"
|
||||
:key="item.lineId"
|
||||
:label="item.name"
|
||||
:label="item.lineName"
|
||||
:value="item.lineId"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -24,11 +24,7 @@
|
||||
<Table ref="tableRef" @cell-click="cellClickEvent" isGroup :height="height"></Table>
|
||||
</el-dialog>
|
||||
<!-- 谐波电流、谐波电压占有率 -->
|
||||
<HarmonicRatio
|
||||
ref="harmonicRatioRef"
|
||||
@close="onHarmonicRatioClose"
|
||||
v-if="dialogFlag"
|
||||
/>
|
||||
<HarmonicRatio ref="harmonicRatioRef" @close="onHarmonicRatioClose" v-if="dialogFlag" />
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
@@ -144,9 +140,10 @@ const tableStore: any = new TableStore({
|
||||
provide('tableStore', tableStore)
|
||||
tableStore.table.params.sortBy = ''
|
||||
tableStore.table.params.orderBy = ''
|
||||
const open = async (row: any,searchBeginTime:any,searchEndTime:any) => {
|
||||
const open = async (row: any,searchBeginTime:any,searchEndTime:any,data:any=[]) => {
|
||||
dialogVisible.value = true
|
||||
initCSlineList()
|
||||
// initCSlineList()
|
||||
options.value = data
|
||||
tableStore.table.params.lineId = row.lineId
|
||||
|
||||
nextTick(() => {
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
<template>
|
||||
<div>
|
||||
<!--主要监测点列表 -->
|
||||
<TableHeader :showReset="false" :timeKeyList="prop.timeKey" @selectChange="selectChange" v-if="fullscreen" datePicker ref="TableHeaderRef">
|
||||
<TableHeader
|
||||
:showReset="false"
|
||||
:timeKeyList="prop.timeKey"
|
||||
@selectChange="selectChange"
|
||||
v-if="fullscreen"
|
||||
datePicker
|
||||
ref="TableHeaderRef"
|
||||
>
|
||||
<template v-slot:select>
|
||||
<el-form-item label="关键词">
|
||||
<el-input v-model="tableStore.table.params.keywords" clearable placeholder="请输关键字" />
|
||||
@@ -32,7 +39,7 @@ const prop = defineProps({
|
||||
h: { type: [String, Number] },
|
||||
width: { type: [String, Number] },
|
||||
height: { type: [String, Number] },
|
||||
timeKey: { type: Array as () => string[] },
|
||||
timeKey: { type: Array as () => string[] },
|
||||
timeValue: { type: Object },
|
||||
interval: { type: Number }
|
||||
})
|
||||
@@ -98,13 +105,16 @@ const tableStore: any = new TableStore({
|
||||
{
|
||||
title: '是否治理',
|
||||
field: 'govern',
|
||||
minWidth: '70'
|
||||
minWidth: '80',
|
||||
formatter: (row: any) => {
|
||||
return row.cellValue || '/'
|
||||
}
|
||||
},
|
||||
|
||||
{ title: '主要存在的电能质量问题', field: 'problems', minWidth: '150', showOverflow: true }
|
||||
],
|
||||
beforeSearchFun: () => {
|
||||
setTime()
|
||||
setTime()
|
||||
},
|
||||
loadCallback: () => {
|
||||
tableStore.table.height = `calc(${prop.height} - 80px)`
|
||||
@@ -122,7 +132,8 @@ const cellClickEvent = ({ row, column }: any) => {
|
||||
OverLimitDetailsRef.value.open(
|
||||
row,
|
||||
tableStore.table.params.searchBeginTime || prop.timeValue?.[0],
|
||||
tableStore.table.params.searchEndTime || prop.timeValue?.[1]
|
||||
tableStore.table.params.searchEndTime || prop.timeValue?.[1],
|
||||
tableStore.table.data
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,20 +129,55 @@ const tableStore: any = new TableStore({
|
||||
return `<span style='cursor: pointer;text-decoration: underline;'>${row.lineName}</span>`
|
||||
}
|
||||
},
|
||||
{ title: '监测类型', field: 'position', minWidth: '80' },
|
||||
{
|
||||
title: '监测类型',
|
||||
field: 'position',
|
||||
minWidth: '80',
|
||||
formatter: (row: any) => {
|
||||
return row.cellValue || '/'
|
||||
}
|
||||
},
|
||||
// {
|
||||
// title: '监测点状态',
|
||||
// field: 'runStatus',
|
||||
// minWidth: '90',
|
||||
// render: 'customTemplate',
|
||||
// customTemplate: (row: any) => {
|
||||
// return `<span style='color: ${row.runStatus === '中断' ? '#FF0000' : ''}'>${row.runStatus==null?'/':row.runStatus}</span>`
|
||||
// }
|
||||
// },
|
||||
{
|
||||
title: '监测点状态',
|
||||
field: 'runStatus',
|
||||
minWidth: '90',
|
||||
render: 'customTemplate',
|
||||
customTemplate: (row: any) => {
|
||||
return `<span style='color: ${row.runStatus === '中断' ? '#FF0000' : ''}'>${row.runStatus}</span>`
|
||||
render: 'tag',
|
||||
|
||||
width: 100,
|
||||
custom: {
|
||||
停运: 'danger',
|
||||
退运: 'danger',
|
||||
运行: 'success',
|
||||
中断: 'warning',
|
||||
检修: 'warning',
|
||||
调试: 'warning',
|
||||
null: 'info'
|
||||
},
|
||||
replaceValue: {
|
||||
运行: '运行',
|
||||
退运: '退运',
|
||||
停运: '停运',
|
||||
中断: '中断',
|
||||
检修: '检修',
|
||||
调试: '调试',
|
||||
null: '/'
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '治理对象',
|
||||
field: 'sensitiveUser',
|
||||
minWidth: '90'
|
||||
minWidth: '90',
|
||||
formatter: (row: any) => {
|
||||
return row.cellValue || '/'
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
@@ -153,7 +188,10 @@ const tableStore: any = new TableStore({
|
||||
{
|
||||
title: '是否治理',
|
||||
field: 'govern',
|
||||
minWidth: '80'
|
||||
minWidth: '80',
|
||||
formatter: (row: any) => {
|
||||
return row.cellValue || '/'
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
@@ -169,18 +207,30 @@ const tableStore: any = new TableStore({
|
||||
}
|
||||
}
|
||||
},
|
||||
// {
|
||||
// title: '报告',
|
||||
// field: 'reportFilePath',
|
||||
// minWidth: '120',
|
||||
// render: 'customTemplate',
|
||||
// customTemplate: (row: any) => {
|
||||
// return row.reportFilePath == null
|
||||
// ? '/'
|
||||
// : `<span style='cursor: pointer;text-decoration: underline;'>${row.reportFilePath
|
||||
// .split('/')
|
||||
// .pop()}</span>`
|
||||
// }
|
||||
// },
|
||||
{
|
||||
title: '报告',
|
||||
field: 'lineId',
|
||||
field: 'reportFilePath',
|
||||
minWidth: '120',
|
||||
render: 'customTemplate',
|
||||
customTemplate: (row: any) => {
|
||||
return `<span style='cursor: pointer;text-decoration: underline;'>${row.lineId}</span>`
|
||||
formatter: (row: any) => {
|
||||
return row.cellValue == null ? '/' : row.cellValue.split('/').pop()
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
minWidth: 80,
|
||||
width: 150,
|
||||
// fixed: 'right',
|
||||
render: 'buttons',
|
||||
buttons: [
|
||||
@@ -198,19 +248,19 @@ const tableStore: any = new TableStore({
|
||||
}
|
||||
},
|
||||
|
||||
// {
|
||||
// name: 'productSetting',
|
||||
// title: '下载报告',
|
||||
// type: 'primary',
|
||||
// icon: 'el-icon-EditPen',
|
||||
// render: 'basicButton',
|
||||
// click: row => {
|
||||
// downloadTheReport(row.lineId)
|
||||
// },
|
||||
// disabled: row => {
|
||||
// return row.reportFilePath == null || row.reportFilePath.length == 0
|
||||
// }
|
||||
// },
|
||||
{
|
||||
name: 'productSetting',
|
||||
title: '下载报告',
|
||||
type: 'primary',
|
||||
icon: 'el-icon-EditPen',
|
||||
render: 'basicButton',
|
||||
click: row => {
|
||||
downloadTheReport(row.lineId, row.reportFilePath)
|
||||
},
|
||||
disabled: row => {
|
||||
return row.reportFilePath == null || row.reportFilePath.length == 0
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'productSetting',
|
||||
title: '重新上传',
|
||||
@@ -267,22 +317,47 @@ const cellClickEvent = ({ row, column }: any) => {
|
||||
tableStore.table.params.searchBeginTime || prop.timeValue?.[0],
|
||||
tableStore.table.params.searchEndTime || prop.timeValue?.[1]
|
||||
)
|
||||
}else if (column.field == 'lineId') {
|
||||
downloadTheReport(row.lineId)
|
||||
}
|
||||
}
|
||||
|
||||
// 下载报告
|
||||
const downloadTheReport = (lineId: string) => {
|
||||
const downloadTheReport = (lineId: string, name: string) => {
|
||||
getReportUrl({ lineId: lineId }).then((res: any) => {
|
||||
const link = document.createElement('a')
|
||||
link.href = res.data
|
||||
link.download = '治理报告'
|
||||
document.body.appendChild(link)
|
||||
link.click()
|
||||
document.body.removeChild(link)
|
||||
forceDownloadPdf(res.data, name.split('/').pop() || '')
|
||||
})
|
||||
}
|
||||
const forceDownloadPdf = async (pdfUrl, fileName = '文件.pdf') => {
|
||||
try {
|
||||
// 1. 请求 PDF 并转为 Blob(关键:绕开浏览器直接解析)
|
||||
const response = await fetch(pdfUrl, {
|
||||
method: 'GET'
|
||||
// 若需要鉴权,添加请求头(如 token)
|
||||
})
|
||||
|
||||
// 校验响应是否成功
|
||||
if (!response.ok) throw new Error(`请求失败:${response.status}`)
|
||||
|
||||
// 2. 将响应转为 Blob(指定类型为 PDF,确保兼容性)
|
||||
const blob = await response.blob()
|
||||
const pdfBlob = new Blob([blob], { type: 'application/pdf' })
|
||||
|
||||
// 3. 创建临时 URL 并触发下载
|
||||
const blobUrl = URL.createObjectURL(pdfBlob)
|
||||
const a = document.createElement('a')
|
||||
a.href = blobUrl
|
||||
a.download = fileName // 此时 Blob URL 是同源的,download 必生效
|
||||
a.style.display = 'none'
|
||||
document.body.appendChild(a)
|
||||
a.click() // 触发下载
|
||||
|
||||
// 4. 清理资源(避免内存泄漏)
|
||||
document.body.removeChild(a)
|
||||
URL.revokeObjectURL(blobUrl)
|
||||
} catch (error) {
|
||||
console.error('PDF 下载失败:', error)
|
||||
// ElMessage.error('文件下载失败,请检查网络或文件地址') // 适配 Element Plus
|
||||
}
|
||||
}
|
||||
|
||||
// 上传报告
|
||||
const uploadReportRow = (row: any) => {
|
||||
@@ -336,7 +411,6 @@ const beforeUpload = (file: any) => {
|
||||
}
|
||||
|
||||
const handleUpload = async () => {
|
||||
console.log(123, fileList.value)
|
||||
// return
|
||||
|
||||
const formData = new FormData()
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<el-option
|
||||
v-for="item in options"
|
||||
:key="item.lineId"
|
||||
:label="item.name"
|
||||
:label="item.lineName"
|
||||
:value="item.lineId"
|
||||
/>
|
||||
</el-select>
|
||||
@@ -139,9 +139,10 @@ const tableStore: any = new TableStore({
|
||||
provide('tableStore', tableStore)
|
||||
tableStore.table.params.sortBy = ''
|
||||
tableStore.table.params.orderBy = ''
|
||||
const open = async (row: any,searchBeginTime:any,searchEndTime:any) => {
|
||||
const open = async (row: any,searchBeginTime:any,searchEndTime:any,data: any) => {
|
||||
dialogVisible.value = true
|
||||
initCSlineList()
|
||||
// initCSlineList()
|
||||
options.value = data
|
||||
tableStore.table.params.lineId = row.lineId
|
||||
|
||||
nextTick(() => {
|
||||
|
||||
@@ -217,7 +217,8 @@ const cellClickEvent = ({ row, column }: any) => {
|
||||
OverLimitDetailsRef.value.open(
|
||||
row,
|
||||
tableStore.table.params.searchBeginTime || prop.timeValue?.[0],
|
||||
tableStore.table.params.searchEndTime || prop.timeValue?.[1]
|
||||
tableStore.table.params.searchEndTime || prop.timeValue?.[1],
|
||||
tableStore.table.data
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
:showReset="false"
|
||||
@selectChange="selectChange"
|
||||
datePicker
|
||||
v-if="fullscreen" :timeKeyList="prop.timeKey"
|
||||
v-if="fullscreen"
|
||||
:timeKeyList="prop.timeKey"
|
||||
></TableHeader>
|
||||
<Table
|
||||
ref="tableRef"
|
||||
@@ -29,7 +30,7 @@ const prop = defineProps({
|
||||
h: { type: [String, Number] },
|
||||
width: { type: [String, Number] },
|
||||
height: { type: [String, Number] },
|
||||
timeKey: { type: Array as () => string[] },
|
||||
timeKey: { type: Array as () => string[] },
|
||||
timeValue: { type: Object },
|
||||
interval: { type: Number }
|
||||
})
|
||||
@@ -94,12 +95,18 @@ const tableStore: any = new TableStore({
|
||||
{
|
||||
title: '是否监测',
|
||||
field: 'isMonitor',
|
||||
minWidth: '80'
|
||||
minWidth: '80',
|
||||
formatter: (row: any) => {
|
||||
return row.cellValue || '/'
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '是否治理',
|
||||
field: 'isGovern',
|
||||
minWidth: '80'
|
||||
minWidth: '80',
|
||||
formatter: (row: any) => {
|
||||
return row.cellValue || '/'
|
||||
}
|
||||
}
|
||||
],
|
||||
beforeSearchFun: () => {
|
||||
|
||||
@@ -266,8 +266,7 @@ self.onmessage = function (e) {
|
||||
} else if (boxoList.systemType == 'ZL') {
|
||||
titles =
|
||||
(boxoList.engineeringName == undefined ? '' : ' 项目名称:' + boxoList.engineeringName) +
|
||||
' 项目名称:' +
|
||||
boxoList.engineeringName +
|
||||
|
||||
' 监测点名称:' +
|
||||
boxoList.equipmentName +
|
||||
' 发生时刻:' +
|
||||
@@ -280,8 +279,7 @@ self.onmessage = function (e) {
|
||||
} else if (boxoList.systemType == 'YPT') {
|
||||
titles =
|
||||
(boxoList.engineeringName == undefined ? '' : ' 项目名称:' + boxoList.engineeringName) +
|
||||
' 项目名称:' +
|
||||
boxoList.engineeringName +
|
||||
|
||||
' 监测点名称:' +
|
||||
boxoList.lineName +
|
||||
' 发生时刻:' +
|
||||
|
||||
@@ -7,7 +7,7 @@ import { useAdminInfo } from '@/stores/adminInfo'
|
||||
|
||||
window.requests = []
|
||||
window.tokenRefreshing = false
|
||||
let loginExpireTimer:any=null
|
||||
let loginExpireTimer: any = null
|
||||
const pendingMap = new Map()
|
||||
const loadingInstance: LoadingInstance = {
|
||||
target: null,
|
||||
@@ -65,16 +65,17 @@ function createAxios<Data = any, T = ApiPromise<Data>>(
|
||||
if (
|
||||
!(
|
||||
config.url == '/system-boot/file/upload' ||
|
||||
config.url == '/user-boot/sysRoleSystem/getSystemByRoleId' ||
|
||||
config.url == '/system-boot/file/getFileUrl' ||
|
||||
config.url == '/cs-harmonic-boot/realData/getBaseRealData' ||
|
||||
config.url == '/harmonic-boot/grid/getAssessOverview' ||
|
||||
config.url == '/harmonic-boot/gridDiagram/getGridDiagramAreaData' ||
|
||||
config.url == '/cs-device-boot/csline/list' ||
|
||||
config.url == '/cs-harmonic-boot/pqSensitiveUser/getListByIds'||
|
||||
config.url == '/cs-harmonic-boot/csevent/getEventCoords'||
|
||||
config.url == '/cs-harmonic-boot/limitRateDetailD/limitTimeProbabilityData'||
|
||||
config.url == '/cs-harmonic-boot/limitRateDetailD/limitProbabilityData'||
|
||||
config.url == '/system-boot/dictTree/queryByCode'||
|
||||
config.url == '/cs-harmonic-boot/pqSensitiveUser/getListByIds' ||
|
||||
config.url == '/cs-harmonic-boot/csevent/getEventCoords' ||
|
||||
config.url == '/cs-harmonic-boot/limitRateDetailD/limitTimeProbabilityData' ||
|
||||
config.url == '/cs-harmonic-boot/limitRateDetailD/limitProbabilityData' ||
|
||||
config.url == '/system-boot/dictTree/queryByCode' ||
|
||||
config.url == '/system-boot/dictTree/query'
|
||||
)
|
||||
)
|
||||
@@ -113,11 +114,11 @@ function createAxios<Data = any, T = ApiPromise<Data>>(
|
||||
response => {
|
||||
removePending(response.config)
|
||||
options.loading && closeLoading(options) // 关闭loading
|
||||
if (
|
||||
if (
|
||||
response.data.code === 'A0000' ||
|
||||
response.data.type === 'application/json' ||
|
||||
Array.isArray(response.data) ||
|
||||
response.data.size
|
||||
response.data.size
|
||||
// ||
|
||||
// response.data.type === 'application/octet-stream' ||
|
||||
// response.data.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
||||
@@ -152,7 +153,7 @@ function createAxios<Data = any, T = ApiPromise<Data>>(
|
||||
})
|
||||
}
|
||||
} else if (response.data.code == 'A0024') {
|
||||
// // 登录失效
|
||||
// // 登录失效
|
||||
// 清除上一次的定时器
|
||||
if (loginExpireTimer) {
|
||||
clearTimeout(loginExpireTimer)
|
||||
@@ -181,8 +182,7 @@ function createAxios<Data = any, T = ApiPromise<Data>>(
|
||||
setTimeout(() => {
|
||||
ElMessage.error(response.data.message || '未知错误')
|
||||
}, 6000)
|
||||
}else if (response.config.url == '/cs-harmonic-boot/cspage/getByUserId') {
|
||||
|
||||
} else if (response.config.url == '/cs-harmonic-boot/cspage/getByUserId') {
|
||||
} else {
|
||||
ElMessage.error(response.data.message || '未知错误')
|
||||
}
|
||||
|
||||
@@ -1,104 +1,130 @@
|
||||
<template>
|
||||
<el-dialog width="700px" v-model.trim="dialogVisible" :title="title">
|
||||
<el-scrollbar>
|
||||
<el-form :mode="form" :inline="false" :model="form" label-width="120px" :rules="rules" class="form-one">
|
||||
<el-form-item prop="name" label="接口/按钮名称">
|
||||
<el-input maxlength="32" show-word-limit v-model.trim="form.name" placeholder="请输入接口名称" />
|
||||
</el-form-item>
|
||||
<el-form-item prop="code" label="接口/按钮标识">
|
||||
<el-input maxlength="32" show-word-limit v-model.trim="form.code" placeholder="请输入英文接口标识" />
|
||||
</el-form-item>
|
||||
<el-form-item prop="path" label="接口路径">
|
||||
<el-input v-model.trim="form.path" placeholder="请输入接口路径" />
|
||||
</el-form-item>
|
||||
<el-form-item prop="type" label="接口类型">
|
||||
<el-radio-group v-model.trim="form.type">
|
||||
<el-radio :label="1">普通接口</el-radio>
|
||||
<el-radio :label="2">公用接口</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item prop="sort" label="排序">
|
||||
<el-input maxlength="32" show-word-limit-number v-model.trim="form.sort" :min="0" />
|
||||
</el-form-item>
|
||||
<el-form-item prop="remark" label="接口/按钮描述">
|
||||
<el-input maxlength="300" show-word-limit v-model.trim="form.remark" :rows="2" type="textarea"
|
||||
placeholder="请输入描述" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-scrollbar>
|
||||
|
||||
<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 { update, add } from '@/api/user-boot/function'
|
||||
|
||||
defineOptions({
|
||||
name: 'auth/menu/popupApi'
|
||||
})
|
||||
const emits = defineEmits<{
|
||||
(e: 'init'): void
|
||||
}>()
|
||||
const form: any = reactive({
|
||||
id: '',
|
||||
pid: '0',
|
||||
code: '',
|
||||
name: '',
|
||||
path: '',
|
||||
type: 1,
|
||||
sort: 100,
|
||||
remark: ''
|
||||
})
|
||||
const rules = {
|
||||
code: [
|
||||
{ required: true, message: '标识不能为空', trigger: 'blur' },
|
||||
{
|
||||
pattern: /^[a-zA-Z_]{1}[a-zA-Z0-9_]{2,20}$/,
|
||||
message: '请输入至少3-20位英文',
|
||||
min: 3,
|
||||
max: 20,
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
name: [{ required: true, message: '请输入接口名称', trigger: 'blur' }],
|
||||
sort: [{ required: true, message: '请输入排序', trigger: 'blur' }],
|
||||
path: [{ required: true, message: '请输入接口路径', trigger: 'blur' }]
|
||||
}
|
||||
const dialogVisible = ref(false)
|
||||
const title = ref('新增菜单')
|
||||
const open = (text: string, data: anyObj) => {
|
||||
title.value = text
|
||||
// 重置表单
|
||||
for (let key in form) {
|
||||
form[key] = ''
|
||||
}
|
||||
form.type = 1
|
||||
form.pid = data.pid
|
||||
if (data.id) {
|
||||
for (let key in form) {
|
||||
form[key] = data[key] || ''
|
||||
}
|
||||
}
|
||||
dialogVisible.value = true
|
||||
}
|
||||
const submit = async () => {
|
||||
if (form.id) {
|
||||
await update(form)
|
||||
} else {
|
||||
let obj = JSON.parse(JSON.stringify(form))
|
||||
delete obj.id
|
||||
await add(obj)
|
||||
}
|
||||
emits('init')
|
||||
dialogVisible.value = false
|
||||
}
|
||||
|
||||
defineExpose({ open })
|
||||
</script>
|
||||
<template>
|
||||
<el-dialog width="700px" v-model.trim="dialogVisible" :title="title">
|
||||
<el-scrollbar>
|
||||
<el-form
|
||||
:mode="form"
|
||||
:inline="false"
|
||||
ref="formRef"
|
||||
:model="form"
|
||||
label-width="120px"
|
||||
:rules="rules"
|
||||
class="form-one"
|
||||
>
|
||||
<el-form-item prop="name" label="接口/按钮名称">
|
||||
<el-input maxlength="32" show-word-limit v-model.trim="form.name" placeholder="请输入接口名称" />
|
||||
</el-form-item>
|
||||
<el-form-item prop="code" label="接口/按钮标识">
|
||||
<el-input
|
||||
maxlength="32"
|
||||
show-word-limit
|
||||
v-model.trim="form.code"
|
||||
placeholder="请输入英文接口标识"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item prop="path" label="接口路径">
|
||||
<el-input v-model.trim="form.path" placeholder="请输入接口路径" />
|
||||
</el-form-item>
|
||||
<el-form-item prop="type" label="接口类型">
|
||||
<el-radio-group v-model.trim="form.type">
|
||||
<el-radio :label="1">普通接口</el-radio>
|
||||
<el-radio :label="2">公用接口</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item prop="sort" label="排序">
|
||||
<el-input maxlength="32" show-word-limit-number v-model.number="form.sort" :min="0" />
|
||||
</el-form-item>
|
||||
<el-form-item prop="remark" label="接口/按钮描述">
|
||||
<el-input
|
||||
maxlength="300"
|
||||
show-word-limit
|
||||
v-model.trim="form.remark"
|
||||
:rows="2"
|
||||
type="textarea"
|
||||
placeholder="请输入描述"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-scrollbar>
|
||||
|
||||
<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 { update, add } from '@/api/user-boot/function'
|
||||
|
||||
defineOptions({
|
||||
name: 'auth/menu/popupApi'
|
||||
})
|
||||
const emits = defineEmits<{
|
||||
(e: 'init'): void
|
||||
}>()
|
||||
const formRef = ref()
|
||||
const form: any = reactive({
|
||||
id: '',
|
||||
pid: '0',
|
||||
code: '',
|
||||
name: '',
|
||||
path: '',
|
||||
type: 1,
|
||||
sort: 100,
|
||||
remark: ''
|
||||
})
|
||||
const rules = {
|
||||
code: [
|
||||
{ required: true, message: '标识不能为空', trigger: 'blur' },
|
||||
{
|
||||
pattern: /^[a-zA-Z_]{1}[a-zA-Z0-9_]{2,20}$/,
|
||||
message: '请输入至少3-20位英文',
|
||||
min: 3,
|
||||
max: 20,
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
name: [{ required: true, message: '请输入接口名称', trigger: 'blur' }],
|
||||
sort: [{ required: true, message: '请输入排序', trigger: 'blur' }],
|
||||
path: [{ required: true, message: '请输入接口路径', trigger: 'blur' }]
|
||||
}
|
||||
const dialogVisible = ref(false)
|
||||
const title = ref('新增菜单')
|
||||
const open = (text: string, data: anyObj) => {
|
||||
formRef.value?.resetFields()
|
||||
title.value = text
|
||||
// 重置表单
|
||||
for (let key in form) {
|
||||
form[key] = ''
|
||||
}
|
||||
form.type = 1
|
||||
form.sort = 100
|
||||
form.pid = data.pid
|
||||
if (data.id) {
|
||||
for (let key in form) {
|
||||
form[key] = data[key] || ''
|
||||
}
|
||||
}
|
||||
dialogVisible.value = true
|
||||
}
|
||||
const submit = async () => {
|
||||
formRef.value.validate(async valid => {
|
||||
if (valid) {
|
||||
if (form.id) {
|
||||
await update(form)
|
||||
} else {
|
||||
let obj = JSON.parse(JSON.stringify(form))
|
||||
delete obj.id
|
||||
await add(obj)
|
||||
}
|
||||
emits('init')
|
||||
dialogVisible.value = false
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
defineExpose({ open })
|
||||
</script>
|
||||
|
||||
@@ -1,29 +1,43 @@
|
||||
<template>
|
||||
<el-dialog class="cn-operate-dialog" width="700px" v-model.trim="dialogVisible" :title="title">
|
||||
<el-scrollbar>
|
||||
<el-form :inline="false" :model="form" label-width="auto" class="form-one">
|
||||
<el-form :inline="false" :model="form" label-width="auto" ref="formRef" class="form-one" :rules="rules">
|
||||
<el-form-item label="上级菜单">
|
||||
<el-cascader v-model.trim="form.pid" :options="tableStore.table.data" :props="cascaderProps" clearable
|
||||
style="width: 100%" />
|
||||
<el-cascader
|
||||
v-model.trim="form.pid"
|
||||
:options="tableStore.table.data"
|
||||
:props="cascaderProps"
|
||||
clearable
|
||||
style="width: 100%"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="菜单名称">
|
||||
<el-form-item label="菜单名称" prop="name">
|
||||
<el-input maxlength="32" show-word-limit v-model.trim="form.name" placeholder="请输入菜单名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="图标">
|
||||
<IconSelector v-model.trim="form.icon" placeholder="请选择图标" />
|
||||
</el-form-item>
|
||||
<el-form-item label="菜单路由">
|
||||
<el-form-item label="菜单路由" prop="path">
|
||||
<el-input v-model.trim="form.path" placeholder="请输入菜单名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="组件路径">
|
||||
<el-input v-model.trim="form.routeName" placeholder="请输入组件路径,如/src/views/dashboard/index.vue" />
|
||||
<el-form-item label="组件路径" prop="routeName">
|
||||
<el-input
|
||||
v-model.trim="form.routeName"
|
||||
placeholder="请输入组件路径,如/src/views/dashboard/index.vue"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="排序">
|
||||
<el-input maxlength="32" show-word-limit-number v-model.trim="form.sort" :min="0" />
|
||||
<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-item label="菜单描述">
|
||||
<el-input maxlength="300" show-word-limit v-model.trim="form.remark" :rows="2" type="textarea"
|
||||
placeholder="请输入描述" />
|
||||
<el-input
|
||||
maxlength="300"
|
||||
show-word-limit
|
||||
v-model.trim="form.remark"
|
||||
:rows="2"
|
||||
type="textarea"
|
||||
placeholder="请输入描述"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-scrollbar>
|
||||
@@ -46,6 +60,7 @@ import { updateMenu, addMenu } from '@/api/systerm'
|
||||
defineOptions({
|
||||
name: 'auth/menu/popupMenu'
|
||||
})
|
||||
const formRef = ref()
|
||||
const emits = defineEmits<{
|
||||
(e: 'init'): void
|
||||
}>()
|
||||
@@ -71,7 +86,15 @@ const form: any = reactive({
|
||||
|
||||
const dialogVisible = ref(false)
|
||||
const title = ref('新增菜单')
|
||||
const rules = {
|
||||
name: [{ required: true, message: '请输入菜单名称', trigger: 'blur' }],
|
||||
path: [{ required: true, message: '请输入菜单路由', trigger: 'blur' }],
|
||||
icon: [{ required: true, message: '请选择图标', trigger: 'blur' }],
|
||||
routeName: [{ required: true, message: '请输入组件路径', trigger: 'blur' }],
|
||||
sort: [{ required: true, message: '请输入排序', trigger: 'blur' }]
|
||||
}
|
||||
const open = (text: string, data: anyObj) => {
|
||||
formRef.value?.resetFields()
|
||||
title.value = text
|
||||
// 重置表单
|
||||
for (let key in form) {
|
||||
@@ -91,17 +114,23 @@ const open = (text: string, data: anyObj) => {
|
||||
dialogVisible.value = true
|
||||
}
|
||||
const submit = async () => {
|
||||
if (form.id) {
|
||||
form.pid = form.pid||'0'
|
||||
await updateMenu(form)
|
||||
} else {
|
||||
form.code = 'menu'
|
||||
let obj = JSON.parse(JSON.stringify(form))
|
||||
delete obj.id
|
||||
await addMenu(obj)
|
||||
}
|
||||
emits('init')
|
||||
dialogVisible.value = false
|
||||
formRef.value.validate(async valid => {
|
||||
if (valid) {
|
||||
if (form.id) {
|
||||
form.pid = form.pid || '0'
|
||||
await updateMenu(form)
|
||||
} else {
|
||||
form.code = 'menu'
|
||||
form.pid = form.pid || '0'
|
||||
let obj = JSON.parse(JSON.stringify(form))
|
||||
delete obj.id
|
||||
|
||||
await addMenu(obj)
|
||||
}
|
||||
emits('init')
|
||||
dialogVisible.value = false
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
defineExpose({ open })
|
||||
|
||||
@@ -89,6 +89,7 @@
|
||||
:rules="{ required: true, message: '请输入设备名称', trigger: 'blur' }"
|
||||
>
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="project[2].name"
|
||||
:disabled="true"
|
||||
@@ -108,11 +109,12 @@
|
||||
id="id200"
|
||||
class="form-item"
|
||||
label="省:"
|
||||
prop="engineeringParam.province"
|
||||
prop="engineeringParam.province"
|
||||
v-if="nodeLevel > 0 || pageStatus == 2"
|
||||
:rules="{ required: true, message: '请选择省', trigger: 'change' }"
|
||||
>
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="formData.engineeringParam.province"
|
||||
:disabled="
|
||||
@@ -134,11 +136,12 @@
|
||||
id="id200"
|
||||
class="form-item"
|
||||
label="市:"
|
||||
prop="engineeringParam.city"
|
||||
prop="engineeringParam.city"
|
||||
v-if="nodeLevel > 0 || pageStatus == 2"
|
||||
:rules="{ required: true, message: '请选择市', trigger: 'change' }"
|
||||
>
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="formData.engineeringParam.city"
|
||||
:disabled="
|
||||
@@ -158,12 +161,11 @@
|
||||
id="id300"
|
||||
class="form-item"
|
||||
label="工程名称:"
|
||||
|
||||
v-if="nodeLevel > 0 || pageStatus == 2"
|
||||
prop="engineeringParam.name"
|
||||
:rules="{ required: true, message: '请输入工程名称', trigger: 'blur' }"
|
||||
>
|
||||
<el-input
|
||||
<el-input clearable
|
||||
v-model="formData.engineeringParam.name"
|
||||
placeholder="请输入工程名称"
|
||||
:disabled="
|
||||
@@ -175,10 +177,10 @@
|
||||
id="id300"
|
||||
class="form-item"
|
||||
label="描述:"
|
||||
prop="engineeringParam.description"
|
||||
prop="engineeringParam.description"
|
||||
v-if="nodeLevel > 0 || pageStatus == 2"
|
||||
>
|
||||
<el-input
|
||||
<el-input clearable
|
||||
v-model="formData.engineeringParam.description"
|
||||
placeholder="请输入描述"
|
||||
:disabled="
|
||||
@@ -211,7 +213,7 @@
|
||||
{ required: true, message: '请输入项目名称', trigger: 'blur' }
|
||||
]"
|
||||
>
|
||||
<el-input
|
||||
<el-input clearable
|
||||
v-model="item.name"
|
||||
placeholder="请输入项目名称"
|
||||
:disabled="
|
||||
@@ -229,7 +231,7 @@
|
||||
:prop="'projectInfoList[' + index + '].area'"
|
||||
:rules="[{ required: true, message: '请输入地市', trigger: 'blur' }]"
|
||||
>
|
||||
<el-input
|
||||
<el-input clearable
|
||||
v-model="item.area"
|
||||
placeholder="请输入地市"
|
||||
:disabled="
|
||||
@@ -247,7 +249,7 @@
|
||||
:prop="'projectInfoList[' + index + '].description'"
|
||||
:rules="[{ required: true, message: '请输入描述', trigger: 'blur' }]"
|
||||
>
|
||||
<el-input
|
||||
<el-input clearable
|
||||
v-model="item.description"
|
||||
placeholder="请输入描述"
|
||||
:disabled="
|
||||
@@ -292,7 +294,7 @@
|
||||
{ required: true, message: '请输入装置名称', trigger: 'blur' }
|
||||
]"
|
||||
>
|
||||
<el-input
|
||||
<el-input clearable
|
||||
v-model="busItem.name"
|
||||
placeholder="请输入装置名称"
|
||||
:disabled="
|
||||
@@ -308,12 +310,13 @@
|
||||
id="id200"
|
||||
class="form-item"
|
||||
label="装置类型:"
|
||||
:prop="'deviceInfoList[' + bIndex + '].devType'"
|
||||
:prop="'deviceInfoList[' + bIndex + '].devType'"
|
||||
:rules="[
|
||||
{ required: true, message: '请选择装置类型', trigger: 'change' }
|
||||
]"
|
||||
>
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="busItem.devType"
|
||||
placeholder="请选择装置类型"
|
||||
@@ -338,12 +341,13 @@
|
||||
id="id200"
|
||||
class="form-item"
|
||||
label="装置型号:"
|
||||
:prop="'deviceInfoList[' + bIndex + '].devModel'"
|
||||
:prop="'deviceInfoList[' + bIndex + '].devModel'"
|
||||
:rules="[
|
||||
{ required: true, message: '请选择装置型号', trigger: 'change' }
|
||||
]"
|
||||
>
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="busItem.devModel"
|
||||
placeholder="请选择装置型号"
|
||||
@@ -368,12 +372,13 @@
|
||||
id="id200"
|
||||
class="form-item"
|
||||
label="装置接入方式:"
|
||||
:prop="'deviceInfoList[' + bIndex + '].devAccessMethod'"
|
||||
:prop="'deviceInfoList[' + bIndex + '].devAccessMethod'"
|
||||
:rules="[
|
||||
{ required: true, message: '请选择装置接入方式', trigger: 'change' }
|
||||
]"
|
||||
>
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="busItem.devAccessMethod"
|
||||
placeholder="请选择装置接入方式"
|
||||
@@ -393,7 +398,7 @@
|
||||
<el-form-item
|
||||
class="form-item"
|
||||
label="装置mac地址:"
|
||||
:prop="'deviceInfoList[' + bIndex + '].mac'"
|
||||
:prop="'deviceInfoList[' + bIndex + '].mac'"
|
||||
:rules="{
|
||||
required: true,
|
||||
message: '请输入装置mac地址',
|
||||
@@ -411,14 +416,18 @@
|
||||
:rules="[{ required: true, message: '请输入网络设备ID', trigger: 'blur' }]"
|
||||
|
||||
>
|
||||
<el-input
|
||||
<el-input clearable
|
||||
v-model="busItem.ndid"
|
||||
disabled
|
||||
placeholder="请输入网络设备ID"
|
||||
></el-input>
|
||||
</el-form-item> -->
|
||||
<el-form-item class="form-item" label="合同号:" :prop="'deviceInfoList[' + bIndex + '].cntractNo'">
|
||||
<el-input
|
||||
<el-form-item
|
||||
class="form-item"
|
||||
label="合同号:"
|
||||
:prop="'deviceInfoList[' + bIndex + '].cntractNo'"
|
||||
>
|
||||
<el-input clearable
|
||||
v-model="busItem.cntractNo"
|
||||
placeholder="请输入合同号"
|
||||
:disabled="
|
||||
@@ -433,12 +442,13 @@
|
||||
<el-form-item
|
||||
class="form-item"
|
||||
label="所属前置机:"
|
||||
:prop="'deviceInfoList[' + bIndex + '].nodeId'"
|
||||
:prop="'deviceInfoList[' + bIndex + '].nodeId'"
|
||||
:rules="[
|
||||
{ required: true, message: '请选择所属前置机', trigger: 'change' }
|
||||
]"
|
||||
>
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="busItem.nodeId"
|
||||
placeholder="请选择所属前置机"
|
||||
@@ -452,8 +462,12 @@
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item class="form-item" label="进程号:" :prop="'deviceInfoList[' + bIndex + '].nodeProcess'">
|
||||
<el-input
|
||||
<el-form-item
|
||||
class="form-item"
|
||||
label="进程号:"
|
||||
:prop="'deviceInfoList[' + bIndex + '].nodeProcess'"
|
||||
>
|
||||
<el-input clearable
|
||||
v-model="busItem.nodeProcess"
|
||||
placeholder="自动分配"
|
||||
:disabled="true"
|
||||
@@ -466,7 +480,7 @@
|
||||
:prop="'deviceInfoList[' + bIndex + '].sort'"
|
||||
:rules="[{ required: true, message: '请输入排序', trigger: 'blur' }]"
|
||||
>
|
||||
<el-input
|
||||
<el-input clearable
|
||||
v-model="busItem.sort"
|
||||
placeholder="请输入排序"
|
||||
:disabled="
|
||||
@@ -513,7 +527,7 @@
|
||||
trigger: 'blur'
|
||||
}"
|
||||
>
|
||||
<el-input
|
||||
<el-input clearable
|
||||
v-model="lineItem.name"
|
||||
placeholder="请输入监测点名称"
|
||||
:disabled="
|
||||
@@ -536,6 +550,7 @@
|
||||
}"
|
||||
>
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="lineItem.lineNo"
|
||||
placeholder="请选择线路号"
|
||||
@@ -562,6 +577,7 @@
|
||||
:rules="{ required: true, message: '请选择接线方式', trigger: 'blur' }"
|
||||
>
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="lineItem.conType"
|
||||
placeholder="请选择接线方式"
|
||||
@@ -588,6 +604,7 @@
|
||||
:rules="{ required: true, message: '请选择统计间隔', trigger: 'blur' }"
|
||||
>
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="lineItem.lineInterval"
|
||||
placeholder="请选择统计间隔"
|
||||
@@ -614,7 +631,7 @@
|
||||
:rules="{ required: true, message: '请输入pt', trigger: 'blur' }"
|
||||
>
|
||||
<div style="width: 100%; display: flex; justify-content: space-between">
|
||||
<el-input-number
|
||||
<el-input clearable-number
|
||||
:controls="false"
|
||||
:min="1"
|
||||
style="width: 48%"
|
||||
@@ -627,7 +644,7 @@
|
||||
pageStatus == 2)
|
||||
)
|
||||
"
|
||||
></el-input-number>
|
||||
></el-input>
|
||||
<span
|
||||
style="
|
||||
display: flex;
|
||||
@@ -637,7 +654,7 @@
|
||||
>
|
||||
:
|
||||
</span>
|
||||
<el-input-number
|
||||
<el-input clearable-number
|
||||
:controls="false"
|
||||
:min="1"
|
||||
style="width: 48%"
|
||||
@@ -650,17 +667,17 @@
|
||||
pageStatus == 2)
|
||||
)
|
||||
"
|
||||
></el-input-number>
|
||||
></el-input>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
class="form-item"
|
||||
label="CT变比:"
|
||||
:prop="'lineInfoList[' + lIndex + '].ctRatio'"
|
||||
:prop="'lineInfoList[' + lIndex + '].ctRatio'"
|
||||
:rules="{ required: true, message: '请输入ct', trigger: 'blur' }"
|
||||
>
|
||||
<div style="width: 100%; display: flex; justify-content: space-between">
|
||||
<el-input-number
|
||||
<el-input clearable-number
|
||||
:controls="false"
|
||||
:min="1"
|
||||
style="width: 48%"
|
||||
@@ -673,7 +690,7 @@
|
||||
pageStatus == 2)
|
||||
)
|
||||
"
|
||||
></el-input-number>
|
||||
></el-input>
|
||||
<span
|
||||
style="
|
||||
display: flex;
|
||||
@@ -683,7 +700,7 @@
|
||||
>
|
||||
:
|
||||
</span>
|
||||
<el-input-number
|
||||
<el-input clearable-number
|
||||
:controls="false"
|
||||
:min="1"
|
||||
style="width: 48%"
|
||||
@@ -696,12 +713,17 @@
|
||||
pageStatus == 2)
|
||||
)
|
||||
"
|
||||
></el-input-number>
|
||||
></el-input>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item class="form-item" label="基准容量(MVA):" :prop="'lineInfoList[' + lIndex + '].basicCapacity'" :rules="{ required: true, message: '请输入基准容量', trigger: 'blur' }">
|
||||
<el-input-number
|
||||
<el-form-item
|
||||
class="form-item"
|
||||
label="基准容量(MVA):"
|
||||
:prop="'lineInfoList[' + lIndex + '].basicCapacity'"
|
||||
:rules="{ required: true, message: '请输入基准容量', trigger: 'blur' }"
|
||||
>
|
||||
<el-input clearable-number
|
||||
:controls="false"
|
||||
:min="0"
|
||||
style="width: 100%"
|
||||
@@ -714,15 +736,15 @@
|
||||
)
|
||||
"
|
||||
placeholder="请输入基准容量(MVA)"
|
||||
></el-input-number>
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
class="form-item"
|
||||
label="短路容量(MVA):"
|
||||
:prop="'lineInfoList[' + lIndex + '].shortCircuitCapacity'"
|
||||
:prop="'lineInfoList[' + lIndex + '].shortCircuitCapacity'"
|
||||
:rules="{ required: true, message: '请输入短路容量', trigger: 'blur' }"
|
||||
>
|
||||
<el-input-number
|
||||
<el-input clearable-number
|
||||
:controls="false"
|
||||
:min="0"
|
||||
style="width: 100%"
|
||||
@@ -735,15 +757,15 @@
|
||||
)
|
||||
"
|
||||
placeholder="请输入短路容量(MVA)"
|
||||
></el-input-number>
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
class="form-item"
|
||||
label="设备容量(MW):"
|
||||
:prop="'lineInfoList[' + lIndex + '].devCapacity'"
|
||||
:prop="'lineInfoList[' + lIndex + '].devCapacity'"
|
||||
:rules="{ required: true, message: '请输入设备容量', trigger: 'blur' }"
|
||||
>
|
||||
<el-input-number
|
||||
<el-input clearable-number
|
||||
:controls="false"
|
||||
:min="0"
|
||||
style="width: 100%"
|
||||
@@ -756,15 +778,15 @@
|
||||
)
|
||||
"
|
||||
placeholder="请输入设备容量(MVA)"
|
||||
></el-input-number>
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
class="form-item"
|
||||
label="协议容量(MW):"
|
||||
:prop="'lineInfoList[' + lIndex + '].protocolCapacity'"
|
||||
:prop="'lineInfoList[' + lIndex + '].protocolCapacity'"
|
||||
:rules="{ required: true, message: '请输入协议容量', trigger: 'blur' }"
|
||||
>
|
||||
<el-input-number
|
||||
<el-input clearable-number
|
||||
:controls="false"
|
||||
:min="0"
|
||||
style="width: 100%"
|
||||
@@ -777,16 +799,17 @@
|
||||
)
|
||||
"
|
||||
placeholder="请输入协议容量(MW)"
|
||||
></el-input-number>
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item
|
||||
class="form-item"
|
||||
label="电压等级:"
|
||||
:prop="'lineInfoList[' + lIndex + '].volGrade'"
|
||||
:prop="'lineInfoList[' + lIndex + '].volGrade'"
|
||||
:rules="{ required: true, message: '请选择电压等级', trigger: 'blur' }"
|
||||
>
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="lineItem.volGrade"
|
||||
placeholder="请选择电压等级"
|
||||
@@ -806,13 +829,9 @@
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
class="form-item"
|
||||
label="用户对象:"
|
||||
:prop="'lineInfoList[' + lIndex + '].monitorUser'"
|
||||
:rules="{ required: true, message: '请选择用户对象', trigger: 'blur' }"
|
||||
>
|
||||
<el-form-item class="form-item" label="用户对象:">
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="lineItem.monitorUser"
|
||||
placeholder="请选择用户对象"
|
||||
@@ -835,7 +854,7 @@
|
||||
<el-form-item
|
||||
class="form-item"
|
||||
label="监测对象类型:"
|
||||
:prop="'lineInfoList[' + lIndex + '].monitorObj'"
|
||||
:prop="'lineInfoList[' + lIndex + '].monitorObj'"
|
||||
:rules="{
|
||||
required: true,
|
||||
message: '请选择监测对象类型',
|
||||
@@ -843,6 +862,7 @@
|
||||
}"
|
||||
>
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="lineItem.monitorObj"
|
||||
placeholder="请选择监测对象类型"
|
||||
@@ -862,13 +882,45 @@
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
class="form-item"
|
||||
label="监测位置:"
|
||||
:prop="'lineInfoList[' + lIndex + '].position'"
|
||||
:rules="{
|
||||
required: true,
|
||||
message: '请选择监测位置',
|
||||
trigger: 'blur'
|
||||
}"
|
||||
>
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="lineItem.position"
|
||||
placeholder="请选择监测位置"
|
||||
:disabled="
|
||||
!(
|
||||
(nodeLevel == 4 && pageStatus == 3) ||
|
||||
((nodeLevel == 3 || (nodeLevel == 2 && pageStatus == 2)) &&
|
||||
pageStatus == 2)
|
||||
)
|
||||
"
|
||||
>
|
||||
<el-option
|
||||
v-for="option in linePosition"
|
||||
:key="option.id"
|
||||
:label="option.name"
|
||||
:value="option.id"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
class="form-item"
|
||||
label="是否治理:"
|
||||
:prop="'lineInfoList[' + lIndex + '].govern'"
|
||||
:prop="'lineInfoList[' + lIndex + '].govern'"
|
||||
:rules="{ required: true, message: '请选择是否治理', trigger: 'blur' }"
|
||||
>
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="lineItem.govern"
|
||||
placeholder="请选择是否治理"
|
||||
@@ -890,8 +942,9 @@
|
||||
:prop="'lineInfoList[' + lIndex + '].runStatus'"
|
||||
:rules="{ required: true, message: '请选择运行状态', trigger: 'blur' }"
|
||||
>
|
||||
<!-- (0:运行;1:检修;2:停运;3:调试;4:退运) -->
|
||||
<!-- (0:运行;1:检修;2:停运;3:调试;4:退运) -->
|
||||
<el-select
|
||||
clearable
|
||||
filterable
|
||||
v-model="lineItem.runStatus"
|
||||
placeholder="请选择运行状态"
|
||||
@@ -1035,6 +1088,7 @@ const busBarId: any = ref('0')
|
||||
const lineId: any = ref('0')
|
||||
const userList: any = ref([])
|
||||
const monitorObjList: any = ref([])
|
||||
const linePosition: any = ref([])
|
||||
|
||||
const currentGdName: any = ref('')
|
||||
const affiliatiedFrontArr: any = ref([])
|
||||
@@ -1046,19 +1100,17 @@ const treeClickCount = ref(0)
|
||||
const areaTree: any = tree
|
||||
|
||||
const formData = ref({
|
||||
lineInfoList: [] as LineInfo[],
|
||||
projectInfoList:[] as ProjectInfo[],
|
||||
deviceInfoList :[] as DeviceInfo[],
|
||||
engineeringParam: {
|
||||
city: '',
|
||||
description: '',
|
||||
name: '',
|
||||
province: ''
|
||||
}
|
||||
lineInfoList: [] as LineInfo[],
|
||||
projectInfoList: [] as ProjectInfo[],
|
||||
deviceInfoList: [] as DeviceInfo[],
|
||||
engineeringParam: {
|
||||
city: '',
|
||||
description: '',
|
||||
name: '',
|
||||
province: ''
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
|
||||
const project = ref([
|
||||
{ name: '治理设备', value: '治理设备' },
|
||||
{ name: '便携式设备', value: '便携式设备' },
|
||||
@@ -1127,6 +1179,7 @@ interface LineInfo {
|
||||
devMac: string
|
||||
monitorUser: string
|
||||
monitorObj: string
|
||||
position: string
|
||||
govern: string | number
|
||||
runStatus: string | number
|
||||
basicCapacity: number
|
||||
@@ -1506,6 +1559,7 @@ const add = () => {
|
||||
monitorUser: '',
|
||||
devMac: '',
|
||||
monitorObj: '',
|
||||
position: '',
|
||||
govern: 0,
|
||||
runStatus: 0,
|
||||
basicCapacity: 0,
|
||||
@@ -1682,8 +1736,9 @@ const updateLineFunc = (id: any) => {
|
||||
ct2Ratio: currentLine.ct2Ratio || 1,
|
||||
monitorUser: currentLine.monitorUser || '',
|
||||
monitorObj: currentLine.monitorObj || '',
|
||||
govern: currentLine.govern ,
|
||||
runStatus: currentLine.runStatus ,
|
||||
position: currentLine.position || '',
|
||||
govern: currentLine.govern,
|
||||
runStatus: currentLine.runStatus,
|
||||
basicCapacity: currentLine.basicCapacity || 0,
|
||||
shortCircuitCapacity: currentLine.shortCircuitCapacity || 0,
|
||||
devCapacity: currentLine.devCapacity || 0,
|
||||
@@ -1878,6 +1933,7 @@ const next = async () => {
|
||||
monitorUser: '',
|
||||
devMac: '',
|
||||
monitorObj: '',
|
||||
position: '',
|
||||
govern: 0,
|
||||
runStatus: 0,
|
||||
basicCapacity: 0,
|
||||
@@ -1900,7 +1956,6 @@ const next = async () => {
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
// 撤销
|
||||
@@ -1925,21 +1980,21 @@ const black = () => {
|
||||
const onsubmit = async () => {
|
||||
await mainForm.value.validate((valid: any) => {
|
||||
if (valid) {
|
||||
if (pageStatus.value == 2) {
|
||||
// 新增
|
||||
// 检查是否是多层级新增还是单层级新增
|
||||
if (
|
||||
tempAllLevelData.value.engineering !== null ||
|
||||
tempAllLevelData.value.projects.length > 0 ||
|
||||
tempAllLevelData.value.devices.length > 0 ||
|
||||
tempAllLevelData.value.lines.length > 0
|
||||
) {
|
||||
// 多层级新增,一次性提交所有数据
|
||||
submitAllLevelData()
|
||||
} else {
|
||||
// 单层级新增,使用原有的提交方式
|
||||
submitData()
|
||||
}
|
||||
if (pageStatus.value == 2) {
|
||||
// 新增
|
||||
// 检查是否是多层级新增还是单层级新增
|
||||
if (
|
||||
tempAllLevelData.value.engineering !== null ||
|
||||
tempAllLevelData.value.projects.length > 0 ||
|
||||
tempAllLevelData.value.devices.length > 0 ||
|
||||
tempAllLevelData.value.lines.length > 0
|
||||
) {
|
||||
// 多层级新增,一次性提交所有数据
|
||||
submitAllLevelData()
|
||||
} else {
|
||||
// 单层级新增,使用原有的提交方式
|
||||
submitData()
|
||||
}
|
||||
} else if (pageStatus.value == 3) {
|
||||
// 修改
|
||||
switch (nodeLevel.value) {
|
||||
@@ -1958,7 +2013,6 @@ const onsubmit = async () => {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
@@ -2003,7 +2057,9 @@ const submitAllLevelData = async () => {
|
||||
|
||||
case 2: // 工程 + 项目 + 设备
|
||||
// 工程信息
|
||||
const engineeringData2 = tempAllLevelData.value.engineering || { ...formData.value.engineeringParam }
|
||||
const engineeringData2 = tempAllLevelData.value.engineering || {
|
||||
...formData.value.engineeringParam
|
||||
}
|
||||
// 项目信息
|
||||
const projectData2 =
|
||||
tempAllLevelData.value.projects.length > 0
|
||||
@@ -2059,7 +2115,9 @@ const submitAllLevelData = async () => {
|
||||
case 3: // 工程 + 项目 + 设备 + 监测点
|
||||
case 4:
|
||||
// 工程信息
|
||||
const engineeringData3 = tempAllLevelData.value.engineering || { ...formData.value.engineeringParam }
|
||||
const engineeringData3 = tempAllLevelData.value.engineering || {
|
||||
...formData.value.engineeringParam
|
||||
}
|
||||
|
||||
// 项目信息
|
||||
const projectData3 =
|
||||
@@ -2255,10 +2313,8 @@ const submitAllLevelData = async () => {
|
||||
}
|
||||
}, 100)
|
||||
})
|
||||
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
/**
|
||||
* 重置所有表单
|
||||
@@ -2302,6 +2358,7 @@ const resetAllForms = () => {
|
||||
line.volGrade = ''
|
||||
line.monitorUser = ''
|
||||
line.monitorObj = ''
|
||||
line.position = ''
|
||||
line.govern = 0
|
||||
line.runStatus = 0
|
||||
line.basicCapacity = 0
|
||||
@@ -2469,6 +2526,7 @@ const submitData = () => {
|
||||
ct2Ratio: currentLine.ct2Ratio,
|
||||
monitorUser: currentLine.monitorUser,
|
||||
monitorObj: currentLine.monitorObj,
|
||||
position: currentLine.position,
|
||||
govern: currentLine.govern,
|
||||
runStatus: currentLine.runStatus,
|
||||
basicCapacity: currentLine.basicCapacity,
|
||||
@@ -2620,7 +2678,9 @@ const handleBusBarTabsEdit = (targetName: any, action: any) => {
|
||||
} else {
|
||||
// 如果是新增模式下删除未保存的设备
|
||||
formData.value.deviceInfoList.splice(busBarIndex.value, 1)
|
||||
busBarIndex.value = formData.value.deviceInfoList.length ? (formData.value.deviceInfoList.length - 1).toString() : '0'
|
||||
busBarIndex.value = formData.value.deviceInfoList.length
|
||||
? (formData.value.deviceInfoList.length - 1).toString()
|
||||
: '0'
|
||||
lineIndex.value = '0'
|
||||
ElMessage({
|
||||
type: 'success',
|
||||
@@ -2656,6 +2716,7 @@ const handleLineTabsEdit = (targetName: any, action: any) => {
|
||||
devMac: '',
|
||||
monitorUser: '',
|
||||
monitorObj: '',
|
||||
position: '',
|
||||
govern: 0,
|
||||
runStatus: 0,
|
||||
basicCapacity: 0,
|
||||
@@ -2682,14 +2743,18 @@ const handleLineTabsEdit = (targetName: any, action: any) => {
|
||||
// 从列表中移除
|
||||
formData.value.lineInfoList.splice(lineIndex.value, 1)
|
||||
// 重新设置当前选中的tab
|
||||
lineIndex.value = formData.value.lineInfoList.length ? (formData.value.lineInfoList.length - 1).toString() : '0'
|
||||
lineIndex.value = formData.value.lineInfoList.length
|
||||
? (formData.value.lineInfoList.length - 1).toString()
|
||||
: '0'
|
||||
pageStatus.value = 1
|
||||
treedata()
|
||||
})
|
||||
} else {
|
||||
// 如果是新增模式下删除未保存的监测点
|
||||
formData.value.lineInfoList.splice(lineIndex.value, 1)
|
||||
lineIndex.value = formData.value.lineInfoList.length ? (formData.value.lineInfoList.length - 1).toString() : '0'
|
||||
lineIndex.value = formData.value.lineInfoList.length
|
||||
? (formData.value.lineInfoList.length - 1).toString()
|
||||
: '0'
|
||||
ElMessage({
|
||||
type: 'success',
|
||||
message: '删除成功'
|
||||
@@ -2777,6 +2842,9 @@ const area = () => {
|
||||
getDicDataByTypeCode({ dictTypeCode: 'M_Obj_Types' }).then(res => {
|
||||
monitorObjList.value = res.data
|
||||
})
|
||||
getDicDataByTypeCode({ dictTypeCode: 'Line_Position' }).then(res => {
|
||||
linePosition.value = res.data
|
||||
})
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
<div class="device-manage-right" :style="{ height: pageHeight.height }">
|
||||
<el-descriptions title="用户基本信息" class="mb10" :column="2" border>
|
||||
<template #extra>
|
||||
<el-button type="primary" icon="el-icon-Plus" @click="getMarketEnginner">
|
||||
添加工程
|
||||
<el-button type="primary" icon="el-icon-Sort" @click="getMarketEnginner">
|
||||
绑定工程
|
||||
</el-button>
|
||||
</template>
|
||||
<el-descriptions-item label="名称">
|
||||
@@ -29,7 +29,7 @@
|
||||
</vxe-table>
|
||||
</div>
|
||||
</div>
|
||||
<el-dialog v-model.trim="dialogVisible" title="添加工程" class="cn-operate-dialog" :close-on-click-modal="false">
|
||||
<el-dialog v-model.trim="dialogVisible" title="绑定工程" class="cn-operate-dialog" :close-on-click-modal="false">
|
||||
<el-input maxlength="32" show-word-limit v-model.trim="filterText" icon="el-icon-Search" placeholder="请输入内容"
|
||||
clearable style="margin-bottom: 10px">
|
||||
<template #prefix>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<OfficialUserTree @node-click="selectUser" @selectUser="selectUser"></OfficialUserTree>
|
||||
<div class="device-manage-right" :style="{ height: pageHeight.height }">
|
||||
<div class="el-descriptions__header">
|
||||
<el-button type="primary" @click="getEnginnerDev">添加工程 / 设备</el-button>
|
||||
<el-button type="primary" icon="el-icon-Sort" @click="getEnginnerDev">绑定工程 / 设备</el-button>
|
||||
</div>
|
||||
|
||||
<!-- 使用flex布局平均分配高度 -->
|
||||
@@ -41,7 +41,7 @@
|
||||
<el-dialog
|
||||
v-model.trim="dialogVisible"
|
||||
draggable
|
||||
title="添加工程 / 设备"
|
||||
title="绑定工程 / 设备"
|
||||
class="cn-operate-dialog"
|
||||
:close-on-click-modal="false"
|
||||
|
||||
|
||||
@@ -1,48 +1,48 @@
|
||||
<template>
|
||||
<div class="default-main">
|
||||
<TableHeader datePicker></TableHeader>
|
||||
<Table ref="tableRef" :isGroup="true" />
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { Plus } from '@element-plus/icons-vue'
|
||||
import { ref, onMounted, provide } from 'vue'
|
||||
import TableStore from '@/utils/tableStore'
|
||||
import Table from '@/components/table/index.vue'
|
||||
import TableHeader from '@/components/table/header/index.vue'
|
||||
|
||||
defineOptions({
|
||||
name: 'govern/log/operation'
|
||||
})
|
||||
const tableStore = new TableStore({
|
||||
url: '/cs-device-boot/cslog/queryLog',
|
||||
method: 'POST',
|
||||
column: [
|
||||
{ title: '操作日期', field: 'createTime', align: 'center', sortable: true },
|
||||
{ title: '操作描述', field: 'operate', align: 'center', width: '300' },
|
||||
{ title: '用户名称', field: 'userName', align: 'center' },
|
||||
{ title: '更新时间', field: 'updateTime', align: 'center', sortable: true },
|
||||
{ title: '失败原因', field: 'failReason', align: 'center' },
|
||||
{ title: '状态', field: 'result', align: 'center' },
|
||||
{ title: '登录名', field: 'loginName', align: 'center' }
|
||||
],
|
||||
|
||||
loadCallback: () => {
|
||||
tableStore.table.data.forEach((item: any) => {
|
||||
item.failReason = item.failReason || '/'
|
||||
item.result = item.result === 1 ? '成功' : '失败'
|
||||
item.loginName = item.loginName || '/'
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
provide('tableStore', tableStore)
|
||||
tableStore.table.params.searchState = 0
|
||||
tableStore.table.params.sortBy = ''
|
||||
tableStore.table.params.orderBy = ''
|
||||
onMounted(() => {
|
||||
tableStore.index()
|
||||
})
|
||||
|
||||
const addMenu = () => {}
|
||||
</script>
|
||||
<template>
|
||||
<div class="default-main">
|
||||
<TableHeader datePicker></TableHeader>
|
||||
<Table ref="tableRef" :isGroup="true" />
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { Plus } from '@element-plus/icons-vue'
|
||||
import { ref, onMounted, provide } from 'vue'
|
||||
import TableStore from '@/utils/tableStore'
|
||||
import Table from '@/components/table/index.vue'
|
||||
import TableHeader from '@/components/table/header/index.vue'
|
||||
|
||||
defineOptions({
|
||||
name: 'govern/log/operation'
|
||||
})
|
||||
const tableStore = new TableStore({
|
||||
url: '/cs-device-boot/cslog/queryLog',
|
||||
method: 'POST',
|
||||
column: [
|
||||
{ title: '操作日期', field: 'createTime', align: 'center', sortable: true, minWidth: '150' },
|
||||
{ title: '操作描述', field: 'operate', align: 'center', minWidth: '300' },
|
||||
{ title: '用户名称', field: 'userName', align: 'center', minWidth: '130' },
|
||||
{ title: '更新时间', field: 'updateTime', align: 'center', sortable: true, minWidth: '150' },
|
||||
{ title: '失败原因', field: 'failReason', align: 'center', minWidth: '200' },
|
||||
{ title: '状态', field: 'result', align: 'center', minWidth: '120' },
|
||||
{ title: '登录名', field: 'loginName', align: 'center', minWidth: '120' }
|
||||
],
|
||||
|
||||
loadCallback: () => {
|
||||
tableStore.table.data.forEach((item: any) => {
|
||||
item.failReason = item.failReason || '/'
|
||||
item.result = item.result === 1 ? '成功' : '失败'
|
||||
item.loginName = item.loginName || '/'
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
provide('tableStore', tableStore)
|
||||
tableStore.table.params.searchState = 0
|
||||
tableStore.table.params.sortBy = ''
|
||||
tableStore.table.params.orderBy = ''
|
||||
onMounted(() => {
|
||||
tableStore.index()
|
||||
})
|
||||
|
||||
const addMenu = () => {}
|
||||
</script>
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-form :model="form" label-width="100px" class="mt10">
|
||||
<el-form :model="form" label-width="100px" class="mt10 form-one" >
|
||||
<el-form-item label="描述:" prop="description">
|
||||
<el-input
|
||||
maxlength="300"
|
||||
@@ -258,16 +258,14 @@ const open = (text: string, data?: anyObj) => {
|
||||
})
|
||||
}
|
||||
const submit = () => {
|
||||
|
||||
if (fileList.value.length == 0) {
|
||||
ElMessage.warning('请上传升级文件')
|
||||
return
|
||||
}
|
||||
|
||||
// console.log(formRef)
|
||||
formRef.value.validate(async (valid: boolean) => {
|
||||
// console.log(valid)
|
||||
if (valid) {
|
||||
if (fileList.value.length == 0) {
|
||||
ElMessage.warning('请上传升级文件')
|
||||
return
|
||||
}
|
||||
let submitForm = new FormData()
|
||||
for (let key in form) {
|
||||
submitForm.append(key, form[key])
|
||||
|
||||
@@ -79,6 +79,7 @@ import DatePicker from '@/components/form/datePicker/time.vue'
|
||||
import { Splitpanes, Pane } from 'splitpanes'
|
||||
import CloudDeviceEntryTree from '@/components/tree/govern/cloudDeviceEntryTreeZL.vue'
|
||||
import { getListByIds } from '@/api/harmonic-boot/cockpit/cockpit'
|
||||
import { ElMessage } from 'element-plus'
|
||||
// import data from './123.json'
|
||||
defineOptions({
|
||||
name: 'govern/reportCore/statisticsWx/indexZL'
|
||||
@@ -101,9 +102,12 @@ const tableStore = new TableStore({
|
||||
beforeSearchFun: () => {
|
||||
tableStore.table.params.tempId = Template.value.id
|
||||
tableStore.table.params.lineId = dotList.value.id
|
||||
tableStore.table.params.sensitiveUserId = dotList.value.id
|
||||
tableStore.table.params.sensitiveUserId = dotList.value.id
|
||||
// ;(tableStore.table.params.startTime = datePickerRef.value.timeValue[0]),
|
||||
// (tableStore.table.params.endTime = datePickerRef.value.timeValue[1]),
|
||||
if (!tableStore.table.params.tempId) {
|
||||
return ElMessage.warning('请选择模板')
|
||||
}
|
||||
delete tableStore.table.params.searchBeginTime
|
||||
delete tableStore.table.params.searchEndTime
|
||||
delete tableStore.table.params.timeFlag
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<el-dialog class="cn-operate-dialog" width="600px" v-model.trim="dialogVisible" :title="title">
|
||||
<el-form :model="form" label-width="auto" ref="formRef" :rules="rules">
|
||||
<el-form :model="form" class="form-one" label-width="auto" ref="formRef" :rules="rules">
|
||||
<el-form-item label="所属厂站名称" prop="substationName">
|
||||
<el-input v-model.trim="form.substationName" placeholder="请输入所属厂站名称"></el-input>
|
||||
</el-form-item>
|
||||
@@ -18,13 +18,13 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="用户协议容量(MVA)" prop="userAgreementCapacity">
|
||||
<el-input-number style="width: 100%;" :min="0" maxlength="32" show-word-limit v-model.trim="form.userAgreementCapacity" placeholder="请输入用户协议容量"></el-input-number>
|
||||
<el-input-number style="width: 100%;" :min="0" maxlength="32" show-word-limit v-model.number="form.userAgreementCapacity" placeholder="请输入用户协议容量"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="装机容量(MW)" prop="installedCapacity">
|
||||
<el-input-number style="width: 100%;" :min="0" maxlength="32" show-word-limit v-model.trim="form.installedCapacity" placeholder="请输入装机容量"></el-input-number>
|
||||
<el-input-number style="width: 100%;" :min="0" maxlength="32" show-word-limit v-model.number="form.installedCapacity" placeholder="请输入装机容量"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="排序" prop="sort">
|
||||
<el-input-number style="width: 100%;" :min="0" maxlength="32" show-word-limit v-model.trim="form.sort" placeholder="请输入排序"></el-input-number>
|
||||
<el-input-number style="width: 100%;" :min="0" maxlength="32" show-word-limit v-model.number="form.sort" placeholder="请输入排序"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
@@ -74,6 +74,7 @@ const rules = {
|
||||
const dialogVisible = ref(false)
|
||||
const title = ref('新增')
|
||||
const open = (text: string, data?: anyObj) => {
|
||||
formRef.value?.resetFields()
|
||||
title.value = text
|
||||
dialogVisible.value = true
|
||||
if (data) {
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="排序" prop="sort">
|
||||
<el-input maxlength="32" show-word-limit-number v-model.trim="form.sort" :min="0" />
|
||||
<el-input maxlength="32" show-word-limit-number v-model.number="form.sort" :min="0" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
|
||||
@@ -1,49 +1,11 @@
|
||||
<template>
|
||||
<div class="default-main pd10">
|
||||
<div style="width: 100%; display: flex; justify-content: end">
|
||||
<div class="elButton">
|
||||
<el-button type="primary" icon="el-icon-Check" @click="onSubmit">保存</el-button>
|
||||
<back-component />
|
||||
</div>
|
||||
<div style="display: flex" class="mt10">
|
||||
<!-- <el-tabs type="border-card">
|
||||
<el-tab-pane label="组件">
|
||||
<div style="width: 520px; overflow: auto" :style="indicatorHeight" class="mr10">
|
||||
<el-collapse v-model="activeNames" :expand-icon-position="position">
|
||||
<el-collapse-item
|
||||
v-for="item in treeComponents"
|
||||
:key="item.id"
|
||||
:title="item.name"
|
||||
:name="item.id"
|
||||
>
|
||||
<el-collapse v-model="activeNames1" class="ml20">
|
||||
<el-collapse-item
|
||||
v-for="k in item.children"
|
||||
:key="k.id"
|
||||
:title="k.name"
|
||||
:name="k.id"
|
||||
>
|
||||
<div class="Box">
|
||||
<div
|
||||
v-for="(s, index) in k.children"
|
||||
:key="index"
|
||||
class="mr10 mb10 imgBox"
|
||||
draggable="true"
|
||||
unselectable="on"
|
||||
@drag="drag(s)"
|
||||
@dragend="dragEnd(s)"
|
||||
>
|
||||
<div class="textName">{{ s.name }}</div>
|
||||
<img :src="s.image" style="width: 150px" />
|
||||
</div>
|
||||
</div>
|
||||
</el-collapse-item>
|
||||
</el-collapse>
|
||||
</el-collapse-item>
|
||||
</el-collapse>
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
</el-tabs> -->
|
||||
<el-tabs v-model="tableName" type="border-card" @tab-change="changeTab">
|
||||
<div style="display: flex">
|
||||
<el-tabs v-model="tableName" v-if="treeComponents.length > 0" type="border-card" @tab-change="changeTab">
|
||||
<el-tab-pane v-for="item in treeComponents" :key="item.name" :label="item.name" :name="item.name">
|
||||
<el-tabs v-model="tableName1" tab-position="top">
|
||||
<el-tab-pane v-for="k in item?.children" :key="k.name" :label="k.name" :name="k.name">
|
||||
@@ -70,7 +32,7 @@
|
||||
</el-tabs>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
|
||||
<el-empty v-else description="当前角色未绑定系统" style="width: 520px" />
|
||||
<div style="flex: 1" ref="wrapper" class="ml10">
|
||||
<el-tabs type="border-card" class="mb10">
|
||||
<el-tab-pane label="基础信息">
|
||||
@@ -208,6 +170,9 @@ import { useAdminInfo } from '@/stores/adminInfo'
|
||||
const tableName = ref('')
|
||||
const tableName1 = ref('')
|
||||
import { useNavTabs } from '@/stores/navTabs'
|
||||
import { getSystemByRoleId } from '@/api/user-boot/roleFuction'
|
||||
import { forEach } from 'jszip'
|
||||
import { id } from 'element-plus/es/locale'
|
||||
// defineOptions({
|
||||
// name: 'cockpit/popup'
|
||||
// })
|
||||
@@ -218,7 +183,7 @@ const { go } = useRouter()
|
||||
const navTabs = useNavTabs()
|
||||
const { query } = useRoute()
|
||||
const router = useRouter()
|
||||
const height = mainHeight(295)
|
||||
const height = mainHeight(265)
|
||||
const indicatorHeight = mainHeight(180)
|
||||
const rowHeight = ref(0)
|
||||
const pageList: any = ref([])
|
||||
@@ -258,7 +223,7 @@ const layout: any = ref([
|
||||
])
|
||||
const treeComponents: any = ref([]) //组件树
|
||||
const treeComponentsCopy: any = ref([]) //组件树
|
||||
const info = () => {
|
||||
const info = async () => {
|
||||
pageList.value = router
|
||||
.getRoutes()
|
||||
.filter(item => item?.meta?.component == '/src/views/pqs/cockpit/homePage/index.vue')
|
||||
@@ -268,17 +233,26 @@ const info = () => {
|
||||
|
||||
activeNames.value = []
|
||||
activeNames1.value = []
|
||||
componentTree().then(res => {
|
||||
treeComponents.value = res.data
|
||||
|
||||
let systemList: any[] = []
|
||||
await adminInfo.roleList.forEach((item: any) => {
|
||||
getSystemByRoleId({ id: item }).then(res => {
|
||||
systemList = [...new Set([...systemList, ...res.data.systemIds])]
|
||||
})
|
||||
})
|
||||
|
||||
await componentTree().then(res => {
|
||||
let list = res.data.filter(item => systemList.includes(item.id))
|
||||
treeComponents.value = list
|
||||
tableName.value = tableName.value == '' ? treeComponents.value[0].name : tableName.value
|
||||
tableName1.value = tableName1.value == '' ? treeComponents.value[0].children[0].name : tableName1.value
|
||||
activeNames.value = treeComponents.value.map(item => item.id)
|
||||
res.data.forEach(item => {
|
||||
list.forEach(item => {
|
||||
item.children.forEach(k => {
|
||||
activeNames1.value.push(k.id)
|
||||
})
|
||||
})
|
||||
treeComponentsCopy.value = tree2List(JSON.parse(JSON.stringify(res.data)), 0)
|
||||
treeComponentsCopy.value = tree2List(JSON.parse(JSON.stringify(list)), 0)
|
||||
})
|
||||
|
||||
if (query.id) {
|
||||
@@ -439,7 +413,6 @@ const onSubmit = () => {
|
||||
if (layout.value.length == 0) {
|
||||
return ElMessage.warning('页面设计不能为空!')
|
||||
}
|
||||
console.log(123, findDuplicateNames(layout.value))
|
||||
let repeat = findDuplicateNames(layout.value) || []
|
||||
if (repeat.length > 0) {
|
||||
return ElMessage.warning(repeat.join('、') + ' 组件重复,请删除重复组件!')
|
||||
@@ -493,31 +466,72 @@ const onSubmit = () => {
|
||||
})
|
||||
}
|
||||
// 查找重复的name
|
||||
// const findDuplicateNames = (arr: any) => {
|
||||
// // 用于记录每个name出现的次数
|
||||
// const nameCount = {}
|
||||
// // 用于存储重复的name
|
||||
// const duplicates = []
|
||||
|
||||
// // 遍历数组统计每个name的出现次数
|
||||
// arr.forEach(item => {
|
||||
// const name = item.name
|
||||
// if (nameCount[name]) {
|
||||
// nameCount[name]++
|
||||
// } else {
|
||||
// nameCount[name] = 1
|
||||
// }
|
||||
// })
|
||||
|
||||
// // 筛选出出现次数大于1的name
|
||||
// for (const name in nameCount) {
|
||||
// if (nameCount[name] > 1) {
|
||||
// duplicates.push(name)
|
||||
// }
|
||||
// }
|
||||
|
||||
// return duplicates
|
||||
// }
|
||||
// 查找重复的path,并返回对应的重复name
|
||||
const findDuplicateNames = (arr: any) => {
|
||||
// 用于记录每个name出现的次数
|
||||
const nameCount = {}
|
||||
// 用于存储重复的name
|
||||
// 用于记录每个path出现的次数
|
||||
const pathCount: any = {}
|
||||
// 用于存储path对应的name(避免重复存储)
|
||||
const pathToNameMap = new Map()
|
||||
// 用于存储重复path对应的name
|
||||
const duplicates = []
|
||||
|
||||
// 遍历数组统计每个name的出现次数
|
||||
// 遍历数组统计每个path的出现次数,并记录path和name的映射
|
||||
arr.forEach(item => {
|
||||
const path = item.path
|
||||
const name = item.name
|
||||
if (nameCount[name]) {
|
||||
nameCount[name]++
|
||||
|
||||
// 记录path和name的对应关系(只存第一次的,避免覆盖)
|
||||
if (!pathToNameMap.has(path)) {
|
||||
pathToNameMap.set(path, name)
|
||||
}
|
||||
|
||||
// 统计path出现次数
|
||||
if (pathCount[path]) {
|
||||
pathCount[path]++
|
||||
} else {
|
||||
nameCount[name] = 1
|
||||
pathCount[path] = 1
|
||||
}
|
||||
})
|
||||
|
||||
// 筛选出出现次数大于1的name
|
||||
for (const name in nameCount) {
|
||||
if (nameCount[name] > 1) {
|
||||
duplicates.push(name)
|
||||
// 筛选出出现次数大于1的path,并获取对应的name
|
||||
for (const path in pathCount) {
|
||||
if (pathCount[path] > 1) {
|
||||
const name = pathToNameMap.get(path)
|
||||
// 避免重复添加相同的name(如果多个重复path对应同一个name)
|
||||
if (!duplicates.includes(name)) {
|
||||
duplicates.push(name)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return duplicates
|
||||
}
|
||||
|
||||
const getImg = throttle((path: string) => {
|
||||
if (path != undefined) return treeComponentsCopy.value.filter(item => item.path == path)[0]?.image
|
||||
})
|
||||
@@ -652,4 +666,20 @@ onBeforeUnmount(() => {
|
||||
// border: 1px solid #000;
|
||||
box-shadow: var(--el-box-shadow-light);
|
||||
}
|
||||
.elButton {
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
top: 13px;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
:deep(.vgl-item__resizer) {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background: linear-gradient(45deg, var(--el-color-primary));
|
||||
|
||||
clip-path: polygon(100% 0, 100% 100%, 0 100%);
|
||||
/* 可选:添加阴影增强视觉效果 */
|
||||
box-shadow: 2px 2px 8px var(--el-color-primary);
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
style="width: 100%"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="组件图标" prop="icon">
|
||||
<el-form-item label="组件图标">
|
||||
<IconSelector v-model="form.icon" placeholder="请选择图标" />
|
||||
</el-form-item>
|
||||
<el-form-item class="top" label="组件标识" prop="code">
|
||||
@@ -42,17 +42,7 @@
|
||||
<el-checkbox-button value="5">日</el-checkbox-button>
|
||||
</el-checkbox-group>
|
||||
</el-form-item>
|
||||
<el-form-item class="top" label="组件绑定系统" prop="systemIds">
|
||||
<el-select
|
||||
v-model="form.systemIds"
|
||||
multiple
|
||||
collapse-tags
|
||||
collapse-tags-tooltip
|
||||
placeholder="请选择组件绑定系统"
|
||||
>
|
||||
<el-option v-for="item in systemList" :key="item.id" :label="item.name" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item class="top" label="组件排序" prop="sort">
|
||||
<el-input v-model.number="form.sort" placeholder="请输入组件排序"></el-input>
|
||||
</el-form-item>
|
||||
@@ -103,7 +93,6 @@ const form = ref<anyObj>({
|
||||
system: [],
|
||||
timeKeys: ['1', '2', '3', '4', '5'],
|
||||
code: '',
|
||||
systemIds: [],
|
||||
path: ''
|
||||
})
|
||||
const props = { label: 'name', value: 'id', multiple: true }
|
||||
@@ -114,36 +103,48 @@ const rules = {
|
||||
icon: [{ required: true, message: '请先择组件图标', trigger: 'change' }],
|
||||
path: [{ required: true, message: '请输入组件路径', trigger: 'blur' }],
|
||||
sort: [{ required: true, message: '请输入排序', trigger: 'blur' }],
|
||||
timeKeys: [{ required: true, message: '请选择组件查询时间', trigger: 'change' }],
|
||||
systemIds: [{ required: true, message: '请选择组件绑定系统', trigger: 'change' }]
|
||||
timeKeys: [{ required: true, message: '请选择组件查询时间', trigger: 'change' }]
|
||||
}
|
||||
const customDeptOption: any = ref([])
|
||||
const systemList = dictData.getBasicData('System_Type')
|
||||
onMounted(() => {
|
||||
customDeptOption.value = dictData.getBasicData('Component_Type')
|
||||
onMounted(() => {})
|
||||
const getSystem = async () => {
|
||||
// customDeptOption.value = dictData.getBasicData('System_Type')
|
||||
// await customDeptOption.value.forEach((item: any) => {
|
||||
// getFatherComponent({ systemType: item.id }).then(res => {
|
||||
// item.children = res.data.filter(item => item.name != '无')
|
||||
// })
|
||||
// })
|
||||
customDeptOption.value = dictData.getBasicData('System_Type')
|
||||
|
||||
customDeptOption.value.forEach((item: any) => {
|
||||
getFatherComponent({ systemType: item.id }).then(res => {
|
||||
item.children = res.data.filter(item => item.name != '无')
|
||||
})
|
||||
// 创建所有异步请求的 Promise 数组
|
||||
const promises = customDeptOption.value.map(async (item: any) => {
|
||||
try {
|
||||
const res = await getFatherComponent({ systemType: item.id })
|
||||
item.children = res.data.sort((a, b) => a.sort - b.sort)
|
||||
} catch (error) {
|
||||
console.error('加载组件失败:', error)
|
||||
item.children = []
|
||||
}
|
||||
})
|
||||
})
|
||||
// 等待所有请求完成
|
||||
await Promise.all(promises)
|
||||
// 所有 children 数据都已加载完成
|
||||
return customDeptOption.value
|
||||
}
|
||||
|
||||
const open = (text: string, data?: anyObj) => {
|
||||
console.log(data)
|
||||
const open = async (text: string, data?: anyObj) => {
|
||||
title.value = text
|
||||
dialogVisible.value = true
|
||||
await getSystem()
|
||||
if (data) {
|
||||
let Data = JSON.parse(JSON.stringify(data))
|
||||
form.value = Data
|
||||
form.value.system = [Data.systemType, Data.pid]
|
||||
// form.value.timeKeys = Data.timeKeys.split(',').map(Number)
|
||||
form.value.system = getSystemComponentPairs(customDeptOption.value, Data.componentType)
|
||||
|
||||
form.value.timeKeys = Data.timeKeys || []
|
||||
}
|
||||
}
|
||||
const submit = () => {
|
||||
console.log('🚀 ~ submit ~ form.value:', form.value)
|
||||
|
||||
formRef.value.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
let url = ''
|
||||
@@ -168,11 +169,9 @@ const submit = () => {
|
||||
if (title.value == '新增组件') {
|
||||
await componentAdd({
|
||||
...form.value,
|
||||
systemType: form.value.system
|
||||
.map(subArr => (subArr.length > 1 ? subArr.at(-1) : null))
|
||||
.filter(item => item !== null),
|
||||
// systemType: form.value.system[0],
|
||||
pid: form.value.system[1],
|
||||
systemType: formatFirstIdToString(form.value.system, 0),
|
||||
componentType: formatFirstIdToString(form.value.system, 1),
|
||||
pid: '123',
|
||||
image: url
|
||||
}).then(res => {
|
||||
ElMessage.success('新增成功!')
|
||||
@@ -182,11 +181,9 @@ const submit = () => {
|
||||
} else {
|
||||
await componentEdit({
|
||||
...form.value,
|
||||
// systemType: form.value.system[0],
|
||||
systemType: form.value.system
|
||||
.map(subArr => (subArr.length > 1 ? subArr.at(-1) : null))
|
||||
.filter(item => item !== null),
|
||||
pid: form.value.system[1],
|
||||
systemType: formatFirstIdToString(form.value.system, 0),
|
||||
componentType: formatFirstIdToString(form.value.system, 1),
|
||||
pid: '123',
|
||||
image: url
|
||||
}).then(res => {
|
||||
ElMessage.success('修改成功!')
|
||||
@@ -199,6 +196,41 @@ const submit = () => {
|
||||
}
|
||||
})
|
||||
}
|
||||
// 处理函数:提取子数组第一个元素 + 去重 + 拼接
|
||||
const formatFirstIdToString = (data: any, num: number) => {
|
||||
// 1. 提取每个子数组的第一个元素
|
||||
const firstIds = data.map(item => item[num])
|
||||
// 2. 去重(利用Set特性)
|
||||
const uniqueFirstIds = [...new Set(firstIds)]
|
||||
// 3. 拼接成逗号分隔的字符串
|
||||
return uniqueFirstIds.join(',')
|
||||
}
|
||||
// 根据id 找二位数组回显
|
||||
function getSystemComponentPairs(data: any, idsStr: string) {
|
||||
const targetIds = idsStr.split(',')
|
||||
const result: any[] = []
|
||||
|
||||
// 遍历所有数据
|
||||
data.forEach(system => {
|
||||
const systemId = system.id
|
||||
const children = system.children || []
|
||||
|
||||
// 在children中查找匹配的ID
|
||||
children.forEach(child => {
|
||||
if (targetIds.includes(child.id)) {
|
||||
result.push([systemId, child.id])
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
// 按照提供的ID顺序排序
|
||||
return result.sort((a, b) => {
|
||||
const indexA = targetIds.indexOf(a[1])
|
||||
const indexB = targetIds.indexOf(b[1])
|
||||
return indexA - indexB
|
||||
})
|
||||
}
|
||||
|
||||
// 组件映射
|
||||
const componentMap = reactive(new Map<string, Component | string>())
|
||||
// 动态注册组件
|
||||
|
||||
@@ -226,6 +226,10 @@ const editTree = (row: any, num: number) => {
|
||||
}
|
||||
// 删除
|
||||
const del = (row: any) => {
|
||||
if (row.children?.length > 0) {
|
||||
ElMessage.warning('请先删除节点下的组件!')
|
||||
return
|
||||
}
|
||||
ElMessageBox.confirm('确定删除吗?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
@@ -362,10 +366,13 @@ span {
|
||||
height: calc(100vh - 210px) !important;
|
||||
}
|
||||
}
|
||||
.elButton{
|
||||
.elButton {
|
||||
position: absolute;
|
||||
top: 13px;
|
||||
right: 10px;
|
||||
z-index: 1;
|
||||
}
|
||||
.custom-tabs-label {
|
||||
font-size: 14px;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,108 +1,108 @@
|
||||
<template>
|
||||
<el-dialog draggable width="600px" v-model="dialogVisible" :title="title">
|
||||
|
||||
<el-form :inline="false" :model="form" label-width="auto" class="form-one" :rules="rules" ref="formRef">
|
||||
<el-form-item label="任务名称" prop="timerName">
|
||||
<el-input v-model.trim="form.timerName" clearable maxlength="32" show-word-limit
|
||||
placeholder="请输入任务名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="任务执行器" prop="actionClass">
|
||||
<el-select v-model.trim="form.actionClass" placeholder="请选择任务执行器" filterable>
|
||||
<el-option v-for="item in actionClassesOptions" :key="item" :label="item" :value="item"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="任务表达式" prop="cron">
|
||||
<el-input v-model.trim="form.cron" clearable placeholder="请输入任务表达式" />
|
||||
</el-form-item>
|
||||
<el-form-item label="排序">
|
||||
|
||||
<el-input-number style="width: 100%" v-model="form.sort" :min="0" placeholder="请输入排序" />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注">
|
||||
<el-input v-model.trim="form.remark" clearable :rows="2" type="textarea" placeholder="请输入备注" />
|
||||
</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, onMounted } from 'vue'
|
||||
import { reactive } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { getActionClasses, addTimer, updateTimer } from '@/api/system-boot/csDictData'
|
||||
import TableStore from '@/utils/tableStore' // 若不是列表页面弹框可删除
|
||||
const emit = defineEmits(['submit'])
|
||||
const dialogVisible = ref(false)
|
||||
const title = ref('')
|
||||
const tableStore = inject('tableStore') as TableStore
|
||||
const formRef = ref()
|
||||
// 注意不要和表单ref的命名冲突
|
||||
const form = reactive<anyObj>({
|
||||
cron: '',
|
||||
actionClass: '',
|
||||
timerName: '',
|
||||
remark: '',
|
||||
jobStatus: 1,
|
||||
sort: 100,
|
||||
id: '',
|
||||
|
||||
})
|
||||
const actionClassesOptions = ref([])
|
||||
const rules = {
|
||||
actionClass: [{ required: true, message: '请选择任务执行器', trigger: 'change' }],
|
||||
timerName: [{ required: true, message: '请输入任务名称', trigger: 'blur' }],
|
||||
cron: [{ required: true, message: '任务表达式', trigger: 'blur' }],
|
||||
sort: [{ required: true, message: '排序号', trigger: 'blur' }],
|
||||
date: [{ required: true, message: '日期不可为空', trigger: 'blur' }],
|
||||
}
|
||||
|
||||
const open = (text: string, data?: anyObj) => {
|
||||
title.value = text
|
||||
dialogVisible.value = true
|
||||
if (data) {
|
||||
// 表单赋值
|
||||
for (let key in form) {
|
||||
form[key] = data[key]
|
||||
}
|
||||
} else {
|
||||
// 在此处恢复默认表单
|
||||
for (let key in form) {
|
||||
key == 'sort' ? form[key] = 100 : form[key] = ''
|
||||
}
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
getActionClasses().then(res => {
|
||||
actionClassesOptions.value = res.data
|
||||
})
|
||||
})
|
||||
const submit = () => {
|
||||
formRef.value.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
if (title.value == '新增定时任务') {
|
||||
addTimer(form).then(res => {
|
||||
ElMessage.success('新增成功')
|
||||
dialogVisible.value = false
|
||||
emit('submit')
|
||||
})
|
||||
} else {
|
||||
updateTimer(form).then(res => {
|
||||
ElMessage.success('新增成功')
|
||||
dialogVisible.value = false
|
||||
emit('submit')
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
defineExpose({ open })
|
||||
</script>
|
||||
<template>
|
||||
<el-dialog draggable width="600px" v-model="dialogVisible" :title="title">
|
||||
|
||||
<el-form :inline="false" :model="form" label-width="auto" class="form-one" :rules="rules" ref="formRef">
|
||||
<el-form-item label="任务名称" prop="timerName">
|
||||
<el-input v-model.trim="form.timerName" clearable maxlength="32" show-word-limit
|
||||
placeholder="请输入任务名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="任务执行器" prop="actionClass">
|
||||
<el-select v-model.trim="form.actionClass" placeholder="请选择任务执行器" filterable>
|
||||
<el-option v-for="item in actionClassesOptions" :key="item" :label="item" :value="item"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="任务表达式" prop="cron">
|
||||
<el-input v-model.trim="form.cron" clearable placeholder="请输入任务表达式" />
|
||||
</el-form-item>
|
||||
<el-form-item label="排序">
|
||||
|
||||
<el-input-number style="width: 100%" v-model.number="form.sort" :min="0" placeholder="请输入排序" />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注">
|
||||
<el-input v-model.trim="form.remark" clearable :rows="2" type="textarea" placeholder="请输入备注" />
|
||||
</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, onMounted } from 'vue'
|
||||
import { reactive } from 'vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { getActionClasses, addTimer, updateTimer } from '@/api/system-boot/csDictData'
|
||||
import TableStore from '@/utils/tableStore' // 若不是列表页面弹框可删除
|
||||
const emit = defineEmits(['submit'])
|
||||
const dialogVisible = ref(false)
|
||||
const title = ref('')
|
||||
const tableStore = inject('tableStore') as TableStore
|
||||
const formRef = ref()
|
||||
// 注意不要和表单ref的命名冲突
|
||||
const form = reactive<anyObj>({
|
||||
cron: '',
|
||||
actionClass: '',
|
||||
timerName: '',
|
||||
remark: '',
|
||||
jobStatus: 1,
|
||||
sort: 100,
|
||||
id: '',
|
||||
|
||||
})
|
||||
const actionClassesOptions = ref([])
|
||||
const rules = {
|
||||
actionClass: [{ required: true, message: '请选择任务执行器', trigger: 'change' }],
|
||||
timerName: [{ required: true, message: '请输入任务名称', trigger: 'blur' }],
|
||||
cron: [{ required: true, message: '任务表达式', trigger: 'blur' }],
|
||||
sort: [{ required: true, message: '排序号', trigger: 'blur' }],
|
||||
date: [{ required: true, message: '日期不可为空', trigger: 'blur' }],
|
||||
}
|
||||
|
||||
const open = (text: string, data?: anyObj) => {
|
||||
title.value = text
|
||||
dialogVisible.value = true
|
||||
if (data) {
|
||||
// 表单赋值
|
||||
for (let key in form) {
|
||||
form[key] = data[key]
|
||||
}
|
||||
} else {
|
||||
// 在此处恢复默认表单
|
||||
for (let key in form) {
|
||||
key == 'sort' ? form[key] = 100 : form[key] = ''
|
||||
}
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
getActionClasses().then(res => {
|
||||
actionClassesOptions.value = res.data
|
||||
})
|
||||
})
|
||||
const submit = () => {
|
||||
formRef.value.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
if (title.value == '新增定时任务') {
|
||||
addTimer(form).then(res => {
|
||||
ElMessage.success('新增成功')
|
||||
dialogVisible.value = false
|
||||
emit('submit')
|
||||
})
|
||||
} else {
|
||||
updateTimer(form).then(res => {
|
||||
ElMessage.success('新增成功')
|
||||
dialogVisible.value = false
|
||||
emit('submit')
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
defineExpose({ open })
|
||||
</script>
|
||||
|
||||
114
vite.config.ts.timestamp-1767789689835-b2c93f7aab877.mjs
Normal file
114
vite.config.ts.timestamp-1767789689835-b2c93f7aab877.mjs
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user