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