From 9810566b1ff820cbeddae33778e7ffcd073c5d6b Mon Sep 17 00:00:00 2001
From: freshman-white <2514756131@qq.com>
Date: Fri, 8 Sep 2023 15:04:48 +0800
Subject: [PATCH 1/2] =?UTF-8?q?feat:=E6=A0=87=E6=B3=A8=E5=AF=BC=E5=85=A5?=
 =?UTF-8?q?=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/api/layer.ts                      |   9 ++
 src/pages/page-web/projects/layer.vue | 129 ++++++++++++++------------
 2 files changed, 79 insertions(+), 59 deletions(-)

diff --git a/src/api/layer.ts b/src/api/layer.ts
index 9501201..29ee38b 100644
--- a/src/api/layer.ts
+++ b/src/api/layer.ts
@@ -51,3 +51,12 @@ export const deleteLayerEleReq = async (id: string, body: {}): Promise<any> => {
   const result = await request.delete(url, body)
   return result.data
 }
+export const importKmlFile = async function (workspaceId: string, file: {}, id:any): Promise<IWorkspaceResponse<any>> {
+  const url = `${PREFIX}/workspaces/${workspaceId}/elements/file/upload/${id}`
+  const result = await request.post(url, file, {
+    headers: {
+      'Content-Type': 'multipart/form-data',
+    }
+  })
+  return result.data
+}
diff --git a/src/pages/page-web/projects/layer.vue b/src/pages/page-web/projects/layer.vue
index 8110d5c..cecba51 100644
--- a/src/pages/page-web/projects/layer.vue
+++ b/src/pages/page-web/projects/layer.vue
@@ -108,15 +108,18 @@
     </a-drawer>
     <a-modal v-model:visible="importVisible" :closable="false"  :maskClosable="false" class="modal-layer-content">
       <template #title>
-        <div class="model-title">移动到</div>
+        <div class="model-title">导入</div>
       </template>
-      <a-form :model="state" class="form-content">
-        <a-form-item label="文件" style="color:#fff">
+      <a-form :model="state" :rules="rules" class="form-content" ref="fileModalRef">
+        <a-form-item label="文件" style="color:#fff" name="file">
           <a-upload
           accept=".kml"
           action="https://www.mocky.io/v2/5cc8019d300000980a055e76"
-          :file-list="fileList"
-          @change="handleChange"
+          :file-list="state.file"
+          :show-upload-list="true"
+          :before-upload="beforeUpload"
+          :remove="removeFile"
+
           >
             <a-button class="btn-color">
               <upload-outlined></upload-outlined>
@@ -124,14 +127,14 @@
             </a-button>
           </a-upload>
         </a-form-item>
-        <a-form-item label="文件夹" style="color:#fff">
+        <a-form-item label="文件夹" style="color:#fff" name="id">
           <a-tree-select
-          v-model:value="state.file"
+          v-model:value="state.id"
           style="width: 100%"
-          :tree-data="fileTree"
+          :tree-data="mapLayers"
+          :replace-fields="{children:'elements', label:'name', value: 'id' }"
           allow-clear
           placeholder="Please select"
-          tree-node-filter-prop="label"
           />
         </a-form-item>
       </a-form>
@@ -150,13 +153,15 @@ import { onMounted, reactive, ref, watch } from 'vue'
 import {
   deleteElementReq,
   getElementGroupsReq,
-  updateElementsReq
+  updateElementsReq,
+  importKmlFile
 } from '/@/api/layer'
 import LayersTree from '/@/components/LayersTree.vue'
 import { MapDoodleColor, MapElementEnum } from '/@/constants/map'
 import { useGMapCover } from '/@/hooks/use-g-map-cover'
 import { getRoot } from '/@/root'
 import { useMyStore } from '/@/store'
+import { ELocalStorageKey } from '/@/types'
 import { GeojsonCoordinate, LayerResource } from '/@/types/map'
 import { Color, GeoType } from '/@/types/mapLayer'
 import { generatePoint } from '/@/utils/genjson'
@@ -369,7 +374,6 @@ async function getElementGroups (type?: string) {
     isDistributed: true
   })
   mapLayers.value = result.data
-  console.log('lizhao2', result)
   mapLayers.value = updateWgs84togcj02()
   if (type && type === 'init') {
     store.dispatch('setLayerInfo', mapLayers.value)
@@ -483,63 +487,57 @@ function updateCoordinates (transformType: string, element: LayerResource) {
   }
 }
 /** 导入文件--------------start */
+interface FileItem {
+  uid: string;
+  name?: string;
+  status?: string;
+  response?: string;
+  url?: string;
+}
+const fileModalRef = ref()
+const workspaceId: string = localStorage.getItem(ELocalStorageKey.WorkspaceId) || ''
 const importVisible = ref(false)
-const state = reactive({ name: '', file: '' })
-const fileList = ref()
-const fileTree = [
-  {
-    label: 'Node1',
-    value: '0-0',
-    children: [
-      {
-        label: 'Child Node1',
-        value: '0-0-0',
-      },
-    ],
-  },
-  {
-    label: 'Node2',
-    value: '0-1',
-
-    children: [
-      {
-        label: 'Child Node3',
-        value: '0-1-0',
-        disabled: true,
-      },
-      {
-        label: 'Child Node4',
-        value: '0-1-1',
-      },
-      {
-        label: 'Child Node5',
-        value: '0-1-2',
-      },
-    ],
-  },
-]
-
+const state = reactive({ id: '', file: [] })
 // 打开文件导入弹框
 const openFileDialog = () => {
+  state.id = ''
+  state.file = []
   importVisible.value = true
 }
 // 确认导入操作
 const importSubmit = () => {
-
+  fileModalRef.value.validate().then(() => {
+    state.file.forEach(async (file: any) => {
+      const fileData = new FormData()
+      fileData.append('file', file, file.name)
+      await importKmlFile(workspaceId, fileData, state.id).then((res:any) => {
+        importVisible.value = false
+        getElementGroups()
+      })
+    })
+  })
 }
-// const beforeUpload = (file:any) => {
-// //   fileList.value = [file]
-// // }
-const handleChange = (info: any) => {
-  let resFileList = [...info.fileList]
-  resFileList = resFileList.slice(-1)
-  resFileList = resFileList.map(file => {
-    if (file.response) {
-      file.url = file.response.url
+function beforeUpload (file: FileItem) {
+  fileModalRef.value.validate()
+  state.file = [file]
+  return true
+}
+const rules = {
+  id: [{ required: true, message: '请选择文件夹', trigger: 'change' }],
+  file: [
+    {
+      required: true,
+      trigger: 'change',
+      validator: async (rule: any, value: string) => {
+        if (!value.length) {
+          throw new Error('请上传文件')
+        }
+      },
     }
-    return file
-  })
-  fileList.value = resFileList
+  ],
+}
+const removeFile = () => {
+  state.file = []
 }
 
 /** 导入文件--------------end */
@@ -569,6 +567,19 @@ const handleChange = (info: any) => {
     background-color:#3c3c3c !important;
     border:none !important;
   }
+  ::v-deep{
+    .ant-upload-list-item-name{
+      color:#fff;
+    }
+    .anticon-paper-clip,.ant-upload-list-item-card-actions .anticon{
+      color: #fff;
+    }
+    .ant-upload-list-item-info{
+      &:hover{
+        background: #1c1c1c;
+      }
+    }
+  }
 }
 .img-icon{
   cursor: pointer;

From 2fc47790aa55f6bfea68f7e265434f4ed7c62a7e Mon Sep 17 00:00:00 2001
From: freshman-white <2514756131@qq.com>
Date: Thu, 14 Sep 2023 15:37:06 +0800
Subject: [PATCH 2/2] =?UTF-8?q?feat:=E8=88=AA=E7=BA=BF=E6=96=B9=E6=B3=95?=
 =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/hooks/use-g-map-wayline.ts          | 20 ++++++++++++++++++++
 src/pages/page-web/projects/wayline.vue | 13 ++-----------
 2 files changed, 22 insertions(+), 11 deletions(-)
 create mode 100644 src/hooks/use-g-map-wayline.ts

diff --git a/src/hooks/use-g-map-wayline.ts b/src/hooks/use-g-map-wayline.ts
new file mode 100644
index 0000000..27b788f
--- /dev/null
+++ b/src/hooks/use-g-map-wayline.ts
@@ -0,0 +1,20 @@
+import { getRoot } from '/@/root'
+import { GeojsonCoordinate } from '/@/types/map'
+/* 航线定位 */
+export function initPloyline (path:GeojsonCoordinate[]) {
+  const root = getRoot()
+  const AMap = root.$aMap
+  const map = root.$map
+  const polyline = new AMap.Polyline({
+    path: path,
+    strokeWeight: 10, // 线条宽度,默认为 1
+    strokeColor: '#3366bb', // 线条颜色
+    lineJoin: 'round',
+    lineCap: 'round',
+    showDir: true // 折线拐点连接处样式
+  })
+  map.add(polyline)
+  map.setCenter(path[0])
+  map.setZoom(12)
+  return polyline
+}
diff --git a/src/pages/page-web/projects/wayline.vue b/src/pages/page-web/projects/wayline.vue
index 5aa948a..e0daabd 100644
--- a/src/pages/page-web/projects/wayline.vue
+++ b/src/pages/page-web/projects/wayline.vue
@@ -101,6 +101,7 @@ import { CURRENT_CONFIG } from '/@/api/http/config'
 import { load } from '@amap/amap-jsapi-loader'
 import { getRoot } from '/@/root'
 import { wgs84togcj02 } from '/@/vendors/coordtransform'
+import {initPloyline} from '/@/hooks/use-g-map-wayline.ts'
 import line from '/@/assets/icons/line.svg'
 const lineType = ref(['航点飞行', '航点飞行', '建图航拍', '倾斜摄影', '带状航线'])
 const polyline = ref()
@@ -209,17 +210,7 @@ function selectRoute (wayline: WaylineFile, index:any) {
           item[1]
         )
       })
-      polyline.value = new root.$aMap.Polyline({
-        path: path,
-        strokeWeight: 10, // 线条宽度,默认为 1
-        strokeColor: '#3366bb', // 线条颜色
-        lineJoin: 'round',
-        lineCap: 'round',
-        showDir: true // 折线拐点连接处样式
-      })
-      map.add(polyline.value)
-      map.setCenter(path[0])
-      map.setZoom(12)
+      polyline.value = initPloyline(path)
       store.commit('SET_NEVIGATION_VISIBLE', true)
       const { scheduled_time, line_length, geometry_point_size } = res.data
       store.commit('SET_NEVIGATION_INFO', { scheduled_time, line_length, geometry_point_size })