From e7d52db270b2cc13cfba6d2e1ad7fb085ec6443a Mon Sep 17 00:00:00 2001 From: huang Date: Wed, 4 Mar 2026 11:35:38 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=96=B0=E5=A2=9E=E7=B3=BB?= =?UTF-8?q?=E5=88=97=E6=8E=88=E6=9D=83=20DTO=EF=BC=8C=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=97=A7=E5=A5=97=E9=A4=90/=E7=B3=BB=E5=88=97=E5=88=86?= =?UTF-8?q?=E9=85=8D=20DTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 ShopSeriesGrantDTO(含 packages 列表聚合视图)、CreateShopSeriesGrantRequest(支持固定/梯度模式及强充配置)、UpdateShopSeriesGrantRequest、ManageGrantPackagesRequest 等请求/响应结构。删除已被 Grant 接口取代的 ShopSeriesAllocationDTO 和 ShopPackageAllocationDTO。 Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode) Co-authored-by: Sisyphus --- internal/model/dto/shop_package_allocation.go | 66 ---------- internal/model/dto/shop_series_allocation.go | 67 ---------- internal/model/dto/shop_series_grant_dto.go | 119 ++++++++++++++++++ 3 files changed, 119 insertions(+), 133 deletions(-) delete mode 100644 internal/model/dto/shop_package_allocation.go delete mode 100644 internal/model/dto/shop_series_allocation.go create mode 100644 internal/model/dto/shop_series_grant_dto.go diff --git a/internal/model/dto/shop_package_allocation.go b/internal/model/dto/shop_package_allocation.go deleted file mode 100644 index 17a7637..0000000 --- a/internal/model/dto/shop_package_allocation.go +++ /dev/null @@ -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:"分配者店铺ID,0表示平台分配"` - 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 -} diff --git a/internal/model/dto/shop_series_allocation.go b/internal/model/dto/shop_series_allocation.go deleted file mode 100644 index ee2d490..0000000 --- a/internal/model/dto/shop_series_allocation.go +++ /dev/null @@ -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:"分配者店铺ID,0表示平台分配"` - 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 -} diff --git a/internal/model/dto/shop_series_grant_dto.go b/internal/model/dto/shop_series_grant_dto.go new file mode 100644 index 0000000..3ee95b8 --- /dev/null +++ b/internal/model/dto/shop_series_grant_dto.go @@ -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:"分配者店铺ID,0 表示平台"` + 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 +}