package dao import ( "errors" "fmt" "micro-bundle/internal/model" "micro-bundle/pb/bundle" "micro-bundle/pkg/app" commonErr "micro-bundle/pkg/err" "micro-bundle/pkg/msg" "time" "gorm.io/gorm" ) func CreateBundle(req *model.BundleProfile) (res *bundle.CommonResponse, err error) { res = new(bundle.CommonResponse) err = app.ModuleClients.BundleDB.Model(&model.BundleProfile{}).Create(&req).Error if err != nil { res.Msg = msg.ErrorCreateBundleInfo return res, commonErr.ReturnError(err, msg.ErrorCreateBundleInfo, "创建套餐信息失败: ") } res.Msg = msg.SuccessCreateBundleInfo return } func UpdateBundle(req *model.BundleProfile) (res *bundle.CommonResponse, err error) { res = new(bundle.CommonResponse) err = app.ModuleClients.BundleDB.Model(&model.BundleProfile{}).Where("uuid = ? and language= ?", req.UUID, req.Language).Updates(req).Error if err != nil { res.Msg = msg.ErrorUpdateBundleInfo return res, commonErr.ReturnError(err, msg.ErrorUpdateBundleInfo, "更新套餐信息失败: ") } res.Msg = msg.SuccessUpdateBundleInfo return } func DeleteBundle(uuid string) (res *bundle.CommonResponse, err error) { res = new(bundle.CommonResponse) err = app.ModuleClients.BundleDB.Where("uuid = ?", uuid).Delete(&model.BundleProfile{}).Error if err != nil { res.Msg = msg.ErrorDeleteBundleInfo return res, commonErr.ReturnError(err, msg.ErrorDeleteBundleInfo, "删除套餐信息失败: ") } res.Msg = msg.SuccessDeleteBundleInfo return } func BundleList(req *bundle.BundleListRequest) (res *bundle.BundleListResponse, err error) { res = new(bundle.BundleListResponse) res.Bundles = make([]*bundle.BundleProfile, 0) bundles := make([]*model.BundleProfile, 0) query := app.ModuleClients.BundleDB.Model(&model.BundleProfile{}) if req.Name != "" { query = query.Where("name like ?", "%"+req.Name+"%") } if req.Content != "" { query = query.Where("content like ?", "%"+req.Content+"%") } if req.Language != "" { query = query.Where("language like ?", req.Language) } count := *query if req.PageSize != 0 && req.Page != 0 { query = query.Limit(int(req.PageSize)).Offset(int(req.Page-1) * int(req.PageSize)) } if err = query.Find(&bundles).Error; err != nil { return res, commonErr.ReturnError(err, msg.ErrorGetBundleList, "获取套餐列表失败: ") } for _, bundleProfile := range bundles { res.Bundles = append(res.Bundles, &bundle.BundleProfile{ Uuid: bundleProfile.UUID, Name: bundleProfile.Name, Price: bundleProfile.Price, PriceType: bundleProfile.PriceType, Contract: bundleProfile.Contract, Content: bundleProfile.Content, Language: bundleProfile.Language, CreatedAt: bundleProfile.CreatedAt.String(), UpdatedAt: bundleProfile.UpdatedAt.String(), CompanySign: bundleProfile.CompanySign, ContractDuration: int64(bundleProfile.ContractDuration), BundleCommonUid: bundleProfile.BundleCommonUid, }) } // _ = copier.CopyWithOption(&res.Bundles, bundles, copier.Option{DeepCopy: true}) // fmt.Printf("res.Bundles %+v\n", res.Bundles) var total int64 count.Count(&total) res.Total = int32(total) return } func BundleDetail(uuid string) (res *bundle.BundleProfile, err error) { res = new(bundle.BundleProfile) bundleProfile := new(model.BundleProfile) err = app.ModuleClients.BundleDB.Where("uuid = ?", uuid).First(&bundleProfile).Error if err != nil { return res, commonErr.ReturnError(err, msg.ErrorGetBundleInfo, "获取套餐信息失败: ") } //_ = copier.CopyWithOption(&res, bundle, copier.Option{DeepCopy: true}) res = &bundle.BundleProfile{ Uuid: bundleProfile.UUID, Name: bundleProfile.Name, Price: bundleProfile.Price, PriceType: bundleProfile.PriceType, Contract: bundleProfile.Contract, Content: bundleProfile.Content, Language: bundleProfile.Language, CreatedAt: bundleProfile.CreatedAt.String(), UpdatedAt: bundleProfile.UpdatedAt.String(), CompanySign: bundleProfile.CompanySign, ContractDuration: int64(bundleProfile.ContractDuration), BundleCommonUid: bundleProfile.BundleCommonUid, } return } func BundleListV2(req *bundle.BundleListRequest) (res *bundle.BundleListResponse, err error) { res = new(bundle.BundleListResponse) res.Bundles = make([]*bundle.BundleProfile, 0) bundles := make([]*model.BundleProfile, 0) query := app.ModuleClients.BundleDB.Model(&model.BundleProfile{}).Preload("BundleProfileLang") //query = query.Where("shelf_status = ?", 1) //上架的 if req.Name != "" { query = query.Where("name like ?", "%"+req.Name+"%") } if req.Content != "" { query = query.Where("content like ?", "%"+req.Content+"%") } if req.Language != "" { query = query.Where("language like ?", req.Language) } count := *query // 排序:sort 升序,相同 sort 按 created_at 倒序 query = query.Order("sort ASC").Order("created_at DESC") if req.PageSize != 0 && req.Page != 0 { query = query.Limit(int(req.PageSize)).Offset(int(req.Page-1) * int(req.PageSize)) } if err = query.Find(&bundles).Error; err != nil { return res, commonErr.ReturnError(err, msg.ErrorGetBundleList, "获取套餐列表失败: ") } if bundles != nil && len(bundles) > 0 { for _, bundleProfile := range bundles { selectValueAddService := make([]*bundle.SelectValueAddService, 0) // 通过中间表拼接增值服务数据 if bundleProfile.UUID != "" { bundleToValueAddServices, err := GetBundleToValueAddServiceByBundleUuid(bundleProfile.UUID) if err != nil { return res, commonErr.ReturnError(err, msg.ErrorGetBundleInfo, "获取增值服务信息失败: ") } for _, v := range bundleToValueAddServices { valueAddDetail, _ := ValueAddServiceDetail(v.ValueUid, "") selectValueAddService = append(selectValueAddService, &bundle.SelectValueAddService{ ValueAddUuid: v.ValueUid, IsDisplay: v.IsDisplay, ServiceName: valueAddDetail.ServiceName, }) } } bundleProfileLang := []*bundle.BundleProfileLang{} if bundleProfile.BundleProfileLang != nil && len(bundleProfile.BundleProfileLang) > 0 { for _, lang := range bundleProfile.BundleProfileLang { bpl := &bundle.BundleProfileLang{ Uuid: lang.UUID, Name: lang.Name, Price: lang.Price, PriceType: lang.PriceType, Content: lang.Content, Language: lang.Language, CreatedAt: time.Unix(lang.CreatedAt, 0).Format("2006-01-02 15:04:05"), UpdatedAt: time.Unix(int64(lang.UpdatedAt), 0).Format("2006-01-02 15:04:05"), } bundleProfileLang = append(bundleProfileLang, bpl) } } res.Bundles = append(res.Bundles, &bundle.BundleProfile{ Uuid: bundleProfile.UUID, Name: bundleProfile.Name, Content: bundleProfile.Content, Price: bundleProfile.Price, PriceType: bundleProfile.PriceType, Contract: bundleProfile.Contract, Language: bundleProfile.Language, CreatedAt: bundleProfile.CreatedAt.Format("2006-01-02 15:04:05"), UpdatedAt: bundleProfile.UpdatedAt.Format("2006-01-02 15:04:05"), CompanySign: bundleProfile.CompanySign, ContractDuration: int64(bundleProfile.ContractDuration), Sort: bundleProfile.Sort, BgImg1: bundleProfile.BgImg1, BgImg2: bundleProfile.BgImg2, SelectValueAddService: selectValueAddService, BundleProfileLang: bundleProfileLang, ShelfStatus: int64(bundleProfile.ShelfStatus), }) } } var total int64 count.Count(&total) res.Total = int32(total) return } func BundleDetailV2(req *bundle.BundleDetailRequest) (res *bundle.BundleDetailResponseV2, err error) { if req.Uuid == "" { return res, errors.New("uuid不能为空") } if req.Language == "" { return res, errors.New("language不能为空") } res = new(bundle.BundleDetailResponseV2) bundleProfile := new(model.BundleProfile) err = app.ModuleClients.BundleDB.Model(&model.BundleProfile{}).Where("uuid = ?", req.Uuid).Preload("BundleProfileLang").First(&bundleProfile).Error if err != nil { return res, commonErr.ReturnError(err, msg.ErrorGetBundleInfo, "获取套餐信息失败: ") } bundleProfileLang := &bundle.BundleProfileLang{ BgImg1: bundleProfile.BgImg1, BgImg2: bundleProfile.BgImg2, Sort: bundleProfile.Sort, } if bundleProfile != nil && bundleProfile.BundleProfileLang != nil && len(bundleProfile.BundleProfileLang) > 0 { for _, lang := range bundleProfile.BundleProfileLang { if lang.Language == req.Language { bundleProfileLang = &bundle.BundleProfileLang{ Uuid: lang.UUID, Name: lang.Name, Price: lang.Price, PriceType: lang.PriceType, Content: lang.Content, Language: lang.Language, CreatedAt: time.Unix(lang.CreatedAt, 0).Format("2006-01-02 15:04:05"), UpdatedAt: time.Unix(int64(lang.UpdatedAt), 0).Format("2006-01-02 15:04:05"), } } } } selectValueAddService := make([]*bundle.SelectValueAddService, 0) //已选增值服务 // 通过中间表拼接增值服务数据 if bundleProfile.UUID != "" { bundleToValueAddServices, err := GetBundleToValueAddServiceByBundleUuid(bundleProfile.UUID) if err != nil { return res, commonErr.ReturnError(err, msg.ErrorGetBundleInfo, "获取增值服务信息失败: ") } for _, valueAddService := range bundleToValueAddServices { valueAddDeatilData, err := ValueAddServiceDetailByUuidAndLanguage(valueAddService.ValueUid, req.Language) if err != nil { return res, commonErr.ReturnError(err, msg.ErrorGetBundleInfo, "获取增值服务信息失败: ") } //if valueAddService.IsDisplay{} ValueAddServiceLang := &bundle.ValueAddServiceLang{ Uuid: valueAddDeatilData.UUID, ServiceName: valueAddDeatilData.ServiceName, ServiceType: int32(valueAddDeatilData.ServiceType), PriceMode: int32(valueAddDeatilData.PriceMode), PriceType: int64(valueAddDeatilData.PriceType), OriginalPrice: fmt.Sprintf("%.2f", float32(valueAddDeatilData.OriginalPrice)), Unit: string(valueAddDeatilData.Unit), Language: valueAddDeatilData.Language, CreatedAt: time.Unix(valueAddDeatilData.CreatedAt, 0).Format("2006-01-02 15:04:05"), UpdatedAt: time.Unix(valueAddDeatilData.UpdatedAt, 0).Format("2006-01-02 15:04:05"), } bundleProfileLang.ValueAddServiceLang = append(bundleProfileLang.ValueAddServiceLang, ValueAddServiceLang) selectValueAddService = append(selectValueAddService, &bundle.SelectValueAddService{ ValueAddUuid: valueAddService.ValueUid, ServiceName: valueAddDeatilData.ServiceName, IsDisplay: valueAddService.IsDisplay, }) } } if selectValueAddService != nil && len(selectValueAddService) > 0 { res.SelectValueAddService = selectValueAddService } res.Bundle = bundleProfileLang return } // 套餐上下架 func HandShelf(uuid string, shelfStatus int64) (res *bundle.CommonResponse, err error) { res = new(bundle.CommonResponse) err = app.ModuleClients.BundleDB.Model(&model.BundleProfile{}).Where("uuid = ?", uuid).Update("shelf_status", shelfStatus).Error if err != nil { res.Msg = "套餐上下架操作失败" return res, err } res.Msg = "套餐上下架操作成功" return res, nil } // 通过uuid和language查询套餐语言表 func BundleDetailByUuidAndLanguage(uuid string, language string) (bundleProfileLang *model.BundleProfileLang, err error) { err = app.ModuleClients.BundleDB.Where("uuid = ? AND language = ?", uuid, language).First(&bundleProfileLang).Error if err != nil { return nil, err } return } // 套餐主表创建 func TxCreateBundle(tx *gorm.DB, req *model.BundleProfile) (err error) { err = tx.Model(&model.BundleProfile{}).Create(&req).Error if err != nil { return commonErr.ReturnError(err, msg.ErrorCreateBundleInfo, "创建套餐信息失败: ") } return } // 套餐语言表创建 func TxCreateBundleLang(tx *gorm.DB, req *model.BundleProfileLang) (err error) { err = tx.Model(&model.BundleProfileLang{}).Create(&req).Error if err != nil { return commonErr.ReturnError(err, msg.ErrorCreateBundleInfo, "创建套餐信息失败: ") } return } func TxUpdateBundle(tx *gorm.DB, uuid string, columns map[string]interface{}) (err error) { err = tx.Model(&model.BundleProfile{}).Where("uuid =?", uuid).Updates(columns).Error if err != nil { return commonErr.ReturnError(err, msg.ErrorUpdateBundleInfo, "更新套餐信息失败: ") } return } func TxUpdateBundleLang(tx *gorm.DB, uuid string, language string, columns map[string]interface{}) (err error) { err = tx.Model(&model.BundleProfileLang{}).Where("uuid =? and language=?", uuid, language).Updates(columns).Error if err != nil { return commonErr.ReturnError(err, msg.ErrorUpdateBundleInfo, "更新套餐信息失败: ") } return } func CreateBundleToValueAddService(tx *gorm.DB, records []*model.BundleToValueAddService) error { return tx.Model(&model.BundleToValueAddService{}).Create(&records).Error } func DeleteBundleToValueAddService(tx *gorm.DB, bundleUuid, valueUid string) error { return tx.Where("bundle_uuid = ? AND value_uid = ?", bundleUuid, valueUid).Delete(&model.BundleToValueAddService{}).Error } func GetValueAddServiceUuidsByBundleUuid(bundleUuid string) ([]string, error) { var uuids []string err := app.ModuleClients.BundleDB.Model(&model.BundleToValueAddService{}).Where("bundle_uuid = ?", bundleUuid).Pluck("value_uid", &uuids).Error return uuids, err } // GetBundleToValueAddServiceByBundleUuid 根据套餐UUID获取所有关联的增值服务uuid func GetBundleToValueAddServiceByBundleUuid(bundleUuid string) ([]*model.BundleToValueAddService, error) { var result []*model.BundleToValueAddService err := app.ModuleClients.BundleDB.Model(&model.BundleToValueAddService{}). Where("bundle_uuid = ?", bundleUuid). Find(&result).Error return result, err } func GetBundleLangsByUuid(uuid string) ([]*model.BundleProfileLang, error) { var result []*model.BundleProfileLang err := app.ModuleClients.BundleDB.Model(&model.BundleProfileLang{}). Where("uuid =?", uuid). Find(&result).Error return result, err }