feat: 实现账号与佣金管理模块
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 4m35s

新增功能:
- 店铺佣金查询:店铺佣金统计、店铺佣金记录列表、店铺提现记录
- 佣金提现审批:提现申请列表、审批通过、审批拒绝
- 提现配置管理:配置列表、新增配置、获取当前生效配置
- 企业管理:企业列表、创建、更新、删除、获取详情
- 企业卡授权:授权列表、批量授权、批量取消授权、统计
- 客户账号管理:账号列表、创建、更新状态、重置密码
- 我的佣金:佣金统计、佣金记录、提现申请、提现记录

数据库变更:
- 扩展 tb_commission_withdrawal_request 新增提现单号等字段
- 扩展 tb_account 新增 is_primary 字段
- 扩展 tb_commission_record 新增 shop_id、balance_after
- 扩展 tb_commission_withdrawal_setting 新增每日提现次数限制
- 扩展 tb_iot_card、tb_device 新增 shop_id 冗余字段
- 新建 tb_enterprise_card_authorization 企业卡授权表
- 新建 tb_asset_allocation_record 资产分配记录表
- 数据迁移:owner_type 枚举值 agent 统一为 shop

测试:
- 新增 7 个单元测试文件覆盖各服务
- 修复集成测试 Redis 依赖问题
This commit is contained in:
2026-01-21 18:20:44 +08:00
parent 1489abe668
commit 91c9bbfeb8
89 changed files with 11958 additions and 159 deletions

View File

@@ -10,10 +10,11 @@ type Account struct {
BaseModel `gorm:"embedded"`
Username string `gorm:"column:username;type:varchar(50);uniqueIndex:idx_account_username,where:deleted_at IS NULL;not null;comment:用户名" json:"username"`
Phone string `gorm:"column:phone;type:varchar(20);uniqueIndex:idx_account_phone,where:deleted_at IS NULL;not null;comment:手机号" json:"phone"`
Password string `gorm:"column:password;type:varchar(255);not null;comment:密码" json:"-"` // 不返回给客户端
Password string `gorm:"column:password;type:varchar(255);not null;comment:密码" json:"-"`
UserType int `gorm:"column:user_type;type:int;not null;index;comment:用户类型 1=超级管理员 2=平台用户 3=代理账号 4=企业账号" json:"user_type"`
ShopID *uint `gorm:"column:shop_id;index;comment:店铺ID代理账号必填" json:"shop_id,omitempty"`
EnterpriseID *uint `gorm:"column:enterprise_id;index;comment:企业ID企业账号必填" json:"enterprise_id,omitempty"`
IsPrimary bool `gorm:"column:is_primary;type:boolean;default:false;comment:是否为店铺主账号(默认 false" json:"is_primary"`
Status int `gorm:"column:status;type:int;not null;default:1;comment:状态 0=禁用 1=启用" json:"status"`
}

View File

@@ -0,0 +1,30 @@
package model
import (
"gorm.io/datatypes"
"gorm.io/gorm"
)
// AssetAllocationRecord 资产分配记录模型
// 记录卡/设备在平台和代理商之间的流转历史
type AssetAllocationRecord struct {
gorm.Model
BaseModel `gorm:"embedded"`
AllocationNo string `gorm:"column:allocation_no;type:varchar(50);uniqueIndex:uk_asset_allocation_no,where:deleted_at IS NULL;not null;comment:分配单号(唯一)" json:"allocation_no"`
AllocationType string `gorm:"column:allocation_type;type:varchar(20);index;not null;comment:分配类型 allocate=分配 recall=回收" json:"allocation_type"`
AssetType string `gorm:"column:asset_type;type:varchar(20);index;not null;comment:资产类型 iot_card=物联网卡 device=设备" json:"asset_type"`
AssetID uint `gorm:"column:asset_id;index;not null;comment:资产ID" json:"asset_id"`
AssetIdentifier string `gorm:"column:asset_identifier;type:varchar(50);not null;comment:资产标识符ICCID或设备号" json:"asset_identifier"`
FromOwnerType string `gorm:"column:from_owner_type;type:varchar(20);comment:来源所有者类型" json:"from_owner_type"`
FromOwnerID *uint `gorm:"column:from_owner_id;comment:来源所有者ID" json:"from_owner_id,omitempty"`
ToOwnerType string `gorm:"column:to_owner_type;type:varchar(20);not null;comment:目标所有者类型" json:"to_owner_type"`
ToOwnerID uint `gorm:"column:to_owner_id;not null;comment:目标所有者ID" json:"to_owner_id"`
RelatedDeviceID *uint `gorm:"column:related_device_id;comment:关联设备ID" json:"related_device_id,omitempty"`
RelatedCardIDs datatypes.JSON `gorm:"column:related_card_ids;type:jsonb;comment:关联卡ID列表" json:"related_card_ids,omitempty"`
OperatorID uint `gorm:"column:operator_id;not null;comment:操作人ID" json:"operator_id"`
Remark string `gorm:"column:remark;type:text;comment:备注" json:"remark"`
}
func (AssetAllocationRecord) TableName() string {
return "tb_asset_allocation_record"
}

View File

@@ -91,10 +91,12 @@ type CommissionRecord struct {
gorm.Model
BaseModel `gorm:"embedded"`
AgentID uint `gorm:"column:agent_id;index;not null;comment:代理用户ID" json:"agent_id"`
ShopID uint `gorm:"column:shop_id;index;comment:店铺ID佣金主要跟着店铺走" json:"shop_id"`
OrderID uint `gorm:"column:order_id;index;not null;comment:订单ID" json:"order_id"`
RuleID uint `gorm:"column:rule_id;index;not null;comment:分佣规则ID" json:"rule_id"`
CommissionType string `gorm:"column:commission_type;type:varchar(50);not null;comment:分佣类型 one_time-一次性 long_term-长期" json:"commission_type"`
Amount int64 `gorm:"column:amount;type:bigint;not null;comment:分佣金额(分为单位)" json:"amount"`
BalanceAfter int64 `gorm:"column:balance_after;type:bigint;default:0;comment:入账后佣金余额(分)" json:"balance_after"`
Status int `gorm:"column:status;type:int;default:1;not null;comment:状态 1-已冻结 2-解冻中 3-已发放 4-已失效" json:"status"`
UnfrozenAt *time.Time `gorm:"column:unfrozen_at;comment:解冻时间" json:"unfrozen_at"`
ReleasedAt *time.Time `gorm:"column:released_at;comment:发放时间" json:"released_at"`

View File

@@ -0,0 +1,72 @@
package model
// WithdrawalRequestListReq 提现申请列表查询请求
type WithdrawalRequestListReq struct {
Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码默认1"`
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量默认20最大100"`
Status *int `json:"status" query:"status" validate:"omitempty,min=1,max=4" minimum:"1" maximum:"4" description:"状态 (1:待审核, 2:已通过, 3:已拒绝, 4:已到账)"`
WithdrawalNo string `json:"withdrawal_no" query:"withdrawal_no" validate:"omitempty,max=50" maxLength:"50" description:"提现单号(精确查询)"`
ShopName string `json:"shop_name" query:"shop_name" validate:"omitempty,max=100" maxLength:"100" description:"店铺名称(模糊查询)"`
StartTime string `json:"start_time" query:"start_time" validate:"omitempty" description:"申请开始时间格式2006-01-02 15:04:05"`
EndTime string `json:"end_time" query:"end_time" validate:"omitempty" description:"申请结束时间格式2006-01-02 15:04:05"`
}
// WithdrawalRequestItem 提现申请列表项
type WithdrawalRequestItem struct {
ID uint `json:"id" description:"提现申请ID"`
WithdrawalNo string `json:"withdrawal_no" description:"提现单号"`
Amount int64 `json:"amount" description:"提现金额(分)"`
FeeRate int64 `json:"fee_rate" description:"手续费比率基点100=1%"`
Fee int64 `json:"fee" description:"手续费(分)"`
ActualAmount int64 `json:"actual_amount" description:"实际到账金额(分)"`
Status int `json:"status" description:"状态 (1:待审核, 2:已通过, 3:已拒绝, 4:已到账)"`
StatusName string `json:"status_name" description:"状态名称"`
ShopID uint `json:"shop_id" description:"店铺ID"`
ShopName string `json:"shop_name" description:"店铺名称"`
ShopHierarchy string `json:"shop_hierarchy" description:"店铺层级路径"`
ApplicantID uint `json:"applicant_id" description:"申请人账号ID"`
ApplicantName string `json:"applicant_name" description:"申请人用户名"`
ProcessorID *uint `json:"processor_id,omitempty" description:"处理人账号ID"`
ProcessorName string `json:"processor_name,omitempty" description:"处理人用户名"`
WithdrawalMethod string `json:"withdrawal_method" description:"提现方式 (alipay:支付宝, wechat:微信, bank:银行卡)"`
PaymentType string `json:"payment_type" description:"放款类型 (manual:人工打款)"`
AccountName string `json:"account_name" description:"收款账户名称"`
AccountNumber string `json:"account_number" description:"收款账号"`
BankName string `json:"bank_name,omitempty" description:"银行名称"`
RejectReason string `json:"reject_reason,omitempty" description:"拒绝原因"`
Remark string `json:"remark,omitempty" description:"备注"`
CreatedAt string `json:"created_at" description:"申请时间"`
ProcessedAt string `json:"processed_at,omitempty" description:"处理时间"`
}
// WithdrawalRequestPageResult 提现申请列表分页响应
type WithdrawalRequestPageResult struct {
Items []WithdrawalRequestItem `json:"items" description:"提现申请列表"`
Total int64 `json:"total" description:"总记录数"`
Page int `json:"page" description:"当前页码"`
Size int `json:"size" description:"每页数量"`
}
// ApproveWithdrawalReq 审批通过提现申请请求
type ApproveWithdrawalReq struct {
PaymentType string `json:"payment_type" validate:"required,oneof=manual" required:"true" description:"放款类型目前只支持manual人工打款"`
Amount *int64 `json:"amount" validate:"omitempty,min=1" minimum:"1" description:"修正后的提现金额(分),不填则使用原金额"`
WithdrawalMethod *string `json:"withdrawal_method" validate:"omitempty,oneof=alipay wechat bank" description:"修正后的收款类型 (alipay:支付宝, wechat:微信, bank:银行卡)"`
AccountName *string `json:"account_name" validate:"omitempty,max=100" maxLength:"100" description:"修正后的收款人姓名"`
AccountNumber *string `json:"account_number" validate:"omitempty,max=100" maxLength:"100" description:"修正后的收款账号"`
Remark string `json:"remark" validate:"omitempty,max=500" maxLength:"500" description:"备注"`
}
// RejectWithdrawalReq 拒绝提现申请请求
type RejectWithdrawalReq struct {
Remark string `json:"remark" validate:"required,max=500" required:"true" maxLength:"500" description:"拒绝原因(必填)"`
}
// WithdrawalApprovalResp 审批响应
type WithdrawalApprovalResp struct {
ID uint `json:"id" description:"提现申请ID"`
WithdrawalNo string `json:"withdrawal_no" description:"提现单号"`
Status int `json:"status" description:"状态 (1:待审核, 2:已通过, 3:已拒绝, 4:已到账)"`
StatusName string `json:"status_name" description:"状态名称"`
ProcessedAt string `json:"processed_at" description:"处理时间"`
}

View File

@@ -0,0 +1,31 @@
package model
type CreateWithdrawalSettingReq struct {
DailyWithdrawalLimit int `json:"daily_withdrawal_limit" validate:"required,min=1,max=100" required:"true" minimum:"1" maximum:"100" description:"每日提现次数限制"`
MinWithdrawalAmount int64 `json:"min_withdrawal_amount" validate:"required,min=1" required:"true" minimum:"1" description:"最低提现金额(分)"`
FeeRate int64 `json:"fee_rate" validate:"required,min=0,max=10000" required:"true" minimum:"0" maximum:"10000" description:"手续费比率基点100=1%"`
}
type WithdrawalSettingListReq struct {
Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码默认1"`
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量默认20最大100"`
}
type WithdrawalSettingItem struct {
ID uint `json:"id" description:"配置ID"`
DailyWithdrawalLimit int `json:"daily_withdrawal_limit" description:"每日提现次数限制"`
MinWithdrawalAmount int64 `json:"min_withdrawal_amount" description:"最低提现金额(分)"`
FeeRate int64 `json:"fee_rate" description:"手续费比率基点100=1%"`
ArrivalDays int `json:"arrival_days" description:"到账天数"`
IsActive bool `json:"is_active" description:"是否生效"`
CreatorID uint `json:"creator_id" description:"创建人ID"`
CreatorName string `json:"creator_name" description:"创建人用户名"`
CreatedAt string `json:"created_at" description:"创建时间"`
}
type WithdrawalSettingPageResult struct {
Items []WithdrawalSettingItem `json:"items" description:"配置列表"`
Total int64 `json:"total" description:"总记录数"`
Page int `json:"page" description:"当前页码"`
Size int `json:"size" description:"每页数量"`
}

View File

@@ -0,0 +1,54 @@
package model
type CustomerAccountListReq 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:"每页数量"`
Username string `json:"username" query:"username" description:"用户名(模糊查询)"`
Phone string `json:"phone" query:"phone" description:"手机号(模糊查询)"`
UserType *int `json:"user_type" query:"user_type" description:"用户类型3=代理账号, 4=企业账号)"`
ShopID *uint `json:"shop_id" query:"shop_id" description:"店铺ID"`
EnterpriseID *uint `json:"enterprise_id" query:"enterprise_id" description:"企业ID"`
Status *int `json:"status" query:"status" description:"状态0=禁用, 1=启用)"`
}
type CustomerAccountItem struct {
ID uint `json:"id" description:"账号ID"`
Username string `json:"username" description:"用户名"`
Phone string `json:"phone" description:"手机号"`
UserType int `json:"user_type" description:"用户类型3=代理账号, 4=企业账号)"`
UserTypeName string `json:"user_type_name" description:"用户类型名称"`
ShopID *uint `json:"shop_id,omitempty" description:"店铺ID"`
ShopName string `json:"shop_name" description:"店铺名称"`
EnterpriseID *uint `json:"enterprise_id,omitempty" description:"企业ID"`
EnterpriseName string `json:"enterprise_name" description:"企业名称"`
Status int `json:"status" description:"状态0=禁用, 1=启用)"`
StatusName string `json:"status_name" description:"状态名称"`
CreatedAt string `json:"created_at" description:"创建时间"`
}
type CustomerAccountPageResult struct {
Items []CustomerAccountItem `json:"items" description:"账号列表"`
Total int64 `json:"total" description:"总记录数"`
Page int `json:"page" description:"当前页码"`
Size int `json:"size" description:"每页数量"`
}
type CreateCustomerAccountReq struct {
Username string `json:"username" validate:"required,min=2,max=50" required:"true" minimum:"2" maximum:"50" description:"用户名"`
Phone string `json:"phone" validate:"required,len=11" required:"true" description:"手机号"`
Password string `json:"password" validate:"required,min=6,max=20" required:"true" minimum:"6" maximum:"20" description:"密码"`
ShopID uint `json:"shop_id" validate:"required" required:"true" description:"店铺ID"`
}
type UpdateCustomerAccountReq struct {
Username *string `json:"username" validate:"omitempty,min=2,max=50" minimum:"2" maximum:"50" description:"用户名"`
Phone *string `json:"phone" validate:"omitempty,len=11" description:"手机号"`
}
type UpdateCustomerAccountPasswordReq struct {
Password string `json:"password" validate:"required,min=6,max=20" required:"true" minimum:"6" maximum:"20" description:"新密码"`
}
type UpdateCustomerAccountStatusReq struct {
Status int `json:"status" validate:"required,oneof=0 1" required:"true" enum:"0,1" description:"状态0=禁用, 1=启用)"`
}

View File

@@ -7,7 +7,7 @@ import (
)
// Device 设备模型
// 用户的物联网设备(如 GPS 追踪器、智能传感器)
// 物联网设备(如 GPS 追踪器、智能传感器)
// 可绑定 1-4 张 IoT 卡,主要用于批量管理和设备操作
type Device struct {
gorm.Model
@@ -19,8 +19,9 @@ type Device struct {
MaxSimSlots int `gorm:"column:max_sim_slots;type:int;default:4;comment:最大插槽数量(默认4)" json:"max_sim_slots"`
Manufacturer string `gorm:"column:manufacturer;type:varchar(255);comment:制造商" json:"manufacturer"`
BatchNo string `gorm:"column:batch_no;type:varchar(100);comment:批次号" json:"batch_no"`
OwnerType string `gorm:"column:owner_type;type:varchar(20);default:'platform';not null;comment:所有者类型 platform-平台 agent-代理 user-用户" json:"owner_type"`
OwnerType string `gorm:"column:owner_type;type:varchar(20);default:'platform';not null;comment:所有者类型 platform-平台 shop-店铺" json:"owner_type"`
OwnerID uint `gorm:"column:owner_id;index;default:0;not null;comment:所有者ID" json:"owner_id"`
ShopID *uint `gorm:"column:shop_id;index;comment:店铺ID冗余字段方便查询" json:"shop_id,omitempty"`
Status int `gorm:"column:status;type:int;default:1;not null;comment:状态 1-在库 2-已分销 3-已激活 4-已停用" json:"status"`
ActivatedAt *time.Time `gorm:"column:activated_at;comment:激活时间" json:"activated_at"`
DeviceUsername string `gorm:"column:device_username;type:varchar(100);comment:设备登录用户名" json:"device_username"`

View File

@@ -0,0 +1,24 @@
package model
import (
"time"
"gorm.io/gorm"
)
// EnterpriseCardAuthorization 企业卡授权模型
// 记录企业被授权可见的卡卡的归属owner始终是代理商店铺
type EnterpriseCardAuthorization struct {
gorm.Model
BaseModel `gorm:"embedded"`
EnterpriseID uint `gorm:"column:enterprise_id;index;not null;comment:企业ID" json:"enterprise_id"`
IotCardID uint `gorm:"column:iot_card_id;index;not null;comment:IoT卡ID" json:"iot_card_id"`
ShopID uint `gorm:"column:shop_id;index;not null;comment:店铺ID授权方" json:"shop_id"`
AuthorizedBy uint `gorm:"column:authorized_by;not null;comment:授权人ID" json:"authorized_by"`
AuthorizedAt *time.Time `gorm:"column:authorized_at;default:now();comment:授权时间" json:"authorized_at"`
Status int `gorm:"column:status;type:int;default:1;comment:状态 1=有效 0=已回收" json:"status"`
}
func (EnterpriseCardAuthorization) TableName() string {
return "tb_enterprise_card_authorization"
}

View File

@@ -0,0 +1,115 @@
package model
type AllocateCardsPreviewReq struct {
ICCIDs []string `json:"iccids" validate:"required,min=1,max=1000,dive,required" required:"true" description:"需要授权的 ICCID 列表最多1000个"`
}
type StandaloneCard struct {
ICCID string `json:"iccid" description:"ICCID"`
IotCardID uint `json:"iot_card_id" description:"卡ID"`
MSISDN string `json:"msisdn" description:"手机号"`
CarrierID uint `json:"carrier_id" description:"运营商ID"`
StatusName string `json:"status_name" description:"状态名称"`
}
type DeviceBundle struct {
DeviceID uint `json:"device_id" description:"设备ID"`
DeviceNo string `json:"device_no" description:"设备号"`
TriggerCard DeviceBundleCard `json:"trigger_card" description:"触发卡(用户选择的卡)"`
BundleCards []DeviceBundleCard `json:"bundle_cards" description:"连带卡(同设备的其他卡)"`
}
type DeviceBundleCard struct {
ICCID string `json:"iccid" description:"ICCID"`
IotCardID uint `json:"iot_card_id" description:"卡ID"`
MSISDN string `json:"msisdn" description:"手机号"`
}
type FailedItem struct {
ICCID string `json:"iccid" description:"ICCID"`
Reason string `json:"reason" description:"失败原因"`
}
type AllocatePreviewSummary struct {
StandaloneCardCount int `json:"standalone_card_count" description:"独立卡数量"`
DeviceCount int `json:"device_count" description:"设备数量"`
DeviceCardCount int `json:"device_card_count" description:"设备卡数量"`
TotalCardCount int `json:"total_card_count" description:"总卡数量"`
FailedCount int `json:"failed_count" description:"失败数量"`
}
type AllocateCardsPreviewResp struct {
StandaloneCards []StandaloneCard `json:"standalone_cards" description:"可直接授权的卡(未绑定设备)"`
DeviceBundles []DeviceBundle `json:"device_bundles" description:"需要整体授权的设备包"`
FailedItems []FailedItem `json:"failed_items" description:"失败的卡"`
Summary AllocatePreviewSummary `json:"summary" description:"汇总信息"`
}
type AllocateCardsReq struct {
ICCIDs []string `json:"iccids" validate:"required,min=1,max=1000,dive,required" required:"true" description:"需要授权的 ICCID 列表"`
ConfirmDeviceBundles bool `json:"confirm_device_bundles" description:"确认整体授权设备下所有卡"`
}
type AllocatedDevice struct {
DeviceID uint `json:"device_id" description:"设备ID"`
DeviceNo string `json:"device_no" description:"设备号"`
CardCount int `json:"card_count" description:"卡数量"`
ICCIDs []string `json:"iccids" description:"卡ICCID列表"`
}
type AllocateCardsResp struct {
SuccessCount int `json:"success_count" description:"成功数量"`
FailCount int `json:"fail_count" description:"失败数量"`
FailedItems []FailedItem `json:"failed_items" description:"失败详情"`
AllocatedDevices []AllocatedDevice `json:"allocated_devices" description:"连带授权的设备列表"`
}
type RecallCardsReq struct {
ICCIDs []string `json:"iccids" validate:"required,min=1,max=1000,dive,required" required:"true" description:"需要回收授权的 ICCID 列表"`
}
type RecalledDevice struct {
DeviceID uint `json:"device_id" description:"设备ID"`
DeviceNo string `json:"device_no" description:"设备号"`
CardCount int `json:"card_count" description:"卡数量"`
ICCIDs []string `json:"iccids" description:"卡ICCID列表"`
}
type RecallCardsResp struct {
SuccessCount int `json:"success_count" description:"成功数量"`
FailCount int `json:"fail_count" description:"失败数量"`
FailedItems []FailedItem `json:"failed_items" description:"失败详情"`
RecalledDevices []RecalledDevice `json:"recalled_devices" description:"连带回收的设备列表"`
}
type EnterpriseCardListReq 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:"每页数量"`
Status *int `json:"status" query:"status" description:"卡状态"`
CarrierID *uint `json:"carrier_id" query:"carrier_id" description:"运营商ID"`
ICCID string `json:"iccid" query:"iccid" description:"ICCID模糊查询"`
DeviceNo string `json:"device_no" query:"device_no" description:"设备号(模糊查询)"`
}
type EnterpriseCardItem struct {
ID uint `json:"id" description:"卡ID"`
ICCID string `json:"iccid" description:"ICCID"`
MSISDN string `json:"msisdn" description:"手机号"`
DeviceID *uint `json:"device_id,omitempty" description:"设备ID"`
DeviceNo string `json:"device_no" description:"设备号"`
CarrierID uint `json:"carrier_id" description:"运营商ID"`
CarrierName string `json:"carrier_name" description:"运营商名称"`
PackageID *uint `json:"package_id,omitempty" description:"套餐ID"`
PackageName string `json:"package_name" description:"套餐名称"`
Status int `json:"status" description:"状态"`
StatusName string `json:"status_name" description:"状态名称"`
NetworkStatus int `json:"network_status" description:"网络状态"`
NetworkStatusName string `json:"network_status_name" description:"网络状态名称"`
}
type EnterpriseCardPageResult struct {
Items []EnterpriseCardItem `json:"items" description:"卡列表"`
Total int64 `json:"total" description:"总记录数"`
Page int `json:"page" description:"当前页码"`
Size int `json:"size" description:"每页数量"`
}

View File

@@ -1,49 +1,90 @@
package model
// CreateEnterpriseRequest 创建企业请求
type CreateEnterpriseRequest struct {
EnterpriseName string `json:"enterprise_name" validate:"required" required:"true" description:"企业名称"`
EnterpriseCode string `json:"enterprise_code" description:"企业编号"`
type CreateEnterpriseReq struct {
EnterpriseName string `json:"enterprise_name" validate:"required,max=100" required:"true" maximum:"100" description:"企业名称"`
EnterpriseCode string `json:"enterprise_code" validate:"required,max=50" required:"true" maximum:"50" description:"企业编号(唯一)"`
OwnerShopID *uint `json:"owner_shop_id" description:"归属店铺ID可不填则归属平台"`
LegalPerson string `json:"legal_person" description:"法人代表"`
ContactName string `json:"contact_name" description:"联系人姓名"`
ContactPhone string `json:"contact_phone" description:"联系人电话"`
BusinessLicense string `json:"business_license" description:"营业执照号"`
Province string `json:"province" description:"省份"`
City string `json:"city" description:"城市"`
District string `json:"district" description:"区县"`
Address string `json:"address" description:"详细地址"`
LegalPerson string `json:"legal_person" validate:"max=50" maximum:"50" description:"法人代表"`
ContactName string `json:"contact_name" validate:"required,max=50" required:"true" maximum:"50" description:"联系人姓名"`
ContactPhone string `json:"contact_phone" validate:"required,max=20" required:"true" maximum:"20" description:"联系人电话"`
LoginPhone string `json:"login_phone" validate:"required,len=11" required:"true" description:"登录手机号(作为企业账号)"`
Password string `json:"password" validate:"required,min=6,max=20" required:"true" minimum:"6" maximum:"20" description:"登录密码"`
BusinessLicense string `json:"business_license" validate:"max=100" maximum:"100" description:"营业执照号"`
Province string `json:"province" validate:"max=50" maximum:"50" description:"省份"`
City string `json:"city" validate:"max=50" maximum:"50" description:"城市"`
District string `json:"district" validate:"max=50" maximum:"50" description:"区县"`
Address string `json:"address" validate:"max=255" maximum:"255" description:"详细地址"`
}
// UpdateEnterpriseRequest 更新企业请求
type UpdateEnterpriseRequest struct {
EnterpriseName *string `json:"enterprise_name" description:"企业名称"`
EnterpriseCode *string `json:"enterprise_code" description:"企业编号"`
LegalPerson *string `json:"legal_person" description:"法人代表"`
ContactName *string `json:"contact_name" description:"联系人姓名"`
ContactPhone *string `json:"contact_phone" description:"联系人电话"`
BusinessLicense *string `json:"business_license" description:"营业执照号"`
Province *string `json:"province" description:"省份"`
City *string `json:"city" description:"城市"`
District *string `json:"district" description:"区县"`
Address *string `json:"address" description:"详细地址"`
type UpdateEnterpriseReq struct {
OwnerShopID *uint `json:"owner_shop_id" description:"归属店铺ID"`
EnterpriseName *string `json:"enterprise_name" validate:"omitempty,max=100" maximum:"100" description:"企业名称"`
EnterpriseCode *string `json:"enterprise_code" validate:"omitempty,max=50" maximum:"50" description:"企业编号"`
LegalPerson *string `json:"legal_person" validate:"omitempty,max=50" maximum:"50" description:"法人代表"`
ContactName *string `json:"contact_name" validate:"omitempty,max=50" maximum:"50" description:"联系人姓名"`
ContactPhone *string `json:"contact_phone" validate:"omitempty,max=20" maximum:"20" description:"联系人电话"`
BusinessLicense *string `json:"business_license" validate:"omitempty,max=100" maximum:"100" description:"营业执照号"`
Province *string `json:"province" validate:"omitempty,max=50" maximum:"50" description:"省份"`
City *string `json:"city" validate:"omitempty,max=50" maximum:"50" description:"城市"`
District *string `json:"district" validate:"omitempty,max=50" maximum:"50" description:"区县"`
Address *string `json:"address" validate:"omitempty,max=255" maximum:"255" description:"详细地址"`
}
// EnterpriseResponse 企业响应
type EnterpriseResponse struct {
type EnterpriseListReq struct {
Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码默认1"`
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量默认20最大100"`
EnterpriseName string `json:"enterprise_name" query:"enterprise_name" description:"企业名称(模糊查询)"`
LoginPhone string `json:"login_phone" query:"login_phone" description:"登录手机号(模糊查询)"`
ContactPhone string `json:"contact_phone" query:"contact_phone" description:"联系人电话(模糊查询)"`
OwnerShopID *uint `json:"owner_shop_id" query:"owner_shop_id" description:"归属店铺ID"`
Status *int `json:"status" query:"status" description:"状态0=禁用, 1=启用)"`
}
type EnterpriseItem struct {
ID uint `json:"id" description:"企业ID"`
EnterpriseName string `json:"enterprise_name" description:"企业名称"`
EnterpriseCode string `json:"enterprise_code" description:"企业编号"`
OwnerShopID *uint `json:"owner_shop_id,omitempty" description:"归属店铺ID"`
OwnerShopName string `json:"owner_shop_name" description:"归属店铺名称"`
LegalPerson string `json:"legal_person" description:"法人代表"`
ContactName string `json:"contact_name" description:"联系人姓名"`
ContactPhone string `json:"contact_phone" description:"联系人电话"`
LoginPhone string `json:"login_phone" description:"登录手机号"`
BusinessLicense string `json:"business_license" description:"营业执照号"`
Province string `json:"province" description:"省份"`
City string `json:"city" description:"城市"`
District string `json:"district" description:"区县"`
Address string `json:"address" description:"详细地址"`
Status int `json:"status" description:"状态 (0:禁用, 1:启用)"`
Status int `json:"status" description:"状态0=禁用, 1=启用"`
StatusName string `json:"status_name" description:"状态名称"`
CreatedAt string `json:"created_at" description:"创建时间"`
UpdatedAt string `json:"updated_at" description:"更新时间"`
}
type EnterprisePageResult struct {
Items []EnterpriseItem `json:"items" description:"企业列表"`
Total int64 `json:"total" description:"总记录数"`
Page int `json:"page" description:"当前页码"`
Size int `json:"size" description:"每页数量"`
}
type UpdateEnterpriseStatusReq struct {
Status int `json:"status" validate:"required,oneof=0 1" required:"true" enum:"0,1" description:"状态0=禁用, 1=启用)"`
}
type UpdateEnterprisePasswordReq struct {
Password string `json:"password" validate:"required,min=6,max=20" required:"true" minimum:"6" maximum:"20" description:"新密码"`
}
type CreateEnterpriseResp struct {
Enterprise EnterpriseItem `json:"enterprise" description:"企业信息"`
AccountID uint `json:"account_id" description:"账号ID"`
}
// CreateEnterpriseRequest 创建企业请求(兼容旧接口)
type CreateEnterpriseRequest = CreateEnterpriseReq
// UpdateEnterpriseRequest 更新企业请求(兼容旧接口)
type UpdateEnterpriseRequest = UpdateEnterpriseReq
// EnterpriseResponse 企业响应(兼容旧接口)
type EnterpriseResponse = EnterpriseItem

View File

@@ -12,17 +12,25 @@ import (
type CommissionWithdrawalRequest struct {
gorm.Model
BaseModel `gorm:"embedded"`
WithdrawalNo string `gorm:"column:withdrawal_no;type:varchar(50);uniqueIndex:uk_commission_withdrawal_no,where:deleted_at IS NULL AND withdrawal_no IS NOT NULL;comment:提现单号唯一格式W + 时间戳 + 随机数)" json:"withdrawal_no"`
AgentID uint `gorm:"column:agent_id;index;not null;comment:代理用户ID" json:"agent_id"`
ApplicantID uint `gorm:"column:applicant_id;index;comment:申请人账号ID" json:"applicant_id"`
ShopID uint `gorm:"column:shop_id;index;comment:店铺ID冗余字段" json:"shop_id"`
Amount int64 `gorm:"column:amount;type:bigint;not null;comment:提现金额(分为单位)" json:"amount"`
Fee int64 `gorm:"column:fee;type:bigint;default:0;comment:手续费(分为单位)" json:"fee"`
FeeRate int64 `gorm:"column:fee_rate;type:bigint;default:0;comment:手续费比率基点100=1%,快照)" json:"fee_rate"`
ActualAmount int64 `gorm:"column:actual_amount;type:bigint;comment:实际到账金额(分为单位)" json:"actual_amount"`
WithdrawalMethod string `gorm:"column:withdrawal_method;type:varchar(20);comment:提现方式 alipay-支付宝 wechat-微信 bank-银行卡" json:"withdrawal_method"`
PaymentType string `gorm:"column:payment_type;type:varchar(20);default:'manual';comment:放款类型manual=人工打款)" json:"payment_type"`
AccountInfo datatypes.JSON `gorm:"column:account_info;type:jsonb;comment:收款账户信息(姓名、账号等)" json:"account_info"`
Status int `gorm:"column:status;type:int;default:1;comment:状态 1-待审核 2-已通过 3-已拒绝 4-已到账" json:"status"`
ApprovedBy uint `gorm:"column:approved_by;index;comment:审批人用户ID" json:"approved_by"`
ApprovedAt *time.Time `gorm:"column:approved_at;comment:审批时间" json:"approved_at"`
ProcessorID uint `gorm:"column:processor_id;index;comment:处理人ID" json:"processor_id"`
ProcessedAt *time.Time `gorm:"column:processed_at;comment:处理时间" json:"processed_at"`
PaidAt *time.Time `gorm:"column:paid_at;comment:到账时间" json:"paid_at"`
RejectReason string `gorm:"column:reject_reason;type:text;comment:拒绝原因" json:"reject_reason"`
Remark string `gorm:"column:remark;type:text;comment:备注" json:"remark"`
}
// TableName 指定表名
@@ -34,11 +42,12 @@ func (CommissionWithdrawalRequest) TableName() string {
// 提现参数配置(最低金额、手续费率、到账时间等)
type CommissionWithdrawalSetting struct {
gorm.Model
BaseModel `gorm:"embedded"`
MinWithdrawalAmount int64 `gorm:"column:min_withdrawal_amount;type:bigint;comment:最低提现金额(分为单位)" json:"min_withdrawal_amount"`
FeeRate int64 `gorm:"column:fee_rate;type:bigint;comment:手续费率(万分比,如100表示1%)" json:"fee_rate"`
ArrivalDays int `gorm:"column:arrival_days;type:int;comment:到账天数" json:"arrival_days"`
IsActive bool `gorm:"column:is_active;type:boolean;default:true;comment:是否生效(最新一条)" json:"is_active"`
BaseModel `gorm:"embedded"`
MinWithdrawalAmount int64 `gorm:"column:min_withdrawal_amount;type:bigint;comment:最低提现金额(分为单位)" json:"min_withdrawal_amount"`
FeeRate int64 `gorm:"column:fee_rate;type:bigint;comment:手续费率(万分比,如100表示1%)" json:"fee_rate"`
ArrivalDays int `gorm:"column:arrival_days;type:int;comment:到账天数" json:"arrival_days"`
DailyWithdrawalLimit int `gorm:"column:daily_withdrawal_limit;type:int;default:3;comment:每日提现次数限制" json:"daily_withdrawal_limit"`
IsActive bool `gorm:"column:is_active;type:boolean;default:true;comment:是否生效(最新一条)" json:"is_active"`
}
// TableName 指定表名

View File

@@ -8,7 +8,7 @@ import (
// IotCard IoT 卡模型
// 物联网卡/流量卡的统一管理实体
// 支持平台自营、代理分销、用户购买等所有权模式
// 支持平台自营、代理分销等所有权模式
type IotCard struct {
gorm.Model
BaseModel `gorm:"embedded"`
@@ -23,8 +23,9 @@ type IotCard struct {
CostPrice int64 `gorm:"column:cost_price;type:bigint;default:0;comment:成本价(分为单位)" json:"cost_price"`
DistributePrice int64 `gorm:"column:distribute_price;type:bigint;default:0;comment:分销价(分为单位)" json:"distribute_price"`
Status int `gorm:"column:status;type:int;default:1;not null;comment:状态 1-在库 2-已分销 3-已激活 4-已停用" json:"status"`
OwnerType string `gorm:"column:owner_type;type:varchar(20);default:'platform';not null;comment:所有者类型 platform-平台 agent-代理 user-用户 device-设备" json:"owner_type"`
OwnerType string `gorm:"column:owner_type;type:varchar(20);default:'platform';not null;comment:所有者类型 platform-平台 shop-店铺" json:"owner_type"`
OwnerID uint `gorm:"column:owner_id;index;default:0;not null;comment:所有者ID" json:"owner_id"`
ShopID *uint `gorm:"column:shop_id;index;comment:店铺ID冗余字段方便查询" json:"shop_id,omitempty"`
ActivatedAt *time.Time `gorm:"column:activated_at;comment:激活时间" json:"activated_at"`
ActivationStatus int `gorm:"column:activation_status;type:int;default:0;not null;comment:激活状态 0-未激活 1-已激活" json:"activation_status"`
RealNameStatus int `gorm:"column:real_name_status;type:int;default:0;not null;comment:实名状态 0-未实名 1-已实名(行业卡可以保持0)" json:"real_name_status"`

View File

@@ -0,0 +1,66 @@
package model
type MyCommissionSummaryResp struct {
ShopID uint `json:"shop_id" description:"店铺ID"`
ShopName string `json:"shop_name" description:"店铺名称"`
TotalCommission int64 `json:"total_commission" description:"累计佣金(分)"`
WithdrawnCommission int64 `json:"withdrawn_commission" description:"已提现佣金(分)"`
UnwithdrawCommission int64 `json:"unwithdraw_commission" description:"未提现佣金(分)"`
FrozenCommission int64 `json:"frozen_commission" description:"冻结佣金(分)"`
WithdrawingCommission int64 `json:"withdrawing_commission" description:"提现中佣金(分)"`
AvailableCommission int64 `json:"available_commission" description:"可提现佣金(分)"`
}
type CreateMyWithdrawalReq struct {
Amount int64 `json:"amount" validate:"required,min=1" required:"true" minimum:"1" description:"提现金额(分)"`
WithdrawalMethod string `json:"withdrawal_method" validate:"required,oneof=alipay" required:"true" enum:"alipay" description:"收款类型"`
AccountName string `json:"account_name" validate:"required,max=50" required:"true" maximum:"50" description:"收款人姓名"`
AccountNumber string `json:"account_number" validate:"required,max=100" required:"true" maximum:"100" description:"收款账号"`
}
type CreateMyWithdrawalResp struct {
ID uint `json:"id" description:"提现申请ID"`
WithdrawalNo string `json:"withdrawal_no" description:"提现单号"`
Amount int64 `json:"amount" description:"提现金额(分)"`
FeeRate int64 `json:"fee_rate" description:"手续费比率(基点)"`
Fee int64 `json:"fee" description:"手续费(分)"`
ActualAmount int64 `json:"actual_amount" description:"实际到账金额(分)"`
Status int `json:"status" description:"状态"`
StatusName string `json:"status_name" description:"状态名称"`
CreatedAt string `json:"created_at" description:"申请时间"`
}
type MyWithdrawalListReq 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:"每页数量"`
Status *int `json:"status" query:"status" description:"状态1=待审批, 2=已通过, 3=已拒绝)"`
StartTime string `json:"start_time" query:"start_time" description:"申请开始时间"`
EndTime string `json:"end_time" query:"end_time" description:"申请结束时间"`
}
type MyCommissionRecordListReq 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:"每页数量"`
CommissionType *string `json:"commission_type" query:"commission_type" description:"佣金类型"`
ICCID string `json:"iccid" query:"iccid" description:"ICCID模糊查询"`
DeviceNo string `json:"device_no" query:"device_no" description:"设备号(模糊查询)"`
OrderNo string `json:"order_no" query:"order_no" description:"订单号(模糊查询)"`
}
type MyCommissionRecordItem struct {
ID uint `json:"id" description:"佣金记录ID"`
ShopID uint `json:"shop_id" description:"店铺ID"`
OrderID uint `json:"order_id" description:"订单ID"`
CommissionType string `json:"commission_type" description:"佣金类型 (one_time:一次性, long_term:长期)"`
Amount int64 `json:"amount" description:"佣金金额(分)"`
Status int `json:"status" description:"状态 (1:已冻结, 2:解冻中, 3:已发放, 4:已失效)"`
StatusName string `json:"status_name" description:"状态名称"`
CreatedAt string `json:"created_at" description:"创建时间"`
}
type MyCommissionRecordPageResult struct {
Items []MyCommissionRecordItem `json:"items" description:"佣金记录列表"`
Total int64 `json:"total" description:"总记录数"`
Page int `json:"page" description:"当前页码"`
Size int `json:"size" description:"每页数量"`
}

View File

@@ -0,0 +1,134 @@
package model
// ========================================
// 代理商佣金查询 DTO
// ========================================
// ShopCommissionSummaryListReq 代理商佣金列表查询请求
type ShopCommissionSummaryListReq struct {
Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码默认1"`
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量默认20最大100"`
ShopName string `json:"shop_name" query:"shop_name" validate:"omitempty,max=100" maxLength:"100" description:"店铺名称(模糊查询)"`
Username string `json:"username" query:"username" validate:"omitempty,max=50" maxLength:"50" description:"主账号用户名(模糊查询)"`
}
// ShopCommissionSummaryItem 代理商佣金汇总项
type ShopCommissionSummaryItem struct {
ShopID uint `json:"shop_id" description:"店铺ID"`
ShopName string `json:"shop_name" description:"店铺名称"`
ShopCode string `json:"shop_code" description:"店铺编码"`
Username string `json:"username" description:"主账号用户名"`
Phone string `json:"phone" description:"主账号手机号"`
TotalCommission int64 `json:"total_commission" description:"总佣金(分)"`
WithdrawnCommission int64 `json:"withdrawn_commission" description:"已提现佣金(分)"`
UnwithdrawCommission int64 `json:"unwithdraw_commission" description:"未提现佣金(分)"`
FrozenCommission int64 `json:"frozen_commission" description:"冻结中佣金(分)"`
WithdrawingCommission int64 `json:"withdrawing_commission" description:"提现中佣金(分)"`
AvailableCommission int64 `json:"available_commission" description:"可提现佣金(分)"`
CreatedAt string `json:"created_at" description:"店铺创建时间"`
}
// ShopCommissionSummaryPageResult 代理商佣金列表分页响应
type ShopCommissionSummaryPageResult struct {
Items []ShopCommissionSummaryItem `json:"items" description:"代理商佣金列表"`
Total int64 `json:"total" description:"总记录数"`
Page int `json:"page" description:"当前页码"`
Size int `json:"size" description:"每页数量"`
}
// ========================================
// 代理商提现记录查询 DTO
// ========================================
// ShopWithdrawalRequestListReq 代理商提现记录查询请求
type ShopWithdrawalRequestListReq struct {
Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码默认1"`
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量默认20最大100"`
WithdrawalNo string `json:"withdrawal_no" query:"withdrawal_no" validate:"omitempty,max=50" maxLength:"50" description:"提现单号(精确查询)"`
StartTime string `json:"start_time" query:"start_time" validate:"omitempty" description:"申请开始时间格式2006-01-02 15:04:05"`
EndTime string `json:"end_time" query:"end_time" validate:"omitempty" description:"申请结束时间格式2006-01-02 15:04:05"`
}
// ShopWithdrawalRequestItem 代理商提现记录项
type ShopWithdrawalRequestItem struct {
ID uint `json:"id" description:"提现申请ID"`
WithdrawalNo string `json:"withdrawal_no" description:"提现单号"`
Amount int64 `json:"amount" description:"提现金额(分)"`
FeeRate int64 `json:"fee_rate" description:"手续费比率基点100=1%"`
Fee int64 `json:"fee" description:"手续费(分)"`
ActualAmount int64 `json:"actual_amount" description:"实际到账金额(分)"`
Status int `json:"status" description:"状态 (1:待审核, 2:已通过, 3:已拒绝, 4:已到账)"`
StatusName string `json:"status_name" description:"状态名称"`
ShopID uint `json:"shop_id" description:"店铺ID"`
ShopName string `json:"shop_name" description:"店铺名称"`
ShopHierarchy string `json:"shop_hierarchy" description:"店铺层级路径格式上上级_上级_本身最多两层上级"`
ApplicantID uint `json:"applicant_id" description:"申请人账号ID"`
ApplicantName string `json:"applicant_name" description:"申请人用户名"`
ProcessorID *uint `json:"processor_id,omitempty" description:"处理人账号ID"`
ProcessorName string `json:"processor_name,omitempty" description:"处理人用户名"`
WithdrawalMethod string `json:"withdrawal_method" description:"提现方式 (alipay:支付宝, wechat:微信, bank:银行卡)"`
PaymentType string `json:"payment_type" description:"放款类型 (manual:人工打款)"`
AccountName string `json:"account_name" description:"收款账户名称"`
AccountNumber string `json:"account_number" description:"收款账号"`
BankName string `json:"bank_name,omitempty" description:"银行名称(银行卡提现时)"`
RejectReason string `json:"reject_reason,omitempty" description:"拒绝原因"`
Remark string `json:"remark,omitempty" description:"备注"`
CreatedAt string `json:"created_at" description:"申请时间"`
ProcessedAt string `json:"processed_at,omitempty" description:"处理时间"`
PaidAt string `json:"paid_at,omitempty" description:"到账时间"`
}
// ShopWithdrawalRequestPageResult 代理商提现记录分页响应
type ShopWithdrawalRequestPageResult struct {
Items []ShopWithdrawalRequestItem `json:"items" description:"提现记录列表"`
Total int64 `json:"total" description:"总记录数"`
Page int `json:"page" description:"当前页码"`
Size int `json:"size" description:"每页数量"`
}
// ========================================
// 代理商佣金明细查询 DTO
// ========================================
// ShopCommissionRecordListReq 代理商佣金明细查询请求
type ShopCommissionRecordListReq struct {
Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码默认1"`
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量默认20最大100"`
CommissionType string `json:"commission_type" query:"commission_type" validate:"omitempty,oneof=one_time long_term" description:"佣金类型 (one_time:一次性, long_term:长期)"`
ICCID string `json:"iccid" query:"iccid" validate:"omitempty,max=50" maxLength:"50" description:"ICCID模糊查询"`
DeviceNo string `json:"device_no" query:"device_no" validate:"omitempty,max=50" maxLength:"50" description:"设备号(模糊查询)"`
OrderNo string `json:"order_no" query:"order_no" validate:"omitempty,max=50" maxLength:"50" description:"订单号(模糊查询)"`
}
// ShopCommissionRecordItem 代理商佣金明细项
type ShopCommissionRecordItem struct {
ID uint `json:"id" description:"佣金记录ID"`
Amount int64 `json:"amount" description:"佣金金额(分)"`
BalanceAfter int64 `json:"balance_after" description:"入账后佣金余额(分)"`
CommissionType string `json:"commission_type" description:"佣金类型 (one_time:一次性, long_term:长期)"`
Status int `json:"status" description:"状态 (1:已冻结, 2:解冻中, 3:已发放, 4:已失效)"`
StatusName string `json:"status_name" description:"状态名称"`
OrderID uint `json:"order_id" description:"订单ID"`
OrderNo string `json:"order_no" description:"订单号"`
DeviceNo string `json:"device_no,omitempty" description:"设备号"`
ICCID string `json:"iccid,omitempty" description:"ICCID"`
OrderCreatedAt string `json:"order_created_at" description:"订单创建时间"`
CreatedAt string `json:"created_at" description:"佣金入账时间"`
}
// ShopCommissionRecordPageResult 代理商佣金明细分页响应
type ShopCommissionRecordPageResult struct {
Items []ShopCommissionRecordItem `json:"items" description:"佣金明细列表"`
Total int64 `json:"total" description:"总记录数"`
Page int `json:"page" description:"当前页码"`
Size int `json:"size" description:"每页数量"`
}
// ========================================
// 路由参数 DTO
// ========================================
// ShopIDPathParam 店铺ID路径参数
type ShopIDPathParam struct {
ShopID uint `path:"shop_id" description:"店铺ID" required:"true"`
}