修改测试问题

This commit is contained in:
guanj
2026-01-05 11:31:50 +08:00
parent a765cdf9ee
commit 75987c0c6f
7 changed files with 1156 additions and 936 deletions

View File

@@ -1,238 +1,238 @@
<template> <template>
<div class="nav-menus" :class="configStore.layout.layoutMode"> <div class="nav-menus" :class="configStore.layout.layoutMode">
<div @click="savePng" class="nav-menu-item"> <div @click="savePng" class="nav-menu-item">
<Icon <Icon
:color="configStore.getColorVal('headerBarTabColor')" :color="configStore.getColorVal('headerBarTabColor')"
class="nav-menu-icon" class="nav-menu-icon"
name="el-icon-Camera" name="el-icon-Camera"
size="18" size="18"
/> />
</div> </div>
<div @click="onFullScreen" class="nav-menu-item" :class="state.isFullScreen ? 'hover' : ''"> <div @click="onFullScreen" class="nav-menu-item" :class="state.isFullScreen ? 'hover' : ''">
<Icon <Icon
:color="configStore.getColorVal('headerBarTabColor')" :color="configStore.getColorVal('headerBarTabColor')"
class="nav-menu-icon" class="nav-menu-icon"
v-if="state.isFullScreen" v-if="state.isFullScreen"
name="fa-solid fa-compress" name="fa-solid fa-compress"
size="18" size="18"
/> />
<Icon <Icon
:color="configStore.getColorVal('headerBarTabColor')" :color="configStore.getColorVal('headerBarTabColor')"
class="nav-menu-icon" class="nav-menu-icon"
v-else v-else
name="fa-solid fa-expand" name="fa-solid fa-expand"
size="18" size="18"
/> />
</div> </div>
<el-dropdown style="height: 100%" @command="handleCommand"> <el-dropdown style="height: 100%" @command="handleCommand">
<div class="admin-info" :class="state.currentNavMenu == 'adminInfo' ? 'hover' : ''"> <div class="admin-info" :class="state.currentNavMenu == 'adminInfo' ? 'hover' : ''">
<el-avatar :size="25" fit="fill"> <el-avatar :size="25" fit="fill">
<img src="@/assets/avatar.png" alt="" /> <img src="@/assets/avatar.png" alt="" />
</el-avatar> </el-avatar>
<div class="admin-name">{{ adminInfo.nickname }}</div> <div class="admin-name">{{ adminInfo.nickname }}</div>
</div> </div>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item command="adminInfo">个人资料</el-dropdown-item> <el-dropdown-item command="adminInfo">个人资料</el-dropdown-item>
<el-dropdown-item command="changePwd">修改密码</el-dropdown-item> <el-dropdown-item command="changePwd">修改密码</el-dropdown-item>
<el-dropdown-item command="layout">退出登录</el-dropdown-item> <el-dropdown-item command="layout">退出登录</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
<!-- <div @click="configStore.setLayout('showDrawer', true)" class="nav-menu-item"> <!-- <div @click="configStore.setLayout('showDrawer', true)" class="nav-menu-item">
<Icon <Icon
:color="configStore.getColorVal('headerBarTabColor')" :color="configStore.getColorVal('headerBarTabColor')"
class="nav-menu-icon" class="nav-menu-icon"
name="fa fa-cogs" name="fa fa-cogs"
size="18" size="18"
/> />
</div> -->" </div> -->"
<Config /> <Config />
<PopupPwd ref="popupPwd" /> <PopupPwd ref="popupPwd" />
<AdminInfo ref="popupAdminInfo" /> <AdminInfo ref="popupAdminInfo" />
<!-- <TerminalVue /> --> <!-- <TerminalVue /> -->
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { reactive, ref } from 'vue' import { reactive, ref } from 'vue'
import screenfull from 'screenfull' import screenfull from 'screenfull'
import { useConfig } from '@/stores/config' import { useConfig } from '@/stores/config'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import Config from './config.vue' import Config from './config.vue'
import { useAdminInfo } from '@/stores/adminInfo' import { useAdminInfo } from '@/stores/adminInfo'
import router from '@/router' import router from '@/router'
import { routePush } from '@/utils/router' import { routePush } from '@/utils/router'
import { fullUrl } from '@/utils/common' import { fullUrl } from '@/utils/common'
import html2canvas from 'html2canvas' import html2canvas from 'html2canvas'
import PopupPwd from './popup/password.vue' import PopupPwd from './popup/password.vue'
import AdminInfo from './popup/adminInfo.vue' import AdminInfo from './popup/adminInfo.vue'
import { useNavTabs } from '@/stores/navTabs' import { useNavTabs } from '@/stores/navTabs'
const adminInfo = useAdminInfo() const adminInfo = useAdminInfo()
const navTabs = useNavTabs() const navTabs = useNavTabs()
const configStore = useConfig() const configStore = useConfig()
const popupPwd = ref() const popupPwd = ref()
const popupAdminInfo = ref() const popupAdminInfo = ref()
const state = reactive({ const state = reactive({
isFullScreen: false, isFullScreen: false,
currentNavMenu: '', currentNavMenu: '',
showLayoutDrawer: false, showLayoutDrawer: false,
showAdminInfoPopover: false showAdminInfoPopover: false
}) })
const savePng = () => { const savePng = () => {
html2canvas(document.body, { html2canvas(document.body, {
scale: 1, scale: 1,
useCORS: true useCORS: true
}).then(function (canvas) { }).then(function (canvas) {
var link = document.createElement('a') var link = document.createElement('a')
link.href = canvas.toDataURL('image/png') link.href = canvas.toDataURL('image/png')
link.download = 'screenshot.png' link.download = 'screenshot.png'
link.click() link.click()
}) })
} }
const onFullScreen = () => { const onFullScreen = () => {
if (!screenfull.isEnabled) { if (!screenfull.isEnabled) {
ElMessage.warning('layouts.Full screen is not supported') ElMessage.warning('layouts.Full screen is not supported')
return false return false
} }
screenfull.toggle() screenfull.toggle()
screenfull.onchange(() => { screenfull.onchange(() => {
state.isFullScreen = screenfull.isFullscreen state.isFullScreen = screenfull.isFullscreen
}) })
} }
const handleCommand = (key: string) => { const handleCommand = (key: string) => {
// console.log(key) // console.log(key)
switch (key) { switch (key) {
case 'adminInfo': case 'adminInfo':
popupAdminInfo.value.open() popupAdminInfo.value.open()
break break
case 'changePwd': case 'changePwd':
popupPwd.value.open() popupPwd.value.open()
break break
case 'layout': case 'layout':
navTabs.closeTabs() navTabs.closeTabs()
window.localStorage.clear() window.localStorage.clear()
adminInfo.reset() adminInfo.reset()
router.push({ name: 'login' }) router.push({ name: 'login' })
break break
default: default:
break break
} }
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.nav-menus.Default { .nav-menus.Default {
border-radius: var(--el-border-radius-base); border-radius: var(--el-border-radius-base);
box-shadow: var(--el-box-shadow-light); box-shadow: var(--el-box-shadow-light);
} }
.nav-menus { .nav-menus {
display: flex; display: flex;
align-items: center; align-items: center;
height: 100%; height: 100%;
margin-left: auto; margin-left: auto;
background-color: v-bind('configStore.getColorVal("headerBarBackground")'); background-color: v-bind('configStore.getColorVal("headerBarBackground")');
.nav-menu-item { .nav-menu-item {
height: 100%; height: 100%;
width: 40px; width: 40px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
.nav-menu-icon { .nav-menu-icon {
box-sizing: content-box; box-sizing: content-box;
color: v-bind('configStore.getColorVal("headerBarTabColor")'); color: v-bind('configStore.getColorVal("headerBarTabColor")');
} }
&:hover { &:hover {
.icon { .icon {
animation: twinkle 0.3s ease-in-out; animation: twinkle 0.3s ease-in-out;
} }
} }
} }
.admin-info { .admin-info {
display: flex; display: flex;
height: 100%; height: 100%;
padding: 0 10px; padding: 0 10px;
align-items: center; align-items: center;
cursor: pointer; cursor: pointer;
user-select: none; user-select: none;
color: v-bind('configStore.getColorVal("headerBarTabColor")'); color: v-bind('configStore.getColorVal("headerBarTabColor")');
&:hover { &:hover {
color: v-bind('configStore.getColorVal("headerBarTabActiveColor")'); color: v-bind('configStore.getColorVal("headerBarTabActiveColor")');
} }
} }
.admin-name { .admin-name {
padding-left: 6px; padding-left: 6px;
white-space: nowrap; white-space: nowrap;
} }
.nav-menu-item:hover, .nav-menu-item:hover,
.admin-info:hover, .admin-info:hover,
.nav-menu-item.hover, .nav-menu-item.hover,
.admin-info.hover { .admin-info.hover {
background: v-bind('configStore.getColorVal("headerBarHoverBackground")'); background: v-bind('configStore.getColorVal("headerBarHoverBackground")');
.nav-menu-icon { .nav-menu-icon {
color: v-bind('configStore.getColorVal("headerBarTabActiveColor")') !important; color: v-bind('configStore.getColorVal("headerBarTabActiveColor")') !important;
} }
} }
} }
.dropdown-menu-box :deep(.el-dropdown-menu__item) { .dropdown-menu-box :deep(.el-dropdown-menu__item) {
justify-content: center; justify-content: center;
} }
.admin-info-base { .admin-info-base {
display: flex; display: flex;
justify-content: center; justify-content: center;
flex-wrap: wrap; flex-wrap: wrap;
padding-top: 10px; padding-top: 10px;
.admin-info-other { .admin-info-other {
display: block; display: block;
width: 100%; width: 100%;
text-align: center; text-align: center;
padding: 10px 0; padding: 10px 0;
.admin-info-name { .admin-info-name {
font-size: var(--el-font-size-large); font-size: var(--el-font-size-large);
} }
} }
} }
.admin-info-footer { .admin-info-footer {
padding: 10px 0; padding: 10px 0;
margin: 0 -12px -12px -12px; margin: 0 -12px -12px -12px;
display: flex; display: flex;
justify-content: space-around; justify-content: space-around;
} }
.pt2 { .pt2 {
padding-top: 2px; padding-top: 2px;
} }
@keyframes twinkle { @keyframes twinkle {
0% { 0% {
transform: scale(0); transform: scale(0);
} }
80% { 80% {
transform: scale(1.2); transform: scale(1.2);
} }
100% { 100% {
transform: scale(1); transform: scale(1);
} }
} }
</style> </style>

View File

@@ -1,136 +1,170 @@
<template> <template>
<div class="default-main"> <div class="default-main">
<TableHeader> <TableHeader>
<template #select> <template #select>
<el-form-item label="数据分类"> <el-form-item label="数据分类">
<el-select v-model.trim="tableStore.table.params.dataType" multiple filterable collapse-tags <el-select
clearable placeholder="请选择数据分类"> v-model.trim="tableStore.table.params.dataType"
<el-option v-for="item in DataTypeSelect" :key="item.id" :label="item.name" multiple
:value="item.id"></el-option> filterable
</el-select> collapse-tags
</el-form-item> clearable
<el-form-item label="数据存储"> placeholder="请选择数据分类"
<el-select v-model.trim="tableStore.table.params.classId" multiple filterable collapse-tags >
clearable placeholder="请选择数据存储"> <el-option
<el-option v-for="item in DataSelect" :key="item.id" :label="item.name" v-for="item in DataTypeSelect"
:value="item.id"></el-option> :key="item.id"
</el-select> :label="item.name"
</el-form-item> :value="item.id"
<el-form-item label="关键字筛选"> ></el-option>
<el-input maxlength="32" show-word-limit v-model.trim="tableStore.table.params.searchValue" </el-select>
placeholder="数据名称、别名、展示名称" clearable></el-input> </el-form-item>
</el-form-item> <el-form-item label="数据存储">
</template> <el-select
<template #operation> v-model.trim="tableStore.table.params.classId"
<el-button :icon="Plus" type="primary" @click="addMenu" class="ml10">新增字典</el-button> multiple
</template> filterable
</TableHeader> collapse-tags
<Table ref="tableRef" /> clearable
<PopupDictionary ref="popupDictionary"></PopupDictionary> placeholder="请选择数据存储"
</div> >
</template> <el-option
<script setup lang="ts"> v-for="item in DataSelect"
import { ref, onMounted, provide } from 'vue' :key="item.id"
import TableStore from '@/utils/tableStore' :label="item.name"
import Table from '@/components/table/index.vue' :value="item.id"
import TableHeader from '@/components/table/header/index.vue' ></el-option>
import { useDictData } from '@/stores/dictData' </el-select>
import PopupDictionary from './popupDictionary.vue' </el-form-item>
import { ElMessage } from 'element-plus' <el-form-item label="关键字筛选">
import { delCsDictData } from '@/api/system-boot/csDictData' <el-input
import { Plus } from '@element-plus/icons-vue' maxlength="32"
show-word-limit
defineOptions({ v-model.trim="tableStore.table.params.searchValue"
name: 'govern/manage/basic/dictionary' placeholder="数据名称、别名、展示名称"
}) clearable
const popupDictionary = ref() ></el-input>
const dictData = useDictData() </el-form-item>
const DataSelect = dictData.getBasicData('Data') </template>
const DataTypeSelect = dictData.getBasicData('Cs_Data_Type') <template #operation>
const ResourcesIdSelect = dictData.getBasicData('Data_Day') <el-button :icon="Plus" type="primary" @click="addMenu" class="ml10">新增字典</el-button>
const tableStore = new TableStore({ </template>
url: '/system-boot/csDictData/list', </TableHeader>
method: 'POST', <Table ref="tableRef" />
column: [ <PopupDictionary ref="popupDictionary" v-if="show" @close="show=false"></PopupDictionary>
{ </div>
title: '序号', width: 80, formatter: (row: any) => { </template>
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1 <script setup lang="ts">
} import { ref, onMounted, provide } from 'vue'
}, import TableStore from '@/utils/tableStore'
{ title: '数据分类', field: 'dataTypeName', minWidth: 170 }, import Table from '@/components/table/index.vue'
{ title: '数据名称', field: 'name', minWidth: 220 }, import TableHeader from '@/components/table/header/index.vue'
{ title: '别名', field: 'otherName', minWidth: 220 }, import { useDictData } from '@/stores/dictData'
{ title: '展示名称', field: 'showName', minWidth: 170 }, import PopupDictionary from './popupDictionary.vue'
{ title: '告警码', field: 'defaultValue', minWidth: 170 }, import { ElMessage } from 'element-plus'
{ title: '相别', field: 'phaseName', minWidth: 80 }, import { delCsDictData } from '@/api/system-boot/csDictData'
{ title: '单位', field: 'unit', minWidth: 80 }, import { Plus } from '@element-plus/icons-vue'
{ title: '基础数据类型', field: 'type', minWidth: 170 },
{ title: '数据谐波次数', field: 'harmStartEnd', minWidth: 170 }, defineOptions({
{ title: '数据统计方法', field: 'statMethod', minWidth: 170 }, name: 'govern/manage/basic/dictionary'
{ title: '数据存储', field: 'classIdName', minWidth: 120 }, })
{ title: '数据来源', field: 'resourcesIdName', minWidth: 120 }, const show = ref(false)
{ const popupDictionary = ref()
title: '操作', const dictData = useDictData()
align: 'center', const DataSelect = dictData.getBasicData('Data')
width: '180', const DataTypeSelect = dictData.getBasicData('Cs_Data_Type')
fixed: 'right', const ResourcesIdSelect = dictData.getBasicData('Data_Day')
render: 'buttons', const tableStore = new TableStore({
buttons: [ url: '/system-boot/csDictData/list',
{ method: 'POST',
name: 'edit', column: [
title: '编辑', {
type: 'primary', title: '序号',
icon: 'el-icon-EditPen', width: 80,
render: 'basicButton', formatter: (row: any) => {
click: row => { return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
popupDictionary.value.open('编辑字典', row) }
} },
}, { title: '数据分类', field: 'dataTypeName', minWidth: 170 },
{ { title: '数据名称', field: 'name', minWidth: 220 },
name: 'del', { title: '别名', field: 'otherName', minWidth: 220 },
title: '删除', { title: '展示名称', field: 'showName', minWidth: 170 },
type: 'danger', { title: '告警码', field: 'defaultValue', minWidth: 170 },
icon: 'el-icon-Delete', { title: '相别', field: 'phaseName', minWidth: 80 },
render: 'confirmButton', { title: '单位', field: 'unit', minWidth: 80 },
popconfirm: { { title: '基础数据类型', field: 'type', minWidth: 170 },
confirmButtonText: '确认', { title: '数据谐波次数', field: 'harmStartEnd', minWidth: 170 },
cancelButtonText: '取消', { title: '数据统计方法', field: 'statMethod', minWidth: 170 },
confirmButtonType: 'danger', { title: '数据存储', field: 'classIdName', minWidth: 120 },
title: '确定删除吗?' { title: '数据来源', field: 'resourcesIdName', minWidth: 120 },
}, {
click: row => { title: '操作',
delCsDictData(row.id).then(res => { align: 'center',
ElMessage.success('删除成功') width: '180',
tableStore.index() fixed: 'right',
}) render: 'buttons',
} buttons: [
} {
] name: 'edit',
} title: '编辑',
], type: 'primary',
loadCallback: () => { icon: 'el-icon-EditPen',
tableStore.table.data.forEach((item: any) => { render: 'basicButton',
item.classIdName = DataSelect.find((child: any) => child.id == item.classId)?.name || '/' click: row => {
item.resourcesIdName = ResourcesIdSelect.find((child: any) => child.id == item.resourcesId)?.name || '/' show.value = true
item.phaseName = item.phase === 'M' ? '/' : item.phase || '/' setTimeout(() => {
item.harmStartEnd = item.harmEnd ? item.harmStart + '-' + item.harmEnd : '/' popupDictionary.value.open('编辑字典', row)
for (let key in item) { }, 100)
if (typeof item[key] !== 'number') { }
item[key] = item[key] || '/' },
} {
} name: 'del',
}) title: '删除',
} type: 'danger',
}) icon: 'el-icon-Delete',
render: 'confirmButton',
tableStore.table.params.searchValue = '' popconfirm: {
tableStore.table.params.dataType = [] confirmButtonText: '确认',
tableStore.table.params.classId = [] cancelButtonText: '取消',
provide('tableStore', tableStore) confirmButtonType: 'danger',
onMounted(() => { title: '确定删除吗?'
tableStore.index() },
}) click: row => {
const addMenu = () => { delCsDictData(row.id).then(res => {
popupDictionary.value.open('新增字典') ElMessage.success('删除成功')
} tableStore.index()
</script> })
}
}
]
}
],
loadCallback: () => {
tableStore.table.data.forEach((item: any) => {
item.classIdName = DataSelect.find((child: any) => child.id == item.classId)?.name || '/'
item.resourcesIdName = ResourcesIdSelect.find((child: any) => child.id == item.resourcesId)?.name || '/'
item.phaseName = item.phase === 'M' ? '/' : item.phase || '/'
item.harmStartEnd = item.harmEnd ? item.harmStart + '-' + item.harmEnd : '/'
for (let key in item) {
if (typeof item[key] !== 'number') {
item[key] = item[key] || '/'
}
}
})
}
})
tableStore.table.params.searchValue = ''
tableStore.table.params.dataType = []
tableStore.table.params.classId = []
provide('tableStore', tableStore)
onMounted(() => {
tableStore.index()
})
const addMenu = () => {
show.value = true
setTimeout(() => {
popupDictionary.value.open('新增字典')
}, 100)
}
</script>

View File

@@ -1,295 +1,412 @@
<template> <template>
<el-dialog class="cn-operate-dialog" v-model.trim="dialogVisible" :title="title"> <el-dialog class="cn-operate-dialog" v-model.trim="dialogVisible" :title="title" @close=" emit('close')">
<el-scrollbar> <el-scrollbar>
<div style="padding-left: 50px"> <div style="padding-left: 50px">
<el-divider content-position="center">基础数据</el-divider> <el-divider content-position="center">基础数据</el-divider>
</div> </div>
<el-form :model="form" label-width="140px" ref="formRef" class="form-two" :rules="rules"> <el-form :model="form" label-width="140px" ref="formRef" class="form-two" :rules="rules">
<el-form-item label="数据分类:" prop="dataType"> <el-form-item label="数据分类:" prop="dataType">
<el-select v-model.trim="form.dataType" filterable clearable placeholder="请选择数据分类"> <el-select v-model.trim="form.dataType" filterable clearable placeholder="请选择数据分类">
<el-option v-for="item in DataTypeSelect" :key="item.id" :label="item.name" <el-option
:value="item.id"></el-option> v-for="item in DataTypeSelect"
</el-select> :key="item.id"
</el-form-item> :label="item.name"
<el-form-item label="数据名称:" prop="name"> :value="item.id"
<el-input maxlength="32" show-word-limit v-model.trim="form.name" autocomplete="off" ></el-option>
placeholder="请输入数据名称"></el-input> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="别名:" prop="otherName"> <el-form-item label="数据名称:" prop="name">
<el-input maxlength="32" show-word-limit v-model.trim="form.otherName" autocomplete="off" <el-input
placeholder="请输入别名"></el-input> maxlength="32"
</el-form-item> show-word-limit
<el-form-item label="展示名称:" prop="showName"> v-model.trim="form.name"
<el-input maxlength="32" show-word-limit v-model.trim="form.showName" autocomplete="off" autocomplete="off"
placeholder="请输入展示名称"></el-input> placeholder="请输入数据名称"
</el-form-item> ></el-input>
<el-form-item label="相别:" prop="phase"> </el-form-item>
<el-select v-model.trim="form.phase" filterable clearable placeholder="请选择相别"> <el-form-item label="别名:" prop="otherName">
<el-option v-for="item in phaseSelect" :key="item.id" :label="item.name" <el-input
:value="item.id"></el-option> maxlength="32"
</el-select> show-word-limit
</el-form-item> v-model.trim="form.otherName"
<el-form-item label="单位:" prop="unit"> autocomplete="off"
<el-input maxlength="32" show-word-limit v-model.trim="form.unit" autocomplete="off" placeholder="请输入别名"
placeholder="请输入单位"></el-input> ></el-input>
</el-form-item> </el-form-item>
<el-form-item label="基础数据类型:" prop="type"> <el-form-item label="展示名称:" prop="showName">
<el-input maxlength="32" show-word-limit v-model.trim="form.type" autocomplete="off" <el-input
placeholder="请输入基础数据类型"></el-input> maxlength="32"
</el-form-item> show-word-limit
<el-form-item label="开始结束次数:" prop="harmStart"> v-model.trim="form.showName"
<el-slider v-model.trim="form.harm" range show-stops :max="50" style="width: 95%" /> autocomplete="off"
</el-form-item> placeholder="请输入展示名称"
<el-form-item label="统计方法:" prop="statMethod"> ></el-input>
<el-select v-model.trim="form.statMethod" multiple collapse-tags collapse-tags-tooltip filterable </el-form-item>
clearable placeholder="请选择统计方法"> <el-form-item label="相别:" prop="phase">
<el-option v-for="item in StatMethodSelect" :key="item.id" :label="item.name" <el-select v-model.trim="form.phase" filterable clearable placeholder="请选择相别">
:value="item.id"></el-option> <el-option
</el-select> v-for="item in phaseSelect"
</el-form-item> :key="item.id"
<el-form-item label="数据存储:" prop="classId"> :label="item.name"
<el-select v-model.trim="form.classId" filterable clearable placeholder="请选择数据存储"> :value="item.id"
<el-option v-for="item in DataSelect" :key="item.code" :label="item.name" ></el-option>
:value="item.id"></el-option> </el-select>
</el-select> </el-form-item>
</el-form-item> <el-form-item label="单位:" prop="unit">
<el-form-item label="报表数据来源:" prop="resourcesId"> <el-input
<el-select v-model.trim="form.resourcesId" filterable clearable placeholder="请选择报表数据来源"> maxlength="32"
<el-option v-for="item in ResourcesIdSelect" :key="item.code" :label="item.name" show-word-limit
:value="item.id"></el-option> v-model.trim="form.unit"
</el-select> autocomplete="off"
</el-form-item> placeholder="请输入单位"
<el-form-item label="序号:" prop="sort"> ></el-input>
<el-input maxlength="32" show-word-limit type="number" v-model.trim="form.sort" autocomplete="off" </el-form-item>
placeholder="请输入序号"></el-input> <el-form-item label="基础数据类型:" prop="type">
</el-form-item> <el-input
<el-form-item label="限值名称:" prop="limitName"> maxlength="32"
<el-input maxlength="32" show-word-limit type="text" v-model.trim="form.limitName" show-word-limit
autocomplete="off" placeholder="请输入限值名称"></el-input> v-model.trim="form.type"
</el-form-item> autocomplete="off"
<el-form-item label="限值表名:" prop="limitTable"> placeholder="请输入基础数据类型"
<el-input maxlength="32" show-word-limit type="text" v-model.trim="form.limitTable" ></el-input>
autocomplete="off" placeholder="请输入限值表名"></el-input> </el-form-item>
</el-form-item> <el-form-item label="开始结束次数:" prop="harmStart">
<el-form-item label="超标判断方式:" prop="formula"> <el-slider v-model.trim="form.harm" range show-stops :max="50" style="width: 95%" />
<el-select v-model.trim="form.formula" filterable clearable placeholder="请选择超标判断方式"> </el-form-item>
<el-option v-for="item in FormulaSelect" :key="item.code" :label="item.name" <el-form-item label="统计方法:" prop="statMethod">
:value="item.id"></el-option> <el-select
</el-select> v-model.trim="form.statMethod"
</el-form-item> multiple
</el-form> collapse-tags
<div style="padding-left: 50px"> collapse-tags-tooltip
<el-divider content-position="center">拓展数据</el-divider> filterable
</div> clearable
<el-form class="form-two" :model="form" label-width="140px" ref="formRef2" :rules="rules"> placeholder="请选择统计方法"
<el-form-item label="告警码(缺省值):" > >
<el-input maxlength="32" show-word-limit v-model.trim="form.defaultValue" autocomplete="off" <el-option
placeholder="请输入告警码(缺省值)"></el-input> v-for="item in StatMethodSelect"
</el-form-item> :key="item.id"
<el-form-item label="事件类别:" > :label="item.name"
<el-input maxlength="32" show-word-limit v-model.trim="form.eventType" autocomplete="off" :value="item.id"
placeholder="请输入事件类别"></el-input> ></el-option>
</el-form-item> </el-select>
</el-form-item>
<el-form-item label="设置最大值:" > <el-form-item label="数据存储:" prop="classId">
<el-input maxlength="32" show-word-limit type="number" v-model.trim="form.maxNum" autocomplete="off" <el-select v-model.trim="form.classId" filterable clearable placeholder="请选择数据存储">
placeholder="请输入设置最大值"></el-input> <el-option
</el-form-item> v-for="item in DataSelect"
<el-form-item label="设置最小值:" > :key="item.code"
<el-input maxlength="32" show-word-limit type="number" v-model.trim="form.minNum" autocomplete="off" :label="item.name"
placeholder="请输入设置最小值"></el-input> :value="item.id"
</el-form-item> ></el-option>
<el-form-item label="枚举序列:"> </el-select>
<el-input maxlength="32" show-word-limit v-model.trim="form.setValue" autocomplete="off" </el-form-item>
placeholder="请输入枚举序列"></el-input> <el-form-item label="报表数据来源:" prop="resourcesId">
</el-form-item> <el-select v-model.trim="form.resourcesId" filterable clearable placeholder="请选择报表数据来源">
<el-form-item label="字符串长度上限:" > <el-option
<el-input maxlength="32" show-word-limit type="number" v-model.trim="form.strlen" autocomplete="off" v-for="item in ResourcesIdSelect"
placeholder="请输入字符串长度上限"></el-input> :key="item.code"
</el-form-item> :label="item.name"
<el-form-item label="上送规则:" > :value="item.id"
<el-input maxlength="32" show-word-limit v-model.trim="form.tranRule" autocomplete="off" ></el-option>
placeholder="请输入上送规则"></el-input> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="是否可远程控制:" > <el-form-item label="序号:" prop="sort">
<el-radio v-model.trim="form.ctlSts" :label="1"></el-radio> <el-input
<el-radio v-model.trim="form.ctlSts" :label="0"></el-radio> maxlength="32"
</el-form-item> show-word-limit
<el-form-item label="是否需遥控校验:" > type="number"
<el-radio v-model.trim="form.curSts" :label="1"></el-radio> v-model.trim="form.sort"
<el-radio v-model.trim="form.curSts" :label="0"></el-radio> autocomplete="off"
</el-form-item> placeholder="请输入序号"
<el-form-item label="是否存储:" > ></el-input>
<el-radio v-model.trim="form.storeFlag" :label="1"></el-radio> </el-form-item>
<el-radio v-model.trim="form.storeFlag" :label="0"></el-radio> <el-form-item label="限值名称:" prop="limitName">
</el-form-item> <el-input
<el-form-item label="是否加密:" > maxlength="32"
<el-radio v-model.trim="form.storeFlag" :label="1"></el-radio> show-word-limit
<el-radio v-model.trim="form.storeFlag" :label="0"></el-radio> type="text"
</el-form-item> v-model.trim="form.limitName"
<el-form-item label="数据是否上送:" > autocomplete="off"
<el-radio v-model.trim="form.tranFlag" :label="1"></el-radio> placeholder="请输入限值名称"
<el-radio v-model.trim="form.tranFlag" :label="0"></el-radio> ></el-input>
</el-form-item> </el-form-item>
</el-form> <el-form-item label="限值表名:" prop="limitTable">
</el-scrollbar> <el-input
<template #footer> maxlength="32"
<span class="dialog-footer"> show-word-limit
<el-button @click="dialogVisible = false">取消</el-button> type="text"
<el-button type="primary" @click="submit">确认</el-button> v-model.trim="form.limitTable"
</span> autocomplete="off"
</template> placeholder="请输入限值表名"
</el-dialog> ></el-input>
</template> </el-form-item>
<script lang="ts" setup> <el-form-item label="超标判断方式:" prop="formula">
import { ref, inject } from 'vue' <el-select v-model.trim="form.formula" filterable clearable placeholder="请选择超标判断方式">
import { reactive } from 'vue' <el-option
import TableStore from '@/utils/tableStore' v-for="item in FormulaSelect"
import { ElMessage } from 'element-plus' :key="item.code"
import { useDictData } from '@/stores/dictData' :label="item.name"
import { addCsDictData, updateCsDictData } from '@/api/system-boot/csDictData' :value="item.id"
></el-option>
const formRef = ref() </el-select>
const formRef2 = ref() </el-form-item>
const dictData = useDictData() </el-form>
const DataSelect = dictData.getBasicData('Data') <div style="padding-left: 50px">
const DataTypeSelect = dictData.getBasicData('Cs_Data_Type') <el-divider content-position="center">拓展数据</el-divider>
const ResourcesIdSelect = dictData.getBasicData('Data_Day') </div>
const FormulaSelect = dictData.getBasicData('Limit_Value_Judgment') <el-form class="form-two" :model="form" label-width="140px" ref="formRef2">
const phaseSelect = [ <el-form-item label="告警码(缺省值):">
{ <el-input
name: 'A相', maxlength="32"
id: 'A' show-word-limit
}, v-model.trim="form.defaultValue"
{ autocomplete="off"
name: 'B相', placeholder="请输入告警码(缺省值)"
id: 'B' ></el-input>
}, </el-form-item>
{ <el-form-item label="事件类别:">
name: 'C相', <el-input
id: 'C' maxlength="32"
}, show-word-limit
{ v-model.trim="form.eventType"
name: 'T相', autocomplete="off"
id: 'T' placeholder="请输入事件类别"
} ></el-input>
] </el-form-item>
const StatMethodSelect = [
{ <el-form-item label="设置最大值:">
name: '平均值', <el-input
id: 'avg' maxlength="32"
}, show-word-limit
{ type="number"
name: '最大值', v-model.trim="form.maxNum"
id: 'max' autocomplete="off"
}, placeholder="请输入设置最大值"
{ ></el-input>
name: '最小值', </el-form-item>
id: 'min' <el-form-item label="设置最小值:">
}, <el-input
{ maxlength="32"
name: 'CP95值', show-word-limit
id: 'cp95' type="number"
} v-model.trim="form.minNum"
] autocomplete="off"
const tableStore = inject('tableStore') as TableStore placeholder="请输入设置最小值"
const form = reactive<any>({ ></el-input>
id: null, </el-form-item>
classId: null, <el-form-item label="枚举序列:">
ctlSts: null, <el-input
curSts: null, maxlength="32"
dataType: null, show-word-limit
defaultValue: null, v-model.trim="form.setValue"
eventType: null, autocomplete="off"
harm: [0, 50], placeholder="请输入枚举序列"
harmEnd: null, ></el-input>
harmStart: null, </el-form-item>
maxNum: null, <el-form-item label="字符串长度上限:">
minNum: null, <el-input
name: null, maxlength="32"
otherName: null, show-word-limit
phase: null, type="number"
resourcesId: null, v-model.trim="form.strlen"
setValue: null, autocomplete="off"
showName: null, placeholder="请输入字符串长度上限"
sort: null, ></el-input>
statMethod: null, </el-form-item>
storeFlag: null, <el-form-item label="上送规则:">
strlen: null, <el-input
systemType: null, maxlength="32"
tranFlag: null, show-word-limit
tranRule: null, v-model.trim="form.tranRule"
type: null, autocomplete="off"
unit: null, placeholder="请输入上送规则"
formula: null, ></el-input>
limitName: null, </el-form-item>
limitTable: 'pq_overlimit' <el-form-item label="是否可远程控制:">
}) <el-radio v-model.trim="form.ctlSts" :label="1"></el-radio>
const rules = { <el-radio v-model.trim="form.ctlSts" :label="0"></el-radio>
dataType: [ </el-form-item>
{ required: true, message: '请输入数据分类', trigger: 'blur' }, <el-form-item label="是否需遥控校验:">
{ min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' } <el-radio v-model.trim="form.curSts" :label="1"></el-radio>
], <el-radio v-model.trim="form.curSts" :label="0"></el-radio>
name: [{ required: true, message: '请输入数据名称', trigger: 'blur' }], </el-form-item>
otherName: [{ required: true, message: '请输入别名', trigger: 'blur' }], <el-form-item label="是否存储:">
showName: [{ required: true, message: '请输入展示名称', trigger: 'blur' }], <el-radio v-model.trim="form.storeFlag" :label="1"></el-radio>
phase: [{ type: 'array', required: true, message: '请选择相别', trigger: 'blur' }], <el-radio v-model.trim="form.storeFlag" :label="0"></el-radio>
unit: [{ required: true, message: '请输入单位', trigger: 'blur' }], </el-form-item>
type: [{ required: true, message: '请输入基础数据类型', trigger: 'blur' }], <el-form-item label="是否加密:">
harmStart: [{ required: true, message: '请填写开始结束次数', trigger: 'blur' }], <el-radio v-model.trim="form.storeFlag" :label="1"></el-radio>
statMethod: [{ required: true, message: '请选择统计方法', trigger: 'blur' }], <el-radio v-model.trim="form.storeFlag" :label="0"></el-radio>
classId: [{ required: true, message: '请选择数据存储', trigger: 'blur' }], </el-form-item>
resourcesId: [{ required: true, message: '请选择报表数据来源', trigger: 'blur' }], <el-form-item label="数据是否上送:">
sort: [{ required: true, message: '请填写序号', trigger: 'blur' }], <el-radio v-model.trim="form.tranFlag" :label="1"></el-radio>
defaultValue: [ <el-radio v-model.trim="form.tranFlag" :label="0"></el-radio>
{ required: true, message: '请输入参数缺省值', trigger: 'blur' }, </el-form-item>
{ min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' } </el-form>
], </el-scrollbar>
eventType: [{ required: true, message: '请输入事件类别', trigger: 'blur' }], <template #footer>
maxNum: [{ type: 'date', required: true, message: '请设置最大值', trigger: 'blur' }], <span class="dialog-footer">
minNum: [{ type: 'date', required: true, message: '请设置最小值', trigger: 'blur' }], <el-button @click="dialogVisible = false; emit('close')">取消</el-button>
setValue: [{ required: true, message: '请输入枚举序列', trigger: 'blur' }], <el-button type="primary" @click="submit">确认</el-button>
strlen: [{ required: true, message: '请输入字符串长度上限', trigger: 'blur' }], </span>
tranRule: [{ required: true, message: '请填写上送规则', trigger: 'blur' }], </template>
ctlSts: [{ required: true, message: '请选择是否可远程控制', trigger: 'blur' }], </el-dialog>
storeFlag: [{ required: true, message: '请选择是否需遥控校验', trigger: 'blur' }], </template>
tranFlag: [{ required: true, message: '请选择是否存储||是否加密', trigger: 'blur' }] <script lang="ts" setup>
} import { ref, inject } from 'vue'
const dialogVisible = ref(false) import { reactive } from 'vue'
const title = ref('') import TableStore from '@/utils/tableStore'
const open = (text: string, data?: anyObj) => { import { ElMessage } from 'element-plus'
title.value = text import { useDictData } from '@/stores/dictData'
dialogVisible.value = true import { addCsDictData, updateCsDictData } from '@/api/system-boot/csDictData'
if (data) { const emit = defineEmits(['close'])
for (let key in form) { const formRef = ref()
if (key == 'statMethod') { const formRef2 = ref()
form[key] = data[key].split(',') const dictData = useDictData()
} else { const DataSelect = dictData.getBasicData('Data')
form[key] = data[key] === '/' ? null : data[key] const DataTypeSelect = dictData.getBasicData('Cs_Data_Type')
} const ResourcesIdSelect = dictData.getBasicData('Data_Day')
} const FormulaSelect = dictData.getBasicData('Limit_Value_Judgment')
form.harm = [form.harmStart, form.harmEnd] const phaseSelect = [
} else { {
for (let key in form) { name: 'A相',
form[key] = null id: 'A'
} },
form.pq_overlimit = 'pq_overlimit' {
form.harm = [0, 50] name: 'B相',
} id: 'B'
// console.log(form) },
} {
const submit = async () => { name: 'C相',
form.harmStart = form.harm[0] id: 'C'
form.harmEnd = form.harm[1] },
if (form.id) { {
await updateCsDictData(form) name: 'T相',
} else { id: 'T'
await addCsDictData(form) }
} ]
ElMessage.success('保存成功') const StatMethodSelect = [
tableStore.index() {
dialogVisible.value = false name: '平均值',
} id: 'avg'
},
defineExpose({ open }) {
</script> name: '最大值',
id: 'max'
},
{
name: '最小值',
id: 'min'
},
{
name: 'CP95值',
id: 'cp95'
}
]
const tableStore = inject('tableStore') as TableStore
const form = reactive<any>({
id: null,
classId: null,
ctlSts: null,
curSts: null,
dataType: null,
defaultValue: null,
eventType: null,
harm: [0, 50],
harmEnd: null,
harmStart: null,
maxNum: null,
minNum: null,
name: null,
otherName: null,
phase: null,
resourcesId: null,
setValue: null,
showName: null,
sort: null,
statMethod: null,
storeFlag: null,
strlen: null,
systemType: null,
tranFlag: null,
tranRule: null,
type: null,
unit: null,
formula: null,
limitName: null,
limitTable: 'pq_overlimit'
})
const rules = {
dataType: [
{ required: true, message: '请输入数据分类', trigger: 'blur' },
{ min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
],
name: [{ required: true, message: '请输入数据名称', trigger: 'blur' }],
otherName: [{ required: true, message: '请输入别名', trigger: 'blur' }],
showName: [{ required: true, message: '请输入展示名称', trigger: 'blur' }],
phase: [{ type: 'array', required: true, message: '请选择相别', trigger: 'blur' }],
unit: [{ required: true, message: '请输入单位', trigger: 'blur' }],
type: [{ required: true, message: '请输入基础数据类型', trigger: 'blur' }],
harmStart: [{ required: true, message: '请填写开始结束次数', trigger: 'blur' }],
statMethod: [{ required: true, message: '请选择统计方法', trigger: 'blur' }],
classId: [{ required: true, message: '请选择数据存储', trigger: 'blur' }],
resourcesId: [{ required: true, message: '请选择报表数据来源', trigger: 'blur' }],
sort: [{ required: true, message: '请填写序号', trigger: 'blur' }],
defaultValue: [
{ required: true, message: '请输入参数缺省值', trigger: 'blur' },
{ min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'blur' }
],
eventType: [{ required: true, message: '请输入事件类别', trigger: 'blur' }],
maxNum: [{ type: 'date', required: true, message: '请设置最大值', trigger: 'blur' }],
minNum: [{ type: 'date', required: true, message: '请设置最小值', trigger: 'blur' }],
setValue: [{ required: true, message: '请输入枚举序列', trigger: 'blur' }],
strlen: [{ required: true, message: '请输入字符串长度上限', trigger: 'blur' }],
tranRule: [{ required: true, message: '请填写上送规则', trigger: 'blur' }],
ctlSts: [{ required: true, message: '请选择是否可远程控制', trigger: 'blur' }],
storeFlag: [{ required: true, message: '请选择是否需遥控校验', trigger: 'blur' }],
tranFlag: [{ required: true, message: '请选择是否存储||是否加密', trigger: 'blur' }]
}
const dialogVisible = ref(false)
const title = ref('')
const open = (text: string, data?: anyObj) => {
title.value = text
dialogVisible.value = true
if (data) {
for (let key in form) {
if (key == 'statMethod') {
form[key] = data[key].split(',')
} else {
form[key] = data[key] === '/' ? null : data[key]
}
}
form.harm = [form.harmStart, form.harmEnd]
} else {
for (let key in form) {
form[key] = null
}
form.pq_overlimit = 'pq_overlimit'
form.harm = [0, 50]
}
// console.log(form)
}
const submit = async () => {
formRef.value.validate(async (valid: any) => {
if (valid) {
form.harmStart = form.harm[0]
form.harmEnd = form.harm[1]
if (form.id) {
await updateCsDictData(form)
} else {
await addCsDictData(form)
}
ElMessage.success('保存成功')
tableStore.index()
dialogVisible.value = false
emit('close')
}
})
}
defineExpose({ open })
</script>

View File

@@ -1,232 +1,294 @@
<template> <template>
<el-dialog class="cn-operate-dialog" width="800px" v-model.trim="dialogVisible" :title="title"> <el-dialog
class="cn-operate-dialog"
<el-form class="form-two" :model="form" label-width="100px" ref="formRef" :rules="rules"> width="800px"
<el-form-item label="装置类型:" prop="type"> v-model.trim="dialogVisible"
<!-- <el-select v-model.trim="form.type" filterable placeholder="请选择" @change="typeChange"> :title="title"
<el-option v-for="item in TypeOptions" :key="item.id" :label="item.name" @close="emit('closePopup')"
:value="item.id"></el-option> >
</el-select> --> <el-form class="form-two" :model="form" label-width="100px" ref="formRef" :rules="rules">
<el-select v-model.trim="form.type" placeholder="请选择装置类型" @change="formDevTypeChange" clearable> <el-form-item label="装置类型:" prop="type">
<el-option v-for="item in devTypeOptions" :key="item.value" :label="item.label" <!-- <el-select v-model.trim="form.type" filterable placeholder="请选择" @change="typeChange">
:value="item.value"></el-option> <el-option v-for="item in TypeOptions" :key="item.id" :label="item.name"
</el-select> :value="item.id"></el-option>
</el-form-item> </el-select> -->
<el-form-item label="装置型号:" prop="devType"> <el-select v-model.trim="form.type" placeholder="请选择装置类型" @change="formDevTypeChange" clearable>
<!-- <el-select v-model.trim="form.devType" placeholder="请选择" filterable @change="devTypeChange"> <el-option
<el-option v-for="item in DevTypeOptions" :key="item.id" :label="item.name" v-for="item in devTypeOptions"
:value="item.id"></el-option> :key="item.value"
</el-select> --> :label="item.label"
<el-select v-model.trim="form.devType" filterable placeholder="请选择装置型号" clearable @change="devTypeChange"> :value="item.value"
<el-option v-for="item in formDevModelOptionsFilter" :key="item.value" :label="item.label" ></el-option>
:value="item.value"></el-option> </el-select>
</el-select> </el-form-item>
</el-form-item> <el-form-item label="装置型号:" prop="devType">
<el-form-item label="版本号:" prop="versionNo"> <!-- <el-select v-model.trim="form.devType" placeholder="请选择" filterable @change="devTypeChange">
<el-input maxlength="32" show-word-limit v-model.trim="form.versionNo" autocomplete="off" <el-option v-for="item in DevTypeOptions" :key="item.id" :label="item.name"
placeholder="请输入版本号"></el-input> :value="item.id"></el-option>
</el-form-item> </el-select> -->
<el-form-item label="版本类型:" prop="versionType"> <el-select
<el-input maxlength="32" show-word-limit v-model.trim="form.versionType" autocomplete="off" v-model.trim="form.devType"
placeholder="填写特殊类型(不填默认通用类型)"></el-input> filterable
</el-form-item> placeholder="请选择装置型号"
<el-form-item label="版本协议:" prop="versionAgreement"> clearable
<el-input maxlength="32" show-word-limit v-model.trim="form.versionAgreement" autocomplete="off" @change="devTypeChange"
placeholder="请输入版本协议"></el-input> >
</el-form-item> <el-option
<el-form-item label="版本日期:" prop="versionDate"> v-for="item in formDevModelOptionsFilter"
<el-date-picker v-model.trim="form.versionDate" type="date" value-format="YYYY-MM-DD" :key="item.value"
placeholder="选择日期时间" style="width: 100%"></el-date-picker> :label="item.label"
</el-form-item> :value="item.value"
></el-option>
<el-form-item label="CRC校验:" prop="crcInfo"> </el-select>
<el-input maxlength="32" show-word-limit v-model.trim="form.crcInfo" autocomplete="off" </el-form-item>
placeholder="请输入CRC校验"></el-input> <el-form-item label="版本号:" prop="versionNo">
</el-form-item> <el-input
maxlength="32"
</el-form> show-word-limit
<el-form :model="form" label-width="100px" class="mt10"> v-model.trim="form.versionNo"
<el-form-item label="描述:" prop="description"> autocomplete="off"
<el-input maxlength="300":autosize="{ minRows: 2, maxRows: 4 }" type="textarea" show-word-limit v-model.trim="form.description" autocomplete="off" placeholder="请输入版本号"
placeholder="请输入描述"></el-input> ></el-input>
</el-form-item> </el-form-item>
<el-form-item label="升级文件:" prop="file"> <el-form-item label="版本类型:" prop="versionType">
<el-upload :limit="1" :auto-upload="false" :on-change="fileChange" :on-exceed="fileExceed" :on-remove="fileRemove" <el-input
:file-list="fileList"> maxlength="32"
<el-button type="primary">点击上传</el-button> show-word-limit
</el-upload> v-model.trim="form.versionType"
</el-form-item> autocomplete="off"
</el-form> placeholder="填写特殊类型(不填默认通用类型)"
></el-input>
<template #footer> </el-form-item>
<span class="dialog-footer"> <el-form-item label="版本协议:" prop="versionAgreement">
<el-button @click="dialogVisible = false">取消</el-button> <el-input
<el-button type="primary" @click="submit">确认</el-button> maxlength="32"
</span> show-word-limit
</template> v-model.trim="form.versionAgreement"
</el-dialog> autocomplete="off"
</template> placeholder="请输入版本协议"
<script lang="ts" setup> ></el-input>
import { ref, inject,computed } from 'vue' </el-form-item>
import { reactive } from 'vue' <el-form-item label="版本日期:" prop="versionDate">
import TableStore from '@/utils/tableStore' <el-date-picker
import { ElMessage } from 'element-plus' v-model.trim="form.versionDate"
import { queryByCode, queryByid, queryCsDictTree } from '@/api/system-boot/dictTree' type="date"
import { addEdData, auditEdData } from '@/api/cs-device-boot/edData' value-format="YYYY-MM-DD"
placeholder="选择日期时间"
const TypeOptions = ref() style="width: 100%"
const DevTypeAllOptions = ref() ></el-date-picker>
const DevTypeOptions = ref() </el-form-item>
const devTypeOptions: any = ref([])
<el-form-item label="CRC校验:" prop="crcInfo">
const devModelOptions: any = ref([]) <el-input
const fileList:any = ref([]) maxlength="32"
const tableStore = inject('tableStore') as TableStore show-word-limit
const formRef = ref() v-model.trim="form.crcInfo"
const form = reactive<any>({ autocomplete="off"
devType: null, placeholder="请输入CRC校验"
devTypeName: null, ></el-input>
versionAgreement: null, </el-form-item>
versionNo: null, </el-form>
versionType: null, <el-form :model="form" label-width="100px" class="mt10">
crcInfo: null, <el-form-item label="描述:" prop="description">
description: null, <el-input
versionDate: null, maxlength="300"
type: null, :autosize="{ minRows: 2, maxRows: 4 }"
id: null, type="textarea"
file: [] show-word-limit
}) v-model.trim="form.description"
const rules = { autocomplete="off"
type: [{ required: true, message: '装置类型不能为空', trigger: 'blur' }], placeholder="请输入描述"
devType: [{ required: true, message: '装置型号不能为空', trigger: 'blur' }], ></el-input>
versionNo: [{ required: true, message: '版本号不能为空', trigger: 'blur' }], </el-form-item>
versionType: [{ required: true, message: '版本类型不能为空', trigger: 'blur' }], <el-form-item label="升级文件:" prop="file">
versionAgreement: [{ required: true, message: '版本协议不能为空', trigger: 'blur' }], <el-upload
versionDate: [{ required: true, message: '版本日期不能为空', trigger: 'blur' }], :limit="1"
description: [{ required: true, message: '描述不能为空', trigger: 'blur' }], :auto-upload="false"
crcInfo: [{ required: true, message: 'CRC校验不能为空', trigger: 'blur' }], :on-change="fileChange"
file: [{ required: true, message: '升级文件不能为空', trigger: 'blur' }] :on-exceed="fileExceed"
} :on-remove="fileRemove"
const typeChange = () => { :file-list="fileList"
// console.log(form.type) >
form.devType = null <el-button type="primary">点击上传</el-button>
form.devTypeName = null </el-upload>
queryCsDictTree(form.type).then(res => { </el-form-item>
DevTypeOptions.value = res.data </el-form>
})
} <template #footer>
const devTypeChange = (e: any) => { <span class="dialog-footer">
// console.log(e) <el-button @click="dialogVisible = false">取消</el-button>
form.devTypeName = formDevModelOptionsFilter.value.filter((item: any) => item.value == e)[0].label <el-button type="primary" @click="submit">确认</el-button>
} </span>
queryByCode('Device_Type').then(res => { </template>
const id = res.data.id </el-dialog>
queryCsDictTree(id).then(res => { </template>
devTypeOptions.value = res.data.map((item: any) => { <script lang="ts" setup>
return { import { ref, inject, computed } from 'vue'
value: item.id, import { reactive } from 'vue'
label: item.name, import TableStore from '@/utils/tableStore'
...item import { ElMessage } from 'element-plus'
} import { queryByCode, queryByid, queryCsDictTree } from '@/api/system-boot/dictTree'
}) import { addEdData, auditEdData } from '@/api/cs-device-boot/edData'
}) const emit = defineEmits(['closePopup'])
queryByid(id).then(res => { const TypeOptions = ref()
res.data.map((item: any, index: any) => { const DevTypeAllOptions = ref()
if (item.pid == id) { const DevTypeOptions = ref()
res.data.splice(index, 1) const devTypeOptions: any = ref([])
}
}) const devModelOptions: any = ref([])
devModelOptions.value = res.data.map((item: any) => { const fileList: any = ref([])
return { const tableStore = inject('tableStore') as TableStore
value: item.id, const formRef = ref()
label: item.name, const form = reactive<any>({
...item devType: null,
} devTypeName: null,
}) versionAgreement: null,
}) versionNo: null,
// tableStore.index() versionType: null,
}) crcInfo: null,
const formDevModelOptionsFilter = computed(() => { description: null,
return devModelOptions.value.filter((item: any) => { versionDate: null,
if (form.type) { type: null,
return item.pid == form.type id: null,
} else { file: []
return true })
} const rules = {
}) type: [{ required: true, message: '装置类型不能为空', trigger: 'change' }],
}) devType: [{ required: true, message: '装置型号不能为空', trigger: 'change' }],
const fileChange = (e: any) => { versionNo: [{ required: true, message: '版本号不能为空', trigger: 'blur' }],
versionType: [{ required: true, message: '版本类型不能为空', trigger: 'blur' }],
form.file = e.raw versionAgreement: [{ required: true, message: '版本协议不能为空', trigger: 'blur' }],
} versionDate: [{ required: true, message: '版本日期不能为空', trigger: 'blur' }],
const fileExceed = (e: any) => { description: [{ required: true, message: '描述不能为空', trigger: 'blur' }],
crcInfo: [{ required: true, message: 'CRC校验不能为空', trigger: 'blur' }],
ElMessage.error('只能上传一个文件') file: [{ required: true, message: '升级文件不能为空', trigger: 'blur' }]
} }
const fileRemove = (e: any) => { const typeChange = () => {
form.file = null // console.log(form.type)
} form.devType = null
const formDevTypeChange = (e: any) => { form.devTypeName = null
if (!e) { queryCsDictTree(form.type).then(res => {
return DevTypeOptions.value = res.data
} })
// form.devModel = '' }
} const devTypeChange = (e: any) => {
const dialogVisible = ref(false) // console.log(e)
const title = ref('新增版本') form.devTypeName = formDevModelOptionsFilter.value.filter((item: any) => item.value == e)[0].label
const open = (text: string, data?: anyObj) => { }
title.value = text queryByCode('Device_Type').then(res => {
dialogVisible.value = true const id = res.data.id
if (data) { queryCsDictTree(id).then(res => {
for (let key in form) { devTypeOptions.value = res.data.map((item: any) => {
form[key] = data[key] return {
} value: item.id,
fileList.value = [ label: item.name,
{ ...item
name: data.filePath, }
url: data.filePath })
} })
] queryByid(id).then(res => {
} else { res.data.map((item: any, index: any) => {
for (let key in form) { if (item.pid == id) {
form[key] = null res.data.splice(index, 1)
} }
} })
queryByCode('Direct_Connected_Device').then(res => { devModelOptions.value = res.data.map((item: any) => {
queryCsDictTree(res.data.id).then(res => { return {
TypeOptions.value = res.data value: item.id,
}) label: item.name,
queryByid(res.data.id).then(res => { ...item
DevTypeAllOptions.value = res.data }
}) })
}) })
} // tableStore.index()
const submit = () => { })
const formDevModelOptionsFilter = computed(() => {
return devModelOptions.value.filter((item: any) => {
if(form?.file == null){ if (form.type) {
ElMessage.warning('请上传升级文件') return item.pid == form.type
return } else {
} return true
// console.log(formRef) }
formRef.value.validate(async (valid: boolean) => { })
// console.log(valid) })
if (valid) { const fileChange = (e: any) => {
let submitForm = new FormData() form.file = e.raw
for (let key in form) { fileList.value = [e.raw]
submitForm.append(key, form[key]) }
} const fileExceed = (e: any) => {
if (form.id) { ElMessage.error('只能上传一个文件')
await auditEdData(form) }
} else { const fileRemove = (e: any) => {
await addEdData(form) form.file = null
} fileList.value = []
ElMessage.success('操作成功') }
tableStore.index() const formDevTypeChange = (e: any) => {
dialogVisible.value = false if (!e) {
} return
}) }
} // form.devModel = ''
}
defineExpose({ open }) const dialogVisible = ref(false)
</script> const title = ref('新增版本')
const open = (text: string, data?: anyObj) => {
title.value = text
dialogVisible.value = true
if (data) {
for (let key in form) {
form[key] = data[key]
}
fileList.value = [
{
name: data.filePath,
url: data.filePath
}
]
} else {
for (let key in form) {
form[key] = null
}
}
queryByCode('Direct_Connected_Device').then(res => {
queryCsDictTree(res.data.id).then(res => {
TypeOptions.value = res.data
})
queryByid(res.data.id).then(res => {
DevTypeAllOptions.value = res.data
})
})
}
const submit = () => {
if (fileList.value.length == 0) {
ElMessage.warning('请上传升级文件')
return
}
// console.log(formRef)
formRef.value.validate(async (valid: boolean) => {
// console.log(valid)
if (valid) {
let submitForm = new FormData()
for (let key in form) {
submitForm.append(key, form[key])
}
if (form.id) {
await auditEdData(form)
} else {
await addEdData(form)
}
ElMessage.success('操作成功')
tableStore.index()
dialogVisible.value = false
emit('closePopup')
}
})
}
defineExpose({ open })
</script>
<style scoped lang="scss">
:deep(.el-upload-list__item-info) {
width: 600px !important;
}
</style>

View File

@@ -4,8 +4,12 @@
<template #select> <template #select>
<el-form-item label="装置型号:"> <el-form-item label="装置型号:">
<el-select v-model.trim="tableStore.table.params.devType" placeholder="请选择装置型号" clearable> <el-select v-model.trim="tableStore.table.params.devType" placeholder="请选择装置型号" clearable>
<el-option v-for="item in DevTypeOptions" :key="item.id" :label="item.name" <el-option
:value="item.id"></el-option> v-for="item in DevTypeOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</template> </template>
@@ -14,7 +18,7 @@
</template> </template>
</TableHeader> </TableHeader>
<Table ref="tableRef" /> <Table ref="tableRef" />
<PopupVersion ref="popupVersionRef" v-if="showPopup"></PopupVersion> <PopupVersion ref="popupVersionRef" v-if="showPopup" @closePopup="closePopup"></PopupVersion>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@@ -50,16 +54,16 @@ const tableStore = new TableStore({
{ title: '归档日期', field: 'updateTime' }, { title: '归档日期', field: 'updateTime' },
{ title: '描述', field: 'description' }, { title: '描述', field: 'description' },
{ {
title: '状态', field: 'status', render: 'tag', title: '状态',
field: 'status',
render: 'tag',
custom: { custom: {
0: 'error', 0: 'error',
1: 'success', 1: 'success'
}, },
replaceValue: { replaceValue: {
0: '禁用', 0: '禁用',
1: '启用', 1: '启用'
} }
}, },
{ {
@@ -75,7 +79,10 @@ const tableStore = new TableStore({
icon: 'el-icon-EditPen', icon: 'el-icon-EditPen',
render: 'basicButton', render: 'basicButton',
click: row => { click: row => {
popupVersionRef.value.open('编辑版本', row) showPopup.value = true
setTimeout(() => {
popupVersionRef.value.open('编辑版本', row)
}, 100)
} }
}, },
{ {
@@ -137,29 +144,30 @@ const tableStore = new TableStore({
} }
}) })
queryByCode('Device_Type').then(res => { queryByCode('Device_Type').then(res => {
const id = res.data.id const id = res.data.id
queryByid(id).then(res1 => { queryByid(id).then(res1 => {
res1.data.map((item: any, index: any) => { res1.data.map((item: any, index: any) => {
if (item.pid == id) { if (item.pid == id) {
res1.data.splice(index, 1) res1.data.splice(index, 1)
} }
})
console.log("🚀 ~ res1.data.map ~ res1.data:", res1.data)
DevTypeOptions.value = res1.data
}) })
console.log('🚀 ~ res1.data.map ~ res1.data:', res1.data)
DevTypeOptions.value = res1.data
}) })
})
tableStore.table.params.devType = '' tableStore.table.params.devType = ''
provide('tableStore', tableStore) provide('tableStore', tableStore)
onMounted(() => { onMounted(() => {
tableHeaderRef.value.onComSearch() tableHeaderRef.value.onComSearch()
}) })
const addMenu = () => { const addMenu = () => {
showPopup.value = true showPopup.value = true
setTimeout(() => { setTimeout(() => {
popupVersionRef.value.open('新增版本') popupVersionRef.value.open('新增版本')
}, 100) }, 100)
}
const closePopup = () => {
showPopup.value = false
} }
</script> </script>

View File

@@ -29,7 +29,7 @@ const props = defineProps({
const tableStore: any = new TableStore({ const tableStore: any = new TableStore({
url: '/cs-device-boot/csTerminalReply/bzLogs', url: '/cs-device-boot/csTerminalReply/bzLogs',
publicHeight: 0, publicHeight: 10,
method: 'POST', method: 'POST',
column: [ column: [
{ {
@@ -42,7 +42,7 @@ const tableStore: any = new TableStore({
{ {
field: 'engineeringName', field: 'engineeringName',
title: '项目名称', title: '项目名称',
width: 120, width: 100,
formatter: row => { formatter: row => {
return row.cellValue ? row.cellValue : '/' return row.cellValue ? row.cellValue : '/'
} }
@@ -50,7 +50,7 @@ const tableStore: any = new TableStore({
{ {
field: 'projectName', field: 'projectName',
title: '工程名称', title: '工程名称',
width: 120, width: 100,
formatter: row => { formatter: row => {
return row.cellValue ? row.cellValue : '/' return row.cellValue ? row.cellValue : '/'
} }
@@ -58,7 +58,7 @@ const tableStore: any = new TableStore({
{ {
field: 'deviceName', field: 'deviceName',
title: '设备名称', title: '设备名称',
width: 120, width: 100,
formatter: row => { formatter: row => {
return row.cellValue ? row.cellValue : '/' return row.cellValue ? row.cellValue : '/'
} }
@@ -66,7 +66,7 @@ const tableStore: any = new TableStore({
{ {
field: 'lineName', field: 'lineName',
title: '监测点名称', title: '监测点名称',
width: 120, width: 100,
formatter: row => { formatter: row => {
return row.cellValue ? row.cellValue : '/' return row.cellValue ? row.cellValue : '/'
} }
@@ -74,7 +74,7 @@ const tableStore: any = new TableStore({
{ {
field: 'logTime', field: 'logTime',
title: '补召时间', title: '补召时间',
width: 160, width: 150,
formatter: row => { formatter: row => {
return row.cellValue ? row.cellValue : '/' return row.cellValue ? row.cellValue : '/'
} }
@@ -90,7 +90,7 @@ const tableStore: any = new TableStore({
{ {
field: 'status', field: 'status',
title: '状态', title: '状态',
width: 80, width: 90,
formatter: row => { formatter: row => {
return row.cellValue ? row.cellValue : '/' return row.cellValue ? row.cellValue : '/'
} }
@@ -98,7 +98,7 @@ const tableStore: any = new TableStore({
{ {
field: 'result', field: 'result',
title: '结果', title: '结果',
minWidth: 200,
formatter: row => { formatter: row => {
return row.cellValue ? row.cellValue : '/' return row.cellValue ? row.cellValue : '/'
} }

View File

@@ -18,7 +18,7 @@
type="text" type="text"
clearable clearable
placeholder="用户名" placeholder="用户名"
autocomplete="off"
> >
<template #prefix> <template #prefix>
<span class="iconfont icon-yonghu" style="color: var(--el-color-primary)"></span> <span class="iconfont icon-yonghu" style="color: var(--el-color-primary)"></span>
@@ -33,10 +33,9 @@
type="password" type="password"
clearable clearable
placeholder="密码" placeholder="密码"
autocomplete="off" show-password
> >
<template #prefix> <template #prefix>
<!-- <Icon name="local-password" style="color: var(--el-color-primary); font-size: 16px" /> -->
<span class="iconfont icon-mima" style="color: var(--el-color-primary)"></span> <span class="iconfont icon-mima" style="color: var(--el-color-primary)"></span>
</template> </template>
</el-input> </el-input>