enter-shared.ts 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. import type { TabCover } from "./store";
  2. import type { Scene } from "../../example/platform/platform-resource";
  3. import type { StoreData } from "@/core/store/store";
  4. import { token, params, urlUpdateQuery, urlGetQuery } from "../env";
  5. import { genLoading } from "../loadding";
  6. import { formatDate, tempStrFill } from "@/utils/shared";
  7. import {
  8. type LatLng,
  9. latlngStrTransform,
  10. } from "../dialog/basemap/leaflet/useLeaflet";
  11. import mitt from "mitt";
  12. export const SCENE_TYPE = {
  13. fuse: "fuse",
  14. mesh: "mesh",
  15. cloud: "cloud",
  16. } as const;
  17. export const resourceURLS = {
  18. oss: import.meta.env.VITE_MESH_OSS,
  19. ossRoot: import.meta.env.VITE_OSS_ROOT,
  20. [SCENE_TYPE.mesh]: import.meta.env.VITE_MESH_API,
  21. [SCENE_TYPE.cloud]: import.meta.env.VITE_CLOUD_API,
  22. [SCENE_TYPE.fuse]: import.meta.env.VITE_FUSE_API,
  23. };
  24. export const viewURLS = {
  25. [SCENE_TYPE.mesh]: import.meta.env.VITE_MESH_VIEW,
  26. [SCENE_TYPE.cloud]: import.meta.env.VITE_CLOUD_VIEW,
  27. [SCENE_TYPE.fuse]: import.meta.env.VITE_FUSE_VIEW,
  28. };
  29. export const getHeaders = () => ({
  30. token: token.value || localStorage.getItem("token") || "",
  31. "page-type": "edit",
  32. });
  33. export const bus = mitt();
  34. export const get = (url: string, params: Record<string, any>) => {
  35. const p = new URLSearchParams();
  36. for (const key in params) {
  37. p.append(key, params[key]);
  38. }
  39. const l = `${resourceURLS[SCENE_TYPE.fuse]}${url}?${p.toString()}`;
  40. return after(
  41. fetch(l, { method: "get", headers: window.platform.getHeaders() })
  42. );
  43. };
  44. export const post = (url: string, data: Record<string, any>) => {
  45. const l = `${resourceURLS[SCENE_TYPE.fuse]}${url}`;
  46. return after(
  47. fetch(l, {
  48. headers: {
  49. "Content-Type": "application/json;charset=UTF-8",
  50. ...window.platform.getHeaders(),
  51. },
  52. method: "post",
  53. body: JSON.stringify(data),
  54. })
  55. );
  56. };
  57. export const postFile = (url: string, data: Record<string, any>) => {
  58. const formData = new FormData();
  59. for (const key in data) {
  60. formData.append(key, data[key]);
  61. }
  62. const l = `${resourceURLS[SCENE_TYPE.fuse]}${url}`;
  63. return after(
  64. fetch(l, {
  65. headers: window.platform.getHeaders(),
  66. method: "post",
  67. body: formData,
  68. })
  69. );
  70. };
  71. export const login = (isBack = true) => {
  72. const p: any = { ...params.value };
  73. delete p.token;
  74. const cur = urlUpdateQuery(location.href, p, true);
  75. let link = tempStrFill(import.meta.env.VITE_LOGIN_VIEW, {
  76. redirect: escape(cur),
  77. });
  78. if (!isBack) {
  79. let url: URL;
  80. try {
  81. url = new URL(link);
  82. } catch {
  83. url = new URL(link, location.origin);
  84. }
  85. url.searchParams.delete("redirect");
  86. const query = urlGetQuery(url.toString());
  87. delete query["redirect"];
  88. link = urlUpdateQuery(url.toString(), query, true);
  89. }
  90. location.replace(link);
  91. };
  92. const after = async (fet: Promise<Response>) => {
  93. let res: any;
  94. const response = await fet;
  95. if (response.status !== 200) {
  96. if (response.status === 404) {
  97. res = {
  98. code: 404,
  99. message: "网络异常",
  100. };
  101. } else {
  102. res = {
  103. code: 500,
  104. message: "服务异常",
  105. };
  106. }
  107. } else {
  108. try {
  109. res = await response.json();
  110. } catch {
  111. res = {
  112. code: 500,
  113. message: "服务异常",
  114. };
  115. }
  116. }
  117. if (res.code === 8034) {
  118. if (!import.meta.env.DEV) {
  119. setTimeout(() => {
  120. history.back();
  121. }, 1000);
  122. }
  123. throw `${res.message},即将退出`;
  124. }
  125. if ([4008, 4010, 7012].includes(res.code)) {
  126. setTimeout(() => {
  127. window.platform.login(res.code !== 7012);
  128. }, 1000);
  129. throw res.message;
  130. }
  131. if (res.code !== 0) {
  132. bus.emit("requestError", res);
  133. }
  134. if (res.code !== 0) {
  135. throw res.message;
  136. } else {
  137. return res.data;
  138. }
  139. };
  140. export const getSceneList = (keyword: string) => {
  141. let page = 1;
  142. let final = false;
  143. const list: Scene[] = [];
  144. const request = genLoading(async () => {
  145. const data = await post(`fusion/case/sceneListPost`, {
  146. isMesh: 1,
  147. caseId: params.value.caseId,
  148. pageNum: page,
  149. sceneName: keyword,
  150. });
  151. const current = data.list.map(
  152. (item: any) =>
  153. ({
  154. type: SCENE_TYPE.mesh,
  155. m: item.num,
  156. title: item.sceneName,
  157. id: item.id.toString(),
  158. mapping: item.mapping,
  159. token,
  160. } as Scene)
  161. );
  162. list.push(...current);
  163. page++;
  164. final = Math.ceil(data.total / data.pageSize) < page;
  165. });
  166. let next = async () => {
  167. if (!final) {
  168. await request();
  169. }
  170. return {
  171. next,
  172. final,
  173. list,
  174. };
  175. };
  176. return { next, final, list };
  177. };
  178. export const getOverviewData = genLoading(async (id: string) => {
  179. if (!id) {
  180. return {
  181. store: {
  182. layers: {
  183. default: {},
  184. },
  185. },
  186. viewport: null,
  187. };
  188. }
  189. const data = await get("fusion/caseOverview/info", { overviewId: id });
  190. return {
  191. ...data,
  192. store: JSON.parse(data.store) || {
  193. layers: {
  194. default: {},
  195. },
  196. },
  197. viewport: JSON.parse(data.viewport),
  198. };
  199. });
  200. export const saveOverviewData = genLoading(
  201. async (
  202. id: string,
  203. data: {
  204. store: StoreData;
  205. viewport: number[] | null;
  206. caseTabulation: {
  207. id: string;
  208. store: StoreData;
  209. viewport: number[] | null;
  210. isAutoGen: boolean;
  211. cover: TabCover | null;
  212. paperKey?: string;
  213. overviewId: string;
  214. };
  215. }
  216. ) => {
  217. const item = await post(`fusion/caseOverview/addOrUpdate`, {
  218. ...params.value,
  219. ...data,
  220. id,
  221. store: JSON.stringify(data.store),
  222. viewport: JSON.stringify(data.viewport),
  223. caseTabulation: {
  224. ...data.caseTabulation,
  225. store: JSON.stringify(data.caseTabulation.store),
  226. viewport: JSON.stringify(data.caseTabulation.viewport),
  227. cover: JSON.stringify(data.caseTabulation.cover),
  228. isAutoGen: Number(data.caseTabulation.isAutoGen),
  229. paperKey: data.caseTabulation.paperKey,
  230. overviewId: data.caseTabulation.overviewId,
  231. },
  232. });
  233. return item.id;
  234. }
  235. );
  236. export const getTabulationId = async (id: string) => {
  237. const list = await get("fusion/caseTabulation/getByOverviewId", {
  238. overviewId: id,
  239. });
  240. return list[0]?.id;
  241. };
  242. export const getTabulationData = genLoading(async (id: string) => {
  243. if (!id) {
  244. return {
  245. store: {
  246. layers: {
  247. default: {},
  248. },
  249. },
  250. cover: null,
  251. isAutoGen: true,
  252. viewport: null,
  253. paperKey: "a4",
  254. };
  255. }
  256. const data = await get(`fusion/caseTabulation/info`, { tabulationId: id });
  257. return {
  258. ...data,
  259. store: JSON.parse(data.store) || {
  260. layers: {
  261. default: {},
  262. },
  263. },
  264. viewport: JSON.parse(data.viewport),
  265. cover: JSON.parse(data.cover),
  266. isAutoGen: Number(data.isAutoGen),
  267. paperKey: data.paperKey || "a4",
  268. };
  269. });
  270. export const saveTabulationData = genLoading(
  271. async (
  272. id: string,
  273. data: {
  274. store: StoreData;
  275. viewport: number[] | null;
  276. isAutoGen: boolean;
  277. cover: TabCover | null;
  278. paperKey?: string;
  279. overviewId: string;
  280. }
  281. ) => {
  282. const item = await post("fusion/caseTabulation/addOrUpdate", {
  283. ...params.value,
  284. ...data,
  285. id,
  286. store: JSON.stringify(data.store),
  287. viewport: JSON.stringify(data.viewport),
  288. cover: JSON.stringify(data.cover),
  289. isAutoGen: Number(data.isAutoGen),
  290. paperKey: data.paperKey,
  291. overviewId: data.overviewId,
  292. });
  293. return item.id;
  294. }
  295. );
  296. export const uploadResourse = genLoading(
  297. async (file: File) => await postFile(`fusion/upload/file`, { file })
  298. );
  299. export const getResource = (url: string) => {
  300. return url;
  301. // if (url.includes("//")) {
  302. // return url;
  303. // } else if (import.meta.env.DEV && import.meta.env.VITE_STATIC) {
  304. // console.log(url, import.meta.env.VITE_STATIC)
  305. // return `${import.meta.env.VITE_STATIC}${url}`;
  306. // } else {
  307. // return url;
  308. // }
  309. };
  310. let tempCache: any
  311. export let getTableTemp = async () => {
  312. if (tempCache) return tempCache;
  313. let table: Record<string, string>;
  314. let title: string = params.value.title;
  315. if (params.value.table) {
  316. try {
  317. table = JSON.parse(params.value.table);
  318. } catch (e) {
  319. console.log("tableTemp模板解析失败");
  320. }
  321. }
  322. if (!table!) {
  323. table = {
  324. 案发时间: "",
  325. 案发地点: "",
  326. 绘图单位: "",
  327. 绘图人: "",
  328. 绘图时间: "",
  329. };
  330. if (params.value.overviewId) {
  331. const item = await get("fusion/caseOverview/settingInfo", {
  332. overviewId: params.value.overviewId,
  333. });
  334. if (item) {
  335. table.案发时间 = item.crimeTimeBegin;
  336. table.案发地点 = item.caseLocation;
  337. table.绘图单位 = item.orgName;
  338. table.绘图人 = item.investigatorName;
  339. table.绘图时间 = formatDate(new Date(), 'yyyy.mm.dd hh:MM:ss')
  340. }
  341. if (!title) {
  342. title = `“${item.crimeTimeBegin}”${item.caseLocation}${item.caseTypeName}现场平面示意图`
  343. }
  344. }
  345. }
  346. if (!title) {
  347. title = "默认标题";
  348. }
  349. return tempCache = { table, title }
  350. };
  351. export const getTileGroups = async () => {
  352. const data = await get(`fusion/notAuth/getMapConfig`, {});
  353. return data.map((item: any) => {
  354. const mitem = JSON.parse(item.mapUrl);
  355. return {
  356. id: item.id,
  357. name: item.name,
  358. tiles: mitem.map((tileItem: any) => ({
  359. url: tileItem.tempUrl,
  360. minimumLevel: tileItem.minimumLevel || 1,
  361. maximumLevel: tileItem.maximumLevel || 18,
  362. })),
  363. };
  364. });
  365. };
  366. export const searchAddress = async (keyword: string, mapId: number) => {
  367. const data = await post(`fusion/mapConfig/geocode`, {
  368. address: keyword,
  369. mapId,
  370. });
  371. return data.map((item: any) => ({
  372. ...item,
  373. latlng: latlngStrTransform(item.location.split(",").reverse().join(",")),
  374. }));
  375. };
  376. export const getDefaultAddress = () => {
  377. try {
  378. console.log(params.value.latlng);
  379. let latlng: LatLng = JSON.parse(params.value.latlng);
  380. return latlng;
  381. } catch {
  382. return null;
  383. }
  384. };