| | |
| | | plain |
| | | @click="handleImport" |
| | | v-hasPermi="['data:channel-http-tag:import']"> |
| | | <Icon icon="ep:upload" /> 导入 |
| | | <Icon icon="ep:upload"/> |
| | | 导入 |
| | | </el-button> |
| | | <el-button |
| | | type="success" |
| | |
| | | @click="handleExport" |
| | | :loading="exportLoading" |
| | | v-hasPermi="['data:channel-http-tag:export']"> |
| | | <Icon icon="ep:download" />导出 |
| | | <Icon icon="ep:download"/> |
| | | 导出 |
| | | </el-button> |
| | | </el-form-item> |
| | | <el-form-item label="更新当前值" label-width="100px"> |
| | | <el-switch |
| | | v-model="queryParams.currentValue" |
| | | active-color="#13ce66" |
| | | inactive-color="#ff4949"/> |
| | | </el-form-item> |
| | | </el-form> |
| | | </ContentWrap> |
| | |
| | | <template #default="scope"> |
| | | <el-tag v-if="scope.row.enabled === 1" size="small">是</el-tag> |
| | | <el-tag v-else size="small" type="danger">否</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="dataValue" |
| | | label="数据值" |
| | | header-align="center" |
| | | align="center" |
| | | :formatter="(row) => {if (row.dataValue === -2.0) {return '--';}return row.dataValue;}" |
| | | /> |
| | | <el-table-column |
| | | prop="quality" |
| | | label="数据质量" |
| | | header-align="center" |
| | | align="center" |
| | | > |
| | | <template #default="scope"> |
| | | <el-tag v-if="scope.row.dataValue === Number(-2.0)" type="danger" size="small">bad |
| | | </el-tag> |
| | | <el-tag v-else size="small">good</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" min-width="110" fixed="right"> |
| | |
| | | import TagForm from './TagForm.vue' |
| | | import download from "@/utils/download"; |
| | | import {ref} from "vue"; |
| | | import {onBeforeUnmount, onMounted} from "vue"; |
| | | import TagImportForm from '../../../common/tag/TagImportForm.vue' |
| | | |
| | | defineOptions({name: 'HttpTag'}) |
| | |
| | | pageSize: 10, |
| | | apiId: undefined, |
| | | tagName: undefined, |
| | | httpName: undefined |
| | | httpName: undefined, |
| | | currentValue:false, |
| | | }) |
| | | const queryFormRef = ref() // 搜索的表单 |
| | | const exportLoading = ref(false) // 导出的加载中 |
| | |
| | | |
| | | /** TAG操作 */ |
| | | const tagRef = ref() |
| | | const openTagList = (name?: string) => { |
| | | tagRef.value.open(name) |
| | | const openTagList = (id?: string,name?: string) => { |
| | | tagRef.value.open(id,name) |
| | | } |
| | | |
| | | /** 删除按钮操作 */ |
| | |
| | | <Icon icon="ep:download" />导出 |
| | | </el-button> |
| | | </el-form-item> |
| | | <el-form-item label="更新当前值" label-width="100px"> |
| | | <el-switch |
| | | v-model="queryParams.currentValue" |
| | | active-color="#13ce66" |
| | | inactive-color="#ff4949"/> |
| | | </el-form-item> |
| | | </el-form> |
| | | </ContentWrap> |
| | | <!-- 列表 --> |
| | |
| | | <template #default="scope"> |
| | | <el-tag v-if="scope.row.enabled === 1" size="small">是</el-tag> |
| | | <el-tag v-else size="small" type="danger">否</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="dataValue" |
| | | label="数据值" |
| | | header-align="center" |
| | | align="center" |
| | | :formatter="(row) => {if (row.dataValue === -2.0) {return '--';}return row.dataValue;}" |
| | | /> |
| | | <el-table-column |
| | | prop="quality" |
| | | label="数据质量" |
| | | header-align="center" |
| | | align="center" |
| | | > |
| | | <template #default="scope"> |
| | | <el-tag v-if="scope.row.dataValue === Number(-2.0)" type="danger" size="small">bad</el-tag> |
| | | <el-tag v-else size="small">good</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" min-width="110" fixed="right"> |
| | |
| | | import * as KioTagApi from "@/api/data/channel/kio/tag"; |
| | | import TagForm from './TagForm.vue' |
| | | import download from "@/utils/download"; |
| | | import {ref} from "vue"; |
| | | import TagImportForm from '../../common/tag/TagImportForm.vue' |
| | | import {ref, onBeforeUnmount, onMounted} from "vue"; |
| | | import * as HttpTagApi from "@/api/data/channel/http/tag"; |
| | | |
| | | defineOptions({name: 'KioTag'}) |
| | | |
| | |
| | | pageNo: 1, |
| | | pageSize: 10, |
| | | device: undefined, |
| | | deviceId: undefined, |
| | | currentValue:false, |
| | | tagName: undefined |
| | | }) |
| | | const queryFormRef = ref() // 搜索的表单 |
| | |
| | | } |
| | | |
| | | /** 打开弹窗 */ |
| | | const open = async (device?: string) => { |
| | | const open = async (deviceId?: string,device?: string) => { |
| | | resetForm() |
| | | drawer.value = true |
| | | queryParams.device = device |
| | | queryParams.deviceId = deviceId |
| | | if (device) { |
| | | getList() |
| | | } |
| | |
| | | exportLoading.value = false |
| | | } |
| | | } |
| | | |
| | | let intervalId; |
| | | |
| | | onMounted(async () => { |
| | | // 创建定时器 |
| | | intervalId = setInterval(async () => { |
| | | if(queryParams.currentValue){ |
| | | const page = await KioTagApi.getKioTagPage(queryParams) |
| | | list.value = page.list |
| | | total.value = page.total |
| | | } |
| | | }, 10000); |
| | | }); |
| | | |
| | | // 在组件卸载时清除定时器 |
| | | onBeforeUnmount(() => { |
| | | if (intervalId) { |
| | | clearInterval(intervalId); |
| | | } |
| | | }); |
| | | </script> |
| | |
| | | <el-button |
| | | link |
| | | type="primary" |
| | | @click="openTagList(scope.row.name)" |
| | | @click="openTagList(scope.row.id,scope.row.name)" |
| | | v-hasPermi="['data:channel-modbus:update']" |
| | | > |
| | | TAG |
| | |
| | | |
| | | /** TAG操作 */ |
| | | const tagRef = ref() |
| | | const openTagList = (name?: string) => { |
| | | tagRef.value.open(name) |
| | | const openTagList = (id?: string,name?: string) => { |
| | | tagRef.value.open(id,name) |
| | | } |
| | | |
| | | /** 删除按钮操作 */ |
| | |
| | | plain |
| | | @click="handleImport" |
| | | v-hasPermi="['data:channel-modbus-tag:import']"> |
| | | <Icon icon="ep:upload" /> 导入 |
| | | <Icon icon="ep:upload"/> |
| | | 导入 |
| | | </el-button> |
| | | <el-button |
| | | type="success" |
| | |
| | | @click="handleExport" |
| | | :loading="exportLoading" |
| | | v-hasPermi="['data:channel-modbus-tag:export']"> |
| | | <Icon icon="ep:download" />导出 |
| | | <Icon icon="ep:download"/> |
| | | 导出 |
| | | </el-button> |
| | | </el-form-item> |
| | | <el-form-item label="更新当前值" label-width="100px"> |
| | | <el-switch |
| | | v-model="queryParams.currentValue" |
| | | active-color="#13ce66" |
| | | inactive-color="#ff4949"/> |
| | | </el-form-item> |
| | | </el-form> |
| | | </ContentWrap> |
| | |
| | | <el-tag v-else size="small" type="danger">否</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="dataValue" |
| | | label="数据值" |
| | | header-align="center" |
| | | align="center" |
| | | :formatter="(row) => {if (row.dataValue === -2.0) {return '--';}return row.dataValue;}" |
| | | /> |
| | | <el-table-column |
| | | prop="quality" |
| | | label="数据质量" |
| | | header-align="center" |
| | | align="center" |
| | | > |
| | | <template #default="scope"> |
| | | <el-tag v-if="scope.row.dataValue === Number(-2.0)" type="danger" size="small">bad</el-tag> |
| | | <el-tag v-else size="small">good</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" min-width="110" fixed="right"> |
| | | <template #default="scope"> |
| | | <el-button |
| | |
| | | import download from "@/utils/download"; |
| | | import {ref} from "vue"; |
| | | import TagImportForm from '../../common/tag/TagImportForm.vue' |
| | | import {onBeforeUnmount, onMounted} from "vue"; |
| | | import * as HttpTagApi from "@/api/data/channel/http/tag"; |
| | | |
| | | defineOptions({name: 'ModBusTag'}) |
| | | |
| | |
| | | const queryParams = reactive({ |
| | | pageNo: 1, |
| | | pageSize: 10, |
| | | deviceId: undefined, |
| | | device: undefined, |
| | | tagName: undefined, |
| | | currentValue:false, |
| | | address: undefined |
| | | }) |
| | | const queryFormRef = ref() // 搜索的表单 |
| | |
| | | } |
| | | |
| | | /** 打开弹窗 */ |
| | | const open = async (device?: string) => { |
| | | const open = async (deviceId?: string,device?: string) => { |
| | | resetForm() |
| | | drawer.value = true |
| | | queryParams.device = device |
| | | queryParams.deviceId = deviceId |
| | | if (device) { |
| | | getList() |
| | | } |
| | |
| | | exportLoading.value = false |
| | | } |
| | | } |
| | | let intervalId; |
| | | |
| | | onMounted(async () => { |
| | | // 创建定时器 |
| | | intervalId = setInterval(async () => { |
| | | if(queryParams.currentValue){ |
| | | const page = await ModBusTagApi.getModBusTagPage(queryParams) |
| | | list.value = page.list |
| | | total.value = page.total |
| | | } |
| | | }, 10000); |
| | | }); |
| | | |
| | | // 在组件卸载时清除定时器 |
| | | onBeforeUnmount(() => { |
| | | if (intervalId) { |
| | | clearInterval(intervalId); |
| | | } |
| | | }); |
| | | </script> |
| | |
| | | <Icon icon="ep:download" />导出 |
| | | </el-button> |
| | | </el-form-item> |
| | | <el-form-item label="更新当前值" label-width="100px"> |
| | | <el-switch |
| | | v-model="queryParams.currentValue" |
| | | active-color="#13ce66" |
| | | inactive-color="#ff4949"/> |
| | | </el-form-item> |
| | | </el-form> |
| | | </ContentWrap> |
| | | <!-- 列表 --> |
| | |
| | | <template #default="scope"> |
| | | <el-tag v-if="scope.row.enabled === 1" size="small">是</el-tag> |
| | | <el-tag v-else size="small" type="danger">否</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="dataValue" |
| | | label="数据值" |
| | | header-align="center" |
| | | align="center" |
| | | :formatter="(row) => {if (row.dataValue === -2.0) {return '--';}return row.dataValue;}" |
| | | /> |
| | | <el-table-column |
| | | prop="quality" |
| | | label="数据质量" |
| | | header-align="center" |
| | | align="center" |
| | | > |
| | | <template #default="scope"> |
| | | <el-tag v-if="scope.row.dataValue === Number(-2.0)" type="danger" size="small">bad</el-tag> |
| | | <el-tag v-else size="small">good</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" min-width="110" fixed="right"> |
| | |
| | | import download from "@/utils/download"; |
| | | import {ref,reactive} from "vue"; |
| | | import TagImportForm from '../../common/tag/TagImportForm.vue' |
| | | import {onBeforeUnmount, onMounted} from "vue"; |
| | | import * as OpcdaTagApi from "@/api/data/channel/opcda/tag"; |
| | | |
| | | defineOptions({name: 'ModBusTag'}) |
| | | |
| | |
| | | serverId: undefined, |
| | | tagName: undefined, |
| | | serverName: undefined |
| | | currentValue:false, |
| | | }) |
| | | const queryFormRef = ref() // 搜索的表单 |
| | | const exportLoading = ref(false) // 导出的加载中 |
| | | |
| | | /** 查询列表 */ |
| | | const getList = async () => { |
| | | loading.value = true |
| | |
| | | exportLoading.value = false |
| | | } |
| | | } |
| | | let intervalId; |
| | | |
| | | onMounted(async () => { |
| | | // 创建定时器 |
| | | intervalId = setInterval(async () => { |
| | | if(queryParams.currentValue){ |
| | | const page = await OpcdaTagApi.getOpcdaTagPage(queryParams) |
| | | list.value = page.list |
| | | total.value = page.total |
| | | } |
| | | }, 10000); |
| | | }); |
| | | |
| | | // 在组件卸载时清除定时器 |
| | | onBeforeUnmount(() => { |
| | | if (intervalId) { |
| | | clearInterval(intervalId); |
| | | } |
| | | }); |
| | | </script> |
| | |
| | | <el-tag v-else size="small" type="danger">否</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="dataValue" |
| | | label="数据值" |
| | | header-align="center" |
| | | align="center" |
| | | :formatter="(row) => {if (row.dataValue === -2.0) {return '--';}return row.dataValue;}" |
| | | /> |
| | | <el-table-column |
| | | prop="quality" |
| | | label="数据质量" |
| | | header-align="center" |
| | | align="center" |
| | | > |
| | | <template #default="scope"> |
| | | <el-tag v-if="scope.row.dataValue === Number(-2.0)" type="danger" size="small">bad</el-tag> |
| | | <el-tag v-else size="small">good</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" min-width="110" fixed="right"> |
| | | <template #default="scope"> |
| | | <el-button |
| | |
| | | pageNo: 1, |
| | | pageSize: 10, |
| | | device: undefined, |
| | | deviceId: undefined, |
| | | tagName: undefined, |
| | | address: undefined |
| | | }) |
| | |
| | | } |
| | | |
| | | /** 打开弹窗 */ |
| | | const open = async (device?: string) => { |
| | | const open = async (deviceId?: string,device?: string) => { |
| | | resetForm() |
| | | drawer.value = true |
| | | queryParams.device = device |
| | | queryParams.deviceId = deviceId |
| | | if (device) { |
| | | getList() |
| | | } |
| | |
| | | :model="dataForm" |
| | | @keydown.enter="getDataList()" |
| | | > |
| | | <el-form-item> |
| | | <el-form-item label="开始时间"> |
| | | <el-date-picker |
| | | size="mini" |
| | | v-model="dataForm.startTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择日期时间" |
| | | /> |
| | | :clearable="false" |
| | | placeholder="选择日期时间"/> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-form-item label="结束时间"> |
| | | <el-date-picker |
| | | size="mini" |
| | | v-model="dataForm.endTime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="选择日期时间" |
| | | /> |
| | | :clearable="false" |
| | | placeholder="选择日期时间"/> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button @click="getDataList()">查询</el-button> |
| | |
| | | import {ref} from 'vue'; |
| | | import * as echarts from 'echarts'; |
| | | import * as DaPoint from '@/api/data/da/point/daPointChart' |
| | | import {getYMDHMS} from "@/utils/dateUtil" |
| | | import download from "@/utils/download"; |
| | | const message = useMessage() // 消息弹窗 |
| | | const visible = ref(false); |
| | | const chartDom = ref(null); |
| | | let myChart = null; |
| | | const dataForm = ref({ |
| | | id: "", |
| | | pointNo: "", |
| | | pointName: "", |
| | | pointTypeName: "", |
| | | startTime: getYMDHMS(), |
| | | endTime: undefined, |
| | | }); |
| | | const queryParams = reactive({ |
| | | codes: [], |
| | | startDate: undefined, |
| | | endDate: undefined, |
| | | }) |
| | | function getYMDHMS() { |
| | | let timestamp = new Date().getTime(); |
| | | let time = new Date(timestamp - 1000 * 60 * 30); |
| | | let year = time.getFullYear(); |
| | | let month = (time.getMonth() + 1).toString(); |
| | | let date = time.getDate().toString(); |
| | | let hours = time.getHours().toString(); |
| | | let minute = time.getMinutes().toString(); |
| | | const chartParams = reactive({ |
| | | pointNos:[], |
| | | start : undefined, |
| | | end : undefined, |
| | | }) |
| | | const dataForm = ref({ |
| | | id: "", |
| | | pointNo: "", |
| | | pointName: "", |
| | | pointTypeName: "", |
| | | startTime: getYMDHMS(new Date() - 1000 * 60 * 60), |
| | | endTime: getYMDHMS(new Date()), |
| | | }); |
| | | |
| | | if (month < 10) { |
| | | month = "0" + month; |
| | | } |
| | | if (date < 10) { |
| | | date = "0" + date; |
| | | } |
| | | if (hours < 10) { |
| | | hours = "0" + hours; |
| | | } |
| | | if (minute < 10) { |
| | | minute = "0" + minute; |
| | | } |
| | | return ( |
| | | year + |
| | | "-" + |
| | | month + |
| | | "-" + |
| | | date + |
| | | " " + |
| | | hours + |
| | | ":" + |
| | | minute + |
| | | ":" + |
| | | "00" |
| | | ); |
| | | } |
| | | /** 打开弹窗 */ |
| | | const open = async (row: object) => { |
| | | visible.value = true |
| | | dataForm.value.id = row.id; |
| | | dataForm.value.pointNo = row.pointNo; |
| | | dataForm.value.pointName = row.pointName; |
| | | dataForm.value.startTime = getYMDHMS(); |
| | | dataForm.value.endTime = ""; |
| | | dataForm.value.startTime = getYMDHMS(new Date(this.dataForm.startTime) - 1000 * 60 * 60); |
| | | dataForm.value.endTime = getYMDHMS(new Date(this.dataForm.endTime) - 1000 * 60 * 60), |
| | | getDataList(); |
| | | } |
| | | |
| | |
| | | if (dataForm.value.id) { |
| | | try { |
| | | queryParams.codes=[dataForm.value.pointNo]; |
| | | queryParams.startDate = dataForm.value.startTime; |
| | | queryParams.endDate = dataForm.value.endTime; |
| | | queryParams.startDate = getYMDHMS(new Date(this.dataForm.startTime) - 1000 * 60 * 60); |
| | | queryParams.endDate = getYMDHMS(new Date(this.dataForm.endTime) - 1000 * 60 * 60); |
| | | const data = await DaPoint.getPointDaChart(queryParams) |
| | | let seriesData = [] |
| | | data.series.forEach(item => { |
| | |
| | | /** 导出按钮操作 */ |
| | | const exportLoading = ref(false) |
| | | const handleExport = async () => { |
| | | queryParams.pointNos=[dataForm.value.pointNo]; |
| | | queryParams.start = dataForm.value.startTime; |
| | | queryParams.end = dataForm.value.endTime; |
| | | chartParams.pointNos=[dataForm.value.pointNo]; |
| | | chartParams.start = dataForm.value.startTime; |
| | | chartParams.end = dataForm.value.endTime; |
| | | try { |
| | | // 导出的二次确认 |
| | | await message.exportConfirm() |