完善定价与套餐关联表结构

This commit is contained in:
2026-03-24 16:25:21 +08:00
parent c9995ef566
commit 5ffa151f58
28 changed files with 1550 additions and 112 deletions

View File

@@ -107,6 +107,7 @@ func createResource(q *q.Query, uid int32, now time.Time, data *CreateResourceDa
ResourceNo: u.P(ID.GenReadable("res")),
Active: true,
Type: data.Type,
Code: data.Type.Code(),
}
switch data.Type {
@@ -120,6 +121,7 @@ func createResource(q *q.Query, uid int32, now time.Time, data *CreateResourceDa
Live: short.Live,
Type: short.Mode,
Quota: short.Quota,
Code: data.Code(),
}
if short.Mode == m.ResourceModeTime {
if short.Expire == nil {
@@ -139,6 +141,7 @@ func createResource(q *q.Query, uid int32, now time.Time, data *CreateResourceDa
Live: long.Live,
Type: long.Mode,
Quota: long.Quota,
Code: data.Code(),
}
if long.Mode == m.ResourceModeTime {
if long.Expire == nil {
@@ -160,11 +163,18 @@ func createResource(q *q.Query, uid int32, now time.Time, data *CreateResourceDa
}
func (s *resourceService) GetSku(data *CreateResourceData) (*m.ProductSku, error) {
sku, err := q.ProductSku.Where(q.ProductSku.Code.Eq(data.Code())).Take()
sku, err := q.ProductSku.
Joins(q.ProductSku.Discount).
Where(q.ProductSku.Code.Eq(data.Code())).
Take()
if err != nil {
return nil, core.NewServErr("产品不可用", err)
}
if sku.Discount == nil {
return nil, core.NewServErr("价格查询失败", err)
}
return sku, nil
}
@@ -174,28 +184,30 @@ func (s *resourceService) GetPrice(sku *m.ProductSku, count int32, uid *int32) (
var uSku *m.ProductSkuUser
if uid != nil {
var err error
uSku, err = q.ProductSkuUser.Where(
q.ProductSkuUser.UserID.Eq(*uid),
q.ProductSkuUser.ProductSkuID.Eq(sku.ID),
).Take()
uSku, err = q.ProductSkuUser.
Joins(q.ProductSkuUser.Discount).
Where(
q.ProductSkuUser.UserID.Eq(*uid),
q.ProductSkuUser.ProductSkuID.Eq(sku.ID)).
Take()
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return decimal.Zero, decimal.Zero, core.NewServErr("客户特殊价查询失败", err)
}
}
// 返回计算价格
price := sku.Price
if uSku != nil && uSku.Price != nil {
price = *uSku.Price
if uSku.Discount == nil {
return decimal.Decimal{}, decimal.Decimal{}, core.NewServErr("价格获取失败")
}
discount := sku.Discount
if uSku != nil && uSku.Discount != nil {
discount = *uSku.Discount
// 返回计算价格
price := sku.Price
discount := sku.Discount.Decimal()
if uSku != nil {
discount = uSku.Discount.Decimal()
}
before := price.Mul(decimal.NewFromInt32(count))
after := before.Mul(decimal.NewFromFloat32(discount))
after := before.Mul(discount)
return before, after, nil
}