Files
AIclinicalresearch/frontend-v2/src/App.tsx
HaHafeng 71d32d11ee feat(iit): V3.2 data consistency + project isolation + admin config redesign + Chinese labels
Summary:
- Refactor timeline API to read from qc_field_status (SSOT) instead of qc_logs
- Add field-issues paginated API with severity/dimension/recordId filters
- Add LEFT JOIN field_metadata + qc_event_status for Chinese display names
- Implement per-project ChatOrchestrator cache and SessionMemory isolation
- Redesign admin IIT config tabs (REDCap -> Fields -> KB -> Rules -> Members)
- Add AI-powered QC rule generation (D3 programmatic + D1/D5/D6 LLM-based)
- Add clickable warning/critical detail Modal in ReportsPage
- Auto-dispatch eQuery after batch QC via DailyQcOrchestrator
- Update module status documentation to v3.2

Backend changes:
- iitQcCockpitController: rewrite getTimeline from qc_field_status, add getFieldIssues
- iitQcCockpitRoutes: add field-issues route
- ChatOrchestrator: per-projectId cached instances
- SessionMemory: keyed by userId::projectId
- WechatCallbackController: resolve projectId from iitUserMapping
- iitRuleSuggestionService: dimension-based suggest + generateD3Rules
- iitBatchController: call DailyQcOrchestrator after batch QC

Frontend changes:
- AiStreamPage: adapt to new timeline structure with dimension tags
- ReportsPage: clickable stats cards with issue detail Modal
- IitProjectDetailPage: reorder tabs, add AI rule generation UI
- iitProjectApi: add TimelineIssue, FieldIssueItem types and APIs

Status: TypeScript compilation verified, no new lint errors
Made-with: Cursor
2026-03-02 14:29:59 +08:00

162 lines
7.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'
import { ConfigProvider } from 'antd'
import zhCN from 'antd/locale/zh_CN'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { AuthProvider } from './framework/auth'
import { PermissionProvider } from './framework/permission'
import { RouteGuard } from './framework/router'
import MainLayout from './framework/layout/MainLayout'
import AdminLayout from './framework/layout/AdminLayout'
import OrgLayout from './framework/layout/OrgLayout'
import LoginPage from './pages/LoginPage'
import AdminDashboard from './pages/admin/AdminDashboard'
import OrgDashboard from './pages/org/OrgDashboard'
import PromptListPage from './pages/admin/PromptListPage'
import PromptEditorPage from './pages/admin/PromptEditorPage'
import TenantListPage from './pages/admin/tenants/TenantListPage'
import TenantDetailPage from './pages/admin/tenants/TenantDetailPage'
import { MODULES } from './framework/modules/moduleRegistry'
// 用户管理页面
import UserListPage from './modules/admin/pages/UserListPage'
import UserFormPage from './modules/admin/pages/UserFormPage'
import UserDetailPage from './modules/admin/pages/UserDetailPage'
// 系统知识库管理
import SystemKbListPage from './modules/admin/pages/SystemKbListPage'
import SystemKbDetailPage from './modules/admin/pages/SystemKbDetailPage'
// IIT 项目管理(运营团队使用)
import IitProjectListPage from './modules/admin/pages/IitProjectListPage'
import IitProjectDetailPage from './modules/admin/pages/IitProjectDetailPage'
import IitQcCockpitPage from './modules/admin/pages/IitQcCockpitPage'
import IitMemberManagePage from './modules/admin/pages/IitMemberManagePage'
// 运营日志
import ActivityLogsPage from './pages/admin/ActivityLogsPage'
// 个人中心页面
import ProfilePage from './pages/user/ProfilePage'
/**
* 应用根组件
*
* @description
* - ConfigProvider: Ant Design国际化配置
* - QueryClientProvider: React Query状态管理
* - AuthProvider: JWT认证管理 🆕
* - PermissionProvider: 权限管理系统
* - RouteGuard: 路由守卫保护
* - BrowserRouter: 前端路由
*
* 路由结构:
* - /login - 通用登录页(个人用户)
* - /t/{tenantCode}/login - 租户专属登录页
* - / - 首页(需要认证)
* - /{module}/* - 业务模块(需要认证+权限)
*/
// 创建React Query客户端
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 1000 * 60 * 5, // 5分钟
gcTime: 1000 * 60 * 10, // 10分钟
retry: 1,
refetchOnWindowFocus: false,
},
},
})
function App() {
return (
<ConfigProvider locale={zhCN}>
<QueryClientProvider client={queryClient}>
{/* 认证提供者JWT Token管理 */}
<AuthProvider>
{/* 权限提供者:模块级权限管理 */}
<PermissionProvider>
<BrowserRouter>
<Routes>
{/* 登录页面(无需认证) */}
<Route path="/login" element={<LoginPage />} />
<Route path="/t/:tenantCode/login" element={<LoginPage />} />
{/* 业务应用端 /app/* */}
<Route path="/" element={<MainLayout />}>
{/* 首页重定向到 AI 问答 */}
<Route index element={<Navigate to="/ai-qa" replace />} />
{/* 动态加载模块路由 - 基于模块权限系统 ⭐ 2026-01-16 */}
{MODULES.filter(m => !m.isExternal).map(module => (
<Route
key={module.id}
path={`${module.path}/*`}
element={
module.isLegacyEmbed ? (
<module.component />
) : (
<RouteGuard
requiredModule={module.moduleCode}
moduleName={module.name}
>
<module.component />
</RouteGuard>
)
}
/>
))}
{/* 个人中心路由 - 2026-01-28 新增 */}
<Route path="/user/profile" element={<ProfilePage />} />
<Route path="/user/settings" element={<ProfilePage />} />
</Route>
{/* 运营管理端 /admin/* */}
<Route path="/admin" element={<AdminLayout />}>
<Route index element={<Navigate to="/admin/dashboard" replace />} />
<Route path="dashboard" element={<AdminDashboard />} />
{/* Prompt 管理 */}
<Route path="prompts" element={<PromptListPage />} />
<Route path="prompts/:code" element={<PromptEditorPage />} />
{/* 租户管理 */}
<Route path="tenants" element={<TenantListPage />} />
<Route path="tenants/:id" element={<TenantDetailPage />} />
{/* 用户管理 */}
<Route path="users" element={<UserListPage />} />
<Route path="users/create" element={<UserFormPage mode="create" />} />
<Route path="users/:id" element={<UserDetailPage />} />
<Route path="users/:id/edit" element={<UserFormPage mode="edit" />} />
{/* 系统知识库 */}
<Route path="system-kb" element={<SystemKbListPage />} />
<Route path="system-kb/:id" element={<SystemKbDetailPage />} />
{/* IIT 项目管理(运营团队配置) */}
<Route path="iit-projects" element={<IitProjectListPage />} />
<Route path="iit-projects/:id" element={<IitProjectDetailPage />} />
<Route path="iit-projects/:id/cockpit" element={<IitQcCockpitPage />} />
{/* IIT 项目人员管理 */}
<Route path="iit-members" element={<IitMemberManagePage />} />
{/* 运营日志 */}
<Route path="activity-logs" element={<ActivityLogsPage />} />
{/* 系统配置 */}
<Route path="system" element={<div className="text-center py-20">🚧 ...</div>} />
</Route>
{/* 机构管理端 /org/* */}
<Route path="/org" element={<OrgLayout />}>
<Route index element={<Navigate to="/org/dashboard" replace />} />
<Route path="dashboard" element={<OrgDashboard />} />
<Route path="users" element={<div className="text-center py-20">🚧 ...</div>} />
<Route path="departments" element={<div className="text-center py-20">🚧 /...</div>} />
<Route path="usage" element={<div className="text-center py-20">🚧 使...</div>} />
<Route path="audit" element={<div className="text-center py-20">🚧 ...</div>} />
</Route>
{/* 404重定向 */}
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
</BrowserRouter>
</PermissionProvider>
</AuthProvider>
</QueryClientProvider>
</ConfigProvider>
)
}
export default App