|
@@ -0,0 +1,474 @@
|
|
|
+<template>
|
|
|
+ <xn-form-container
|
|
|
+ :title="formData.id ? '编辑监控对象' : '新增监控对象'"
|
|
|
+ :width="'60%'"
|
|
|
+ :visible="visible"
|
|
|
+ :destroy-on-close="true"
|
|
|
+ @close="onClose"
|
|
|
+ >
|
|
|
+ <a-form
|
|
|
+ ref="formRef"
|
|
|
+ :model="formData"
|
|
|
+ :rules="formRules"
|
|
|
+ layout="inline"
|
|
|
+ :label-col="{ style: { width: '100px', justifyContent: 'end' } }"
|
|
|
+ >
|
|
|
+ <a-tabs v-model:activeKey="activeKey" type="editable-card" @edit="onEdit">
|
|
|
+ <a-tab-pane tab="对象信息" key="object" :closable="false">
|
|
|
+ <a-row :gutter="10">
|
|
|
+ <a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
|
|
|
+ <a-form-item label="对象名称" name="name">
|
|
|
+ <a-input v-model:value="formData.name" placeholder="请输入对象名称" allow-clear />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+
|
|
|
+ <a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
|
|
|
+ <a-form-item label="对象编号">
|
|
|
+ <a-input v-model:value="formData.code" placeholder="请输入对象编号" allow-clear />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
|
|
|
+ <a-form-item label="对象ID">
|
|
|
+ <a-input v-model:value="formData.barcode" placeholder="请输入对象ID" allow-clear />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
|
|
|
+ <a-form-item label="对象类型" name="type">
|
|
|
+ <a-select ref="select" v-model:value="formData.type">
|
|
|
+ <a-select-option value="1">新装</a-select-option>
|
|
|
+ <a-select-option value="2">液氮罐</a-select-option>
|
|
|
+ <a-select-option value="3">转运箱</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
|
|
|
+ <a-form-item label="品牌" name="brand">
|
|
|
+ <a-input v-model:value="formData.brand" placeholder="请输入品牌" allow-clear />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
|
|
|
+ <a-form-item label="型号" name="xh">
|
|
|
+ <a-input v-model:value="formData.xh" placeholder="请输入型号" allow-clear />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+
|
|
|
+ <a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
|
|
|
+ <a-form-item label="对象状态" name="state">
|
|
|
+ <a-select ref="select" v-model:value="formData.state" placeholder="请选择对象状态">
|
|
|
+ <a-select-option value="1">正常</a-select-option>
|
|
|
+ <a-select-option value="2">停用</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
|
|
|
+ <a-form-item label="所属部门" name="division">
|
|
|
+ <a-input v-model:value="formData.division" placeholder="请输入所属部门" allow-clear />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
|
|
|
+ <a-form-item label="使用日期">
|
|
|
+ <a-date-picker
|
|
|
+ v-model:value="formData.collectionTime"
|
|
|
+ placeholder="请选择使用日期"
|
|
|
+ format="YYYY-MM-DD"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
|
|
|
+ <a-form-item label="对象位置">
|
|
|
+ <a-input v-model:value="formData.location" placeholder="请输入对象位置" allow-clear />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </a-tab-pane>
|
|
|
+ <a-tab-pane tab="报警信息" key="report" :closable="false">
|
|
|
+ <a-form-item :label-col="{ style: { width: '200px' } }">
|
|
|
+ <template #label>
|
|
|
+ <a-tooltip>
|
|
|
+ <template #title>
|
|
|
+ 重复通知间隔:同一设备同一故障类型出现报警进行过一次报警通知后,进行下一次报普通知的间隔时间,如果在这个时间间隔内该设备同一故障类型
|
|
|
+ 还在产生报警则不再进行通知。
|
|
|
+ 最多报警次数:同一设备同一故障类型连续报警最多报警通知次数,在达到最多报警次数后如果报警还未及时处理,系统也不再进行报警通知。
|
|
|
+ 延时时间:为屏蔽误报,系统报警在达到延时时间之后才进行报警通知。
|
|
|
+ </template>
|
|
|
+ <question-circle-outlined />
|
|
|
+ </a-tooltip>
|
|
|
+ 重复发送通知:
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <a-radio-group v-model:value="formData.repeat">
|
|
|
+ <a-radio value="1">1次</a-radio>
|
|
|
+ <a-radio value="2">多次</a-radio>
|
|
|
+ </a-radio-group>
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item label="延时报警" :label-col="{ style: { width: '200px' } }">
|
|
|
+ <a-radio-group v-model:value="formData.delayed">
|
|
|
+ <a-radio value="1">是</a-radio>
|
|
|
+ <a-radio value="0">否</a-radio>
|
|
|
+ </a-radio-group>
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item label="报警关闭发送通知" :label-col="{ style: { width: '200px' } }">
|
|
|
+ <a-radio-group v-model:value="formData.close">
|
|
|
+ <a-radio value="1">是</a-radio>
|
|
|
+ <a-radio value="0">否</a-radio>
|
|
|
+ </a-radio-group>
|
|
|
+ </a-form-item>
|
|
|
+ <a-form-item label="多级报警" :label-col="{ style: { width: '200px' } }">
|
|
|
+ <a-radio-group v-model:value="formData.multistage">
|
|
|
+ <a-radio value="1">是</a-radio>
|
|
|
+ <a-radio value="0">否</a-radio>
|
|
|
+ </a-radio-group>
|
|
|
+ </a-form-item>
|
|
|
+
|
|
|
+ <a-form-item label="报警通知方式" :label-col="{ style: { width: '200px' } }">
|
|
|
+ <a-checkbox-group v-model:value="formData.noticeway" style="width: 100%">
|
|
|
+ <a-checkbox value="1">短信</a-checkbox>
|
|
|
+ <a-checkbox value="2">电话</a-checkbox>
|
|
|
+ <a-checkbox value="3">微信</a-checkbox>
|
|
|
+ <a-checkbox value="4">电子邮件</a-checkbox>
|
|
|
+ <a-checkbox value="5">弹出</a-checkbox>
|
|
|
+ <a-checkbox value="6">音乐</a-checkbox>
|
|
|
+ </a-checkbox-group>
|
|
|
+ </a-form-item>
|
|
|
+
|
|
|
+ <!-- 表格区域 -->
|
|
|
+ <div>
|
|
|
+ <a-button type="primary" style="margin-left: 90%; margin-bottom: 5px" @click="tableAdd">
|
|
|
+ <template #icon><plus-outlined /></template>新增
|
|
|
+ </a-button>
|
|
|
+ <a-table
|
|
|
+ ref="tableRef"
|
|
|
+ bordered
|
|
|
+ :columns="columns"
|
|
|
+ :data-source="formData.loadData"
|
|
|
+ :row-key="(record) => record.startTime"
|
|
|
+ :pagination="false"
|
|
|
+ >
|
|
|
+ <template #headerCell="{ column }">
|
|
|
+ <template v-if="column.dataIndex === 'startTime'">
|
|
|
+ <text style="color: #e74032"> * </text>开始时间
|
|
|
+ </template>
|
|
|
+ <template v-if="column.dataIndex === 'endTime'">
|
|
|
+ <text style="color: #e74032"> * </text>结束时间
|
|
|
+ </template>
|
|
|
+ <template v-if="column.dataIndex === 'name'"> <text style="color: #e74032"> * </text>姓名 </template>
|
|
|
+ <template v-if="column.dataIndex === 'remindType'">
|
|
|
+ <text style="color: #e74032"> * </text>提醒方式
|
|
|
+ </template>
|
|
|
+ <template v-if="column.dataIndex === 'level'"> <text style="color: #e74032"> * </text>级别 </template>
|
|
|
+ <template v-if="column.dataIndex === 'phone'">
|
|
|
+ <text style="color: #e74032"> * </text>电话号码
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ <template #bodyCell="{ column, record, index }">
|
|
|
+ <!-- 表格内容 -->
|
|
|
+ <template v-if="column.dataIndex === 'startTime'">
|
|
|
+ <a-time-picker v-model:value="record.startTime" value-format="HH:mm:ss" style="width: 100%" />
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-if="column.dataIndex === 'endTime'">
|
|
|
+ <a-time-picker v-model:value="record.endTime" value-format="HH:mm:ss" style="width: 100%" />
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-if="column.dataIndex === 'name'">
|
|
|
+ <a-input v-model:value="record.name" placeholder="请输入姓名" />
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-if="column.dataIndex === 'remindType'">
|
|
|
+ <a-select v-model:value="record.remindType" placeholder="请选择提醒方式" style="width: 100%">
|
|
|
+ <a-select-option value="1">短信报警</a-select-option>
|
|
|
+ <a-select-option value="2">电话报警</a-select-option>
|
|
|
+ <a-select-option value="3">微信公众号报警</a-select-option>
|
|
|
+ <a-select-option value="4">邮件报警</a-select-option>
|
|
|
+ <a-select-option value="5">弹出报警</a-select-option>
|
|
|
+ <a-select-option value="6">音乐报警</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-if="column.dataIndex === 'level'">
|
|
|
+ <a-select v-model:value="record.level" placeholder="请选择级别" style="width: 100px">
|
|
|
+ <a-select-option value="1">1</a-select-option>
|
|
|
+ <a-select-option value="2">2</a-select-option>
|
|
|
+ <a-select-option value="3">3</a-select-option>
|
|
|
+ <a-select-option value="4">4</a-select-option>
|
|
|
+ <a-select-option value="5">5</a-select-option>
|
|
|
+ </a-select>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-if="column.dataIndex === 'phone'">
|
|
|
+ <a-input v-model:value="record.phone" placeholder="请输入电话号码" />
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-if="column.dataIndex === 'action'">
|
|
|
+ <a-popconfirm title="确定要删除吗?" @confirm="tableDelete(record, index)">
|
|
|
+ <a-button type="link" danger size="small">删除</a-button>
|
|
|
+ </a-popconfirm>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </a-table>
|
|
|
+ </div>
|
|
|
+ </a-tab-pane>
|
|
|
+
|
|
|
+ <a-tab-pane v-for="pane in panes" :key="pane.key" :tab="pane.title" :closable="pane.closable">
|
|
|
+ <!-- 新增监控点-->
|
|
|
+ <div v-for="(item, index) in formData.list" :key="index">
|
|
|
+ <a-row :gutter="10" v-if="activeKey == item.key">
|
|
|
+ <a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
|
|
|
+ <a-form-item label="采集设备">
|
|
|
+ <a-input v-model:value="item.device" placeholder="请输入采集设备" allow-clear />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
|
|
|
+ <a-form-item label="传感器路数">
|
|
|
+ <a-input v-model:value="item.number" placeholder="请输入传感器路数" allow-clear />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
|
|
|
+ <a-form-item label="监控点名称">
|
|
|
+ <a-input v-model:value="item.paneName" placeholder="请输入监控点名称" allow-clear />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
|
|
|
+ <a-form-item label="采集值1上限">
|
|
|
+ <a-input v-model:value="item.upper" placeholder="请输入采集值1上限" allow-clear />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
|
|
|
+ <a-form-item label="采集值1下限">
|
|
|
+ <a-input v-model:value="item.lower" placeholder="请输入采集值1下限" allow-clear />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ <a-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12">
|
|
|
+ <a-form-item
|
|
|
+ label="正常采集间隔(分钟)"
|
|
|
+ :label-col="{ style: { width: '130px', justifyContent: 'end' } }"
|
|
|
+ >
|
|
|
+ <a-input v-model:value="item.interval" placeholder="请输入正常采集间隔" allow-clear />
|
|
|
+ </a-form-item>
|
|
|
+ </a-col>
|
|
|
+ </a-row>
|
|
|
+ </div>
|
|
|
+ </a-tab-pane>
|
|
|
+ </a-tabs>
|
|
|
+ </a-form>
|
|
|
+
|
|
|
+ <template #footer>
|
|
|
+ <a-button class="xn-mr8" @click="onClose">退出</a-button>
|
|
|
+ <a-button type="primary" @click="onSubmit">保存</a-button>
|
|
|
+ </template>
|
|
|
+ </xn-form-container>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+ import { message } from 'ant-design-vue'
|
|
|
+ import { required } from '@/utils/formRules'
|
|
|
+ import setupApi from '@/api/basicset/setupApi'
|
|
|
+ // 默认是关闭状态
|
|
|
+ const visible = ref(false)
|
|
|
+ const emit = defineEmits({ successful: null })
|
|
|
+ const formRef = ref()
|
|
|
+
|
|
|
+ const tableRef = ref()
|
|
|
+
|
|
|
+ const columns = [
|
|
|
+ {
|
|
|
+ title: '开始时间',
|
|
|
+ dataIndex: 'startTime',
|
|
|
+ align: 'center'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '结束时间',
|
|
|
+ dataIndex: 'endTime',
|
|
|
+ align: 'center'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '姓名',
|
|
|
+ dataIndex: 'name',
|
|
|
+ align: 'center'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '提醒方式',
|
|
|
+ dataIndex: 'remindType',
|
|
|
+ align: 'center'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '级别',
|
|
|
+ dataIndex: 'level',
|
|
|
+ align: 'center'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '电话号码',
|
|
|
+ dataIndex: 'phone',
|
|
|
+ align: 'center'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: '操作',
|
|
|
+ dataIndex: 'action',
|
|
|
+ align: 'center',
|
|
|
+ scopedSlots: { customRender: 'action' }
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ // 表单数据
|
|
|
+ const formData = ref({
|
|
|
+ repeat: '1',
|
|
|
+ delayed: '0',
|
|
|
+ close: '0',
|
|
|
+ multistage: '0',
|
|
|
+ noticeway: ['1'],
|
|
|
+ loadData: [],
|
|
|
+ list: []
|
|
|
+ })
|
|
|
+ // 默认要校验的
|
|
|
+ const formRules = {
|
|
|
+ name: [required('请输入对象名称')],
|
|
|
+ type: [required('请选择对象类型')],
|
|
|
+ brand: [required('请输入品牌')],
|
|
|
+ xh: [required('请输入型号')],
|
|
|
+ division: [required('请输入所属部门')],
|
|
|
+ state: [required('请选择对象状态')]
|
|
|
+ }
|
|
|
+
|
|
|
+ // 打开抽屉
|
|
|
+ const onOpen = (record) => {
|
|
|
+ visible.value = true
|
|
|
+ activeKey.value = 'object'
|
|
|
+ panes.value = []
|
|
|
+ newTabIndex.value = 1
|
|
|
+ if (record) {
|
|
|
+ formData.value = Object.assign({}, record)
|
|
|
+ } else {
|
|
|
+ formData.value = {
|
|
|
+ repeat: '1',
|
|
|
+ delayed: '0',
|
|
|
+ close: '0',
|
|
|
+ multistage: '0',
|
|
|
+ noticeway: ['1'],
|
|
|
+ loadData: [],
|
|
|
+ list: []
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 关闭抽屉
|
|
|
+ const onClose = () => {
|
|
|
+ formRef.value.resetFields()
|
|
|
+ visible.value = false
|
|
|
+ }
|
|
|
+
|
|
|
+ // 表格添加一行空数据
|
|
|
+ const tableAdd = () => {
|
|
|
+ const newRow = {
|
|
|
+ startTime: '00:00:00',
|
|
|
+ endTime: '23:59:59',
|
|
|
+ name: '',
|
|
|
+ level: '',
|
|
|
+ phone: ''
|
|
|
+ }
|
|
|
+ formData.value.loadData.push(newRow)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除某一行
|
|
|
+ const tableDelete = (record, index) => {
|
|
|
+ formData.value.loadData.splice(index, 1)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证并提交数据
|
|
|
+ const onSubmit = () => {
|
|
|
+ formRef.value
|
|
|
+ .validate()
|
|
|
+ .then(() => {
|
|
|
+ // 校验表格信息里面的表单是否有空数据
|
|
|
+ for (let i = 0; i < formData.value.loadData.length; i++) {
|
|
|
+ if (
|
|
|
+ !formData.value.loadData[i].startTime ||
|
|
|
+ !formData.value.loadData[i].endTime ||
|
|
|
+ !formData.value.loadData[i].name ||
|
|
|
+ !formData.value.loadData[i].remindType ||
|
|
|
+ !formData.value.loadData[i].level ||
|
|
|
+ !formData.value.loadData[i].phone
|
|
|
+ ) {
|
|
|
+ console.log(i, 'xxxxxx')
|
|
|
+
|
|
|
+ message.warning(`请完善表格中的必填项`)
|
|
|
+ } else {
|
|
|
+ console.log(formData.value.list, '提交数据')
|
|
|
+ // setupApi.submitForm(formData.value, formData.value.id).then(() => {
|
|
|
+ // onClose()
|
|
|
+ // emit('successful')
|
|
|
+ // })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .catch((error) => {
|
|
|
+ console.log(error)
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ // 新增或删除监控点
|
|
|
+ const onEdit = (targetKey, action) => {
|
|
|
+ if (action === 'add') {
|
|
|
+ add()
|
|
|
+ } else {
|
|
|
+ remove(targetKey)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const activeKey = ref('object') //选中的tabs
|
|
|
+ const panes = ref([]) //tabs数组
|
|
|
+ const newTabIndex = ref(1)
|
|
|
+ // 添加tabs
|
|
|
+ const add = () => {
|
|
|
+ const newIndex = newTabIndex.value++
|
|
|
+ if (panes.value.length >= 5) return //最多只能5个监控点
|
|
|
+ panes.value.push({
|
|
|
+ title: `监控点${newIndex}`,
|
|
|
+ key: newIndex
|
|
|
+ })
|
|
|
+
|
|
|
+ formData.value.list.push({
|
|
|
+ title: `监控点${newIndex}`,
|
|
|
+ paneName: `监控点${newIndex}`,
|
|
|
+ key: newIndex,
|
|
|
+ interval: 10,
|
|
|
+ upper: 100,
|
|
|
+ lower: -100
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除tabs
|
|
|
+ const remove = (targetKey) => {
|
|
|
+ let lastIndex = 0
|
|
|
+ panes.value.forEach((pane, i) => {
|
|
|
+ if (pane.key === targetKey) {
|
|
|
+ lastIndex = i - 1
|
|
|
+ }
|
|
|
+ })
|
|
|
+ panes.value = panes.value.filter((pane) => pane.key !== targetKey)
|
|
|
+ if (panes.value.length && activeKey.value === targetKey) {
|
|
|
+ if (lastIndex >= 0) {
|
|
|
+ activeKey.value = panes.value[lastIndex].key
|
|
|
+ } else {
|
|
|
+ activeKey.value = panes.value[0].key
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (panes.value.length == 0) {
|
|
|
+ activeKey.value = 'object'
|
|
|
+ }
|
|
|
+
|
|
|
+ formData.value.list = formData.value.list.filter((item) => item.key !== targetKey) //删除表单
|
|
|
+ }
|
|
|
+
|
|
|
+ // 调用这个函数将子组件的一些数据和方法暴露出去
|
|
|
+ defineExpose({
|
|
|
+ onOpen
|
|
|
+ })
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="less" scoped>
|
|
|
+ .ant-tabs {
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+ :deep(.ant-col) {
|
|
|
+ margin-bottom: 10px;
|
|
|
+ }
|
|
|
+</style>
|