Просмотр исходного кода

feat: 火调同步制表内容

bill 1 месяц назад
Родитель
Сommit
4750f6c0dc

+ 6 - 0
package-lock.json

@@ -16,6 +16,7 @@
         "@types/svg-path-parser": "^1.1.6",
         "@types/three": "^0.169.0",
         "clipper-lib": "^6.4.2",
+        "coordtransform": "^2.1.2",
         "dxf-writer": "^1.18.4",
         "element-plus": "^2.8.6",
         "html2canvas": "^1.4.1",
@@ -2202,6 +2203,11 @@
       "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==",
       "license": "MIT"
     },
+    "node_modules/coordtransform": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/coordtransform/-/coordtransform-2.1.2.tgz",
+      "integrity": "sha512-0xLJApBlrUP+clyLJWIaqg4GXE5JTbAJb5d/CDMqebIksAMMze8eAyO6YfHEIxWJ+c42mXoMHBzWTeUrG7RFhw=="
+    },
     "node_modules/copy-descriptor": {
       "version": "0.1.1",
       "resolved": "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz",

+ 1 - 0
package.json

@@ -23,6 +23,7 @@
     "@types/svg-path-parser": "^1.1.6",
     "@types/three": "^0.169.0",
     "clipper-lib": "^6.4.2",
+    "coordtransform": "^2.1.2",
     "dxf-writer": "^1.18.4",
     "element-plus": "^2.8.6",
     "html2canvas": "^1.4.1",

+ 4 - 2
src/example/dialog/basemap/leaflet/useLeaflet.ts

@@ -1,6 +1,7 @@
 import { mergeFuns } from "@/utils/shared";
 import { map, Map, tileLayer, marker } from "leaflet";
 import "leaflet/dist/leaflet.css";
+import coordtransform from 'coordtransform'
 import { onUnmounted, Ref, shallowRef, watch, watchEffect } from "vue";
 
 export const useLMap = (domRef: Ref<HTMLDivElement | undefined>) => {
@@ -134,8 +135,9 @@ export const getCurrentLatlng = async () => {
     navigator.geolocation.getCurrentPosition(
       (position) => {
         // 成功回调
-        const lat = position.coords.latitude; // 纬度
-        const lng = position.coords.longitude; // 经度
+        let lat = position.coords.latitude; // 纬度
+        let lng = position.coords.longitude; // 经度
+        [lng, lat] = coordtransform.wgs84togcj02(lng, lat)
         resolve({ lat, lng })
       },
       (error) => {

+ 76 - 15
src/example/fuse/enter-shared.ts

@@ -1,6 +1,6 @@
-import type { TabCover } from "./store";
+import { type TabCover } from "./store";
 import type { Scene } from "../../example/platform/platform-resource";
-import type { StoreData } from "@/core/store/store";
+import { getEmptyStoreData, type StoreData } from "@/core/store/store";
 import { token, params, urlUpdateQuery, urlGetQuery } from "../env";
 import { genLoading } from "../loadding";
 import { formatDate, tempStrFill } from "@/utils/shared";
@@ -9,6 +9,12 @@ import {
   latlngStrTransform,
 } from "../dialog/basemap/leaflet/useLeaflet";
 import mitt from "mitt";
+import { defaultLayer } from "@/constant";
+import { tableTitleKey } from '../constant'
+import { getPaperConfig, paperConfigs } from "../components/slide/actions";
+import { getBaseItem } from "@/core/components/util";
+import { getRealPixel } from "./views/tabulation/gen-tab";
+
 
 export const SCENE_TYPE = {
   fuse: "fuse",
@@ -144,7 +150,7 @@ const after = async (fet: Promise<Response>) => {
   }
   // 特殊code 不跳转
   if ([8035].includes(res.code)) {
-    throw '存储路径不可用,请前往设置/文件管理修改原始数据最新路径后重试。'
+    throw "存储路径不可用,请前往设置/文件管理修改原始数据最新路径后重试。";
   }
 
   if (res.code !== 0) {
@@ -178,7 +184,7 @@ export const getSceneList = (keyword: string) => {
           m: item.num,
           title: item.sceneName,
           id: item.id.toString(),
-          mapping: item.mapping || '',
+          mapping: item.mapping || "",
           token,
         } as Scene)
     );
@@ -266,7 +272,7 @@ export const getTabulationId = async (id: string) => {
   return list[0]?.id;
 };
 
-export const getTabulationData = genLoading(async (id: string) => {
+export const _getTabulationData = genLoading(async (id: string) => {
   if (!id) {
     return {
       store: {
@@ -295,7 +301,56 @@ export const getTabulationData = genLoading(async (id: string) => {
   };
 });
 
-export const saveTabulationData = genLoading(
+export const getTabulationData = async (...args: any[]) => {
+  const result = await _getTabulationData.apply(this, args as any);
+  const temp = await getTableTemp();
+  if (!result.title && temp.title) {
+    result.title = temp.title;
+  }
+  if (!result.store) {
+    result.store = {
+      ...getEmptyStoreData(),
+    };
+  }
+  if (result.title) {
+    let texts = result.store.layers[defaultLayer].text;
+    if (!texts) {
+      texts = result.store.layers[defaultLayer].text = [];
+    }
+    let title = texts.find((title: any) => title.key === tableTitleKey);
+    if (title) {
+      title.content = result.title;
+    } else {
+      const { margin, size } = getPaperConfig(
+        (paperConfigs as any)[result.paperKey].size,
+        (paperConfigs as any)[result.paperKey].scale
+      );
+      const title = {
+        ...getBaseItem(),
+        content: result.title,
+        width: getRealPixel(90, result.paperKey),
+        heihgt: getRealPixel(14.4, result.paperKey),
+        fontSize: getRealPixel(12, result.paperKey),
+        key: tableTitleKey,
+        align: "center",
+        mat: [1, 0, 0, 1, 0, 0],
+      };
+      const pos = {
+        x:
+          (size.width - margin[3]) / 2 -
+          getRealPixel(40, result.paperKey) +
+          margin[3],
+        y: getRealPixel(15, result.paperKey) + margin[0],
+      };
+      title.mat[4] = pos.x;
+      title.mat[5] = pos.y;
+      texts.push(title);
+    }
+  }
+  return result;
+};
+
+export const _saveTabulationData = genLoading(
   async (
     id: string,
     data: {
@@ -322,15 +377,21 @@ export const saveTabulationData = genLoading(
   }
 );
 
-export const uploadResourse = genLoading(
-  async (file: File) => {
-    try {
-      return await postFile(`fusion/upload/file`, { file })
-    } catch (e) {
-      throw e
-    }
+export const saveTabulationData = (id: any, data: any) => {
+  const texts = data.store.layers[defaultLayer].text;
+  let title = texts.find((title: any) => title.key === tableTitleKey);
+  let content = title ? title.content : "";
+
+  return _saveTabulationData(id, { ...data, title: content });
+};
+
+export const uploadResourse = genLoading(async (file: File) => {
+  try {
+    return await postFile(`fusion/upload/file`, { file });
+  } catch (e) {
+    throw e;
   }
-);
+});
 
 export const getResource = (url: string) => {
   return url;
@@ -409,7 +470,7 @@ export const searchAddress = async (keyword: string, mapId: number) => {
   const data = await post(`fusion/mapConfig/geocode`, {
     address: keyword,
     mapId,
-  });
+  }) || [];
   return data.map((item: any) => ({
     ...item,
     latlng: latlngStrTransform(item.location.split(",").reverse().join(",")),

+ 0 - 63
src/example/fuse/enter.ts

@@ -2,12 +2,6 @@ import { ElMessage } from "element-plus";
 import { params, preventReload } from "../env";
 import * as platform from "./enter-shared";
 import { asyncTimeout } from "@/utils/shared";
-import { getEmptyStoreData } from "@/core/store/store";
-import { defaultLayer } from "@/constant";
-import { tableTitleKey } from "../constant";
-import { getBaseItem } from "@/core/components/util";
-import { getRealPixel } from "./views/tabulation/gen-tab";
-import { getPaperConfig, paperConfigs } from "../components/slide/actions";
 import { encodePwd } from "@/utils/encode";
 
 window.platform = { ...platform };
@@ -98,63 +92,6 @@ if (!!params.value.sceneDraw) {
   import(import.meta.env.VITE_ENTRY_EXAMPLE);
 }
 
-window.platform.getTabulationData = async (...args: any[]) => {
-  const result = await platform.getTabulationData.apply(this, args as any);
-  const temp = await platform.getTableTemp();
-  if (!result.title && temp.title) {
-    result.title = temp.title;
-  }
-  if (!result.store) {
-    result.store = {
-      ...getEmptyStoreData(),
-    };
-  }
-  if (result.title) {
-    let texts = result.store.layers[defaultLayer].text;
-    if (!texts) {
-      texts = result.store.layers[defaultLayer].text = [];
-    }
-    let title = texts.find((title: any) => title.key === tableTitleKey);
-    if (title) {
-      title.content = result.title;
-    } else {
-      const { margin, size } = getPaperConfig(
-        (paperConfigs as any)[result.paperKey].size,
-        (paperConfigs as any)[result.paperKey].scale
-      );
-      const title = {
-        ...getBaseItem(),
-        content: result.title,
-        width: getRealPixel(90, result.paperKey),
-        heihgt: getRealPixel(14.4, result.paperKey),
-        fontSize: getRealPixel(12, result.paperKey),
-        key: tableTitleKey,
-        align: "center",
-        mat: [1, 0, 0, 1, 0, 0],
-      };
-      const pos = {
-        x:
-          (size.width - margin[3]) / 2 -
-          getRealPixel(40, result.paperKey) +
-          margin[3],
-        y: getRealPixel(15, result.paperKey) + margin[0],
-      };
-      title.mat[4] = pos.x;
-      title.mat[5] = pos.y;
-      texts.push(title);
-    }
-  }
-  return result;
-};
-
-window.platform.saveTabulationData = (id: any, data: any) => {
-  const texts = data.store.layers[defaultLayer].text;
-  let title = texts.find((title: any) => title.key === tableTitleKey);
-  let content = title ? title.content : "";
-
-  return platform.saveTabulationData(id, { ...data, title: content });
-};
-
 // 登录检测
 setTimeout(() => {
   if (!window.platform.preventLogin) {

+ 77 - 74
src/example/fuse/views/overview/header.vue

@@ -42,6 +42,7 @@ import { overviewId, params, tabulationId } from "@/example/env.ts";
 import { listener } from "@/utils/event.ts";
 import { mergeFuns, repeatedlyOnly } from "@/utils/shared.ts";
 import saveAs from "@/utils/file-serve.ts";
+import { genLoading } from "@/example/loadding.ts";
 
 const props = defineProps<{ title: string }>();
 const draw = useDraw();
@@ -250,87 +251,89 @@ const setViewToKanKanCover = async () => {
   return blob;
 };
 
-const saveHandler = repeatedlyOnly(async () => {
-  const storeData = draw.getData();
-  const [tabBlob, listBlob, kkBlob, scale, rect, syncItems] = await draw.enterTemp(
-    async () => {
-      const back = draw.config.back;
-      const [rect, syncItems, recover] = await setViewToTableCover();
-      await nextTick();
-      const mat = draw.viewer.transform.invert();
-      const scale =
-        lineLen(mat.point({ x: 1, y: 0 }), mat.point({ x: 0, y: 0 })) *
-        draw.store.config.proportion.scale;
-      const tabBlob = await getImage(draw, "image/png");
-      draw.config.back = back;
-      await nextTick();
-      const listBlob = await getImage(draw, "image/jpg");
-      recover();
-      await nextTick();
+const saveHandler = genLoading(
+  repeatedlyOnly(async () => {
+    const storeData = draw.getData();
+    const [tabBlob, listBlob, kkBlob, scale, rect, syncItems] = await draw.enterTemp(
+      async () => {
+        const back = draw.config.back;
+        const [rect, syncItems, recover] = await setViewToTableCover();
+        await nextTick();
+        const mat = draw.viewer.transform.invert();
+        const scale =
+          lineLen(mat.point({ x: 1, y: 0 }), mat.point({ x: 0, y: 0 })) *
+          draw.store.config.proportion.scale;
+        const tabBlob = await getImage(draw, "image/png");
+        draw.config.back = back;
+        await nextTick();
+        const listBlob = await getImage(draw, "image/jpg");
+        recover();
+        await nextTick();
 
-      const kkBlob = await setViewToKanKanCover();
-      return [tabBlob, listBlob, kkBlob, scale, rect, syncItems] as const;
-    }
-  );
-
-  let tabUrl = null;
-  let listUrl = null;
-  let kankanUrl = null;
-  if (!tabBlob || !listBlob || !kkBlob) {
-    ElMessage.error("截图保存失败");
-  } else {
-    console.error(window.platform.uploadResourse);
-    [tabUrl, listUrl, kankanUrl] = await Promise.all([
-      window.platform.uploadResourse(new File([tabBlob], `tabulation-cover.png`)),
-      window.platform.uploadResourse(new File([listBlob], `list-cover.png`)),
-      window.platform.uploadResourse(new File([kkBlob], `kankan-cover.png`)),
-    ]);
-  }
+        const kkBlob = await setViewToKanKanCover();
+        return [tabBlob, listBlob, kkBlob, scale, rect, syncItems] as const;
+      }
+    );
 
-  tabulationId.value = await window.platform.getTabulationId(overviewId.value);
-  await refreshTabulationData();
+    let tabUrl = null;
+    let listUrl = null;
+    let kankanUrl = null;
+    if (!tabBlob || !listBlob || !kkBlob) {
+      ElMessage.error("截图保存失败");
+    } else {
+      console.error(window.platform.uploadResourse);
+      [tabUrl, listUrl, kankanUrl] = await Promise.all([
+        window.platform.uploadResourse(new File([tabBlob], `tabulation-cover.png`)),
+        window.platform.uploadResourse(new File([listBlob], `list-cover.png`)),
+        window.platform.uploadResourse(new File([kkBlob], `kankan-cover.png`)),
+      ]);
+    }
 
-  const cover = {
-    url: tabUrl,
-    width: rect.width,
-    height: rect.height,
-    proportion: { ...draw.store.config.proportion, scale },
-    syncItems,
-  };
+    tabulationId.value = await window.platform.getTabulationId(overviewId.value);
+    await refreshTabulationData();
 
-  console.log(tabulationData.value.store);
-  const tabStore = await repTabulationStore(
-    tabulationData.value.paperKey,
-    storeData.config.compass.rotation,
-    cover,
-    tabulationData.value.isAutoGen ? undefined : tabulationData.value.store
-  );
+    const cover = {
+      url: tabUrl,
+      width: rect.width,
+      height: rect.height,
+      proportion: { ...draw.store.config.proportion, scale },
+      syncItems,
+    };
 
-  console.log(tabStore);
-  tabStore.config.compass = storeData.config.compass;
-  const body: any = {
-    ...overviewData.value,
-    listCover: listUrl,
-    store: storeData,
-    viewport: draw!.viewer.transform.m,
-    caseTabulation: {
-      ...tabulationData.value,
-      id: tabulationId.value,
-      title: overviewData.value.title,
+    console.log(tabulationData.value.store);
+    const tabStore = await repTabulationStore(
+      tabulationData.value.paperKey,
+      storeData.config.compass.rotation,
       cover,
-      store: tabStore,
-      overviewId: overviewId.value,
-    },
-  };
-  if (window.platform.sceneDraw) {
-    body.kankanCover = kankanUrl;
-  }
+      tabulationData.value.isAutoGen ? undefined : tabulationData.value.store
+    );
 
-  overviewId.value = await window.platform.saveOverviewData(overviewId.value, body);
-  tabulationId.value = await window.platform.getTabulationId(overviewId.value);
-  console.log("保存完毕");
-  emit("saveAfter");
-});
+    console.log(tabStore);
+    tabStore.config.compass = storeData.config.compass;
+    const body: any = {
+      ...overviewData.value,
+      listCover: listUrl,
+      store: storeData,
+      viewport: draw!.viewer.transform.m,
+      caseTabulation: {
+        ...tabulationData.value,
+        id: tabulationId.value,
+        title: overviewData.value.title,
+        cover,
+        store: tabStore,
+        overviewId: overviewId.value,
+      },
+    };
+    if (window.platform.sceneDraw) {
+      body.kankanCover = kankanUrl;
+    }
+
+    overviewId.value = await window.platform.saveOverviewData(overviewId.value, body);
+    tabulationId.value = await window.platform.getTabulationId(overviewId.value);
+    console.log("保存完毕");
+    emit("saveAfter");
+  })
+);
 
 onUnmounted(
   listener(document.documentElement, "keydown", (ev) => {

+ 10 - 4
src/example/loadding.ts

@@ -11,12 +11,18 @@ export const genLoading = <T, K extends PFN<T>>(fn: K, options?: Options): K =>
 const loadingStack = ref<Array<Options | undefined>>([]);
 const tokens: string[] = [];
 let instance: ReturnType<typeof ElLoading.service> | null = null;
+let timeout: any;
 watchEffect(() => {
+  clearTimeout(timeout)
   if (!loadingStack.value.length && instance) {
-    instance.close();
-    instance = null;
+    timeout = setTimeout(() => {
+      instance?.close();
+      instance = null;
+      console.log('clear')
+    }, 500);
   }
-  if (loadingStack.value.length && !instance && !import.meta.env.DEV) {
+  if (loadingStack.value.length && !instance) {
+    console.log('gen')
     instance = ElLoading.service(loadingStack.value[0]);
   }
 });
@@ -58,4 +64,4 @@ export const loading = <T, K extends PFN<T>>(
       }, 50);
     });
   return ret;
-};
+};

+ 1 - 0
src/vite-env.d.ts

@@ -8,6 +8,7 @@ interface ImportMeta {
   readonly env: ImportMetaEnv
 }
 
+declare module 'coordtransform';
 
  module 'virtual:svg-icons-register' {
   const content: any;