index.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. <template>
  2. <wrapper
  3. fill
  4. margin
  5. padding
  6. background
  7. >
  8. <schema-table
  9. ref="table"
  10. :schema="schema"
  11. />
  12. <confirm-dialog
  13. ref="addDialog"
  14. title="新增升级"
  15. @confirm="onDeploy"
  16. >
  17. <div class="c-grid-form u-align-self--center">
  18. <span class="c-grid-form__label u-required">升级名称</span>
  19. <el-input
  20. v-model.trim="version.name"
  21. placeholder="最多50个字符"
  22. maxlength="50"
  23. clearable
  24. />
  25. <span class="c-grid-form__label u-required">目标版本</span>
  26. <input
  27. class="el-input__inner u-pointer u-ellipsis"
  28. :value="apk"
  29. placeholder="请选择目标版本"
  30. readonly
  31. @click="onChooseApk"
  32. >
  33. <span class="c-grid-form__label u-required">目标设备</span>
  34. <input
  35. class="el-input__inner u-pointer u-ellipsis"
  36. :value="devices"
  37. placeholder="请选择目标设备"
  38. readonly
  39. @click="chooseDevices"
  40. >
  41. <span class="c-grid-form__label">升级方式</span>
  42. <div class="l-flex--row c-grid-form__option">
  43. <el-radio>强制升级</el-radio>
  44. </div>
  45. <span class="c-grid-form__label">描述</span>
  46. <el-input
  47. v-model.trim="version.remark"
  48. type="textarea"
  49. maxlength="100"
  50. :rows="3"
  51. show-word-limit
  52. />
  53. </div>
  54. </confirm-dialog>
  55. <table-dialog
  56. ref="apkDialog"
  57. title="目标版本选择"
  58. :schema="apkSchema"
  59. append-to-body
  60. @choosen="onChoosenApk"
  61. />
  62. <confirm-dialog
  63. ref="targetDialog"
  64. title="目标设备选择"
  65. size="lg fixed"
  66. append-to-body
  67. @confirm="onChoosenDevices"
  68. >
  69. <platform-page
  70. class="l-flex__fill"
  71. @change="onTenantChange"
  72. >
  73. <template #default="{ tenant: { id } }">
  74. <device-tree
  75. :key="id"
  76. class="l-flex__fill c-sibling-item far u-overflow-y--auto"
  77. :invoke="getDevices"
  78. @change="onChooseDevices"
  79. />
  80. </template>
  81. </platform-page>
  82. </confirm-dialog>
  83. </wrapper>
  84. </template>
  85. <script>
  86. import {
  87. getApks,
  88. getVersions,
  89. deployVersion,
  90. delVersion
  91. } from '@/api/platform'
  92. import { getDevicesByAdmin } from '@/api/device'
  93. export default {
  94. name: 'UpgradeDeploy',
  95. data () {
  96. return {
  97. version: {},
  98. apkSchema: {
  99. condition: { status: 1 },
  100. list: getApks,
  101. cols: [
  102. { prop: 'name', label: '文件名' },
  103. { prop: 'versionName', label: '版本名称' },
  104. { prop: 'versionCode', label: '版本号' },
  105. { prop: 'createTime', label: '创建时间' },
  106. { prop: 'remark', label: '备注' }
  107. ]
  108. },
  109. apk: '',
  110. devices: '',
  111. schema: {
  112. condition: { status: void 0, name: '' },
  113. list: getVersions,
  114. buttons: [
  115. { type: 'add', on: this.onAdd }
  116. ],
  117. filters: [
  118. {
  119. key: 'status', type: 'select', placeholder: '全部状态',
  120. options: [
  121. { value: 1, label: '待升级' },
  122. { value: 2, label: '已升级' },
  123. { value: 3, label: '已废弃' }
  124. ]
  125. },
  126. { key: 'name', type: 'search', placeholder: '升级名称' }
  127. ],
  128. cols: [
  129. { prop: 'name', label: '升级名称' },
  130. { prop: 'fileName', label: '升级文件' },
  131. { prop: 'versionName', label: '目标版本' },
  132. { prop: 'deviceName', label: '目标设备' },
  133. { label: '升级方式', render () { return '强制升级' } },
  134. { prop: 'createTime', label: '创建时间' },
  135. { prop: 'remark', label: '备注' },
  136. { type: 'tag', render ({ status }) {
  137. return {
  138. type: [null, 'warning', 'success', 'info'][status],
  139. label: [null, '待升级', '已升级', '已废弃'][status]
  140. }
  141. } },
  142. { type: 'invoke', render: [
  143. { label: '删除', on: this.onDel }
  144. ] }
  145. ]
  146. },
  147. tenant: null
  148. }
  149. },
  150. methods: {
  151. onAdd () {
  152. this.version = {
  153. name: '',
  154. fileId: '',
  155. remark: ''
  156. }
  157. this.apk = ''
  158. this.$devices = []
  159. this.devices = ''
  160. this.$refs.addDialog.show()
  161. },
  162. onDeploy (done) {
  163. if (!this.version.name) {
  164. this.$message({
  165. type: 'warning',
  166. message: '请填写升级名称'
  167. })
  168. return
  169. }
  170. if (!this.version.fileId) {
  171. this.$message({
  172. type: 'warning',
  173. message: '请选择目标版本'
  174. })
  175. return
  176. }
  177. if (!this.$devices?.length) {
  178. this.$message({
  179. type: 'warning',
  180. message: '请选择目标设备'
  181. })
  182. return
  183. }
  184. deployVersion({
  185. deviceId: this.$devices.map(device => device.id),
  186. ...this.version
  187. }).then(() => {
  188. done()
  189. this.$refs.table.resetCondition({ status: 1, name: this.version.name })
  190. })
  191. },
  192. onChooseApk () {
  193. this.$refs.apkDialog.show()
  194. },
  195. onChoosenApk ({ value: { id, versionName, versionCode }, done }) {
  196. done()
  197. this.apk = `${versionName} ${versionCode}`
  198. this.version.fileId = id
  199. },
  200. chooseDevices () {
  201. this.tenant = null
  202. this.$slectedDevices = []
  203. this.$refs.targetDialog.show()
  204. },
  205. onTenantChange (tenant) {
  206. if (!this.tenant || this.tenant.id !== tenant.id) {
  207. this.$slectedDevices = []
  208. this.tenant = tenant
  209. }
  210. },
  211. getDevices (params) {
  212. return getDevicesByAdmin({ tenant: this.tenant.path, ...params })
  213. },
  214. onChooseDevices (devices) {
  215. this.$slectedDevices = devices
  216. },
  217. onChoosenDevices (done) {
  218. if (!this.$slectedDevices.length) {
  219. this.$message({
  220. type: 'warning',
  221. message: '请选择目标设备'
  222. })
  223. return
  224. }
  225. this.$devices = this.$slectedDevices
  226. this.devices = this.$slectedDevices.map(({ name }) => name).join(', ')
  227. done()
  228. },
  229. onDel (version) {
  230. delVersion(version).then(() => {
  231. this.$refs.table.decrease(1)
  232. })
  233. }
  234. }
  235. }
  236. </script>