scene.ts 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  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. cameraTypeAllList,
  22. getMix3dList,
  23. SYNC_INFO,
  24. } from "@/request";
  25. import saveAs from "@/util/file-serve";
  26. import { ElMessage } from "element-plus";
  27. import { user } from "@/store/user";
  28. import { getCaseSceneList } from "@/store/case";
  29. interface BaseScene {
  30. title: string;
  31. time: string;
  32. searchType: any;
  33. // type: SceneType;
  34. id: string;
  35. }
  36. // 只有当location 为4 时,才能生成obj
  37. export enum LocationEnum {
  38. Scene_Location_Slam, //slam\n" +
  39. Scene_Location_SFM, //sfm\n" +F
  40. Scene_Location_SFMAI, //SFM + AI\n" +
  41. Scene_Location_MutiFloor, //多楼层\n" +
  42. Scene_Location_PointCloud, //点云\n" +
  43. Scene_Location_SLAMPoint, //slam实时拍\n" +
  44. Scene_Location_SLAMPointAndSFMAI, //slam实时拍+站点\n" +
  45. }
  46. export type QuoteScene = BaseScene & {
  47. hasSynchronized: boolean;
  48. sceneNum: string;
  49. sceneName: string;
  50. createTime: string;
  51. vrLink: string;
  52. num: string;
  53. snCode: string;
  54. location: LocationEnum;
  55. viewCount: number;
  56. status: QuoteSceneStatus;
  57. fusionTitle: any;
  58. };
  59. // 普通场景状态
  60. export enum QuoteSceneStatus {
  61. DEL = -1,
  62. RUN = 0,
  63. ERR = 1,
  64. QUEUE = 5,
  65. SUCCESS = 2,
  66. ARCHIVE = 3,
  67. RERUN = 4,
  68. }
  69. export interface ModelScene extends BaseScene {
  70. modelTitle: string;
  71. renderType: string;
  72. modelId: number;
  73. createStatus: ModelSceneStatus;
  74. fileNewName: string;
  75. modelSize: string;
  76. modelDateType: string;
  77. progress?: number;
  78. createTime: string;
  79. }
  80. export type Scene = QuoteScene | ModelScene;
  81. export enum SceneType {
  82. SWKK,
  83. SWKJ,
  84. SWSS,
  85. SWMX,
  86. SWSSMX,
  87. SWYDSS,
  88. SWYDMX,
  89. SWSX1,
  90. SWSX,
  91. }
  92. // 模型场景状态
  93. export enum ModelSceneStatus {
  94. ERR = -1,
  95. RUN = 0,
  96. REV = 2,
  97. SUCCESS = 1,
  98. CANCEL = -2,
  99. }
  100. const downHash = async (res: string, name: string) => {
  101. if (res.includes("code")) {
  102. ElMessage.error(JSON.parse(res).message);
  103. } else {
  104. await saveAs(new Blob([res], { type: "text/plain" }), name + "-hash.txt");
  105. }
  106. };
  107. export const setModelScene = (scene: ModelScene) =>
  108. axios.post(updateModelScene, {
  109. modelId: scene.modelId,
  110. modelTitle: scene.modelTitle,
  111. renderType: scene.renderType,
  112. });
  113. export const cancelUploadModelScene = (scene: ModelScene) =>
  114. axios.get(cancelUModel, { params: { modelId: scene.modelId } });
  115. export const delModelScene = (scene: ModelScene) =>
  116. axios.post(deleteModel, { modelId: scene.modelId });
  117. export const copyModelScene = (scene: ModelScene) =>
  118. axios.post(copyModel, { modelId: scene.modelId });
  119. export const downModelSceneHash = async (scene: ModelScene) => {
  120. const res = (await axios.get(downModelHash, {
  121. params: { modelId: scene.modelId, ingoreRes: true },
  122. responseType: "text",
  123. })) as string;
  124. await downHash(res, scene.modelTitle);
  125. };
  126. export const uploadModelScene = async (
  127. file: File,
  128. progressCallback: (progress: number) => void
  129. ) => {
  130. let done = false;
  131. await axios<undefined>({
  132. method: "POST",
  133. url: uploadModel,
  134. data: { file },
  135. onUploadProgress(event: any) {
  136. if (!done) {
  137. const p = Math.round((event.loaded / event.total) * 100);
  138. if (p === 100) {
  139. progressCallback(0);
  140. } else {
  141. progressCallback(p || 0);
  142. }
  143. console.log("进度:", p);
  144. }
  145. },
  146. });
  147. console.log("上传完成");
  148. done = true;
  149. progressCallback(0);
  150. };
  151. export const getModelSceneStatus = async (scene: ModelScene) => {
  152. const progress = (
  153. await axios.get<number>(getModelRunProgress, {
  154. params: { modelId: scene.modelId },
  155. })
  156. ).data;
  157. return {
  158. progress,
  159. status:
  160. progress >= 100
  161. ? ModelSceneStatus.SUCCESS
  162. : progress < 0
  163. ? ModelSceneStatus.ERR
  164. : ModelSceneStatus.RUN,
  165. };
  166. };
  167. // *-----公用
  168. type ScenePaggingParams = PaggingReq<
  169. Pick<BaseScene, "searchType"> & {
  170. sceneName: string;
  171. status?: number;
  172. caseId?: number;
  173. deptId: string;
  174. snCode: string;
  175. cameraType: string;
  176. searchType: any;
  177. isObj: number;
  178. fusionTitle: any;
  179. }
  180. >;
  181. export const getScenePagging = async (params: ScenePaggingParams) => {
  182. const data = (await axios.get(getSceneList,{params})).data as PaggingRes<Scene>;
  183. return data;
  184. };
  185. export const delQuoteScene = (scene: QuoteScene) =>
  186. axios.get(delScene, { params: { num: scene.num } });
  187. export const copyQuoteScene = (scene: QuoteScene) =>
  188. axios.post(copyScene, { num: scene.num });
  189. export const downQuoteSceneHash = async (scene: QuoteScene) => {
  190. const res = (await axios.get(downSceneHash, {
  191. params: { num: scene.num, ingoreRes: true, type: scene.type },
  192. responseType: "text",
  193. })) as any;
  194. await downHash(res, scene.title);
  195. };
  196. export type QueryDownloadQuoteSceneParams = PaggingReq<{
  197. deptId: string;
  198. userName: string;
  199. nickName: string;
  200. createTime: string;
  201. sceneTitle: string;
  202. sceneNum: string;
  203. snCode: string;
  204. }>;
  205. export type DownloadQuoteSceneLog = {
  206. id: number;
  207. sceneNum: string;
  208. sceneTitle: string;
  209. userName: string;
  210. nickName: string;
  211. snCode: string;
  212. deptLevelStr: string;
  213. deptName: string;
  214. deptId: string;
  215. createTime: string;
  216. };
  217. export const getDownloadQuoteScene = async (
  218. params: Omit<QueryDownloadQuoteSceneParams, "createTime"> & {
  219. startCreateTime: string | null;
  220. endCreateTime: string | null;
  221. }
  222. ) =>
  223. (await axios.post(downloadSceneList, params))
  224. .data as PaggingRes<DownloadQuoteSceneLog>;
  225. export const genMeshScene = async (scene: QuoteScene) => {
  226. const res = (await axios.post(checkGenMeshScene, { id: scene.id })).data;
  227. if (res?.buildObjStatus === 2) {
  228. ElMessage.error("Mesh场景正在计算中,请耐心等待。");
  229. } else if (
  230. res?.buildObjStatus !== 1 ||
  231. (await confirm("重新生成obj,Mesh场景将覆盖现有信息,确定要重新生成吗?"))
  232. ) {
  233. await axios.post(genMeshSceneByCloud, { id: scene.id });
  234. ElMessage.success("生成obj将同时生成Mesh场景,需要较长时间,请耐心等待;");
  235. }
  236. };
  237. // 获取设备列表
  238. export const getCameraTypeAllList = async () =>{
  239. let data = (await axios.get(cameraTypeAllList)).data as any;
  240. return data
  241. }
  242. // 获取多远融合列表
  243. export const getMix3dPagging = async (params: ScenePaggingParams) => {
  244. const data = (await axios.post(getMix3dList, params)).data as PaggingRes<Scene>;
  245. return data;
  246. };
  247. // 获取同屏勘验信息
  248. export const getSyncSceneInfo = async (scene: Scene, caseId: number) => {
  249. return (await axios.post<string>(SYNC_INFO, { caseId, num: scene.num }));
  250. };
  251. export const SceneTypePaths: { [key in SceneType]: string[] } = {
  252. [SceneType.SWKK]: [
  253. "/swkk/spg.html",
  254. "/swkk/epg.html",
  255. `/livestream/fd/criminal.html`,
  256. ],
  257. [SceneType.SWKJ]: ["/swkk/spg.html", "/swkk/epg.html"],
  258. [SceneType.DSFXJ]: ["/swkk/spg.html", "/swkk/epg.html"],
  259. [SceneType.SWSS]: ["/swss/index.html", "/swss/index.html"],
  260. [SceneType.SWMX]: import.meta.env.DEV
  261. ? ["/dev-code/index.html", "/dev-code/index.html"]
  262. : ["/code/index.html", "/code/index.html"],
  263. [SceneType.SWSSMX]: ["/swkk/spg.html", "/swkk/epg.html"],
  264. [SceneType.SWYDSS]: ["/swss/index.html", "/swss/index.html"],
  265. [SceneType.SWYDMX]: ["/swkk/spg.html", "/swkk/epg.html"],
  266. };
  267. const SceneTypeDesc: { [key in SceneType]: string } = {
  268. [SceneType.SWKK]: "八目",
  269. [SceneType.SWKJ]: "双目转台",
  270. [SceneType.SWSS]: "激光转台点云场景",
  271. [SceneType.SWMX]: "三维模型",
  272. [SceneType.SWSSMX]: "激光转台Mesh场景",
  273. [SceneType.SWYDSS]: "激光移动点云场景",
  274. [SceneType.SWYDMX]: "激光移动Mesh场景",
  275. // [SceneType.QJKK]: '全景看看',
  276. };
  277. export const getSWKKSyncLink = async (scene: Scene, caseId: number) => {
  278. console.log('scene', scene)
  279. const supportTypes = [SceneType.SWKJ, SceneType.SWSSMX, SceneType.SWYDMX];
  280. const kkScenes = supportTypes.includes(scene.sceneType)
  281. let msg: string | null = null;
  282. if (!kkScenes) {
  283. msg = `带看仅支持${supportTypes
  284. .map((type) => SceneTypeDesc[type])
  285. .join("、")}类型场景,请添加此类型场景。`;
  286. }
  287. if (msg) {
  288. ElMessage.error(msg);
  289. throw msg;
  290. }
  291. const url = new URL(SceneTypePaths[SceneType.SWKK][2], window.location.href.includes('localhost')?'https://test-mix3d.4dkankan.com/':window.location.href);
  292. const userInfo = user.value.info;
  293. const roomId = await getSyncSceneInfo(scene, caseId);
  294. const params = {
  295. vruserId: userInfo.userName,
  296. roomId: roomId.data,
  297. role: "leader",
  298. redirect: encodeURIComponent(location.href),
  299. name: userInfo.userName,
  300. m: scene.num,
  301. };
  302. for (const [name, val] of Object.entries(params)) {
  303. url.searchParams.append(name, val || "");
  304. }
  305. return url;
  306. };