138 lines
3.9 KiB
Go
138 lines
3.9 KiB
Go
package entities
|
||
|
||
import (
|
||
"time"
|
||
|
||
"github.com/google/uuid"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// AnnouncementStatus 公告状态枚举
|
||
type AnnouncementStatus string
|
||
|
||
const (
|
||
AnnouncementStatusDraft AnnouncementStatus = "draft" // 草稿
|
||
AnnouncementStatusPublished AnnouncementStatus = "published" // 已发布
|
||
AnnouncementStatusArchived AnnouncementStatus = "archived" // 已归档
|
||
)
|
||
|
||
// Announcement 公告聚合根
|
||
// 用于对系统公告进行管理,支持发布、撤回、定时发布等功能
|
||
type Announcement struct {
|
||
// 基础标识
|
||
ID string `gorm:"primaryKey;type:varchar(36)" json:"id" comment:"公告唯一标识"`
|
||
Title string `gorm:"type:varchar(200);not null;index" json:"title" comment:"公告标题"`
|
||
Content string `gorm:"type:text;not null" json:"content" comment:"公告内容"`
|
||
Status AnnouncementStatus `gorm:"type:varchar(20);not null;default:'draft';index" json:"status" comment:"公告状态"`
|
||
ScheduledAt *time.Time `gorm:"index" json:"scheduled_at" comment:"定时发布时间"`
|
||
CreatedAt time.Time `gorm:"autoCreateTime;index" json:"created_at" comment:"创建时间"`
|
||
UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at" comment:"更新时间"`
|
||
DeletedAt gorm.DeletedAt `gorm:"index" json:"-" comment:"软删除时间"`
|
||
}
|
||
|
||
// TableName 指定表名
|
||
func (Announcement) TableName() string {
|
||
return "announcements"
|
||
}
|
||
|
||
// BeforeCreate GORM钩子:创建前自动生成UUID
|
||
func (a *Announcement) BeforeCreate(tx *gorm.DB) error {
|
||
if a.ID == "" {
|
||
a.ID = uuid.New().String()
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// 实现 Entity 接口 - 提供统一的实体管理接口
|
||
// GetID 获取实体唯一标识
|
||
func (a *Announcement) GetID() string {
|
||
return a.ID
|
||
}
|
||
|
||
// GetCreatedAt 获取创建时间
|
||
func (a *Announcement) GetCreatedAt() time.Time {
|
||
return a.CreatedAt
|
||
}
|
||
|
||
// GetUpdatedAt 获取更新时间
|
||
func (a *Announcement) GetUpdatedAt() time.Time {
|
||
return a.UpdatedAt
|
||
}
|
||
|
||
// 验证公告信息
|
||
func (a *Announcement) Validate() error {
|
||
if a.Title == "" {
|
||
return NewValidationError("公告标题不能为空")
|
||
}
|
||
if a.Content == "" {
|
||
return NewValidationError("公告内容不能为空")
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// 发布公告
|
||
func (a *Announcement) Publish() error {
|
||
if a.Status == AnnouncementStatusPublished {
|
||
return NewValidationError("公告已经是发布状态")
|
||
}
|
||
a.Status = AnnouncementStatusPublished
|
||
now := time.Now()
|
||
a.CreatedAt = now
|
||
|
||
return nil
|
||
}
|
||
|
||
// 撤回公告
|
||
func (a *Announcement) Withdraw() error {
|
||
if a.Status == AnnouncementStatusDraft {
|
||
return NewValidationError("公告已经是草稿状态")
|
||
}
|
||
a.Status = AnnouncementStatusDraft
|
||
now := time.Now()
|
||
a.CreatedAt = now
|
||
|
||
return nil
|
||
}
|
||
|
||
// 定时发布公告
|
||
func (a *Announcement) SchedulePublish(scheduledTime time.Time) error {
|
||
if a.Status == AnnouncementStatusPublished {
|
||
return NewValidationError("公告已经是发布状态")
|
||
}
|
||
a.Status = AnnouncementStatusDraft // 保持草稿状态,等待定时发布
|
||
a.ScheduledAt = &scheduledTime
|
||
|
||
return nil
|
||
}
|
||
|
||
// 更新定时发布时间
|
||
func (a *Announcement) UpdateSchedulePublish(scheduledTime time.Time) error {
|
||
if a.Status == AnnouncementStatusPublished {
|
||
return NewValidationError("公告已经是发布状态")
|
||
}
|
||
if scheduledTime.Before(time.Now()) {
|
||
return NewValidationError("定时发布时间不能早于当前时间")
|
||
}
|
||
a.ScheduledAt = &scheduledTime
|
||
return nil
|
||
}
|
||
|
||
// CancelSchedulePublish 取消定时发布
|
||
func (a *Announcement) CancelSchedulePublish() error {
|
||
if a.Status == AnnouncementStatusPublished {
|
||
return NewValidationError("公告已经是发布状态")
|
||
}
|
||
a.ScheduledAt = nil
|
||
return nil
|
||
}
|
||
|
||
// IsScheduled 判断是否已设置定时发布
|
||
func (a *Announcement) IsScheduled() bool {
|
||
return a.ScheduledAt != nil && a.Status == AnnouncementStatusDraft
|
||
}
|
||
|
||
// GetScheduledTime 获取定时发布时间
|
||
func (a *Announcement) GetScheduledTime() *time.Time {
|
||
return a.ScheduledAt
|
||
}
|