Adds a canvas-based SignaturePad component used on the customer
confirm page. Authorize now requires a non-empty signature; reject
opens a required reason modal. The archived signature is shown to
the customer after confirming and on the admin detail page.
Also fixes the confirm page being clipped at the top when its
content exceeds the viewport: the public layout used
height:100vh + overflow:hidden which cropped the centered card.
Switched to min-height:100vh so tall content can scroll naturally.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Adds a second row of cards (total / pending / closed / rejected)
- New "最近售后工单" table linking to detail pages
- DashboardStats type extended; dashboardApi maps backend overview
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- New /admin/users page (admin only) for creating technicians,
editing role/email, resetting passwords, deleting users
- AftersalesDetail reassign modal now uses a searchable Select
populated from /api/users/assignable instead of raw user ID input
- Menu entry only shown to admins
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- 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>