feat(P25-2/P25-3/P26-2/P28-1/P24-2/P29-3): 落地内部OA够用版前端入口与运营页面

关联 Issue: P25-2, P25-3, P25-4, P26-2, P26-4, P28-1, P28-2, P28-3, P28-4, P24-2, P29-3
这个提交包含在:
2026-03-21 18:03:48 +08:00
父节点 e39e41287e
当前提交 9905c1c79d
共修改 44 个文件,包含 2029 行新增和 169 行删除
+73 -6
查看文件
@@ -1,5 +1,6 @@
import { Suspense, type ReactNode } from "react";
import { Navigate, Route, Routes } from "react-router-dom";
import { RoutePageFallback } from "../components/common/RoutePageFallback";
import { AppShellLayout } from "../layouts/AppShellLayout";
import { AuthLayout } from "../layouts/AuthLayout";
import { BudgetsPage } from "../pages/BudgetsPage";
@@ -9,11 +10,12 @@ import { ForbiddenPage } from "../pages/ForbiddenPage";
import { LoginPage } from "../pages/LoginPage";
import { NotFoundPage } from "../pages/NotFoundPage";
import { ProfilePage } from "../pages/ProfilePage";
import { RoutePageFallback } from "../components/common/RoutePageFallback";
import {
ApOperationsPage,
ApprovalRulesPage,
AssetRegistryPage,
AuditLogsPage,
CutoverConsolePage,
DelegationsPage,
DepartmentsPage,
ErpIntegrationPage,
@@ -27,11 +29,15 @@ import {
MobileCapturePage,
NotificationChannelsPage,
NotificationsPage,
PaymentBatchesPage,
PortalAnnouncementsPage,
PortalHomePage,
PurchaseRequestsPage,
ReimbursementDetailPage,
ReimbursementsPage,
TravelRequestsPage,
UserManagementPage,
WorkflowDefinitionsPage,
WorkflowTaskDetailPage,
WorkflowTasksPage,
} from "./lazy";
@@ -74,7 +80,8 @@ export function AppRouter() {
</RequireAuth>
}
>
<Route index element={<Navigate to="/dashboard" replace />} />
<Route index element={<Navigate to="/portal" replace />} />
<Route path="portal" element={withRouteFallback(<PortalHomePage />)} />
<Route path="dashboard" element={<DashboardPage />} />
<Route
@@ -116,7 +123,9 @@ export function AppRouter() {
<Route
path="purchase-requests"
element={
<RequirePermission anyOf={["procurement.create", "procurement.view_own", "procurement.view_all", "procurement.manage"]}>
<RequirePermission
anyOf={["procurement.create", "procurement.view_own", "procurement.view_all", "procurement.manage"]}
>
{withRouteFallback(<PurchaseRequestsPage />)}
</RequirePermission>
}
@@ -125,16 +134,45 @@ export function AppRouter() {
<Route
path="travel-requests"
element={
<RequirePermission anyOf={["travel.create", "travel.view_own", "travel.view_all", "travel.manage", "travel.payment.manage", "integration.manage"]}>
<RequirePermission
anyOf={[
"travel.create",
"travel.view_own",
"travel.view_all",
"travel.manage",
"travel.payment.manage",
"integration.manage",
]}
>
{withRouteFallback(<TravelRequestsPage />)}
</RequirePermission>
}
/>
<Route
path="payment-batches"
element={
<RequirePermission anyOf={["payment.batch.manage", "risk.review.manage"]}>
{withRouteFallback(<PaymentBatchesPage />)}
</RequirePermission>
}
/>
<Route
path="ap-operations"
element={
<RequirePermission anyOf={["payment.batch.manage", "risk.review.manage"]}>
{withRouteFallback(<ApOperationsPage />)}
</RequirePermission>
}
/>
<Route
path="assets"
element={
<RequirePermission anyOf={["asset.view_own", "asset.view_all", "asset.manage", "asset.transfer", "asset.inventory"]}>
<RequirePermission
anyOf={["asset.view_own", "asset.view_all", "asset.manage", "asset.transfer", "asset.inventory"]}
>
{withRouteFallback(<AssetRegistryPage />)}
</RequirePermission>
}
@@ -188,7 +226,9 @@ export function AppRouter() {
<Route
path="mobile/assets/scan"
element={
<RequirePermission anyOf={["asset.view_own", "asset.view_all", "asset.manage", "asset.transfer", "asset.inventory"]}>
<RequirePermission
anyOf={["asset.view_own", "asset.view_all", "asset.manage", "asset.transfer", "asset.inventory"]}
>
{withRouteFallback(<MobileAssetScanPage />)}
</RequirePermission>
}
@@ -286,6 +326,33 @@ export function AppRouter() {
}
/>
<Route
path="system/announcements"
element={
<RequirePermission anyOf={["system.settings"]}>
{withRouteFallback(<PortalAnnouncementsPage />)}
</RequirePermission>
}
/>
<Route
path="system/workflow-definitions"
element={
<RequirePermission anyOf={["system.settings"]}>
{withRouteFallback(<WorkflowDefinitionsPage />)}
</RequirePermission>
}
/>
<Route
path="system/cutover"
element={
<RequirePermission anyOf={["system.settings"]}>
{withRouteFallback(<CutoverConsolePage />)}
</RequirePermission>
}
/>
<Route path="settings/profile" element={<ProfilePage />} />
</Route>
@@ -0,0 +1 @@
export { ApOperationsPage as default } from "../../pages/ApOperationsPage";
@@ -0,0 +1 @@
export { CutoverConsolePage as default } from "../../pages/CutoverConsolePage";
@@ -0,0 +1 @@
export { PaymentBatchesPage as default } from "../../pages/PaymentBatchesPage";
@@ -0,0 +1 @@
export { PortalAnnouncementsPage as default } from "../../pages/PortalAnnouncementsPage";
+1
查看文件
@@ -0,0 +1 @@
export { PortalHomePage as default } from "../../pages/PortalHomePage";
@@ -0,0 +1 @@
export { WorkflowDefinitionsPage as default } from "../../pages/WorkflowDefinitionsPage";
+6
查看文件
@@ -1,8 +1,10 @@
import { lazy } from "react";
export const ApOperationsPage = lazy(() => import("./ApOperationsPage"));
export const AuditLogsPage = lazy(() => import("./AuditLogsPage"));
export const ApprovalRulesPage = lazy(() => import("./ApprovalRulesPage"));
export const AssetRegistryPage = lazy(() => import("./AssetRegistryPage"));
export const CutoverConsolePage = lazy(() => import("./CutoverConsolePage"));
export const DelegationsPage = lazy(() => import("./DelegationsPage"));
export const DepartmentsPage = lazy(() => import("./DepartmentsPage"));
export const ErpIntegrationPage = lazy(() => import("./ErpIntegrationPage"));
@@ -16,10 +18,14 @@ export const MobileAssetScanPage = lazy(() => import("./MobileAssetScanPage"));
export const MobileCapturePage = lazy(() => import("./MobileCapturePage"));
export const NotificationChannelsPage = lazy(() => import("./NotificationChannelsPage"));
export const NotificationsPage = lazy(() => import("./NotificationsPage"));
export const PaymentBatchesPage = lazy(() => import("./PaymentBatchesPage"));
export const PortalAnnouncementsPage = lazy(() => import("./PortalAnnouncementsPage"));
export const PortalHomePage = lazy(() => import("./PortalHomePage"));
export const PurchaseRequestsPage = lazy(() => import("./PurchaseRequestsPage"));
export const ReimbursementDetailPage = lazy(() => import("./ReimbursementDetailPage"));
export const ReimbursementsPage = lazy(() => import("./ReimbursementsPage"));
export const TravelRequestsPage = lazy(() => import("./TravelRequestsPage"));
export const UserManagementPage = lazy(() => import("./UserManagementPage"));
export const WorkflowDefinitionsPage = lazy(() => import("./WorkflowDefinitionsPage"));
export const WorkflowTaskDetailPage = lazy(() => import("./WorkflowTaskDetailPage"));
export const WorkflowTasksPage = lazy(() => import("./WorkflowTasksPage"));