scene.ts 6.7 KB

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