This commit is contained in:
桀尼龟 2025-06-11 14:32:51 +08:00
parent 7b3e4f3522
commit af14bcf74b
2 changed files with 95 additions and 57 deletions

View File

@ -2,18 +2,19 @@ package dao
import ( import (
"encoding/json" "encoding/json"
"gorm.io/gorm"
"micro-bundle/internal/model" "micro-bundle/internal/model"
"micro-bundle/pb/bundle" "micro-bundle/pb/bundle"
"micro-bundle/pkg/app" "micro-bundle/pkg/app"
commonErr "micro-bundle/pkg/err" commonErr "micro-bundle/pkg/err"
"micro-bundle/pkg/msg" "micro-bundle/pkg/msg"
"micro-bundle/pkg/utils" "micro-bundle/pkg/utils"
"time"
) )
func CreateOrderRecord(orderRecord *model.BundleOrderRecords, req *bundle.OrderRecord) (res *bundle.CommonResponse, err error) { func CreateOrderRecord(orderRecord *model.BundleOrderRecords, req *bundle.OrderRecord) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse) res = new(bundle.CommonResponse)
bundleInfo := new(model.BundleProfile) bundleInfo := new(model.BundleProfile)
// 生成UUID和订单号 // 生成UUID和订单号
orderRecord.UUID = app.ModuleClients.SfNode.Generate().Base64() orderRecord.UUID = app.ModuleClients.SfNode.Generate().Base64()
orderRecord.OrderNo = utils.GetOrderNo() orderRecord.OrderNo = utils.GetOrderNo()
@ -40,7 +41,7 @@ func CreateOrderRecord(orderRecord *model.BundleOrderRecords, req *bundle.OrderR
// 填充BundleCommonJson字段 // 填充BundleCommonJson字段
if bundleJson, e := json.Marshal(bundleInfo); e == nil { if bundleJson, e := json.Marshal(bundleInfo); e == nil {
orderRecord.BundleCommonJson = string(bundleJson) orderRecord.BundleCommonJson = bundleJson
} else { } else {
tx.Rollback() tx.Rollback()
res.Msg = msg.ErrorDataConvert res.Msg = msg.ErrorDataConvert
@ -53,39 +54,56 @@ func CreateOrderRecord(orderRecord *model.BundleOrderRecords, req *bundle.OrderR
res.Msg = msg.ErrorCreateOrderInfo res.Msg = msg.ErrorCreateOrderInfo
return res, commonErr.ReturnError(err, msg.ErrorCreateOrderInfo, "创建订单信息失败: ") return res, commonErr.ReturnError(err, msg.ErrorCreateOrderInfo, "创建订单信息失败: ")
} }
var (
// 创建子订单 childOrders []*model.BundleOrderValueAdd
valueAddAmount float64
expirationTime = "9999-12-31"
)
for _, service := range bundleInfo.BundleToValueAddService { for _, service := range bundleInfo.BundleToValueAddService {
amount, PriceType, serviceType, e := calculateAmount(service.ValueUid, req, req.Language) amount, info, num, day, e := calculateAmount(service.ValueUid, req, req.Language)
if e != nil { if e != nil {
tx.Rollback() tx.Rollback()
res.Msg = msg.ErrorDataConvert res.Msg = msg.ErrorDataConvert
return res, commonErr.ReturnError(e, msg.ErrorDataConvert, "子订单金额计算失败: ") return res, commonErr.ReturnError(e, msg.ErrorDataConvert, "子订单金额计算失败: ")
} }
if day != "" {
expirationTime = day
}
valueAddAmount = valueAddAmount + amount
childOrder := &model.BundleOrderValueAdd{ childOrder := &model.BundleOrderValueAdd{
UUID: app.ModuleClients.SfNode.Generate().Base64(), UUID: app.ModuleClients.SfNode.Generate().Base64(),
OrderUUID: orderRecord.UUID, // 修正: 这里应使用主订单UUID OrderUUID: orderRecord.UUID, // 修正: 这里应使用主订单UUID
CustomerID: orderRecord.CustomerID, CustomerID: orderRecord.CustomerID,
CustomerNum: orderRecord.CustomerNum, CustomerNum: orderRecord.CustomerNum,
CustomerName: orderRecord.CustomerName, CustomerName: orderRecord.CustomerName,
ServiceType: serviceType, ServiceType: info.ServiceType,
CurrencyType: PriceType, CurrencyType: info.PriceType,
Amount: amount, Amount: amount,
Num: 0, Num: num,
Unit: 0, Unit: info.Unit,
ValueAddUUID: service.ValueUid, ValueAddUUID: service.ValueUid,
Source: 1, Source: 1,
PaymentStatus: 1, PaymentStatus: 1,
} }
childOrders = append(childOrders, childOrder)
if err = tx.Model(&model.BundleOrderValueAdd{}).Create(childOrder).Error; err != nil { }
// 批量创建子订单(提高性能)
if err = tx.Model(&model.BundleOrderValueAdd{}).Create(childOrders).Error; err != nil {
tx.Rollback() tx.Rollback()
res.Msg = msg.ErrorCreateOrderInfo return res, commonErr.ReturnError(err, msg.ErrorCreateOrderInfo, "批量创建子订单失败")
return res, commonErr.ReturnError(err, msg.ErrorCreateOrderInfo, "创建子订单信息失败: ")
} }
// 更新总金额
updateData := map[string]interface{}{
"total_amount": gorm.Expr("total_amount + ?", valueAddAmount),
"updated_at": time.Now(),
"expiration_time": expirationTime,
}
if err = tx.Model(&model.BundleOrderRecords{}).
Where("uuid = ?", orderRecord.UUID).
Updates(updateData).Error; err != nil {
tx.Rollback()
return res, commonErr.ReturnError(err, msg.ErrorUpdateOrderInfo, "更新订单总金额失败")
} }
// 提交事务 // 提交事务
if err = tx.Commit().Error; err != nil { if err = tx.Commit().Error; err != nil {
res.Msg = msg.ErrorCommitTransaction res.Msg = msg.ErrorCommitTransaction
@ -99,28 +117,45 @@ func CreateOrderRecord(orderRecord *model.BundleOrderRecords, req *bundle.OrderR
} }
// calculateAmount 计算子订单金额 // calculateAmount 计算子订单金额
func calculateAmount(valueUid string, req *bundle.OrderRecord, language string) (float64, int64, int32, error) { func calculateAmount(valueUid string, req *bundle.OrderRecord, language string) (amount float64, valueAddServiceLang *model.ValueAddServiceLang, num int32, expirationDay string, err error) {
var valueAddServiceLang *model.ValueAddServiceLang err = app.ModuleClients.BundleDB.
err := app.ModuleClients.BundleDB.
Where("uuid = ? AND language = ?", valueUid, language). Where("uuid = ? AND language = ?", valueUid, language).
First(&valueAddServiceLang).Error First(&valueAddServiceLang).Error
if err != nil { if err != nil {
return 0, valueAddServiceLang.PriceType, valueAddServiceLang.ServiceType, err return
} }
var amount float64
for _, opt := range valueAddServiceLang.Options { for _, opt := range valueAddServiceLang.Options {
if valueAddServiceLang.PriceMode == 1 { if valueAddServiceLang.PriceMode == 1 {
for _, p := range req.PriceOptionsInfo { for _, p := range req.PriceOptionsInfo {
if p.ValueUid == valueUid && opt.Id == p.Id { if p.ValueUid == valueUid && opt.Id == p.Id {
amount = float64(float32(opt.Num) * opt.Price) amount = float64(float32(opt.Num) * opt.Price)
num = opt.Num
} }
} }
} else if valueAddServiceLang.PriceMode == 2 { } else if valueAddServiceLang.PriceMode == 2 {
amount = float64(opt.Price) amount = float64(opt.Price)
} }
// 计算过期时间
if valueAddServiceLang.ServiceType == 5 {
expirationDay = calculateExpirationDay(opt.Num, valueAddServiceLang.Unit)
}
}
return
}
// calculateExpirationDay 计算到期日
func calculateExpirationDay(num int32, unit string) string {
now := time.Now()
switch unit {
case "天":
return now.AddDate(0, 0, int(num)).Format("2006-01-02")
case "月":
return now.AddDate(0, int(num), 0).Format("2006-01-02")
case "年":
return now.AddDate(int(num), 0, 0).Format("2006-01-02")
default:
return ""
} }
return amount, valueAddServiceLang.PriceType, valueAddServiceLang.ServiceType, nil
} }
func UpdateOrderRecord(orderRecord *model.BundleOrderRecords) (res *bundle.CommonResponse, err error) { func UpdateOrderRecord(orderRecord *model.BundleOrderRecords) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse) res = new(bundle.CommonResponse)

View File

@ -1,6 +1,9 @@
package model package model
import "gorm.io/gorm" import (
"encoding/json"
"gorm.io/gorm"
)
// BundleOrderRecords struct // BundleOrderRecords struct
type BundleOrderRecords struct { type BundleOrderRecords struct {
@ -34,7 +37,7 @@ type BundleOrderRecords struct {
AddBundleCommonUid string `json:"addBundleCommonUid" gorm:"column:add_bundle_common_uid;type:text;comment:附加套餐公共ID"` AddBundleCommonUid string `json:"addBundleCommonUid" gorm:"column:add_bundle_common_uid;type:text;comment:附加套餐公共ID"`
FinancialConfirmation int32 `json:"financialConfirmation" gorm:"column:financial_confirmation;type:int;comment:财务确认 1:未确认 2:已确认"` FinancialConfirmation int32 `json:"financialConfirmation" gorm:"column:financial_confirmation;type:int;comment:财务确认 1:未确认 2:已确认"`
ExpirationTime string `json:"expirationTime" gorm:"column:expiration_time;comment:套餐过期时间"` ExpirationTime string `json:"expirationTime" gorm:"column:expiration_time;comment:套餐过期时间"`
BundleCommonJson string `json:"bundle_common_json" gorm:"column:bundle_common_json;type:json;serializer:json;comment:套餐信息"` BundleCommonJson json.RawMessage `json:"bundle_common_json" gorm:"column:bundle_common_json;type:json;serializer:json;comment:套餐信息"`
Language string `gorm:"column:language;comment:语言" json:"language"` Language string `gorm:"column:language;comment:语言" json:"language"`
} }
type BundleOrderValueAdd struct { type BundleOrderValueAdd struct {
@ -48,7 +51,7 @@ type BundleOrderValueAdd struct {
CurrencyType int64 `json:"currencyType" gorm:"column:currency_type;type:int;comment:货币类型"` CurrencyType int64 `json:"currencyType" gorm:"column:currency_type;type:int;comment:货币类型"`
Amount float64 `json:"amount" gorm:"column:amount;type:decimal(12,2);comment:金额"` Amount float64 `json:"amount" gorm:"column:amount;type:decimal(12,2);comment:金额"`
Num int32 `json:"num" gorm:"column:num;type:int;comment:数量"` Num int32 `json:"num" gorm:"column:num;type:int;comment:数量"`
Unit int32 `json:"unit" gorm:"column:unit;type:varchar(1024);comment:单位 1个 2条 3天 4月 5年"` Unit string `json:"unit" gorm:"column:unit;type:varchar(1024);comment:单位 1个 2条 3天 4月 5年"`
ValueAddUUID string `json:"valueAddUUID" gorm:"column:value_add_uuid;type:varchar(1024);comment:增值服务UUID"` ValueAddUUID string `json:"valueAddUUID" gorm:"column:value_add_uuid;type:varchar(1024);comment:增值服务UUID"`
Source int `json:"source" gorm:"column:source;comment:增加方式 1套餐 2单独购买 3拓展"` Source int `json:"source" gorm:"column:source;comment:增加方式 1套餐 2单独购买 3拓展"`
Remark string `json:"remark" gorm:"column:remark;comment:备注"` Remark string `json:"remark" gorm:"column:remark;comment:备注"`