home_controller.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import 'package:flutter_riverpod/flutter_riverpod.dart';
  2. import '../../core/auth/role_provider.dart';
  3. /// 系统 Banner 模型
  4. class SysBanner {
  5. final String id;
  6. final String imageUrl;
  7. final String? linkUrl;
  8. final String? title;
  9. const SysBanner({
  10. required this.id,
  11. required this.imageUrl,
  12. this.linkUrl,
  13. this.title,
  14. });
  15. static const mockBanners = [
  16. SysBanner(id: '1', imageUrl: 'assets/img/banner_1.png', title: 'OA系统升级通知'),
  17. SysBanner(
  18. id: '2',
  19. imageUrl: 'assets/img/banner_2.png',
  20. linkUrl: 'https://example.com',
  21. title: '2026年度预算管理',
  22. ),
  23. SysBanner(id: '3', imageUrl: 'assets/img/banner_3.png', title: '端午节放假安排'),
  24. ];
  25. }
  26. /// 工作台首页聚合数据模型
  27. ///
  28. /// 角色权限优先级:admin > finance > manager > employee
  29. /// 数据全部使用 mock,角色从权限派生。
  30. class HomeSummary {
  31. /// 用户角色:admin / finance / manager / employee
  32. final String userRole;
  33. // ── 员工版:个人快捷看板 ──
  34. final double monthlyReimbursement; // 本月累计报销(本人已付款总额 ¥)
  35. final int monthlySubmittedCount; // 本月已提单据(本人提交总数 笔)
  36. // ── 经理版:待审批 + 部门范围 ──
  37. final int pendingApprovalCount; // 待审批数(红色角标)
  38. final double deptMonthlyReimbursement; // 部门本月累计报销
  39. final int deptMonthlySubmittedCount; // 部门本月已提单据
  40. final int deptPendingDocuments; // 部门在途单据
  41. // ── 财务/管理员版 ──
  42. final double paidTotal; // 本月已支付总额
  43. final double pendingPaymentTotal; // 待付款总额
  44. final double abnormalReturns; // 本周异常退回
  45. const HomeSummary({
  46. this.userRole = 'employee',
  47. this.monthlyReimbursement = 0,
  48. this.monthlySubmittedCount = 0,
  49. this.pendingApprovalCount = 0,
  50. this.deptMonthlyReimbursement = 0,
  51. this.deptMonthlySubmittedCount = 0,
  52. this.deptPendingDocuments = 0,
  53. this.paidTotal = 0,
  54. this.pendingPaymentTotal = 0,
  55. this.abnormalReturns = 0,
  56. });
  57. }
  58. /// Banner Provider — 返回模拟 Banner 列表
  59. final bannerProvider = Provider<List<SysBanner>>((ref) {
  60. return SysBanner.mockBanners;
  61. });
  62. /// 首页数据 Provider — 返回模拟 HomeSummary
  63. ///
  64. /// 修改 userRole 可测试不同角色视图:
  65. /// 'employee' → 员工版
  66. /// 'manager' → 经理版
  67. /// 'finance' → 财务版
  68. /// 'admin' → 管理员版
  69. final homeSummaryProvider = FutureProvider<HomeSummary>((ref) async {
  70. final role = ref.watch(currentRoleProvider);
  71. return HomeSummary(
  72. userRole: role,
  73. // 员工版数据
  74. monthlyReimbursement: 12800.50,
  75. monthlySubmittedCount: 8,
  76. // 经理版数据
  77. pendingApprovalCount: 5,
  78. deptMonthlyReimbursement: 156800.00,
  79. deptMonthlySubmittedCount: 42,
  80. deptPendingDocuments: 15,
  81. // 财务/管理员版数据
  82. paidTotal: 896500.00,
  83. pendingPaymentTotal: 283200.50,
  84. abnormalReturns: 12800.00,
  85. );
  86. });