|
|
@@ -1,5 +1,6 @@
|
|
|
import {
|
|
|
axios,
|
|
|
+ PaggingRes,
|
|
|
recordCaseVideo,
|
|
|
getFusionAndScene,
|
|
|
addFusionIds,
|
|
|
@@ -10,15 +11,69 @@ import {
|
|
|
updateRecord,
|
|
|
deleteRecord,
|
|
|
caseFilesTypeGetByTree,
|
|
|
+ // 文件相关列表接口
|
|
|
+ caseFileTypes,
|
|
|
+ caseFiles,
|
|
|
+ // 案件基础信息与场景列表接口
|
|
|
+ caseInfo,
|
|
|
+ caseSceneList,
|
|
|
+ // 场景与融合分页列表接口
|
|
|
+ getSceneList,
|
|
|
+ getMix3dList,
|
|
|
+ // 照片制卷列表接口
|
|
|
+ getFfmpegImage,
|
|
|
// 多元融合离线包相关接口
|
|
|
downloadOfflineFusion,
|
|
|
getOfflineFusionProcess,
|
|
|
} from "@/request";
|
|
|
import { uploadFile } from '@/store/system';
|
|
|
+import { isOfflineMode, getOfflineDataPath, fetchOfflineJson } from '@/util/offline';
|
|
|
|
|
|
-export const getRecordCaseVideo = async (props) => (await axios.get(recordCaseVideo, { params: { ...props, ingoreRes: true } })).data;
|
|
|
+export const getRecordCaseVideo = async (props) => {
|
|
|
+ if (isOfflineMode()) {
|
|
|
+ const base = getOfflineDataPath();
|
|
|
+ const caseId = props?.caseId ?? props?.id;
|
|
|
+ const candidates = [
|
|
|
+ `${base}/record/${caseId}.json`,
|
|
|
+ `${base}/record-case-${caseId}.json`,
|
|
|
+ `${base}/case-${caseId}-record.json`,
|
|
|
+ ];
|
|
|
+ try {
|
|
|
+ const data: any = await fetchOfflineJson<any>(candidates);
|
|
|
+ return Array.isArray(data) ? data : (data?.list ?? data?.data ?? []);
|
|
|
+ } catch (e) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return (await axios.get(recordCaseVideo, { params: { ...props, ingoreRes: true } })).data;
|
|
|
+};
|
|
|
|
|
|
-export const getFusionAndSceneList = async (props) => (await axios.get(getFusionAndScene, { params: props })).data;
|
|
|
+export const getFusionAndSceneList = async (props) => {
|
|
|
+ // 离线模式:优先从本地静态 JSON 读取
|
|
|
+ if (isOfflineMode()) {
|
|
|
+ const base = getOfflineDataPath();
|
|
|
+ const caseId = props?.caseId ?? props?.id;
|
|
|
+ const type = props?.type || 'scene';
|
|
|
+ const candidates = [
|
|
|
+ `${base}/case-${caseId}-${type}.json`,
|
|
|
+ `${base}/case-${caseId}.json`,
|
|
|
+ `${base}/${type}/${caseId}.json`,
|
|
|
+ ];
|
|
|
+ try {
|
|
|
+ const data: any = await fetchOfflineJson<any>(candidates);
|
|
|
+ if (Array.isArray(data)) return data;
|
|
|
+ if (data && Array.isArray(data[type])) return data[type];
|
|
|
+ if (data && Array.isArray(data.list)) return data.list;
|
|
|
+ if (data && Array.isArray(data.data)) return data.data;
|
|
|
+ return [];
|
|
|
+ } catch (e) {
|
|
|
+ // 未找到离线数据时返回空数组,避免页面阻塞
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 在线模式:走后端接口
|
|
|
+ return (await axios.get(getFusionAndScene, { params: props })).data;
|
|
|
+};
|
|
|
|
|
|
export const addMix3dFusionIds = async (props) => (await axios.post(addFusionIds, props)).data;
|
|
|
|
|
|
@@ -91,6 +146,86 @@ export const updateRecordInfo = async (props: {
|
|
|
// 获取全部文件类型
|
|
|
export const caseFilesTypeGetTree = async (caseId: number) => (await axios.get(caseFilesTypeGetByTree, { params: { caseId, ingoreRes: true } })).data;
|
|
|
|
|
|
+// =============== 其他资料 & 勘验:列表接口(离线支持) ===============
|
|
|
+export const getCaseFileTypesOffline = async (): Promise<any[]> => {
|
|
|
+ if (isOfflineMode()) {
|
|
|
+ const base = getOfflineDataPath();
|
|
|
+ const candidates = [
|
|
|
+ `${base}/case-file-types.json`,
|
|
|
+ `${base}/files/types.json`,
|
|
|
+ ];
|
|
|
+ try {
|
|
|
+ const data: any = await fetchOfflineJson<any>(candidates);
|
|
|
+ return Array.isArray(data) ? data : (data?.list ?? data?.data ?? []);
|
|
|
+ } catch (e) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return (await axios.get(caseFileTypes)).data as any[];
|
|
|
+};
|
|
|
+
|
|
|
+export const getCaseFilesOffline = async (props: { caseId: number; filesTypeId?: number; }): Promise<any[]> => {
|
|
|
+ if (isOfflineMode()) {
|
|
|
+ const base = getOfflineDataPath();
|
|
|
+ const caseId = props?.caseId;
|
|
|
+ const typeId = props?.filesTypeId ?? 'all';
|
|
|
+ const candidates = [
|
|
|
+ `${base}/case-files/${caseId}-${typeId}.json`,
|
|
|
+ `${base}/case-${caseId}-files-${typeId}.json`,
|
|
|
+ `${base}/files/${caseId}/${typeId}.json`,
|
|
|
+ ];
|
|
|
+ try {
|
|
|
+ const data: any = await fetchOfflineJson<any>(candidates);
|
|
|
+ return Array.isArray(data) ? data : (data?.list ?? data?.data ?? []);
|
|
|
+ } catch (e) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return (await axios.get(caseFiles, { params: props })).data as any[];
|
|
|
+};
|
|
|
+
|
|
|
+// =============== 基础信息:案件信息(离线支持) ===============
|
|
|
+export const getCaseInfoOffline = async (caseId: number): Promise<any> => {
|
|
|
+ if (isOfflineMode()) {
|
|
|
+ const base = getOfflineDataPath();
|
|
|
+ const candidates = [
|
|
|
+ `${base}/case-info/${caseId}.json`,
|
|
|
+ `${base}/case-${caseId}-info.json`,
|
|
|
+ `${base}/case/${caseId}.json`,
|
|
|
+ ];
|
|
|
+ try {
|
|
|
+ const data: any = await fetchOfflineJson<any>(candidates);
|
|
|
+ if (data && typeof data === 'object') {
|
|
|
+ if (data.caseId) return data;
|
|
|
+ return data.info ?? data.data ?? data.detail ?? data.value ?? data;
|
|
|
+ }
|
|
|
+ return {};
|
|
|
+ } catch (e) {
|
|
|
+ return {};
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return (await axios.get(caseInfo, { params: { caseId } })).data;
|
|
|
+};
|
|
|
+
|
|
|
+// =============== 场景:案件场景列表(离线支持) ===============
|
|
|
+export const getCaseSceneListOffline = async (caseId: number): Promise<any[]> => {
|
|
|
+ if (isOfflineMode()) {
|
|
|
+ const base = getOfflineDataPath();
|
|
|
+ const candidates = [
|
|
|
+ `${base}/case-scene-list/${caseId}.json`,
|
|
|
+ `${base}/case-${caseId}-scene-list.json`,
|
|
|
+ `${base}/scene/case-${caseId}.json`,
|
|
|
+ ];
|
|
|
+ try {
|
|
|
+ const data: any = await fetchOfflineJson<any>(candidates);
|
|
|
+ return Array.isArray(data) ? data : (data?.list ?? data?.data ?? []);
|
|
|
+ } catch (e) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return (await axios.get(caseSceneList, { params: { caseId } })).data;
|
|
|
+};
|
|
|
+
|
|
|
// =============== 多元融合离线包下载 =================
|
|
|
// 触发生成/下载任务(POST,请求参数:fusionId)
|
|
|
export const startOfflineFusionDownload = async (fusionId: number | string) =>
|
|
|
@@ -103,3 +238,77 @@ export const getOfflineFusionDownloadProcess = async (fusionId: number | string)
|
|
|
// 进度完成后拉取文件(GET,返回 Blob)
|
|
|
export const fetchOfflineFusionBlob = async (fusionId: number | string) =>
|
|
|
(await axios.get<Blob>(downloadOfflineFusion, { params: { fusionId, ingoreRes: true }, responseType: 'blob' })).data;
|
|
|
+
|
|
|
+// =============== 场景/融合分页列表(离线支持) ===============
|
|
|
+type ScenePaggingParams = {
|
|
|
+ pageNum: number;
|
|
|
+ pageSize: number;
|
|
|
+ sceneName?: string;
|
|
|
+ status?: number;
|
|
|
+ caseId?: number;
|
|
|
+ deptId?: string;
|
|
|
+ snCode?: string;
|
|
|
+ cameraType?: string;
|
|
|
+ searchType?: any;
|
|
|
+ isObj?: number;
|
|
|
+ fusionTitle?: any;
|
|
|
+};
|
|
|
+
|
|
|
+export const getScenePaggingOffline = async (params: ScenePaggingParams): Promise<PaggingRes<any>> => {
|
|
|
+ if (isOfflineMode()) {
|
|
|
+ const base = getOfflineDataPath();
|
|
|
+ const candidates = [
|
|
|
+ `${base}/scene-pagging.json`,
|
|
|
+ `${base}/scene/pagging.json`,
|
|
|
+ `${base}/scene-list.json`,
|
|
|
+ ];
|
|
|
+ try {
|
|
|
+ const data: any = await fetchOfflineJson<any>(candidates);
|
|
|
+ const list = Array.isArray(data) ? data : (data?.list ?? data?.data ?? []);
|
|
|
+ const total = typeof data?.total === 'number' ? data.total : list.length;
|
|
|
+ return { list, total } as PaggingRes<any>;
|
|
|
+ } catch (e) {
|
|
|
+ return { list: [], total: 0 } as PaggingRes<any>;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return (await axios.get(getSceneList, { params })).data as PaggingRes<any>;
|
|
|
+};
|
|
|
+
|
|
|
+export const getMix3dPaggingOffline = async (params: ScenePaggingParams): Promise<PaggingRes<any>> => {
|
|
|
+ if (isOfflineMode()) {
|
|
|
+ const base = getOfflineDataPath();
|
|
|
+ const candidates = [
|
|
|
+ `${base}/mix3d-pagging.json`,
|
|
|
+ `${base}/fusion/pagging.json`,
|
|
|
+ `${base}/fusion-list.json`,
|
|
|
+ ];
|
|
|
+ try {
|
|
|
+ const data: any = await fetchOfflineJson<any>(candidates);
|
|
|
+ const list = Array.isArray(data) ? data : (data?.list ?? data?.data ?? []);
|
|
|
+ const total = typeof data?.total === 'number' ? data.total : list.length;
|
|
|
+ return { list, total } as PaggingRes<any>;
|
|
|
+ } catch (e) {
|
|
|
+ return { list: [], total: 0 } as PaggingRes<any>;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return (await axios.get(getMix3dList, { params })).data as PaggingRes<any>;
|
|
|
+};
|
|
|
+
|
|
|
+// =============== 现场勘验:照片制卷列表(离线支持) ===============
|
|
|
+export const getFfmpegImageListOffline = async (caseId: number): Promise<any[]> => {
|
|
|
+ if (isOfflineMode()) {
|
|
|
+ const base = getOfflineDataPath();
|
|
|
+ const candidates = [
|
|
|
+ `${base}/photos/${caseId}.json`,
|
|
|
+ `${base}/ffmpeg-images-${caseId}.json`,
|
|
|
+ `${base}/case-${caseId}-photos.json`,
|
|
|
+ ];
|
|
|
+ try {
|
|
|
+ const data: any = await fetchOfflineJson<any>(candidates);
|
|
|
+ return Array.isArray(data) ? data : (data?.list ?? data?.data ?? []);
|
|
|
+ } catch (e) {
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return (await axios.get(getFfmpegImage, { params: { caseId } })).data as any[];
|
|
|
+};
|