From dc74a618f75e1fae164f65f83652770c4a249b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=84=A6=E9=BE=99=E8=A8=80?= Date: Thu, 18 Jun 2026 14:26:14 +0800 Subject: [PATCH] feat: add realtime attendance and monthly payroll menus --- financial_system/core/permissions.py | 27 ++++++++++- frontend/src/components/SidebarNav.vue | 4 ++ frontend/src/router/index.ts | 20 ++++++++ frontend/src/views/MonthlyPayrollView.vue | 48 +++++++++++++++++++ frontend/src/views/RealtimeAttendanceView.vue | 38 +++++++++++++++ 5 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 frontend/src/views/MonthlyPayrollView.vue create mode 100644 frontend/src/views/RealtimeAttendanceView.vue diff --git a/financial_system/core/permissions.py b/financial_system/core/permissions.py index 5d527b8..f3c389c 100644 --- a/financial_system/core/permissions.py +++ b/financial_system/core/permissions.py @@ -12,6 +12,12 @@ PERMISSION_PAYROLL_EXCEL_CALCULATE = "payroll:excel:calculate" PERMISSION_PAYROLL_DINGTALK_CALCULATE = "payroll:dingtalk:calculate" PERMISSION_PAYROLL_JOB_VIEW = "payroll:job:view" PERMISSION_PAYROLL_FILE_DOWNLOAD = "payroll:file:download" +PERMISSION_ATTENDANCE_REALTIME_VIEW = "attendance:realtime:view" +PERMISSION_ATTENDANCE_REALTIME_SYNC = "attendance:realtime:sync" +PERMISSION_MONTHLY_PAYROLL_VIEW = "monthly_payroll:view" +PERMISSION_MONTHLY_PAYROLL_CALCULATE = "monthly_payroll:calculate" +PERMISSION_MONTHLY_PAYROLL_LOCK = "monthly_payroll:lock" +PERMISSION_MONTHLY_PAYROLL_EXPORT = "monthly_payroll:export" PERMISSION_USER_CREATE = "user:create" PERMISSION_USER_LIST = "user:list" PERMISSION_OPERATION_LOG_VIEW = "operation_log:view" @@ -38,6 +44,8 @@ class MenuPermission: MENUS = { + "attendance_realtime": MenuPermission(code="attendance_realtime", name="实时考勤", path="/attendance/realtime"), + "monthly_payroll": MenuPermission(code="monthly_payroll", name="月度核算", path="/payroll/monthly"), "payroll": MenuPermission(code="payroll", name="工资计算", path="/payroll"), "jobs": MenuPermission(code="jobs", name="计算记录", path="/payroll/jobs"), "employees": MenuPermission(code="employees", name="员工维护", path="/system/employees"), @@ -52,6 +60,8 @@ MENUS = { ROLE_MENU_CODES = { ROLE_SUPERUSER: ( + "attendance_realtime", + "monthly_payroll", "payroll", "jobs", "employees", @@ -64,6 +74,8 @@ ROLE_MENU_CODES = { "operation_logs", ), ROLE_MANAGER: ( + "attendance_realtime", + "monthly_payroll", "payroll", "jobs", "employees", @@ -74,11 +86,17 @@ ROLE_MENU_CODES = { "configs", "operation_logs", ), - ROLE_VIEWER: ("jobs", "reports"), + ROLE_VIEWER: ("attendance_realtime", "jobs", "reports"), } ROLE_OPERATION_PERMISSIONS = { ROLE_SUPERUSER: ( + PERMISSION_ATTENDANCE_REALTIME_VIEW, + PERMISSION_ATTENDANCE_REALTIME_SYNC, + PERMISSION_MONTHLY_PAYROLL_VIEW, + PERMISSION_MONTHLY_PAYROLL_CALCULATE, + PERMISSION_MONTHLY_PAYROLL_LOCK, + PERMISSION_MONTHLY_PAYROLL_EXPORT, PERMISSION_PAYROLL_EXCEL_CALCULATE, PERMISSION_PAYROLL_DINGTALK_CALCULATE, PERMISSION_PAYROLL_JOB_VIEW, @@ -99,6 +117,12 @@ ROLE_OPERATION_PERMISSIONS = { PERMISSION_REPORT_VIEW, ), ROLE_MANAGER: ( + PERMISSION_ATTENDANCE_REALTIME_VIEW, + PERMISSION_ATTENDANCE_REALTIME_SYNC, + PERMISSION_MONTHLY_PAYROLL_VIEW, + PERMISSION_MONTHLY_PAYROLL_CALCULATE, + PERMISSION_MONTHLY_PAYROLL_LOCK, + PERMISSION_MONTHLY_PAYROLL_EXPORT, PERMISSION_PAYROLL_EXCEL_CALCULATE, PERMISSION_PAYROLL_DINGTALK_CALCULATE, PERMISSION_PAYROLL_JOB_VIEW, @@ -117,6 +141,7 @@ ROLE_OPERATION_PERMISSIONS = { PERMISSION_REPORT_VIEW, ), ROLE_VIEWER: ( + PERMISSION_ATTENDANCE_REALTIME_VIEW, PERMISSION_PAYROLL_JOB_VIEW, PERMISSION_PAYROLL_FILE_DOWNLOAD, PERMISSION_REPORT_VIEW, diff --git a/frontend/src/components/SidebarNav.vue b/frontend/src/components/SidebarNav.vue index 6f3cc68..615806a 100644 --- a/frontend/src/components/SidebarNav.vue +++ b/frontend/src/components/SidebarNav.vue @@ -3,6 +3,8 @@ import { Banknote, BadgeDollarSign, Building2, + Calculator, + CalendarClock, ClipboardList, FileChartColumn, LayoutDashboard, @@ -35,6 +37,8 @@ const auth = useAuthStore(); const router = useRouter(); const backendIconMap = { + attendance_realtime: CalendarClock, + monthly_payroll: Calculator, payroll: Banknote, jobs: ClipboardList, employees: UserCog, diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index df270a5..0a4f414 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -8,9 +8,11 @@ import DashboardView from "../views/DashboardView.vue"; import EmployeesView from "../views/EmployeesView.vue"; import JobsView from "../views/JobsView.vue"; import LoginView from "../views/LoginView.vue"; +import MonthlyPayrollView from "../views/MonthlyPayrollView.vue"; import OperationLogsView from "../views/OperationLogsView.vue"; import OrganizationView from "../views/OrganizationView.vue"; import PayrollView from "../views/PayrollView.vue"; +import RealtimeAttendanceView from "../views/RealtimeAttendanceView.vue"; import ReportsView from "../views/ReportsView.vue"; import SalaryProfilesView from "../views/SalaryProfilesView.vue"; import UsersView from "../views/UsersView.vue"; @@ -44,6 +46,18 @@ const router = createRouter({ name: "dashboard", component: DashboardView, }, + { + path: "attendance/realtime", + name: "attendance-realtime", + component: RealtimeAttendanceView, + meta: { permission: "attendance:realtime:view" }, + }, + { + path: "payroll/monthly", + name: "monthly-payroll", + component: MonthlyPayrollView, + meta: { permission: "monthly_payroll:view" }, + }, { path: "payroll", name: "payroll", @@ -137,6 +151,12 @@ router.beforeEach(async (to) => { }); function firstAllowedPath(permissions: string[]): string { + if (permissions.includes("attendance:realtime:view")) { + return "/attendance/realtime"; + } + if (permissions.includes("monthly_payroll:view")) { + return "/payroll/monthly"; + } if (permissions.includes("payroll:excel:calculate")) { return "/payroll"; } diff --git a/frontend/src/views/MonthlyPayrollView.vue b/frontend/src/views/MonthlyPayrollView.vue new file mode 100644 index 0000000..db8cd81 --- /dev/null +++ b/frontend/src/views/MonthlyPayrollView.vue @@ -0,0 +1,48 @@ + + + diff --git a/frontend/src/views/RealtimeAttendanceView.vue b/frontend/src/views/RealtimeAttendanceView.vue new file mode 100644 index 0000000..2e58295 --- /dev/null +++ b/frontend/src/views/RealtimeAttendanceView.vue @@ -0,0 +1,38 @@ + + +