浏览代码

feat: 同步新疆

gemercheung 9 月之前
父节点
当前提交
c6b052347b

+ 17 - 11
src/request/urls.ts

@@ -18,6 +18,8 @@ export const userReg = "/web/user/register";
 export const sendUserMsg = "/fusion/notAuth/getMsgAuthCode";
 // 修改密码
 export const updatePsw = "/fusion/notAuth/changePassword";
+// 重置密码
+export const restPassword = "/fusion/web/user/restPassword";
 // 新增用户
 export const userAdd = "/fusion/web/user/addUser";
 //修改用户
@@ -65,26 +67,30 @@ export const getCompanyList = "/web/department/getAll";
 // 获取场景列表
 export const getSceneList = "/fusion/scene/list";
 export const delScene = "/fusion/scene/deleteNum";
+export const copyScene = "/fusion/scene/copyScene";
+export const downSceneHash = `/fusion/scene/downMD5`;
 export const checkGenMeshScene = "/fusion/scene/sceneDetail";
 export const genMeshSceneByCloud = "/fusion/scene/buildSceneObj";
 
+// 统计
+export const sceneStatistics = `/fusion/data/sceneGroupByDept`;
+export const caseStatistics = `/fusion/data/projectGroupByDept`;
+export const cameraTypeStatistics = `/fusion/data/cameraGroupType`;
+export const caseTimeStatistics = `/fusion/data/FireTrend`;
+export const casePlaceStatistics = `/fusion/data/FirePlaceTrend`;
+export const caseReasonStatistics = `/fusion/data/FireReasonTrend`;
+
 // 获取模型场景列表
 export const getModelSceneList = `/fusion/model/list`;
 export const updateModelScene = `/fusion/model/updateTitle`;
 // 取消模型场景上传
 export const cancelUModel = `/fusion/model/cancelUpload`;
 export const deleteModel = `/fusion/model/delete`;
+export const copyModel = `/fusion/model/copyModel`;
+export const downModelHash = `/fusion/model/downMD5`;
 export const uploadModel = `/fusion/model/uploadObj`;
 export const getModelRunProgress = `/fusion/model/uploadObjProgress`;
 
-// 统计
-export const sceneStatistics = `/fusion/data/sceneGroupByDept`;
-export const caseStatistics = `/fusion/data/projectGroupByDept`;
-export const cameraTypeStatistics = `/fusion/data/cameraGroupType`;
-export const caseTimeStatistics = `/fusion/data/FireTrend`;
-export const casePlaceStatistics = `/fusion/data/FirePlaceTrend`;
-export const caseReasonStatistics = `/fusion/data/FireReasonTrend`;
-
 // 通过场景标题模糊搜索场景
 export const getSceneByTitle = "/web/scene/getLocalScenes";
 // 通过相机获取场景列表
@@ -165,7 +171,8 @@ export const fireDetail = "/fusion/web/fireProject/getDetailWithoutAuth";
 // export const fireDetailByPsw = '/web/fireProject/getDetailWithoutAuth'
 
 // 获取火调详情
-export const fireDetailByPsw = "/fusion/web/fireProject/getDetailWithoutAuth"; //wxAnonGetDetail
+export const fireDetailByPsw =
+  "/fusion/web/fireProject/getDetailWithoutAuth"; //wxAnonGetDetail
 /** ------------------------------------------ */
 
 // case相关
@@ -222,6 +229,7 @@ export const uploadAttachImage = "/web/fireProject/uploadImage";
 export const checkCaseHasDownload = `/fusion/offlinePackage/checkDown`;
 export const getCaseHasDownloadProcess = `/fusion/offlinePackage/process`;
 export const downloadCaseScene = "/fusion/offlinePackage/down";
+
 // 下载校验
 export const checkHasDownload = "/fusion/sceneDownLog/checkDownLoad";
 // 下载获取进度条
@@ -233,7 +241,6 @@ export const downloadSceneList = "/fusion/sceneDownLog/list";
 export const offLine = "/web/fireProject/offLine"; //{roomId}
 export const onLine = "/web/fireProject/onLine"; //{roomId}
 export const onLineCheck = "/web/fireProject/onLineCheck";
-
 // 照片制卷
 export const caseApiList = "/fusion/caseImg/list";
 export const saveApiOrUpdate = "/fusion/caseImg/saveOrUpdate";
@@ -241,7 +248,6 @@ export const uploadImagesAndSave = "/fusion/caseImg/addBatch";
 export const caseApiDel = "/fusion/caseImg/delete";
 export const caseApiUpdateSort = "/fusion/caseImg/updateSort";
 
-//settting
 export const getSysSetting = `/fusion/systemSetting/info`;
 export const updateSysSetting = `/fusion/systemSetting/save`;
 

+ 60 - 6
src/store/scene.ts

@@ -5,8 +5,12 @@ import {
   axios,
   cancelUModel,
   checkGenMeshScene,
+  copyModel,
+  copyScene,
   delScene,
   deleteModel,
+  downModelHash,
+  downSceneHash,
   downloadSceneList,
   genMeshSceneByCloud,
   getModelRunProgress,
@@ -15,6 +19,7 @@ import {
   updateModelScene,
   uploadModel,
 } from "@/request";
+import saveAs from "@/util/file-serve";
 import { ElMessage } from "element-plus";
 
 interface BaseScene {
@@ -53,6 +58,7 @@ export enum QuoteSceneStatus {
   DEL = -1,
   RUN = 0,
   ERR = 1,
+  QUEUE = 5,
   SUCCESS = 2,
   ARCHIVE = 3,
   RERUN = 4,
@@ -60,8 +66,10 @@ export enum QuoteSceneStatus {
 
 export interface ModelScene extends BaseScene {
   modelTitle: string;
+  renderType: string;
   modelId: number;
   createStatus: ModelSceneStatus;
+  fileNewName: string;
   modelSize: string;
   modelDateType: string;
   progress?: number;
@@ -85,14 +93,24 @@ export enum SceneType {
 export enum ModelSceneStatus {
   ERR = -1,
   RUN = 0,
+  REV = 2,
   SUCCESS = 1,
   CANCEL = -2,
 }
 
+const downHash = async (res: string, name: string) => {
+  if (res.includes("code")) {
+    ElMessage.error(JSON.parse(res).message);
+  } else {
+    await saveAs(new Blob([res], { type: "text/plain" }), name + "-hash.txt");
+  }
+};
+
 export const setModelScene = (scene: ModelScene) =>
   axios.post(updateModelScene, {
     modelId: scene.modelId,
     modelTitle: scene.modelTitle,
+    renderType: scene.renderType,
   });
 
 export const cancelUploadModelScene = (scene: ModelScene) =>
@@ -101,19 +119,42 @@ export const cancelUploadModelScene = (scene: ModelScene) =>
 export const delModelScene = (scene: ModelScene) =>
   axios.post(deleteModel, { modelId: scene.modelId });
 
-export const uploadModelScene = (
+export const copyModelScene = (scene: ModelScene) =>
+  axios.post(copyModel, { modelId: scene.modelId });
+
+export const downModelSceneHash = async (scene: ModelScene) => {
+  const res = (await axios.get(downModelHash, {
+    params: { modelId: scene.modelId, ingoreRes: true },
+    responseType: "text",
+  })) as string;
+  await downHash(res, scene.modelTitle);
+};
+
+export const uploadModelScene = async (
   file: File,
   progressCallback: (progress: number) => void
-) =>
-  axios<undefined>({
+) => {
+  let done = false;
+  await axios<undefined>({
     method: "POST",
     url: uploadModel,
     data: { file },
     onUploadProgress(event: any) {
-      progressCallback(Math.round((event.loaded / event.total) * 100) || 0);
+      if (!done) {
+        const p = Math.round((event.loaded / event.total) * 100);
+        if (p === 100) {
+          progressCallback(0);
+        } else {
+          progressCallback(p || 0);
+        }
+        console.log("进度:", p);
+      }
     },
   });
-
+  console.log("上传完成");
+  done = true;
+  progressCallback(0);
+};
 export const getModelSceneStatus = async (scene: ModelScene) => {
   const progress = (
     await axios.get<number>(getModelRunProgress, {
@@ -145,7 +186,7 @@ type ScenePaggingParams = PaggingReq<
   }
 >;
 export const getScenePagging = async (params: ScenePaggingParams) => {
-  return (
+  const data = (
     await axios.get(
       params.type === SceneType.SWMX ? getModelSceneList : getSceneList,
       {
@@ -153,11 +194,24 @@ export const getScenePagging = async (params: ScenePaggingParams) => {
       }
     )
   ).data as PaggingRes<Scene>;
+
+  return data;
 };
 
 export const delQuoteScene = (scene: QuoteScene) =>
   axios.get(delScene, { params: { num: scene.num } });
 
+export const copyQuoteScene = (scene: QuoteScene) =>
+  axios.post(copyScene, { num: scene.num });
+
+export const downQuoteSceneHash = async (scene: QuoteScene) => {
+  const res = (await axios.get(downSceneHash, {
+    params: { num: scene.num, ingoreRes: true, type: scene.type },
+    responseType: "text",
+  })) as any;
+  await downHash(res, scene.title);
+};
+
 export type QueryDownloadQuoteSceneParams = PaggingReq<{
   deptId: string;
   userName: string;

+ 10 - 1
src/view/vrmodel/editModel.vue

@@ -7,6 +7,12 @@
         placeholder="请输入模型名称"
       />
     </el-form-item>
+    <el-form-item label="渲染方式" v-if="bindModel.modelDateType === 'obj'">
+      <el-select placeholder="请选择" v-model="bindModel.renderType">
+        <el-option label="基础材质(无光照)" value="base" />
+        <el-option label="标准材质(有光照,适用于无贴图模型)" value="normal" />
+      </el-select>
+    </el-form-item>
   </el-form>
 </template>
 
@@ -17,7 +23,10 @@ import { ElMessage } from "element-plus";
 import { QuiskExpose } from "@/helper/mount";
 
 const props = defineProps<{ model: ModelScene }>();
-const bindModel = ref<ModelScene>({ ...props.model });
+const bindModel = ref<ModelScene>({
+  ...props.model,
+  renderType: props.model.renderType || "base",
+});
 
 defineExpose<QuiskExpose>({
   async submit() {

+ 1 - 1
src/view/vrmodel/list.vue

@@ -33,7 +33,7 @@ import { useScenePaggingParams } from "./pagging";
 defineProps<{ params: ReturnType<typeof useScenePaggingParams> }>();
 
 const headOptions = [
-  { value: SceneType.SWKK, name: SceneTypeDesc[SceneType.SWKK] },
+  // { value: SceneType.SWKK, name: SceneTypeDesc[SceneType.SWKK] },
   { value: SceneType.SWKJ, name: SceneTypeDesc[SceneType.SWKJ] },
   { value: SceneType.SWSS, name: SceneTypeDesc[SceneType.SWSS] },
   { value: SceneType.SWSSMX, name: SceneTypeDesc[SceneType.SWSSMX] },

+ 38 - 20
src/view/vrmodel/modelContent.vue

@@ -5,7 +5,7 @@
     <el-tooltip
       class="item"
       effect="dark"
-      :content="`请上传${format}(支持obj/ply/las/osgb/b3dm格式的数据),大小在${size}以内 `"
+      :content="`请上传${format}(支持obj/ply/las/laz/b3dm格式的数据),大小在${size}以内 `"
       placement="bottom-start"
       ><el-upload
         class="upload-demo"
@@ -43,31 +43,34 @@
       {{ getStatusText(row) }}
     </el-table-column>
     <el-table-column label="所属架构" prop="deptName"></el-table-column>
-    <el-table-column label="操作" v-slot:default="{ row }">
-      <span
-        class="oper-span"
-        v-pdpath="['edit']"
-        @click="editHanlder(row)"
-        v-if="row.createStatus === ModelSceneStatus.SUCCESS"
-      >
-        修改
-      </span>
-      <span
-        class="oper-span"
-        v-pdpath="['view']"
-        @click="openSceneUrl(row, OpenType.query)"
-        v-if="row.createStatus === ModelSceneStatus.SUCCESS"
-      >
-        查看
-      </span>
+    <el-table-column label="操作" v-slot:default="{ row }" width="350px">
+      <template v-if="row.createStatus === ModelSceneStatus.SUCCESS">
+        <span class="oper-span" @click="downOrigin(row)" v-if="row.fileNewName">
+          下载原始资源
+        </span>
+        <span class="oper-span" @click="downHash(row)"> Hash </span>
+        <span class="oper-span" @click="copyHanlder(row)"> 复制 </span>
+        <span class="oper-span" v-pdpath="['edit']" @click="editHanlder(row)">
+          修改
+        </span>
+        <span
+          class="oper-span"
+          v-pdpath="['view']"
+          @click="openSceneUrl(row, OpenType.query)"
+        >
+          查看
+        </span>
+      </template>
       <span
+        v-if="row.createStatus !== ModelSceneStatus.REV"
         class="oper-span delBtn"
-        v-pdscene="row"
         @click="delOrCancel(row)"
         v-pdpath="'del'"
       >
         {{ row.createStatus !== ModelSceneStatus.RUN ? "删除" : "取消上传" }}
       </span>
+
+      <span v-else class="oper-span" v-pdpath="['viewaaa']"> 模型转换中… </span>
     </el-table-column>
   </el-table>
 
@@ -89,12 +92,13 @@ import {
   uploadModelScene,
   delModelScene,
   getModelSceneStatus,
+  copyModelScene,
+  downModelSceneHash,
 } from "@/store/scene";
 import {
   ModelMaxSize,
   ModelSceneStatusDesc,
   ModelSupportFormats,
-  SceneTypePaths,
 } from "@/constant/scene";
 import { confirm } from "@/helper/message";
 import { useUpload } from "@/hook/upload";
@@ -103,6 +107,7 @@ import { watchPolling } from "@/hook/watchPolling";
 import { OpenType, openSceneUrl } from "../case/help";
 import { operateIsPermissionByPath } from "@/directive/permission";
 import { editModelScene } from "./quisk";
+import saveAs from "@/util/file-serve";
 
 const props = defineProps<{ pagging: ScenePagging }>();
 
@@ -132,6 +137,15 @@ const editHanlder = async (scene: ModelScene) => {
   }
 };
 
+const copyHanlder = async (scene: ModelScene) => {
+  if (await copyModelScene(scene)) {
+    props.pagging.refresh();
+  }
+};
+const downHash = async (scene: ModelScene) => {
+  downModelSceneHash(scene);
+};
+
 const {
   percentage,
   upload: uploadCheck,
@@ -165,6 +179,10 @@ const refreshStatus = (models: ModelScene[]) => {
   return Promise.all(refreshStatusAll);
 };
 
+const downOrigin = async (model: ModelScene) => {
+  await saveAs(model.fileNewName, model.modelTitle + ".zip");
+};
+
 watchPolling(() => {
   const payload = (props.pagging.state.table.rows as ModelScene[]).filter(
     (item) => item.createStatus === ModelSceneStatus.RUN

+ 1 - 1
src/view/vrmodel/pagging.ts

@@ -6,7 +6,7 @@ export const useScenePaggingParams = () => {
   const pagging = usePagging({
     get: getScenePagging,
     paramsTemlate: {
-      type: SceneType.SWKK,
+      type: SceneType.SWKJ,
       sceneName: "",
       modelTitle: "",
       deptId: "",

+ 5 - 9
src/view/vrmodel/quisk.ts

@@ -2,8 +2,6 @@ import { QuoteScene, SceneType } from "@/store/scene";
 import EditModel from "./editModel.vue";
 import SceneDownload from "./sceneDownload.vue";
 import { quiskMountFactory } from "@/helper/mount";
-import SceneDownload from "./sceneDownload.vue";
-import { QuoteScene, SceneType } from "@/store/scene";
 import { axios, checkHasDownload } from "@/request";
 
 export const editModelScene = quiskMountFactory(EditModel, {
@@ -12,21 +10,19 @@ export const editModelScene = quiskMountFactory(EditModel, {
 });
 
 export type SceneDpwnloadProps = { scene: QuoteScene };
-export const sceneDownload = async (props: SceneDpwnloadProps) => {
+export const sceneDownload = async(props: SceneDpwnloadProps) => {
   const params = {
     num: props.scene.num,
-    isObj: Number(
-      ![SceneType.SWSS, SceneType.SWYDSS].includes(props.scene.type)
-    ),
+    isObj: Number(![SceneType.SWSS, SceneType.SWYDSS].includes(props.scene.type)),
   };
   const res = await axios.get(checkHasDownload, { params });
-  const hideFloor = Number(res.data.downloadStatus) !== 3;
+  const hideFloor = Number(res.data.downloadStatus) !== 3
 
   const sceneDownloadDialog = quiskMountFactory(SceneDownload, {
     title: "场景离线包下载",
     width: 500,
     hideFloor: hideFloor,
-    enterText: "下 载",
+    enterText: '下 载'
   });
   return await sceneDownloadDialog(props);
-};
+}

+ 31 - 4
src/view/vrmodel/sceneContent.vue

@@ -25,7 +25,25 @@
       {{ QuoteSceneStatusDesc[row.status] }}
     </el-table-column>
     <el-table-column label="所属架构" prop="deptName"></el-table-column>
-    <el-table-column label="操作" v-slot:default="{ row }: { row: QuoteScene }">
+    <el-table-column
+      label="操作"
+      v-slot:default="{ row }: { row: QuoteScene }"
+      width="350px"
+    >
+      <span
+        class="oper-span"
+        @click="downHash(row)"
+        v-if="row.status === QuoteSceneStatus.SUCCESS"
+      >
+        Hash
+      </span>
+      <span
+        class="oper-span"
+        @click="copySceneHandler(row)"
+        v-if="row.status === QuoteSceneStatus.SUCCESS"
+      >
+        复制
+      </span>
       <span
         class="oper-span"
         v-pdpath="['view']"
@@ -57,11 +75,10 @@
 
       <span
         v-if="
-          ![SceneType.SWSSMX, SceneType.SWYDMX].includes(row.type) &&
-          row.status !== QuoteSceneStatus.RUN
+          ![QuoteSceneStatus.RUN, QuoteSceneStatus.QUEUE].includes(row.status) &&
+          ![SceneType.SWSSMX, SceneType.SWYDMX].includes(row.type)
         "
         class="oper-span delBtn"
-        v-pdscene="row"
         @click="delSceneHandler(row)"
         v-pdpath="'del'"
       >
@@ -87,12 +104,15 @@ import {
   SceneType,
   genMeshScene,
   LocationEnum,
+  copyQuoteScene,
+  downQuoteSceneHash,
 } from "@/store/scene";
 import { ScenePagging } from "./pagging";
 import { QuoteSceneStatusDesc } from "@/constant/scene";
 import { OpenType, openSceneUrl } from "../case/help";
 import { confirm } from "@/helper/message";
 import { sceneDownload } from "./quisk";
+import { downSceneHash } from "@/request";
 
 const props = defineProps<{ pagging: ScenePagging }>();
 const delSceneHandler = async (scene: QuoteScene) => {
@@ -101,6 +121,13 @@ const delSceneHandler = async (scene: QuoteScene) => {
     props.pagging.refresh();
   }
 };
+const copySceneHandler = async (scene: QuoteScene) => {
+  await copyQuoteScene(scene);
+  props.pagging.refresh();
+};
+const downHash = async (scene: QuoteScene) => {
+  downQuoteSceneHash(scene);
+};
 const sceneDownloadHandler = (scene: QuoteScene) => {
   sceneDownload({ scene });
 };

+ 3 - 3
src/view/vrmodel/sceneDownload.vue

@@ -96,9 +96,9 @@ const download = () => {
     ElMessage.error("下载链接未生成,请稍等!");
     throw "下载链接未生成,请稍等!";
   } else {
-    // if (!downloadURL.value.startsWith("/")) {
-    downloadURL.value = downloadURL.value;
-    // }
+    if (!downloadURL.value.startsWith("/")) {
+      downloadURL.value = "/" + downloadURL.value;
+    }
     console.error("downloadURL.value", downloadURL.value);
     return saveAs(downloadURL.value, filename.value);
   }