feat(distribution): 默认结算冷却天数改为系统配置驱动
新建站点的默认冷却期原先硬编码 7 天(OnboardSite 字面量、DB 列默认、两套前端表单), 改一处要同时动三处。现统一到系统配置键 distribution.default_settlement_hold_days: - systemconfig 注册该键(默认 7,0=立即释放,0-365 校验),纳入 admin 可见配置 - distribution 建站两条路径(CreateSite 未传值、OnboardSite 缺省)读取该配置,缺失或非法回落 7 - 新增 GET /admin/distribution/site-defaults 暴露当前有效默认值 - Vue / React 站点表单改为运行时拉取,拉取失败保持 7 - DB 列默认值保留作为兜底,站点级 settlement_hold_days 仍可单独覆盖
This commit is contained in:
@@ -54,6 +54,15 @@ func (h *Handler) CreateSite(c *gin.Context) {
|
||||
response.Created(c, item)
|
||||
}
|
||||
|
||||
func (h *Handler) GetSiteDefaults(c *gin.Context) {
|
||||
holdDays, err := h.service.DefaultSettlementHoldDays(c.Request.Context())
|
||||
if err != nil {
|
||||
writeError(c, err)
|
||||
return
|
||||
}
|
||||
response.OK(c, gin.H{"default_settlement_hold_days": holdDays})
|
||||
}
|
||||
|
||||
func (h *Handler) UpdateSite(c *gin.Context) {
|
||||
id, ok := parseID(c)
|
||||
if !ok {
|
||||
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
"hfb_sys/backend/internal/auditlog"
|
||||
"hfb_sys/backend/internal/model"
|
||||
listingpkg "hfb_sys/backend/internal/modules/listing"
|
||||
"hfb_sys/backend/internal/modules/systemconfig"
|
||||
"hfb_sys/backend/internal/modules/wallet"
|
||||
|
||||
"github.com/redis/go-redis/v9"
|
||||
@@ -220,6 +221,23 @@ func (r *Repository) FindSite(ctx context.Context, adminID, id uint64) (*SiteDTO
|
||||
return &item, nil
|
||||
}
|
||||
|
||||
// resolveDefaultSettlementHoldDays 读取系统配置里的新建站点默认结算冷却天数,缺失或异常时回落到内置默认值。
|
||||
func (r *Repository) resolveDefaultSettlementHoldDays(ctx context.Context) int {
|
||||
if r == nil || r.db == nil {
|
||||
return systemconfig.DefaultDistributionSettlementHoldDays
|
||||
}
|
||||
var row model.SystemConfig
|
||||
if err := r.db.WithContext(ctx).Where("`key` = ?", systemconfig.DistributionSettlementHoldDaysKey).First(&row).Error; err != nil {
|
||||
return systemconfig.DefaultDistributionSettlementHoldDays
|
||||
}
|
||||
return systemconfig.ParseDistributionSettlementHoldDays(row.Value)
|
||||
}
|
||||
|
||||
// DefaultSettlementHoldDays 暴露当前有效的默认结算冷却天数,供前端表单使用。
|
||||
func (r *Repository) DefaultSettlementHoldDays(ctx context.Context) int {
|
||||
return r.resolveDefaultSettlementHoldDays(ctx)
|
||||
}
|
||||
|
||||
func (r *Repository) CreateSite(ctx context.Context, req CreateSiteRequest) (*SiteDTO, error) {
|
||||
row := model.DistributionSite{
|
||||
SiteCode: strings.TrimSpace(req.SiteCode), SiteName: strings.TrimSpace(req.SiteName), Domain: strings.TrimSpace(req.Domain),
|
||||
@@ -243,6 +261,8 @@ func (r *Repository) CreateSite(ctx context.Context, req CreateSiteRequest) (*Si
|
||||
return nil, err
|
||||
}
|
||||
row.SettlementHoldDays = holdDays
|
||||
} else {
|
||||
row.SettlementHoldDays = r.resolveDefaultSettlementHoldDays(ctx)
|
||||
}
|
||||
if err := r.db.WithContext(ctx).Create(&row).Error; err != nil {
|
||||
return nil, err
|
||||
@@ -1404,7 +1424,7 @@ func (r *Repository) OnboardSite(ctx context.Context, req OnboardSiteRequest) (*
|
||||
if req.TaxRateBPS != nil {
|
||||
taxRate = *req.TaxRateBPS
|
||||
}
|
||||
holdDays := 7
|
||||
holdDays := r.resolveDefaultSettlementHoldDays(ctx)
|
||||
if req.SettlementHoldDays != nil {
|
||||
normalized, err := normalizeSettlementHoldDays(*req.SettlementHoldDays)
|
||||
if err != nil {
|
||||
|
||||
@@ -86,6 +86,12 @@ func (s *Service) CreateSite(ctx context.Context, req CreateSiteRequest) (*SiteD
|
||||
}
|
||||
return s.repo.CreateSite(ctx, req)
|
||||
}
|
||||
func (s *Service) DefaultSettlementHoldDays(ctx context.Context) (int, error) {
|
||||
if err := s.available(); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return s.repo.DefaultSettlementHoldDays(ctx), nil
|
||||
}
|
||||
func (s *Service) UpdateSite(ctx context.Context, adminID, id uint64, req UpdateSiteRequest) (*SiteDTO, error) {
|
||||
if err := s.available(); err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
package distribution
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"hfb_sys/backend/internal/model"
|
||||
"hfb_sys/backend/internal/modules/systemconfig"
|
||||
)
|
||||
|
||||
// TestCreateSiteUsesConfiguredDefaultSettlementHoldDays 验证新建站点未显式传值时读取系统配置的默认冷却天数。
|
||||
func TestCreateSiteUsesConfiguredDefaultSettlementHoldDays(t *testing.T) {
|
||||
db := distributionTestDB(t)
|
||||
repo := NewRepository(db)
|
||||
if err := db.Create(&model.SystemConfig{
|
||||
Key: systemconfig.DistributionSettlementHoldDaysKey,
|
||||
Value: "3",
|
||||
}).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
dto, err := repo.CreateSite(t.Context(), CreateSiteRequest{SiteCode: "cfg_hold", SiteName: "配置冷却站", Domain: "cfghold.dist.com"})
|
||||
if err != nil {
|
||||
t.Fatalf("CreateSite err = %v", err)
|
||||
}
|
||||
if dto.SettlementHoldDays != 3 {
|
||||
t.Fatalf("DTO settlement_hold_days = %d, want 3", dto.SettlementHoldDays)
|
||||
}
|
||||
var site model.DistributionSite
|
||||
if err := db.Where("site_code = ?", "cfg_hold").First(&site).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if site.SettlementHoldDays != 3 {
|
||||
t.Fatalf("DB settlement_hold_days = %d, want 3", site.SettlementHoldDays)
|
||||
}
|
||||
}
|
||||
|
||||
// TestCreateSiteFallsBackWhenConfigMissing 验证系统配置缺失时回落到内置默认 7 天。
|
||||
func TestCreateSiteFallsBackWhenConfigMissing(t *testing.T) {
|
||||
db := distributionTestDB(t)
|
||||
repo := NewRepository(db)
|
||||
dto, err := repo.CreateSite(t.Context(), CreateSiteRequest{SiteCode: "no_cfg_hold", SiteName: "兜底冷却站", Domain: "nocfghold.dist.com"})
|
||||
if err != nil {
|
||||
t.Fatalf("CreateSite err = %v", err)
|
||||
}
|
||||
if dto.SettlementHoldDays != systemconfig.DefaultDistributionSettlementHoldDays {
|
||||
t.Fatalf("DTO settlement_hold_days = %d, want %d", dto.SettlementHoldDays, systemconfig.DefaultDistributionSettlementHoldDays)
|
||||
}
|
||||
var site model.DistributionSite
|
||||
if err := db.Where("site_code = ?", "no_cfg_hold").First(&site).Error; err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if site.SettlementHoldDays != systemconfig.DefaultDistributionSettlementHoldDays {
|
||||
t.Fatalf("DB settlement_hold_days = %d, want %d", site.SettlementHoldDays, systemconfig.DefaultDistributionSettlementHoldDays)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user