DeviceSettingBox.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <template>
  2. <div class="device-setting-wrapper">
  3. <div class="device-setting-header">
  4. 设备属性设置
  5. </div>
  6. <div class="device-setting-box">
  7. <!-- 飞行器夜航灯 -->
  8. <div class="control-setting-item">
  9. <div class="control-setting-item-left">
  10. <div class="item-label">{{ deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].label }}</div>
  11. <div class="item-status">{{ deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].value }}</div>
  12. </div>
  13. <div class="control-setting-item-right">
  14. <DeviceSettingPopover :visible="deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].popConfirm.visible"
  15. :loading="deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].popConfirm.loading"
  16. @confirm="onConfirm(deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].settingKey)"
  17. @cancel="onCancel(deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].settingKey)">
  18. <template #formContent>
  19. <div class="form-content">
  20. <span class="form-label">{{ deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].label }}:</span>
  21. <a-switch checked-children="开" un-checked-children="关"
  22. v-model:checked="deviceSettingFormModel.nightLightsState" />
  23. </div>
  24. </template>
  25. <a @click="onShowPopConfirm(deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].settingKey)">编辑</a>
  26. </DeviceSettingPopover>
  27. </div>
  28. </div>
  29. <!-- 限高 -->
  30. <div class="control-setting-item">
  31. <div class="control-setting-item-left">
  32. <div class="item-label">{{ deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].label }}</div>
  33. <div class="item-status">{{ deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].value }}</div>
  34. </div>
  35. <div class="control-setting-item-right">
  36. <DeviceSettingPopover :visible="deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].popConfirm.visible"
  37. :loading="deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].popConfirm.loading"
  38. @confirm="onConfirm(deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].settingKey)"
  39. @cancel="onCancel(deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].settingKey)">
  40. <template #formContent>
  41. <div class="form-content">
  42. <span class="form-label">{{ deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].label }}:</span>
  43. <a-input-number v-model:value="deviceSettingFormModel.heightLimit" :min="20" :max="1500" />
  44. m
  45. </div>
  46. </template>
  47. <a @click="onShowPopConfirm(deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].settingKey)">编辑</a>
  48. </DeviceSettingPopover>
  49. </div>
  50. </div>
  51. <!-- 限远 -->
  52. <div class="control-setting-item">
  53. <div class="control-setting-item-left">
  54. <div class="item-label">{{ deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].label }}</div>
  55. <div class="item-status">{{ deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].value }}</div>
  56. </div>
  57. <div class="control-setting-item-right">
  58. <DeviceSettingPopover :visible="deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].popConfirm.visible"
  59. :loading="deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].popConfirm.loading"
  60. @confirm="onConfirm(deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].settingKey)"
  61. @cancel="onCancel(deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].settingKey)">
  62. <template #formContent>
  63. <div class="form-content">
  64. <span class="form-label">{{ deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].label }}:</span>
  65. <a-switch style="margin-right: 10px;" checked-children="开" un-checked-children="关"
  66. v-model:checked="deviceSettingFormModel.distanceLimitStatus.state" />
  67. <a-input-number v-model:value="deviceSettingFormModel.distanceLimitStatus.distanceLimit" :min="15"
  68. :max="8000" />
  69. m
  70. </div>
  71. </template>
  72. <a @click="onShowPopConfirm(deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].settingKey)">编辑</a>
  73. </DeviceSettingPopover>
  74. </div>
  75. </div>
  76. <!-- 水平避障 -->
  77. <div class="control-setting-item">
  78. <div class="control-setting-item-left">
  79. <div class="item-label">{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].label }}</div>
  80. <div class="item-status">{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].value }}</div>
  81. </div>
  82. <div class="control-setting-item-right">
  83. <DeviceSettingPopover
  84. :visible="deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].popConfirm.visible"
  85. :loading="deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].popConfirm.loading"
  86. @confirm="onConfirm(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].settingKey)"
  87. @cancel="onCancel(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].settingKey)">
  88. <template #formContent>
  89. <div class="form-content">
  90. <span class="form-label">{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].label
  91. }}:</span>
  92. <a-switch checked-children="开" un-checked-children="关"
  93. v-model:checked="deviceSettingFormModel.obstacleAvoidanceHorizon" />
  94. </div>
  95. </template>
  96. <a
  97. @click="onShowPopConfirm(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].settingKey)">编辑</a>
  98. </DeviceSettingPopover>
  99. </div>
  100. </div>
  101. <!-- 上视避障 -->
  102. <div class="control-setting-item">
  103. <div class="control-setting-item-left">
  104. <div class="item-label">{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].label }}</div>
  105. <div class="item-status">{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].value }}</div>
  106. </div>
  107. <div class="control-setting-item-right">
  108. <DeviceSettingPopover
  109. :visible="deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].popConfirm.visible"
  110. :loading="deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].popConfirm.loading"
  111. @confirm="onConfirm(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].settingKey)"
  112. @cancel="onCancel(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].settingKey)">
  113. <template #formContent>
  114. <div class="form-content">
  115. <span class="form-label">{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].label
  116. }}:</span>
  117. <a-switch checked-children="开" un-checked-children="关"
  118. v-model:checked="deviceSettingFormModel.obstacleAvoidanceUpside" />
  119. </div>
  120. </template>
  121. <a
  122. @click="onShowPopConfirm(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].settingKey)">编辑</a>
  123. </DeviceSettingPopover>
  124. </div>
  125. </div>
  126. <!-- 下视避障 -->
  127. <div class="control-setting-item">
  128. <div class="control-setting-item-left">
  129. <div class="item-label">{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].label }}</div>
  130. <div class="item-status">{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].value }}</div>
  131. </div>
  132. <div class="control-setting-item-right">
  133. <DeviceSettingPopover
  134. :visible="deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].popConfirm.visible"
  135. :loading="deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].popConfirm.loading"
  136. @confirm="onConfirm(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].settingKey)"
  137. @cancel="onCancel(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].settingKey)">
  138. <template #formContent>
  139. <div class="form-content">
  140. <span class="form-label">{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].label
  141. }}:</span>
  142. <a-switch checked-children="开" un-checked-children="关"
  143. v-model:checked="deviceSettingFormModel.obstacleAvoidanceDownside" />
  144. </div>
  145. </template>
  146. <a
  147. @click="onShowPopConfirm(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].settingKey)">编辑</a>
  148. </DeviceSettingPopover>
  149. </div>
  150. </div>
  151. </div>
  152. </div>
  153. </template>
  154. <script lang="ts" setup>
  155. import { ref, watch } from 'vue'
  156. import { DeviceInfoType } from '/@/types/device'
  157. import { useMyStore } from '/@/store'
  158. import { cloneDeep } from 'lodash'
  159. import { initDeviceSetting, initDeviceSettingFormModel, DeviceSettingKeyEnum } from '/@/types/device-setting'
  160. import { updateDeviceSettingInfoByOsd, updateDeviceSettingFormModelByOsd } from '/@/utils/device-setting'
  161. import { useDeviceSetting } from './use-device-setting'
  162. import DeviceSettingPopover from './DeviceSettingPopover.vue'
  163. const props = defineProps<{
  164. sn: string,
  165. deviceInfo: DeviceInfoType,
  166. }>()
  167. const store = useMyStore()
  168. const deviceSetting = ref(cloneDeep(initDeviceSetting))
  169. const deviceSettingFormModelFromOsd = ref(cloneDeep(initDeviceSettingFormModel))
  170. const deviceSettingFormModel = ref(cloneDeep(initDeviceSettingFormModel)) // 真实使用的formModel
  171. // 根据设备osd信息更新信息
  172. watch(() => props.deviceInfo, (value) => {
  173. updateDeviceSettingInfoByOsd(deviceSetting.value, value)
  174. updateDeviceSettingFormModelByOsd(deviceSettingFormModelFromOsd.value, value)
  175. }, {
  176. immediate: true,
  177. deep: true
  178. })
  179. function onShowPopConfirm(settingKey: DeviceSettingKeyEnum) {
  180. deviceSetting.value[settingKey].popConfirm.visible = true
  181. deviceSettingFormModel.value = cloneDeep(deviceSettingFormModelFromOsd.value)
  182. }
  183. function onCancel(settingKey: DeviceSettingKeyEnum) {
  184. deviceSetting.value[settingKey].popConfirm.visible = false
  185. }
  186. async function onConfirm(settingKey: DeviceSettingKeyEnum) {
  187. deviceSetting.value[settingKey].popConfirm.loading = true
  188. const body = genDevicePropsBySettingKey(settingKey, deviceSettingFormModel.value)
  189. await setDeviceProps(props.sn, body)
  190. deviceSetting.value[settingKey].popConfirm.loading = false
  191. deviceSetting.value[settingKey].popConfirm.visible = false
  192. }
  193. // 更新设备属性
  194. const {
  195. genDevicePropsBySettingKey,
  196. setDeviceProps,
  197. } = useDeviceSetting()
  198. </script>
  199. <style lang='scss' scoped>
  200. .device-setting-wrapper {
  201. border-bottom: 1px solid #515151;
  202. .device-setting-header {
  203. font-size: 14px;
  204. font-weight: 600;
  205. padding: 10px 10px 0px;
  206. }
  207. .device-setting-box {
  208. display: flex;
  209. flex-wrap: wrap;
  210. justify-content: space-between;
  211. padding: 4px 10px;
  212. .control-setting-item {
  213. width: 220px;
  214. height: 58px;
  215. display: flex;
  216. align-items: center;
  217. justify-content: space-between;
  218. border: 1px solid #666;
  219. margin: 4px 0;
  220. padding: 0 8px;
  221. .control-setting-item-left {
  222. display: flex;
  223. flex-direction: column;
  224. .item-label {
  225. font-weight: 700;
  226. }
  227. }
  228. }
  229. }
  230. }
  231. </style>