Merge branch 'sxy' into dev

This commit is contained in:
孙肖扬 2025-06-18 11:42:56 +08:00
commit 412e679b94
2 changed files with 65 additions and 83 deletions

View File

@ -3,7 +3,6 @@ package logic
import (
"encoding/json"
"errors"
"fmt"
"micro-bundle/internal/dao"
"micro-bundle/pkg/app"
"micro-bundle/pkg/msg"
@ -60,7 +59,7 @@ func BundleDetail(req *bundle.BundleDetailRequest) (res *bundle.BundleDetailResp
func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error) {
res = &bundle.SaveResponse{}
if req.Language == "" {
return res, errors.New("语言参数不能为空")
return res, errors.New("语言不能为空")
}
if req.Sort <= 0 {
return res, errors.New("排序参数需为正整数")
@ -92,7 +91,7 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
if req.Uuid != "" {
valueService, existErr := dao.GetValueAddServiceUuidsByBundleUuid(req.Uuid)
if existErr != nil {
return res, existErr
return res, errors.New("查询增值服务失败")
}
if valueService != nil && len(valueService) > 0 {
for _, v := range valueService {
@ -108,15 +107,15 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
detail, checkErr := dao.ValueAddServiceDetailByUuidAndLanguage(v.ValueAddUuid, req.Language)
if checkErr != nil {
if checkErr == gorm.ErrRecordNotFound {
return res, errors.New(fmt.Sprintf("所选增值服务[%s]%s版不存在,请先创建对应增值套餐", v.ServiceName, req.Language))
return res, errors.New("增值服务不存在")
} else {
return res, checkErr
return res, errors.New("查询增值服务失败")
}
}
if detail.PriceType != req.PriceType {
if req.Uuid == "" {
//中文套餐创建时,币种不一致直接返回错误
return res, errors.New(fmt.Sprintf("所选增值服务[%s]%s币种与套餐币种不一致", detail.ServiceName, req.Language))
return res, errors.New("所选增值服务币种与套餐币种不一致")
} else {
//更新时,判断是否已存在,存在则取消关联
_, ok := existValueService[v.ValueAddUuid]
@ -125,13 +124,13 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
continue
} else {
//币种不一致,新加币种时返回错误
return res, errors.New(fmt.Sprintf("所选增值服务[%s]%s币种与套餐币种不一致", detail.ServiceName, req.Language))
return res, errors.New("所选增值服务币种与套餐币种不一致")
}
}
}
if _, exists := selectValueAddServiceCount[int(detail.ServiceType)]; exists {
return res, errors.New(fmt.Sprintf("所选增值服务[%s]类型存在多个", detail.ServiceName))
return res, errors.New("每种增值服务类型只可选择一个")
}
selectValueAddServiceCount[int(detail.ServiceType)] = struct{}{}
selectService = append(selectService, &model.BundleToValueAddService{
@ -161,14 +160,14 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
res.Msg = "请先创建中文版本套餐"
return res, errors.New("请先创建中文版本套餐")
} else {
return res, err
return res, errors.New("获取套餐信息失败")
}
}
}
if req.Language == msg.ZH_CN {
bundleProfile.UUID = utils.GetUUID()
if err = dao.TxCreateBundle(tx, bundleProfile); err != nil {
return res, errors.New("保存中文语言套餐失败: " + err.Error())
return res, errors.New("创建套餐信息失败")
}
bundleLang.UUID = bundleProfile.UUID
res.Uuid = bundleProfile.UUID
@ -178,7 +177,7 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
}
if len(selectService) > 0 {
if err = dao.CreateBundleToValueAddService(tx, selectService); err != nil {
return res, errors.New("保存套餐与增值服务关联失败: " + err.Error())
return res, errors.New("保存套餐与增值服务关联失败")
}
}
} else {
@ -194,11 +193,11 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
//可以改成批量获取
valueDetail, err2 := dao.ValueAddServiceDetailByUuidAndLanguage(v, req.Language)
if err2 != nil {
return res, err2
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("删除套餐与增值服务关联失败: " + err.Error())
return res, errors.New("删除套餐与增值服务关联失败")
}
count++
}
@ -207,9 +206,8 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
res.CancelNum = int64(count)
}
if err = dao.TxCreateBundleLang(tx, bundleLang); err != nil {
return res, errors.New("保存语言套餐失败: " + err.Error())
return res, errors.New("创建套餐信息失败")
}
res.Msg = "保存成功"
return res, nil
} else {
return
@ -223,15 +221,11 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
if req.Language == msg.ZH_CN {
if len(cancelValueAddService) > 0 {
cancel := "以下增值服务:"
for _, v := range cancelValueAddService {
cancel += fmt.Sprintf("[%s]%s", v, req.Language)
if err = tx.Where("bundle_uuid = ? AND value_uid = ?", req.Uuid, v).Delete(&model.BundleToValueAddService{}).Error; err != nil {
return res, errors.New("删除套餐与增值服务关联失败: " + err.Error())
return res, errors.New("删除套餐与增值服务关联失败")
}
}
cancel += "版币种与套餐币种不一致"
res.Msg = "保存cn成功 " + cancel
}
res.CancelNum = int64(len(cancelValueAddService))
updateBundle := map[string]interface{}{
@ -246,18 +240,18 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
"font_color": req.FontColor,
}
if err = dao.TxUpdateBundle(tx, req.Uuid, updateBundle); err != nil {
return res, err
return res, errors.New("更新套餐信息失败")
}
// 更新中间表函数
if err = diffUpdateBundleToValueAddService(tx, req.Uuid, selectService); err != nil {
tx.Rollback()
return res, err
return res, errors.New("更新套餐与增值服务关联失败")
}
} else {
//更新其他语言时 先获取所有关联增值服务,判断币种是否一致,不一致则取消关联
valueAddService, err := dao.GetBundleToValueAddServiceByBundleUuid(req.Uuid)
if err != nil {
return res, err
return res, errors.New("查询套餐与增值服务关联失败")
}
cancelValueService := make(map[string]string)
for _, v := range valueAddService {
@ -266,7 +260,7 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
if checkErr == gorm.ErrRecordNotFound {
continue
} else {
return res, checkErr
return res, errors.New("查询增值服务失败")
}
}
if detail.PriceType != req.PriceType {
@ -275,15 +269,11 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
}
}
if int64(len(cancelValueService)) > 0 {
cancel := "以下增值服务:"
for k, v := range cancelValueService {
cancel += fmt.Sprintf("[%s]%s", v, req.Language)
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("删除套餐与增值服务关联失败: " + err.Error())
return res, errors.New("删除套餐与增值服务关联失败")
}
}
cancel += "版币种与套餐币种不一致,已取消相关关联"
res.Msg = "保存成功 " + cancel
res.CancelNum = int64(len(cancelValueService))
}
}
@ -294,13 +284,10 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
"price_type": req.PriceType,
}
if err = dao.TxUpdateBundleLang(tx, req.Uuid, req.Language, updateBundleLang); err != nil {
return res, err
return res, errors.New("更新套餐信息失败")
}
res.Uuid = req.Uuid
if res.Msg == "" {
res.Msg = "保存成功"
}
}
return res, nil
}
@ -308,7 +295,10 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
func BundleListV2(req *bundle.BundleListRequest) (res *bundle.BundleListResponse, err error) {
res = new(bundle.BundleListResponse)
res, err = dao.BundleListV2(req)
return
if err != nil {
return res, errors.New("获取套餐列表失败")
}
return res, nil
}
func BundleDetailV2(req *bundle.BundleDetailRequest) (res *bundle.BundleDetailResponseV2, err error) {
res = new(bundle.BundleDetailResponseV2)
@ -316,14 +306,14 @@ func BundleDetailV2(req *bundle.BundleDetailRequest) (res *bundle.BundleDetailRe
bundleProfileLangs := make([]*bundle.BundleProfileLang, 0)
selectValueAddServices := make([]*bundle.SelectValueAddService, 0) //已选增值服务
if req.Uuid == "" {
return res, errors.New("uuid不能为空")
return res, errors.New("缺少套餐UUID")
}
// if req.Language == "" {
// return res, errors.New("language不能为空")
// }
detail, err := dao.BundleDetailV2(req)
if err != nil {
res.Msg = err.Error()
return res, errors.New("获取套餐信息失败")
}
if detail != nil {
bundleProfile.Uuid = detail.UUID
@ -404,19 +394,17 @@ func BundleDetailV2(req *bundle.BundleDetailRequest) (res *bundle.BundleDetailRe
func HandleShelf(req *bundle.HandShelfRequest) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
if req.Uuid == "" {
return res, errors.New("uuid不能为空")
return res, errors.New("缺少套餐UUID")
}
if req.ShelfStatus != 1 && req.ShelfStatus != 2 {
return res, errors.New("Invalid shelf status")
return res, errors.New("状态值无效")
}
res, err = dao.HandShelf(req.Uuid, req.ShelfStatus)
if err != nil {
res.Msg = err.Error()
return res, err
return res, errors.New("更新套餐状态失败")
}
res.Msg = "Operation success"
return res, nil
}
@ -424,7 +412,7 @@ func HandleShelf(req *bundle.HandShelfRequest) (res *bundle.CommonResponse, err
func diffUpdateBundleToValueAddService(tx *gorm.DB, bundleUuid string, selectService []*model.BundleToValueAddService) error {
oldUuids, err := dao.GetValueAddServiceUuidsByBundleUuid(bundleUuid)
if err != nil {
return errors.New("查询套餐与增值服务关联失败: " + err.Error())
return errors.New("查询套餐与增值服务关联失败")
}
newUuids := make(map[string]*model.BundleToValueAddService)
for _, s := range selectService {
@ -451,12 +439,12 @@ func diffUpdateBundleToValueAddService(tx *gorm.DB, bundleUuid string, selectSer
}
if len(toDel) > 0 {
if err = tx.Where("bundle_uuid = ? AND value_uid IN ?", bundleUuid, toDel).Delete(&model.BundleToValueAddService{}).Error; err != nil {
return errors.New("删除套餐与增值服务关联失败: " + err.Error())
return errors.New("删除套餐与增值服务关联失败")
}
}
if len(toAdd) > 0 {
if err = dao.CreateBundleToValueAddService(tx, toAdd); err != nil {
return errors.New("保存套餐与增值服务关联失败: " + err.Error())
return errors.New("保存套餐与增值服务关联失败")
}
}
return nil
@ -465,7 +453,7 @@ func saveBundleHistory(tx *gorm.DB, bundleUuid string, operator string, operator
// 保存历史记录
data, err := dao.GetBundleDetailByUuid(bundleUuid)
if err != nil {
return errors.New("查询套餐详情失败: " + err.Error())
return errors.New("获取套餐信息失败")
}
bundleToValueAddService := data.BundleToValueAddService
data.BundleToValueAddService = nil
@ -477,15 +465,15 @@ func saveBundleHistory(tx *gorm.DB, bundleUuid string, operator string, operator
}
valueData, err := dao.BatchValueAddServiceDetailTx(tx, valueUuid)
if err != nil {
return errors.New("查询增值服务详情失败: " + err.Error())
return errors.New("查询增值服务详情失败")
}
j, err := json.Marshal(data)
if err != nil {
return errors.New("套餐json转换失败: " + err.Error())
return errors.New("序列化转换失败")
}
vJ, err := json.Marshal(valueData)
if err != nil {
return errors.New("增值服务json转换失败: " + err.Error())
return errors.New("序列化转换失败")
}
history := &model.BundleProfileHistory{
Uuid: bundleUuid,
@ -495,7 +483,7 @@ func saveBundleHistory(tx *gorm.DB, bundleUuid string, operator string, operator
OperatorId: operatorId,
}
if err := tx.Create(history).Error; err != nil {
return errors.New("保存套餐历史记录失败: " + err.Error())
return errors.New("保存套餐历史记录失败")
}
return nil
}

View File

@ -147,15 +147,15 @@ func ValueAddBundleDetail(req *bundle.ValueAddBundleDetailRequest) (res *bundle.
func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveResponse, err error) {
res = &bundle.SaveResponse{}
if in.Language == "" {
return res, errors.New("语言参数不能为空")
return res, errors.New("语言不能为空")
}
var options model.PriceOptions
if in.OriginalPrice == "" {
return res, errors.New("原价参数不能为空")
return res, errors.New("原价不能为空")
}
originalPrice, parseErr := strconv.ParseFloat(in.OriginalPrice, 32)
if parseErr != nil {
return res, parseErr
return res, errors.New("原价格式转换失败")
}
index := 1
for _, option := range in.Options {
@ -196,7 +196,7 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon
Options: options,
}
if in.Uuid == "" && in.Language != msg.ZH_CN {
return res, errors.New("请先新增简体中文套餐,再添加其他语言版本")
return res, errors.New("请先创建中文版本增值服务")
}
tx := app.ModuleClients.BundleDB.Begin()
defer func() {
@ -214,7 +214,7 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon
_, err = dao.ValueAddServiceDetailByUuidAndLanguage(in.Uuid, msg.ZH_CN)
if err != nil {
if err != gorm.ErrRecordNotFound {
return res, errors.New("请先创建中文套餐")
return res, errors.New("请先创建中文版本增值服务")
} else {
// // 新语言补充只要UUID存在即可直接插入新语言
// if in.Uuid != "" {
@ -234,12 +234,12 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon
valueAddService.UUID = utils.GetUUID()
err = dao.CreateValueAddService(tx, valueAddService)
if err != nil {
return res, errors.New("保存中文语言套餐失败: " + err.Error())
return res, errors.New("保存增值服务失败")
}
valueAddServiceLang.UUID = valueAddService.UUID
res.Uuid = valueAddService.UUID
if err = dao.CreateValueAddServiceLang(tx, valueAddServiceLang); err != nil {
return res, errors.New("保存语言套餐失败: " + err.Error())
return res, errors.New("保存增值服务失败")
}
}
langList := []string{msg.ZH_TW, msg.EN, msg.DE_DE, msg.JS_JP}
@ -258,10 +258,9 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon
}
otherLang.Language = lang
if err = dao.CreateValueAddServiceLang(tx, &otherLang); err != nil {
return res, errors.New(fmt.Sprintf("保存%s语言套餐失败: ", lang) + err.Error())
return res, errors.New("保存增值服务失败")
}
}
res.Msg = "保存成功"
return
} else {
return
@ -269,7 +268,7 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon
} else {
// 已存在,进行更新
if err := saveValueAddServiceHistory(tx, in.Uuid); err != nil {
return res, err
return res, errors.New("保存增值服务历史记录失败")
}
//中文状态下,更新主表和语言表
if in.Language == msg.ZH_CN {
@ -279,7 +278,7 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon
"service_type": in.ServiceType,
}
if err = dao.UpdateValueAddService(tx, updateService); err != nil {
return res, err
return res, errors.New("更新增值服务失败")
}
}
// 查找所有与该增值服务关联的套餐,若币种不一致则取消关联并统计
@ -305,10 +304,9 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon
"language": in.Language,
}
if err := dao.UpdateValueAddServiceLang(tx, updateLangService); err != nil {
return res, err
return res, errors.New("更新增值服务失败")
}
res.Uuid = in.Uuid
res.Msg = "保存成功"
res.CancelNum = cancelNum
}
return
@ -319,8 +317,7 @@ func ValueAddServiceList(req *bundle.ValueAddServiceListRequest) (res *bundle.Va
res = &bundle.ValueAddServiceListResponse{}
list, total, err := dao.ValueAddServiceList(req)
if err != nil {
res.Msg = msg.ErrorValueAddServiceList
return res, err
return res, errors.New("查询增值服务列表失败")
}
for _, valueAddService := range list {
serviceInfo := &bundle.ValueAddService{
@ -370,7 +367,6 @@ func ValueAddServiceList(req *bundle.ValueAddServiceListRequest) (res *bundle.Va
res.ValueAddServiceList = append(res.ValueAddServiceList, serviceInfo)
}
res.Total = int32(total)
res.Msg = msg.SuccessValueAddServiceList
return
}
@ -382,7 +378,7 @@ func ValueAddServiceDetail(req *bundle.ValueAddServiceDetailRequest) (res *bundl
serviceLangs := []*bundle.ValueAddServiceLang{}
if req.Uuid == "" {
res.Msg = msg.ErrorValueAddServiceInfo
return res, errors.New("uuid不能为空")
return res, errors.New("缺少套餐UUID")
}
// if req.Language == "" {
// res.Msg = msg.ErrorValueAddServiceInfo
@ -390,8 +386,7 @@ func ValueAddServiceDetail(req *bundle.ValueAddServiceDetailRequest) (res *bundl
// }
detail, err := dao.ValueAddServiceDetail(req.Uuid)
if err != nil {
res.Msg = msg.ErrorValueAddServiceInfo
return res, err
return res, errors.New("查询增值服务详情失败")
}
if detail != nil && len(detail.ValueAddServiceLang) > 0 {
valueAddService.Uuid = detail.UUID
@ -440,7 +435,6 @@ func ValueAddServiceDetail(req *bundle.ValueAddServiceDetailRequest) (res *bundl
valueAddService.ServiceLang = serviceLangs
res.ValueAddService = valueAddService
res.Msg = msg.SuccessValueAddServiceInfo
return
}
@ -448,11 +442,11 @@ func saveValueAddServiceHistory(tx *gorm.DB, uuid string) (err error) {
// 保存历史记录
data, err := dao.GetValueAddServiceDetailByUuid(tx, uuid)
if err != nil {
return errors.New("查询增值服务详情失败: " + err.Error())
return errors.New("查询增值服务详情失败")
}
j, err := json.Marshal(data)
if err != nil {
return errors.New("json转换失败: " + err.Error())
return errors.New("序列化转换失败")
}
history := &model.ValueAddServiceHistory{
Uuid: uuid,
@ -461,21 +455,21 @@ func saveValueAddServiceHistory(tx *gorm.DB, uuid string) (err error) {
//OperatorId: operatorId,
}
if err := tx.Create(history).Error; err != nil {
return errors.New("保存增值服务历史记录失败: " + err.Error())
return errors.New("保存增值服务历史记录失败")
}
return nil
}
func ValueAddServiceDetailByUuidAndLanguage(req *bundle.ValueAddServiceDetailRequest) (res *bundle.ValueAddServiceLang, err error) {
res = &bundle.ValueAddServiceLang{}
if req.Uuid == "" {
return res, errors.New("uuid不能为空")
return res, errors.New("缺少套餐UUID")
}
if req.Language == "" {
return res, errors.New("语言选项不能为空")
return res, errors.New("语言不能为空")
}
detail, err := dao.ValueAddServiceDetailByUuidAndLanguage(req.Uuid, req.Language)
if err != nil {
return res, err
return res, errors.New("查询增值服务详情失败")
}
if detail == nil {
return res, errors.New("增值服务不存在")
@ -521,14 +515,14 @@ func ValueAddServiceDetailByUuidAndLanguage(req *bundle.ValueAddServiceDetailReq
func CalculatePrice(req *bundle.CalculatePriceRequest) (res *bundle.CalculatePriceResponse, err error) {
res = &bundle.CalculatePriceResponse{}
if req.Uuid == "" {
return res, errors.New("uuid不能为空")
return res, errors.New("缺少套餐UUID")
}
if req.Language == "" {
return res, errors.New("语言选项不能为空")
return res, errors.New("语言不能为空")
}
detail, err := dao.ValueAddServiceDetailByUuidAndLanguage(req.Uuid, req.Language)
if err != nil {
return res, err
return res, errors.New("查询增值服务详情失败")
}
if detail == nil {
return res, errors.New("增值服务不存在")
@ -546,7 +540,7 @@ func CalculatePrice(req *bundle.CalculatePriceRequest) (res *bundle.CalculatePri
// }
price, err := detail.Options.CalculatePrice(detail.PriceMode, req.Num)
if err != nil {
return res, err
return res, errors.New("计算价格失败")
}
res.Price = price
return
@ -554,14 +548,14 @@ func CalculatePrice(req *bundle.CalculatePriceRequest) (res *bundle.CalculatePri
func BatchGetValueAddServiceLang(req *bundle.BatchGetValueAddServiceLangRequest) (res *bundle.BatchGetValueAddServiceLangResponse, err error) {
res = &bundle.BatchGetValueAddServiceLangResponse{}
if req.Uuids == nil || len(req.Uuids) == 0 {
return res, errors.New("uuid不能为空")
return res, errors.New("缺少套餐UUID")
}
if req.Language == "" {
return res, errors.New("语言选项不能为空")
return res, errors.New("语言不能为空")
}
detail, err := dao.BatchGetValueAddServiceLang(req.Uuids, req.Language)
if err != nil {
return res, err
return res, errors.New("查询增值服务详情失败")
}
for _, v := range detail {
langOptions := []*bundle.ValueAddPriceOptions{}