feat(recharge): 新增充值服务和 DTO
- 实现 RechargeService 完整充值业务逻辑 - 创建充值订单、预检强充要求 - 支付回调处理、幂等性检查 - 累计充值更新、一次性佣金触发 - 新增 RechargeDTO 请求/响应结构 - CreateRechargeRequest、RechargeResponse - RechargeListRequest/Response、RechargeCheckRequest/Response - 完整的单元测试覆盖(1488 行) - 强充要求检查、支付回调、佣金发放等场景 - 事务处理、幂等性验证 Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
107
internal/model/dto/recharge.go
Normal file
107
internal/model/dto/recharge.go
Normal file
@@ -0,0 +1,107 @@
|
||||
package dto
|
||||
|
||||
import "time"
|
||||
|
||||
// CreateRechargeRequest 创建充值订单请求
|
||||
type CreateRechargeRequest struct {
|
||||
// 资源类型: iot_card-物联网卡 device-设备
|
||||
ResourceType string `json:"resource_type" validate:"required,oneof=iot_card device" description:"资源类型"`
|
||||
// 资源ID(卡ID或设备ID)
|
||||
ResourceID uint `json:"resource_id" validate:"required,min=1" description:"资源ID"`
|
||||
// 充值金额(分)
|
||||
Amount int64 `json:"amount" validate:"required,min=100,max=10000000" description:"充值金额(分)"`
|
||||
// 支付方式: wechat-微信 alipay-支付宝
|
||||
PaymentMethod string `json:"payment_method" validate:"required,oneof=wechat alipay" description:"支付方式"`
|
||||
}
|
||||
|
||||
// RechargeResponse 充值订单响应
|
||||
type RechargeResponse struct {
|
||||
// 充值订单ID
|
||||
ID uint `json:"id" description:"充值订单ID"`
|
||||
// 充值订单号
|
||||
RechargeNo string `json:"recharge_no" description:"充值订单号"`
|
||||
// 用户ID
|
||||
UserID uint `json:"user_id" description:"用户ID"`
|
||||
// 钱包ID
|
||||
WalletID uint `json:"wallet_id" description:"钱包ID"`
|
||||
// 充值金额(分)
|
||||
Amount int64 `json:"amount" description:"充值金额(分)"`
|
||||
// 支付方式
|
||||
PaymentMethod string `json:"payment_method" description:"支付方式"`
|
||||
// 支付渠道
|
||||
PaymentChannel *string `json:"payment_channel,omitempty" description:"支付渠道"`
|
||||
// 第三方支付交易号
|
||||
PaymentTransactionID *string `json:"payment_transaction_id,omitempty" description:"第三方支付交易号"`
|
||||
// 充值状态: 1-待支付 2-已支付 3-已完成 4-已关闭 5-已退款
|
||||
Status int `json:"status" description:"充值状态"`
|
||||
// 状态文本
|
||||
StatusText string `json:"status_text" description:"状态文本"`
|
||||
// 支付时间
|
||||
PaidAt *time.Time `json:"paid_at,omitempty" description:"支付时间"`
|
||||
// 完成时间
|
||||
CompletedAt *time.Time `json:"completed_at,omitempty" description:"完成时间"`
|
||||
// 创建时间
|
||||
CreatedAt time.Time `json:"created_at" description:"创建时间"`
|
||||
// 更新时间
|
||||
UpdatedAt time.Time `json:"updated_at" description:"更新时间"`
|
||||
}
|
||||
|
||||
// RechargeListRequest 充值订单列表请求
|
||||
type RechargeListRequest struct {
|
||||
// 页码(从1开始)
|
||||
Page int `json:"page" form:"page" description:"页码"`
|
||||
// 每页数量
|
||||
PageSize int `json:"page_size" form:"page_size" description:"每页数量"`
|
||||
// 钱包ID筛选
|
||||
WalletID *uint `json:"wallet_id" form:"wallet_id" description:"钱包ID"`
|
||||
// 状态筛选
|
||||
Status *int `json:"status" form:"status" description:"状态"`
|
||||
// 开始时间
|
||||
StartTime *time.Time `json:"start_time" form:"start_time" description:"开始时间"`
|
||||
// 结束时间
|
||||
EndTime *time.Time `json:"end_time" form:"end_time" description:"结束时间"`
|
||||
}
|
||||
|
||||
// RechargeListResponse 充值订单列表响应
|
||||
type RechargeListResponse struct {
|
||||
// 列表数据
|
||||
List []*RechargeResponse `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:"总页数"`
|
||||
}
|
||||
|
||||
// RechargeCheckRequest 充值预检请求
|
||||
type RechargeCheckRequest struct {
|
||||
// 资源类型: iot_card-物联网卡 device-设备
|
||||
ResourceType string `json:"resource_type" query:"resource_type" validate:"required,oneof=iot_card device" description:"资源类型"`
|
||||
// 资源ID(卡ID或设备ID)
|
||||
ResourceID uint `json:"resource_id" query:"resource_id" validate:"required,min=1" description:"资源ID"`
|
||||
}
|
||||
|
||||
// RechargeCheckResponse 充值预检响应
|
||||
type RechargeCheckResponse struct {
|
||||
// 是否需要强充
|
||||
NeedForceRecharge bool `json:"need_force_recharge" description:"是否需要强充"`
|
||||
// 强充金额(分)
|
||||
ForceRechargeAmount int64 `json:"force_recharge_amount" description:"强充金额(分)"`
|
||||
// 触发类型: single_recharge-单次充值 accumulated_recharge-累计充值
|
||||
TriggerType string `json:"trigger_type" description:"触发类型"`
|
||||
// 最小充值金额(分)
|
||||
MinAmount int64 `json:"min_amount" description:"最小充值金额(分)"`
|
||||
// 最大充值金额(分)
|
||||
MaxAmount int64 `json:"max_amount" description:"最大充值金额(分)"`
|
||||
// 当前累计充值金额(分)
|
||||
CurrentAccumulated int64 `json:"current_accumulated" description:"当前累计充值金额(分)"`
|
||||
// 佣金触发阈值(分)
|
||||
Threshold int64 `json:"threshold" description:"佣金触发阈值(分)"`
|
||||
// 提示信息
|
||||
Message string `json:"message" description:"提示信息"`
|
||||
// 一次性佣金是否已发放
|
||||
FirstCommissionPaid bool `json:"first_commission_paid" description:"一次性佣金是否已发放"`
|
||||
}
|
||||
Reference in New Issue
Block a user