diff --git a/internal/dao/bundleExtend.go b/internal/dao/bundleExtend.go index b82885b..9548662 100644 --- a/internal/dao/bundleExtend.go +++ b/internal/dao/bundleExtend.go @@ -183,34 +183,171 @@ func GetBundleBalanceByUserId(req *bundle.GetBundleBalanceByUserIdReq) (data mod return } -func AddBundleBalanceByUserId(data model.BundleBalance) error { +func AddBundleBalanceByUserId(data model.BundleBalanceUsePo) error { return app.ModuleClients.BundleDB.Transaction(func(tx *gorm.DB) error { oldData := model.BundleBalance{} if err := tx.Model(&model.BundleBalance{}).Where("user_id = ?", data.UserId).Order("created_at desc").First(&oldData).Error; err != nil { return errors.New("用户还没有套餐信息") } - newData := model.BundleBalance{ - Model: oldData.Model, - UserId: oldData.UserId, - OrderUUID: oldData.OrderUUID, - AccountNumber: oldData.AccountNumber + data.AccountNumber, - AccountConsumptionNumber: oldData.AccountConsumptionNumber + data.AccountConsumptionNumber, - VideoNumber: oldData.VideoNumber + data.VideoNumber, - VideoConsumptionNumber: oldData.VideoConsumptionNumber + data.VideoConsumptionNumber, - ImageNumber: oldData.ImageNumber + data.ImageNumber, - ImageConsumptionNumber: oldData.ImageConsumptionNumber + data.ImageConsumptionNumber, - DataAnalysisNumber: oldData.DataAnalysisNumber + data.DataAnalysisNumber, - DataAnalysisConsumptionNumber: oldData.DataAnalysisConsumptionNumber + data.DataAnalysisConsumptionNumber, - ExpansionPacksNumber: oldData.ExpansionPacksNumber + data.ExpansionPacksNumber, + + if data.AccountNumber > 0 { // 增加账号消耗数 + for range data.AccountNumber { + if oldData.BundleAccountConsumptionNumber < oldData.BundleAccountNumber { // 消耗账号数优先套餐内 + oldData.BundleAccountConsumptionNumber++ + continue + } + if oldData.IncreaseAccountConsumptionNumber < oldData.IncreaseAccountNumber { // 其次消耗增值的 + oldData.IncreaseAccountConsumptionNumber++ + continue + } + return errors.New("账号数不足") + } + } else { // 减少账号消耗数,用于解绑账号 + for range data.AccountNumber { + if oldData.IncreaseAccountConsumptionNumber > 0 { + oldData.IncreaseAccountConsumptionNumber-- + continue + } + if oldData.BundleAccountConsumptionNumber > 0 { + oldData.BundleAccountConsumptionNumber-- + continue + } + return errors.New("当前未绑定账号") + } } - if newData.AccountConsumptionNumber > newData.AccountNumber || - newData.VideoConsumptionNumber > newData.VideoNumber || - newData.ImageConsumptionNumber > newData.ImageNumber || - newData.DataAnalysisConsumptionNumber > newData.DataAnalysisNumber { - return errors.New("套餐余量不足") + for range data.VideoNumber { + if oldData.MonthlyLimitVideoConsumptionNumber < oldData.MonthlyLimitVideoNumber { // 限制类型视频可用额度充足 + if oldData.BundleLimitVideoExpiredConsumptionNumber < oldData.BundleLimitVideoExpiredNumber { // 套餐内会过期的限制类型视频充足 + oldData.BundleLimitVideoExpiredConsumptionNumber++ + oldData.MonthlyLimitVideoConsumptionNumber++ + continue + } + if oldData.IncreaseLimitVideoExpiredConsumptionNumber < oldData.IncreaseLimitVideoExpiredNumber { // 增值服务会过期的限制类型视频充足 + oldData.IncreaseLimitVideoExpiredConsumptionNumber++ + oldData.MonthlyLimitVideoConsumptionNumber++ + continue + } + if oldData.BundleLimitVideoConsumptionNumber < oldData.BundleLimitVideoNumber { // 套餐内不会过期的限制类型视频充足 + oldData.BundleLimitVideoConsumptionNumber++ + oldData.MonthlyLimitVideoConsumptionNumber++ + continue + } + if oldData.IncreaseLimitVideoConsumptionNumber < oldData.IncreaseLimitVideoNumber { // 增值服务不会过期的限制类型视频充足 + oldData.IncreaseLimitVideoConsumptionNumber++ + oldData.MonthlyLimitVideoConsumptionNumber++ + continue + } + } + if oldData.BundleLimitVideoNumber < oldData.BundleVideoNumber { //套餐内非限制类型的视频充足 + oldData.BundleLimitVideoNumber++ + continue + } + if oldData.IncreaseVideoConsumptionNumber < oldData.IncreaseVideoNumber { //增值服务非限制类型的视频充足 + oldData.IncreaseVideoConsumptionNumber++ + continue + } + if oldData.ManualVideoConsumptionNumber < oldData.ManualDataAnalysisNumber { // 手动扩展类型充足 + oldData.ManualVideoConsumptionNumber++ + oldData.MonthlyManualVideoConsumptionNumber++ // 记录本月使用的手动扩展 + continue + } + return errors.New("可用视频数不足") } - return tx.Model(&model.BundleBalance{}).Where("id = ?", oldData.ID).Save(&newData).Error + + for range data.ImageNumber { + if oldData.MonthlyLimitImageConsumptionNumber < oldData.MonthlyLimitImageNumber { // 限制类型图文可用额度充足 + if oldData.BundleLimitImageExpiredConsumptionNumber < oldData.BundleLimitImageExpiredNumber { // 套餐内会过期的限制类型图文充足 + oldData.BundleLimitImageExpiredConsumptionNumber++ + oldData.MonthlyLimitImageConsumptionNumber++ + continue + } + if oldData.IncreaseLimitImageExpiredConsumptionNumber < oldData.IncreaseLimitImageExpiredNumber { // 增值服务会过期的限制类型图文充足 + oldData.IncreaseLimitImageExpiredConsumptionNumber++ + oldData.MonthlyLimitImageConsumptionNumber++ + continue + } + if oldData.BundleLimitImageConsumptionNumber < oldData.BundleLimitImageNumber { // 套餐内不会过期的限制类型图文充足 + oldData.BundleLimitImageConsumptionNumber++ + oldData.MonthlyLimitImageConsumptionNumber++ + continue + } + if oldData.IncreaseLimitImageConsumptionNumber < oldData.IncreaseLimitImageNumber { // 增值服务不会过期的限制类型图文充足 + oldData.IncreaseLimitImageConsumptionNumber++ + oldData.MonthlyLimitImageConsumptionNumber++ + continue + } + } + if oldData.BundleLimitImageNumber < oldData.BundleImageNumber { //套餐内非限制类型的图文充足 + oldData.BundleLimitImageNumber++ + continue + } + if oldData.IncreaseImageConsumptionNumber < oldData.IncreaseImageNumber { //增值服务非限制类型的图文充足 + oldData.IncreaseImageConsumptionNumber++ + continue + } + if oldData.ManualImageConsumptionNumber < oldData.ManualDataAnalysisNumber { // 手动扩展类型充足 + oldData.ManualImageConsumptionNumber++ + oldData.MonthlyManualImageConsumptionNumber++ // 记录本月使用的手动扩展 + continue + } + return errors.New("可用图文数不足") + } + + for range data.DataAnalysisNumber { + if oldData.MonthlyLimitDataAnalysisConsumptionNumber < oldData.MonthlyLimitDataAnalysisNumber { // 限制类型数据分析可用额度充足 + if oldData.BundleLimitDataAnalysisExpiredConsumptionNumber < oldData.BundleLimitDataAnalysisExpiredNumber { // 套餐内会过期的限制类型数据分析充足 + oldData.BundleLimitDataAnalysisExpiredConsumptionNumber++ + oldData.MonthlyLimitDataAnalysisConsumptionNumber++ + continue + } + if oldData.IncreaseLimitDataAnalysisExpiredConsumptionNumber < oldData.IncreaseLimitDataAnalysisExpiredNumber { // 增值服务会过期的限制类型数据分析充足 + oldData.IncreaseLimitDataAnalysisExpiredConsumptionNumber++ + oldData.MonthlyLimitDataAnalysisConsumptionNumber++ + continue + } + if oldData.BundleLimitDataAnalysisConsumptionNumber < oldData.BundleLimitDataAnalysisNumber { // 套餐内不会过期的限制类型数据分析充足 + oldData.BundleLimitDataAnalysisConsumptionNumber++ + oldData.MonthlyLimitDataAnalysisConsumptionNumber++ + continue + } + if oldData.IncreaseLimitDataAnalysisConsumptionNumber < oldData.IncreaseLimitDataAnalysisNumber { // 增值服务不会过期的限制类型数据分析充足 + oldData.IncreaseLimitDataAnalysisConsumptionNumber++ + oldData.MonthlyLimitDataAnalysisConsumptionNumber++ + continue + } + } + if oldData.BundleLimitDataAnalysisNumber < oldData.BundleDataAnalysisNumber { //套餐内非限制类型的数据分析充足 + oldData.BundleLimitDataAnalysisNumber++ + continue + } + if oldData.IncreaseDataAnalysisConsumptionNumber < oldData.IncreaseDataAnalysisNumber { //增值服务非限制类型的数据分析充足 + oldData.IncreaseDataAnalysisConsumptionNumber++ + continue + } + if oldData.ManualDataAnalysisConsumptionNumber < oldData.ManualDataAnalysisNumber { // 手动扩展类型充足 + oldData.ManualDataAnalysisConsumptionNumber++ + oldData.MonthlyManualDataAnalysisConsumptionNumber++ // 记录本月使用的手动扩展 + continue + } + return errors.New("可用数据分析数不足") + } + return tx.Model(&model.BundleBalance{}).Where("id = ?", oldData.ID).Save(&oldData).Error + }) +} + +func ExtendBundleBalanceByUserId(data model.BundleBalanceExtendPo) error { + return app.ModuleClients.BundleDB.Transaction(func(tx *gorm.DB) error { + oldData := model.BundleBalance{} + if err := tx.Model(&model.BundleBalance{}).Where("user_id = ?", data.UserId).Order("created_at desc").First(&oldData).Error; err != nil { + return errors.New("用户还没有套餐信息") + } + oldData.ManualImageNumber += data.ImageNumber + oldData.ManualDataAnalysisNumber += data.DataAnalysisNumber + oldData.ManualVideoNumber += data.VideoNumber + oldData.MonthlyNewDurationNumber += data.DurationNumber // 记录本月新增手动扩展时长 + oldData.ExpiredAt.Add(time.Hour * 24 * time.Duration(data.DurationNumber)) + return tx.Model(&model.BundleBalance{}).Where("id = ?", oldData.ID).Save(&oldData).Error }) } diff --git a/internal/logic/bundleExtendLogic.go b/internal/logic/bundleExtendLogic.go index 1cec4ba..a58e4d6 100644 --- a/internal/logic/bundleExtendLogic.go +++ b/internal/logic/bundleExtendLogic.go @@ -17,13 +17,13 @@ func BundleExtend(req *bundle.BundleExtendRequest) (*bundle.BundleExtendResponse if err := copier.CopyWithOption(&data, req, copier.Option{DeepCopy: true}); err != nil { return nil, err } - if err := dao.AddBundleBalanceByUserId(model.BundleBalance{ - UserId: int(req.UserId), - VideoNumber: int(req.VideoAdditional), - ImageNumber: int(req.ImagesAdditional), - DataAnalysisNumber: int(req.DataAdditional), - AccountNumber: int(req.AccountAdditional), - ExpansionPacksNumber: 1, + if err := dao.ExtendBundleBalanceByUserId(model.BundleBalanceExtendPo{ + UserId: int(req.UserId), + VideoNumber: int(req.VideoAdditional), + ImageNumber: int(req.ImagesAdditional), + DataAnalysisNumber: int(req.DataAdditional), + AccountNumber: int(req.AccountAdditional), + DurationNumber: int(req.DataAdditional), }); err != nil { return nil, errors.New("用户没有余量信息") } @@ -93,7 +93,12 @@ func GetBundleBalanceByUserId(req *bundle.GetBundleBalanceByUserIdReq) (*bundle. } func AddBundleBalance(req *bundle.AddBundleBalanceReq) (*bundle.AddBundleBalanceResp, error) { - var data model.BundleBalance + data := model.BundleBalanceUsePo{ + AccountNumber: int(req.AccountConsumptionNumber), + ImageNumber: int(req.ImageConsumptionNumber), + VideoNumber: int(req.VideoConsumptionNumber), + DataAnalysisNumber: int(req.DataAnalysisConsumptionNumber), + } if err := copier.Copy(&data, req); err != nil { logger.Error(err) return nil, errors.New("操作失败") diff --git a/internal/model/bundle.go b/internal/model/bundle.go index d3b4db3..836f338 100644 --- a/internal/model/bundle.go +++ b/internal/model/bundle.go @@ -187,17 +187,88 @@ type UserBundleBalancePo struct { type BundleBalance struct { gorm.Model - UserId int `gorm:"column:user_id;not null"` - OrderUUID string `gorm:"column:order_uuid;type:varchar(1024);not null"` - AccountNumber int `gorm:"column:account_number;not null"` - AccountConsumptionNumber int `gorm:"column:account_consumption_number;not null"` - VideoNumber int `gorm:"column:video_number;not null"` - VideoConsumptionNumber int `gorm:"column:video_consumption_number;not null"` - ImageNumber int `gorm:"column:image_number;not null"` - ImageConsumptionNumber int `gorm:"column:image_consumption_number;not null"` - DataAnalysisNumber int `gorm:"column:data_analysis_number;not null"` - DataAnalysisConsumptionNumber int `gorm:"column:data_analysis_consumption_number;not null"` - ExpansionPacksNumber int `gorm:"column:expansion_packs_number;not null"` + UserId int `gorm:"column:user_id;not null"` + Month string `gorm:"column:month;type:varchar(32);not null"` + OrderUUID string `gorm:"column:order_uuid;type:varchar(1024);not null"` + ExpiredAt time.Time `gorm:"column:expired_at;type:datetime;not null;comment:套餐过期时间"` + StartAt time.Time `gorm:"column:start_at;type:datetime;not null;comment:套餐开始时间"` + BundleAccountNumber int `gorm:"column:bundle_account_number;not null;comment:套餐账号总数"` + IncreaseAccountNumber int `gorm:"column:increase_account_number;not null;comment:增值账号总数"` + BundleAccountConsumptionNumber int `gorm:"column:bundle_account_number;not null;comment:套餐账号使用数"` + IncreaseAccountConsumptionNumber int `gorm:"column:increase_account_number;not null;comment:增值账号使用数"` + + BundleVideoNumber int `gorm:"column:bundle_video_number;not null;comment:非限制类型套餐权益视频总数"` + IncreaseVideoNumber int `gorm:"column:increase_video_number;not null;comment:非限制类型增值权益视频总数"` + BundleLimitVideoNumber int `gorm:"column:bundle_limit_video_number;not null;comment:套餐权益限制类型非过期总数"` + IncreaseLimitVideoNumber int `gorm:"column:increase_limit_video_number;not null;comment:增值权益限制类型非过期总数"` + BundleLimitVideoExpiredNumber int `gorm:"column:bundle_limit_video_expired_number;not null;comment:套餐权益限制类型会过期总数"` + IncreaseLimitVideoExpiredNumber int `gorm:"column:increase_limit_video_expired_number;not null;comment:增值权益限制类型会过期总数"` + MonthlyInvalidBundleVideoNumber int `gorm:"column:monthly_invalid_bundle_video_number;not null;comment:当月失效的套餐权益视频总数"` + InvalidBundleVideoNumber int `gorm:"column:invalid_bundle_video_number;not null;comment:历史失效的套餐权益视频总数"` + MonthlyInvalidIncreaseVideoNumber int `gorm:"column:monthly_invalid_increase_video_number;not null;comment:当月失效的增值权益视频总数"` + InvalidIncreaseVideoNumber int `gorm:"column:invalid_increase_video_number;not null;comment:历史失效的增值权益视频总数"` + BundleVideoConsumptionNumber int `gorm:"column:bundle_video_consumption_number;not null;comment:非限制类型套餐权益视频使用数"` + IncreaseVideoConsumptionNumber int `gorm:"column:increase_video_consumption_number;not null;comment:非限制类型增值权益视频使用数"` + BundleLimitVideoConsumptionNumber int `gorm:"column:bundle_limit_video_consumption_number;not null;comment:套餐权益限制类型非过期使用数"` + IncreaseLimitVideoConsumptionNumber int `gorm:"column:increase_limit_video_consumption_number;not null;comment:增值权益限制类型非过期使用数"` + BundleLimitVideoExpiredConsumptionNumber int `gorm:"column:bundle_limit_video_expired_consumption_number;not null;comment:套餐权益限制类型会过期使用数"` + IncreaseLimitVideoExpiredConsumptionNumber int `gorm:"column:increase_limit_video_expired_consumption_number;not null;comment:增值权益限制类型会过期使用数"` + MonthlyLimitVideoNumber int `gorm:"column:monthly_limit_video_number;not null;comment:当月限制类型视频可使用额度"` + MonthlyLimitVideoConsumptionNumber int `gorm:"column:monthly_limit_video_consumption_number;not null;comment:当月限制类型视频已使用额度"` + ManualVideoNumber int `gorm:"column:manual_video_number;comment:手动扩展视频总数"` + ManualVideoConsumptionNumber int `gorm:"column:manual_video_consumption_number;comment:手动扩展视频使用数"` + MonthlyNewManualVideoNumber int `gorm:"column:monthly_new_manual_video_number;comment:当月手动扩展视频新增数"` + MonthlyManualVideoConsumptionNumber int `gorm:"column:monthly_manual_video_consumption_number;comment:当月手动扩展视频使用数"` + + BundleImageNumber int `gorm:"column:bundle_image_number;not null;comment:非限制类型套餐权益图片总数"` + IncreaseImageNumber int `gorm:"column:increase_image_number;not null;comment:非限制类型增值权益图片总数"` + BundleLimitImageNumber int `gorm:"column:bundle_limit_image_number;not null;comment:套餐权益限制类型非过期总数"` + IncreaseLimitImageNumber int `gorm:"column:increase_limit_image_number;not null;comment:增值权益限制类型非过期总数"` + BundleLimitImageExpiredNumber int `gorm:"column:bundle_limit_image_expired_number;not null;comment:套餐权益限制类型会过期总数"` + IncreaseLimitImageExpiredNumber int `gorm:"column:increase_limit_image_expired_number;not null;comment:增值权益限制类型会过期总数"` + MonthlyInvalidBundleImageNumber int `gorm:"column:monthly_invalid_bundle_image_number;not null;comment:当月失效的套餐权益图片总数"` + InvalidBundleImageNumber int `gorm:"column:invalid_bundle_image_number;not null;comment:历史失效的套餐权益图片总数"` + MonthlyInvalidIncreaseImageNumber int `gorm:"column:monthly_invalid_increase_image_number;not null;comment:当月失效的增值权益图片总数"` + InvalidIncreaseImageNumber int `gorm:"column:invalid_increase_image_number;not null;comment:历史失效的增值权益图片总数"` + BundleImageConsumptionNumber int `gorm:"column:bundle_image_consumption_number;not null;comment:非限制类型套餐权益图片使用数"` + IncreaseImageConsumptionNumber int `gorm:"column:increase_image_consumption_number;not null;comment:非限制类型增值权益图片使用数"` + BundleLimitImageConsumptionNumber int `gorm:"column:bundle_limit_image_consumption_number;not null;comment:套餐权益限制类型非过期使用数"` + IncreaseLimitImageConsumptionNumber int `gorm:"column:increase_limit_image_consumption_number;not null;comment:增值权益限制类型非过期使用数"` + BundleLimitImageExpiredConsumptionNumber int `gorm:"column:bundle_limit_image_expired_consumption_number;not null;comment:套餐权益限制类型会过期使用数"` + IncreaseLimitImageExpiredConsumptionNumber int `gorm:"column:increase_limit_image_expired_consumption_number;not null;comment:增值权益限制类型会过期使用数"` + MonthlyLimitImageNumber int `gorm:"column:monthly_limit_image_number;not null;comment:当月限制类型图片可使用额度"` + MonthlyLimitImageConsumptionNumber int `gorm:"column:monthly_limit_image_consumption_number;not null;comment:当月限制类型图片已使用额度"` + ManualImageNumber int `gorm:"column:manual_image_number;comment:手动扩展图片总数"` + ManualImageConsumptionNumber int `gorm:"column:manual_image_consumption_number;comment:手动扩展图片使用数"` + MonthlyNewManualImageNumber int `gorm:"column:monthly_new_manual_image_number;comment:当月手动扩展图片新增数"` + MonthlyManualImageConsumptionNumber int `gorm:"column:monthly_manual_image_consumption_number;comment:当月手动扩展图片使用数"` + + BundleDataAnalysisNumber int `gorm:"column:bundle_data_analysis_number;not null;comment:非限制类型套餐权益数据分析总数"` + IncreaseDataAnalysisNumber int `gorm:"column:increase_data_analysis_number;not null;comment:非限制类型增值权益数据分析总数"` + BundleLimitDataAnalysisNumber int `gorm:"column:bundle_limit_data_analysis_number;not null;comment:套餐权益限制类型非过期总数"` + IncreaseLimitDataAnalysisNumber int `gorm:"column:increase_limit_data_analysis_number;not null;comment:增值权益限制类型非过期总数"` + BundleLimitDataAnalysisExpiredNumber int `gorm:"column:bundle_limit_data_analysis_expired_number;not null;comment:套餐权益限制类型会过期总数"` + IncreaseLimitDataAnalysisExpiredNumber int `gorm:"column:increase_limit_data_analysis_expired_number;not null;comment:增值权益限制类型会过期总数"` + MonthlyInvalidBundleDataAnalysisNumber int `gorm:"column:monthly_invalid_bundle_data_analysis_number;not null;comment:当月失效的套餐权益数据分析总数"` + InvalidBundleDataAnalysisNumber int `gorm:"column:invalid_bundle_data_analysis_number;not null;comment:历史失效的套餐权益数据分析总数"` + MonthlyInvalidIncreaseDataAnalysisNumber int `gorm:"column:monthly_invalid_increase_data_analysis_number;not null;comment:当月失效的增值权益数据分析总数"` + InvalidIncreaseDataAnalysisNumber int `gorm:"column:invalid_increase_data_analysis_number;not null;comment:历史失效的增值权益数据分析总数"` + BundleDataAnalysisConsumptionNumber int `gorm:"column:bundle_data_analysis_consumption_number;not null;comment:非限制类型套餐权益数据分析使用数"` + IncreaseDataAnalysisConsumptionNumber int `gorm:"column:increase_data_analysis_consumption_number;not null;comment:非限制类型增值权益数据分析使用数"` + BundleLimitDataAnalysisConsumptionNumber int `gorm:"column:bundle_limit_data_analysis_consumption_number;not null;comment:套餐权益限制类型非过期使用数"` + IncreaseLimitDataAnalysisConsumptionNumber int `gorm:"column:increase_limit_data_analysis_consumption_number;not null;comment:增值权益限制类型非过期使用数"` + BundleLimitDataAnalysisExpiredConsumptionNumber int `gorm:"column:bundle_limit_data_analysis_expired_consumption_number;not null;comment:套餐权益限制类型会过期使用数"` + IncreaseLimitDataAnalysisExpiredConsumptionNumber int `gorm:"column:increase_limit_data_analysis_expired_consumption_number;not null;comment:增值权益限制类型会过期使用数"` + MonthlyLimitDataAnalysisNumber int `gorm:"column:monthly_limit_data_analysis_number;not null;comment:当月限制类型数据分析可使用额度"` + MonthlyLimitDataAnalysisConsumptionNumber int `gorm:"column:monthly_limit_data_analysis_consumption_number;not null;comment:当月限制类型数据分析已使用额度"` + ManualDataAnalysisNumber int `gorm:"column:manual_data_analysis_number;comment:手动扩展数据分析总数"` + ManualDataAnalysisConsumptionNumber int `gorm:"column:manual_data_analysis_consumption_number;comment:手动扩展数据分析使用数"` + MonthlyNewManualDataAnalysisNumber int `gorm:"column:monthly_new_manual_data_analysis_number;comment:当月手动扩展数据分析新增数"` + MonthlyManualDataAnalysisConsumptionNumber int `gorm:"column:monthly_manual_data_analysis_consumption_number;comment:当月手动扩展数据分析使用数"` + + MonthlyNewDurationNumber int `gorm:"column:monthly_new_duration_number;comment:当月新增手动扩展时长(天)"` + + ExpansionPacksNumber int `gorm:"column:expansion_packs_number;not null;comment:扩展包数量"` } // TableName 表名称 @@ -215,3 +286,19 @@ type BundleActivate struct { func (*BundleActivate) TableName() string { return "bundle_activate" } + +type BundleBalanceUsePo struct { + UserId int + AccountNumber int + VideoNumber int + ImageNumber int + DataAnalysisNumber int +} +type BundleBalanceExtendPo struct { + UserId int + AccountNumber int + VideoNumber int + ImageNumber int + DataAnalysisNumber int + DurationNumber int +}