Add aftersales work order frontend pages

- Public scan-to-confirm page (/aftersales/:sn) with phone last-4 verification
- Admin list + detail pages with state machine, QR generation, reassign, force-close
- PublicLayout extracted from PublicQuery so both pages share logo + 备案 chrome
- PublicQuery auto-redirects scanned zjbf-sh-* serials to the aftersales page
- AdminLayout: new 售后工单 menu entry

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Frudrax Cheng
2026-05-26 10:51:25 +08:00
parent 11f3eda668
commit 6fef517556
12 changed files with 1505 additions and 51 deletions
+8 -6
View File
@@ -7,6 +7,9 @@ import DashboardPage from './pages/Dashboard';
import ManagePage from './pages/Manage';
import ProfilePage from './pages/Profile';
import EmployeeSerialsPage from './pages/EmployeeSerials';
import AftersalesPage from './pages/Aftersales';
import AftersalesDetailPage from './pages/AftersalesDetail';
import AftersalesConfirmPage from './pages/AftersalesConfirm';
const PrivateRoute = () => {
const user = authApi.getCurrentUser();
@@ -25,11 +28,7 @@ const PublicRoute = ({ children }: { children: React.ReactNode }) => {
};
const AdminRoutes = () => {
return (
<AdminLayout>
<Outlet />
</AdminLayout>
);
return <AdminLayout />;
};
function App() {
@@ -43,13 +42,16 @@ function App() {
</PublicRoute>
} />
<Route path="/query" element={<PublicQueryPage />} />
<Route path="/aftersales/:serialNumber" element={<AftersalesConfirmPage />} />
<Route element={<PrivateRoute />}>
<Route element={<AdminRoutes />}>
<Route path="/admin" element={<Navigate to="dashboard" replace />} />
<Route path="/admin/dashboard" element={<DashboardPage />} />
<Route path="/admin/manage" element={<ManagePage />} />
<Route path="/admin/employee-serials" element={<EmployeeSerialsPage />} />
<Route path="/admin/aftersales" element={<AftersalesPage />} />
<Route path="/admin/aftersales/:serialNumber" element={<AftersalesDetailPage />} />
<Route path="/admin/profile" element={<ProfilePage />} />
</Route>
</Route>