Files
junhong_cmp_fiber/internal/model/dto/asset_auto_renewal_dto.go
break d52be16802
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 10m15s
feat(资产钱包自动续费): 新增全局配置、每日扫描续购与可靠复机
- 新增单行配置表 tb_asset_auto_renewal_config 与尝试记录表 tb_asset_auto_renewal_attempt(迁移 000229/000230)
- 每日按上海自然日扫描,窗口内以同一资产钱包可用余额续购当前主套餐,资金/订单/套餐/审计同一事务闭合
- 唯一键保证每资产每日至多一次尝试,占位中断由后续扫描收敛,当日不重试
- 四类失败原因向客户与店铺各投递每日至多一条站内通知,并注册通知类型与个人客户白名单
- 续费成功后按条件经 Outbox 可靠投递复机,新增恢复扫描只查询回填,不使用即发即弃调用
- 配置读写仅超级管理员与平台账号,保存记录操作者、前后值快照并登记统一审计
- tasks 7.1–7.15 全部验证通过(本机隔离 PostgreSQL/Redis,零外部渠道调用)
2026-09-17 16:39:26 +08:00

40 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package dto
// AssetAutoRenewalConfigResponse 是资产钱包自动续费全局配置的读取响应。
type AssetAutoRenewalConfigResponse struct {
Enabled int `json:"enabled" description:"总开关 0-关闭 1-开启"`
// Scope 取值 all-全部主套餐 specified-指定主套餐。
Scope string `json:"scope" description:"适用范围 all-全部主套餐 specified-指定主套餐"`
// PackageIDs 仅在指定范围时非空,元素为可售主套餐商品 ID。
PackageIDs []uint `json:"package_ids" description:"指定主套餐商品ID集合范围为主套餐全部时为空数组"`
// DaysBeforeExpiry 是统一到期前天数,触发窗口为最终到期剩余天数闭区间 0 至该值。
DaysBeforeExpiry int `json:"days_before_expiry" description:"统一到期前天数,取值 1 至 90"`
// ConfigVersion 每次保存递增,尝试记录只保留触发时版本快照。
ConfigVersion int64 `json:"config_version" description:"配置版本,每次保存递增"`
// ScopeName 是适用范围的中文名称。
ScopeName string `json:"scope_name" description:"适用范围中文名称"`
// EnabledName 是总开关的中文名称。
EnabledName string `json:"enabled_name" description:"总开关中文名称"`
// Updater 是最近保存的操作者账号 ID。
Updater uint `json:"updater" description:"最近保存的操作者账号ID"`
// UpdatedAt 是最近保存时间。
UpdatedAt string `json:"updated_at" description:"最近保存时间"`
}
// UpdateAssetAutoRenewalConfigRequest 是保存自动续费全局配置的请求。
//
// required:"true" 与 enum:"..." 是**文档契约标签**(供 OpenAPI 反射,见 pkg/openapi 的 Reflector 与
// internal/model/dto/asset_dto.go:386 的既有用法),不参与运行时校验;运行时校验仍由 validate tag 与
// internal/handler/admin/asset_auto_renewal.go 的 validator.Struct 承担。
// description 一律在首个中文逗号处收住internal/handler/validation 的 fieldDescription 会在此截断,
// 使校验提示只取到字段名(如「适用范围」)而不是整段枚举说明;枚举取值逐字取自 pkg/constants。
type UpdateAssetAutoRenewalConfigRequest struct {
Enabled int `json:"enabled" validate:"oneof=0 1" enum:"0,1" description:"总开关,取值 0-关闭 1-开启"`
// Scope 只能选择全部主套餐或指定主套餐;指定范围时 PackageIDs 必须非空。
Scope string `json:"scope" validate:"required,oneof=all specified" required:"true" enum:"all,specified" description:"适用范围,取值 all-全部主套餐 specified-指定主套餐"`
// PackageIDs 只能选择当前可售主套餐;范围为主套餐全部时必须留空。
PackageIDs []uint `json:"package_ids" description:"指定主套餐商品ID集合仅指定范围时填写"`
// DaysBeforeExpiry 是统一到期前天数,上限 90。
DaysBeforeExpiry int `json:"days_before_expiry" validate:"required,min=1,max=90" required:"true" description:"统一到期前天数,取值 1 至 90"`
}