修改测试问题

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

View File

@@ -1,136 +1,170 @@
<template>
<div class="default-main">
<TableHeader>
<template #select>
<el-form-item label="数据分类">
<el-select v-model.trim="tableStore.table.params.dataType" multiple filterable collapse-tags
clearable placeholder="请选择数据分类">
<el-option v-for="item in DataTypeSelect" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据存储">
<el-select v-model.trim="tableStore.table.params.classId" multiple filterable collapse-tags
clearable placeholder="请选择数据存储">
<el-option v-for="item in DataSelect" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="关键字筛选">
<el-input maxlength="32" show-word-limit v-model.trim="tableStore.table.params.searchValue"
placeholder="数据名称、别名、展示名称" clearable></el-input>
</el-form-item>
</template>
<template #operation>
<el-button :icon="Plus" type="primary" @click="addMenu" class="ml10">新增字典</el-button>
</template>
</TableHeader>
<Table ref="tableRef" />
<PopupDictionary ref="popupDictionary"></PopupDictionary>
</div>
</template>
<script setup lang="ts">
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'
import { useDictData } from '@/stores/dictData'
import PopupDictionary from './popupDictionary.vue'
import { ElMessage } from 'element-plus'
import { delCsDictData } from '@/api/system-boot/csDictData'
import { Plus } from '@element-plus/icons-vue'
defineOptions({
name: 'govern/manage/basic/dictionary'
})
const popupDictionary = ref()
const dictData = useDictData()
const DataSelect = dictData.getBasicData('Data')
const DataTypeSelect = dictData.getBasicData('Cs_Data_Type')
const ResourcesIdSelect = dictData.getBasicData('Data_Day')
const tableStore = new TableStore({
url: '/system-boot/csDictData/list',
method: 'POST',
column: [
{
title: '序号', width: 80, formatter: (row: any) => {
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
}
},
{ title: '数据分类', field: 'dataTypeName', minWidth: 170 },
{ title: '数据名称', field: 'name', minWidth: 220 },
{ title: '别名', field: 'otherName', minWidth: 220 },
{ title: '展示名称', field: 'showName', minWidth: 170 },
{ title: '告警码', field: 'defaultValue', minWidth: 170 },
{ title: '相别', field: 'phaseName', minWidth: 80 },
{ title: '单位', field: 'unit', minWidth: 80 },
{ title: '基础数据类型', field: 'type', minWidth: 170 },
{ title: '数据谐波次数', field: 'harmStartEnd', minWidth: 170 },
{ title: '数据统计方法', field: 'statMethod', minWidth: 170 },
{ title: '数据存储', field: 'classIdName', minWidth: 120 },
{ title: '数据来源', field: 'resourcesIdName', minWidth: 120 },
{
title: '操作',
align: 'center',
width: '180',
fixed: 'right',
render: 'buttons',
buttons: [
{
name: 'edit',
title: '编辑',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
click: row => {
popupDictionary.value.open('编辑字典', row)
}
},
{
name: 'del',
title: '删除',
type: 'danger',
icon: 'el-icon-Delete',
render: 'confirmButton',
popconfirm: {
confirmButtonText: '确认',
cancelButtonText: '取消',
confirmButtonType: 'danger',
title: '确定删除吗?'
},
click: row => {
delCsDictData(row.id).then(res => {
ElMessage.success('删除成功')
tableStore.index()
})
}
}
]
}
],
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 = () => {
popupDictionary.value.open('新增字典')
}
</script>
<template>
<div class="default-main">
<TableHeader>
<template #select>
<el-form-item label="数据分类">
<el-select
v-model.trim="tableStore.table.params.dataType"
multiple
filterable
collapse-tags
clearable
placeholder="请选择数据分类"
>
<el-option
v-for="item in DataTypeSelect"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据存储">
<el-select
v-model.trim="tableStore.table.params.classId"
multiple
filterable
collapse-tags
clearable
placeholder="请选择数据存储"
>
<el-option
v-for="item in DataSelect"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="关键字筛选">
<el-input
maxlength="32"
show-word-limit
v-model.trim="tableStore.table.params.searchValue"
placeholder="数据名称、别名、展示名称"
clearable
></el-input>
</el-form-item>
</template>
<template #operation>
<el-button :icon="Plus" type="primary" @click="addMenu" class="ml10">新增字典</el-button>
</template>
</TableHeader>
<Table ref="tableRef" />
<PopupDictionary ref="popupDictionary" v-if="show" @close="show=false"></PopupDictionary>
</div>
</template>
<script setup lang="ts">
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'
import { useDictData } from '@/stores/dictData'
import PopupDictionary from './popupDictionary.vue'
import { ElMessage } from 'element-plus'
import { delCsDictData } from '@/api/system-boot/csDictData'
import { Plus } from '@element-plus/icons-vue'
defineOptions({
name: 'govern/manage/basic/dictionary'
})
const show = ref(false)
const popupDictionary = ref()
const dictData = useDictData()
const DataSelect = dictData.getBasicData('Data')
const DataTypeSelect = dictData.getBasicData('Cs_Data_Type')
const ResourcesIdSelect = dictData.getBasicData('Data_Day')
const tableStore = new TableStore({
url: '/system-boot/csDictData/list',
method: 'POST',
column: [
{
title: '序号',
width: 80,
formatter: (row: any) => {
return (tableStore.table.params.pageNum - 1) * tableStore.table.params.pageSize + row.rowIndex + 1
}
},
{ title: '数据分类', field: 'dataTypeName', minWidth: 170 },
{ title: '数据名称', field: 'name', minWidth: 220 },
{ title: '别名', field: 'otherName', minWidth: 220 },
{ title: '展示名称', field: 'showName', minWidth: 170 },
{ title: '告警码', field: 'defaultValue', minWidth: 170 },
{ title: '相别', field: 'phaseName', minWidth: 80 },
{ title: '单位', field: 'unit', minWidth: 80 },
{ title: '基础数据类型', field: 'type', minWidth: 170 },
{ title: '数据谐波次数', field: 'harmStartEnd', minWidth: 170 },
{ title: '数据统计方法', field: 'statMethod', minWidth: 170 },
{ title: '数据存储', field: 'classIdName', minWidth: 120 },
{ title: '数据来源', field: 'resourcesIdName', minWidth: 120 },
{
title: '操作',
align: 'center',
width: '180',
fixed: 'right',
render: 'buttons',
buttons: [
{
name: 'edit',
title: '编辑',
type: 'primary',
icon: 'el-icon-EditPen',
render: 'basicButton',
click: row => {
show.value = true
setTimeout(() => {
popupDictionary.value.open('编辑字典', row)
}, 100)
}
},
{
name: 'del',
title: '删除',
type: 'danger',
icon: 'el-icon-Delete',
render: 'confirmButton',
popconfirm: {
confirmButtonText: '确认',
cancelButtonText: '取消',
confirmButtonType: 'danger',
title: '确定删除吗?'
},
click: row => {
delCsDictData(row.id).then(res => {
ElMessage.success('删除成功')
tableStore.index()
})
}
}
]
}
],
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>
<el-dialog class="cn-operate-dialog" v-model.trim="dialogVisible" :title="title">
<el-scrollbar>
<div style="padding-left: 50px">
<el-divider content-position="center">基础数据</el-divider>
</div>
<el-form :model="form" label-width="140px" ref="formRef" class="form-two" :rules="rules">
<el-form-item label="数据分类:" prop="dataType">
<el-select v-model.trim="form.dataType" filterable clearable placeholder="请选择数据分类">
<el-option v-for="item in DataTypeSelect" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据名称:" prop="name">
<el-input maxlength="32" show-word-limit v-model.trim="form.name" autocomplete="off"
placeholder="请输入数据名称"></el-input>
</el-form-item>
<el-form-item label="别名:" prop="otherName">
<el-input maxlength="32" show-word-limit v-model.trim="form.otherName" autocomplete="off"
placeholder="请输入别名"></el-input>
</el-form-item>
<el-form-item label="展示名称:" prop="showName">
<el-input maxlength="32" show-word-limit v-model.trim="form.showName" autocomplete="off"
placeholder="请输入展示名称"></el-input>
</el-form-item>
<el-form-item label="相别:" prop="phase">
<el-select v-model.trim="form.phase" filterable clearable placeholder="请选择相别">
<el-option v-for="item in phaseSelect" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="单位:" prop="unit">
<el-input maxlength="32" show-word-limit v-model.trim="form.unit" autocomplete="off"
placeholder="请输入单位"></el-input>
</el-form-item>
<el-form-item label="基础数据类型:" prop="type">
<el-input maxlength="32" show-word-limit v-model.trim="form.type" autocomplete="off"
placeholder="请输入基础数据类型"></el-input>
</el-form-item>
<el-form-item label="开始结束次数:" prop="harmStart">
<el-slider v-model.trim="form.harm" range show-stops :max="50" style="width: 95%" />
</el-form-item>
<el-form-item label="统计方法:" prop="statMethod">
<el-select v-model.trim="form.statMethod" multiple collapse-tags collapse-tags-tooltip filterable
clearable placeholder="请选择统计方法">
<el-option v-for="item in StatMethodSelect" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据存储:" prop="classId">
<el-select v-model.trim="form.classId" filterable clearable placeholder="请选择数据存储">
<el-option v-for="item in DataSelect" :key="item.code" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="报表数据来源:" prop="resourcesId">
<el-select v-model.trim="form.resourcesId" filterable clearable placeholder="请选择报表数据来源">
<el-option v-for="item in ResourcesIdSelect" :key="item.code" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="序号:" prop="sort">
<el-input maxlength="32" show-word-limit type="number" v-model.trim="form.sort" autocomplete="off"
placeholder="请输入序号"></el-input>
</el-form-item>
<el-form-item label="限值名称:" prop="limitName">
<el-input maxlength="32" show-word-limit type="text" v-model.trim="form.limitName"
autocomplete="off" placeholder="请输入限值名称"></el-input>
</el-form-item>
<el-form-item label="限值表名:" prop="limitTable">
<el-input maxlength="32" show-word-limit type="text" v-model.trim="form.limitTable"
autocomplete="off" placeholder="请输入限值表名"></el-input>
</el-form-item>
<el-form-item label="超标判断方式:" prop="formula">
<el-select v-model.trim="form.formula" filterable clearable placeholder="请选择超标判断方式">
<el-option v-for="item in FormulaSelect" :key="item.code" :label="item.name"
:value="item.id"></el-option>
</el-select>
</el-form-item>
</el-form>
<div style="padding-left: 50px">
<el-divider content-position="center">拓展数据</el-divider>
</div>
<el-form class="form-two" :model="form" label-width="140px" ref="formRef2" :rules="rules">
<el-form-item label="告警码(缺省值):" >
<el-input maxlength="32" show-word-limit v-model.trim="form.defaultValue" autocomplete="off"
placeholder="请输入告警码(缺省值)"></el-input>
</el-form-item>
<el-form-item label="事件类别:" >
<el-input maxlength="32" show-word-limit v-model.trim="form.eventType" autocomplete="off"
placeholder="请输入事件类别"></el-input>
</el-form-item>
<el-form-item label="设置最大值:" >
<el-input maxlength="32" show-word-limit type="number" v-model.trim="form.maxNum" autocomplete="off"
placeholder="请输入设置最大值"></el-input>
</el-form-item>
<el-form-item label="设置最小值:" >
<el-input maxlength="32" show-word-limit type="number" v-model.trim="form.minNum" autocomplete="off"
placeholder="请输入设置最小值"></el-input>
</el-form-item>
<el-form-item label="枚举序列:">
<el-input maxlength="32" show-word-limit v-model.trim="form.setValue" autocomplete="off"
placeholder="请输入枚举序列"></el-input>
</el-form-item>
<el-form-item label="字符串长度上限:" >
<el-input maxlength="32" show-word-limit type="number" v-model.trim="form.strlen" autocomplete="off"
placeholder="请输入字符串长度上限"></el-input>
</el-form-item>
<el-form-item label="上送规则:" >
<el-input maxlength="32" show-word-limit v-model.trim="form.tranRule" autocomplete="off"
placeholder="请输入上送规则"></el-input>
</el-form-item>
<el-form-item label="是否可远程控制:" >
<el-radio v-model.trim="form.ctlSts" :label="1"></el-radio>
<el-radio v-model.trim="form.ctlSts" :label="0"></el-radio>
</el-form-item>
<el-form-item label="是否需遥控校验:" >
<el-radio v-model.trim="form.curSts" :label="1"></el-radio>
<el-radio v-model.trim="form.curSts" :label="0"></el-radio>
</el-form-item>
<el-form-item label="是否存储:" >
<el-radio v-model.trim="form.storeFlag" :label="1"></el-radio>
<el-radio v-model.trim="form.storeFlag" :label="0"></el-radio>
</el-form-item>
<el-form-item label="是否加密:" >
<el-radio v-model.trim="form.storeFlag" :label="1"></el-radio>
<el-radio v-model.trim="form.storeFlag" :label="0"></el-radio>
</el-form-item>
<el-form-item label="数据是否上送:" >
<el-radio v-model.trim="form.tranFlag" :label="1"></el-radio>
<el-radio v-model.trim="form.tranFlag" :label="0"></el-radio>
</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 TableStore from '@/utils/tableStore'
import { ElMessage } from 'element-plus'
import { useDictData } from '@/stores/dictData'
import { addCsDictData, updateCsDictData } from '@/api/system-boot/csDictData'
const formRef = ref()
const formRef2 = ref()
const dictData = useDictData()
const DataSelect = dictData.getBasicData('Data')
const DataTypeSelect = dictData.getBasicData('Cs_Data_Type')
const ResourcesIdSelect = dictData.getBasicData('Data_Day')
const FormulaSelect = dictData.getBasicData('Limit_Value_Judgment')
const phaseSelect = [
{
name: 'A相',
id: 'A'
},
{
name: 'B相',
id: 'B'
},
{
name: 'C相',
id: 'C'
},
{
name: 'T相',
id: 'T'
}
]
const StatMethodSelect = [
{
name: '平均值',
id: 'avg'
},
{
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 () => {
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
}
defineExpose({ open })
</script>
<template>
<el-dialog class="cn-operate-dialog" v-model.trim="dialogVisible" :title="title" @close=" emit('close')">
<el-scrollbar>
<div style="padding-left: 50px">
<el-divider content-position="center">基础数据</el-divider>
</div>
<el-form :model="form" label-width="140px" ref="formRef" class="form-two" :rules="rules">
<el-form-item label="数据分类:" prop="dataType">
<el-select v-model.trim="form.dataType" filterable clearable placeholder="请选择数据分类">
<el-option
v-for="item in DataTypeSelect"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据名称:" prop="name">
<el-input
maxlength="32"
show-word-limit
v-model.trim="form.name"
autocomplete="off"
placeholder="请输入数据名称"
></el-input>
</el-form-item>
<el-form-item label="别名:" prop="otherName">
<el-input
maxlength="32"
show-word-limit
v-model.trim="form.otherName"
autocomplete="off"
placeholder="请输入别名"
></el-input>
</el-form-item>
<el-form-item label="展示名称:" prop="showName">
<el-input
maxlength="32"
show-word-limit
v-model.trim="form.showName"
autocomplete="off"
placeholder="请输入展示名称"
></el-input>
</el-form-item>
<el-form-item label="相别:" prop="phase">
<el-select v-model.trim="form.phase" filterable clearable placeholder="请选择相别">
<el-option
v-for="item in phaseSelect"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="单位:" prop="unit">
<el-input
maxlength="32"
show-word-limit
v-model.trim="form.unit"
autocomplete="off"
placeholder="请输入单位"
></el-input>
</el-form-item>
<el-form-item label="基础数据类型:" prop="type">
<el-input
maxlength="32"
show-word-limit
v-model.trim="form.type"
autocomplete="off"
placeholder="请输入基础数据类型"
></el-input>
</el-form-item>
<el-form-item label="开始结束次数:" prop="harmStart">
<el-slider v-model.trim="form.harm" range show-stops :max="50" style="width: 95%" />
</el-form-item>
<el-form-item label="统计方法:" prop="statMethod">
<el-select
v-model.trim="form.statMethod"
multiple
collapse-tags
collapse-tags-tooltip
filterable
clearable
placeholder="请选择统计方法"
>
<el-option
v-for="item in StatMethodSelect"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="数据存储:" prop="classId">
<el-select v-model.trim="form.classId" filterable clearable placeholder="请选择数据存储">
<el-option
v-for="item in DataSelect"
:key="item.code"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="报表数据来源:" prop="resourcesId">
<el-select v-model.trim="form.resourcesId" filterable clearable placeholder="请选择报表数据来源">
<el-option
v-for="item in ResourcesIdSelect"
:key="item.code"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="序号:" prop="sort">
<el-input
maxlength="32"
show-word-limit
type="number"
v-model.trim="form.sort"
autocomplete="off"
placeholder="请输入序号"
></el-input>
</el-form-item>
<el-form-item label="限值名称:" prop="limitName">
<el-input
maxlength="32"
show-word-limit
type="text"
v-model.trim="form.limitName"
autocomplete="off"
placeholder="请输入限值名称"
></el-input>
</el-form-item>
<el-form-item label="限值表名:" prop="limitTable">
<el-input
maxlength="32"
show-word-limit
type="text"
v-model.trim="form.limitTable"
autocomplete="off"
placeholder="请输入限值表名"
></el-input>
</el-form-item>
<el-form-item label="超标判断方式:" prop="formula">
<el-select v-model.trim="form.formula" filterable clearable placeholder="请选择超标判断方式">
<el-option
v-for="item in FormulaSelect"
:key="item.code"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-form>
<div style="padding-left: 50px">
<el-divider content-position="center">拓展数据</el-divider>
</div>
<el-form class="form-two" :model="form" label-width="140px" ref="formRef2">
<el-form-item label="告警码(缺省值):">
<el-input
maxlength="32"
show-word-limit
v-model.trim="form.defaultValue"
autocomplete="off"
placeholder="请输入告警码(缺省值)"
></el-input>
</el-form-item>
<el-form-item label="事件类别:">
<el-input
maxlength="32"
show-word-limit
v-model.trim="form.eventType"
autocomplete="off"
placeholder="请输入事件类别"
></el-input>
</el-form-item>
<el-form-item label="设置最大值:">
<el-input
maxlength="32"
show-word-limit
type="number"
v-model.trim="form.maxNum"
autocomplete="off"
placeholder="请输入设置最大值"
></el-input>
</el-form-item>
<el-form-item label="设置最小值:">
<el-input
maxlength="32"
show-word-limit
type="number"
v-model.trim="form.minNum"
autocomplete="off"
placeholder="请输入设置最小值"
></el-input>
</el-form-item>
<el-form-item label="枚举序列:">
<el-input
maxlength="32"
show-word-limit
v-model.trim="form.setValue"
autocomplete="off"
placeholder="请输入枚举序列"
></el-input>
</el-form-item>
<el-form-item label="字符串长度上限:">
<el-input
maxlength="32"
show-word-limit
type="number"
v-model.trim="form.strlen"
autocomplete="off"
placeholder="请输入字符串长度上限"
></el-input>
</el-form-item>
<el-form-item label="上送规则:">
<el-input
maxlength="32"
show-word-limit
v-model.trim="form.tranRule"
autocomplete="off"
placeholder="请输入上送规则"
></el-input>
</el-form-item>
<el-form-item label="是否可远程控制:">
<el-radio v-model.trim="form.ctlSts" :label="1"></el-radio>
<el-radio v-model.trim="form.ctlSts" :label="0"></el-radio>
</el-form-item>
<el-form-item label="是否需遥控校验:">
<el-radio v-model.trim="form.curSts" :label="1"></el-radio>
<el-radio v-model.trim="form.curSts" :label="0"></el-radio>
</el-form-item>
<el-form-item label="是否存储:">
<el-radio v-model.trim="form.storeFlag" :label="1"></el-radio>
<el-radio v-model.trim="form.storeFlag" :label="0"></el-radio>
</el-form-item>
<el-form-item label="是否加密:">
<el-radio v-model.trim="form.storeFlag" :label="1"></el-radio>
<el-radio v-model.trim="form.storeFlag" :label="0"></el-radio>
</el-form-item>
<el-form-item label="数据是否上送:">
<el-radio v-model.trim="form.tranFlag" :label="1"></el-radio>
<el-radio v-model.trim="form.tranFlag" :label="0"></el-radio>
</el-form-item>
</el-form>
</el-scrollbar>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false; emit('close')">取消</el-button>
<el-button type="primary" @click="submit">确认</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, inject } from 'vue'
import { reactive } from 'vue'
import TableStore from '@/utils/tableStore'
import { ElMessage } from 'element-plus'
import { useDictData } from '@/stores/dictData'
import { addCsDictData, updateCsDictData } from '@/api/system-boot/csDictData'
const emit = defineEmits(['close'])
const formRef = ref()
const formRef2 = ref()
const dictData = useDictData()
const DataSelect = dictData.getBasicData('Data')
const DataTypeSelect = dictData.getBasicData('Cs_Data_Type')
const ResourcesIdSelect = dictData.getBasicData('Data_Day')
const FormulaSelect = dictData.getBasicData('Limit_Value_Judgment')
const phaseSelect = [
{
name: 'A相',
id: 'A'
},
{
name: 'B相',
id: 'B'
},
{
name: 'C相',
id: 'C'
},
{
name: 'T相',
id: 'T'
}
]
const StatMethodSelect = [
{
name: '平均值',
id: 'avg'
},
{
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>
<el-dialog class="cn-operate-dialog" width="800px" v-model.trim="dialogVisible" :title="title">
<el-form class="form-two" :model="form" label-width="100px" ref="formRef" :rules="rules">
<el-form-item label="装置类型:" prop="type">
<!-- <el-select v-model.trim="form.type" filterable placeholder="请选择" @change="typeChange">
<el-option v-for="item in TypeOptions" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select> -->
<el-select v-model.trim="form.type" placeholder="请选择装置类型" @change="formDevTypeChange" clearable>
<el-option v-for="item in devTypeOptions" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="装置型号:" prop="devType">
<!-- <el-select v-model.trim="form.devType" placeholder="请选择" filterable @change="devTypeChange">
<el-option v-for="item in DevTypeOptions" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select> -->
<el-select v-model.trim="form.devType" filterable placeholder="请选择装置型号" clearable @change="devTypeChange">
<el-option v-for="item in formDevModelOptionsFilter" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="版本号:" prop="versionNo">
<el-input maxlength="32" show-word-limit v-model.trim="form.versionNo" autocomplete="off"
placeholder="请输入版本号"></el-input>
</el-form-item>
<el-form-item label="版本类型:" prop="versionType">
<el-input maxlength="32" show-word-limit v-model.trim="form.versionType" autocomplete="off"
placeholder="填写特殊类型(不填默认通用类型)"></el-input>
</el-form-item>
<el-form-item label="版本协议:" prop="versionAgreement">
<el-input maxlength="32" show-word-limit v-model.trim="form.versionAgreement" autocomplete="off"
placeholder="请输入版本协议"></el-input>
</el-form-item>
<el-form-item label="版本日期:" prop="versionDate">
<el-date-picker v-model.trim="form.versionDate" type="date" value-format="YYYY-MM-DD"
placeholder="选择日期时间" style="width: 100%"></el-date-picker>
</el-form-item>
<el-form-item label="CRC校验:" prop="crcInfo">
<el-input maxlength="32" show-word-limit v-model.trim="form.crcInfo" autocomplete="off"
placeholder="请输入CRC校验"></el-input>
</el-form-item>
</el-form>
<el-form :model="form" label-width="100px" class="mt10">
<el-form-item label="描述:" prop="description">
<el-input maxlength="300":autosize="{ minRows: 2, maxRows: 4 }" type="textarea" show-word-limit v-model.trim="form.description" autocomplete="off"
placeholder="请输入描述"></el-input>
</el-form-item>
<el-form-item label="升级文件:" prop="file">
<el-upload :limit="1" :auto-upload="false" :on-change="fileChange" :on-exceed="fileExceed" :on-remove="fileRemove"
:file-list="fileList">
<el-button type="primary">点击上传</el-button>
</el-upload>
</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,computed } from 'vue'
import { reactive } from 'vue'
import TableStore from '@/utils/tableStore'
import { ElMessage } from 'element-plus'
import { queryByCode, queryByid, queryCsDictTree } from '@/api/system-boot/dictTree'
import { addEdData, auditEdData } from '@/api/cs-device-boot/edData'
const TypeOptions = ref()
const DevTypeAllOptions = ref()
const DevTypeOptions = ref()
const devTypeOptions: any = ref([])
const devModelOptions: any = ref([])
const fileList:any = ref([])
const tableStore = inject('tableStore') as TableStore
const formRef = ref()
const form = reactive<any>({
devType: null,
devTypeName: null,
versionAgreement: null,
versionNo: null,
versionType: null,
crcInfo: null,
description: null,
versionDate: null,
type: null,
id: null,
file: []
})
const rules = {
type: [{ required: true, message: '装置类型不能为空', trigger: 'blur' }],
devType: [{ required: true, message: '装置型号不能为空', trigger: 'blur' }],
versionNo: [{ required: true, message: '版本号不能为空', trigger: 'blur' }],
versionType: [{ required: true, message: '版本类型不能为空', trigger: 'blur' }],
versionAgreement: [{ required: true, message: '版本协议不能为空', trigger: 'blur' }],
versionDate: [{ required: true, message: '版本日期不能为空', trigger: 'blur' }],
description: [{ required: true, message: '描述不能为空', trigger: 'blur' }],
crcInfo: [{ required: true, message: 'CRC校验不能为空', trigger: 'blur' }],
file: [{ required: true, message: '升级文件不能为空', trigger: 'blur' }]
}
const typeChange = () => {
// console.log(form.type)
form.devType = null
form.devTypeName = null
queryCsDictTree(form.type).then(res => {
DevTypeOptions.value = res.data
})
}
const devTypeChange = (e: any) => {
// console.log(e)
form.devTypeName = formDevModelOptionsFilter.value.filter((item: any) => item.value == e)[0].label
}
queryByCode('Device_Type').then(res => {
const id = res.data.id
queryCsDictTree(id).then(res => {
devTypeOptions.value = res.data.map((item: any) => {
return {
value: item.id,
label: item.name,
...item
}
})
})
queryByid(id).then(res => {
res.data.map((item: any, index: any) => {
if (item.pid == id) {
res.data.splice(index, 1)
}
})
devModelOptions.value = res.data.map((item: any) => {
return {
value: item.id,
label: item.name,
...item
}
})
})
// tableStore.index()
})
const formDevModelOptionsFilter = computed(() => {
return devModelOptions.value.filter((item: any) => {
if (form.type) {
return item.pid == form.type
} else {
return true
}
})
})
const fileChange = (e: any) => {
form.file = e.raw
}
const fileExceed = (e: any) => {
ElMessage.error('只能上传一个文件')
}
const fileRemove = (e: any) => {
form.file = null
}
const formDevTypeChange = (e: any) => {
if (!e) {
return
}
// form.devModel = ''
}
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) {
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(form?.file == null){
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
}
})
}
defineExpose({ open })
</script>
<template>
<el-dialog
class="cn-operate-dialog"
width="800px"
v-model.trim="dialogVisible"
:title="title"
@close="emit('closePopup')"
>
<el-form class="form-two" :model="form" label-width="100px" ref="formRef" :rules="rules">
<el-form-item label="装置类型:" prop="type">
<!-- <el-select v-model.trim="form.type" filterable placeholder="请选择" @change="typeChange">
<el-option v-for="item in TypeOptions" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select> -->
<el-select v-model.trim="form.type" placeholder="请选择装置类型" @change="formDevTypeChange" clearable>
<el-option
v-for="item in devTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="装置型号:" prop="devType">
<!-- <el-select v-model.trim="form.devType" placeholder="请选择" filterable @change="devTypeChange">
<el-option v-for="item in DevTypeOptions" :key="item.id" :label="item.name"
:value="item.id"></el-option>
</el-select> -->
<el-select
v-model.trim="form.devType"
filterable
placeholder="请选择装置型号"
clearable
@change="devTypeChange"
>
<el-option
v-for="item in formDevModelOptionsFilter"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="版本号:" prop="versionNo">
<el-input
maxlength="32"
show-word-limit
v-model.trim="form.versionNo"
autocomplete="off"
placeholder="请输入版本号"
></el-input>
</el-form-item>
<el-form-item label="版本类型:" prop="versionType">
<el-input
maxlength="32"
show-word-limit
v-model.trim="form.versionType"
autocomplete="off"
placeholder="填写特殊类型(不填默认通用类型)"
></el-input>
</el-form-item>
<el-form-item label="版本协议:" prop="versionAgreement">
<el-input
maxlength="32"
show-word-limit
v-model.trim="form.versionAgreement"
autocomplete="off"
placeholder="请输入版本协议"
></el-input>
</el-form-item>
<el-form-item label="版本日期:" prop="versionDate">
<el-date-picker
v-model.trim="form.versionDate"
type="date"
value-format="YYYY-MM-DD"
placeholder="选择日期时间"
style="width: 100%"
></el-date-picker>
</el-form-item>
<el-form-item label="CRC校验:" prop="crcInfo">
<el-input
maxlength="32"
show-word-limit
v-model.trim="form.crcInfo"
autocomplete="off"
placeholder="请输入CRC校验"
></el-input>
</el-form-item>
</el-form>
<el-form :model="form" label-width="100px" class="mt10">
<el-form-item label="描述:" prop="description">
<el-input
maxlength="300"
:autosize="{ minRows: 2, maxRows: 4 }"
type="textarea"
show-word-limit
v-model.trim="form.description"
autocomplete="off"
placeholder="请输入描述"
></el-input>
</el-form-item>
<el-form-item label="升级文件:" prop="file">
<el-upload
:limit="1"
:auto-upload="false"
:on-change="fileChange"
:on-exceed="fileExceed"
:on-remove="fileRemove"
:file-list="fileList"
>
<el-button type="primary">点击上传</el-button>
</el-upload>
</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, computed } from 'vue'
import { reactive } from 'vue'
import TableStore from '@/utils/tableStore'
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'])
const TypeOptions = ref()
const DevTypeAllOptions = ref()
const DevTypeOptions = ref()
const devTypeOptions: any = ref([])
const devModelOptions: any = ref([])
const fileList: any = ref([])
const tableStore = inject('tableStore') as TableStore
const formRef = ref()
const form = reactive<any>({
devType: null,
devTypeName: null,
versionAgreement: null,
versionNo: null,
versionType: null,
crcInfo: null,
description: null,
versionDate: null,
type: null,
id: null,
file: []
})
const rules = {
type: [{ required: true, message: '装置类型不能为空', trigger: 'change' }],
devType: [{ required: true, message: '装置型号不能为空', trigger: 'change' }],
versionNo: [{ required: true, message: '版本号不能为空', trigger: 'blur' }],
versionType: [{ required: true, message: '版本类型不能为空', trigger: 'blur' }],
versionAgreement: [{ required: true, message: '版本协议不能为空', trigger: 'blur' }],
versionDate: [{ required: true, message: '版本日期不能为空', trigger: 'blur' }],
description: [{ required: true, message: '描述不能为空', trigger: 'blur' }],
crcInfo: [{ required: true, message: 'CRC校验不能为空', trigger: 'blur' }],
file: [{ required: true, message: '升级文件不能为空', trigger: 'blur' }]
}
const typeChange = () => {
// console.log(form.type)
form.devType = null
form.devTypeName = null
queryCsDictTree(form.type).then(res => {
DevTypeOptions.value = res.data
})
}
const devTypeChange = (e: any) => {
// console.log(e)
form.devTypeName = formDevModelOptionsFilter.value.filter((item: any) => item.value == e)[0].label
}
queryByCode('Device_Type').then(res => {
const id = res.data.id
queryCsDictTree(id).then(res => {
devTypeOptions.value = res.data.map((item: any) => {
return {
value: item.id,
label: item.name,
...item
}
})
})
queryByid(id).then(res => {
res.data.map((item: any, index: any) => {
if (item.pid == id) {
res.data.splice(index, 1)
}
})
devModelOptions.value = res.data.map((item: any) => {
return {
value: item.id,
label: item.name,
...item
}
})
})
// tableStore.index()
})
const formDevModelOptionsFilter = computed(() => {
return devModelOptions.value.filter((item: any) => {
if (form.type) {
return item.pid == form.type
} else {
return true
}
})
})
const fileChange = (e: any) => {
form.file = e.raw
fileList.value = [e.raw]
}
const fileExceed = (e: any) => {
ElMessage.error('只能上传一个文件')
}
const fileRemove = (e: any) => {
form.file = null
fileList.value = []
}
const formDevTypeChange = (e: any) => {
if (!e) {
return
}
// form.devModel = ''
}
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) {
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>
<el-form-item label="装置型号:">
<el-select v-model.trim="tableStore.table.params.devType" placeholder="请选择装置型号" clearable>
<el-option v-for="item in DevTypeOptions" :key="item.id" :label="item.name"
:value="item.id"></el-option>
<el-option
v-for="item in DevTypeOptions"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</template>
@@ -14,7 +18,7 @@
</template>
</TableHeader>
<Table ref="tableRef" />
<PopupVersion ref="popupVersionRef" v-if="showPopup"></PopupVersion>
<PopupVersion ref="popupVersionRef" v-if="showPopup" @closePopup="closePopup"></PopupVersion>
</div>
</template>
<script setup lang="ts">
@@ -50,16 +54,16 @@ const tableStore = new TableStore({
{ title: '归档日期', field: 'updateTime' },
{ title: '描述', field: 'description' },
{
title: '状态', field: 'status', render: 'tag',
title: '状态',
field: 'status',
render: 'tag',
custom: {
0: 'error',
1: 'success',
1: 'success'
},
replaceValue: {
0: '禁用',
1: '启用',
1: '启用'
}
},
{
@@ -75,7 +79,10 @@ const tableStore = new TableStore({
icon: 'el-icon-EditPen',
render: 'basicButton',
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 => {
const id = res.data.id
queryByid(id).then(res1 => {
res1.data.map((item: any, index: any) => {
if (item.pid == id) {
res1.data.splice(index, 1)
}
})
console.log("🚀 ~ res1.data.map ~ res1.data:", res1.data)
DevTypeOptions.value = res1.data
const id = res.data.id
queryByid(id).then(res1 => {
res1.data.map((item: any, index: any) => {
if (item.pid == id) {
res1.data.splice(index, 1)
}
})
console.log('🚀 ~ res1.data.map ~ res1.data:', res1.data)
DevTypeOptions.value = res1.data
})
})
tableStore.table.params.devType = ''
provide('tableStore', tableStore)
onMounted(() => {
tableHeaderRef.value.onComSearch()
})
const addMenu = () => {
showPopup.value = true
setTimeout(() => {
popupVersionRef.value.open('新增版本')
}, 100)
setTimeout(() => {
popupVersionRef.value.open('新增版本')
}, 100)
}
const closePopup = () => {
showPopup.value = false
}
</script>

View File

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

View File

@@ -18,7 +18,7 @@
type="text"
clearable
placeholder="用户名"
autocomplete="off"
>
<template #prefix>
<span class="iconfont icon-yonghu" style="color: var(--el-color-primary)"></span>
@@ -33,10 +33,9 @@
type="password"
clearable
placeholder="密码"
autocomplete="off"
show-password
>
<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>
</template>
</el-input>