announcement_model.dart 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. class AnnouncementModel {
  2. final String id;
  3. final String title;
  4. final String content;
  5. final String contentType;
  6. final String type; // notice / policy / activity
  7. final String status; // draft, published
  8. final String publisherId;
  9. final String publisherName;
  10. final DateTime publishTime;
  11. final bool isTop;
  12. final int privateLevel; // 0=全员, 1=按部门, 2=按指定用户
  13. final List<String> targetDepts;
  14. final List<String> targetUsers;
  15. final DateTime? expiryDate;
  16. final List<String> attachments;
  17. final int readCount;
  18. final int unreadCount;
  19. final bool isRead;
  20. final DateTime createTime;
  21. final DateTime? updateTime;
  22. const AnnouncementModel({
  23. required this.id,
  24. required this.title,
  25. required this.content,
  26. this.contentType = 'text',
  27. this.type = 'notice',
  28. this.status = 'published',
  29. required this.publisherId,
  30. this.publisherName = '',
  31. required this.publishTime,
  32. this.isTop = false,
  33. this.privateLevel = 0,
  34. this.targetDepts = const [],
  35. this.targetUsers = const [],
  36. this.expiryDate,
  37. this.attachments = const [],
  38. this.readCount = 0,
  39. this.unreadCount = 0,
  40. this.isRead = false,
  41. required this.createTime,
  42. this.updateTime,
  43. });
  44. bool get isExpired {
  45. if (expiryDate == null) return false;
  46. return DateTime.now().isAfter(expiryDate!);
  47. }
  48. String get typeLabel {
  49. switch (type) {
  50. case 'notice':
  51. return '通知公告';
  52. case 'policy':
  53. return '人事与制度';
  54. case 'activity':
  55. return '放假与活动';
  56. default:
  57. return type;
  58. }
  59. }
  60. bool get isDraft => status == 'draft';
  61. factory AnnouncementModel.fromJson(Map<String, dynamic> json) {
  62. return AnnouncementModel(
  63. id: json['id'] as String,
  64. title: json['title'] as String,
  65. content: json['content'] as String? ?? '',
  66. contentType: json['contentType'] as String? ?? 'text',
  67. type: json['type'] as String? ?? 'notice',
  68. status: json['status'] as String? ?? 'published',
  69. publisherId: json['publisherId'] as String? ?? '',
  70. publisherName: json['publisherName'] as String? ?? '',
  71. publishTime: DateTime.parse(json['publishTime'] as String),
  72. isTop: json['isTop'] as bool? ?? false,
  73. privateLevel: json['privateLevel'] as int? ?? 0,
  74. targetDepts: (json['targetDepts'] as List<dynamic>?)
  75. ?.map((e) => e as String)
  76. .toList() ??
  77. [],
  78. targetUsers: (json['targetUsers'] as List<dynamic>?)
  79. ?.map((e) => e as String)
  80. .toList() ??
  81. [],
  82. expiryDate: json['expiryDate'] != null
  83. ? DateTime.parse(json['expiryDate'] as String)
  84. : null,
  85. attachments: (json['attachments'] as List<dynamic>?)
  86. ?.map((e) => e as String)
  87. .toList() ??
  88. [],
  89. readCount: json['readCount'] as int? ?? 0,
  90. unreadCount: json['unreadCount'] as int? ?? 0,
  91. isRead: json['isRead'] as bool? ?? false,
  92. createTime: DateTime.parse(json['createTime'] as String),
  93. updateTime: json['updateTime'] != null
  94. ? DateTime.parse(json['updateTime'] as String)
  95. : null,
  96. );
  97. }
  98. }