Преглед на файлове

fix: saveBoxLogger not found

adjust some role accesses
Casper Dai преди 2 години
родител
ревизия
2d20ce01dd

+ 18 - 0
src/api/platform.js

@@ -64,6 +64,24 @@ export function savePowerLogger (data) {
   })
 }
 
+export function saveBoxLogger (data) {
+  const { user } = addUser()
+  return tenantRequest({
+    url: '/sysLog/webOperation',
+    method: 'POST',
+    data: addTenant({
+      userId: user,
+      business: 99,
+      ip: '',
+      costTime: 0,
+      status: 1,
+      operTime: parseTime(new Date(), '{y}-{m}-{d} {h}:{i}:{s}'),
+      ...data
+    }),
+    custom: true
+  })
+}
+
 export function getSpacers (data) {
   return request({
     url: '/device/spacer/query',

+ 3 - 3
src/components/service/Schedule/index.vue

@@ -26,7 +26,7 @@ export default {
     }
   },
   computed: {
-    ...mapGetters(['isSuperAdmin', 'tenant', 'userId'])
+    ...mapGetters(['tenant', 'userId'])
   },
   watch: {
     schedule: {
@@ -143,7 +143,7 @@ export default {
       })
     }
 
-    if (!this.isSuperAdmin && detail.tenant !== this.tenant) {
+    if (detail.tenant !== this.tenant) {
       return h('el-result', {
         props: {
           icon: 'warning',
@@ -155,7 +155,7 @@ export default {
     return h([null, 'ScheduleSwiper', 'ScheduleCalendar'][detail.type - 1], {
       props: {
         detail,
-        editable: this.editable && (this.isSuperAdmin || detail.createBy === this.userId)
+        editable: this.editable && detail.createBy === this.userId
       },
       attrs: this.$attrs,
       on: this.$listeners

+ 2 - 0
src/constant.js

@@ -289,6 +289,8 @@ export const RoleAccess = {
   ],
   [Role.ADMIN]: [
     Access.MANAGE_TENANT,
+    Access.MANAGE_GROUP,
+    Access.MANAGE_CALENDAR,
     Access.MANAGE_DEVICE
   ],
   [Role.SUPERVISOR]: [

+ 1 - 1
src/mixins/role.js

@@ -2,7 +2,7 @@ import { mapGetters } from 'vuex'
 
 export default {
   computed: {
-    ...mapGetters(['isGroupAdmin', 'isOperator'])
+    ...mapGetters(['isOperator', 'isGroupAdmin'])
   },
   render (h) {
     return h(

+ 2 - 12
src/router/index.js

@@ -135,13 +135,7 @@ export const asyncRoutes = [
         path: 'tag',
         component: () => import('@/views/screen/material/tag/index'),
         meta: { title: '资源标签' }
-      }/* ,
-      {
-        path: 'review',
-        component: () => import('@/views/screen/review/single/index'),
-        access: Access.MANAGE_GROUP,
-        meta: { title: '审核' }
-      } */
+      }
     ]
   },
   {
@@ -391,11 +385,7 @@ export const asyncRoutes = [
       {
         path: 'report',
         component: () => import('@/views/realm/report/index'),
-        access: [
-          Access.MANAGE_TENANT,
-          Access.MANAGE_GROUP,
-          Access.MANAGE_CALENDAR
-        ],
+        access: [Access.MANAGE_CALENDAR, Access.MANAGE_GROUP, Access.MANAGE_TENANT],
         meta: { title: '报表导出' }
       },
       // {

+ 3 - 3
src/store/getters.js

@@ -49,12 +49,12 @@ const getters = {
   isTopGroup (state, getters) {
     return getters.tenant === getters.org
   },
-  isTopGroupAdmin (state, getters) {
-    return getters.isTenantAdmin || getters.isGroupAdmin && getters.isTopGroup
-  },
   isOperator (state, getters) {
     return getters.access.has(Access.MANAGE_CALENDAR)
   },
+  isMaintainer (state, getters) {
+    return getters.access.has(Access.MANAGE_DEVICE)
+  },
   isValid (state, getters) {
     return getters.token && (getters.tenant || getters.isSuperAdmin)
   },

+ 6 - 0
src/utils/mqtt.js

@@ -34,6 +34,12 @@ const whiteList = [
     val: /^\d+\/\d+\/(status|screenshot|restart)/
   }, {
     val: /messageId/
+  }, {
+    type: 'topic',
+    val: /^client/
+  }, {
+    type: 'topic',
+    val: /^device/
   }
 ]
 

+ 10 - 8
src/views/ad/automation/task/AssetTask.vue

@@ -98,8 +98,8 @@ import {
   getContract
 } from '../api'
 import {
-  getTasks,
-  addTask,
+  getDepartmentTasks,
+  addDepartmentTask,
   deleteTask,
   updateTask
 } from './api'
@@ -116,7 +116,7 @@ export default {
 
     return {
       schema: {
-        list: getTasks,
+        list: getDepartmentTasks,
         transform: this.transform,
         buttons: canEdit
           ? [
@@ -141,10 +141,12 @@ export default {
           { label: '上刊设备', render: (data, h) => h(
             'div',
             {
-              staticClass: 'u-ellipsis has-active',
-              on: {
-                click: () => this.onEditDevices(data)
-              }
+              staticClass: canEdit ? 'u-ellipsis has-active' : 'u-ellipsis',
+              on: canEdit
+                ? {
+                  click: () => this.onEditDevices(data)
+                }
+                : {}
             },
             data.devices.length > 1
               ? `${data.devices[0].name}等`
@@ -389,7 +391,7 @@ export default {
       }).then(done)
     },
     addTask (task) {
-      return addTask({
+      return addDepartmentTask({
         ...task,
         auditCount: task.count,
         enable: false

+ 25 - 1
src/views/ad/automation/task/api.js

@@ -2,7 +2,9 @@ import request from '@/utils/request'
 import {
   add,
   del,
-  update
+  update,
+  addOrg,
+  addTenantAndOrg
 } from '@/api/base'
 
 export function getTasks (query, options) {
@@ -27,6 +29,28 @@ export function addTask (data, options) {
   })
 }
 
+export function getDepartmentTasks (query, options) {
+  const { pageNum: pageIndex, pageSize, ...params } = query
+  return request({
+    url: '/ad/task/list',
+    method: 'GET',
+    params: addOrg({
+      pageIndex, pageSize,
+      ...params,
+      ...options
+    })
+  })
+}
+
+export function addDepartmentTask (data, options) {
+  return add({
+    url: '/ad/task',
+    method: 'POST',
+    data: addTenantAndOrg(data),
+    ...options
+  })
+}
+
 export function deleteTask (id, tip, options) {
   return del({
     url: `/ad/task/${id}`,

+ 3 - 1
src/views/dashboard/Dashboard.vue

@@ -81,7 +81,7 @@
     <div class="l-flex__none l-flex--row c-sibling-item--v u-font-size--sm u-bold">
       <div class="c-sibling-item">设备列表</div>
       <div
-        v-if="onlineDevices.length"
+        v-if="isMaintainer && onlineDevices.length"
         class="l-flex--row c-sibling-item far u-pointer"
         @click="onVolume"
       >
@@ -140,6 +140,7 @@
 </template>
 
 <script>
+import { mapGetters } from 'vuex'
 import {
   publish,
   subscribe,
@@ -176,6 +177,7 @@ export default {
     }
   },
   computed: {
+    ...mapGetters(['isMaintainer']),
     onlineDevices () {
       if (this.deviceOptions.loaded) {
         return this.deviceOptions.list.filter(({ onlineStatus }) => onlineStatus === 1)

+ 0 - 3
src/views/dashboard/TenantDashboard.vue

@@ -105,7 +105,6 @@
       </div>
       <div class="l-flex__fill" />
       <el-dropdown
-        v-if="isTenantAdmin"
         class="l-flex__none has-active"
         trigger="click"
         @command="onCommand"
@@ -166,7 +165,6 @@
 </template>
 
 <script>
-import { mapGetters } from 'vuex'
 import {
   publish,
   subscribe,
@@ -205,7 +203,6 @@ export default {
     }
   },
   computed: {
-    ...mapGetters(['isTenantAdmin']),
     isAllDevice () {
       return this.command === 'all'
     },

+ 91 - 0
src/views/device/detail/components/Anolg/components/PowerBoxOperation.vue

@@ -0,0 +1,91 @@
+<template>
+  <div class="l-flex--col u-font-size--sm">
+    <div class="c-sibling-item--v u-bold">供电箱操作</div>
+    <div class="c-sibling-item--v l-grid--info mini">
+      <div
+        class="o-button"
+        @click="onTriggerOpen"
+      >
+        开启供电
+      </div>
+      <div
+        class="o-button"
+        @click="onTriggerClose"
+      >
+        关闭供电
+      </div>
+    </div>
+    <div class="c-sibling-item--v u-bold">供电箱信息</div>
+    <div class="c-sibling-item--v l-grid--info mini">
+      <template v-if="info">
+        <div>总电能 {{ info.totalEnergy }}</div>
+        <div>V相电流 {{ info.phaseCurrentV }}A</div>
+        <div>V相电压 {{ info.phaseVoltageV }}V</div>
+        <div>U相电流 {{ info.phaseCurrentU }}A</div>
+        <div>U相电压 {{ info.phaseVoltageU }}V</div>
+        <div>W相电流 {{ info.phaseCurrentW }}A</div>
+        <div>W相电压 {{ info.phaseVoltageW }}V</div>
+        <div>电箱湿度 {{ info.humidity }}</div>
+        <div>电箱温度 {{ info.temp }}℃</div>
+        <div>零线1温度 {{ info.earthWireTemp1 }}℃</div>
+        <div>零线2温度 {{ info.earthWireTemp2 }}℃</div>
+      </template>
+      <div
+        v-else
+        class="u-font-size--sm u-color--info"
+      >
+        暂无数据
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import {
+  triggerPowerBoxStatusChange,
+  getPowerBoxInfo
+} from './api'
+
+export default {
+  name: 'AnolgPowerBoxOperation',
+  props: {
+    device: {
+      type: Object,
+      required: true
+    }
+  },
+  data () {
+    return {
+      info: null
+    }
+  },
+  created () {
+    this.getPowerBoxInfo()
+    this.$timer = setInterval(this.getPowerBoxInfo, 5000)
+  },
+  beforeDestroy () {
+    clearInterval(this.$timer)
+  },
+  methods: {
+    onTriggerOpen () {
+      triggerPowerBoxStatusChange({
+        deviceId: '13675259',
+        plcInterface: 'S10',
+        plcStatus: 1
+      })
+    },
+    onTriggerClose () {
+      triggerPowerBoxStatusChange({
+        deviceId: '13675259',
+        plcInterface: 'S11',
+        plcStatus: 1
+      })
+    },
+    getPowerBoxInfo () {
+      getPowerBoxInfo('13675259').then(({ data }) => {
+        this.info = data
+      })
+    }
+  }
+}
+</script>

+ 18 - 0
src/views/device/detail/components/Anolg/components/api.js

@@ -1,3 +1,4 @@
+import request from '@/utils/request'
 import { messageSend } from '@/api/base'
 
 export function triggerSensor (data) {
@@ -21,3 +22,20 @@ export function triggerIllegalContent (deviceId) {
     method: 'GET'
   }, '触发')
 }
+
+export function triggerPowerBoxStatusChange (data) {
+  return messageSend({
+    url: '/device/plc/push',
+    method: 'POST',
+    data
+  }, '触发')
+}
+
+export function getPowerBoxInfo (deviceId) {
+  return request({
+    url: '/device/plcStatus',
+    method: 'GET',
+    params: { deviceId },
+    custom: true
+  })
+}

+ 7 - 1
src/views/device/detail/components/Anolg/index.vue

@@ -20,6 +20,10 @@
       class="c-sibling-item--v far"
       :device="device"
     />
+    <power-box-operation
+      class="c-sibling-item--v far"
+      :device="device"
+    />
   </div>
 </template>
 
@@ -29,6 +33,7 @@ import Deviation from './components/Deviation.vue'
 import BoxStatus from './components/BoxStatus.vue'
 import Monitor from './components/Monitor.vue'
 import BoxOperation from './components/BoxOperation.vue'
+import PowerBoxOperation from './components/PowerBoxOperation.vue'
 
 export default {
   name: 'Anolg',
@@ -37,7 +42,8 @@ export default {
     Deviation,
     BoxStatus,
     Monitor,
-    BoxOperation
+    BoxOperation,
+    PowerBoxOperation
   },
   props: {
     device: {

+ 1 - 1
src/views/device/detail/index.vue

@@ -121,7 +121,7 @@ export default {
         this.$store.getters.isSuperAdmin && { key: 'Anolg', label: '事件模拟' },
         { key: 'DeviceInfo', label: '设备信息' },
         { key: 'DeviceRuntime', label: '运行状态' },
-        (this.$store.getters.isGroupAdmin || this.$store.getters.isOperator) && { key: 'DeviceInvoke', label: '远程操控' },
+        this.$store.getters.isMaintainer && { key: 'DeviceInvoke', label: '远程操控' },
         { key: 'Sensors', label: '传感器', icon: 'el-icon-date', on: this.onShowSensorTables },
         { key: 'DeviceExternal', label: '全链路监测' },
         { key: 'DeviceAlarm', label: '设备告警' },

+ 1 - 1
src/views/realm/user/Settings.vue

@@ -178,7 +178,7 @@ export default {
     }
   },
   computed: {
-    ...mapGetters(['isSuperAdmin', 'isTenantAdmin']),
+    ...mapGetters(['isSuperAdmin']),
     userId () {
       return this.user.userId
     },

+ 4 - 6
src/views/screen/material/media/index.vue

@@ -26,7 +26,6 @@
 </template>
 
 <script>
-import { mapGetters } from 'vuex'
 import {
   State,
   AssetTypeInfo,
@@ -57,7 +56,6 @@ export default {
     }
   },
   computed: {
-    ...mapGetters(['isOperator', 'isGroupAdmin']),
     schema () {
       return {
         list: this.getAssetsByQuery,
@@ -67,10 +65,10 @@ export default {
           'selection-change': this.onSelectionChange
         },
         buttons: [
-          this.isOperator && { type: 'add', label: '上传', on: this.onUpload },
-          this.isOperator && { type: 'add', label: `新增${AssetTypeInfo[AssetType.STREAMING_MEDIA]}`, on: this.addStreamingMedia },
+          { type: 'add', label: '上传', on: this.onUpload },
+          { type: 'add', label: `新增${AssetTypeInfo[AssetType.STREAMING_MEDIA]}`, on: this.addStreamingMedia },
           { type: 'del', on: this.onBatchDel }
-        ].filter(Boolean),
+        ],
         filters: [
           { key: 'tag', type: 'select', placeholder: '类型', options: [
             { value: AssetTag.AD, label: AssetTagInfo[AssetTag.AD] },
@@ -117,7 +115,7 @@ export default {
           { type: 'invoke', render: [
             { label: '查看', allow: ({ file }) => !!file, on: this.onView },
             { label: '删除', allow: this.canDel, on: this.onDel }
-          ].filter(Boolean), width: 100 }
+          ], width: 100 }
         ]
       }
     }

+ 4 - 8
src/views/screen/material/program/ast/index.vue

@@ -26,7 +26,7 @@ export default {
     }
   },
   computed: {
-    ...mapGetters(['isSuperAdmin', 'isTenantAdmin', 'isOperator', 'tenant', 'userId'])
+    ...mapGetters(['tenant', 'userId'])
   },
   watch: {
     id: {
@@ -43,14 +43,10 @@ export default {
       getProgram(this.id, { custom: true }).then(
         ({ data }) => {
           try {
-            const { tenant, id, status, name, resolutionRatio, itemJsonStr, rejectIds } = data
-            if (tenant !== this.tenant) {
-              this.showMessage('warning', this.isSuperAdmin ? `请切换至租户【${tenant}】后再访问` : '无权限')
-              return
-            }
+            const { id, status, name, resolutionRatio, createBy, itemJsonStr, rejectIds } = data
 
-            if (!this.isOperator) {
-              this.showMessage('warning', '无编辑权限,请联系管理员')
+            if (this.userId !== createBy) {
+              this.showMessage('warning', '无编辑权限')
               return
             }
 

+ 10 - 9
src/views/screen/material/tag/index.vue

@@ -40,14 +40,17 @@ import {
 export default {
   name: 'AssetSubTag',
   data () {
+    const canEdit = this.$store.getters.isOperator
+    const canAudit = this.$store.getters.isGroupAdmin
+
     return {
       dialogTitle: '',
       schema: {
         list: getAssetSubTagsByTenant,
         buttons: [
-          { type: 'add', on: this.onAdd },
-          { type: 'del', on: this.onBatchDel }
-        ],
+          canEdit && { type: 'add', on: this.onAdd },
+          canAudit && { type: 'del', on: this.onBatchDel }
+        ].filter(Boolean),
         cols: [
           { type: 'selection' },
           { label: '名称', render: (data, h) => h('edit-input', {
@@ -56,12 +59,10 @@ export default {
             },
             on: { edit: val => this.onEditName(data, val) }
           }), 'class-name': 'c-edit-column' },
-          this.$store.getters.isGroupAdmin
-            ? { type: 'invoke', render: [
-              { label: '删除', on: this.onDel }
-            ] }
-            : null
-        ]
+          canAudit && { type: 'invoke', render: [
+            { label: '删除', on: this.onDel }
+          ] }
+        ].filter(Boolean)
       },
       tag: {}
     }