From 2ca94de8ede18ac07ccfd8dec7b6f6a707adde9b Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Mon, 01 Sep 2025 11:20:24 +0800
Subject: [PATCH] Merge branch 'refs/heads/feature/v5.0/5.0.5' into patch_management

---
 src/api/device-setting/index.js                      |    4 
 src/views/job/components/SearchBox.vue               |   51 ++-
 src/views/tickets/ticket.vue                         |   49 ++
 src/views/tickets/orderLog.vue                       |    9 
 src/views/device/components/DockControlPanel.vue     |    4 
 src/views/device/index.vue                           |    5 
 yarn.lock                                            |   24 
 src/views/device/components/DeviceSettingBox.vue     |   72 ++-
 src/views/device/addDevice.vue                       |   45 +-
 src/views/device/components/use-device-setting.js    |   15 
 src/views/device/airport.vue                         |  631 +++++++++++++++++++++++++++++----------
 src/views/device/components/DeviceSettingPopover.vue |   23 
 12 files changed, 649 insertions(+), 283 deletions(-)

diff --git a/src/api/device-setting/index.js b/src/api/device-setting/index.js
index 84fba89..3ccc262 100644
--- a/src/api/device-setting/index.js
+++ b/src/api/device-setting/index.js
@@ -15,12 +15,14 @@
 const workspaceId = localStorage.getItem(ELocalStorageKey.WorkspaceId) || ''
 
 export const putDeviceProps = (deviceSn, body) => {
+  console.log(deviceSn, body, workspaceId, '8888')
   return request({
     url: `/drone-device-core/manage/api/v1/devices/${workspaceId}/devices/${deviceSn}/property`,
     method: 'put',
-    body,
+    data: body,
   })
 }
+
 /**
  * 设置调色盘
  * @param {机场编码} deviceSn 
diff --git a/src/views/device/addDevice.vue b/src/views/device/addDevice.vue
index f55d3af..f556b04 100644
--- a/src/views/device/addDevice.vue
+++ b/src/views/device/addDevice.vue
@@ -81,7 +81,7 @@
                 calcHeight: 20,
                 column: [
                     {
-                        label: '工作空间名称',
+                        label: '设备名称',// '工作空间名称',
                         prop: 'workspace_name',
                         editDisabled: true,
                         searchLabelWidth: 130,
@@ -91,40 +91,24 @@
                         rules: [
                             {
                                 required: true,
-                                message: '请输入工作空间名称',
+                                message: '请输入设备名称',
                                 trigger: 'blur',
                             },
                         ],
                     },
                     {
-                        label: '工作空间描述',
-                        prop: 'workspace_desc',
-                        labelWidth: 130,
-                        // search: true,
-                        searchSpan: 4,
-                        // editDisabled: true,
-                        rules: [
-                            {
-                                required: true,
-                                message: '请输入工作空间描述',
-                                trigger: 'blur',
-                            },
-                        ],
-                    },
-                    {
-                        label: '平台名称',
+                        label: '系统名称',// '平台名称',
                         prop: 'platform_name',
                         labelWidth: 130,
                         editDisabled: true,
                         rules: [
                             {
                                 required: false,
-                                message: '请输入平台名称',
+                                message: '请输入系统名称',
                                 trigger: 'blur',
                             },
                         ],
                     },
-
                     {
                         label: '所属单位',
                         prop: 'dept_id',
@@ -182,10 +166,27 @@
                         ],
                     },
                     {
+                        label: '设备描述',// '工作空间描述',
+                        prop: 'workspace_desc',
+                        labelWidth: 130,
+                        // search: true,
+                        searchSpan: 4,
+                        // editDisabled: true,
+                        rules: [
+                            {
+                                required: true,
+                                message: '请输入设备描述',
+                                trigger: 'blur',
+                            },
+                        ],
+                    },
+                    
+                    {
                         label: '创建时间',
                         prop: 'create_time',
                         addDisplay: false,
                         editDisplay: false,
+                        overHidden: true,
                         type: 'date',
                         labelWidth: 130,
                         width: 160,
@@ -193,7 +194,7 @@
 
                     },
                     {
-                        label: '行政区划',
+                        label: '设备位置',// '行政区划',
                         prop: 'area_code',
                         type: 'cascader',
                         labelWidth: 130,
@@ -212,7 +213,7 @@
                         rules: [
                         {
                             required: true,
-                            message: '请选择行政区划',
+                            message: '请选择设备位置',
                             trigger: 'change',
                         },
                         ],
diff --git a/src/views/device/airport.vue b/src/views/device/airport.vue
index ac96407..8ff0905 100644
--- a/src/views/device/airport.vue
+++ b/src/views/device/airport.vue
@@ -45,33 +45,79 @@
             :percentage="row.firmware_progress"></el-progress>
         </div>
       </template>
+      <template #domain="{ row }">
+        <span class="text">
+          {{ row.domain == 3 ? '机巢' : row.domain == 0 ? '无人机' : '其他' }}
+        </span>
+      </template>
       <template #mode_code="{ row }">
-        <span class="text" v-if="row.domain == 3" :style="row.mode_code != '-1' ? 'color: #00ee8b' : 'color: #de5e5e'">
-          {{ getDockModeText(row.mode_code) }}
+        <span class="text" v-if="row.domain == 3 || row.domain == 0" :style="row.mode_code != '-1' ? 'color: #00ee8b' : 'color: #de5e5e'">
+          {{ getModelText(row.mode_code) }}
         </span>
       </template>
       <template #menu="scope">
-        <el-button type="primary" text icon="el-icon-paperclip" v-if="permission.oss_set"
-          @click.stop="handleOpenOssSet(scope.row, scope.index)">存储配置
-        </el-button>
-        <el-button type="primary" text icon="el-icon-share" v-if="permission.per_share && scope.row.domain == 3"
-          @click.stop="handleOpenDevicePerShare(scope.row, scope.index)">机场授权
-        </el-button>
-
-        <el-button type="primary" text icon="el-icon-position" :disabled="!scope.row.status"
-          v-if="permission.rang_con && scope.row.domain == 3"
-          @click.stop="handleOpenRemoteDebugging(scope.row, scope.index)">远程调试
-        </el-button>
-
-        <el-button type="primary" text icon="el-icon-setting" v-if="permission.fly_device_offline"
-          @click.stop="handleDeviceOffline(scope.row)">设备下线
-        </el-button>
+        <el-dropdown>
+              <el-button type="primary" text icon="el-icon-more" v-if="permission.oss_set">更 多</el-button>
+              <template #dropdown v-if="scope.row.domain == 3">
+                <el-dropdown-menu teleported>
+                  <el-dropdown-item command="a">
+                    <el-button type="primary" text icon="el-icon-paperclip" v-if="permission.oss_set" @click.stop="handleOpenOssSet(scope.row, scope.index)">存储配置</el-button>
+                  </el-dropdown-item>
+                  <el-dropdown-item command="b">
+                    <el-button type="primary" text icon="el-icon-share" v-if="permission.per_share && scope.row.domain == 3"
+                      @click.stop="handleOpenDevicePerShare(scope.row, scope.index)">机场授权</el-button>
+                  </el-dropdown-item>
+                  <el-dropdown-item command="c"> <el-button type="primary" text icon="el-icon-position" :disabled="!scope.row.status"
+                    v-if="permission.rang_con && scope.row.domain == 3"
+                    @click.stop="handleOpenRemoteDebugging(scope.row, scope.index)">远程调试</el-button>
+                  </el-dropdown-item>
+                  <el-dropdown-item command="d"><el-button type="primary" text icon="el-icon-collection" v-if="permission.fly_device_offline"
+                        @click.stop="rollFirmware(scope.row)">固件版本管理</el-button>
+                  </el-dropdown-item>
+                  <el-dropdown-item command="e"><el-button type="primary" text icon="el-icon-document-delete" v-if="permission.fly_device_offline"
+                    @click.stop="handleDeviceOffline(scope.row)">注销</el-button>
+                  </el-dropdown-item>
+                </el-dropdown-menu>
+              </template>
+              <template #dropdown v-else>
+                <el-dropdown-menu teleported>
+                  <el-dropdown-item command="a">
+                    <el-button type="primary" text icon="el-icon-circle-close" @click.stop="rowDel(scope.row, scope.index)">删除</el-button>
+                  </el-dropdown-item>
+                  <el-dropdown-item command="a">
+                    <el-button type="primary" text icon="el-icon-key" v-if="permission.operate_password_set" @click.stop="handleOperatePassword(scope.row, scope.index)">操控密码设置</el-button>
+                  </el-dropdown-item>
+                </el-dropdown-menu>
+              </template>
+            </el-dropdown>
       </template>
+      
       <!-- 添加行政区划显示模板 -->
       <template #area_code="{ row }">
         <span>{{ row.area_name }}</span>
       </template>
     </avue-crud>
+
+    <el-dialog title="操控密码设置" append-to-body v-model="operatePasswordSetBox" width="450px">
+      <el-form :model="passwordForm" ref="passwordForm" label-width="80px" :rules="rules" v-loading="loadingForm">
+        <el-form-item label="密码" prop="password">
+          <el-input type="password" v-model="passwordForm.password" placeholder="请输入密码" show-password></el-input>
+        </el-form-item>
+        <el-form-item label="确认密码" prop="password2">
+          <el-input type="password" v-model="passwordForm.password2" placeholder="请输入确认密码" show-password></el-input>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="operatePasswordSetBox = false">取 消</el-button>
+          <el-button type="primary" @click="setOperatePasswordConfirm">确 定</el-button>
+        </span>
+      </template>
+    </el-dialog>
+
+    <el-dialog title="操控密码查看" append-to-body v-model="operatePasswordViewBox" width="455px">
+      <el-input v-model="operate_password" disabled></el-input>
+    </el-dialog>
 
     <el-dialog title="固件升级" append-to-body v-model="firmwareBox" width="455px">
       <div>升级固件版本:{{ firmwareVersion }}</div>
@@ -133,7 +179,7 @@
 
 <script>
 import { ElMessage, ElMessageBox } from 'element-plus'
-
+import { pxToRem } from '@/utils/rem'
 import {
   getList,
   remove,
@@ -163,7 +209,35 @@
     DockControlPanel,
   },
   data () {
+    const validatePass = (rule, value, callback) => {
+      if (value === '') {
+        callback(new Error('请输入密码'))
+      } else {
+        callback()
+      }
+    }
+    const validatePass2 = (rule, value, callback) => {
+      if (value === '') {
+        callback(new Error('请再次输入密码'))
+      } else if (value !== this.passwordForm.password) {
+        callback(new Error('两次输入密码不一致!'))
+      } else {
+        callback()
+      }
+    }
     return {
+      rules: {
+        password: [{ required: true, validator: validatePass, trigger: 'blur' }],
+        password2: [{ required: true, validator: validatePass2, trigger: 'blur' }],
+      },
+      passwordForm: {
+        id: '',
+        password: '',
+        password2: '',
+      },
+      operatePasswordSetBox: false,
+      operatePasswordViewBox: false,
+      operate_password: '',
       bindOssId: null,
       deviceSn: '',
       ossSetBox: false,
@@ -207,6 +281,7 @@
         border: true,
         index: true,
         viewBtn: true,
+        delBtn: false,
         selection: true,
         excelBtn: false,
         addBtn: false,
@@ -218,162 +293,108 @@
 
         column: [
           {
+            label: '设备类型',
+            prop: 'domain',
+            editDisabled: true,
+            editDisplay: false, //编辑显示
+            viewDisplay: true, //查看显示
+            search: false,
+            slot: true,
+            searchSpan: 4,
+            labelWidth: 130,
+            width: 120,
+            // rules: [
+            //   {
+            //     required: true,
+            //     message: '请输入设备类型',
+            //     trigger: 'blur',
+            //   },
+            // ],
+          },
+          {
             label: '设备型号',
             prop: 'device_name',
             editDisabled: true,
-            search: true,
+            viewDisplay: true, //查看显示
+            search: false,
             searchSpan: 4,
             labelWidth: 130,
-            rules: [
-              {
-                required: true,
-                message: '请输入设备型号',
-                trigger: 'blur',
-              },
-            ],
+            width: 120,
+            // rules: [
+            //   {
+            //     required: true,
+            //     message: '请输入设备型号',
+            //     trigger: 'blur',
+            //   },
+            // ],
           },
           {
             label: '设备SN',
             prop: 'device_sn',
             labelWidth: 130,
-            search: true,
+            width: 120,
+            overHidden: true,
             searchSpan: 4,
             editDisabled: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入设备SN',
-                trigger: 'blur',
-              },
-            ],
+            // rules: [
+            //   {
+            //     required: true,
+            //     message: '请输入设备SN',
+            //     trigger: 'blur',
+            //   },
+            // ],
           },
+          // {
+          //   label: '机巢编号',
+          //   prop: 'machine_nest_sn',
+          //   labelWidth: 130,
+          //   editDisabled: true,
+          //   rules: [
+          //     {
+          //       required: false,
+          //       message: '请输入机巢编号',
+          //       trigger: 'blur',
+          //     },
+          //   ],
+          // },
           {
-            label: '机巢编号',
-            prop: 'machine_nest_sn',
-            labelWidth: 130,
-            editDisabled: true,
-            rules: [
-              {
-                required: false,
-                message: '请输入机巢编号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '设备组织名称',
+            label: '设备名称',
             prop: 'nickname',
             labelWidth: 130,
-            rules: [
-              {
-                required: true,
-                message: '请输入设备组织名称',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '固件版本',
-            prop: 'firmware_version',
-            labelWidth: 130,
             width: 100,
-            editDisabled: true,
+            searchSpan: 4,
+            search: true,
+            overHidden: true,
+            editDisplay: true, //编辑显示
             rules: [
               {
                 required: true,
-                message: '请输入固件版本',
+                message: '请输入设备名称',
                 trigger: 'blur',
               },
             ],
           },
           {
-            label: '固件升级',
-            prop: 'firmware_status',
-            labelWidth: 130,
-            width: 100,
-            viewDisabled: true,
-            addDisabled: true,
-            editDisabled: true,
-            addDisplay: false,
-            editDisplay: false,
-            viewDisplay: false,
-            rules: [
-              {
-                required: true,
-                message: '请输入固件升级',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '所属单位',
-            prop: 'dept_name',
-            addDisplay: false,
-            editDisplay: false,
-            viewDisplay: false,
-            labelWidth: 130,
-            rules: [
-              {
-                required: true,
-                message: '请输入所属单位',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '所属单位',
-            prop: 'dept_id',
-            hide: true,
-            type: 'tree',
-            defaultExpandAll: true,
-            labelWidth: 130,
-            dicUrl: '/blade-system/dept/getTree',
-            props: {
-              label: 'name',
-              value: 'id',
-            },
-            rules: [
-              {
-                required: true,
-                message: '请输入所属单位',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '加入组织时间',
-            prop: 'bound_time',
-            addDisplay: false,
-            editDisplay: false,
-            type: 'date',
-            labelWidth: 130,
-            width: 160,
-            format: 'YYYY-MM-DD HH:mm:ss',
-            // valueFormat: 'YYYY-MM-DD HH:mm:ss',
-            rules: [
-              {
-                required: true,
-                message: '请输入在线状态',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '行政区划',
+            label: '设备位置',// '行政区划',
             prop: 'area_name',
-            hide: true,
+            // hide: true,
+            overHidden: true,
             editDisplay: false, //编辑显示
-            viewDisplay: true, //查看显示
+            viewDisplay: false, //查看显示
             labelWidth: 130,
+            width: 100,
           },
           {
-            label: '行政区划',
+            label: '设备位置',
             prop: 'area_code',
             type: 'cascader',
             labelWidth: 130,
+            searchSpan: 4,
             hide: true,
+            search: true,
+            // overHidden: true,
             editDisplay: true,
-            viewDisplay: false,
+            viewDisplay: true,
             props: {
               label: 'title',
               value: 'value',
@@ -386,7 +407,7 @@
             rules: [
               {
                 required: true,
-                message: '请选择行政区划',
+                message: '请选择设备位置',
                 trigger: 'change',
               },
             ],
@@ -424,6 +445,170 @@
               }
             },
           },
+          // {
+          //   label: '设备位置',
+          //   prop: 'address',
+          //   labelWidth: 130,
+          //   width: 100,
+          //   overHidden: true,
+          //   rules: [
+          //     {
+          //       required: true,
+          //       message: '请输入设备位置',
+          //       trigger: 'blur',
+          //     },
+          //   ],
+          // },
+          
+          {
+            label: '负载设备',
+            prop: 'payload_str',
+            labelWidth: 130,
+            width: 100,
+            overHidden: true,
+            editDisabled: true,
+            // rules: [
+            //   {
+            //     required: true,
+            //     message: '请输入负载设备',
+            //     trigger: 'blur',
+            //   },
+            // ],
+          },
+          // {
+          //   label: '保险有效期',
+          //   prop: 'insureExpiredTime',
+          //   labelWidth: 130,
+          //   width: 110,
+          //   rules: [
+          //     {
+          //       required: true,
+          //       message: '请输入保险有效期',
+          //       trigger: 'blur',
+          //     },
+          //   ],
+          // },
+          {
+            label: '流量剩余',
+            prop: 'traffic_remaining',
+            labelWidth: 130,
+            width: 100,
+            editDisabled: true,
+            // rules: [
+            //   {
+            //     required: true,
+            //     message: '请输入流量剩余',
+            //     trigger: 'blur',
+            //   },
+            // ],
+          },
+          {
+            label: '流量到期时间',
+            prop: 'traffic_expire_time',
+            labelWidth: 130,
+            width: 120,
+            type: 'date',
+            format: 'YYYY-MM-DD',
+            editDisabled: true,
+            // rules: [
+            //   {
+            //     required: true,
+            //     message: '请输入流量到期时间',
+            //     trigger: 'blur',
+            //   },
+            // ],
+          },
+          {
+            label: '固件版本',
+            prop: 'firmware_version',
+            labelWidth: 130,
+            width: 110,
+            editDisabled: true,
+            // rules: [
+            //   {
+            //     required: true,
+            //     message: '请输入固件版本',
+            //     trigger: 'blur',
+            //   },
+            // ],
+          },
+          {
+            label: '固件升级',
+            prop: 'firmware_status',
+            labelWidth: 130,
+            width: 100,
+            hide: true,
+            viewDisabled: true,
+            addDisabled: true,
+            editDisabled: true,
+            addDisplay: false,
+            editDisplay: false,
+            viewDisplay: false,
+            // rules: [
+            //   {
+            //     required: true,
+            //     message: '请输入固件升级',
+            //     trigger: 'blur',
+            //   },
+            // ],
+          },
+          {
+            label: '所属单位',
+            prop: 'dept_name',
+            addDisplay: false,
+            editDisplay: false,
+            viewDisplay: false,
+            labelWidth: 130,
+            width: 180,
+            rules: [
+              {
+                required: true,
+                message: '请输入所属单位',
+                trigger: 'blur',
+              },
+            ],
+          },
+          {
+            label: '所属单位',
+            prop: 'dept_id',
+            hide: true,
+            type: 'tree',
+            defaultExpandAll: true,
+            search: true,
+            searchSpan: 4,
+            labelWidth: 130,
+            dicUrl: '/blade-system/dept/getTree',
+            props: {
+              label: 'name',
+              value: 'id',
+            },
+            rules: [
+              {
+                required: true,
+                message: '请输入所属单位',
+                trigger: 'blur',
+              },
+            ],
+          },
+          // {
+          //   label: '加入组织时间',
+          //   prop: 'bound_time',
+          //   addDisplay: false,
+          //   editDisplay: false,
+          //   type: 'date',
+          //   labelWidth: 130,
+          //   width: 160,
+          //   format: 'YYYY-MM-DD HH:mm:ss',
+          //   // valueFormat: 'YYYY-MM-DD HH:mm:ss',
+          //   rules: [
+          //     {
+          //       required: true,
+          //       message: '请输入在线状态',
+          //       trigger: 'blur',
+          //     },
+          //   ],
+          // },
+          
 
           {
             hide: true,
@@ -448,37 +633,65 @@
             label: '在线时间',
             prop: 'login_time',
             type: 'date',
-            addDisplay: false,
-            editDisplay: false,
+            editDisplay: true, //编辑显示
+            editDisabled: true,
+            viewDisplay: true, //查看显示
+            addDisplay: true,
+            labelWidth: 130,
+            width: 160,
+            overHidden: true,
+            format: 'YYYY-MM-DD HH:mm:ss',
+            // valueFormat: 'YYYY-MM-DD HH:mm:ss',
+            startPlaceholder: '任务开始时间',
+            // rules: [
+            //   {
+            //     required: true,
+            //     message: '请输入在线时间',
+            //     trigger: 'blur',
+            //   },
+            // ],
+          },
+          {
+            label: '注册时间',
+            prop: 'create_time',
+            type: 'date',
+            editDisplay: true, //编辑显示
+            editDisabled: true,
+            viewDisplay: true, //查看显示
+            addDisplay: true,
+            overHidden: true,
             labelWidth: 130,
             width: 160,
             format: 'YYYY-MM-DD HH:mm:ss',
             // valueFormat: 'YYYY-MM-DD HH:mm:ss',
-            startPlaceholder: '任务开始时间',
-            rules: [
-              {
-                required: true,
-                message: '请输入在线时间',
-                trigger: 'blur',
-              },
-            ],
+            startPlaceholder: '创建时间',
+            // rules: [
+            //   {
+            //     required: true,
+            //     message: '请输入创建时间',
+            //     trigger: 'blur',
+            //   },
+            // ],
           },
           {
-            label: '在线状态',
+            label: '设备状态',
             prop: 'cnstatus',
             hide: true,
             addDisplay: false,
             editDisplay: false,
-            viewDisplay: true,
+            viewDisplay: false,
             labelWidth: 130,
           },
           {
-            label: '在线状态',
+            label: '设备状态',
             prop: 'status',
             addDisplay: false,
             editDisplay: false,
             viewDisplay: false,
-            labelWidth: 130,
+            labelWidth: 100,
+            hide: true,
+            // searchSpan: 4,
+            // search: true,
             slot: true,
             width: 100,
 
@@ -491,24 +704,34 @@
             ],
           },
           {
-            label: '机场状态',
+            label: '设备状态',
             prop: 'cnmode_code',
             hide: true,
             addDisplay: false,
             editDisplay: false,
             viewDisplay: true,
             labelWidth: 130,
+            width: 110,
           },
           {
-            label: '机场状态',
+            label: '设备状态',
             prop: 'mode_code',
-
             addDisplay: false,
             editDisplay: false,
             viewDisplay: false,
             labelWidth: 130,
+            searchSpan: 4,
+            search: true,
+            type: 'select',
+            dicData: [
+              { label: '在线', value: 0 },
+              { label: '离线', value: -1 },
+              { label: '远程调试', value: 2 },
+              { label: '现场调试', value: 1 },
+              { label: '固件升级中', value: 3 }
+            ],
             slot: true,
-            width: 100,
+            width: 110,
 
             rules: [
               {
@@ -562,9 +785,25 @@
       }
     })
   },
+  mounted() {
+
+  },
   methods: {
     getDockModeText (value) {
       return EDockModeText[value] || ''
+    },
+    getModelText (value) {
+      let txt = '离线'
+      if (value === 0 || value === 4) {
+        txt = '在线'
+      } else if(value === 1) {
+        txt = '现场调试'
+      } else if(value === 2) {
+        txt = '远程调试'
+      } else if(value === 3) {
+        txt = '固件升级中'
+      }
+      return txt
     },
     // 关闭所有的webscoket
     closeAllWebsoket () {
@@ -644,7 +883,7 @@
 
     // 设备下线
     handleDeviceOffline (row) {
-      ElMessageBox.confirm('确定下线该设备吗?', '提示', {
+      ElMessageBox.confirm('确定注销该设备吗?', '提示', {
         confirmButtonText: '确定',
         cancelButtonText: '取消',
         type: 'warning',
@@ -652,12 +891,12 @@
         .then(() => {
           deviceOffline(row.device_sn)
             .then(res => {
-              ElMessage.success('下线成功')
+              ElMessage.success('注销成功')
 
               this.init()
             })
             .catch(error => {
-              ElMessage.error('下线失败')
+              ElMessage.error('注销失败')
             })
         })
         .catch(() => { })
@@ -1067,6 +1306,7 @@
             area_code: await this.getFullAreaCode(data.area_code),
             area_name: this.form.area_name,
             cnmode_code: this.getDockModeText(this.form.mode_code),
+            domain: data.domain === 0 ? '无人机' : data.domain === 3 ? '机巢' : '未知',
             cnstatus: this.form.status === false ? '离线' : '在线',
             duration_of_insurance: [data?.insure_start_time || '', data?.insure_expired_time || ''],
           }
@@ -1123,6 +1363,55 @@
         const data = res.data.data.records
         resolve(data)
       })
+    },
+    rowDel (row) {
+      this.$confirm('确定将选择数据删除?', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+        .then(() => {
+          return remove(row.id)
+        })
+        .then(() => {
+          this.onLoad(this.page)
+          this.$message({
+            type: 'success',
+            message: '操作成功!',
+          })
+        })
+    },
+    // 设置无人机操作密码
+    setOperatePasswordConfirm () {
+      var that = this
+      this.$refs.passwordForm.validate(valid => {
+        if (valid) {
+          this.loadingForm = true
+          const data = {
+            id: this.passwordForm.id,
+            operate_password: this.passwordForm.password,
+          }
+          // 提交
+          operatePasswordUpdate(data).then(res => {
+            this.loadingForm = false
+            this.operatePasswordSetBox = false
+            that.passwordForm = {}
+            this.onLoad(this.page)
+            this.$message({
+              type: 'success',
+              message: '操作成功!',
+            })
+          })
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    },
+    // 操作密码设置
+    handleOperatePassword (row) {
+      this.operatePasswordSetBox = true
+      this.passwordForm.id = row.id
     },
   },
 }
@@ -1189,4 +1478,24 @@
     border-color: #409eff;
   }
 }
+:deep(.avue-crud__menu) {
+  display: flex;
+}
+.more-container {
+  position: relative;
+}
+.show-more-do {
+  position: absolute;
+  background-color: #ffffff;
+  // border: 1px solid #409eff;
+  z-index: 9999;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+  width: 140px;
+  font-size: 12px;
+  // height: 140px;
+  height: 190px;
+  right: 0;
+}
+
+
 </style>
diff --git a/src/views/device/components/DeviceSettingBox.vue b/src/views/device/components/DeviceSettingBox.vue
index 2491c76..92a4b44 100644
--- a/src/views/device/components/DeviceSettingBox.vue
+++ b/src/views/device/components/DeviceSettingBox.vue
@@ -57,15 +57,15 @@
                 <span class="form-label"
                   >{{ deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].label }}:</span
                 >
-                <a-switch
-                  checked-children="开"
-                  un-checked-children="关"
-                  v-model:checked="deviceSettingFormModel.nightLightsState"
+                <el-switch
+                  active-text="开"
+                  inactive-text="关"
+                  v-model="deviceSettingFormModel.nightLightsState"
                 />
               </div>
             </template>
             <a
-              @click="
+              @click.stop="
                 onShowPopConfirm(
                   deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].settingKey
                 )
@@ -95,14 +95,15 @@
             <template #formContent>
               <div class="form-content">
                 <span class="form-label"
-                  >{{ deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].label }}:</span
+                  >{{ deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].label }}:(m)</span
                 >
-                <a-input-number
-                  v-model:value="deviceSettingFormModel.heightLimit"
+                <el-input-number
+                  size="small"
+                  v-model="deviceSettingFormModel.heightLimit"
                   :min="20"
                   :max="1500"
                 />
-                m
+
               </div>
             </template>
             <a
@@ -136,14 +137,15 @@
                 <span class="form-label"
                   >{{ deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].label }}:</span
                 >
-                <a-switch
+                <el-switch
                   style="margin-right: 10px"
-                  checked-children="开"
-                  un-checked-children="关"
-                  v-model:checked="deviceSettingFormModel.distanceLimitStatus.state"
+                  active-text="开"
+                  inactive-text="关"
+                  v-model="deviceSettingFormModel.distanceLimitStatus.state"
                 />
-                <a-input-number
-                  v-model:value="deviceSettingFormModel.distanceLimitStatus.distanceLimit"
+                <el-input-number
+                  size="small"
+                  v-model="deviceSettingFormModel.distanceLimitStatus.distanceLimit"
                   :min="15"
                   :max="8000"
                 />
@@ -189,10 +191,10 @@
                 <span class="form-label"
                   >{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].label }}:</span
                 >
-                <a-switch
-                  checked-children="开"
-                  un-checked-children="关"
-                  v-model:checked="deviceSettingFormModel.obstacleAvoidanceHorizon"
+                <el-switch
+                  active-text="开"
+                  inactive-text="关"
+                  v-model="deviceSettingFormModel.obstacleAvoidanceHorizon"
                 />
               </div>
             </template>
@@ -237,10 +239,10 @@
                 <span class="form-label"
                   >{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].label }}:</span
                 >
-                <a-switch
-                  checked-children="开"
-                  un-checked-children="关"
-                  v-model:checked="deviceSettingFormModel.obstacleAvoidanceUpside"
+                <el-switch
+                  active-text="开"
+                  inactive-text="关"
+                  v-model="deviceSettingFormModel.obstacleAvoidanceUpside"
                 />
               </div>
             </template>
@@ -287,10 +289,10 @@
                     deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].label
                   }}:</span
                 >
-                <a-switch
-                  checked-children="开"
-                  un-checked-children="关"
-                  v-model:checked="deviceSettingFormModel.obstacleAvoidanceDownside"
+                <el-switch
+                  active-text="开"
+                  inactive-text="关"
+                  v-model="deviceSettingFormModel.obstacleAvoidanceDownside"
                 />
               </div>
             </template>
@@ -311,15 +313,18 @@
 
 <script setup>
 import { defineProps, ref, watch } from 'vue';
+import { ELocalStorageKey } from '@/types'
 import { cloneDeep } from 'lodash';
-import { initDeviceSetting, initDeviceSettingFormModel } from '@/types/device-setting';
+import { initDeviceSetting, initDeviceSettingFormModel, DeviceSettingKeyEnum } 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();
+// const props = defineProps();
+const props = defineProps(['sn', 'deviceInfo'])
 
 const deviceSetting = ref(cloneDeep(initDeviceSetting));
 const deviceSettingFormModelFromOsd = ref(cloneDeep(initDeviceSettingFormModel));
@@ -351,6 +356,7 @@
 async function onConfirm(settingKey) {
   deviceSetting.value[settingKey].popConfirm.loading = true;
   const body = genDevicePropsBySettingKey(settingKey, deviceSettingFormModel.value);
+  localStorage.setItem(ELocalStorageKey.WorkspaceId, props.deviceInfo.workspace_id)
   await setDeviceProps(props.sn, body);
   deviceSetting.value[settingKey].popConfirm.loading = false;
   deviceSetting.value[settingKey].popConfirm.visible = false;
@@ -362,7 +368,7 @@
 
 <style lang="scss" scoped>
 .device-setting-wrapper {
-  border-bottom: 1px solid #515151;
+  //border-bottom: 1px solid #515151;
 
   .device-setting-header {
     font-size: 14px;
@@ -408,6 +414,12 @@
           font-weight: 700;
         }
       }
+      .control-setting-item-right {
+        .el-tooltip__trigger {
+          color: #1C5CFF;
+          cursor: pointer;
+        }
+      }
     }
   }
 }
diff --git a/src/views/device/components/DeviceSettingPopover.vue b/src/views/device/components/DeviceSettingPopover.vue
index 224a689..fb90a89 100644
--- a/src/views/device/components/DeviceSettingPopover.vue
+++ b/src/views/device/components/DeviceSettingPopover.vue
@@ -1,41 +1,38 @@
 <template>
-  <a-popover
+  <el-popover
     :visible="state.sVisible"
     trigger="click"
-    v-bind="$attrs"
     :overlay-class-name="overlayClassName"
     placement="bottom"
-    @visibleChange=""
-    v-on="$attrs"
+    width="200"
   >
-    <template #content>
+    <template #default>
       <div class="title-content"></div>
       <slot name="formContent" />
       <div class="uranus-popconfirm-btns">
-        <a-button size="sm" @click="onCancel">
+        <el-button @click="onCancel">
           {{ cancelText || '取消' }}
-        </a-button>
-        <a-button
-          size="sm"
+        </el-button>
+        <el-button
           :loading="loading"
           type="primary"
           class="confirm-btn"
           @click="onConfirm"
         >
           {{ okText || '确定' }}
-        </a-button>
+        </el-button>
       </div>
     </template>
-    <template v-if="$slots.default">
+    <template #reference>
       <slot></slot>
     </template>
-  </a-popover>
+  </el-popover>
 </template>
 
 <script setup>
 import { defineProps, defineEmits, reactive, watch, computed } from 'vue';
 
-const props = defineProps();
+const props = defineProps(['visible', 'loading', 'disabled', 'title', 'cancelText', 'okText', 'width']);
 
 const emit = defineEmits(['cancel', 'confirm']);
 
diff --git a/src/views/device/components/DockControlPanel.vue b/src/views/device/components/DockControlPanel.vue
index af1a16e..cf2eb78 100644
--- a/src/views/device/components/DockControlPanel.vue
+++ b/src/views/device/components/DockControlPanel.vue
@@ -3,7 +3,7 @@
     <!-- title -->
 
     <!-- setting -->
-    <!-- <DeviceSettingBox :sn="props.sn" :deviceInfo="props.deviceInfo"></DeviceSettingBox> -->
+    <DeviceSettingBox :sn="props.sn" :deviceInfo="props.deviceInfo"></DeviceSettingBox>
     <!-- cmd -->
     <div class="control-cmd-wrapper">
       <div class="control-cmd-header">
@@ -84,7 +84,7 @@
 import { EDockModeCode } from '@/types/device'
 import { updateDeviceCmdInfoByOsd, updateDeviceCmdInfoByExecuteInfo } from '@/utils/device-cmd'
 import { setThermalCurrentPaletteStyle, setPhotoStorageSet, setVideoStorageSet, getLiveStatus, setStreamsSwitch, photoAndVideoCmd } from '@/api/device-setting'
-
+import DeviceSettingBox from './DeviceSettingBox.vue'
 import Store from '@/store'
 import { useConnectWebSocket } from '@/utils/websocket/connect-websocket';
 import { getWebsocketUrl } from '@/utils/websocket/config';
diff --git a/src/views/device/components/use-device-setting.js b/src/views/device/components/use-device-setting.js
index ede8603..c1d803f 100644
--- a/src/views/device/components/use-device-setting.js
+++ b/src/views/device/components/use-device-setting.js
@@ -7,6 +7,7 @@
   NightLightsStateEnum,
   DistanceLimitStatusEnum,
 } from '@/types/device-setting';
+import { messages } from '@/lang';
 
 export function useDeviceSetting() {
   // 生成参数
@@ -52,15 +53,19 @@
   async function setDeviceProps(sn, body) {
     try {
       const { code, message: msg } = await putDeviceProps(sn, body);
+      console.log(code,messages)
       if (code === 0) {
-        return true;
+        ElMessage({
+          message: '设备属性设置成功!',
+          type: 'success',
+        });
       }
       throw msg;
     } catch (e) {
-      ElMessage({
-        message: '设备属性设置失败',
-        type: 'error',
-      });
+      // ElMessage({
+      //   message: '设备属性设置失败',
+      //   type: 'error',
+      // });
       return false;
     }
   }
diff --git a/src/views/device/index.vue b/src/views/device/index.vue
index d9ef307..b502309 100644
--- a/src/views/device/index.vue
+++ b/src/views/device/index.vue
@@ -10,14 +10,15 @@
 -->
 <template>
   <basic-container>
-    <el-tabs v-model="activeName" @tab-click="handleClick">
+    <airport ref="airport" />
+    <!-- <el-tabs v-model="activeName" @tab-click="handleClick">
       <el-tab-pane label="机场" name="1">
         <airport ref="airport" />
       </el-tab-pane>
       <el-tab-pane label="飞行器" name="2">
         <fly ref="fly" />
       </el-tab-pane>
-    </el-tabs>
+    </el-tabs> -->
   </basic-container>
 </template>
 
diff --git a/src/views/job/components/SearchBox.vue b/src/views/job/components/SearchBox.vue
index b8b1fbe..2752438 100644
--- a/src/views/job/components/SearchBox.vue
+++ b/src/views/job/components/SearchBox.vue
@@ -61,13 +61,9 @@
         <div class="more" v-if="isExpand" @click="toggleExpand">收起</div>
         <div class="more" v-else @click="toggleExpand">更多</div>
         <div class="search-btn" :style="{ bottom: isExpand ? '5px' : '-3px' }">
-          <div class="btn clear" @click="handleReset">
-            <img src="@/assets/images/task/clear.png" />重置
-          </div>
-          <div class="btn search" @click="handleSearch">
-            <img src="@/assets/images/task/search.png" />搜索
-          </div>
-          <!-- <div class="btn add" @click="addTask"><img src="@/assets/images/task/add.png"/>新增</div> -->
+          
+          <el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button>
+          <el-button icon="el-icon-refresh" @click="handleReset">清空</el-button>
         </div>
         <el-form-item label="任务算法:" v-if="isExpand" class="taskAlgorithm">
           <!-- <TaskAlgorithmBusiness
@@ -77,17 +73,25 @@
             @algorithmChange="algorithmChange"
           /> -->
           <el-tree-select
-              popper-class="custom-tree-select"
-              :style="{ width: pxToRem(186) }"
-              v-model="dictKey"
-              :data="dataList"
-              :default-expanded-keys="[dictKey]"
-              check-strictly
-              node-key="id"
-              :props="treePropsSF"
-              @node-click="handleSFNodeClick"
-              clearable
-              @clear="handleClear"
+          style="z-index: 1000"
+            :teleported="false"
+            class="custom-tree-select"
+            :style="{ width: pxToRem(186) }"
+            v-model="dictKey"
+            :data="dataList"
+            :default-expanded-keys="[dictKey]"
+            :props="treePropsSF"
+            :render-after-expand="false"
+            :default-checked-keys="checkedKeys"
+            node-key="id"
+            multiple
+            show-checkbox
+            collapse-tags
+            collapse-tags-tooltip
+            clearable
+            @node-click="handleNodeClick"
+            @check="handleCheck"
+            @clear="handleClear"
           />
         </el-form-item>
         <!-- <el-form-item label="所属部门:" v-if="isExpand">
@@ -107,6 +111,7 @@
         </el-form-item> -->
         <el-form-item label="任务状态:" v-if="isExpand">
           <el-select
+          style="z-index: 1000"
             :teleported="false"
             v-model="searchForm.status"
             placeholder="请选择"
@@ -394,6 +399,16 @@
 //   { immediate: true, deep: true }
 // );
 
+const checkedKeys = ref([])
+
+const handleCheck = (data, { checkedKeys, checkedNodes }) => {
+	dictKey.value = checkedKeys
+	// 获取所有选中节点的 dictKey
+	const selectedDictKeys = checkedNodes.map(node => node.dictKey).filter(Boolean)
+  searchForm.ai_types = selectedDictKeys
+  handleSearch()
+}
+
 onBeforeUnmount(() => {
   checked.value = 'today';
   searchForm.date_enum = 'TODAY';
diff --git a/src/views/tickets/orderLog.vue b/src/views/tickets/orderLog.vue
index d2b8c70..3c030c9 100644
--- a/src/views/tickets/orderLog.vue
+++ b/src/views/tickets/orderLog.vue
@@ -159,7 +159,7 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="关联航线" prop="file_id">
-              <el-select v-model="form.file_id" placeholder="请选择航线" @change="getFlyingNestBy">
+              <el-select v-model="form.file_id" placeholder="请选择航线" filterable @change="getFlyingNestBy">
                 <el-option v-for="item in wayLineList" :key="item.wayline_id" :label="item.name"
                   :value="item.wayline_id" />
               </el-select>
@@ -169,7 +169,7 @@
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="关联机巢" prop="device_sns">
-              <el-select v-model="form.device_sns" placeholder="请选择机巢" multiple>
+              <el-select v-model="form.device_sns" placeholder="请选择机巢" multiple :disabled="!device_sns.length">
                 <el-option v-for="item in device_sns" :key="item.device_sn" :label="item.nickname"
                   :value="item.device_sn" />
               </el-select>
@@ -271,7 +271,7 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="关联航线" prop="file_id">
-              <el-select v-model="form.file_id" placeholder="请选择航线" @change="getFlyingNestBy" :disabled="detailTitle === '工单详情'">
+              <el-select v-model="form.file_id" placeholder="请选择航线" @change="getFlyingNestBy" filterable :disabled="detailTitle === '工单详情'">
                 <el-option v-for="item in wayLineList" :key="item.wayline_id" :label="item.name"
                   :value="item.wayline_id" />
               </el-select>
@@ -663,7 +663,6 @@
         ],
         file_id: [{ required: true, message: '需要选择航线', trigger: 'change' }],
         device_sns: [{ required: true, message: '请选择机巢', trigger: 'change' }],
-        ai_types: [{ required: true, message: '请选择算法', trigger: 'change' }],
         content: [
           { required: true, message: '请输入工单内容', trigger: 'blur' },
           { max: 255, message: '工单内容不能超过255个字', trigger: 'blur' },
@@ -888,8 +887,8 @@
 
           const submitData = {
             ...this.form,
-
             status: status,
+            ai_types: this.form.ai_types?.length ? this.form.ai_types : [],
           }
           // 判断该值this.form.date_range[0] 周几 和rep_fre_type 是不是相等
           // if (this.form.deal_time) {
diff --git a/src/views/tickets/ticket.vue b/src/views/tickets/ticket.vue
index f05cb69..486563c 100644
--- a/src/views/tickets/ticket.vue
+++ b/src/views/tickets/ticket.vue
@@ -83,7 +83,7 @@
                 :value="item.dict_key"
               />
             </el-select> -->
-            <el-tree-select
+            <!-- <el-tree-select
               popper-class="custom-tree-select"
               :style="{ width: pxToRem(186) }"
               placeholder="请选择关联算法"
@@ -96,7 +96,28 @@
               @node-click="handleSFNodeClick"
               clearable
               @clear="handleClear"
-          />
+            /> -->
+            <el-tree-select
+              style="z-index: 1000"
+              :teleported="false"
+              class="custom-tree-select"
+              :style="{ width: pxToRem(186) }"
+              v-model="dictKey"
+              :data="dataList"
+              :default-expanded-keys="[dictKey]"
+              :props="treePropsSF"
+              :render-after-expand="false"
+              :default-checked-keys="checkedKeys"
+              node-key="id"
+              multiple
+              show-checkbox
+              collapse-tags
+              collapse-tags-tooltip
+              clearable
+              @check="handleCheck"
+              @node-click="handleSFNodeClick"
+              @clear="handleClear"
+            />
             <el-select
               v-model="filters.isReview"
               placeholder="请选择复核状态"
@@ -1133,6 +1154,7 @@
       },
       dictKey: '',
       dataList: [],
+      checkedKeys: [],
     };
   },
   created() {
@@ -1416,6 +1438,13 @@
   },
 
   methods: {
+    handleCheck(data, { checkedKeys, checkedNodes }) {
+      this.checkedKeys = checkedKeys
+      // 获取所有选中节点的 dictKey
+      const selectedDictKeys = checkedNodes.map(node => node.dictKey).filter(Boolean)
+      this.filters.type = selectedDictKeys
+      this.fetchTableData();
+    },
     // 算法
     getAlgorithmList() {
       getSFDictionaryTree({code:'SF'}).then((res) => {
@@ -1439,16 +1468,12 @@
     },
 
     handleSFNodeClick(data) {
+      console.log(data.dictKey, '666666666')
       this.filters.type = ''
       this.filters.algorithm = ''
-        if (data.children && data.children.length) {
-            // 获取子节点dictKey
-            this.filters.type = data.dictKey
-        } else {
-            this.filters.algorithm = data.dictKey
-        }
-        // 更新列表请求
-        this.fetchTableData();
+      this.filters.type = data.dictKey
+      // 更新列表请求
+      this.fetchTableData();
     },
     handleClear() {
         this.dictKey = ''
@@ -1677,7 +1702,7 @@
       try {
         const currentTab = this.tabs.find(tab => tab.name === this.activeTab);
         const params = {
-          word_order_type: this.filters.type || undefined,
+          word_order_types: this.filters.type || undefined,
           status:
             currentTab?.name === 'myTickets'
               ? undefined
@@ -3106,7 +3131,7 @@
   }
 
   .date-picker {
-    width: 240px; // 日期选择器宽度适当调整
+    // width: 240px; // 日期选择器宽度适当调整
   }
 
   .el-button {
diff --git a/yarn.lock b/yarn.lock
index 1cd0ee0..31910d4 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2038,20 +2038,20 @@
   dependencies:
     ms "2.0.0"
 
-"decimal.js@^10.4.3":
-  "integrity" "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
-  "resolved" "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz"
-  "version" "10.4.3"
+decimal.js@^10.4.3:
+  version "10.4.3"
+  resolved "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz"
+  integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==
 
-"decimal@^0.0.2":
-  "integrity" "sha512-puX1+D5GlpXYH0kDejnu8F2jsGLKRePc7eOznNjqMbA2otl7AzvubrvvZVmOvRCHhsqeAPKNcAxHHbevsH/1qg=="
-  "resolved" "https://registry.npmmirror.com/decimal/-/decimal-0.0.2.tgz"
-  "version" "0.0.2"
+decimal@^0.0.2:
+  version "0.0.2"
+  resolved "https://registry.npmmirror.com/decimal/-/decimal-0.0.2.tgz"
+  integrity sha512-puX1+D5GlpXYH0kDejnu8F2jsGLKRePc7eOznNjqMbA2otl7AzvubrvvZVmOvRCHhsqeAPKNcAxHHbevsH/1qg==
 
-"deep-equal@^1.0.0", "deep-equal@1.x":
-  "integrity" "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg=="
-  "resolved" "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz"
-  "version" "1.1.2"
+deep-equal@^1.0.0, deep-equal@1.x:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz"
+  integrity sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==
   dependencies:
     is-arguments "^1.1.1"
     is-date-object "^1.0.5"

--
Gitblit v1.9.3