diff --git a/internal/dao/bundleDao.go b/internal/dao/bundleDao.go index d6fcf90..1b1e9bf 100644 --- a/internal/dao/bundleDao.go +++ b/internal/dao/bundleDao.go @@ -276,7 +276,17 @@ func TxCreateBundleLang(tx *gorm.DB, req *model.BundleProfileLang) (err error) { 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 commonErr.ReturnError(err, msg.ErrorUpdateBundleInfo, "更新套餐信息失败") + } + return +} +func TxUpdateBundles(tx *gorm.DB, uuids []string, columns map[string]interface{}) (err error) { + if len(uuids) == 0 { + return nil + } + err = tx.Model(&model.BundleProfile{}).Where("uuid IN (?)", uuids).Updates(columns).Error + if err != nil { + return commonErr.ReturnError(err, msg.ErrorUpdateBundleInfo, "更新套餐信息失败") } return } diff --git a/internal/logic/bundleLogic.go b/internal/logic/bundleLogic.go index 9447e66..e5f81e1 100644 --- a/internal/logic/bundleLogic.go +++ b/internal/logic/bundleLogic.go @@ -87,21 +87,20 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error) if req.Uuid == "" && req.Language != msg.ZH_CN { return res, errors.New("请先创建中文版本套餐") } - var existValueService = make(map[string]string) - if req.Uuid != "" { - valueService, existErr := dao.GetValueAddServiceUuidsByBundleUuid(req.Uuid) - if existErr != nil { - return res, errors.New("查询增值服务失败") - } - if valueService != nil && len(valueService) > 0 { - for _, v := range valueService { - existValueService[v] = v - } - } - } - var cancelValueAddService = make(map[string]string) + // var existValueService = make(map[string]string) + // if req.Uuid != "" { + // valueService, existErr := dao.GetValueAddServiceUuidsByBundleUuid(req.Uuid) + // if existErr != nil { + // return res, errors.New("查询增值服务失败") + // } + // if valueService != nil && len(valueService) > 0 { + // for _, v := range valueService { + // existValueService[v] = v + // } + // } + // } selectService := make([]*model.BundleToValueAddService, 0) - var selectValueAddServiceCount = make(map[int]struct{}) + var selectValueAddServiceCount = make(map[int]struct{}) //增值服务类型数量 if req.Language == msg.ZH_CN && req.SelectValueAddService != nil && len(req.SelectValueAddService) > 0 { for _, v := range req.SelectValueAddService { detail, checkErr := dao.ValueAddServiceDetailByUuidAndLanguage(v.ValueAddUuid, req.Language) @@ -112,23 +111,6 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error) return res, errors.New("查询增值服务失败") } } - if detail.PriceType != req.PriceType { - if req.Uuid == "" { - //中文套餐创建时,币种不一致直接返回错误 - return res, errors.New("所选增值服务币种与套餐币种不一致") - } else { - //更新时,判断是否已存在,存在则取消关联 - _, ok := existValueService[v.ValueAddUuid] - if ok { - cancelValueAddService[v.ValueAddUuid] = detail.ServiceName - continue - } else { - //币种不一致,新加币种时返回错误 - return res, errors.New("所选增值服务币种与套餐币种不一致") - - } - } - } if _, exists := selectValueAddServiceCount[int(detail.ServiceType)]; exists { return res, errors.New("每种增值服务类型只可选择一个") } @@ -150,9 +132,6 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error) _, err = dao.BundleDetailByUuidAndLanguage(req.Uuid, req.Language) if err != nil { if err == gorm.ErrRecordNotFound { - // if req.Uuid != "" { - // return res, errors.New("套餐不存在") - // } if req.Language != msg.ZH_CN { _, err = dao.BundleDetailByUuidAndLanguage(req.Uuid, msg.ZH_CN) if err != nil { @@ -180,36 +159,26 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error) return res, errors.New("保存套餐与增值服务关联失败") } } - } else { - bundleLang.UUID = req.Uuid - res.Uuid = req.Uuid - valueUuid, err1 := dao.GetValueAddServiceUuidsByBundleUuid(bundleLang.UUID) - if err1 != nil { - return res, err1 + if err = dao.TxCreateBundleLang(tx, bundleLang); err != nil { + return res, errors.New("创建套餐信息失败") } - count := 0 - if valueUuid != nil && len(valueUuid) > 0 { - for _, v := range valueUuid { - //可以改成批量获取 - valueDetail, err2 := dao.ValueAddServiceDetailByUuidAndLanguage(v, req.Language) - if err2 != nil { - return res, errors.New("查询增值服务失败") - } - if valueDetail.PriceType != req.PriceType { - if err = tx.Where("bundle_uuid =? AND value_uid =?", bundleLang.UUID, v).Delete(&model.BundleToValueAddService{}).Error; err != nil { - return res, errors.New("删除套餐与增值服务关联失败") - } - count++ - } - } - } - res.CancelNum = int64(count) } - if err = dao.TxCreateBundleLang(tx, bundleLang); err != nil { - return res, errors.New("创建套餐信息失败") + langList := []string{msg.ZH_TW, msg.EN, msg.DE_DE, msg.JA_JP} + for _, lang := range langList { + otherLang := &model.BundleProfileLang{ + UUID: bundleLang.UUID, + Name: bundleLang.Name, + Content: bundleLang.Content, + Price: bundleLang.Price, + PriceType: bundleLang.PriceType, + } + otherLang.Language = lang + if err = dao.TxCreateBundleLang(tx, otherLang); err != nil { + return res, errors.New("创建套餐信息失败") + } } res.Msg = "创建套餐信息成功" - return res, nil + return } else { return } @@ -219,16 +188,7 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error) if saveErr := saveBundleHistory(tx, req.Uuid, "", 0); saveErr != nil { return res, saveErr } - if req.Language == msg.ZH_CN { - if len(cancelValueAddService) > 0 { - for _, v := range cancelValueAddService { - if err = tx.Where("bundle_uuid = ? AND value_uid = ?", req.Uuid, v).Delete(&model.BundleToValueAddService{}).Error; err != nil { - return res, errors.New("删除套餐与增值服务关联失败") - } - } - } - res.CancelNum = int64(len(cancelValueAddService)) updateBundle := map[string]interface{}{ "name": req.Name, "sort": req.Sort, @@ -243,40 +203,11 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error) if err = dao.TxUpdateBundle(tx, req.Uuid, updateBundle); err != nil { return res, errors.New("更新套餐信息失败") } - // 更新中间表函数 + //更新中间表函数 if err = diffUpdateBundleToValueAddService(tx, req.Uuid, selectService); err != nil { tx.Rollback() return res, errors.New("更新套餐与增值服务关联失败") } - } else { - //更新其他语言时 先获取所有关联增值服务,判断币种是否一致,不一致则取消关联 - valueAddService, err := dao.GetBundleToValueAddServiceByBundleUuid(req.Uuid) - if err != nil { - return res, errors.New("查询套餐与增值服务关联失败") - } - cancelValueService := make(map[string]string) - for _, v := range valueAddService { - detail, checkErr := dao.ValueAddServiceDetailByUuidAndLanguage(v.ValueUid, req.Language) - if checkErr != nil { - if checkErr == gorm.ErrRecordNotFound { - continue - } else { - return res, errors.New("查询增值服务失败") - } - } - if detail.PriceType != req.PriceType { - cancelValueService[v.ValueUid] = detail.ServiceName - continue - } - } - if int64(len(cancelValueService)) > 0 { - for k, _ := range cancelValueService { - if err = tx.Where("bundle_uuid = ? AND value_uid = ?", req.Uuid, k).Delete(&model.BundleToValueAddService{}).Error; err != nil { - return res, errors.New("删除套餐与增值服务关联失败") - } - } - res.CancelNum = int64(len(cancelValueService)) - } } updateBundleLang := map[string]interface{}{ "name": req.Name, @@ -287,13 +218,9 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error) if err = dao.TxUpdateBundleLang(tx, req.Uuid, req.Language, updateBundleLang); err != nil { return res, errors.New("更新套餐信息失败") } - res.Uuid = req.Uuid res.Msg = "保存成功" } - if res.CancelNum > 0 { - res.Msg = "币种已修改,已取消关联部分增值服务" - } return res, nil } @@ -409,6 +336,22 @@ func HandleShelf(req *bundle.HandShelfRequest) (res *bundle.CommonResponse, err if req.ShelfStatus != 1 && req.ShelfStatus != 2 { return res, errors.New("状态值无效") } + bundleDetailLangs, err := dao.GetBundleLangsByUuid(req.Uuid) + if err != nil { + return res, errors.New("查询套餐失败") + } + var langToPriceType = make(map[string]int64) + for _, bundleLang := range bundleDetailLangs { + langToPriceType[bundleLang.Language] = bundleLang.PriceType + } + tx := app.ModuleClients.BundleDB.Begin() + defer func() { + if err != nil { + tx.Rollback() + } else { + tx.Commit() + } + }() if req.ShelfStatus == 1 { valueAddUuids, err := dao.GetValueAddServiceUuidsByBundleUuid(req.Uuid) if err != nil { @@ -429,6 +372,20 @@ func HandleShelf(req *bundle.HandShelfRequest) (res *bundle.CommonResponse, err if !isExist { return res, errors.New("缺失可用时长服务类型") } + //校验币种 + valueAddServices, err := dao.BatchValueAddServiceDetailTx(tx, valueAddUuids) + if err != nil { + return res, errors.New("查询增值服务详情失败") + } + for _, valueAddService := range valueAddServices { + if valueAddService.ValueAddServiceLang != nil && len(valueAddService.ValueAddServiceLang) > 0 { + for _, lang := range valueAddService.ValueAddServiceLang { + if langToPriceType[lang.Language] != lang.PriceType { + return res, errors.New("所选增值服务币种与套餐币种不一致") + } + } + } + } } res, err = dao.HandShelf(req.Uuid, req.ShelfStatus) diff --git a/internal/logic/valueAddBundleLogic.go b/internal/logic/valueAddBundleLogic.go index 5d350e2..553bc0c 100644 --- a/internal/logic/valueAddBundleLogic.go +++ b/internal/logic/valueAddBundleLogic.go @@ -246,7 +246,7 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon return res, errors.New("保存增值服务失败") } } - langList := []string{msg.ZH_TW, msg.EN, msg.DE_DE, msg.JS_JP} + langList := []string{msg.ZH_TW, msg.EN, msg.DE_DE, msg.JA_JP} for _, lang := range langList { otherLang := model.ValueAddServiceLang{ UUID: valueAddServiceLang.UUID, @@ -286,21 +286,6 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon return res, errors.New("更新增值服务失败") } } - // 查找所有与该增值服务关联的套餐,若币种不一致则取消关联并统计 - var cancelNum int64 = 0 - bundleToValueAddList, _ := dao.GetBundleToValueAddServiceByValueUid(in.Uuid) - for _, rel := range bundleToValueAddList { - bundleProfile, _ := dao.BundleDetailByUuidAndLanguage(rel.BundleUuid, in.Language) - if bundleProfile != nil && bundleProfile.PriceType != in.PriceType { - dao.DeleteBundleToValueAddService(tx, rel.BundleUuid, in.Uuid) - cancelNum++ - } - if err := dao.TxUpdateBundle(tx, rel.BundleUuid, map[string]interface{}{ - "updated_at": time.Now(), - }); err != nil { - return res, errors.New("同步更新套餐失败") - } - } //更新语言表 updateLangService := map[string]interface{}{ "uuid": in.Uuid, @@ -316,13 +301,25 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon if err := dao.UpdateValueAddServiceLang(tx, updateLangService); err != nil { return res, errors.New("更新增值服务失败") } + data, err := dao.GetBundleToValueAddServiceByValueUid(in.Uuid) + if err != nil { + return res, errors.New("获取套餐信息失败") + } + bundleUuids := []string{} + if data != nil && len(data) > 0 { + for _, bundle := range data { + bundleUuids = append(bundleUuids, bundle.BundleUuid) + } + } + columns := map[string]interface{}{ + "updated_at": time.Now(), + } + if err = dao.TxUpdateBundles(tx, bundleUuids, columns); err != nil { + return res, errors.New("更新套餐信息失败") + } res.Uuid = in.Uuid - res.CancelNum = cancelNum res.Msg = "保存成功" } - if res.CancelNum > 0 { - res.Msg = "币种已修改,已取消关联部分套餐" - } return } diff --git a/internal/model/bundle.go b/internal/model/bundle.go index 42ec828..6fc81cb 100644 --- a/internal/model/bundle.go +++ b/internal/model/bundle.go @@ -37,7 +37,7 @@ type BundleProfileLang struct { Price float32 `json:"price" gorm:"column:price;type:decimal(12,2);comment:套餐价格"` PriceType int64 `json:"priceType" gorm:"column:price_type;type:int;comment:套餐类型 1:人民币 2:美元"` Content string `json:"content" gorm:"column:content;type:text;comment:套餐内容"` - Language string `json:"language" gorm:"column:language;type:varchar(32);comment:套餐语言 zh-CN zh-TW EN de-DE js-JP(中繁英德日)"` + Language string `json:"language" gorm:"column:language;type:varchar(32);comment:套餐语言 zh-CN zh-TW EN de-DE ja-JP(中繁英德日)"` CreatedAt int64 `gorm:"column:created_at;autoCreateTime"` UpdatedAt int64 `gorm:"column:updated_at;autoCreateTime"` DeletedAt soft_delete.DeletedAt diff --git a/internal/model/valueAdd_bundle.go b/internal/model/valueAdd_bundle.go index e0874f0..e0553ee 100644 --- a/internal/model/valueAdd_bundle.go +++ b/internal/model/valueAdd_bundle.go @@ -53,7 +53,7 @@ type ValueAddServiceLang struct { OriginalPrice float32 `json:"originalPrice" gorm:"column:original_price;type:decimal(12,2);comment:原单价"` TotalPrice float32 `json:"totalPrice" gorm:"column:total_price;type:decimal(12,2);comment:增值服务总价"` Unit string `json:"unit" gorm:"column:unit;type:varchar(50);comment:单位 1:个 2:条 3:天 4:月 5:年"` - Language string `json:"language" gorm:"column:language;type:varchar(32);comment:套餐语言 zh-CN zh-TW EN de-DE js-JP(中繁英德日)"` + Language string `json:"language" gorm:"column:language;type:varchar(32);comment:套餐语言 zh-CN zh-TW EN de-DE ja-JP(中繁英德日)"` PriceType int64 `json:"priceType" gorm:"column:price_type;type:int;comment:币种 1:人民币 2:美元 3:日元 4:欧元"` Options PriceOptions `gorm:"column:options;type:json" json:"options"` CreatedAt int64 `gorm:"column:created_at;autoCreateTime"` diff --git a/pkg/msg/msg.go b/pkg/msg/msg.go index 19fcee4..46b7af1 100644 --- a/pkg/msg/msg.go +++ b/pkg/msg/msg.go @@ -15,7 +15,7 @@ const ( ZH_TW = "zh-TW" //繁体中文 EN = "EN" //英文 DE_DE = "de-DE" //德语 - JS_JP = "js-JP" //日语 + JA_JP = "ja-JP" //日语 ) const (