From 8a5cb8306f90e13f9e1067416e8cc5506001723b Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Fri, 13 Sep 2024 20:15:54 +0800
Subject: [PATCH] 打包报错相关处理

---
 src/api/device-setting/index.js                      |   23 ++
 src/types/device-setting.js                          |  141 ++++++++++++++
 src/views/device/components/DeviceSettingBox.vue     |   23 -
 src/utils/device-setting.js                          |  283 ++++++++++++++++++++++++++++
 src/views/device/components/use-device-setting.js    |   72 +++++++
 src/views/device/components/DeviceSettingPopover.vue |   16 -
 6 files changed, 529 insertions(+), 29 deletions(-)

diff --git a/src/api/device-setting/index.js b/src/api/device-setting/index.js
new file mode 100644
index 0000000..25cef6e
--- /dev/null
+++ b/src/api/device-setting/index.js
@@ -0,0 +1,23 @@
+/*
+ * @Author: shuishen 1109946754@qq.com
+ * @Date: 2024-09-13 20:01:59
+ * @LastEditors: shuishen 1109946754@qq.com
+ * @LastEditTime: 2024-09-13 20:08:09
+ * @FilePath: \drone-web-manage\src\api\device-setting\index.js
+ * @Description:
+ *
+ * Copyright (c) 2024 by shuishen, All Rights Reserved.
+ */
+import request from '@/axios';
+
+import { ELocalStorageKey } from '@/types';
+
+const workspaceId = localStorage.getItem(ELocalStorageKey.WorkspaceId) || '';
+
+export const putDeviceProps = (deviceSn, body) => {
+  return request({
+    url: `/drone-yw/manage/api/v1/devices/${workspaceId}/devices/${deviceSn}/property`,
+    method: 'put',
+    body,
+  });
+};
diff --git a/src/types/device-setting.js b/src/types/device-setting.js
new file mode 100644
index 0000000..3b2d626
--- /dev/null
+++ b/src/types/device-setting.js
@@ -0,0 +1,141 @@
+// 夜航灯开关
+export let NightLightsStateEnum
+
+;(function(NightLightsStateEnum) {
+  NightLightsStateEnum[(NightLightsStateEnum["CLOSE"] = 0)] = "CLOSE"
+  NightLightsStateEnum[(NightLightsStateEnum["OPEN"] = 1)] = "OPEN"
+})(NightLightsStateEnum || (NightLightsStateEnum = {}))
+
+// 限远开关
+export let DistanceLimitStatusEnum
+
+;(function(DistanceLimitStatusEnum) {
+  DistanceLimitStatusEnum[(DistanceLimitStatusEnum["UNSET"] = 0)] = "UNSET"
+  DistanceLimitStatusEnum[(DistanceLimitStatusEnum["SET"] = 1)] = "SET"
+})(DistanceLimitStatusEnum || (DistanceLimitStatusEnum = {}))
+
+// 避障
+export let ObstacleAvoidanceStatusEnum
+
+;(function(ObstacleAvoidanceStatusEnum) {
+  ObstacleAvoidanceStatusEnum[(ObstacleAvoidanceStatusEnum["CLOSE"] = 0)] =
+    "CLOSE"
+  ObstacleAvoidanceStatusEnum[(ObstacleAvoidanceStatusEnum["OPEN"] = 1)] =
+    "OPEN"
+})(ObstacleAvoidanceStatusEnum || (ObstacleAvoidanceStatusEnum = {}))
+
+// 设备管理设置key
+export let DeviceSettingKeyEnum
+
+;(function(DeviceSettingKeyEnum) {
+  DeviceSettingKeyEnum["NIGHT_LIGHTS_MODE_SET"] = "night_lights_state"
+  DeviceSettingKeyEnum["HEIGHT_LIMIT_SET"] = "height_limit"
+  DeviceSettingKeyEnum["DISTANCE_LIMIT_SET"] = "distance_limit_status"
+  DeviceSettingKeyEnum["OBSTACLE_AVOIDANCE_HORIZON"] =
+    "obstacle_avoidance_horizon"
+  DeviceSettingKeyEnum["OBSTACLE_AVOIDANCE_UPSIDE"] =
+    "obstacle_avoidance_upside"
+  DeviceSettingKeyEnum["OBSTACLE_AVOIDANCE_DOWNSIDE"] =
+    "obstacle_avoidance_downside"
+})(DeviceSettingKeyEnum || (DeviceSettingKeyEnum = {}))
+
+export const initDeviceSetting = {
+  [DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET]: {
+    label: "飞行器夜航灯",
+    value: "",
+    trueValue: NightLightsStateEnum.CLOSE,
+    editable: false,
+    popConfirm: {
+      visible: false,
+      loading: false,
+      // content: '为保证飞行器的作业安全,建议打开夜航灯',
+      label: "飞行器夜航灯"
+    },
+    settingKey: DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET
+  },
+
+  [DeviceSettingKeyEnum.HEIGHT_LIMIT_SET]: {
+    label: "限高",
+    value: "",
+    trueValue: 120,
+    editable: false,
+    popConfirm: {
+      visible: false,
+      loading: false,
+      // content: '限高:20 - 1500m',
+      // info: '修改限高会影响当前机场的所有作业任务,建议确认作业情况后再进行修改',
+      label: "限高"
+    },
+    settingKey: DeviceSettingKeyEnum.HEIGHT_LIMIT_SET
+  },
+
+  [DeviceSettingKeyEnum.DISTANCE_LIMIT_SET]: {
+    label: "限远",
+    value: "",
+    trueValue: DistanceLimitStatusEnum.UNSET,
+    // info: '限远(15 - 8000m)是约束飞行器相对机场的最大作业距离',
+    editable: false,
+    popConfirm: {
+      visible: false,
+      loading: false,
+      // content: '限远 (15- 8000m) 是约束飞行器相对机场的最大作业距离',
+      // info: '修改限远会影响当前机场的所有作业任务,建议确认作业情况后再进行修改',
+      label: "限远"
+    },
+    settingKey: DeviceSettingKeyEnum.DISTANCE_LIMIT_SET
+  },
+
+  [DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON]: {
+    label: "水平避障",
+    value: "",
+    trueValue: ObstacleAvoidanceStatusEnum.CLOSE,
+    // info: '飞行器的避障工作状态显示,可以快速开启/关闭飞行器避障,如需进一步设置请在设备运维页面设置',
+    editable: false,
+    popConfirm: {
+      visible: false,
+      loading: false,
+      // content: '飞行器避障是保障飞行作业安全的基础功能,建议保持飞行器避障开启',
+      label: "水平避障"
+    },
+    settingKey: DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
+  },
+
+  [DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE]: {
+    label: "上视避障",
+    value: "",
+    trueValue: ObstacleAvoidanceStatusEnum.CLOSE,
+    // info: '飞行器的避障工作状态显示,可以快速开启/关闭飞行器避障,如需进一步设置请在设备运维页面设置',
+    editable: false,
+    popConfirm: {
+      visible: false,
+      loading: false,
+      // content: '飞行器避障是保障飞行作业安全的基础功能,建议保持飞行器避障开启',
+      label: "上视避障"
+    },
+    settingKey: DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
+  },
+
+  [DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE]: {
+    label: "下视避障",
+    value: "",
+    trueValue: ObstacleAvoidanceStatusEnum.CLOSE,
+    // info: '飞行器的避障工作状态显示,可以快速开启/关闭飞行器避障,如需进一步设置请在设备运维页面设置',
+    editable: false,
+    popConfirm: {
+      visible: false,
+      loading: false,
+      // content: '飞行器避障是保障飞行作业安全的基础功能,建议保持飞行器避障开启',
+      label: "下视避障"
+    },
+    settingKey: DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
+  }
+}
+
+export const initDeviceSettingFormModel = {
+  nightLightsState: false, // 夜航灯开关
+  heightLimit: 20, // 限高设置
+  distanceLimitStatus: { state: false, distanceLimit: 15 }, // 限远开关
+  obstacleAvoidanceHorizon: false, // 飞行器避障-水平开关设置
+  obstacleAvoidanceUpside: false, // 飞行器避障-上视开关设置
+  obstacleAvoidanceDownside: false // 飞行器避障-下视开关设置
+}
diff --git a/src/utils/device-setting.js b/src/utils/device-setting.js
new file mode 100644
index 0000000..b5f356e
--- /dev/null
+++ b/src/utils/device-setting.js
@@ -0,0 +1,283 @@
+import {
+  DeviceSettingKeyEnum,
+  DistanceLimitStatusEnum,
+  ObstacleAvoidanceStatusEnum,
+  NightLightsStateEnum
+} from "@/types/device-setting"
+import { DEFAULT_PLACEHOLDER } from "./constants"
+import { isNil } from "lodash"
+
+const Unit_M = " m"
+
+/**
+ * 根据osd 更新信息
+ * @param deviceSetting
+ * @param deviceInfo
+ * @returns
+ */
+export function updateDeviceSettingInfoByOsd(deviceSetting, deviceInfo) {
+  const { device, dock, gateway } = deviceInfo || {}
+  if (!deviceSetting) {
+    return
+  }
+  // 夜航灯
+  let nightLightsState = ""
+  if (isNil(device?.night_lights_state)) {
+    deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].editable = false
+    deviceSetting[
+      DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET
+    ].value = DEFAULT_PLACEHOLDER
+    nightLightsState = DEFAULT_PLACEHOLDER
+  } else {
+    deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].editable = true
+    nightLightsState = device?.night_lights_state
+    if (nightLightsState === NightLightsStateEnum.CLOSE) {
+      deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].value = "关闭"
+    } else if (nightLightsState === NightLightsStateEnum.OPEN) {
+      deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].value = "开启"
+    } else {
+      deviceSetting[
+        DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET
+      ].value = DEFAULT_PLACEHOLDER
+    }
+  }
+  deviceSetting[
+    DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET
+  ].trueValue = nightLightsState
+
+  // 限高
+  let heightLimit = device?.height_limit
+  if (isNil(heightLimit) || heightLimit === 0) {
+    heightLimit = DEFAULT_PLACEHOLDER
+    deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].editable = false
+  } else {
+    deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].editable = true
+  }
+  deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].trueValue = heightLimit
+  deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].value =
+    heightLimit + Unit_M
+
+  // 限远
+  let distanceLimitStatus = ""
+  if (isNil(device?.distance_limit_status?.state)) {
+    distanceLimitStatus = DEFAULT_PLACEHOLDER
+    deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].editable = false
+    deviceSetting[
+      DeviceSettingKeyEnum.DISTANCE_LIMIT_SET
+    ].value = DEFAULT_PLACEHOLDER
+  } else {
+    deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].editable = true
+    distanceLimitStatus = device?.distance_limit_status?.state
+    if (distanceLimitStatus === DistanceLimitStatusEnum.UNSET) {
+      deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].value = "关闭"
+    } else if (distanceLimitStatus === DistanceLimitStatusEnum.SET) {
+      const distanceLimit = device?.distance_limit_status?.distance_limit
+      if (distanceLimit) {
+        deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].value =
+          distanceLimit + Unit_M
+      } else {
+        deviceSetting[
+          DeviceSettingKeyEnum.DISTANCE_LIMIT_SET
+        ].value = DEFAULT_PLACEHOLDER
+      }
+    } else {
+      deviceSetting[
+        DeviceSettingKeyEnum.DISTANCE_LIMIT_SET
+      ].value = DEFAULT_PLACEHOLDER
+    }
+  }
+  deviceSetting[
+    DeviceSettingKeyEnum.DISTANCE_LIMIT_SET
+  ].trueValue = distanceLimitStatus
+
+  // 避障
+  if (isNil(device?.obstacle_avoidance)) {
+    deviceSetting[
+      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
+    ].editable = false
+    deviceSetting[
+      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
+    ].value = DEFAULT_PLACEHOLDER
+    deviceSetting[
+      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
+    ].trueValue = DEFAULT_PLACEHOLDER
+    deviceSetting[
+      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
+    ].editable = false
+    deviceSetting[
+      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
+    ].value = DEFAULT_PLACEHOLDER
+    deviceSetting[
+      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
+    ].trueValue = DEFAULT_PLACEHOLDER
+    deviceSetting[
+      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
+    ].editable = false
+    deviceSetting[
+      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
+    ].value = DEFAULT_PLACEHOLDER
+    deviceSetting[
+      DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
+    ].trueValue = DEFAULT_PLACEHOLDER
+  } else {
+    const { horizon, upside, downside } = device.obstacle_avoidance || {}
+    if (isNil(horizon)) {
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
+      ].editable = false
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
+      ].value = DEFAULT_PLACEHOLDER
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
+      ].trueValue = DEFAULT_PLACEHOLDER
+    } else {
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
+      ].editable = false
+      if (horizon === ObstacleAvoidanceStatusEnum.CLOSE) {
+        deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].value =
+          "关闭"
+      } else if (horizon === ObstacleAvoidanceStatusEnum.OPEN) {
+        deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].value =
+          "开启"
+      } else {
+        deviceSetting[
+          DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
+        ].value = DEFAULT_PLACEHOLDER
+      }
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON
+      ].trueValue = horizon
+    }
+
+    if (isNil(upside)) {
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
+      ].editable = false
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
+      ].value = DEFAULT_PLACEHOLDER
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
+      ].trueValue = DEFAULT_PLACEHOLDER
+    } else {
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
+      ].editable = false
+      if (upside === ObstacleAvoidanceStatusEnum.CLOSE) {
+        deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].value =
+          "关闭"
+      } else if (upside === ObstacleAvoidanceStatusEnum.OPEN) {
+        deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].value =
+          "开启"
+      } else {
+        deviceSetting[
+          DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
+        ].value = DEFAULT_PLACEHOLDER
+      }
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE
+      ].trueValue = upside
+    }
+
+    if (isNil(downside)) {
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
+      ].editable = false
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
+      ].value = DEFAULT_PLACEHOLDER
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
+      ].trueValue = DEFAULT_PLACEHOLDER
+    } else {
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
+      ].editable = false
+      if (downside === ObstacleAvoidanceStatusEnum.CLOSE) {
+        deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].value =
+          "关闭"
+      } else if (downside === ObstacleAvoidanceStatusEnum.OPEN) {
+        deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].value =
+          "开启"
+      } else {
+        deviceSetting[
+          DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
+        ].value = DEFAULT_PLACEHOLDER
+      }
+      deviceSetting[
+        DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE
+      ].trueValue = downside
+    }
+  }
+  return deviceSetting
+}
+
+// 更新formModel
+export function updateDeviceSettingFormModelByOsd(
+  deviceSettingFormModelFromOsd,
+  deviceInfo
+) {
+  const { device, dock, gateway } = deviceInfo || {}
+  if (!deviceSettingFormModelFromOsd) {
+    return
+  }
+  // 夜航灯
+  const nightLightsState = device?.night_lights_state
+  if (
+    !isNil(nightLightsState) &&
+    nightLightsState === NightLightsStateEnum.OPEN
+  ) {
+    deviceSettingFormModelFromOsd.nightLightsState = true
+  } else {
+    deviceSettingFormModelFromOsd.nightLightsState = false
+  }
+
+  // 限高
+  const heightLimit = device?.height_limit
+  if (isNil(heightLimit) || heightLimit === 0) {
+    deviceSettingFormModelFromOsd.heightLimit = 20
+  } else {
+    deviceSettingFormModelFromOsd.heightLimit = heightLimit
+  }
+
+  // 限远
+  const distanceLimitStatus = device?.distance_limit_status?.state
+  if (
+    !isNil(distanceLimitStatus) &&
+    distanceLimitStatus === DistanceLimitStatusEnum.SET
+  ) {
+    deviceSettingFormModelFromOsd.distanceLimitStatus.state = true
+    deviceSettingFormModelFromOsd.distanceLimitStatus.distanceLimit =
+      device?.distance_limit_status?.distance_limit || 15
+  } else {
+    deviceSettingFormModelFromOsd.distanceLimitStatus.state = false
+    deviceSettingFormModelFromOsd.distanceLimitStatus.distanceLimit = 15
+  }
+
+  // 避障
+  if (isNil(device?.obstacle_avoidance)) {
+    deviceSettingFormModelFromOsd.obstacleAvoidanceHorizon = false
+    deviceSettingFormModelFromOsd.obstacleAvoidanceUpside = false
+    deviceSettingFormModelFromOsd.obstacleAvoidanceDownside = false
+  } else {
+    const { horizon, upside, downside } = device.obstacle_avoidance || {}
+    if (!isNil(horizon) && horizon === ObstacleAvoidanceStatusEnum.OPEN) {
+      deviceSettingFormModelFromOsd.obstacleAvoidanceHorizon = true
+    } else {
+      deviceSettingFormModelFromOsd.obstacleAvoidanceHorizon = false
+    }
+    if (!isNil(upside) && upside === ObstacleAvoidanceStatusEnum.OPEN) {
+      deviceSettingFormModelFromOsd.obstacleAvoidanceUpside = true
+    } else {
+      deviceSettingFormModelFromOsd.obstacleAvoidanceUpside = false
+    }
+    if (!isNil(downside) && downside === ObstacleAvoidanceStatusEnum.OPEN) {
+      deviceSettingFormModelFromOsd.obstacleAvoidanceDownside = true
+    } else {
+      deviceSettingFormModelFromOsd.obstacleAvoidanceDownside = false
+    }
+  }
+  return deviceSettingFormModelFromOsd
+}
diff --git a/src/views/device/components/DeviceSettingBox.vue b/src/views/device/components/DeviceSettingBox.vue
index 90f3dec..2491c76 100644
--- a/src/views/device/components/DeviceSettingBox.vue
+++ b/src/views/device/components/DeviceSettingBox.vue
@@ -309,29 +309,18 @@
   </div>
 </template>
 
-<script setup lang="ts">
+<script setup>
 import { defineProps, ref, watch } from 'vue';
-import { DeviceInfoType } from '@/types/device';
-import { useMyStore } from '@/store';
 import { cloneDeep } from 'lodash';
-import {
-  initDeviceSetting,
-  initDeviceSettingFormModel,
-  DeviceSettingKeyEnum,
-} from '@/types/device-setting';
+import { initDeviceSetting, initDeviceSettingFormModel } from '@/types/device-setting';
 import {
   updateDeviceSettingInfoByOsd,
   updateDeviceSettingFormModelByOsd,
 } from '@/utils/device-setting';
 import { useDeviceSetting } from './use-device-setting';
-import DeviceSettingPopover from './DeviceSettingPopover.vue';
 
-const props = defineProps<{
-  sn: string;
-  deviceInfo: DeviceInfoType;
-}>();
+const props = defineProps();
 
-const store = useMyStore();
 const deviceSetting = ref(cloneDeep(initDeviceSetting));
 const deviceSettingFormModelFromOsd = ref(cloneDeep(initDeviceSettingFormModel));
 const deviceSettingFormModel = ref(cloneDeep(initDeviceSettingFormModel)); // 真实使用的formModel
@@ -350,16 +339,16 @@
   }
 );
 
-function onShowPopConfirm(settingKey: DeviceSettingKeyEnum) {
+function onShowPopConfirm(settingKey) {
   deviceSetting.value[settingKey].popConfirm.visible = true;
   deviceSettingFormModel.value = cloneDeep(deviceSettingFormModelFromOsd.value);
 }
 
-function onCancel(settingKey: DeviceSettingKeyEnum) {
+function onCancel(settingKey) {
   deviceSetting.value[settingKey].popConfirm.visible = false;
 }
 
-async function onConfirm(settingKey: DeviceSettingKeyEnum) {
+async function onConfirm(settingKey) {
   deviceSetting.value[settingKey].popConfirm.loading = true;
   const body = genDevicePropsBySettingKey(settingKey, deviceSettingFormModel.value);
   await setDeviceProps(props.sn, body);
diff --git a/src/views/device/components/DeviceSettingPopover.vue b/src/views/device/components/DeviceSettingPopover.vue
index d0531ba..224a689 100644
--- a/src/views/device/components/DeviceSettingPopover.vue
+++ b/src/views/device/components/DeviceSettingPopover.vue
@@ -32,18 +32,10 @@
   </a-popover>
 </template>
 
-<script lang="ts" setup>
+<script setup>
 import { defineProps, defineEmits, reactive, watch, computed } from 'vue';
 
-const props = defineProps<{
-  visible?: boolean;
-  loading?: Boolean;
-  disabled?: Boolean;
-  title?: String;
-  okText?: String;
-  cancelText?: String;
-  width?: Number;
-}>();
+const props = defineProps();
 
 const emit = defineEmits(['cancel', 'confirm']);
 
@@ -71,14 +63,14 @@
   return classList.join(' ');
 });
 
-function onConfirm(e: Event) {
+function onConfirm(e) {
   if (props.disabled) {
     return;
   }
   emit('confirm', e);
 }
 
-function onCancel(e: Event) {
+function onCancel(e) {
   state.sVisible = false;
   emit('cancel', e);
 }
diff --git a/src/views/device/components/use-device-setting.js b/src/views/device/components/use-device-setting.js
new file mode 100644
index 0000000..ede8603
--- /dev/null
+++ b/src/views/device/components/use-device-setting.js
@@ -0,0 +1,72 @@
+import { ElMessage } from 'element-plus';
+
+import { putDeviceProps } from '@/api/device-setting';
+import {
+  DeviceSettingKeyEnum,
+  ObstacleAvoidanceStatusEnum,
+  NightLightsStateEnum,
+  DistanceLimitStatusEnum,
+} from '@/types/device-setting';
+
+export function useDeviceSetting() {
+  // 生成参数
+  function genDevicePropsBySettingKey(key, fromModel) {
+    const body = {};
+    if (key === DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET) {
+      body.night_lights_state = fromModel.nightLightsState
+        ? NightLightsStateEnum.OPEN
+        : NightLightsStateEnum.CLOSE;
+    } else if (key === DeviceSettingKeyEnum.HEIGHT_LIMIT_SET) {
+      body.height_limit = fromModel.heightLimit;
+    } else if (key === DeviceSettingKeyEnum.DISTANCE_LIMIT_SET) {
+      body.distance_limit_status = {};
+      if (fromModel.distanceLimitStatus.state) {
+        body.distance_limit_status.state = DistanceLimitStatusEnum.SET;
+        body.distance_limit_status.distance_limit = fromModel.distanceLimitStatus.distanceLimit;
+      } else {
+        body.distance_limit_status.state = DistanceLimitStatusEnum.UNSET;
+      }
+    } else if (key === DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON) {
+      body.obstacle_avoidance = {
+        horizon: fromModel.obstacleAvoidanceHorizon
+          ? ObstacleAvoidanceStatusEnum.OPEN
+          : ObstacleAvoidanceStatusEnum.CLOSE,
+      };
+    } else if (key === DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE) {
+      body.obstacle_avoidance = {
+        upside: fromModel.obstacleAvoidanceUpside
+          ? ObstacleAvoidanceStatusEnum.OPEN
+          : ObstacleAvoidanceStatusEnum.CLOSE,
+      };
+    } else if (key === DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE) {
+      body.obstacle_avoidance = {
+        downside: fromModel.obstacleAvoidanceDownside
+          ? ObstacleAvoidanceStatusEnum.OPEN
+          : ObstacleAvoidanceStatusEnum.CLOSE,
+      };
+    }
+    return body;
+  }
+
+  // 设置设备属性
+  async function setDeviceProps(sn, body) {
+    try {
+      const { code, message: msg } = await putDeviceProps(sn, body);
+      if (code === 0) {
+        return true;
+      }
+      throw msg;
+    } catch (e) {
+      ElMessage({
+        message: '设备属性设置失败',
+        type: 'error',
+      });
+      return false;
+    }
+  }
+
+  return {
+    genDevicePropsBySettingKey,
+    setDeviceProps,
+  };
+}

--
Gitblit v1.9.3