Files
hfb_sys/backend/internal/model/distribution.go
T
yml2213 329d0f75bb feat(distribution): 分站前台按独立商城呈现并支持首页文案自定义
分站前台原本对顾客暴露分销身份,且登录等页面写死了主站品牌,
与「一手独立商城」的定位不符;同时首页文案全部硬编码,站长无法按自己口径调整。

去分销身份(顾客可见处):
- 头部品牌区、首页主视觉、移动端认证卡去掉「官方分销/官方分销认证/官方分销站」标识
- 会员徽标「分销专享」→「会员专享」,「所属商城」兜底「专属分销站/商城」→「官方商城」
- 订单页说明改为「当前为【X】商城,仅展示在本站产生的订单记录」,保留订单按站隔离的必要说明
- 无公告时的兜底跑马灯、轮播角标去掉分销措辞
- 清理随之失效的 pc-brand-badge / mobile-brand-badge 样式

品牌跟随站点配置(即可自定义):
- PC/移动登录页、移动注册页、加桌面引导页的品牌改为 站点名称 + Logo(无 Logo 取站名首字),
  不再写死主站「大锤商行」;主站行为不变(新增 store getter brandMark:分站取站名首字,主站仍为「锤」)

首页文案可配置:
- 新增迁移 000076 与 distribution_sites.storefront_text_json
  (tagline 头部副标题 / hero_badge 主视觉徽标 / hero_desc 主视觉描述 / card_sub 移动端卡片副标题)
- 分销后台「品牌装修 → 首页文案」可编辑,占位提示即默认值,留空或整段清空回落内置默认
- 贯通 UpdateSiteBranding → 公开站点信息接口(含 Redis 缓存失效)→ 前台 store 逐字段合并默认值
- 装修预览同步展示站长填写的副标题与徽标

测试:
- 后端补装修字段写入/公开接口透出/清空回落断言
- 前端新增 storefrontText 单测(默认合并、覆盖、空白与非法类型回落)
2026-10-01 09:24:56 +08:00

186 lines
12 KiB
Go

package model
import "time"
// DistributionSite 表示一个独立分销网站主体。
type DistributionSite struct {
ID uint64 `gorm:"primaryKey" json:"id"`
SiteCode string `gorm:"size:64;not null;uniqueIndex" json:"site_code"`
SiteName string `gorm:"size:128;not null" json:"site_name"`
Domain string `gorm:"size:255;not null;uniqueIndex" json:"domain"`
Status string `gorm:"size:16;not null;default:'active';index" json:"status"`
DisplayAccountEnabled bool `gorm:"not null;default:true" json:"display_account_enabled"`
LogoURL string `gorm:"size:512;not null;default:''" json:"logo_url"`
FaviconURL string `gorm:"size:512;not null;default:''" json:"favicon_url"`
BannersJSON string `gorm:"type:text" json:"banners_json"`
AnnouncementsJSON string `gorm:"type:text" json:"announcements_json"`
FooterInfoJSON string `gorm:"type:text" json:"footer_info_json"`
AWRecycleJSON string `gorm:"type:text" json:"aw_recycle_json"`
CooperationFeedbackJSON string `gorm:"type:text" json:"cooperation_feedback_json"`
// StorefrontTextJSON 首页文案(tagline/hero_badge/hero_desc/card_sub),空字段继承前台默认。
StorefrontTextJSON string `gorm:"type:text" json:"storefront_text_json"`
DefaultSupportGroupID *uint64 `gorm:"index" json:"default_support_group_id,omitempty"`
ListingQrcodeURL string `gorm:"size:512;not null;default:''" json:"listing_qrcode_url"`
SMSConfigJSON string `gorm:"type:text" json:"-"`
ReceiveRatioDelta float64 `gorm:"type:decimal(10,2);not null;default:0" json:"receive_ratio_delta"`
ReceiveCostDelta float64 `gorm:"type:decimal(10,2);not null;default:0" json:"receive_cost_delta"`
TaxEnabled bool `gorm:"not null;default:false" json:"tax_enabled"`
TaxRateBPS int64 `gorm:"not null;default:100" json:"tax_rate_bps"`
SettlementHoldDays int `gorm:"not null;default:7" json:"settlement_hold_days"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (DistributionSite) TableName() string { return "distribution_sites" }
// DistributionSiteMember 将现有后台管理员映射到分销网站。
type DistributionSiteMember struct {
ID uint64 `gorm:"primaryKey" json:"id"`
SiteID uint64 `gorm:"not null;uniqueIndex:uk_distribution_site_member;index" json:"site_id"`
AdminUserID uint64 `gorm:"not null;uniqueIndex:uk_distribution_site_member;index" json:"admin_user_id"`
MemberType string `gorm:"size:32;not null" json:"member_type"`
Status string `gorm:"size:16;not null;default:'active';index" json:"status"`
DataScope string `gorm:"size:32;not null;default:'site'" json:"data_scope"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (DistributionSiteMember) TableName() string { return "distribution_site_members" }
// DistributionSiteAccount 控制账号在分销网站的展示状态。
type DistributionSiteAccount struct {
ID uint64 `gorm:"primaryKey" json:"id"`
SiteID uint64 `gorm:"not null;uniqueIndex:uk_distribution_site_account;index" json:"site_id"`
AccountID uint64 `gorm:"not null;uniqueIndex:uk_distribution_site_account;index" json:"account_id"`
ListingID uint64 `gorm:"not null;index" json:"listing_id"`
DisplayStatus string `gorm:"size:16;not null;default:'enabled';index" json:"display_status"`
// DisplayDisabledBy 记录下架来源:operator=站长人工下架,system=系统自动下架,空=展示中或历史数据。
// 自动铺货只会恢复 system/空 来源的下架行,人工下架保持不动。
DisplayDisabledBy string `gorm:"size:16;not null;default:''" json:"display_disabled_by"`
MarkupAmountCent int64 `gorm:"not null;default:0" json:"markup_amount_cent"`
ShelfRatioDelta float64 `gorm:"type:decimal(10,2);not null;default:0" json:"shelf_ratio_delta"`
DisplayStartedAt *time.Time `json:"display_started_at,omitempty"`
DisplayEndedAt *time.Time `json:"display_ended_at,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (DistributionSiteAccount) TableName() string { return "distribution_site_accounts" }
// DistributionRuleVersion 是新订单使用的分账规则快照来源。
type DistributionRuleVersion struct {
ID uint64 `gorm:"primaryKey" json:"id"`
SiteID *uint64 `gorm:"index" json:"site_id,omitempty"`
Mode string `gorm:"size:32;not null;index" json:"mode"`
Version int `gorm:"not null" json:"version"`
Status string `gorm:"size:16;not null;default:'draft';index" json:"status"`
PlatformReceiveRatio float64 `gorm:"type:decimal(10,2);not null;default:0" json:"platform_receive_ratio"`
PlatformSellRatio float64 `gorm:"type:decimal(10,2);not null;default:0" json:"platform_sell_ratio"`
DistributorReceiveRatio float64 `gorm:"type:decimal(10,2);not null;default:0" json:"distributor_receive_ratio"`
DistributorSellRatio float64 `gorm:"type:decimal(10,2);not null;default:0" json:"distributor_sell_ratio"`
DistributorARatio float64 `gorm:"type:decimal(10,2);not null;default:0" json:"distributor_a_ratio"`
DistributorBRatio float64 `gorm:"type:decimal(10,2);not null;default:0" json:"distributor_b_ratio"`
ServiceFeeValue float64 `gorm:"type:decimal(12,4);not null;default:0" json:"service_fee_value"`
ServiceFeeUnit string `gorm:"size:24;not null;default:'percent'" json:"service_fee_unit"`
PaymentFeeBPS int64 `gorm:"not null;default:50" json:"payment_fee_bps"`
TaxEnabled bool `gorm:"not null;default:false" json:"tax_enabled"`
TaxRateBPS int64 `gorm:"not null;default:100" json:"tax_rate_bps"`
EffectiveFrom time.Time `gorm:"index" json:"effective_from"`
EffectiveTo *time.Time `gorm:"index" json:"effective_to,omitempty"`
CreatedBy *uint64 `json:"created_by,omitempty"`
CreatedAt time.Time `json:"created_at"`
}
func (DistributionRuleVersion) TableName() string { return "distribution_rule_versions" }
// DistributionOrderFinancial 保存正常订单的分销财务快照。
type DistributionOrderFinancial struct {
ID uint64 `gorm:"primaryKey" json:"id"`
OrderID uint64 `gorm:"not null;uniqueIndex" json:"order_id"`
SiteID uint64 `gorm:"not null;index" json:"site_id"`
RuleVersionID uint64 `gorm:"not null" json:"rule_version_id"`
GrossPaidAmountCent int64 `gorm:"not null;default:0" json:"gross_paid_amount_cent"`
RefundAmountCent int64 `gorm:"not null;default:0" json:"refund_amount_cent"`
NetPaidAmountCent int64 `gorm:"not null;default:0" json:"net_paid_amount_cent"`
PaymentFeeBPS int64 `gorm:"not null;default:50" json:"payment_fee_bps"`
PaymentFeeCent int64 `gorm:"not null;default:0" json:"payment_fee_cent"`
ServiceFeeValue float64 `gorm:"type:decimal(12,4);not null;default:0" json:"service_fee_value"`
ServiceFeeUnit string `gorm:"size:24;not null;default:'percent'" json:"service_fee_unit"`
ServiceFeeCent int64 `gorm:"not null;default:0" json:"service_fee_cent"`
MarkupAmountCent int64 `gorm:"not null;default:0" json:"markup_amount_cent"`
TaxEnabled bool `gorm:"not null;default:false" json:"tax_enabled"`
TaxRateBPS int64 `gorm:"not null;default:100" json:"tax_rate_bps"`
TaxAmountCent int64 `gorm:"not null;default:0" json:"tax_amount_cent"`
SplitBaseAmountCent int64 `gorm:"not null;default:0" json:"split_base_amount_cent"`
RoundingAdjustmentCent int64 `gorm:"not null;default:0" json:"rounding_adjustment_cent"`
SettlementStatus string `gorm:"size:24;not null;default:'pending';index" json:"settlement_status"`
ReleaseAt *time.Time `gorm:"index:idx_distribution_financial_release,priority:2" json:"release_at,omitempty"`
ReleasedAt *time.Time `json:"released_at,omitempty"`
SettledAt *time.Time `json:"settled_at,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (DistributionOrderFinancial) TableName() string { return "distribution_order_financials" }
// DistributionOrderParty 保存订单创建时的参与方和金额快照,避免规则或站点变更影响历史订单。
type DistributionOrderParty struct {
ID uint64 `gorm:"primaryKey" json:"id"`
OrderID uint64 `gorm:"not null;index" json:"order_id"`
SiteID uint64 `gorm:"not null;index" json:"site_id"`
PartyRole string `gorm:"size:32;not null;index" json:"party_role"`
PartyType string `gorm:"size:16;not null" json:"party_type"`
PartyID uint64 `gorm:"not null" json:"party_id"`
Ratio float64 `gorm:"type:decimal(10,2);not null;default:0" json:"ratio"`
IncomeAmountCent int64 `gorm:"not null;default:0" json:"income_amount_cent"`
CostAmountCent int64 `gorm:"not null;default:0" json:"cost_amount_cent"`
ProfitAmountCent int64 `gorm:"not null;default:0" json:"profit_amount_cent"`
TaxAmountCent int64 `gorm:"not null;default:0" json:"tax_amount_cent"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (DistributionOrderParty) TableName() string { return "distribution_order_parties" }
// DistributionSettlementBatch 是按站点生成的结算批次。
type DistributionSettlementBatch struct {
ID uint64 `gorm:"primaryKey" json:"id"`
SiteID uint64 `gorm:"not null;index" json:"site_id"`
BatchNo string `gorm:"size:64;not null;uniqueIndex" json:"batch_no"`
PeriodStart time.Time `gorm:"not null" json:"period_start"`
PeriodEnd time.Time `gorm:"not null" json:"period_end"`
TotalAmountCent int64 `gorm:"not null;default:0" json:"total_amount_cent"`
Status string `gorm:"size:16;not null;default:'draft';index" json:"status"`
CreatedBy *uint64 `json:"created_by,omitempty"`
SettledAt *time.Time `json:"settled_at,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (DistributionSettlementBatch) TableName() string { return "distribution_settlement_batches" }
type DistributionSettlementItem struct {
ID uint64 `gorm:"primaryKey" json:"id"`
BatchID uint64 `gorm:"not null;index" json:"batch_id"`
OrderID uint64 `gorm:"not null;index" json:"order_id"`
PartyID uint64 `gorm:"not null;index" json:"party_id"`
AmountCent int64 `gorm:"not null;default:0" json:"amount_cent"`
Status string `gorm:"size:16;not null;default:'pending'" json:"status"`
CreatedAt time.Time `json:"created_at"`
}
func (DistributionSettlementItem) TableName() string { return "distribution_settlement_items" }
// DistributionSitePaymentChannel 将一个或多个现有支付商户配置绑定到分销站点。
type DistributionSitePaymentChannel struct {
ID uint64 `gorm:"primaryKey" json:"id"`
SiteID uint64 `gorm:"not null;uniqueIndex:uk_distribution_site_payment;index" json:"site_id"`
ConfigID uint64 `gorm:"not null;uniqueIndex:uk_distribution_site_payment;index" json:"config_id"`
Priority int `gorm:"not null;default:0" json:"priority"`
Status string `gorm:"size:16;not null;default:'active';index" json:"status"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (DistributionSitePaymentChannel) TableName() string { return "distribution_site_payment_channels" }