Quellcode durchsuchen

feat: support old data migration

Casper Dai vor 3 Jahren
Ursprung
Commit
cc5f3462eb

+ 1 - 1
src/components/Schedule/ScheduleComplex/EventItemWeek.vue

@@ -101,7 +101,7 @@ export default {
 .c-event {
   position: sticky;
   top: 0;
-  padding: 6px 0;
+  padding: 6px;
   font-size: 14px;
 
   &__time {

+ 1 - 0
src/scss/bem/_component.scss

@@ -277,6 +277,7 @@
   background-color: transparent;
 
   &.schedule {
+    min-width: 800px;
     align-items: stretch;
 
     .el-dialog__body {

+ 408 - 0
src/views/platform/transfer/index.vue

@@ -0,0 +1,408 @@
+<template>
+  <wrapper
+    fill
+    margin
+    padding
+    background
+  >
+    <div class="l-flex--row">
+      <button
+        class="o-button c-sibling-item"
+        @click="onTransferSchedule"
+      >
+        迁移设备排期
+      </button>
+      <button
+        class="o-button c-sibling-item"
+        @click="onTransferHistory"
+      >
+        迁移发布历史
+      </button>
+    </div>
+    <el-dialog
+      title="迁移设备排期"
+      :visible.sync="scheduleTransfering"
+      custom-class="c-dialog"
+    >
+      <c-table
+        v-if="scheduleTransfering"
+        :options="deviceOptions"
+        @pagination="getDevices"
+      >
+        <template #header>
+          <button
+            v-if="deviceOptions.totalCount"
+            class="o-button c-sibling-item"
+            @click="transferPageDevices"
+          >
+            迁移当前页
+          </button>
+          <button
+            v-if="deviceOptions.totalCount > deviceOptions.params.pageSize"
+            class="o-button c-sibling-item"
+            @click="transferAllDevices"
+          >
+            迁移所有
+          </button>
+        </template>
+        <el-table-column
+          prop="id"
+          label="ID"
+          align="center"
+        />
+        <el-table-column
+          prop="name"
+          label="设备名称"
+          align="center"
+        />
+        <el-table-column
+          label="操作"
+          align="center"
+        >
+          <template v-slot="scope">
+            <div
+              class="c-table__btn u-pointer"
+              @click="transformOneDevice(scope.row)"
+            >
+              迁移至事件模式
+            </div>
+            <div
+              class="c-table__btn u-pointer"
+              @click="clearDevice(scope.row)"
+            >
+              清除
+            </div>
+          </template>
+        </el-table-column>
+      </c-table>
+    </el-dialog>
+    <el-dialog
+      title="迁移发布历史"
+      :visible.sync="historyTransfering"
+      custom-class="c-dialog"
+    >
+      <c-table
+        v-if="historyTransfering"
+        :options="historyOptions"
+        @pagination="getHistoriesByOptions"
+      >
+        <template #header>
+          <button
+            v-if="historyOptions.totalCount"
+            class="o-button c-sibling-item"
+            @click="transferPageHistories"
+          >
+            迁移当前页
+          </button>
+          <button
+            v-if="historyOptions.totalCount > historyOptions.params.pageSize"
+            class="o-button c-sibling-item"
+            @click="transferAllHistories"
+          >
+            迁移所有
+          </button>
+        </template>
+        <el-table-column
+          prop="id"
+          label="ID"
+          align="center"
+        />
+        <el-table-column
+          prop="programCalendarName"
+          label="名称"
+          align="center"
+        />
+        <el-table-column
+          prop="createTime"
+          label="审核时间"
+          align="center"
+        />
+        <el-table-column
+          label="操作"
+          align="center"
+        >
+          <template v-slot="scope">
+            <div
+              class="c-table__btn u-pointer"
+              @click="transferOneHistory(scope.row)"
+            >
+              迁移
+            </div>
+          </template>
+        </el-table-column>
+      </c-table>
+    </el-dialog>
+  </wrapper>
+</template>
+
+<script>
+import { getDevices } from '@/api/device'
+import request from '@/utils/request'
+import { toEvent } from '@/utils/event'
+import { createListOptions } from '@/utils'
+import {
+  State,
+  PublishType
+} from '@/constant'
+
+export default {
+  name: 'Transfer',
+  data () {
+    return {
+      scheduleTransfering: false,
+      deviceOptions: null,
+      historyTransfering: false,
+      historyOptions: null
+    }
+  },
+  methods: {
+    onTransferSchedule () {
+      this.deviceOptions = createListOptions()
+      this.getDevices()
+      this.scheduleTransfering = true
+    },
+    getDevices () {
+      const options = this.deviceOptions
+      options.error = false
+      options.loading = true
+      getDevices(options.params).then(
+        ({ data, totalCount }) => {
+          options.list = data.map(({ id, name }) => {
+            return { id, name }
+          })
+          options.totalCount = totalCount
+        },
+        () => {
+          options.error = true
+          options.list = []
+        }
+      ).finally(() => {
+        options.loading = false
+      })
+    },
+    setDeviceCalendar (id, events) {
+      return request({
+        url: `/content/deviceCalender/${id}`,
+        method: 'POST',
+        data: events,
+        custom: true
+      })
+    },
+    clearDevice (device) {
+      const loading = this.$showLoading()
+      this.setDeviceCalendar(device.id, []).then(
+        () => {
+          this.$message({
+            type: 'success',
+            message: '数据已清除'
+          })
+        },
+        () => {
+          this.$message({
+            type: 'warning',
+            message: '数据清除失败'
+          })
+        }
+      ).finally(() => {
+        this.$closeLoading(loading)
+      })
+    },
+    async transferDevice ({ id }) {
+      const { data } = await request({
+        url: `/content/deviceCalender/${id}`,
+        method: 'GET',
+        custom: true
+      })
+      const schedules = JSON.parse(data.eventDetail) || []
+      if (schedules.length && !schedules[0].freq) {
+        const events = []
+        for (let i = 0; i < schedules.length; i++) {
+          const event = toEvent(schedules[i])
+          await event.invoke()
+          events.push(event)
+        }
+        await this.setDeviceCalendar(id, events)
+        return true
+      }
+      return false
+    },
+    async transferDevices (devices) {
+      const length = devices.length
+      for (let i = 0; i < length; i++) {
+        const device = devices[i]
+        try {
+          await this.transferDevice(device)
+        } catch (e) {
+          console.warn(e)
+          this.$message({
+            type: 'warning',
+            message: `${device.name}迁移失败`
+          })
+          return
+        }
+      }
+      this.$message({
+        type: 'success',
+        message: '数据迁移成功'
+      })
+    },
+    async transformOneDevice (device) {
+      const loading = this.$showLoading()
+      try {
+        const has = await this.transferDevice(device)
+        if (has) {
+          this.$message({
+            type: 'success',
+            message: '数据迁移成功'
+          })
+        } else {
+          this.$message({
+            type: 'warning',
+            message: '数据不需迁移或已迁移'
+          })
+        }
+      } catch (e) {
+        console.warn(e)
+        this.$message({
+          type: 'warning',
+          message: '数据迁移失败'
+        })
+      }
+      this.$closeLoading(loading)
+    },
+    async transferPageDevices () {
+      const loading = this.$showLoading()
+      await this.transferDevices(this.deviceOptions.list)
+      this.$closeLoading(loading)
+    },
+    async transferAllDevices () {
+      if (this.deviceOptions.totalCount <= this.deviceOptions.params.pageSize) {
+        this.transferPageDevices()
+      } else {
+        const loading = this.$showLoading()
+        try {
+          const { data } = await getDevices({
+            pageNum: 1,
+            pageSize: this.deviceOptions.totalCount
+          })
+          await this.transferDevices(data)
+        } catch (e) {
+          console.warn(e)
+          this.$message({
+            type: 'warning',
+            message: '获取迁移数据失败'
+          })
+        }
+        this.$closeLoading(loading)
+      }
+    },
+    onTransferHistory () {
+      this.historyOptions = createListOptions()
+      this.getHistoriesByOptions()
+      this.historyTransfering = true
+    },
+    getHistories ({ pageNum: pageIndex, pageSize }) {
+      return request({
+        url: '/orchestration/calendarRelease/page',
+        method: 'GET',
+        params: {
+          pageIndex,
+          pageSize,
+          status: State.RESOLVED
+        }
+      })
+    },
+    getHistoriesByOptions () {
+      const options = this.historyOptions
+      options.error = false
+      options.loading = true
+      this.getHistories(options.params).then(
+        ({ data, totalCount }) => {
+          options.list = data
+          options.totalCount = totalCount
+        },
+        () => {
+          options.error = true
+          options.list = []
+        }
+      ).finally(() => {
+        options.loading = false
+      })
+    },
+    transferHistory ({ id, programCalendarId }) {
+      return request({
+        url: `/orchestration/calendarRelease/${id}/save`,
+        method: 'POST',
+        data: {
+          type: PublishType.CALENDAR,
+          detail: programCalendarId
+        },
+        custom: true
+      })
+    },
+    async transferHistories (histories) {
+      const length = histories.length
+      for (let i = 0; i < length; i++) {
+        const history = histories[i]
+        try {
+          await this.transferHistory(history)
+        } catch (e) {
+          console.warn(e)
+          this.$message({
+            type: 'warning',
+            message: `${history.programCalendarName}迁移失败`
+          })
+          return
+        }
+      }
+      this.$message({
+        type: 'success',
+        message: '数据迁移成功'
+      })
+      const options = this.historyOptions
+      if (options.params.pageNum > 1 && options.list.length <= length) {
+        if (options.params.pageSize >= length) {
+          options.params.pageNum -= 1
+        } else {
+          options.params.pageNum = 1
+        }
+      }
+      this.getHistoriesByOptions()
+    },
+    async transferOneHistory (history) {
+      const loading = this.$showLoading()
+      await this.transferHistories([history])
+      this.$closeLoading(loading)
+    },
+    async transferPageHistories () {
+      const loading = this.$showLoading()
+      await this.transferHistories(this.historyOptions.list)
+      this.$closeLoading(loading)
+    },
+    async transferAllHistories () {
+      if (this.historyOptions.totalCount <= this.historyOptions.params.pageSize) {
+        this.transferPageHistories()
+      } else {
+        const loading = this.$showLoading()
+        try {
+          const { data } = await this.getHistories({
+            pageNum: 1,
+            pageSize: this.historyOptions.totalCount
+          })
+          await this.transferHistories(data)
+        } catch (e) {
+          console.warn(e)
+          this.$message({
+            type: 'warning',
+            message: '获取迁移数据失败'
+          })
+        }
+        this.$closeLoading(loading)
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+</style>