diff --git a/frontend-web/.env.development b/frontend-web/.env.development index 5ea0eb44..22563825 100644 --- a/frontend-web/.env.development +++ b/frontend-web/.env.development @@ -4,6 +4,9 @@ # 任务看板数据源:true=真实接口(默认);改成 false 可让任务分析/三情分析两页走本地假数据。 VITE_USE_REAL_DATA=true +# 任务详情(登录深链 cop-task-detail)数据源:默认真实接口;改成 true 走本地假数据(consumer 外网不可达时调试用)。 +VITE_MOCK_COP_TASK_DETAIL=false + # Gateway / DeerFlow API VITE_BACKEND_BASE_URL=http://127.0.0.1:8001 VITE_LANGGRAPH_BASE_URL=http://127.0.0.1:8001/api diff --git a/frontend-web/.env.example b/frontend-web/.env.example index e254e6c8..1b3d80bb 100644 --- a/frontend-web/.env.example +++ b/frontend-web/.env.example @@ -33,6 +33,11 @@ # 仅本机 .env 默认 false(假数据)。改后需重启 dev / 重新打包生效。 # VITE_USE_REAL_DATA=true +# --- 任务详情(登录深链 cop-task-detail)数据源开关 --- +# 默认真实接口(未设/false);改成 true 时该接口走本地假数据(consumer 外网不可达时调试用)。 +# 与 VITE_USE_REAL_DATA 独立。改后需重启 dev / 重新打包生效。 +# VITE_MOCK_COP_TASK_DETAIL=false + # MaxKey 鉴权根地址(无界 onlineTicket 换 token) # VITE_AUTH_BASE_URL=https://auth.y.sit.4.cn # VITE_AIPI_CONSUMER_URL=https://ch1.b.uat.4.cn/consumer diff --git a/frontend-web/.env.network b/frontend-web/.env.network index 569b8422..471b6289 100644 --- a/frontend-web/.env.network +++ b/frontend-web/.env.network @@ -4,6 +4,9 @@ # 任务看板数据源:true=真实接口(默认);改成 false 可让任务分析/三情分析两页走本地假数据。 VITE_USE_REAL_DATA=true +# 任务详情(登录深链 cop-task-detail)数据源:默认真实接口;改成 true 走本地假数据(调试用)。 +VITE_MOCK_COP_TASK_DETAIL=false + # Gateway / DeerFlow API VITE_BACKEND_BASE_URL=http://47.88.25.99:7001 VITE_LANGGRAPH_BASE_URL=http://47.88.25.99:7001/api diff --git a/frontend-web/.env.production b/frontend-web/.env.production index 08bf2a70..97415742 100644 --- a/frontend-web/.env.production +++ b/frontend-web/.env.production @@ -4,6 +4,9 @@ # 任务看板数据源:true=真实接口(默认);改成 false 可让任务分析/三情分析两页走本地假数据。 VITE_USE_REAL_DATA=true +# 任务详情(登录深链 cop-task-detail)数据源:默认真实接口;改成 true 走本地假数据(调试用)。 +VITE_MOCK_COP_TASK_DETAIL=false + # Gateway / DeerFlow API VITE_BACKEND_BASE_URL=https://ch1.b.uat.4.cn/deerflow VITE_LANGGRAPH_BASE_URL=https://ch1.b.uat.4.cn/deerflow/api diff --git a/frontend-web/.env.sit b/frontend-web/.env.sit index d4a4af7b..91ba650f 100644 --- a/frontend-web/.env.sit +++ b/frontend-web/.env.sit @@ -4,6 +4,9 @@ # 任务看板数据源:true=真实接口(默认);改成 false 可让任务分析/三情分析两页走本地假数据。 VITE_USE_REAL_DATA=true +# 任务详情(登录深链 cop-task-detail)数据源:默认真实接口;改成 true 走本地假数据(调试用)。 +VITE_MOCK_COP_TASK_DETAIL=false + # Gateway / DeerFlow API VITE_BACKEND_BASE_URL=https://ch1.b.sit.4.cn/deerflow VITE_LANGGRAPH_BASE_URL=https://ch1.b.sit.4.cn/deerflow/api diff --git a/frontend-web/src/strategy-components/components/task-components/task-mock-data.ts b/frontend-web/src/strategy-components/components/task-components/task-mock-data.ts index dfad039b..9f6c5fc7 100644 --- a/frontend-web/src/strategy-components/components/task-components/task-mock-data.ts +++ b/frontend-web/src/strategy-components/components/task-components/task-mock-data.ts @@ -399,6 +399,102 @@ const MOCK_ROUTES: Array<{ match: string; dataset: MockDataset }> = [ { match: '/task/cop-tasks', dataset: 'task' }, ]; +// ───────────── 任务详情假数据(cop-task-detail,给登录任务深链用) ───────────── +// +// consumer 接口 `{VITE_AIPI_CONSUMER_URL}/taskAnalysSearch/cop-task-detail` 外网可能不可达, +// 可用假数据模拟登录深链(?taskId=&goPath=)效果。返回结构与真实接口一致: +// `{ code, message, data: { id, overview, taskDirection, taskName, taskContent } }` +// +// 启停由 `VITE_MOCK_COP_TASK_DETAIL` 控制(默认真实数据,=true 时走假数据), +// 见 `utils/request.ts` 的请求拦截器。 + +/** cop-task-detail 命中路径。 */ +const COP_TASK_DETAIL_ROUTE = '/taskAnalysSearch/cop-task-detail'; + +interface CopTaskDetailSeed { + taskName: string; + taskContent: string; + overview: string; + taskDirection: string; +} + +/** 任务详情假数据池(按 taskId 取模选一条,让不同 taskId 呈现不同任务)。 */ +const COP_TASK_DETAIL_SEEDS: CopTaskDetailSeed[] = [ + { + taskName: '暑期文旅消费季舆情倾向分析', + taskContent: + '围绕"暑期文旅消费季"全网讨论,分析公众情绪走向、核心关切与潜在争议点,识别需重点引导的群体,并给出传播策略建议。', + overview: '暑期文旅消费季相关讨论的情绪与倾向分析。', + taskDirection: '王磊', + }, + { + taskName: '居民阶梯电价调整公众情绪研判', + taskContent: + '针对居民阶梯电价调整方案,梳理公众主要担忧(用电成本、公平性),判断情绪峰值节点与高敏群体,形成分群体沟通要点。', + overview: '阶梯电价调整的公众情绪研判。', + taskDirection: '李婷', + }, + { + taskName: '城市更新片区舆论引导任务', + taskContent: + '对老城区改造涉及的拆迁、安置等敏感议题进行情绪与诉求拆解,识别居民、商户等不同立场,制定差异化回应策略。', + overview: '城市更新片区敏感议题的舆论引导分析。', + taskDirection: '张伟', + }, +]; + +/** 从 taskId 反推一个稳定下标(同一 taskId 每次返回同一条)。 */ +function pickSeedIndex(taskId: string): number { + const digits = (taskId.match(/\d+/g) ?? []).join(''); + const n = digits ? Number(digits.slice(-6)) : 0; + return Number.isFinite(n) ? n % COP_TASK_DETAIL_SEEDS.length : 0; +} + +/** 模拟 cop-task-detail 的 body。 */ +function buildCopTaskDetailBody(taskId: string) { + const seed = COP_TASK_DETAIL_SEEDS[pickSeedIndex(taskId)]; + return { + code: 0, + message: 'ok', + data: { + id: taskId, + overview: seed.overview, + taskDirection: seed.taskDirection, + taskName: seed.taskName, + taskContent: seed.taskContent, + }, + }; +} + +/** 判断某请求 url 是否是 cop-task-detail。 */ +export function matchCopTaskDetailMock(url?: string): boolean { + return !!url && url.includes(COP_TASK_DETAIL_ROUTE); +} + +/** 从 axios config 取 taskId(优先 params,其次 url query)。 */ +function readTaskIdFromConfig(config: { url?: string; params?: Record }): string { + const fromParams = config.params?.taskId; + if (fromParams != null && fromParams !== '') return String(fromParams); + if (config.url) { + const m = config.url.match(/[?&]taskId=([^&]+)/); + if (m) return decodeURIComponent(m[1]); + } + return ''; +} + +/** 临时假数据 axios adapter:命中 cop-task-detail 时直接返回 mock body,不发真实请求。 */ +export function copTaskDetailMockAdapter(config: { + url?: string; + params?: Record; +}): Promise<{ data: unknown; status: number; statusText: string; headers: Record; config: unknown }> { + const body = buildCopTaskDetailBody(readTaskIdFromConfig(config)); + return new Promise((resolve) => { + setTimeout(() => { + resolve({ data: body, status: 200, statusText: 'OK', headers: {}, config }); + }, 200); + }); +} + /** 判断某个请求 url 是否应走假数据。 */ export function matchTaskBoardMock(url?: string): MockDataset | null { if (!url) return null; diff --git a/frontend-web/src/utils/request.ts b/frontend-web/src/utils/request.ts index 6666aa95..9162dae1 100644 --- a/frontend-web/src/utils/request.ts +++ b/frontend-web/src/utils/request.ts @@ -1,5 +1,10 @@ import axios from 'axios' -import { matchTaskBoardMock, taskBoardMockAdapter } from '@/strategy-components/components/task-components/task-mock-data' +import { + matchTaskBoardMock, + taskBoardMockAdapter, + matchCopTaskDetailMock, + copTaskDetailMockAdapter, +} from '@/strategy-components/components/task-components/task-mock-data' // 任务看板(任务分析 / 三情分析)数据源开关: // VITE_USE_REAL_DATA=true → 走真实接口;其它(含未设置)→ 这两个接口走本地假数据。 @@ -7,6 +12,11 @@ import { matchTaskBoardMock, taskBoardMockAdapter } from '@/strategy-components/ // 仅本机 .env 默认 false(假数据)。改 env 后需重启 dev server 生效。 const USE_REAL_DATA = import.meta.env.VITE_USE_REAL_DATA === 'true' +// 任务详情(cop-task-detail,登录深链用)数据源开关: +// 默认真实数据;仅当 VITE_MOCK_COP_TASK_DETAIL=true 时走本地假数据(consumer 外网不可达时调试用)。 +// 与 USE_REAL_DATA 独立。改 env 后需重启 dev server 生效。 +const MOCK_COP_TASK_DETAIL = import.meta.env.VITE_MOCK_COP_TASK_DETAIL === 'true' + // axios.interceptors const service = axios.create({ // baseURL: '', // url = base url + request url @@ -43,6 +53,10 @@ service.interceptors.request.use( if (!USE_REAL_DATA && matchTaskBoardMock(config.url)) { config.adapter = taskBoardMockAdapter as any; } + // 任务详情(登录深链):默认真实接口;仅 VITE_MOCK_COP_TASK_DETAIL=true 时走本地假数据。 + if (MOCK_COP_TASK_DETAIL && matchCopTaskDetailMock(config.url)) { + config.adapter = copTaskDetailMockAdapter as any; + } // let token: any = localStorage.getItem('token'); config.headers['Authorization'] = `Bearer admin`; // if (token) {