micro-bundle/internal/logic/valueAddBundleLogic.go

384 lines
12 KiB
Go
Raw Normal View History

2025-03-25 08:30:09 +00:00
package logic
import (
2025-05-28 01:34:43 +00:00
"errors"
"fmt"
2025-03-25 08:30:09 +00:00
"micro-bundle/internal/dao"
"micro-bundle/internal/model"
"micro-bundle/pb/bundle"
2025-05-28 01:34:43 +00:00
"micro-bundle/pkg/app"
2025-03-28 01:23:17 +00:00
"micro-bundle/pkg/msg"
2025-05-28 01:34:43 +00:00
"strconv"
"time"
2025-03-25 08:30:09 +00:00
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
2025-05-28 01:34:43 +00:00
"gorm.io/gorm"
2025-03-25 08:30:09 +00:00
)
// 增值套餐创建
2025-03-28 01:23:17 +00:00
func CreateValueAddBundle(req *bundle.CreateValueAddBundleRequest) (res *bundle.CreateValueAddBundleResponse, err error) {
res = &bundle.CreateValueAddBundleResponse{}
2025-03-25 08:30:09 +00:00
2025-03-28 01:23:17 +00:00
savedAmount := float32(req.Num * (msg.OriginalPrice - msg.DiscountPrice))
totalPrice := float32(req.Num * msg.DiscountPrice)
valueAddBundleProfile := &model.ValueAddBundleProfile{
UUID: utils.GetUUID(),
Num: req.Num,
OriginalPrice: msg.OriginalPrice,
DiscountPrice: msg.DiscountPrice,
SavedAmount: savedAmount,
TotalPrice: totalPrice,
2025-03-28 18:05:56 +00:00
//Type: msg.Custom,
2025-03-28 01:23:17 +00:00
}
err = dao.CreateValueAddBundle(valueAddBundleProfile)
if err != nil {
res.Msg = msg.ErrorCreateValueAddBundleInfo
return res, err
}
res.Uuid = valueAddBundleProfile.UUID
res.TotalPrice = totalPrice
res.SavedAmount = savedAmount
res.Msg = msg.SuccessCreateValueAddBundleInfo
2025-03-25 08:30:09 +00:00
return
}
// 增值套餐列表
func ValueAddBundleList(req *bundle.ValueAddBundleListRequest) (res *bundle.ValueAddBundleListResponse, err error) {
2025-03-28 01:23:17 +00:00
res = &bundle.ValueAddBundleListResponse{}
2025-03-28 20:59:56 +00:00
var bundleCommonUid string
2025-03-28 23:33:16 +00:00
var bundleProfile *model.BundleProfile
bundleProfile, err = dao.BundleProfileDetail(req.BundleUuid)
2025-03-28 08:47:41 +00:00
if err != nil {
2025-03-28 23:33:16 +00:00
return
2025-03-28 08:47:41 +00:00
} else {
2025-03-28 23:33:16 +00:00
var bundleOrderRecord *model.BundleOrderRecords
2025-03-29 03:22:19 +00:00
bundleOrderRecord, err = dao.GetBundleOrderRecordsByCommonUidAndUserId(bundleProfile.BundleCommonUid, req.UserId)
2025-03-28 23:33:16 +00:00
if err != nil {
err = nil
} else {
bundleCommonUid = bundleOrderRecord.BundleCommonUid
res.OrderNo = true
res.Price = bundleOrderRecord.ValueAddBundleAmount
res.Num = bundleOrderRecord.Num
if bundleOrderRecord.ValueAddBundleUUID != "" {
res.Status = true
}
2025-03-28 08:47:41 +00:00
}
}
2025-03-28 18:05:56 +00:00
valueAddBundleProfile, err := dao.ValueAddBundleList(req.PriceType)
2025-03-28 01:23:17 +00:00
if err != nil {
res.Msg = msg.ErrorGetValueAddBundleList
return res, err
}
for _, valueAddBundle := range valueAddBundleProfile {
2025-03-28 08:47:41 +00:00
valueAddBundleProfileInfo := &bundle.ValueAddBundleProfile{
2025-03-28 01:23:17 +00:00
Uuid: valueAddBundle.UUID,
Num: valueAddBundle.Num,
OriginalPrice: valueAddBundle.OriginalPrice,
DiscountPrice: valueAddBundle.DiscountPrice,
TotalPrice: valueAddBundle.TotalPrice,
SavedAmount: valueAddBundle.SavedAmount,
DiscountPriceStatus: valueAddBundle.DiscountPriceStatus,
Choose: valueAddBundle.Choose,
2025-03-28 08:47:41 +00:00
}
2025-03-28 20:59:56 +00:00
if bundleCommonUid == valueAddBundle.AddBundleCommonUid {
2025-03-28 08:47:41 +00:00
valueAddBundleProfileInfo.Status = true
}
res.Data = append(res.Data, valueAddBundleProfileInfo)
}
2025-03-28 01:23:17 +00:00
res.OriginalPrice = msg.OriginalPrice
res.Total = int32(len(valueAddBundleProfile))
res.Msg = "SUCCESS"
2025-03-25 08:30:09 +00:00
return
}
// 增值套餐详情
func ValueAddBundleDetail(req *bundle.ValueAddBundleDetailRequest) (res *bundle.ValueAddBundleDetailResponse, err error) {
2025-03-28 01:23:17 +00:00
res = &bundle.ValueAddBundleDetailResponse{}
valueAddBundleProfile := &model.ValueAddBundleProfile{}
valueAddBundleProfile, err = dao.ValueAddBundleDetail(req.Uuid)
2025-03-25 08:30:09 +00:00
if err != nil {
2025-03-28 01:23:17 +00:00
res.Msg = msg.ErrorGetValueAddBundleInfo
return res, err
2025-03-25 08:30:09 +00:00
}
2025-03-28 01:23:17 +00:00
res.Data = &bundle.ValueAddBundleProfile{
Uuid: valueAddBundleProfile.UUID,
Num: valueAddBundleProfile.Num,
OriginalPrice: valueAddBundleProfile.OriginalPrice,
DiscountPrice: valueAddBundleProfile.DiscountPrice,
TotalPrice: valueAddBundleProfile.TotalPrice,
SavedAmount: valueAddBundleProfile.SavedAmount,
DiscountPriceStatus: valueAddBundleProfile.DiscountPriceStatus,
Choose: valueAddBundleProfile.Choose,
2025-03-28 20:59:56 +00:00
AddBundleCommonUid: valueAddBundleProfile.AddBundleCommonUid,
2025-03-28 01:23:17 +00:00
}
2025-03-28 02:54:04 +00:00
bundleOrderRecords := &model.BundleOrderRecords{}
bundleOrderRecords, err = dao.BundleOrderRecordsDetailByAddUid(req.Uuid)
if err != nil {
err = nil
} else {
res.PayTime = bundleOrderRecords.PayTime
}
2025-03-28 01:23:17 +00:00
res.Msg = "SUCCESS"
2025-03-25 08:30:09 +00:00
return
}
2025-05-28 01:34:43 +00:00
//*******************************************************************新增值服务***********************
// 增值套餐保存(无则新增,有则更新)
func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveResponse, err error) {
res = &bundle.SaveResponse{}
if in.Language == "" {
return res, errors.New("语言参数不能为空")
}
var options model.PriceOptions
for _, option := range in.Options {
price, parseErr := strconv.ParseFloat(option.Price, 32)
if parseErr != nil {
return res, parseErr
}
options = append(options, &model.PriceOption{
Id: int32(option.Id),
Num: option.Num,
Symbol: option.Symbol,
Price: float32(price),
})
}
ok, err := model.ValidateOptions(options)
if !ok {
return res, err
}
valueAddService := &model.ValueAddService{
ServiceName: in.ServiceName,
ServiceType: in.ServiceType,
}
originalPrice, err := strconv.ParseFloat(in.OriginalPrice, 32)
if err != nil {
return res, err
}
valueAddServiceLang := &model.ValueAddServiceLang{
ServiceName: in.ServiceName,
ServiceType: in.ServiceType,
PriceMode: int32(in.PriceMode),
OriginalPrice: float32(originalPrice),
Unit: in.Unit,
Language: in.Language,
PriceType: in.PriceType,
Options: options,
}
if in.Uuid == "" && in.Language != msg.ZH_CN {
return res, errors.New("请先新增简体中文套餐,再添加其他语言版本")
}
tx := app.ModuleClients.BundleDB.Begin()
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
// 检查当前语言套餐是否存在
_, err = dao.ValueAddServiceDetailByUuidAndLanguage(in.Uuid, in.Language)
if err != nil {
if err == gorm.ErrRecordNotFound { // 当前语言套餐不存在
if in.Language != msg.ZH_CN {
_, err = dao.ValueAddServiceDetailByUuidAndLanguage(in.Uuid, msg.ZH_CN)
if err != nil {
if err != gorm.ErrRecordNotFound {
return res, errors.New("请先创建中文套餐")
} else {
// // 新语言补充只要UUID存在即可直接插入新语言
// if in.Uuid != "" {
// valueAddServiceLang.UUID = in.Uuid
// if err = dao.CreateValueAddServiceLang(tx, valueAddServiceLang); err != nil {
// return res, errors.New("补充新语言套餐失败: " + err.Error())
// }
// res.Uuid = in.Uuid
// res.Msg = "补充新语言套餐成功"
// return
// }
return
}
}
}
if in.Language == msg.ZH_CN {
valueAddService.UUID = utils.GetUUID()
err = dao.CreateValueAddService(tx, valueAddService)
if err != nil {
return res, errors.New("保存中文语言套餐失败: " + err.Error())
}
valueAddServiceLang.UUID = valueAddService.UUID
res.Uuid = valueAddService.UUID
if err = dao.CreateValueAddServiceLang(tx, valueAddServiceLang); err != nil {
return res, errors.New("保存语言套餐失败: " + err.Error())
}
}
langList := []string{msg.ZH_TW, msg.EN, msg.DE_DE, msg.JS_JP}
for _, lang := range langList {
otherLang := *valueAddServiceLang
otherLang.Language = lang
if err = dao.CreateValueAddServiceLang(tx, &otherLang); err != nil {
return res, errors.New(fmt.Sprintf("保存%s语言套餐失败: ", lang) + err.Error())
}
}
res.Msg = "保存成功"
return
} else {
return
}
} else {
// 已存在,进行更新
//中文状态下,更新主表和语言表
if in.Language == msg.ZH_CN {
updateService := map[string]interface{}{
"uuid": in.Uuid,
"service_name": in.ServiceName,
"service_type": in.ServiceType,
}
if err = dao.UpdateValueAddService(tx, updateService); err != nil {
return res, err
}
}
// 查找所有与该增值服务关联的套餐,若币种不一致则取消关联并统计
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++
}
}
//更新语言表
updateLangService := map[string]interface{}{
"uuid": in.Uuid,
"service_name": in.ServiceName,
"service_type": in.ServiceType,
"price_mode": in.PriceMode,
"original_price": in.OriginalPrice,
"unit": in.Unit,
"price_type": in.PriceType,
"options": options,
"language": in.Language,
}
if err = dao.UpdateValueAddServiceLang(tx, updateLangService); err != nil {
return res, err
}
res.Uuid = in.Uuid
res.Msg = "保存成功"
res.CancelNum = cancelNum
}
return
}
// 增值套餐列表
func ValueAddServiceList(req *bundle.ValueAddServiceListRequest) (res *bundle.ValueAddServiceListResponse, err error) {
res = &bundle.ValueAddServiceListResponse{}
list, total, err := dao.ValueAddServiceList(req)
if err != nil {
res.Msg = msg.ErrorValueAddServiceList
return res, err
}
for _, valueAddService := range list {
serviceInfo := &bundle.ValueAddService{
Uuid: valueAddService.UUID,
ServiceName: valueAddService.ServiceName,
ServiceType: valueAddService.ServiceType,
}
for _, serviceLang := range valueAddService.ValueAddServiceLang {
serviceLangInfo := &bundle.ValueAddServiceLang{
Uuid: valueAddService.UUID,
ServiceName: serviceLang.ServiceName,
ServiceType: serviceLang.ServiceType,
PriceMode: serviceLang.PriceMode,
OriginalPrice: fmt.Sprintf("%.2f", serviceLang.OriginalPrice),
Unit: serviceLang.Unit,
PriceType: int64(serviceLang.PriceType),
Language: serviceLang.Language,
CreatedAt: time.Unix(serviceLang.CreatedAt, 0).Format("2006-01-02 15:04:05"),
UpdatedAt: time.Unix(serviceLang.UpdatedAt, 0).Format("2006-01-02 15:04:05"),
}
if serviceLang.Options != nil && len(serviceLang.Options) > 0 {
var options []*bundle.ValueAddPriceOptions
for _, option := range serviceLang.Options {
options = append(options, &bundle.ValueAddPriceOptions{
Id: int64(option.Id),
Num: option.Num,
Symbol: option.Symbol,
Price: fmt.Sprintf("%.2f", option.Price),
})
}
serviceLangInfo.Options = options
}
serviceInfo.ServiceLang = append(serviceInfo.ServiceLang, serviceLangInfo)
}
res.ValueAddServiceList = append(res.ValueAddServiceList, serviceInfo)
}
res.Total = int32(total)
res.Msg = msg.SuccessValueAddServiceList
return
}
// 增值套餐详情
func ValueAddServiceDetail(req *bundle.ValueAddServiceDetailRequest) (res *bundle.ValueAddServiceDetailResponse, err error) {
res = &bundle.ValueAddServiceDetailResponse{}
if req.Uuid == "" {
res.Msg = msg.ErrorValueAddServiceInfo
return res, errors.New("uuid不能为空")
}
if req.Language == "" {
res.Msg = msg.ErrorValueAddServiceInfo
return res, errors.New("语言选项不能为空")
}
detail, err := dao.ValueAddServiceDetailByUuidAndLanguage(req.Uuid, req.Language)
if err != nil {
res.Msg = msg.ErrorValueAddServiceInfo
return res, err
}
langOptions := []*bundle.ValueAddPriceOptions{}
if detail.Options != nil && len(detail.Options) > 0 {
for _, opt := range detail.Options {
langOptions = append(langOptions, &bundle.ValueAddPriceOptions{
Id: int64(opt.Id),
Num: opt.Num,
Symbol: opt.Symbol,
Price: fmt.Sprintf("%.2f", opt.Price),
})
}
}
serviceLang := &bundle.ValueAddServiceLang{
Uuid: detail.UUID,
ServiceName: detail.ServiceName,
ServiceType: detail.ServiceType,
Language: detail.Language,
PriceMode: detail.PriceMode,
OriginalPrice: fmt.Sprintf("%.2f", detail.OriginalPrice),
Unit: detail.Unit,
PriceType: int64(detail.PriceType),
Options: langOptions,
CreatedAt: time.Unix(detail.CreatedAt, 0).Format("2006-01-02 15:04:05"),
UpdatedAt: time.Unix(detail.UpdatedAt, 0).Format("2006-01-02 15:04:05"),
}
res.ValueAddServiceLang = serviceLang
res.Msg = msg.SuccessValueAddServiceInfo
return
}