feat(task): 任务详情(cop-task-detail)登录深链增加本地假数据开关

- 新增 VITE_MOCK_COP_TASK_DETAIL 开关(默认 false 走真实接口;true 时该接口走本地假数据,
  供 consumer 外网不可达时调试),与 VITE_USE_REAL_DATA 独立
- utils/request.ts 按开关把 cop-task-detail 请求切到本地 mock adapter
- task-mock-data.ts 增加 cop-task-detail 假数据 + matcher/adapter
- 各 .env(development/network/production/sit) + .env.example 补充该开关说明

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
董宏凯andClaude Opus 4.8 committed 2026-06-16 20:57:21 +08:00
1 parent b380575f16
commit d5d0494928
7 files changed
+128 -1

No files matched your search

+3
View File
@@ -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
+5
View File
@@ -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
+3
View File
@@ -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
+3
View File
@@ -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
+3
View File
@@ -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
@@ -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, unknown> }): 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<string, unknown>;
}): Promise<{ data: unknown; status: number; statusText: string; headers: Record<string, unknown>; 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;
+15 -1
View File
@@ -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) {