- 数据库与后端:announcements 表增加 is_popup 字段及迁移脚本,提供前台弹窗接口与多公告优先级选取,补全选优单测 - 管理后台:总后台与分销后台公告编辑新增「弹窗公告」开关与列表标签展示 - 前台交互:前台 PC/移动端首页引入 AnnouncementPopup,支持同一用户同一天同一公告仅弹一次的关闭记录 - 视觉优化:重构弹窗结构,顶栏镶嵌品牌橙流光细条与浅暖橙通知徽标,中间内嵌浅灰舒适阅读卡片,底部搭配大锤橙实心主操作按钮 - 验证方式:后端 announcement 单测通过,前端 npm run build 编译无报错,浏览器实机截图验证
663 lines
28 KiB
Go
663 lines
28 KiB
Go
package distribution
|
|
|
|
import "time"
|
|
|
|
type SiteDTO struct {
|
|
ID uint64 `json:"id"`
|
|
SiteCode string `json:"site_code"`
|
|
SiteName string `json:"site_name"`
|
|
Domain string `json:"domain"`
|
|
Status string `json:"status"`
|
|
DisplayAccountEnabled bool `json:"display_account_enabled"`
|
|
LogoURL string `json:"logo_url"`
|
|
FaviconURL string `json:"favicon_url"`
|
|
BannersJSON string `json:"banners_json"`
|
|
AnnouncementsJSON string `json:"announcements_json"`
|
|
FooterInfoJSON string `json:"footer_info_json"`
|
|
AWRecycleJSON string `json:"aw_recycle_json"`
|
|
CooperationFeedbackJSON string `json:"cooperation_feedback_json"`
|
|
StorefrontTextJSON string `json:"storefront_text_json"`
|
|
AnnouncementMode string `json:"announcement_mode"`
|
|
DefaultSupportGroupID *uint64 `json:"default_support_group_id,omitempty"`
|
|
ListingQrcodeURL string `json:"listing_qrcode_url"`
|
|
ReceiveRatioDelta float64 `json:"receive_ratio_delta"`
|
|
ReceiveCostDelta float64 `json:"receive_cost_delta"`
|
|
TaxEnabled bool `json:"tax_enabled"`
|
|
TaxRateBPS int64 `json:"tax_rate_bps"`
|
|
SettlementHoldDays int `json:"settlement_hold_days"`
|
|
AdminUserID *uint64 `json:"admin_user_id,omitempty"`
|
|
AdminUsername string `json:"admin_username,omitempty"`
|
|
AdminNickname string `json:"admin_nickname,omitempty"`
|
|
MemberType string `json:"member_type,omitempty"`
|
|
UserCount int64 `json:"user_count"`
|
|
OrderUserCount int64 `json:"order_user_count"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type ResetSiteAdminPasswordRequest struct {
|
|
NewPassword string `json:"new_password" binding:"required,min=6"`
|
|
}
|
|
|
|
type CreateSiteRequest struct {
|
|
SiteCode string `json:"site_code" binding:"required,max=64"`
|
|
SiteName string `json:"site_name" binding:"required,max=128"`
|
|
Domain string `json:"domain" binding:"required,max=255"`
|
|
DisplayAccountEnabled *bool `json:"display_account_enabled"`
|
|
DefaultSupportGroupID *uint64 `json:"default_support_group_id"`
|
|
ListingQrcodeURL *string `json:"listing_qrcode_url"`
|
|
ReceiveRatioDelta *float64 `json:"receive_ratio_delta"`
|
|
ReceiveCostDelta *float64 `json:"receive_cost_delta"`
|
|
TaxEnabled *bool `json:"tax_enabled"`
|
|
TaxRateBPS *int64 `json:"tax_rate_bps"`
|
|
SettlementHoldDays *int `json:"settlement_hold_days"`
|
|
}
|
|
|
|
type UpdateSiteRequest struct {
|
|
SiteName *string `json:"site_name"`
|
|
Domain *string `json:"domain"`
|
|
Status *string `json:"status"`
|
|
DisplayAccountEnabled *bool `json:"display_account_enabled"`
|
|
DefaultSupportGroupID *uint64 `json:"default_support_group_id"`
|
|
ListingQrcodeURL *string `json:"listing_qrcode_url"`
|
|
ReceiveRatioDelta *float64 `json:"receive_ratio_delta"`
|
|
ReceiveCostDelta *float64 `json:"receive_cost_delta"`
|
|
TaxEnabled *bool `json:"tax_enabled"`
|
|
TaxRateBPS *int64 `json:"tax_rate_bps"`
|
|
SettlementHoldDays *int `json:"settlement_hold_days"`
|
|
LogoURL *string `json:"logo_url"`
|
|
FaviconURL *string `json:"favicon_url"`
|
|
BannersJSON *string `json:"banners_json"`
|
|
AnnouncementsJSON *string `json:"announcements_json"`
|
|
FooterInfoJSON *string `json:"footer_info_json"`
|
|
}
|
|
|
|
type RuleDTO struct {
|
|
ID uint64 `json:"id"`
|
|
SiteID *uint64 `json:"site_id,omitempty"`
|
|
Mode string `json:"mode"`
|
|
Version int `json:"version"`
|
|
Status string `json:"status"`
|
|
PlatformReceiveRatio float64 `json:"platform_receive_ratio"`
|
|
PlatformSellRatio float64 `json:"platform_sell_ratio"`
|
|
DistributorReceiveRatio float64 `json:"distributor_receive_ratio"`
|
|
DistributorSellRatio float64 `json:"distributor_sell_ratio"`
|
|
DistributorARatio float64 `json:"distributor_a_ratio"`
|
|
DistributorBRatio float64 `json:"distributor_b_ratio"`
|
|
ServiceFeeValue float64 `json:"service_fee_value"`
|
|
ServiceFeeUnit string `json:"service_fee_unit"`
|
|
PaymentFeeBPS int64 `json:"payment_fee_bps"`
|
|
TaxEnabled bool `json:"tax_enabled"`
|
|
TaxRateBPS int64 `json:"tax_rate_bps"`
|
|
EffectiveFrom time.Time `json:"effective_from"`
|
|
EffectiveTo *time.Time `json:"effective_to,omitempty"`
|
|
CreatedBy *uint64 `json:"created_by,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
type CreateRuleRequest struct {
|
|
SiteID *uint64 `json:"site_id"`
|
|
Mode string `json:"mode" binding:"required"`
|
|
PlatformReceiveRatio float64 `json:"platform_receive_ratio"`
|
|
PlatformSellRatio float64 `json:"platform_sell_ratio"`
|
|
DistributorReceiveRatio float64 `json:"distributor_receive_ratio"`
|
|
DistributorSellRatio float64 `json:"distributor_sell_ratio"`
|
|
DistributorARatio float64 `json:"distributor_a_ratio"`
|
|
DistributorBRatio float64 `json:"distributor_b_ratio"`
|
|
ServiceFeeValue float64 `json:"service_fee_value"`
|
|
ServiceFeeUnit string `json:"service_fee_unit" binding:"required"`
|
|
PaymentFeeBPS int64 `json:"payment_fee_bps"`
|
|
TaxEnabled bool `json:"tax_enabled"`
|
|
TaxRateBPS int64 `json:"tax_rate_bps"`
|
|
EffectiveFrom time.Time `json:"effective_from"`
|
|
}
|
|
|
|
type UpdateRuleStatusRequest struct {
|
|
Status string `json:"status" binding:"required,oneof=draft active disabled"`
|
|
}
|
|
|
|
type DistributionOrderDTO struct {
|
|
OrderID uint64 `json:"order_id"`
|
|
OrderNo string `json:"order_no"`
|
|
SiteID uint64 `json:"site_id"`
|
|
ListingID uint64 `json:"listing_id"`
|
|
AccountID uint64 `json:"account_id"`
|
|
OwnerID uint64 `json:"owner_id"`
|
|
RenterID uint64 `json:"renter_id"`
|
|
Status string `json:"status"`
|
|
HandoffStatus string `json:"handoff_status"`
|
|
RefundStatus string `json:"refund_status"`
|
|
SettlementStatus string `json:"settlement_status"`
|
|
|
|
// 分销快照释放状态:pending=待释放,settled=已释放入账;release_at 为预计释放时间。
|
|
DistributorSettlementStatus string `json:"distributor_settlement_status"`
|
|
ReleaseAt *time.Time `json:"release_at,omitempty"`
|
|
|
|
DistributionMode string `json:"distribution_mode"`
|
|
GrossPaidAmountCent int64 `json:"gross_paid_amount_cent"`
|
|
RefundAmountCent int64 `json:"refund_amount_cent"`
|
|
NetPaidAmountCent int64 `json:"net_paid_amount_cent"`
|
|
PaymentFeeCent int64 `json:"payment_fee_cent"`
|
|
ServiceFeeCent int64 `json:"service_fee_cent"`
|
|
MarkupAmountCent int64 `json:"markup_amount_cent"`
|
|
TaxAmountCent int64 `json:"tax_amount_cent"`
|
|
SplitBaseAmountCent int64 `json:"split_base_amount_cent"`
|
|
RoundingAdjustmentCent int64 `json:"rounding_adjustment_cent"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
|
|
// 关联业务与分销商收益透传字段
|
|
ListingNo string `json:"listing_no,omitempty"`
|
|
Title string `json:"title,omitempty"`
|
|
GameName string `json:"game_name,omitempty"`
|
|
ServerRegion string `json:"server_region,omitempty"`
|
|
LoginPlatform string `json:"login_platform,omitempty"`
|
|
RentDurationHours int `json:"rent_duration_hours,omitempty"`
|
|
RentedAt *time.Time `json:"rented_at,omitempty"`
|
|
RenterPhone string `json:"renter_phone,omitempty"`
|
|
RenterNickname string `json:"renter_nickname,omitempty"`
|
|
OwnerRentAmountCent int64 `json:"owner_rent_amount_cent,omitempty"`
|
|
BasePriceCent int64 `json:"base_price_cent,omitempty"`
|
|
ShelfMarkupCent int64 `json:"shelf_markup_cent,omitempty"`
|
|
DepositAmountCent int64 `json:"deposit_amount_cent,omitempty"`
|
|
|
|
// 当前分销商在该订单中的收益拆解
|
|
DistributorEarningCent int64 `json:"distributor_earning_cent"`
|
|
DistributorRole string `json:"distributor_role,omitempty"`
|
|
DistributorMarkupCent int64 `json:"distributor_markup_cent"`
|
|
DistributorSplitCent int64 `json:"distributor_split_cent"`
|
|
}
|
|
|
|
type DistributionOrderListQuery struct {
|
|
SiteID uint64
|
|
Kind string
|
|
Role string
|
|
Status string
|
|
Mode string
|
|
FinancialStatus string
|
|
Keyword string
|
|
Page int
|
|
Size int
|
|
}
|
|
|
|
type DistributionOrderPage struct {
|
|
Items []DistributionOrderDTO `json:"items"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"page_size"`
|
|
}
|
|
|
|
type AccountDisplayDTO struct {
|
|
ID uint64 `json:"id"`
|
|
SiteID uint64 `json:"site_id"`
|
|
AccountID uint64 `json:"account_id"`
|
|
ListingID uint64 `json:"listing_id"`
|
|
DisplayStatus string `json:"display_status"`
|
|
MarkupAmountCent int64 `json:"markup_amount_cent"`
|
|
ShelfRatioDelta float64 `json:"shelf_ratio_delta"`
|
|
BaseRatio float64 `json:"base_ratio,omitempty"`
|
|
SiteRatio float64 `json:"site_ratio,omitempty"`
|
|
ListingNo string `json:"listing_no,omitempty"`
|
|
Title string `json:"title,omitempty"`
|
|
GameName string `json:"game_name,omitempty"`
|
|
ServerRegion string `json:"server_region,omitempty"`
|
|
LoginPlatform string `json:"login_platform,omitempty"`
|
|
RankLevel string `json:"rank_level,omitempty"`
|
|
HafCoinAmount int64 `json:"haf_coin_amount,omitempty"`
|
|
PriceCent int64 `json:"price_cent,omitempty"`
|
|
SitePriceCent int64 `json:"site_price_cent,omitempty"`
|
|
DepositAmountCent int64 `json:"deposit_amount_cent,omitempty"`
|
|
ListingStatus string `json:"listing_status,omitempty"`
|
|
InTransaction bool `json:"in_transaction,omitempty"`
|
|
ListingSiteID *uint64 `json:"listing_site_id,omitempty"`
|
|
SourceChannel string `json:"source_channel,omitempty"`
|
|
}
|
|
|
|
type SyncSiteAccountsRequest struct {
|
|
ListingIDs []uint64 `json:"listing_ids"`
|
|
CleanStaleListings bool `json:"clean_stale_listings"`
|
|
DefaultShelfRatioDelta float64 `json:"default_shelf_ratio_delta"`
|
|
}
|
|
|
|
type SyncSiteAccountsResult struct {
|
|
SyncedCount int64 `json:"synced_count"`
|
|
SkippedCount int64 `json:"skipped_count"`
|
|
UpdatedCount int64 `json:"updated_count"`
|
|
ReenabledCount int64 `json:"reenabled_count"`
|
|
DisabledStaleCount int64 `json:"disabled_stale_count"`
|
|
TotalActive int64 `json:"total_active"`
|
|
}
|
|
|
|
type PublicDistributionListingDTO struct {
|
|
ListingID uint64 `json:"listing_id"`
|
|
ListingNo string `json:"listing_no"`
|
|
AccountID uint64 `json:"account_id"`
|
|
Title string `json:"title"`
|
|
GameName string `json:"game_name"`
|
|
ServerRegion string `json:"server_region"`
|
|
LoginPlatform string `json:"login_platform"`
|
|
RankLevel string `json:"rank_level"`
|
|
HafCoinAmount int64 `json:"haf_coin_amount"`
|
|
PriceCent int64 `json:"price_cent"`
|
|
DepositAmountCent int64 `json:"deposit_amount_cent"`
|
|
MarkupAmountCent int64 `json:"markup_amount_cent"`
|
|
ShelfRatioDelta float64 `json:"shelf_ratio_delta"`
|
|
InTransaction bool `json:"in_transaction"`
|
|
SiteCode string `json:"site_code"`
|
|
SiteName string `json:"site_name"`
|
|
}
|
|
|
|
type PublicDistributionListingsResult struct {
|
|
Items []PublicDistributionListingDTO `json:"items"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"page_size"`
|
|
}
|
|
|
|
type PublicSiteInfoDTO struct {
|
|
SiteCode string `json:"site_code"`
|
|
SiteName string `json:"site_name"`
|
|
Domain string `json:"domain"`
|
|
Status string `json:"status"`
|
|
DisplayAccountEnabled bool `json:"display_account_enabled"`
|
|
LogoURL string `json:"logo_url"`
|
|
FaviconURL string `json:"favicon_url"`
|
|
BannersJSON string `json:"banners_json"`
|
|
AnnouncementsJSON string `json:"announcements_json"`
|
|
FooterInfoJSON string `json:"footer_info_json"`
|
|
StorefrontTextJSON string `json:"storefront_text_json"`
|
|
DefaultSupportGroupID *uint64 `json:"default_support_group_id,omitempty"`
|
|
ReceiveRatioDelta float64 `json:"receive_ratio_delta"`
|
|
ReceiveCostDelta float64 `json:"receive_cost_delta"`
|
|
}
|
|
|
|
type UpdateAccountDisplayRequest struct {
|
|
DisplayStatus string `json:"display_status" binding:"required,oneof=enabled disabled sold offline"`
|
|
}
|
|
|
|
type PaymentChannelDTO struct {
|
|
ID uint64 `json:"id"`
|
|
SiteID uint64 `json:"site_id"`
|
|
ConfigID uint64 `json:"config_id"`
|
|
Priority int `json:"priority"`
|
|
Status string `json:"status"`
|
|
}
|
|
|
|
type BindPaymentChannelRequest struct {
|
|
ConfigID uint64 `json:"config_id" binding:"required"`
|
|
Priority int `json:"priority"`
|
|
}
|
|
|
|
type SettlementBatchDTO struct {
|
|
ID uint64 `json:"id"`
|
|
SiteID uint64 `json:"site_id"`
|
|
BatchNo string `json:"batch_no"`
|
|
PeriodStart time.Time `json:"period_start"`
|
|
PeriodEnd time.Time `json:"period_end"`
|
|
TotalAmountCent int64 `json:"total_amount_cent"`
|
|
Status string `json:"status"`
|
|
}
|
|
|
|
type CreateSettlementBatchRequest struct {
|
|
SiteID uint64 `json:"site_id" binding:"required"`
|
|
PeriodStart time.Time `json:"period_start" binding:"required"`
|
|
PeriodEnd time.Time `json:"period_end" binding:"required"`
|
|
}
|
|
|
|
type SnapshotPartyRequest struct {
|
|
PartyRole string `json:"party_role" binding:"required"`
|
|
PartyType string `json:"party_type" binding:"required"`
|
|
PartyID uint64 `json:"party_id"`
|
|
Ratio float64 `json:"ratio"`
|
|
IncomeAmountCent int64 `json:"income_amount_cent"`
|
|
CostAmountCent int64 `json:"cost_amount_cent"`
|
|
}
|
|
|
|
type CreateFinancialSnapshotRequest struct {
|
|
SiteID uint64 `json:"site_id" binding:"required"`
|
|
RuleVersionID uint64 `json:"rule_version_id" binding:"required"`
|
|
GrossPaidAmountCent int64 `json:"gross_paid_amount_cent"`
|
|
RefundAmountCent int64 `json:"refund_amount_cent"`
|
|
MarkupAmountCent int64 `json:"markup_amount_cent"`
|
|
Parties []SnapshotPartyRequest `json:"parties"`
|
|
}
|
|
|
|
type SettlementItemDTO struct {
|
|
ID uint64 `json:"id"`
|
|
OrderID uint64 `json:"order_id"`
|
|
PartyRole string `json:"party_role"`
|
|
AmountCent int64 `json:"amount_cent"`
|
|
Status string `json:"status"`
|
|
}
|
|
|
|
type DistributionLoginRequest struct {
|
|
Username string `json:"username" binding:"required"`
|
|
Password string `json:"password" binding:"required"`
|
|
}
|
|
|
|
type DistributionLoginResponse struct {
|
|
Token string `json:"token"`
|
|
RefreshToken string `json:"refresh_token"`
|
|
Member DistributionCurrentMemberDTO `json:"member"`
|
|
}
|
|
|
|
type DistributionCurrentMemberDTO struct {
|
|
AdminID uint64 `json:"admin_id"`
|
|
Username string `json:"username"`
|
|
Nickname string `json:"nickname"`
|
|
IsSuperadmin bool `json:"is_superadmin"`
|
|
SiteID *uint64 `json:"site_id,omitempty"`
|
|
SiteCode string `json:"site_code,omitempty"`
|
|
SiteName string `json:"site_name,omitempty"`
|
|
Domain string `json:"domain,omitempty"`
|
|
MemberType string `json:"member_type,omitempty"`
|
|
}
|
|
|
|
type OnboardSiteRequest struct {
|
|
SiteCode string `json:"site_code" binding:"required,max=64"`
|
|
SiteName string `json:"site_name" binding:"required,max=128"`
|
|
Domain string `json:"domain" binding:"required,max=255"`
|
|
DisplayAccountEnabled *bool `json:"display_account_enabled"`
|
|
TaxEnabled *bool `json:"tax_enabled"`
|
|
TaxRateBPS *int64 `json:"tax_rate_bps"`
|
|
SettlementHoldDays *int `json:"settlement_hold_days"`
|
|
AdminUsername string `json:"admin_username" binding:"required,min=3,max=64"`
|
|
AdminPassword string `json:"admin_password" binding:"required,min=6,max=64"`
|
|
AdminNickname string `json:"admin_nickname"`
|
|
MemberType string `json:"member_type" binding:"omitempty,oneof=operator finance customer_service"`
|
|
DistributorReceiveRatio float64 `json:"distributor_receive_ratio"` // 兼容旧入参,开通时忽略,四种模式一律走默认分成
|
|
PlatformSellRatio float64 `json:"platform_sell_ratio"`
|
|
ServiceFeeValue float64 `json:"service_fee_value"`
|
|
}
|
|
|
|
type OnboardSiteResponse struct {
|
|
Site SiteDTO `json:"site"`
|
|
Rule RuleDTO `json:"rule"`
|
|
Member DistributionCurrentMemberDTO `json:"member"`
|
|
}
|
|
|
|
// ReceivedListingDTO 是分销站点收到的账号资产信息
|
|
type ReceivedListingDTO struct {
|
|
ListingID uint64 `json:"listing_id"`
|
|
ListingNo string `json:"listing_no"`
|
|
SiteID uint64 `json:"site_id"`
|
|
AccountID uint64 `json:"account_id"`
|
|
OwnerID uint64 `json:"owner_id"`
|
|
OwnerPhone string `json:"owner_phone"`
|
|
OwnerNickname string `json:"owner_nickname"`
|
|
Title string `json:"title"`
|
|
GameName string `json:"game_name"`
|
|
ServerRegion string `json:"server_region"`
|
|
LoginPlatform string `json:"login_platform"`
|
|
RankLevel string `json:"rank_level"`
|
|
HafCoinAmount int64 `json:"haf_coin_amount"`
|
|
SellerRatio float64 `json:"seller_ratio"`
|
|
SellerTotalPriceCent int64 `json:"seller_total_price_cent"`
|
|
BuyerRatio float64 `json:"buyer_ratio"`
|
|
PriceCent int64 `json:"price_cent"`
|
|
DepositAmountCent int64 `json:"deposit_amount_cent"`
|
|
Status string `json:"status"`
|
|
ReviewStatus string `json:"review_status"`
|
|
ReviewReason string `json:"review_reason"`
|
|
PublishedAt *time.Time `json:"published_at,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
type ReceivedListingQuery struct {
|
|
SiteID uint64
|
|
Status string
|
|
ReviewStatus string
|
|
GameName string
|
|
Keyword string
|
|
Page int
|
|
PageSize int
|
|
Size int
|
|
}
|
|
|
|
type ReceivedListingPage struct {
|
|
Items []ReceivedListingDTO `json:"items"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"page_size"`
|
|
}
|
|
|
|
type UpdateReceivedListingStatusRequest struct {
|
|
Status string `json:"status" binding:"required,oneof=published offline"`
|
|
}
|
|
|
|
// 站点品牌与装修 DTO。指针字段未传则保持原值,避免空字符串把装修清掉。
|
|
type UpdateSiteBrandingRequest struct {
|
|
LogoURL *string `json:"logo_url"`
|
|
FaviconURL *string `json:"favicon_url"`
|
|
BannersJSON *string `json:"banners_json"`
|
|
AnnouncementsJSON *string `json:"announcements_json"`
|
|
FooterInfoJSON *string `json:"footer_info_json"`
|
|
AWRecycleJSON *string `json:"aw_recycle_json"`
|
|
CooperationFeedbackJSON *string `json:"cooperation_feedback_json"`
|
|
StorefrontTextJSON *string `json:"storefront_text_json"`
|
|
// AnnouncementMode 公告中心来源:inherit(主站+本站)/ own_only(仅本站)。
|
|
AnnouncementMode *string `json:"announcement_mode"`
|
|
ListingQrcodeURL *string `json:"listing_qrcode_url"`
|
|
}
|
|
|
|
// SiteAnnouncementDTO 分站公告(站长自助维护)。
|
|
type SiteAnnouncementDTO struct {
|
|
ID uint64 `json:"id"`
|
|
DistributionSiteID uint64 `json:"distribution_site_id"`
|
|
Title string `json:"title"`
|
|
Content string `json:"content"`
|
|
Category string `json:"category"`
|
|
Priority int `json:"priority"`
|
|
IsPinned bool `json:"is_pinned"`
|
|
IsImportant bool `json:"is_important"`
|
|
IsPopup bool `json:"is_popup"`
|
|
ViewCount int `json:"view_count"`
|
|
Status string `json:"status"`
|
|
PublishedAt *time.Time `json:"published_at"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type SiteAnnouncementPage struct {
|
|
Items []SiteAnnouncementDTO `json:"items"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"page_size"`
|
|
}
|
|
|
|
type CreateSiteAnnouncementRequest struct {
|
|
Title string `json:"title" binding:"required,max=255"`
|
|
Content string `json:"content" binding:"required"`
|
|
Category string `json:"category" binding:"omitempty,oneof=notice tutorial rule faq"`
|
|
Priority int `json:"priority"`
|
|
IsPinned bool `json:"is_pinned"`
|
|
IsImportant bool `json:"is_important"`
|
|
// IsPopup 弹窗公告:本站首页弹出且需用户手动关闭,同一天只弹一次。
|
|
IsPopup bool `json:"is_popup"`
|
|
}
|
|
|
|
type UpdateSiteAnnouncementRequest struct {
|
|
Title string `json:"title" binding:"max=255"`
|
|
Content string `json:"content"`
|
|
Category string `json:"category" binding:"omitempty,oneof=notice tutorial rule faq"`
|
|
Priority int `json:"priority"`
|
|
IsPinned bool `json:"is_pinned"`
|
|
IsImportant bool `json:"is_important"`
|
|
IsPopup bool `json:"is_popup"`
|
|
}
|
|
|
|
// 自主加价 DTO:增加该站「1 元兑换哈夫币」比例,不是人民币。
|
|
type UpdateAccountMarkupRequest struct {
|
|
ShelfRatioDelta float64 `json:"shelf_ratio_delta"`
|
|
}
|
|
|
|
type AccountMarkupItem struct {
|
|
ID uint64 `json:"id,omitempty"`
|
|
ListingID uint64 `json:"listing_id,omitempty"`
|
|
ShelfRatioDelta float64 `json:"shelf_ratio_delta"`
|
|
}
|
|
|
|
type BatchUpdateAccountMarkupRequest struct {
|
|
ListingIDs []uint64 `json:"listing_ids"`
|
|
DisplayIDs []uint64 `json:"display_ids"`
|
|
ShelfRatioDelta float64 `json:"shelf_ratio_delta"`
|
|
Items []AccountMarkupItem `json:"items"`
|
|
}
|
|
|
|
type BatchUpdateAccountDisplayRequest struct {
|
|
DisplayIDs []uint64 `json:"display_ids"`
|
|
ListingIDs []uint64 `json:"listing_ids"`
|
|
TargetStatus string `json:"target_status" binding:"required,oneof=enabled disabled"`
|
|
}
|
|
|
|
type AccountDisplayQuery struct {
|
|
Page int `form:"page" json:"page"`
|
|
PageSize int `form:"page_size" json:"page_size"`
|
|
Status string `form:"status" json:"status"`
|
|
Keyword string `form:"keyword" json:"keyword"`
|
|
}
|
|
|
|
type AccountDisplayPageDTO struct {
|
|
Items []AccountDisplayDTO `json:"items"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"page_size"`
|
|
}
|
|
|
|
// 商户钱包与提现 DTO
|
|
type SiteWalletDTO struct {
|
|
SiteID uint64 `json:"site_id"`
|
|
AvailableBalanceCent int64 `json:"available_balance_cent"`
|
|
FrozenBalanceCent int64 `json:"frozen_balance_cent"`
|
|
PendingReleaseCent int64 `json:"pending_release_cent"`
|
|
TotalSettledCent int64 `json:"total_settled_cent"`
|
|
TotalWithdrawnCent int64 `json:"total_withdrawn_cent"`
|
|
SettlementHoldDays int `json:"settlement_hold_days"`
|
|
}
|
|
|
|
type ApplySiteWithdrawalRequest struct {
|
|
SiteID uint64 `json:"site_id"`
|
|
AmountCent int64 `json:"amount_cent" binding:"required,gt=0"`
|
|
AccountType string `json:"account_type" binding:"required,oneof=alipay bank"`
|
|
AccountName string `json:"account_name" binding:"required"`
|
|
AccountNo string `json:"account_no" binding:"required"`
|
|
BankName string `json:"bank_name"`
|
|
BankBranch string `json:"bank_branch"`
|
|
}
|
|
|
|
type SiteWithdrawalDTO struct {
|
|
ID uint64 `json:"id"`
|
|
WithdrawNo string `json:"withdraw_no"`
|
|
SiteID uint64 `json:"site_id"`
|
|
AmountCent int64 `json:"amount_cent"`
|
|
FeeCent int64 `json:"fee_cent"`
|
|
ActualAmountCent int64 `json:"actual_amount_cent"`
|
|
AccountType string `json:"account_type"`
|
|
AccountName string `json:"account_name"`
|
|
AccountNo string `json:"account_no"`
|
|
BankName string `json:"bank_name"`
|
|
BankBranch string `json:"bank_branch"`
|
|
Status string `json:"status"`
|
|
ReviewRemark string `json:"review_remark"`
|
|
PaymentProofURL string `json:"payment_proof_url"`
|
|
PaymentRemark string `json:"payment_remark"`
|
|
PaidAt *time.Time `json:"paid_at,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
type SiteWithdrawalPage struct {
|
|
Items []SiteWithdrawalDTO `json:"items"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"page_size"`
|
|
}
|
|
|
|
// 运营大盘统计 DTO
|
|
type DistributionAnalyticsDTO struct {
|
|
TodayReceivedCount int64 `json:"today_received_count"`
|
|
TotalReceivedCount int64 `json:"total_received_count"`
|
|
ActiveListingCount int64 `json:"active_listing_count"`
|
|
TodayOrderCount int64 `json:"today_order_count"`
|
|
TodayGMVCent int64 `json:"today_gmv_cent"`
|
|
TodayProfitCent int64 `json:"today_profit_cent"`
|
|
MonthProfitCent int64 `json:"month_profit_cent"`
|
|
AvailableBalanceCent int64 `json:"available_balance_cent"`
|
|
TodayUserCount int64 `json:"today_user_count"`
|
|
TotalUserCount int64 `json:"total_user_count"`
|
|
TotalOrderUserCount int64 `json:"total_order_user_count"`
|
|
TrendDays []DistributionTrendPoint `json:"trend_days"`
|
|
}
|
|
|
|
type DistributionTrendPoint struct {
|
|
Date string `json:"date"`
|
|
ReceivedCount int64 `json:"received_count"`
|
|
OrderCount int64 `json:"order_count"`
|
|
GMVCent int64 `json:"gmv_cent"`
|
|
ProfitCent int64 `json:"profit_cent"`
|
|
}
|
|
|
|
// 分销站点独立短信配置结构体
|
|
type SiteSMSConfigDTO struct {
|
|
Enabled bool `json:"enabled"`
|
|
Provider string `json:"provider"`
|
|
AccessKeyID string `json:"access_key_id"`
|
|
MaskedSecret string `json:"masked_secret"`
|
|
HasSecret bool `json:"has_secret"`
|
|
Endpoint string `json:"endpoint"`
|
|
SignName string `json:"sign_name"`
|
|
LoginTemplateCode string `json:"login_template_code"`
|
|
}
|
|
|
|
type UpdateSiteSMSConfigRequest struct {
|
|
Enabled *bool `json:"enabled"`
|
|
Provider *string `json:"provider"`
|
|
AccessKeyID *string `json:"access_key_id"`
|
|
AccessKeySecret *string `json:"access_key_secret"`
|
|
Endpoint *string `json:"endpoint"`
|
|
SignName *string `json:"sign_name"`
|
|
LoginTemplateCode *string `json:"login_template_code"`
|
|
}
|
|
|
|
type TestSiteSMSConfigRequest struct {
|
|
Phone string `json:"phone" binding:"required"`
|
|
Enabled *bool `json:"enabled"`
|
|
Provider *string `json:"provider"`
|
|
AccessKeyID *string `json:"access_key_id"`
|
|
AccessKeySecret *string `json:"access_key_secret"`
|
|
Endpoint *string `json:"endpoint"`
|
|
SignName *string `json:"sign_name"`
|
|
LoginTemplateCode *string `json:"login_template_code"`
|
|
}
|
|
|
|
// 分销站点客户/用户信息 DTO
|
|
type DistributionUserDTO struct {
|
|
ID uint64 `json:"id"`
|
|
Phone string `json:"phone"`
|
|
Nickname string `json:"nickname"`
|
|
AvatarURL string `json:"avatar_url"`
|
|
RealnameStatus string `json:"realname_status"`
|
|
Status string `json:"status"`
|
|
Source string `json:"source"` // register=本站注册, order=本站下单, both=注册并下单
|
|
OrderCount int64 `json:"order_count"`
|
|
TotalSpentCent int64 `json:"total_spent_cent"`
|
|
LastOrderAt *time.Time `json:"last_order_at,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
LastLoginAt *time.Time `json:"last_login_at,omitempty"`
|
|
}
|
|
|
|
type DistributionUserPageDTO struct {
|
|
Items []DistributionUserDTO `json:"items"`
|
|
Total int64 `json:"total"`
|
|
Page int `json:"page"`
|
|
PageSize int `json:"page_size"`
|
|
TotalUsers int64 `json:"total_users"`
|
|
OrderUsers int64 `json:"order_users"`
|
|
}
|
|
|
|
type ListDistributionUsersQuery struct {
|
|
SiteID uint64 `form:"site_id"`
|
|
Keyword string `form:"keyword"`
|
|
Source string `form:"source"` // all / register / order
|
|
Page int `form:"page,default=1"`
|
|
PageSize int `form:"page_size,default=20"`
|
|
}
|