package dto import ( "errors" "strings" "time" "quyun/v2/app/requests" "quyun/v2/database/models" "quyun/v2/pkg/consts" ) type TenantFilter struct { // Pagination page/limit. requests.Pagination `json:",inline" query:",inline"` // SortQueryFilter defines asc/desc ordering. requests.SortQueryFilter `json:",inline" query:",inline"` Name *string `json:"name,omitempty" query:"name"` Code *string `json:"code,omitempty" query:"code"` ID *int64 `json:"id,omitempty" query:"id"` UserID *int64 `json:"user_id,omitempty" query:"user_id"` Status *consts.TenantStatus `json:"status,omitempty" query:"status"` ExpiredAtFrom *time.Time `json:"expired_at_from,omitempty" query:"expired_at_from"` ExpiredAtTo *time.Time `json:"expired_at_to,omitempty" query:"expired_at_to"` CreatedAtFrom *time.Time `json:"created_at_from,omitempty" query:"created_at_from"` CreatedAtTo *time.Time `json:"created_at_to,omitempty" query:"created_at_to"` } func (f *TenantFilter) NameTrimmed() string { if f == nil || f.Name == nil { return "" } return strings.TrimSpace(*f.Name) } func (f *TenantFilter) CodeTrimmed() string { if f == nil || f.Code == nil { return "" } return strings.ToLower(strings.TrimSpace(*f.Code)) } type TenantItem struct { *models.Tenant UserCount int64 `json:"user_count"` // IncomeAmountPaidSum 累计收入金额(单位:分,CNY):按 orders 聚合得到的已支付净收入(不含退款中/已退款订单)。 IncomeAmountPaidSum int64 `json:"income_amount_paid_sum"` StatusDescription string `json:"status_description"` Owner *TenantOwnerUserLite `json:"owner,omitempty"` AdminUsers []*TenantAdminUserLite `json:"admin_users,omitempty"` } type TenantOwnerUserLite struct { ID int64 `json:"id"` Username string `json:"username"` } type TenantAdminUserLite struct { ID int64 `json:"id"` Username string `json:"username"` } type TenantCreateForm struct { Code string `json:"code" validate:"required,max=64"` Name string `json:"name" validate:"required,max=128"` AdminUserID int64 `json:"admin_user_id" validate:"required,gt=0"` // Duration 租户有效期(天),从“创建时刻”起算;与续期接口保持一致。 Duration int `json:"duration" validate:"required,oneof=7 30 90 180 365"` } type TenantExpireUpdateForm struct { Duration int `json:"duration" validate:"required,oneof=7 30 90 180 365"` } // Duration func (form *TenantExpireUpdateForm) ParseDuration() (time.Duration, error) { duration := time.Duration(form.Duration) * 24 * time.Hour if duration == 0 { return 0, errors.New("invalid parsed duration") } return duration, nil } type TenantStatusUpdateForm struct { Status consts.TenantStatus `json:"status" validate:"required,oneof=normal disabled"` }