| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794 |
- <template>
- <div class="l-flex--col center has-border radius has-padding">
- <i
- class="o-icon lg u-pointer"
- :class="iconClass"
- @click="invoke"
- />
- <div class="has-padding u-color--black u-bold">
- {{ powerStatusTip }}
- </div>
- <c-dialog
- ref="dialog"
- size="lg"
- title="PDU定时"
- :before-close="handleClose"
- @close="onClose"
- >
- <template #default>
- <tabbar
- :items="tabs"
- :active="active"
- @click="onClickTab"
- >
- <div
- v-if="hasChanged"
- class="u-font-size--sm u-color--error has-padding--h"
- >
- 设置需点击【应用】后生效
- </div>
- </tabbar>
- <div
- v-loading="loading"
- class="l-flex__auto l-flex--col"
- >
- <schema-table
- :key="active"
- ref="table"
- :schema="schema"
- />
- </div>
- </template>
- </c-dialog>
- <pdu-task-dialog
- ref="pduTaskDialog"
- :title="dialogTitle"
- :multi="isAdd"
- @confirm="onSave"
- >
- <template #default>
- <div class="c-grid-form u-align-self--center">
- <template v-if="isAdd">
- <schema-select
- v-model="taskType"
- class="u-width--sm"
- :schema="typeSelectSchema"
- />
- </template>
- <div
- v-else
- class="l-flex--row c-grid-form__option u-color--blue u-bold"
- >
- {{ taskType }}
- </div>
- </div>
- </template>
- </pdu-task-dialog>
- </div>
- </template>
- <script>
- import { mapGetters } from 'vuex'
- import {
- FOREVER, ONE_DAY, ThirdPartyDevice
- } from '@/constant.js'
- import {
- parseTime, transformScreenTaskInfo
- } from '@/utils'
- import {
- addInjectListener,
- addListener,
- GET_PDU_STATUS,
- GET_PDU_TASK,
- removeInjectListener,
- removeListener,
- Status
- } from '@/utils/adapter'
- import { toDate } from '@/utils/event.js'
- import baseMixin from './mixins/base.js'
- import {
- addPduTask, deletePduTask, getPduTasks, submitPduTasks, updatePduTask
- } from '@/api/external'
- /* const ErrorMessage = {
- TIMEOUT: '暂未获取到操作反馈,请回读查看',
- TIMEOUT_RETRY: '暂未获取到操作反馈,请稍后重试',
- DEFAULT: '操作异常,请稍后重试',
- BUSY: '终端被他人占用',
- PASSWORD: '登录密码错误,请联系管理员',
- [GET_PDU_STATUS]: '获取电源状态超时,请稍后重试',
- [GET_PDU_TASK]: '获取定时任务超时,请回读查看'
- } */
- export default {
- name: 'PduPowerSwitch',
- mixins: [baseMixin],
- data () {
- return {
- topic: '/multifunctionCard/invoke',
- powerStatus: Status.LOADING,
- active: GET_PDU_STATUS,
- tabs: [
- { key: GET_PDU_STATUS, name: '电源状态' }
- ],
- powerSchema: {
- props: {
- size: 'small'
- },
- nonPagination: true,
- list: this.getPowers,
- /* buttons: [
- { label: '一键开启', on: this.onSwitchOpen },
- { label: '一键关闭', on: this.onSwitchClose }
- ], */
- cols: [
- { prop: 'slot_no', label: '序号', 'align': 'center' },
- { prop: 'name', label: '电源端口', 'align': 'center' },
- { prop: 'state', label: '状态', 'align': 'center' }
- ]
- },
- typeSelectSchema: { options: [] },
- actionInfo: ['开启', '关闭'],
- timingStatus: 0,
- hasChanged: false,
- isAdd: true,
- taskType: ''
- }
- },
- computed: {
- ...mapGetters(['account']),
- powerStatusTip () {
- switch (this.powerStatus) {
- case Status.OK:
- return 'PDU定时'
- default:
- return '检测PDU中'
- }
- },
- iconClass () {
- return this.powerStatus === Status.OK ? 'ok' : ''
- },
- loading () {
- return this.active !== GET_PDU_STATUS && !this.timingStatus
- },
- schema () {
- switch (this.active) {
- case GET_PDU_STATUS:
- return this.powerSchema
- case GET_PDU_TASK:
- return this.taskSchema
- default:
- return null
- }
- },
- taskSchema () {
- return {
- props: {
- size: 'small'
- },
- nonPagination: true,
- list: () =>
- // 传递 device.id 作为参数
- // eslint-disable-next-line implicit-arrow-linebreak
- getPduTasks({ deviceId: this.device.id })
- .then(result => {
- // 在接口调用结束后结束 loading
- this.timingStatus = 1
- return result
- })
- .catch(error => {
- // 处理错误情况也要结束 loading
- this.timingStatus = 1
- throw error
- }),
- buttons: [
- { type: 'add', label: '新增', on: this.onAdd },
- { label: '应用', render: () => this.hasChanged, on: this.onSubmitPowerTasks }
- ].filter(Boolean),
- filters: [].filter(Boolean),
- cols: [
- {
- prop: 'slotNo',
- label: '插座序号',
- align: 'center',
- render: task => task.slotNo || '-'
- },
- {
- prop: 'startDate',
- label: '开始日期',
- render: ({ startDate }) => startDate ? startDate.split(' ')[0] : '-'
- },
- {
- prop: 'endDate',
- label: '结束日期',
- render: ({ endDate }) => endDate ? endDate.split(' ')[0] : '-'
- },
- {
- label: '开屏时间',
- align: 'center',
- render: ({ powerOnTime }) => powerOnTime || '-',
- 'show-overflow-tooltip': false
- },
- {
- label: '关屏时间',
- align: 'center',
- render: ({ powerOffTime }) => powerOffTime || '-',
- 'show-overflow-tooltip': false
- },
- {
- type: 'tag', render: task => this.isExpired(task)
- ? { type: 'warning', label: '已过期' }
- : task.status === 1
- ? { type: 'success', label: '启用' }
- : { type: 'danger', label: '停用' }
- },
- {
- type: 'invoke',
- render: [
- { label: ({ status }) => status === 1 ? '停用' : '启用', on: this.onToggle },
- { label: '编辑', on: this.onEdit },
- { label: '删除', on: this.onDel }
- ],
- width: 140
- }
- ]
- }
- },
- dialogTitle () {
- return this.isAdd ? '新增定时任务' : '编辑定时任务'
- }
- },
- mounted () {
- addListener(this.device.id, this.onCacheMessage)
- addInjectListener(this.device.id, this.onMessage)
- },
- beforeDestroy () {
- this.$openDialog = false
- removeListener(this.device.id, this.onCacheMessage)
- removeInjectListener(this.device.id, this.onMessage)
- },
- methods: {
- isExpired ({ endDate }) {
- // 如果是 FOREVER 常量,则永不过期
- if (endDate === FOREVER) {
- return false
- }
- // 从日期字符串中提取日期部分
- const dateStr = typeof endDate === 'string' ? endDate.split(' ')[0] : endDate
- // 判断是否过期
- return toDate(`${dateStr} 00:00:00`) <= Date.now() - ONE_DAY
- },
- handleClose (done) {
- if (this.hasChanged) {
- this.$confirm(
- '设置未保存,是否放弃修改?<p class="u-color--error">若需保存请点击【应用】</p>',
- '温馨提示',
- {
- dangerouslyUseHTMLString: true,
- type: 'warning',
- confirmButtonText: '放弃'
- }
- )
- .then(() => {
- this.$openDialog = false
- done()
- })
- return
- }
- this.$openDialog = false
- done()
- },
- onClickTab (val) {
- if (this.hasChanged) {
- this.$confirm(
- '设置未保存,是否放弃修改?<p class="u-color--error">若需保存请点击【应用】</p>',
- '温馨提示',
- {
- dangerouslyUseHTMLString: true,
- type: 'warning',
- confirmButtonText: '放弃'
- }
- )
- .then(() => {
- this.hasChanged = false
- this.onClickTab(val)
- })
- return
- }
- if (val !== GET_PDU_STATUS && (val !== this.active || !this.timingStatus)) {
- this.getTasksByKey(val)
- }
- this.active = val
- },
- invoke () {
- if (this.powerStatus !== Status.OK) {
- this.$message({
- type: 'warning',
- message: '获取PDU信息中,请稍后尝试'
- })
- return
- }
- this.$openDialog = true
- this.getPowerStatus()
- },
- onCacheMessage (value) {
- try {
- console.log('cache message', value)
- const pdu = value[ThirdPartyDevice.PDU]
- const socket = pdu[0]
- const pduStatus = socket.state
- this.$pdu = pdu
- console.log('pdu schedule socket', socket)
- if (pduStatus === 'ON' || pduStatus === 'OFF') {
- this.powerStatus = Status.OK
- } else {
- this.powerStatus = Status.LOADING
- }
- } catch (e) {
- console.log('cache pdu message error', e)
- }
- },
- /* fetchPowerStatus () {
- this.sendTopic(
- GET_PDU_STATUS,
- JSON.stringify({ sn: this.device.serialNumber }),
- true
- )
- }, */
- onMessage (message) {
- console.log('on message', message)
- },
- onClose () {
- this.$powers = []
- this.$taskPorts = []
- this.$tasks = []
- this.closeAsyncLoading()
- },
- getPowerStatus () {
- this.$powers = []
- this.hasChanged = false
- console.log('this.$pdu', this.$pdu)
- this.setCachePowerStatus(this.$pdu)
- if (this.$openDialog) {
- this.$refs.dialog?.show()
- }
- this.$refs.table?.pageTo(1)
- },
- setCachePowerStatus (powersData) {
- const map = {}
- const options = []
- console.log('powersData', powersData)
- // 将对象转换为数组
- let powersArray = []
- if (powersData && typeof powersData === 'object' && !Array.isArray(powersData)) {
- // 提取数字键的值组成数组
- powersArray = Object.keys(powersData)
- .filter(key => key !== 'timestamp')
- .map(key => powersData[key])
- } else if (Array.isArray(powersData)) {
- powersArray = powersData
- }
- console.log('powersArray', powersArray)
- if (powersArray.length === 0) {
- return
- }
- const timestamp = parseTime(new Date(), '{y}-{m}-{d} {h}:{i}:{s}')
- this.$powers = [{
- connectIndex: powersArray[0].slot_no,
- portIndex: powersArray[0].slot_no,
- powers: powersArray.map(power => {
- const { connectIndex, portIndex, type } = power
- if (type) {
- if (!map[type]) {
- map[type] = {
- connectIndex,
- portIndex,
- type
- }
- options.push({
- value: type,
- label: type
- })
- }
- }
- return {
- timestamp,
- ...power
- }
- })
- }]
- this.tabs = [
- { key: GET_PDU_STATUS, name: '电源状态' },
- { key: GET_PDU_TASK, name: '定时控制' }
- ]
- this.$typeMap = map
- this.typeSelectSchema = { options }
- this.$refs.table?.pageTo(1)
- },
- getPowers () {
- const data = []
- this.$powers.forEach(({ powers }) => {
- powers.forEach(power => {
- data.push(power)
- })
- })
- return Promise.resolve({ data })
- },
- /* onSwitchPower (power) {
- const { powerIndex, type, action } = power
- const targetAction = action ^ 1
- this.$confirm(
- `立即${this.actionInfo[targetAction]}电源 ${powerIndex} ${type}?<p class="u-color--blue">确认操作后请等待数据同步</p>`,
- '操作确认',
- {
- dangerouslyUseHTMLString: true,
- type: 'warning'
- }
- )
- .then(() => {
- savePowerLogger({
- description: `手动${this.actionInfo[targetAction]} 设备【${this.device.name}】 ${type} 端口${powerIndex}`,
- method: `${this.actionInfo[targetAction]}电源`,
- params: `${this.device.id} ${this.device.name}`
- })
- sendDeviceAlarm({
- deviceId: this.device.id,
- errorEnumId: targetAction ? 36 : 37,
- message: `用户【${this.account}】 手动${this.actionInfo[targetAction]} ${type} 端口${powerIndex}`
- })
- this.onSwitchPowerSingle(power)
- })
- }, */
- /* onSwitchPowerSingle (power) {
- const { connectIndex, portIndex, powerIndex, type } = power
- this.sendTopic(
- SET_POWER_STATUS,
- JSON.stringify({
- sn: this.device.serialNumber,
- info: {
- data: [{
- connectIndex, portIndex,
- conditions: this.$powers
- .find(item => item.portIndex === portIndex)
- .powers
- .filter(power => power.type === type)
- .map(power => {
- return {
- type,
- powerIndex: power.powerIndex,
- action: power.powerIndex === powerIndex ? power.action ^ 1 : power.action
- }
- })
- }]
- }
- }),
- this.getPowerStatus
- )
- }, */
- /* onSwitchTypePower (power) {
- const { type, action } = power
- const targetAction = action ^ 1
- this.$confirm(
- `立即${this.actionInfo[targetAction]}电源 ${type}?<p class="u-color--blue">确认操作后请等待数据同步</p>`,
- '操作确认',
- {
- dangerouslyUseHTMLString: true,
- type: 'warning'
- }
- ).then(() => {
- savePowerLogger({
- description: `手动${this.actionInfo[targetAction]} 设备【${this.device.name}】 ${type}`,
- method: `${this.actionInfo[targetAction]}电源`,
- params: `${this.device.id} ${this.device.name}`
- })
- sendDeviceAlarm({
- deviceId: this.device.id,
- errorEnumId: targetAction ? 36 : 37,
- message: `用户【${this.account}】 手动${this.actionInfo[targetAction]} ${type}`
- })
- this.onSwitchPowerMulti(power)
- })
- }, */
- /* onSwitchPowerMulti (power) {
- const { connectIndex, portIndex, type } = power
- const action = power.action ^ 1
- this.sendTopic(
- SET_POWER_STATUS,
- JSON.stringify({
- sn: this.device.serialNumber,
- info: {
- data: [{
- connectIndex, portIndex,
- conditions: [{
- powerIndex: 0,
- type,
- action
- }]
- }]
- }
- }),
- this.getPowerStatus
- )
- }, */
- /* onSwitchOpen () {
- this.onSwitch(PowerStatus.OPEN)
- }, */
- /* onSwitchClose () {
- this.onSwitch(PowerStatus.CLOSE)
- }, */
- /* onSwitch (action) {
- if (!this.$powers.length) {
- return
- }
- this.$confirm(
- `立即${this.actionInfo[action]}所有电源?<p class="u-color--blue">确认操作后请等待数据同步</p>`,
- '操作确认',
- {
- dangerouslyUseHTMLString: true,
- type: 'warning'
- }
- ).then(() => {
- savePowerLogger({
- description: `手动${this.actionInfo[action]} 设备【${this.device.name}】 所有电源`,
- method: `${this.actionInfo[action]}电源`,
- params: `${this.device.id} ${this.device.name}`
- })
- sendDeviceAlarm({
- deviceId: this.device.id,
- errorEnumId: action ? 36 : 37,
- message: `用户【${this.account}】 手动${this.actionInfo[action]} 所有电源`
- })
- this.sendTopic(
- SET_POWER_STATUS,
- JSON.stringify({
- sn: this.device.serialNumber,
- info: {
- data: this.$powers.map(({ connectIndex, portIndex, powers }) => {
- return {
- connectIndex, portIndex,
- conditions: powers.map(({ powerIndex, type }) => {
- return { powerIndex, type, action }
- })
- }
- })
- }
- }),
- this.getPowerStatus
- )
- })
- }, */
- getTasksByKey () {
- this.timingStatus = 0
- this.hasChanged = false
- this.$taskPorts = []
- this.$tasks = []
- this.$refs.table?.pageTo(1)
- /* this.sendTopic(
- key,
- JSON.stringify({ sn: this.device.serialNumber }),
- true
- ) */
- },
- getPowerTasks () {
- this.getTasksByKey(this.active)
- },
- setMultiPowerTasks (data) {
- console.log('GET_PDU_TASK', data)
- const tasks = []
- const ports = []
- const map = {}
- data.forEach(({ connectIndex, portIndex, conditions }) => {
- ports.push({ connectIndex, portIndex })
- conditions.forEach(task => {
- if (task.flag) {
- const flagArr = `${task.flag}`.split('_')
- const flag = flagArr.length > 2 ? `${flagArr[0]}_${flagArr[1]}` : task.flag
- if (!map[flag]) {
- tasks.push(map[flag] = {
- connectIndex, portIndex, flag,
- ...this.transfromDataToTask(task)
- })
- }
- if (flagArr.length > 2) {
- map[flag].executeTime[flagArr[2]] = {
- ...map[flag].executeTime[flagArr[2]],
- ...this.transformDataToExecuteTime(task)
- }
- } else {
- map[flag].executeTime.push(this.transformDataToExecuteTime(task))
- }
- } else {
- tasks.push({
- connectIndex, portIndex,
- ...this.transfromDataToTask(task)
- })
- }
- })
- })
- this.$tasks = tasks.map(task => {
- task.info = transformScreenTaskInfo(task.startDate, task.endDate, task.dayOfWeek, task.executeTime)
- return task
- })
- this.$taskPorts = ports
- this.timingStatus = 1
- this.$refs.table?.pageTo(1)
- },
- /* transfromDataToTask ({ enable, type, startTime, endTime, cron }) {
- const { dayOfWeek } = transformCron(cron)
- return {
- enable, type, dayOfWeek,
- startDate: startTime,
- endDate: endTime,
- executeTime: []
- }
- }, */
- /* transformDataToExecuteTime ({ action, cron }) {
- return action === PowerStatus.OPEN
- ? { start: transformCron(cron).executeTime }
- : { end: transformCron(cron).executeTime }
- }, */
- onSubmitPowerTasks () {
- const deviceId = this.device.id
- submitPduTasks({ deviceId })
- .then(
- () => {
- this.hasChanged = false
- this.$message({
- type: 'success',
- message: '应用成功'
- })
- }
- )
- },
- /* getMultiPowerTaskData () {
- const map = {}
- const data = []
- this.$taskPorts.forEach(({ connectIndex, portIndex }) => {
- if (!map[portIndex]) {
- data.push(map[portIndex] = {
- connectIndex,
- portIndex,
- enable: true,
- conditions: []
- })
- }
- })
- this.$tasks.forEach(({ connectIndex, portIndex, flag, type, enable, startDate, endDate, dayOfWeek, executeTime }) => {
- if (!map[portIndex]) {
- data.push(map[portIndex] = {
- connectIndex,
- portIndex,
- enable: true,
- conditions: []
- })
- }
- const tasks = []
- executeTime.forEach(({ start, end }, index) => {
- start && tasks.push({
- type,
- enable,
- powerIndex: 0,
- flag: `${flag}_${index}`,
- action: PowerStatus.OPEN,
- startTime: startDate,
- endTime: endDate,
- cron: [transformToCron(startDate, endDate, dayOfWeek, start)]
- })
- end && tasks.push({
- type,
- enable,
- powerIndex: 0,
- flag: `${flag}_${index}`,
- action: PowerStatus.CLOSE,
- startTime: startDate,
- endTime: endDate,
- cron: [transformToCron(startDate, endDate, dayOfWeek, end)]
- })
- })
- map[portIndex].conditions.push(...tasks)
- })
- savePowerLogger({
- description: `设置设备【${this.device.name}】的电源定时任务`,
- method: '电源定时任务设置',
- params: JSON.stringify({
- id: this.device.id,
- name: this.device.name,
- tasks: this.$tasks
- })
- })
- return data.filter(({ conditions }) => conditions.length)
- }, */
- onToggle (task) {
- this.hasChanged = true
- task.enable = task.status === 1
- console.log('task.enable : ', task.enable)
- task.status = task.enable ? 0 : 1
- updatePduTask(task)
- .then(() => {
- getPduTasks({ deviceId: this.device.id })
- this.$refs.table.pageTo(1)
- })
- .finally(() => {
- })
- },
- onAdd () {
- this.isAdd = true
- // this.taskType = this.typeSelectSchema.options[0]?.value
- this.$refs.pduTaskDialog.show()
- },
- onEdit (task) {
- // 创建 executeTime 数组,符合 PduTaskDialog 的期望格式
- const executeTime = []
- // 如果有 powerOnTime 或 powerOffTime,则创建执行时间对象
- if (task.powerOnTime || task.powerOffTime) {
- executeTime.push({
- start: task.powerOnTime || '',
- end: task.powerOffTime || ''
- })
- } else {
- // 如果都没有,则添加一个空的执行时间对象
- executeTime.push({ start: '', end: '' })
- }
- const taskId = task.id
- const { startDate, endDate } = task
- this.isAdd = false
- this.$task = task
- this.$refs.pduTaskDialog.show({
- startDate,
- endDate,
- executeTime,
- taskId
- })
- },
- onSave ({ value, done }) {
- if (this.isAdd) {
- const deviceId = this.device.id
- addPduTask(value, deviceId)
- .then(() => {
- // 重新加载表格数据
- getPduTasks({ deviceId: this.device.id })
- this.$refs.table.pageTo(1)
- })
- .finally(() => {
- done()
- })
- } else {
- const task = value[0]
- updatePduTask(task)
- .then(() => {
- // 重新加载表格数据
- getPduTasks({ deviceId: this.device.id })
- this.$refs.table.pageTo(1)
- })
- .finally(() => {
- done()
- })
- }
- this.hasChanged = true
- },
- onDel (task) {
- this.hasChanged = true
- deletePduTask({ id: task.id })
- .then(() => {
- // 重新加载表格数据
- getPduTasks({ deviceId: this.device.id })
- this.$refs.table.pageTo(1)
- })
- }
- }
- }
- </script>
- <style lang="scss" scoped>
- .o-icon {
- background-image: url("~@/assets/icon_screen_switch.png");
- &.ok {
- background-image: url("~@/assets/icon_device_switch.png");
- }
- }
- </style>
|