refactor: 新增系列授权 DTO,删除旧套餐/系列分配 DTO

新增 ShopSeriesGrantDTO(含 packages 列表聚合视图)、CreateShopSeriesGrantRequest(支持固定/梯度模式及强充配置)、UpdateShopSeriesGrantRequest、ManageGrantPackagesRequest 等请求/响应结构。删除已被 Grant 接口取代的 ShopSeriesAllocationDTO 和 ShopPackageAllocationDTO。

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-03-04 11:35:38 +08:00
parent 672274f9fd
commit e7d52db270
3 changed files with 119 additions and 133 deletions

View File

@@ -1,66 +0,0 @@
package dto
type CreateShopPackageAllocationRequest struct {
ShopID uint `json:"shop_id" validate:"required" required:"true" description:"被分配的店铺ID"`
PackageID uint `json:"package_id" validate:"required" required:"true" description:"套餐ID"`
CostPrice int64 `json:"cost_price" validate:"required,min=0" required:"true" minimum:"0" description:"该代理的成本价(分)"`
}
type UpdateShopPackageAllocationRequest struct {
CostPrice *int64 `json:"cost_price" validate:"omitempty,min=0" minimum:"0" description:"该代理的成本价(分)"`
}
type ShopPackageAllocationListRequest struct {
Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码"`
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量"`
ShopID *uint `json:"shop_id" query:"shop_id" validate:"omitempty" description:"被分配的店铺ID"`
PackageID *uint `json:"package_id" query:"package_id" validate:"omitempty" description:"套餐ID"`
SeriesAllocationID *uint `json:"series_allocation_id" query:"series_allocation_id" validate:"omitempty" description:"系列分配ID"`
AllocatorShopID *uint `json:"allocator_shop_id" query:"allocator_shop_id" validate:"omitempty" description:"分配者店铺ID"`
Status *int `json:"status" query:"status" validate:"omitempty,oneof=1 2" description:"状态 (1:启用, 2:禁用)"`
}
// UpdateShopPackageAllocationStatusRequest 更新单套餐分配状态请求
type UpdateShopPackageAllocationStatusRequest struct {
Status int `json:"status" validate:"required,oneof=1 2" required:"true" description:"状态 (1:启用, 2:禁用)"`
}
type ShopPackageAllocationResponse struct {
ID uint `json:"id" description:"分配ID"`
ShopID uint `json:"shop_id" description:"被分配的店铺ID"`
ShopName string `json:"shop_name" description:"被分配的店铺名称"`
PackageID uint `json:"package_id" description:"套餐ID"`
PackageName string `json:"package_name" description:"套餐名称"`
PackageCode string `json:"package_code" description:"套餐编码"`
SeriesID uint `json:"series_id" description:"套餐系列ID"`
SeriesName string `json:"series_name" description:"套餐系列名称"`
SeriesAllocationID *uint `json:"series_allocation_id" description:"关联的系列分配ID"`
AllocatorShopID uint `json:"allocator_shop_id" description:"分配者店铺ID0表示平台分配"`
AllocatorShopName string `json:"allocator_shop_name" description:"分配者店铺名称"`
CostPrice int64 `json:"cost_price" description:"该代理的成本价(分)"`
Status int `json:"status" description:"状态 (1:启用, 2:禁用)"`
ShelfStatus int `json:"shelf_status" description:"上架状态 (1:上架, 2:下架)"`
CreatedAt string `json:"created_at" description:"创建时间"`
UpdatedAt string `json:"updated_at" description:"更新时间"`
}
// ShopPackageAllocationPageResult 套餐分配分页结果
type ShopPackageAllocationPageResult struct {
List []*ShopPackageAllocationResponse `json:"list" description:"分配列表"`
Total int64 `json:"total" description:"总数"`
Page int `json:"page" description:"当前页"`
PageSize int `json:"page_size" description:"每页数量"`
TotalPages int `json:"total_pages" description:"总页数"`
}
// UpdateShopPackageAllocationParams 更新套餐分配聚合参数
type UpdateShopPackageAllocationParams struct {
IDReq
UpdateShopPackageAllocationRequest
}
// UpdateShopPackageAllocationStatusParams 更新套餐分配状态聚合参数
type UpdateShopPackageAllocationStatusParams struct {
IDReq
UpdateShopPackageAllocationStatusRequest
}

View File

@@ -1,67 +0,0 @@
package dto
type CreateShopSeriesAllocationRequest struct {
ShopID uint `json:"shop_id" validate:"required" required:"true" description:"被分配的店铺ID"`
SeriesID uint `json:"series_id" validate:"required" required:"true" description:"套餐系列ID"`
OneTimeCommissionAmount int64 `json:"one_time_commission_amount" validate:"required,min=0" required:"true" minimum:"0" description:"该代理能拿的一次性佣金金额上限(分)"`
EnableOneTimeCommission *bool `json:"enable_one_time_commission" description:"是否启用一次性佣金"`
OneTimeCommissionTrigger string `json:"one_time_commission_trigger" validate:"omitempty,oneof=first_recharge accumulated_recharge" description:"一次性佣金触发类型 (first_recharge:首次充值, accumulated_recharge:累计充值)"`
OneTimeCommissionThreshold *int64 `json:"one_time_commission_threshold" validate:"omitempty,min=0" minimum:"0" description:"一次性佣金触发阈值(分)"`
EnableForceRecharge *bool `json:"enable_force_recharge" description:"是否启用强制充值"`
ForceRechargeAmount *int64 `json:"force_recharge_amount" validate:"omitempty,min=0" minimum:"0" description:"强制充值金额(分)"`
ForceRechargeTriggerType *int `json:"force_recharge_trigger_type" validate:"omitempty,oneof=1 2" description:"强充触发类型 (1:单次充值, 2:累计充值)"`
}
type UpdateShopSeriesAllocationRequest struct {
OneTimeCommissionAmount *int64 `json:"one_time_commission_amount" validate:"omitempty,min=0" minimum:"0" description:"该代理能拿的一次性佣金金额上限(分)"`
EnableOneTimeCommission *bool `json:"enable_one_time_commission" description:"是否启用一次性佣金"`
OneTimeCommissionTrigger *string `json:"one_time_commission_trigger" validate:"omitempty,oneof=first_recharge accumulated_recharge" description:"一次性佣金触发类型"`
OneTimeCommissionThreshold *int64 `json:"one_time_commission_threshold" validate:"omitempty,min=0" minimum:"0" description:"一次性佣金触发阈值(分)"`
EnableForceRecharge *bool `json:"enable_force_recharge" description:"是否启用强制充值"`
ForceRechargeAmount *int64 `json:"force_recharge_amount" validate:"omitempty,min=0" minimum:"0" description:"强制充值金额(分)"`
ForceRechargeTriggerType *int `json:"force_recharge_trigger_type" validate:"omitempty,oneof=1 2" description:"强充触发类型 (1:单次充值, 2:累计充值)"`
Status *int `json:"status" validate:"omitempty,oneof=1 2" description:"状态 (1:启用, 2:禁用)"`
}
type ShopSeriesAllocationListRequest struct {
Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码"`
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量"`
ShopID *uint `json:"shop_id" query:"shop_id" validate:"omitempty" description:"被分配的店铺ID"`
SeriesID *uint `json:"series_id" query:"series_id" validate:"omitempty" description:"套餐系列ID"`
AllocatorShopID *uint `json:"allocator_shop_id" query:"allocator_shop_id" validate:"omitempty" description:"分配者店铺ID"`
Status *int `json:"status" query:"status" validate:"omitempty,oneof=1 2" description:"状态 (1:启用, 2:禁用)"`
}
type ShopSeriesAllocationResponse struct {
ID uint `json:"id" description:"分配ID"`
ShopID uint `json:"shop_id" description:"被分配的店铺ID"`
ShopName string `json:"shop_name" description:"被分配的店铺名称"`
SeriesID uint `json:"series_id" description:"套餐系列ID"`
SeriesName string `json:"series_name" description:"套餐系列名称"`
SeriesCode string `json:"series_code" description:"套餐系列编码"`
AllocatorShopID uint `json:"allocator_shop_id" description:"分配者店铺ID0表示平台分配"`
AllocatorShopName string `json:"allocator_shop_name" description:"分配者店铺名称"`
OneTimeCommissionAmount int64 `json:"one_time_commission_amount" description:"该代理能拿的一次性佣金金额上限(分)"`
EnableOneTimeCommission bool `json:"enable_one_time_commission" description:"是否启用一次性佣金"`
OneTimeCommissionTrigger string `json:"one_time_commission_trigger" description:"一次性佣金触发类型"`
OneTimeCommissionThreshold int64 `json:"one_time_commission_threshold" description:"一次性佣金触发阈值(分)"`
EnableForceRecharge bool `json:"enable_force_recharge" description:"是否启用强制充值"`
ForceRechargeAmount int64 `json:"force_recharge_amount" description:"强制充值金额(分)"`
ForceRechargeTriggerType int `json:"force_recharge_trigger_type" description:"强充触发类型 (1:单次充值, 2:累计充值)"`
Status int `json:"status" description:"状态 (1:启用, 2:禁用)"`
CreatedAt string `json:"created_at" description:"创建时间"`
UpdatedAt string `json:"updated_at" description:"更新时间"`
}
type ShopSeriesAllocationPageResult struct {
List []*ShopSeriesAllocationResponse `json:"list" description:"分配列表"`
Total int64 `json:"total" description:"总数"`
Page int `json:"page" description:"当前页"`
PageSize int `json:"page_size" description:"每页数量"`
TotalPages int `json:"total_pages" description:"总页数"`
}
type UpdateShopSeriesAllocationParams struct {
IDReq
UpdateShopSeriesAllocationRequest
}

View File

@@ -0,0 +1,119 @@
package dto
// GrantPackageItem 授权套餐操作项(用于创建/管理套餐列表)
type GrantPackageItem struct {
PackageID uint `json:"package_id" validate:"required" description:"套餐ID"`
CostPrice int64 `json:"cost_price" validate:"required,min=0" description:"成本价(分)"`
Remove *bool `json:"remove,omitempty" description:"是否删除该套餐授权true=删除)"`
}
// ShopSeriesGrantPackageItem 授权套餐详情(响应中的套餐信息)
type ShopSeriesGrantPackageItem struct {
PackageID uint `json:"package_id" description:"套餐ID"`
PackageName string `json:"package_name" description:"套餐名称"`
PackageCode string `json:"package_code" description:"套餐编码"`
CostPrice int64 `json:"cost_price" description:"成本价(分)"`
ShelfStatus int `json:"shelf_status" description:"上架状态 1-上架 2-下架"`
Status int `json:"status" description:"分配状态 1-启用 2-禁用"`
}
// GrantCommissionTierItem 梯度佣金档位operator 仅出现在响应中,来自 PackageSeries 全局配置)
type GrantCommissionTierItem struct {
Operator string `json:"operator,omitempty" description:"比较运算符(>、>=、<、<=),响应中从 PackageSeries 合并,请求中不传"`
Threshold int64 `json:"threshold" description:"阈值(与 PackageSeries 全局配置对应)"`
Amount int64 `json:"amount" description:"该代理在此档位的佣金金额(分)"`
}
// ShopSeriesGrantResponse 系列授权详情响应
type ShopSeriesGrantResponse struct {
ID uint `json:"id" description:"授权记录ID"`
ShopID uint `json:"shop_id" description:"被授权店铺ID"`
ShopName string `json:"shop_name" description:"被授权店铺名称"`
SeriesID uint `json:"series_id" description:"套餐系列ID"`
SeriesName string `json:"series_name" description:"套餐系列名称"`
SeriesCode string `json:"series_code" description:"套餐系列编码"`
CommissionType string `json:"commission_type" description:"佣金类型 fixed-固定 tiered-梯度"`
OneTimeCommissionAmount int64 `json:"one_time_commission_amount" description:"固定模式佣金金额(分),梯度模式返回 0"`
CommissionTiers []GrantCommissionTierItem `json:"commission_tiers" description:"梯度模式阶梯列表(固定模式为空)"`
ForceRechargeLocked bool `json:"force_recharge_locked" description:"强充是否被平台锁定true 时代理不可修改)"`
ForceRechargeEnabled bool `json:"force_recharge_enabled" description:"是否启用强充"`
ForceRechargeAmount int64 `json:"force_recharge_amount" description:"强充金额(分)"`
AllocatorShopID uint `json:"allocator_shop_id" description:"分配者店铺ID0 表示平台"`
AllocatorShopName string `json:"allocator_shop_name" description:"分配者店铺名称"`
Status int `json:"status" description:"状态 1-启用 2-禁用"`
Packages []ShopSeriesGrantPackageItem `json:"packages" description:"已授权套餐列表"`
CreatedAt string `json:"created_at" description:"创建时间"`
UpdatedAt string `json:"updated_at" description:"更新时间"`
}
// CreateShopSeriesGrantRequest 创建系列授权请求
type CreateShopSeriesGrantRequest struct {
ShopID uint `json:"shop_id" validate:"required" description:"被授权代理店铺ID"`
SeriesID uint `json:"series_id" validate:"required" description:"套餐系列ID"`
OneTimeCommissionAmount *int64 `json:"one_time_commission_amount,omitempty" description:"固定模式佣金金额(分),固定模式必填"`
CommissionTiers []GrantCommissionTierItem `json:"commission_tiers,omitempty" description:"梯度模式阶梯配置,梯度模式必填"`
EnableForceRecharge *bool `json:"enable_force_recharge,omitempty" description:"是否启用代理强充"`
ForceRechargeAmount *int64 `json:"force_recharge_amount,omitempty" description:"代理强充金额(分)"`
Packages []GrantPackageItem `json:"packages,omitempty" description:"初始授权套餐列表"`
}
// UpdateShopSeriesGrantRequest 更新系列授权请求
type UpdateShopSeriesGrantRequest struct {
OneTimeCommissionAmount *int64 `json:"one_time_commission_amount,omitempty" description:"固定模式佣金金额(分)"`
CommissionTiers []GrantCommissionTierItem `json:"commission_tiers,omitempty" description:"梯度模式阶梯配置"`
EnableForceRecharge *bool `json:"enable_force_recharge,omitempty" description:"是否启用代理强充"`
ForceRechargeAmount *int64 `json:"force_recharge_amount,omitempty" description:"代理强充金额(分)"`
}
// ManageGrantPackagesRequest 管理授权套餐请求
type ManageGrantPackagesRequest struct {
Packages []GrantPackageItem `json:"packages" validate:"required,min=1" description:"套餐操作列表"`
}
// ShopSeriesGrantListRequest 系列授权列表查询请求
type ShopSeriesGrantListRequest struct {
Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码"`
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量"`
ShopID *uint `json:"shop_id" query:"shop_id" validate:"omitempty" description:"过滤被授权店铺ID"`
SeriesID *uint `json:"series_id" query:"series_id" validate:"omitempty" description:"过滤套餐系列ID"`
AllocatorShopID *uint `json:"allocator_shop_id" query:"allocator_shop_id" validate:"omitempty" description:"过滤分配者店铺ID"`
Status *int `json:"status" query:"status" validate:"omitempty" description:"过滤状态 1-启用 2-禁用"`
}
// ShopSeriesGrantListItem 系列授权列表项
type ShopSeriesGrantListItem struct {
ID uint `json:"id" description:"授权记录ID"`
ShopID uint `json:"shop_id" description:"被授权店铺ID"`
ShopName string `json:"shop_name" description:"被授权店铺名称"`
SeriesID uint `json:"series_id" description:"套餐系列ID"`
SeriesName string `json:"series_name" description:"套餐系列名称"`
CommissionType string `json:"commission_type" description:"佣金类型"`
OneTimeCommissionAmount int64 `json:"one_time_commission_amount" description:"固定模式佣金金额(分)"`
ForceRechargeEnabled bool `json:"force_recharge_enabled" description:"是否启用强充"`
AllocatorShopID uint `json:"allocator_shop_id" description:"分配者店铺ID"`
AllocatorShopName string `json:"allocator_shop_name" description:"分配者店铺名称"`
PackageCount int `json:"package_count" description:"已授权套餐数量"`
Status int `json:"status" description:"状态 1-启用 2-禁用"`
CreatedAt string `json:"created_at" description:"创建时间"`
}
// ShopSeriesGrantPageResult 系列授权分页结果
type ShopSeriesGrantPageResult struct {
List []*ShopSeriesGrantListItem `json:"list" description:"授权列表"`
Total int64 `json:"total" description:"总数"`
Page int `json:"page" description:"当前页"`
PageSize int `json:"page_size" description:"每页数量"`
TotalPages int `json:"total_pages" description:"总页数"`
}
// UpdateShopSeriesGrantParams 更新系列授权聚合参数(文档生成用)
type UpdateShopSeriesGrantParams struct {
IDReq
UpdateShopSeriesGrantRequest
}
// ManageGrantPackagesParams 管理授权套餐聚合参数(文档生成用)
type ManageGrantPackagesParams struct {
IDReq
ManageGrantPackagesRequest
}