scene.ts 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. import { confirm } from "@/helper/message";
  2. import {
  3. PaggingReq,
  4. PaggingRes,
  5. axios,
  6. cancelUModel,
  7. checkGenMeshScene,
  8. copyModel,
  9. copyScene,
  10. delScene,
  11. deleteModel,
  12. downModelHash,
  13. downSceneHash,
  14. downloadSceneList,
  15. genMeshSceneByCloud,
  16. getModelRunProgress,
  17. getModelSceneList,
  18. getSceneList,
  19. updateModelScene,
  20. uploadModel,
  21. } from "@/request";
  22. import saveAs from "@/util/file-serve";
  23. import { ElMessage } from "element-plus";
  24. interface BaseScene {
  25. title: string;
  26. time: string;
  27. type: SceneType;
  28. id: string;
  29. }
  30. // 只有当location 为4 时,才能生成obj
  31. export enum LocationEnum {
  32. Scene_Location_Slam, //slam\n" +
  33. Scene_Location_SFM, //sfm\n" +F
  34. Scene_Location_SFMAI, //SFM + AI\n" +
  35. Scene_Location_MutiFloor, //多楼层\n" +
  36. Scene_Location_PointCloud, //点云\n" +
  37. Scene_Location_SLAMPoint, //slam实时拍\n" +
  38. Scene_Location_SLAMPointAndSFMAI, //slam实时拍+站点\n" +
  39. }
  40. export type QuoteScene = BaseScene & {
  41. hasSynchronized: boolean;
  42. sceneNum: string;
  43. sceneName: string;
  44. createTime: string;
  45. vrLink: string;
  46. num: string;
  47. snCode: string;
  48. location: LocationEnum;
  49. viewCount: number;
  50. status: QuoteSceneStatus;
  51. };
  52. // 普通场景状态
  53. export enum QuoteSceneStatus {
  54. DEL = -1,
  55. RUN = 0,
  56. ERR = 1,
  57. SUCCESS = 2,
  58. ARCHIVE = 3,
  59. RERUN = 4,
  60. }
  61. export interface ModelScene extends BaseScene {
  62. modelTitle: string;
  63. renderType: string;
  64. modelId: number;
  65. createStatus: ModelSceneStatus;
  66. fileNewName: string;
  67. modelSize: string;
  68. modelDateType: string;
  69. progress?: number;
  70. createTime: string;
  71. }
  72. export type Scene = QuoteScene | ModelScene;
  73. export enum SceneType {
  74. SWKK,
  75. SWKJ,
  76. SWSS,
  77. SWMX,
  78. SWSSMX,
  79. SWYDSS,
  80. SWYDMX,
  81. }
  82. // 模型场景状态
  83. export enum ModelSceneStatus {
  84. ERR = -1,
  85. RUN = 0,
  86. REV = 2,
  87. SUCCESS = 1,
  88. CANCEL = -2,
  89. }
  90. const downHash = async (res: string, name: string) => {
  91. if (res.includes("code")) {
  92. ElMessage.error(JSON.parse(res).message);
  93. } else {
  94. await saveAs(new Blob([res], { type: "text/plain" }), name + "-hash.txt");
  95. }
  96. };
  97. export const setModelScene = (scene: ModelScene) =>
  98. axios.post(updateModelScene, {
  99. modelId: scene.modelId,
  100. modelTitle: scene.modelTitle,
  101. renderType: scene.renderType,
  102. });
  103. export const cancelUploadModelScene = (scene: ModelScene) =>
  104. axios.get(cancelUModel, { params: { modelId: scene.modelId } });
  105. export const delModelScene = (scene: ModelScene) =>
  106. axios.post(deleteModel, { modelId: scene.modelId });
  107. export const copyModelScene = (scene: ModelScene) =>
  108. axios.post(copyModel, { modelId: scene.modelId });
  109. export const downModelSceneHash = async (scene: ModelScene) => {
  110. const res = (await axios.get(downModelHash, {
  111. params: { modelId: scene.modelId, ingoreRes: true },
  112. responseType: "text",
  113. })) as string;
  114. await downHash(res, scene.modelTitle);
  115. };
  116. export const uploadModelScene = async (
  117. file: File,
  118. progressCallback: (progress: number) => void
  119. ) => {
  120. let done = false;
  121. await axios<undefined>({
  122. method: "POST",
  123. url: uploadModel,
  124. data: { file },
  125. onUploadProgress(event: any) {
  126. if (!done) {
  127. const p = Math.round((event.loaded / event.total) * 100);
  128. if (p === 100) {
  129. progressCallback(0);
  130. } else {
  131. progressCallback(p || 0);
  132. }
  133. console.log("进度:", p);
  134. }
  135. },
  136. });
  137. console.log("上传完成");
  138. done = true;
  139. progressCallback(0);
  140. };
  141. export const getModelSceneStatus = async (scene: ModelScene) => {
  142. const progress = (
  143. await axios.get<number>(getModelRunProgress, {
  144. params: { modelId: scene.modelId },
  145. })
  146. ).data;
  147. return {
  148. progress,
  149. status:
  150. progress >= 100
  151. ? ModelSceneStatus.SUCCESS
  152. : progress < 0
  153. ? ModelSceneStatus.ERR
  154. : ModelSceneStatus.RUN,
  155. };
  156. };
  157. // *-----公用
  158. type ScenePaggingParams = PaggingReq<
  159. Pick<BaseScene, "type"> & {
  160. modelTitle: string;
  161. sceneName: string;
  162. status?: number;
  163. caseId?: number;
  164. deptId: string;
  165. snCode: string;
  166. }
  167. >;
  168. export const getScenePagging = async (params: ScenePaggingParams) => {
  169. const data = (
  170. await axios.get(
  171. params.type === SceneType.SWMX ? getModelSceneList : getSceneList,
  172. {
  173. params,
  174. }
  175. )
  176. ).data as PaggingRes<Scene>;
  177. return data;
  178. };
  179. export const delQuoteScene = (scene: QuoteScene) =>
  180. axios.get(delScene, { params: { num: scene.num } });
  181. export const copyQuoteScene = (scene: QuoteScene) =>
  182. axios.post(copyScene, { num: scene.num });
  183. export const downQuoteSceneHash = async (scene: QuoteScene) => {
  184. const res = (await axios.get(downSceneHash, {
  185. params: { num: scene.num, ingoreRes: true, type: scene.type },
  186. responseType: "text",
  187. })) as any;
  188. await downHash(res, scene.title);
  189. };
  190. export type QueryDownloadQuoteSceneParams = PaggingReq<{
  191. deptId: string;
  192. userName: string;
  193. nickName: string;
  194. createTime: string;
  195. sceneTitle: string;
  196. sceneNum: string;
  197. snCode: string;
  198. }>;
  199. export type DownloadQuoteSceneLog = {
  200. id: number;
  201. sceneNum: string;
  202. sceneTitle: string;
  203. userName: string;
  204. nickName: string;
  205. snCode: string;
  206. deptLevelStr: string;
  207. deptName: string;
  208. deptId: string;
  209. createTime: string;
  210. };
  211. export const getDownloadQuoteScene = async (
  212. params: Omit<QueryDownloadQuoteSceneParams, "createTime"> & {
  213. startCreateTime: string | null;
  214. endCreateTime: string | null;
  215. }
  216. ) =>
  217. (await axios.post(downloadSceneList, params))
  218. .data as PaggingRes<DownloadQuoteSceneLog>;
  219. export const genMeshScene = async (scene: QuoteScene) => {
  220. const res = (await axios.post(checkGenMeshScene, { id: scene.id })).data;
  221. if (res?.buildObjStatus === 2) {
  222. ElMessage.error("Mesh场景正在计算中,请耐心等待。");
  223. } else if (
  224. res?.buildObjStatus !== 1 ||
  225. (await confirm("重新生成obj,Mesh场景将覆盖现有信息,确定要重新生成吗?"))
  226. ) {
  227. await axios.post(genMeshSceneByCloud, { id: scene.id });
  228. ElMessage.success("生成obj将同时生成Mesh场景,需要较长时间,请耐心等待;");
  229. }
  230. };