package logic import ( "encoding/json" "errors" "micro-bundle/internal/dao" "micro-bundle/internal/model" "micro-bundle/pb/bundle" "strconv" "time" "dubbo.apache.org/dubbo-go/v3/common/logger" "github.com/jinzhu/copier" "github.com/samber/lo" ) func BundleExtend(req *bundle.BundleExtendRequest) (*bundle.BundleExtendResponse, error) { data := model.BundleExtensionRecords{} if err := copier.CopyWithOption(&data, req, copier.Option{DeepCopy: true}); err != nil { return nil, err } 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("用户没有余量信息") } err := dao.AddBundleExtendRecord(data) if err != nil { logger.Error(err) return nil, errors.New("创建扩展记录失败") } return nil, nil } func BundleExtendRecordsList(req *bundle.BundleExtendRecordsListRequest) (*bundle.BundleExtendRecordsListResponse, error) { data, total, err := dao.GetBundleExtendRecordList(req) if err != nil { logger.Error(err) return nil, errors.New("查询失败") } resp := &bundle.BundleExtendRecordsListResponse{} resp.Total = total resp.Data = lo.Map(data, func(m model.BundleExtendRecordItemPo, _ int) *bundle.BundleExtendRecordItem { result := &bundle.BundleExtendRecordItem{} copier.Copy(result, &m) result.CreatedAt = uint64(m.CreatedAt.UnixMilli()) return result }) return resp, nil } func GetBundleBalanceList(req *bundle.GetBundleBalanceListReq) (*bundle.GetBundleBalanceListResp, error) { data, total, err := dao.GetBundleBalanceList(req) if err != nil { logger.Error(err) return nil, errors.New("查询失败") } resp := &bundle.GetBundleBalanceListResp{} resp.Total = total date, err := time.Parse("2006-01", req.Month) if err != nil { return nil, errors.New("请求时间有误") } resp.Data = lo.Map(data, func(m model.BundleBalancePo, _ int) *bundle.BundleBalanceItem { result := &bundle.BundleBalanceItem{ UserId: int32(m.UserId), UserName: m.UserName, UserPhoneNumber: m.UserPhoneNumber, CustomerNum: m.CustomerNum, PayTime: m.PayTime, StartTime: m.StartAt.UnixMilli(), Status: int32(m.Status), BundleName: m.BundleName, Month: req.Month, ExpiredTime: m.ExpiredAt.UnixMilli(), // 账号类 BundleAccountNumber: int32(m.BundleAccountNumber), IncreaseAccountNumber: int32(m.IncreaseAccountNumber), BundleAccountConsumptionNumber: int32(m.BundleAccountConsumptionNumber), IncreaseAccountConsumptionNumber: int32(m.IncreaseAccountConsumptionNumber), // 视频类 BundleVideoNumber: int32(m.BundleVideoNumber) + int32(m.BundleLimitVideoNumber) + int32(m.BundleLimitVideoExpiredNumber), IncreaseVideoNumber: int32(m.IncreaseVideoNumber) + int32(m.IncreaseLimitVideoNumber) + int32(m.IncreaseLimitVideoExpiredNumber), BundleVideoConsumptionNumber: int32(m.BundleVideoConsumptionNumber) + int32(m.BundleLimitVideoConsumptionNumber) + int32(m.BundleLimitVideoExpiredConsumptionNumber), IncreaseVideoConsumptionNumber: int32(m.IncreaseVideoConsumptionNumber) + int32(m.IncreaseLimitVideoConsumptionNumber) + int32(m.IncreaseLimitVideoExpiredConsumptionNumber), InvalidBundleVideoNumber: int32(m.InvalidBundleVideoNumber), InvalidIncreaseVideoNumber: int32(m.InvalidIncreaseVideoNumber), MonthlyNewBundleVideoNumber: int32(cal(m.BundleBalance, m.BundleLimitVideoNumber, m.MonthlyLimitVideoQuotaNumber, date) + cal(m.BundleBalance, m.BundleLimitVideoExpiredNumber, m.MonthlyLimitVideoQuotaNumber, date)), MonthlyNewIncreaseVideoNumber: int32(cal(m.BundleBalance, m.IncreaseLimitVideoNumber, m.MonthlyLimitVideoQuotaNumber, date) + cal(m.BundleBalance, m.IncreaseLimitVideoExpiredNumber, m.MonthlyLimitVideoQuotaNumber, date)), MonthBundleVideoConsumptionNumber: int32(m.MonthlyBundleVideoConsumptionNumber), MonthIncreaseVideoConsumptionNumber: int32(m.MonthlyIncreaseVideoConsumptionNumber), MonthlyInvalidBundleVideoNumber: int32(m.MonthlyInvalidBundleVideoNumber), MonthlyInvalidIncreaseVideoNumber: int32(m.MonthlyInvalidIncreaseVideoNumber), // 图文类 BundleImageNumber: int32(m.BundleImageNumber) + int32(m.BundleLimitImageNumber) + int32(m.BundleLimitImageExpiredNumber), IncreaseImageNumber: int32(m.IncreaseImageNumber) + int32(m.IncreaseLimitImageNumber) + int32(m.IncreaseLimitImageExpiredNumber), BundleImageConsumptionNumber: int32(m.BundleImageConsumptionNumber) + int32(m.BundleLimitImageConsumptionNumber) + int32(m.BundleLimitImageExpiredConsumptionNumber), IncreaseImageConsumptionNumber: int32(m.IncreaseImageConsumptionNumber) + int32(m.IncreaseLimitImageConsumptionNumber) + int32(m.IncreaseLimitImageExpiredConsumptionNumber), InvalidBundleImageNumber: int32(m.InvalidBundleImageNumber), InvalidIncreaseImageNumber: int32(m.InvalidIncreaseImageNumber), MonthlyNewBundleImageNumber: int32(cal(m.BundleBalance, m.BundleLimitImageNumber, m.MonthlyLimitImageQuotaNumber, date) + cal(m.BundleBalance, m.BundleLimitImageExpiredNumber, m.MonthlyLimitImageQuotaNumber, date)), MonthlyNewIncreaseImageNumber: int32(cal(m.BundleBalance, m.IncreaseLimitImageNumber, m.MonthlyLimitImageQuotaNumber, date) + cal(m.BundleBalance, m.IncreaseLimitImageExpiredNumber, m.MonthlyLimitImageQuotaNumber, date)), MonthBundleImageConsumptionNumber: int32(m.MonthlyBundleImageConsumptionNumber), MonthIncreaseImageConsumptionNumber: int32(m.MonthlyIncreaseImageConsumptionNumber), MonthlyInvalidBundleImageNumber: int32(m.MonthlyInvalidBundleImageNumber), MonthlyInvalidIncreaseImageNumber: int32(m.MonthlyInvalidIncreaseImageNumber), // 数据分析类 BundleDataAnalysisNumber: int32(m.BundleDataAnalysisNumber) + int32(m.BundleLimitDataAnalysisNumber) + int32(m.BundleLimitDataAnalysisExpiredNumber), IncreaseDataAnalysisNumber: int32(m.IncreaseDataAnalysisNumber) + int32(m.IncreaseLimitDataAnalysisNumber) + int32(m.IncreaseLimitDataAnalysisExpiredNumber), BundleDataAnalysisConsumptionNumber: int32(m.BundleDataAnalysisConsumptionNumber) + int32(m.BundleLimitDataAnalysisConsumptionNumber) + int32(m.BundleLimitDataAnalysisExpiredConsumptionNumber), IncreaseDataAnalysisConsumptionNumber: int32(m.IncreaseDataAnalysisConsumptionNumber) + int32(m.IncreaseLimitDataAnalysisConsumptionNumber) + int32(m.IncreaseLimitDataAnalysisExpiredConsumptionNumber), InvalidBundleDataAnalysisNumber: int32(m.InvalidBundleDataAnalysisNumber), InvalidIncreaseDataAnalysisNumber: int32(m.InvalidIncreaseDataAnalysisNumber), MonthlyNewBundleDataAnalysisNumber: int32(cal(m.BundleBalance, m.BundleLimitDataAnalysisNumber, m.MonthlyLimitDataAnalysisQuotaNumber, date) + cal(m.BundleBalance, m.BundleLimitDataAnalysisExpiredNumber, m.MonthlyLimitDataAnalysisQuotaNumber, date)), MonthlyNewIncreaseDataAnalysisNumber: int32(cal(m.BundleBalance, m.IncreaseLimitDataAnalysisNumber, m.MonthlyLimitDataAnalysisQuotaNumber, date) + cal(m.BundleBalance, m.IncreaseLimitDataAnalysisExpiredNumber, m.MonthlyLimitDataAnalysisQuotaNumber, date)), MonthBundleDataAnalysisConsumptionNumber: int32(m.MonthlyBundleDataAnalysisConsumptionNumber), MonthIncreaseDataAnalysisConsumptionNumber: int32(m.MonthlyIncreaseDataAnalysisConsumptionNumber), MonthlyInvalidBundleDataAnalysisNumber: int32(m.MonthlyInvalidBundleDataAnalysisNumber), MonthlyInvalidIncreaseDataAnalysisNumber: int32(m.MonthlyInvalidIncreaseDataAnalysisNumber), // 手动扩展类 MonthlyNewManualAccountNumber: int32(m.MonthlyNewAccountNumber), MonthlyNewManualVideoNumber: int32(m.MonthlyNewManualVideoNumber), MonthlyNewManualImageNumber: int32(m.MonthlyNewManualImageNumber), MonthlyNewManualDataAnalysisNumber: int32(m.MonthlyNewManualDataAnalysisNumber), MonthlyNewDurationNumber: int32(m.MonthlyNewDurationNumber), MonthlyManualAccountConsumptionNumber: int32(m.MonthlyManualAccountConsumptionNumber), MonthlyManualVideoConsumptionNumber: int32(m.MonthlyManualVideoConsumptionNumber), MonthlyManualImageConsumptionNumber: int32(m.MonthlyManualImageConsumptionNumber), MonthlyManualDataAnalysisConsumptionNumber: int32(m.MonthlyManualDataAnalysisConsumptionNumber), Activate: int32(m.Activate), } if m.OrderUUID != "" { result.Bought = 2 } else { result.Bought = 1 } return result }) return resp, nil } func GetBundleBalanceByUserId(req *bundle.GetBundleBalanceByUserIdReq) (*bundle.GetBundleBalanceByUserIdResp, error) { data, err := dao.GetBundleBalanceByUserId(req) if err != nil { logger.Error(err) return nil, errors.New("无套餐数据") } if data.Activate != 2 { return nil, errors.New("套餐未激活") } result := &bundle.GetBundleBalanceByUserIdResp{ OrderUUID: data.OrderUUID, BundleName: data.BundleName, PayTime: data.StartAt.UnixMilli(), ExpiredTime: data.ExpiredAt.UnixMilli(), PaymentAmount: data.PaymentAmount, PaymentType: data.PaymentType, AccountNumber: int32(data.BundleAccountNumber) + int32(data.IncreaseAccountNumber) + int32(data.ManualAccountNumber), AccountAdditional: int32(data.ManualAccountNumber), AccountConsumptionNumber: int32(data.BundleAccountConsumptionNumber) + int32(data.IncreaseAccountConsumptionNumber), VideoNumber: int32(data.BundleVideoNumber) + int32(data.BundleLimitVideoNumber) + int32(data.BundleLimitVideoExpiredNumber) + int32(data.IncreaseVideoNumber) + int32(data.IncreaseLimitVideoNumber) + int32(data.IncreaseLimitVideoExpiredNumber), VideoAdditional: int32(data.ManualVideoNumber), VideoConsumptionNumber: int32(data.BundleVideoConsumptionNumber) + int32(data.BundleLimitVideoConsumptionNumber) + int32(data.BundleLimitVideoExpiredConsumptionNumber) + int32(data.IncreaseVideoConsumptionNumber) + int32(data.IncreaseLimitVideoConsumptionNumber) + int32(data.IncreaseLimitVideoExpiredConsumptionNumber), ImageNumber: int32(data.BundleImageNumber) + int32(data.BundleLimitImageNumber) + int32(data.BundleLimitImageExpiredNumber) + int32(data.IncreaseImageNumber) + int32(data.IncreaseLimitImageNumber) + int32(data.IncreaseLimitImageExpiredNumber), ImageAdditional: int32(data.ManualImageNumber), ImageConsumptionNumber: int32(data.BundleImageConsumptionNumber) + int32(data.BundleLimitImageConsumptionNumber) + int32(data.BundleLimitImageExpiredConsumptionNumber) + int32(data.IncreaseImageConsumptionNumber) + int32(data.IncreaseLimitImageConsumptionNumber) + int32(data.IncreaseLimitImageExpiredConsumptionNumber), DataAnalysisNumber: int32(data.BundleDataAnalysisNumber) + int32(data.BundleLimitDataAnalysisNumber) + int32(data.BundleLimitDataAnalysisExpiredNumber) + int32(data.IncreaseDataAnalysisNumber) + int32(data.IncreaseLimitDataAnalysisNumber) + int32(data.IncreaseLimitDataAnalysisExpiredNumber), DataAnalysisAdditional: int32(data.ManualDataAnalysisNumber), DataAnalysisConsumptionNumber: int32(data.BundleDataAnalysisConsumptionNumber) + int32(data.BundleLimitDataAnalysisConsumptionNumber) + int32(data.BundleLimitDataAnalysisExpiredConsumptionNumber) + int32(data.IncreaseDataAnalysisConsumptionNumber) + int32(data.IncreaseLimitDataAnalysisConsumptionNumber) + int32(data.IncreaseLimitDataAnalysisExpiredConsumptionNumber), } return result, nil } func AddBundleBalance(req *bundle.AddBundleBalanceReq) (*bundle.AddBundleBalanceResp, error) { data := model.BundleBalanceUsePo{ UserId: int(req.UserId), AccountNumber: int(req.AccountConsumptionNumber), ImageNumber: int(req.ImageConsumptionNumber), VideoNumber: int(req.VideoConsumptionNumber), DataAnalysisNumber: int(req.DataAnalysisConsumptionNumber), } uesdType, err := dao.AddBundleBalanceByUserId(data) return &bundle.AddBundleBalanceResp{ UsedType: uint32(uesdType), }, err } // 计算本月发放的限制类型数量 func cal(data model.BundleBalance, total, limit int, date time.Time) int { var released int // 已释放的次数 if data.StartAt.Month() == date.Month() && data.StartAt.Year() == date.Year() { } else if data.StartAt.Day() >= 16 { //第一个月释放的 released += limit/2 + 1 } else { released += limit } interval := date.Year()*12 + int(date.Month()) - (data.StartAt.Year()*12 + int(data.StartAt.Month())) // 后续月份释放的 released += interval * limit remaining := max(total-released, 0) // 还剩余多少次没有发放 if data.StartAt.Month() == date.Month() && data.StartAt.Year() == date.Year() && data.StartAt.Day() >= 16 { // 本月为第一个月并且16号后购买只给一半(向上取整) return min(limit/2+1, remaining) } if data.ExpiredAt.Month() == date.Month() && data.ExpiredAt.Year() == date.Year() && data.ExpiredAt.Day() < 16 { // 本月为最后一个月并且16号前到期只给一半(向下取整) return min(limit/2, remaining) } return min(limit, remaining) } func CreateBundleBalance(req *bundle.CreateBundleBalanceReq) (*bundle.CreateBundleBalanceResp, error) { var data model.BundleBalance addValues, err := dao.GetValueAddByOrderUUID(req.OrderUUID) if err != nil || len(addValues) == 0 { return nil, errors.New("获取增值服务失败") } data.StartAt = time.Now() data.ExpiredAt = time.Now() userId, err := strconv.Atoi(addValues[0].CustomerID) if err != nil { return nil, err } data.Month = time.Now().Format("2006-01") data.UserId = userId data.OrderUUID = req.OrderUUID for _, v := range addValues { switch v.ServiceType { case 1: // 视频类型 if v.EquityType == 1 { // 套餐权益 if v.QuotaType == 2 { // 限制额度 data.MonthlyLimitVideoQuotaNumber = int(v.QuotaValue) if v.IsExpired { // 会过期的限制类型 data.BundleLimitVideoExpiredNumber += int(v.Num) } else { data.BundleLimitVideoNumber += int(v.Num) } } else { data.BundleVideoNumber += int(v.Num) } } else { if v.QuotaType == 2 { // 限制额度 data.MonthlyLimitVideoQuotaNumber = int(v.QuotaValue) if v.IsExpired { // 会过期的限制类型 data.IncreaseLimitVideoExpiredNumber += int(v.Num) } else { data.IncreaseLimitVideoNumber += int(v.Num) } } else { data.IncreaseVideoNumber += int(v.Num) } } case 2: // 图文类型 if v.EquityType == 1 { // 套餐权益 if v.QuotaType == 2 { // 限制额度 data.MonthlyLimitImageQuotaNumber = int(v.QuotaValue) if v.IsExpired { // 会过期的限制类型 data.BundleLimitImageExpiredNumber += int(v.Num) } else { data.BundleLimitImageNumber += int(v.Num) } } else { data.BundleImageNumber += int(v.Num) } } else { if v.QuotaType == 2 { // 限制额度 data.MonthlyLimitImageQuotaNumber = int(v.QuotaValue) if v.IsExpired { // 会过期的限制类型 data.IncreaseLimitImageExpiredNumber += int(v.Num) } else { data.IncreaseLimitImageNumber += int(v.Num) } } else { data.IncreaseImageNumber += int(v.Num) } } case 3: // 数据分析 if v.EquityType == 1 { // 套餐权益 if v.QuotaType == 2 { // 限制额度 data.MonthlyLimitDataAnalysisQuotaNumber = int(v.QuotaValue) if v.IsExpired { // 会过期的限制类型 data.BundleLimitDataAnalysisExpiredNumber += int(v.Num) } else { data.BundleLimitDataAnalysisNumber += int(v.Num) } } else { data.BundleDataAnalysisNumber += int(v.Num) } } else { if v.QuotaType == 2 { // 限制额度 data.MonthlyLimitDataAnalysisQuotaNumber = int(v.QuotaValue) if v.IsExpired { // 会过期的限制类型 data.IncreaseLimitDataAnalysisExpiredNumber += int(v.Num) } else { data.IncreaseLimitDataAnalysisNumber += int(v.Num) } } else { data.IncreaseDataAnalysisNumber += int(v.Num) } } case 4: // 账号数 if v.EquityType == 1 { // 套餐权益 data.BundleAccountNumber += int(v.Num) } else { data.IncreaseAccountNumber += int(v.Num) } case 5: // 可用时长 switch v.Unit { case "天": data.ExpiredAt = data.ExpiredAt.Add(time.Hour * 24 * time.Duration(v.Num)) case "月": data.ExpiredAt = data.ExpiredAt.Add(time.Hour * 24 * 30 * time.Duration(v.Num)) case "年": data.ExpiredAt = data.ExpiredAt.Add(time.Hour * 24 * 365 * time.Duration(v.Num)) } } } now := time.Now() // 当月可用的限制类型数等于本月方法的套餐和增值两种类型的总和 data.MonthlyLimitVideoExpireNumber = cal(data, data.BundleLimitVideoExpiredNumber, data.MonthlyLimitVideoQuotaNumber, now) + cal(data, data.IncreaseLimitVideoExpiredNumber, data.MonthlyLimitVideoQuotaNumber, now) data.MonthlyLimitVideoNumber = cal(data, data.BundleLimitVideoNumber, data.MonthlyLimitVideoQuotaNumber, now) + cal(data, data.IncreaseLimitVideoNumber, data.MonthlyLimitVideoQuotaNumber, now) data.MonthlyLimitImageExpireNumber = cal(data, data.BundleLimitImageExpiredNumber, data.MonthlyLimitImageQuotaNumber, now) + cal(data, data.IncreaseLimitImageExpiredNumber, data.MonthlyLimitImageQuotaNumber, now) data.MonthlyLimitImageNumber = cal(data, data.BundleLimitImageNumber, data.MonthlyLimitImageQuotaNumber, now) + cal(data, data.IncreaseLimitImageNumber, data.MonthlyLimitImageQuotaNumber, now) data.MonthlyLimitDataAnalysisExpireNumber = cal(data, data.BundleLimitDataAnalysisExpiredNumber, data.MonthlyLimitDataAnalysisQuotaNumber, now) + cal(data, data.IncreaseLimitDataAnalysisExpiredNumber, data.MonthlyLimitDataAnalysisQuotaNumber, now) data.MonthlyLimitDataAnalysisNumber = cal(data, data.BundleLimitDataAnalysisNumber, data.MonthlyLimitDataAnalysisQuotaNumber, now) + cal(data, data.IncreaseLimitDataAnalysisNumber, data.MonthlyLimitDataAnalysisQuotaNumber, now) err = dao.CreateBundleBalance(data) if err != nil { logger.Error(err) return nil, errors.New("创建余量信息失败") } return nil, nil } func GetUsedRecord(req *bundle.GetUsedRecordListReq) (*bundle.GetUsedRecordListResp, error) { data, total, err := dao.GetUsedRecord(req) if err != nil { logger.Error(err) return nil, errors.New("查询失败") } resp := &bundle.GetUsedRecordListResp{} resp.Total = total resp.Data = lo.Map(data, func(m model.CostLogPo, _ int) *bundle.WorkCastItem { result := &bundle.WorkCastItem{} copier.Copy(result, &m) return result }) return resp, nil } func GetImageWorkDetail(req *bundle.GetImageWorkDetailReq) (*bundle.GetImageWorkDetailResp, error) { data, err := dao.GetImageWorkDetail(req) if err != nil { logger.Error(err) return nil, errors.New("查询失败") } result := &bundle.GetImageWorkDetailResp{} err = copier.Copy(result, &data) return result, err } func GetVedioWorkDetail(req *bundle.GetVedioWorkDetailReq) (*bundle.GetVedioeWorkDetailResp, error) { data, err := dao.GetVedioWorkDetail(req) if err != nil { logger.Error(err) return nil, errors.New("查询失败") } result := &bundle.GetVedioeWorkDetailResp{} err = copier.Copy(result, &data) return result, err } func ToBeComfirmedWorks(req *bundle.ToBeComfirmedWorksReq) (*bundle.ToBeComfirmedWorksResp, error) { data, total, unconfirmed, err := dao.ToBeComfirmedWorks(req) if err != nil { logger.Error(err) return nil, errors.New("查询失败") } result := &bundle.ToBeComfirmedWorksResp{ Total: total, Unconfirmed: unconfirmed, } result.Data = lo.Map(data, func(m model.CastWorkLog, _ int) *bundle.WorkItem { result := &bundle.WorkItem{} copier.Copy(result, &m) return result }) return result, nil } func ConfirmWork(req *bundle.ConfirmWorkReq) (*bundle.ConfirmWorkResp, error) { return nil, dao.ConfirmWork(req) } func BundleActivate(req *bundle.BundleActivateReq) error { return dao.BundleActivate(req.Ids) } func UpdateBundleBalance() { dao.UpdateBundleBalance() } func BundleBalanceExport(req *bundle.BundleBalanceExportReq) (*bundle.BundleBalanceExportResp, error) { data, err := GetBundleBalanceList(&bundle.GetBundleBalanceListReq{ Month: req.Month, Bought: 2, }) if err != nil { return nil, err } prefixData, err := dao.BalanceExportPrefix() if err != nil { return nil, err } var prefixMap = map[int32]model.BundleExportDto{} for _, v := range prefixData { prefixMap[v.UserId] = v } items := []*bundle.BundleBalanceExportItem{} for _, v := range data.Data { prefixItem := prefixMap[v.UserId] item := &bundle.BundleBalanceExportItem{} copier.Copy(item, v) item.CustomerNum = prefixItem.CustomNum item.PayTime = prefixItem.PayTime item.BundleAmount = prefixItem.BundleAmount item.IncreaseAmount = prefixItem.TotalPayAmount - prefixItem.BundleAmount item.TotalPayAmount = prefixItem.TotalPayAmount item.Currency = "USD" item.Fee = prefixItem.Fee item.BundleVideoUnitPrice = float32(item.BundleAmount / float32(v.BundleVideoNumber)) item.IncreaseVideoUnitPrice = float32(item.IncreaseAmount / float32(v.IncreaseVideoNumber)) items = append(items, item) } return &bundle.BundleBalanceExportResp{Total: int64(len(items)), Data: items}, nil } func GetBundleBalanceLayout(req *bundle.GetBundleBalanceLayoutReq) (*bundle.GetBundleBalanceLayoutResp, error) { data, err := dao.GetBundleBalanceLayout(req) if err != nil { // 返回默认值 return &bundle.GetBundleBalanceLayoutResp{ Data: buildDefaultBalanceLayout(), }, nil } return &bundle.GetBundleBalanceLayoutResp{ Data: data, }, nil } func SetBundleBalanceLayout(req *bundle.SetBundleBalanceLayoutReq) (*bundle.SetBundleBalanceLayoutResp, error) { return nil, dao.SetBundleBalanceLayout(req) } func buildDefaultBalanceLayout() string { m := map[string]string{ "是否激活": "activate", "艺人": "userName", "艺人手机号": "userPhoneNumber", "用户编号": "customerNum", "套餐状态": "status", "最后购买的套餐": "bundleName", "下单时间": "payTime", "开始有效时间": "startTime", "过期时间": "expiredTime", "所属月份": "month", "购买状态": "bought", "当前可用套餐账号数": "bundleAccountNumber", "当前可用增值账号数": "increaseAccountNumber", "当前已用套餐账号数": "bundleAccountConsumptionNumber", "当前已用增值账号数": "increaseAccountConsumptionNumber", "当前可用套餐视频数": "bundleVideoNumber", "当前可用增值视频数": "increaseVideoNumber", "当前已用套餐视频数": "bundleVideoConsumptionNumber", "当前已用增值视频数": "increaseVideoConsumptionNumber", "当前作废套餐视频数": "invalidBundleVideoNumber", "当前作废增值视频数": "invalidIncreaseVideoNumber", "当月新增套餐视频数": "monthlyNewBundleVideoNumber", "当月新增增值视频数": "monthlyNewIncreaseVideoNumber", "当月使用套餐视频数": "monthBundleVideoConsumptionNumber", "当月使用增值视频数": "monthIncreaseVideoConsumptionNumber", "当月作废套餐视频数": "monthlyInvalidBundleVideoNumber", "当月作废增值视频数": "monthlyInvalidIncreaseVideoNumber", "当前可用套餐图文数": "bundleImageNumber", "当前可用增值图文数": "increaseImageNumber", "当前已用套餐图文数": "bundleImageConsumptionNumber", "当前已用增值图文数": "increaseImageConsumptionNumber", "当前作废套餐图文数": "invalidBundleImageNumber", "当前作废增值图文数": "invalidIncreaseImageNumber", "当月新增套餐图文数": "monthlyNewBundleImageNumber", "当月新增增值图文数": "monthlyNewIncreaseImageNumber", "当月使用套餐图文数": "monthBundleImageConsumptionNumber", "当月使用增值图文数": "monthIncreaseImageConsumptionNumber", "当月作废套餐图文数": "monthlyInvalidBundleImageNumber", "当月作废增值图文数": "monthlyInvalidIncreaseImageNumber", "当前可用套餐数据数": "bundleDataAnalysisNumber", "当前可用增值数据数": "increaseDataAnalysisNumber", "当前已用套餐数据数": "bundleDataAnalysisConsumptionNumber", "当前已用增值数据数": "increaseDataAnalysisConsumptionNumber", "当前作废套餐数据数": "invalidBundleDataAnalysisNumber", "当前作废增值数据数": "invalidIncreaseDataAnalysisNumber", "当月新增套餐数据数": "monthlyNewBundleDataAnalysisNumber", "当月新增增值数据数": "monthlyNewIncreaseDataAnalysisNumber", "当月使用套餐数据数": "monthBundleDataAnalysisConsumptionNumber", "当月使用增值数据数": "monthIncreaseDataAnalysisConsumptionNumber", "当月作废套餐数据数": "monthlyInvalidBundleDataAnalysisNumber", "当月作废增值数据数": "monthlyInvalidIncreaseDataAnalysisNumber", "当月新增手动扩展账号数": "monthlyNewManualAccountNumber", "当月新增手动扩展视频数": "monthlyNewManualVideoNumber", "当月新增手动扩展图文数": "monthlyNewManualImageNumber", "当月新增手动扩展数据数": "monthlyNewManualDataAnalysisNumber", "当月新增手动扩展时长(日)": "monthlyNewDurationNumber", "当月已用手动扩展账号数": "monthlyManualAccountConsumptionNumber", "当月已用手动扩展视频数": "monthlyManualVideoConsumptionNumber", "当月已用手动扩展图文数": "monthlyManualImageConsumptionNumber", "当月已用手动扩展数据数": "monthlyManualDataAnalysisConsumptionNumber", } jsonMap := []map[string]any{} for k, v := range m { jsonMap = append(jsonMap, map[string]any{ "sort": 1, "fieldKey": v, "fieldValue": k, "sortOrNot": true, "status": 1, "width": 160, }) } b, _ := json.Marshal(jsonMap) return string(b) }