修改测试问题
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 : '/'
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user