修改
This commit is contained in:
parent
7b3e4f3522
commit
af14bcf74b
@ -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)
|
||||||
|
@ -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:备注"`
|
||||||
|
Loading…
Reference in New Issue
Block a user