Merge branch 'sxy' into dev

This commit is contained in:
孙肖扬 2025-06-23 15:24:05 +08:00
commit cba59941cb
6 changed files with 91 additions and 127 deletions

View File

@ -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
}

View File

@ -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
}
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)

View File

@ -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,12 +301,24 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon
if err := dao.UpdateValueAddServiceLang(tx, updateLangService); err != nil {
return res, errors.New("更新增值服务失败")
}
res.Uuid = in.Uuid
res.CancelNum = cancelNum
res.Msg = "保存成功"
data, err := dao.GetBundleToValueAddServiceByValueUid(in.Uuid)
if err != nil {
return res, errors.New("获取套餐信息失败")
}
if res.CancelNum > 0 {
res.Msg = "币种已修改,已取消关联部分套餐"
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.Msg = "保存成功"
}
return
}

View File

@ -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

View File

@ -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"`

View File

@ -15,7 +15,7 @@ const (
ZH_TW = "zh-TW" //繁体中文
EN = "EN" //英文
DE_DE = "de-DE" //德语
JS_JP = "js-JP" //日语
JA_JP = "ja-JP" //日语
)
const (