feat: 实现账号与佣金管理模块
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 4m35s
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:
@@ -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"`
|
||||
}
|
||||
|
||||
|
||||
30
internal/model/asset_allocation_record.go
Normal file
30
internal/model/asset_allocation_record.go
Normal 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"
|
||||
}
|
||||
@@ -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"`
|
||||
|
||||
72
internal/model/commission_withdrawal_dto.go
Normal file
72
internal/model/commission_withdrawal_dto.go
Normal 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:"处理时间"`
|
||||
}
|
||||
31
internal/model/commission_withdrawal_setting_dto.go
Normal file
31
internal/model/commission_withdrawal_setting_dto.go
Normal 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:"每页数量"`
|
||||
}
|
||||
54
internal/model/customer_account_dto.go
Normal file
54
internal/model/customer_account_dto.go
Normal 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=启用)"`
|
||||
}
|
||||
@@ -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"`
|
||||
|
||||
24
internal/model/enterprise_card_authorization.go
Normal file
24
internal/model/enterprise_card_authorization.go
Normal 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"
|
||||
}
|
||||
115
internal/model/enterprise_card_authorization_dto.go
Normal file
115
internal/model/enterprise_card_authorization_dto.go
Normal 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:"每页数量"`
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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 指定表名
|
||||
|
||||
@@ -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"`
|
||||
|
||||
66
internal/model/my_commission_dto.go
Normal file
66
internal/model/my_commission_dto.go
Normal 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:"每页数量"`
|
||||
}
|
||||
134
internal/model/shop_commission_dto.go
Normal file
134
internal/model/shop_commission_dto.go
Normal 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"`
|
||||
}
|
||||
Reference in New Issue
Block a user