Files
junhong_cmp_fiber/internal/model/dto/my_package.go
huang 1da680a790
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m18s
重构: 店铺套餐分配系统从加价模式改为返佣模式
主要变更:
- 重构分配模型:从加价模式(pricing_mode/pricing_value)改为返佣模式(base_commission + tier_commission)
- 删除独立的 my_package 接口,统一到 /api/admin/packages(通过数据权限自动过滤)
- 新增批量分配和批量调价功能,支持事务和性能优化
- 新增配置版本管理,订单创建时锁定返佣配置
- 新增成本价历史记录,支持审计和纠纷处理
- 新增统计缓存系统(Redis + 异步任务),优化梯度返佣计算性能
- 删除冗余的梯度佣金独立 CRUD 接口(合并到分配配置中)
- 归档 3 个已完成的 OpenSpec changes 并同步 8 个新 capabilities 到 main specs

技术细节:
- 数据库迁移:000026_refactor_shop_package_allocation
- 新增 Store:AllocationConfigStore, PriceHistoryStore, CommissionStatsStore
- 新增 Service:BatchAllocationService, BatchPricingService, CommissionStatsService
- 新增异步任务:统计更新、定时同步、周期归档
- 测试覆盖:批量操作集成测试、梯度佣金 CRUD 清理验证

影响:
- API 变更:删除 4 个梯度 CRUD 接口(POST/GET/PUT/DELETE /:id/tiers)
- API 新增:批量分配、批量调价接口
- 数据模型:重构 shop_series_allocation 表结构
- 性能优化:批量操作使用 CreateInBatches,统计使用 Redis 缓存

相关文档:
- openspec/changes/archive/2026-01-28-refactor-shop-package-allocation/
- openspec/specs/agent-available-packages/
- openspec/specs/allocation-config-versioning/
- 等 8 个新 capability specs
2026-01-28 17:11:55 +08:00

86 lines
5.3 KiB
Go

package dto
// MyPackageListRequest 我的可售套餐列表请求
type MyPackageListRequest 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:"每页数量"`
SeriesID *uint `json:"series_id" query:"series_id" validate:"omitempty" description:"套餐系列ID"`
PackageType *string `json:"package_type" query:"package_type" validate:"omitempty" description:"套餐类型"`
}
// MyPackageResponse 我的可售套餐响应
type MyPackageResponse struct {
ID uint `json:"id" description:"套餐ID"`
PackageCode string `json:"package_code" description:"套餐编码"`
PackageName string `json:"package_name" description:"套餐名称"`
PackageType string `json:"package_type" description:"套餐类型"`
SeriesID uint `json:"series_id" description:"套餐系列ID"`
SeriesName string `json:"series_name" description:"套餐系列名称"`
CostPrice int64 `json:"cost_price" description:"我的成本价(分)"`
SuggestedRetailPrice int64 `json:"suggested_retail_price" description:"建议售价(分)"`
ProfitMargin int64 `json:"profit_margin" description:"利润空间(分)= 建议售价 - 成本价"`
PriceSource string `json:"price_source" description:"价格来源 (series_pricing:系列加价, package_override:单套餐覆盖)"`
Status int `json:"status" description:"套餐状态 (1:启用, 2:禁用)"`
ShelfStatus int `json:"shelf_status" description:"上架状态 (1:上架, 2:下架)"`
}
// MyPackagePageResult 我的可售套餐分页结果
type MyPackagePageResult struct {
List []*MyPackageResponse `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:"总页数"`
}
// MyPackageDetailResponse 我的可售套餐详情响应
type MyPackageDetailResponse struct {
ID uint `json:"id" description:"套餐ID"`
PackageCode string `json:"package_code" description:"套餐编码"`
PackageName string `json:"package_name" description:"套餐名称"`
PackageType string `json:"package_type" description:"套餐类型"`
Description string `json:"description" description:"套餐描述"`
SeriesID uint `json:"series_id" description:"套餐系列ID"`
SeriesName string `json:"series_name" description:"套餐系列名称"`
CostPrice int64 `json:"cost_price" description:"我的成本价(分)"`
SuggestedRetailPrice int64 `json:"suggested_retail_price" description:"建议售价(分)"`
ProfitMargin int64 `json:"profit_margin" description:"利润空间(分)"`
PriceSource string `json:"price_source" description:"价格来源 (series_pricing:系列加价, package_override:单套餐覆盖)"`
Status int `json:"status" description:"套餐状态 (1:启用, 2:禁用)"`
ShelfStatus int `json:"shelf_status" description:"上架状态 (1:上架, 2:下架)"`
}
// MySeriesAllocationListRequest 我的套餐系列分配列表请求
type MySeriesAllocationListRequest 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:"每页数量"`
}
// MySeriesAllocationResponse 我的套餐系列分配响应
type MySeriesAllocationResponse struct {
ID uint `json:"id" description:"分配ID"`
SeriesID uint `json:"series_id" description:"套餐系列ID"`
SeriesCode string `json:"series_code" description:"系列编码"`
SeriesName string `json:"series_name" description:"系列名称"`
BaseCommissionMode string `json:"base_commission_mode" description:"基础佣金模式 (fixed:固定金额, percent:百分比)"`
BaseCommissionValue int64 `json:"base_commission_value" description:"基础佣金值"`
AvailablePackageCount int `json:"available_package_count" description:"可售套餐数量"`
AllocatorShopName string `json:"allocator_shop_name" description:"分配者店铺名称"`
Status int `json:"status" description:"状态 (1:启用, 2:禁用)"`
}
// MySeriesAllocationPageResult 我的套餐系列分配分页结果
type MySeriesAllocationPageResult struct {
List []*MySeriesAllocationResponse `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:"总页数"`
}
// PriceSource 价格来源常量
const (
PriceSourceSeriesPricing = "series_pricing"
PriceSourcePackageOverride = "package_override"
)