修改测试问题

This commit is contained in:
guanj
2026-01-07 21:01:28 +08:00
parent 02a95c1dcd
commit 545e3836d1
24 changed files with 969 additions and 568 deletions

View File

@@ -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({

View File

@@ -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(() => {

View File

@@ -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
)
}
}

View File

@@ -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()

View File

@@ -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(() => {

View File

@@ -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
)
}
}

View File

@@ -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: () => {

View File

@@ -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 +
' 发生时刻:' +

View File

@@ -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 || '未知错误')
}

View File

@@ -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>

View File

@@ -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 })

View File

@@ -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(() => {

View File

@@ -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>

View File

@@ -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"

View File

@@ -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>

View File

@@ -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])

View File

@@ -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

View File

@@ -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) {

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>())
// 动态注册组件

View File

@@ -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>

View File

@@ -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>

File diff suppressed because one or more lines are too long