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

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

@@ -64,6 +64,7 @@ func main() {
m.UserRole{}, m.UserRole{},
m.Whitelist{}, m.Whitelist{},
m.Inquiry{}, m.Inquiry{},
m.ProductDiscount{},
) )
g.Execute() g.Execute()
} }

View File

@@ -720,30 +720,52 @@ comment on column product.created_at is '创建时间';
comment on column product.updated_at is '更新时间'; comment on column product.updated_at is '更新时间';
comment on column product.deleted_at is '删除时间'; comment on column product.deleted_at is '删除时间';
-- product_discount
drop table if exists product_discount cascade;
create table product_discount (
id int generated by default as identity primary key,
name text,
discount int,
created_at timestamptz default current_timestamp,
updated_at timestamptz default current_timestamp,
deleted_at timestamptz
);
-- product_discount表字段注释
comment on table product_discount is '产品折扣表';
comment on column product_discount.id is 'ID';
comment on column product_discount.name is '折扣名称';
comment on column product_discount.discount is '折扣0 - 100 的整数,表示 xx 折';
comment on column product_discount.created_at is '创建时间';
comment on column product_discount.updated_at is '更新时间';
comment on column product_discount.deleted_at is '删除时间';
-- product_sku -- product_sku
drop table if exists product_sku cascade; drop table if exists product_sku cascade;
create table product_sku ( create table product_sku (
id int generated by default as identity primary key, id int generated by default as identity primary key,
product_id int not null, product_id int not null,
discount_id int,
code text not null, code text not null,
name text not null, name text not null,
price decimal not null, price decimal not null,
discount float not null,
created_at timestamptz default current_timestamp, created_at timestamptz default current_timestamp,
updated_at timestamptz default current_timestamp, updated_at timestamptz default current_timestamp,
deleted_at timestamptz deleted_at timestamptz
); );
create index idx_product_sku_product_id on product_sku (product_id) where deleted_at is null; create index idx_product_sku_product_id on product_sku (product_id) where deleted_at is null;
create index idx_product_sku_discount_id on product_sku (discount_id) where deleted_at is null;
create index idx_product_sku_code on product_sku (code) where deleted_at is null; create index idx_product_sku_code on product_sku (code) where deleted_at is null;
-- product_sku表字段注释 -- product_sku表字段注释
comment on table product_sku is '产品SKU表'; comment on table product_sku is '产品SKU表';
comment on column product_sku.id is 'SKU ID'; comment on column product_sku.id is 'SKU ID';
comment on column product_sku.product_id is '产品ID'; comment on column product_sku.product_id is '产品ID';
comment on column product_sku.discount_id is '折扣ID';
comment on column product_sku.code is 'SKU 代码:格式为 key=value,key=value,...其中key:value 是 SKU 的属性,多个属性用逗号分隔'; comment on column product_sku.code is 'SKU 代码:格式为 key=value,key=value,...其中key:value 是 SKU 的属性,多个属性用逗号分隔';
comment on column product_sku.name is 'SKU 可读名称'; comment on column product_sku.name is 'SKU 可读名称';
comment on column product_sku.price is '定价'; comment on column product_sku.price is '定价';
comment on column product_sku.discount is '折扣0 - 1 的小数,表示 xx 折';
comment on column product_sku.created_at is '创建时间'; comment on column product_sku.created_at is '创建时间';
comment on column product_sku.updated_at is '更新时间'; comment on column product_sku.updated_at is '更新时间';
comment on column product_sku.deleted_at is '删除时间'; comment on column product_sku.deleted_at is '删除时间';
@@ -754,21 +776,20 @@ create table product_sku_user (
id int generated by default as identity primary key, id int generated by default as identity primary key,
user_id int not null, user_id int not null,
product_sku_id int not null, product_sku_id int not null,
price decimal, discount_id int,
discount float,
created_at timestamptz default current_timestamp, created_at timestamptz default current_timestamp,
updated_at timestamptz default current_timestamp updated_at timestamptz default current_timestamp
); );
create index idx_product_sku_user_user_id on product_sku_user (user_id); create index idx_product_sku_user_user_id on product_sku_user (user_id);
create index idx_product_sku_user_product_sku_id on product_sku_user (product_sku_id); create index idx_product_sku_user_product_sku_id on product_sku_user (product_sku_id);
create index idx_product_sku_user_discount_id on product_sku_user (discount_id);
-- product_sku_user表字段注释 -- product_sku_user表字段注释
comment on table product_sku_user is '用户产品SKU表'; comment on table product_sku_user is '用户产品SKU表';
comment on column product_sku_user.id is 'ID'; comment on column product_sku_user.id is 'ID';
comment on column product_sku_user.user_id is '用户ID'; comment on column product_sku_user.user_id is '用户ID';
comment on column product_sku_user.product_sku_id is '产品SKU ID'; comment on column product_sku_user.product_sku_id is '产品SKU ID';
comment on column product_sku_user.price is '定价'; comment on column product_sku_user.discount_id is '折扣ID';
comment on column product_sku_user.discount is '折扣0 - 1 的小数,表示 xx 折';
comment on column product_sku_user.created_at is '创建时间'; comment on column product_sku_user.created_at is '创建时间';
comment on column product_sku_user.updated_at is '更新时间'; comment on column product_sku_user.updated_at is '更新时间';
@@ -777,9 +798,10 @@ drop table if exists resource cascade;
create table resource ( create table resource (
id int generated by default as identity primary key, id int generated by default as identity primary key,
user_id int not null, user_id int not null,
resource_no text, resource_no text not null,
active bool not null default true, code text,
type int not null, type int not null,
active bool not null default true,
created_at timestamptz default current_timestamp, created_at timestamptz default current_timestamp,
updated_at timestamptz default current_timestamp, updated_at timestamptz default current_timestamp,
deleted_at timestamptz deleted_at timestamptz
@@ -787,6 +809,7 @@ create table resource (
create unique index udx_resource_resource_no on resource (resource_no); create unique index udx_resource_resource_no on resource (resource_no);
create index idx_resource_user_id on resource (user_id) where deleted_at is null; create index idx_resource_user_id on resource (user_id) where deleted_at is null;
create index idx_resource_created_at on resource (created_at) where deleted_at is null; create index idx_resource_created_at on resource (created_at) where deleted_at is null;
create index idx_resource_code on resource (code) where deleted_at is null;
-- resource表字段注释 -- resource表字段注释
comment on table resource is '套餐表'; comment on table resource is '套餐表';
@@ -795,6 +818,7 @@ comment on column resource.user_id is '用户ID';
comment on column resource.resource_no is '套餐编号'; comment on column resource.resource_no is '套餐编号';
comment on column resource.active is '套餐状态'; comment on column resource.active is '套餐状态';
comment on column resource.type is '套餐类型1-短效动态2-长效动态'; comment on column resource.type is '套餐类型1-短效动态2-长效动态';
comment on column resource.code is '产品编码';
comment on column resource.created_at is '创建时间'; comment on column resource.created_at is '创建时间';
comment on column resource.updated_at is '更新时间'; comment on column resource.updated_at is '更新时间';
comment on column resource.deleted_at is '删除时间'; comment on column resource.deleted_at is '删除时间';
@@ -804,6 +828,7 @@ drop table if exists resource_short cascade;
create table resource_short ( create table resource_short (
id int generated by default as identity primary key, id int generated by default as identity primary key,
resource_id int not null, resource_id int not null,
code text,
live int not null, live int not null,
type int not null, type int not null,
quota int not null, quota int not null,
@@ -813,11 +838,13 @@ create table resource_short (
last_at timestamptz last_at timestamptz
); );
create index idx_resource_short_resource_id on resource_short (resource_id); create index idx_resource_short_resource_id on resource_short (resource_id);
create index idx_resource_short_code on resource_short (code);
-- resource_short表字段注释 -- resource_short表字段注释
comment on table resource_short is '短效动态套餐表'; comment on table resource_short is '短效动态套餐表';
comment on column resource_short.id is 'ID'; comment on column resource_short.id is 'ID';
comment on column resource_short.resource_id is '套餐ID'; comment on column resource_short.resource_id is '套餐ID';
comment on column resource_short.code is '产品套餐编码';
comment on column resource_short.live is '可用时长(秒)'; comment on column resource_short.live is '可用时长(秒)';
comment on column resource_short.type is '套餐类型1-包时2-包量'; comment on column resource_short.type is '套餐类型1-包时2-包量';
comment on column resource_short.quota is '每日配额(包时)或总配额(包量)'; comment on column resource_short.quota is '每日配额(包时)或总配额(包量)';
@@ -831,6 +858,7 @@ drop table if exists resource_long cascade;
create table resource_long ( create table resource_long (
id int generated by default as identity primary key, id int generated by default as identity primary key,
resource_id int not null, resource_id int not null,
code text,
live int not null, live int not null,
type int not null, type int not null,
quota int not null, quota int not null,
@@ -840,11 +868,13 @@ create table resource_long (
last_at timestamptz last_at timestamptz
); );
create index idx_resource_long_resource_id on resource_long (resource_id); create index idx_resource_long_resource_id on resource_long (resource_id);
create index idx_resource_long_code on resource_long (code);
-- resource_long表字段注释 -- resource_long表字段注释
comment on table resource_long is '长效动态套餐表'; comment on table resource_long is '长效动态套餐表';
comment on column resource_long.id is 'ID'; comment on column resource_long.id is 'ID';
comment on column resource_long.resource_id is '套餐ID'; comment on column resource_long.resource_id is '套餐ID';
comment on column resource_long.code is '产品套餐编码';
comment on column resource_long.live is '可用时长(小时)'; comment on column resource_long.live is '可用时长(小时)';
comment on column resource_long.type is '套餐类型1-包时2-包量'; comment on column resource_long.type is '套餐类型1-包时2-包量';
comment on column resource_long.quota is '每日配额(包时)或总配额(包量)'; comment on column resource_long.quota is '每日配额(包时)或总配额(包量)';
@@ -1113,11 +1143,15 @@ alter table coupon
-- product_sku表外键 -- product_sku表外键
alter table product_sku alter table product_sku
add constraint fk_product_sku_product_id foreign key (product_id) references product (id) on delete cascade; add constraint fk_product_sku_product_id foreign key (product_id) references product (id) on delete cascade;
alter table product_sku
add constraint fk_product_sku_discount_id foreign key (discount_id) references product_discount (id) on delete restrict;
-- product_sku_user表外键 -- product_sku_user表外键
alter table product_sku_user alter table product_sku_user
add constraint fk_product_sku_user_user_id foreign key (user_id) references "user" (id) on delete cascade; add constraint fk_product_sku_user_user_id foreign key (user_id) references "user" (id) on delete cascade;
alter table product_sku_user alter table product_sku_user
add constraint fk_product_sku_user_product_sku_id foreign key (product_sku_id) references product_sku (id) on delete cascade; add constraint fk_product_sku_user_product_sku_id foreign key (product_sku_id) references product_sku (id) on delete cascade;
alter table product_sku_user
add constraint fk_product_sku_user_discount_id foreign key (discount_id) references product_discount (id) on delete restrict;
-- endregion -- endregion

8
web/core/product.go Normal file
View File

@@ -0,0 +1,8 @@
package core
type ProductCode string
var (
ProductShort ProductCode = "short"
ProductLong ProductCode = "long"
)

View File

@@ -11,4 +11,6 @@ const (
ScopeProductWrite = string("product:write") ScopeProductWrite = string("product:write")
ScopeProductSkuRead = string("product_sku:read") ScopeProductSkuRead = string("product_sku:read")
ScopeProductSkuWrite = string("product_sku:write") ScopeProductSkuWrite = string("product_sku:write")
ScopeProductDiscountRead = string("product_discount:read")
ScopeProductDiscountWrite = string("product_discount:write")
) )

View File

@@ -158,6 +158,25 @@ func UpdateProductSku(c *fiber.Ctx) error {
return nil return nil
} }
func BatchUpdateProductSkuDiscount(c *fiber.Ctx) error {
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductSkuWrite)
if err != nil {
return err
}
var req s.BatchUpdateSkuDiscountData
if err := g.Validator.ParseBody(c, &req); err != nil {
return err
}
err = s.ProductSku.BatchUpdateDiscount(req)
if err != nil {
return err
}
return nil
}
func DeleteProductSku(c *fiber.Ctx) error { func DeleteProductSku(c *fiber.Ctx) error {
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductSkuWrite) _, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductSkuWrite)
if err != nil { if err != nil {

View File

@@ -0,0 +1,105 @@
package handlers
import (
"platform/web/auth"
"platform/web/core"
g "platform/web/globals"
s "platform/web/services"
"github.com/gofiber/fiber/v2"
)
func PageProductDiscountByAdmin(c *fiber.Ctx) error {
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductDiscountRead)
if err != nil {
return err
}
var req core.PageReq
if err := g.Validator.ParseBody(c, &req); err != nil {
return err
}
list, total, err := s.ProductDiscount.Page(&req)
if err != nil {
return err
}
return c.JSON(core.PageResp{
Total: int(total),
Page: req.GetPage(),
Size: req.GetSize(),
List: list,
})
}
func AllProductDiscountsByAdmin(c *fiber.Ctx) error {
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductDiscountRead)
if err != nil {
return err
}
list, err := s.ProductDiscount.All()
if err != nil {
return err
}
return c.JSON(list)
}
func CreateProductDiscount(c *fiber.Ctx) error {
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductDiscountWrite)
if err != nil {
return err
}
var req s.CreateProductDiscountData
if err := g.Validator.ParseBody(c, &req); err != nil {
return err
}
err = s.ProductDiscount.Create(req)
if err != nil {
return err
}
return nil
}
func UpdateProductDiscount(c *fiber.Ctx) error {
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductDiscountWrite)
if err != nil {
return err
}
var req s.UpdateProductDiscountData
if err := g.Validator.ParseBody(c, &req); err != nil {
return err
}
err = s.ProductDiscount.Update(req)
if err != nil {
return err
}
return nil
}
func DeleteProductDiscount(c *fiber.Ctx) error {
_, err := auth.GetAuthCtx(c).PermitAdmin(core.ScopeProductDiscountWrite)
if err != nil {
return err
}
var req core.IdReq
if err := g.Validator.ParseBody(c, &req); err != nil {
return err
}
err = s.ProductDiscount.Delete(req.Id)
if err != nil {
return err
}
return nil
}

View File

@@ -70,7 +70,7 @@ func PageResourceShort(c *fiber.Ctx) error {
} }
resource, err := q.Resource.Where(do). resource, err := q.Resource.Where(do).
Joins(q.Resource.Short). Joins(q.Resource.Short, q.ResourceShort.Sku).
Order(q.Resource.CreatedAt.Desc()). Order(q.Resource.CreatedAt.Desc()).
Offset(req.GetOffset()). Offset(req.GetOffset()).
Limit(req.GetLimit()). Limit(req.GetLimit()).
@@ -615,7 +615,7 @@ func ResourcePrice(c *fiber.Ctx) error {
// 计算折扣 // 计算折扣
return c.JSON(ResourcePriceResp{ return c.JSON(ResourcePriceResp{
Price: before.StringFixed(2), Price: before.StringFixed(2),
Discounted: sku.Discount, Discounted: float32(sku.Discount.Discount) / 100,
DiscountedPrice: after.StringFixed(2), DiscountedPrice: after.StringFixed(2),
}) })
} }

View File

@@ -0,0 +1,19 @@
package models
import (
"platform/web/core"
"github.com/shopspring/decimal"
)
// ProductDiscount 产品折扣表
type ProductDiscount struct {
core.Model
Name string `json:"name" gorm:"column:name"` // 产品名称
Discount int32 `json:"discount" gorm:"column:discount"` // 产品折扣
}
func (pd ProductDiscount) Decimal() decimal.Decimal {
return decimal.NewFromInt32(pd.Discount).
Div(decimal.NewFromInt32(100))
}

View File

@@ -10,10 +10,11 @@ import (
type ProductSku struct { type ProductSku struct {
core.Model core.Model
ProductID int32 `json:"product_id" gorm:"column:product_id"` // 产品ID ProductID int32 `json:"product_id" gorm:"column:product_id"` // 产品ID
DiscountId int32 `json:"discount_id" gorm:"column:discount_id"` // 折扣0 - 1 的小数,表示 xx 折
Code string `json:"code" gorm:"column:code"` // SSKU 代码:格式为 key=value,key=value,...其中key:value 是 SKU 的属性,多个属性用逗号分隔 Code string `json:"code" gorm:"column:code"` // SSKU 代码:格式为 key=value,key=value,...其中key:value 是 SKU 的属性,多个属性用逗号分隔
Name string `json:"name" gorm:"column:name"` // SKU 可读名称 Name string `json:"name" gorm:"column:name"` // SKU 可读名称
Price decimal.Decimal `json:"price" gorm:"column:price"` // 定价 Price decimal.Decimal `json:"price" gorm:"column:price"` // 定价
Discount float32 `json:"discount" gorm:"column:discount"` // 折扣0 - 1 的小数,表示 xx 折
Product *Product `json:"product,omitempty" gorm:"foreignKey:ProductID"` Product *Product `json:"product,omitempty" gorm:"foreignKey:ProductID"`
Discount *ProductDiscount `json:"discount,omitempty" gorm:"foreignKey:DiscountId"`
} }

View File

@@ -2,8 +2,6 @@ package models
import ( import (
"time" "time"
"github.com/shopspring/decimal"
) )
// ProductSkuUser 用户产品SKU表 // ProductSkuUser 用户产品SKU表
@@ -11,11 +9,11 @@ type ProductSkuUser struct {
ID int32 `json:"id" gorm:"column:id;primaryKey"` ID int32 `json:"id" gorm:"column:id;primaryKey"`
UserID int32 `json:"user_id" gorm:"column:user_id"` // 用户ID UserID int32 `json:"user_id" gorm:"column:user_id"` // 用户ID
ProductSkuID int32 `json:"product_sku_id" gorm:"column:product_sku_id"` // 产品SKU ID ProductSkuID int32 `json:"product_sku_id" gorm:"column:product_sku_id"` // 产品SKU ID
Price *decimal.Decimal `json:"price,omitempty" gorm:"column:price"` // 定价覆盖SKU定价 DiscountId int32 `json:"discount_id" gorm:"column:discount_id"` // 折扣ID
Discount *float32 `json:"discount,omitempty" gorm:"column:discount"` // 折扣覆盖SKU折扣
CreatedAt time.Time `json:"created_at" gorm:"column:created_at"` CreatedAt time.Time `json:"created_at" gorm:"column:created_at"`
UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"` UpdatedAt time.Time `json:"updated_at" gorm:"column:updated_at"`
User *User `json:"user,omitempty" gorm:"foreignKey:UserID"` User *User `json:"user,omitempty" gorm:"foreignKey:UserID"`
ProductSku *ProductSku `json:"product_sku,omitempty" gorm:"foreignKey:ProductSkuID"` ProductSku *ProductSku `json:"product_sku,omitempty" gorm:"foreignKey:ProductSkuID"`
Discount *ProductDiscount `json:"discount,omitempty" gorm:"foreignKey:DiscountId"`
} }

View File

@@ -11,10 +11,12 @@ type Resource struct {
ResourceNo *string `json:"resource_no,omitempty" gorm:"column:resource_no"` // 套餐编号 ResourceNo *string `json:"resource_no,omitempty" gorm:"column:resource_no"` // 套餐编号
Active bool `json:"active" gorm:"column:active"` // 套餐状态 Active bool `json:"active" gorm:"column:active"` // 套餐状态
Type ResourceType `json:"type" gorm:"column:type"` // 套餐类型1-短效动态2-长效动态 Type ResourceType `json:"type" gorm:"column:type"` // 套餐类型1-短效动态2-长效动态
Code string `json:"code" gorm:"column:code"` // 产品编码
User *User `json:"user,omitempty" gorm:"foreignKey:UserID"` User *User `json:"user,omitempty" gorm:"foreignKey:UserID"`
Short *ResourceShort `json:"short,omitempty" gorm:"foreignKey:ResourceID"` Short *ResourceShort `json:"short,omitempty" gorm:"foreignKey:ResourceID"`
Long *ResourceLong `json:"long,omitempty" gorm:"foreignKey:ResourceID"` Long *ResourceLong `json:"long,omitempty" gorm:"foreignKey:ResourceID"`
Product *Product `json:"product,omitempty" gorm:"foreignKey:Code;references:Code"`
} }
// ResourceType 套餐类型枚举 // ResourceType 套餐类型枚举
@@ -25,7 +27,18 @@ const (
ResourceTypeLong ResourceType = 2 // 长效动态 ResourceTypeLong ResourceType = 2 // 长效动态
) )
// ResourceLongType 套餐计费模式枚举 func (t ResourceType) Code() string {
switch t {
case ResourceTypeShort:
return "short"
case ResourceTypeLong:
return "long"
default:
return "unknown"
}
}
// ResourceMode 套餐计费模式枚举
type ResourceMode int type ResourceMode int
const ( const (

View File

@@ -8,6 +8,7 @@ import (
type ResourceLong struct { type ResourceLong struct {
ID int32 `json:"id" gorm:"column:id"` // ID ID int32 `json:"id" gorm:"column:id"` // ID
ResourceID int32 `json:"resource_id" gorm:"column:resource_id"` // 套餐ID ResourceID int32 `json:"resource_id" gorm:"column:resource_id"` // 套餐ID
Code string `json:"code" gorm:"column:code"` // 套餐编码
Live int32 `json:"live" gorm:"column:live"` // 可用时长(小时) Live int32 `json:"live" gorm:"column:live"` // 可用时长(小时)
Type ResourceMode `json:"type" gorm:"column:type"` // 套餐类型1-包时2-包量 Type ResourceMode `json:"type" gorm:"column:type"` // 套餐类型1-包时2-包量
Quota int32 `json:"quota" gorm:"column:quota"` // 每日配额(包时)或总配额(包量) Quota int32 `json:"quota" gorm:"column:quota"` // 每日配额(包时)或总配额(包量)
@@ -15,4 +16,6 @@ type ResourceLong struct {
Used int32 `json:"used" gorm:"column:used"` // 总用量 Used int32 `json:"used" gorm:"column:used"` // 总用量
Daily int32 `json:"daily" gorm:"column:daily"` // 当日用量 Daily int32 `json:"daily" gorm:"column:daily"` // 当日用量
LastAt *time.Time `json:"last_at,omitempty" gorm:"column:last_at"` // 最后使用时间 LastAt *time.Time `json:"last_at,omitempty" gorm:"column:last_at"` // 最后使用时间
Sku *ProductSku `json:"sku,omitempty" gorm:"foreignKey:Code;references:Code"`
} }

View File

@@ -8,6 +8,7 @@ import (
type ResourceShort struct { type ResourceShort struct {
ID int32 `json:"id" gorm:"column:id"` // ID ID int32 `json:"id" gorm:"column:id"` // ID
ResourceID int32 `json:"resource_id" gorm:"column:resource_id"` // 套餐ID ResourceID int32 `json:"resource_id" gorm:"column:resource_id"` // 套餐ID
Code string `json:"code" gorm:"column:code"` // 套餐编码
Live int32 `json:"live" gorm:"column:live"` // 可用时长(秒) Live int32 `json:"live" gorm:"column:live"` // 可用时长(秒)
Type ResourceMode `json:"type" gorm:"column:type"` // 套餐类型1-包时2-包量 Type ResourceMode `json:"type" gorm:"column:type"` // 套餐类型1-包时2-包量
Quota int32 `json:"quota" gorm:"column:quota"` // 每日配额(包时)或总配额(包量) Quota int32 `json:"quota" gorm:"column:quota"` // 每日配额(包时)或总配额(包量)
@@ -15,4 +16,6 @@ type ResourceShort struct {
Used int32 `json:"used" gorm:"column:used"` // 总用量 Used int32 `json:"used" gorm:"column:used"` // 总用量
Daily int32 `json:"daily" gorm:"column:daily"` // 当日用量 Daily int32 `json:"daily" gorm:"column:daily"` // 当日用量
LastAt *time.Time `json:"last_at,omitempty" gorm:"column:last_at"` // 最后使用时间 LastAt *time.Time `json:"last_at,omitempty" gorm:"column:last_at"` // 最后使用时间
Sku *ProductSku `json:"sku,omitempty" gorm:"foreignKey:Code;references:Code"`
} }

View File

@@ -132,13 +132,56 @@ func newBill(db *gorm.DB, opts ...gen.DOOption) bill {
}, },
Short: struct { Short: struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}
}{ }{
RelationField: field.NewRelation("Resource.Short", "models.ResourceShort"), RelationField: field.NewRelation("Resource.Short", "models.ResourceShort"),
Sku: struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}{
RelationField: field.NewRelation("Resource.Short.Sku", "models.ProductSku"),
Product: struct {
field.RelationField
}{
RelationField: field.NewRelation("Resource.Short.Sku.Product", "models.Product"),
},
Discount: struct {
field.RelationField
}{
RelationField: field.NewRelation("Resource.Short.Sku.Discount", "models.ProductDiscount"),
},
},
}, },
Long: struct { Long: struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
}
}{ }{
RelationField: field.NewRelation("Resource.Long", "models.ResourceLong"), RelationField: field.NewRelation("Resource.Long", "models.ResourceLong"),
Sku: struct {
field.RelationField
}{
RelationField: field.NewRelation("Resource.Long.Sku", "models.ProductSku"),
},
},
Product: struct {
field.RelationField
}{
RelationField: field.NewRelation("Resource.Product", "models.Product"),
}, },
} }
@@ -456,9 +499,24 @@ type billBelongsToResource struct {
} }
Short struct { Short struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}
} }
Long struct { Long struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
}
}
Product struct {
field.RelationField
} }
} }

View File

@@ -129,13 +129,56 @@ func newChannel(db *gorm.DB, opts ...gen.DOOption) channel {
}, },
Short: struct { Short: struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}
}{ }{
RelationField: field.NewRelation("Resource.Short", "models.ResourceShort"), RelationField: field.NewRelation("Resource.Short", "models.ResourceShort"),
Sku: struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}{
RelationField: field.NewRelation("Resource.Short.Sku", "models.ProductSku"),
Product: struct {
field.RelationField
}{
RelationField: field.NewRelation("Resource.Short.Sku.Product", "models.Product"),
},
Discount: struct {
field.RelationField
}{
RelationField: field.NewRelation("Resource.Short.Sku.Discount", "models.ProductDiscount"),
},
},
}, },
Long: struct { Long: struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
}
}{ }{
RelationField: field.NewRelation("Resource.Long", "models.ResourceLong"), RelationField: field.NewRelation("Resource.Long", "models.ResourceLong"),
Sku: struct {
field.RelationField
}{
RelationField: field.NewRelation("Resource.Long.Sku", "models.ProductSku"),
},
},
Product: struct {
field.RelationField
}{
RelationField: field.NewRelation("Resource.Product", "models.Product"),
}, },
} }
@@ -435,9 +478,24 @@ type channelBelongsToResource struct {
} }
Short struct { Short struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}
} }
Long struct { Long struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
}
}
Product struct {
field.RelationField
} }
} }

View File

@@ -37,6 +37,7 @@ var (
LogsUserUsage *logsUserUsage LogsUserUsage *logsUserUsage
Permission *permission Permission *permission
Product *product Product *product
ProductDiscount *productDiscount
ProductSku *productSku ProductSku *productSku
ProductSkuUser *productSkuUser ProductSkuUser *productSkuUser
Proxy *proxy Proxy *proxy
@@ -73,6 +74,7 @@ func SetDefault(db *gorm.DB, opts ...gen.DOOption) {
LogsUserUsage = &Q.LogsUserUsage LogsUserUsage = &Q.LogsUserUsage
Permission = &Q.Permission Permission = &Q.Permission
Product = &Q.Product Product = &Q.Product
ProductDiscount = &Q.ProductDiscount
ProductSku = &Q.ProductSku ProductSku = &Q.ProductSku
ProductSkuUser = &Q.ProductSkuUser ProductSkuUser = &Q.ProductSkuUser
Proxy = &Q.Proxy Proxy = &Q.Proxy
@@ -110,6 +112,7 @@ func Use(db *gorm.DB, opts ...gen.DOOption) *Query {
LogsUserUsage: newLogsUserUsage(db, opts...), LogsUserUsage: newLogsUserUsage(db, opts...),
Permission: newPermission(db, opts...), Permission: newPermission(db, opts...),
Product: newProduct(db, opts...), Product: newProduct(db, opts...),
ProductDiscount: newProductDiscount(db, opts...),
ProductSku: newProductSku(db, opts...), ProductSku: newProductSku(db, opts...),
ProductSkuUser: newProductSkuUser(db, opts...), ProductSkuUser: newProductSkuUser(db, opts...),
Proxy: newProxy(db, opts...), Proxy: newProxy(db, opts...),
@@ -148,6 +151,7 @@ type Query struct {
LogsUserUsage logsUserUsage LogsUserUsage logsUserUsage
Permission permission Permission permission
Product product Product product
ProductDiscount productDiscount
ProductSku productSku ProductSku productSku
ProductSkuUser productSkuUser ProductSkuUser productSkuUser
Proxy proxy Proxy proxy
@@ -187,6 +191,7 @@ func (q *Query) clone(db *gorm.DB) *Query {
LogsUserUsage: q.LogsUserUsage.clone(db), LogsUserUsage: q.LogsUserUsage.clone(db),
Permission: q.Permission.clone(db), Permission: q.Permission.clone(db),
Product: q.Product.clone(db), Product: q.Product.clone(db),
ProductDiscount: q.ProductDiscount.clone(db),
ProductSku: q.ProductSku.clone(db), ProductSku: q.ProductSku.clone(db),
ProductSkuUser: q.ProductSkuUser.clone(db), ProductSkuUser: q.ProductSkuUser.clone(db),
Proxy: q.Proxy.clone(db), Proxy: q.Proxy.clone(db),
@@ -233,6 +238,7 @@ func (q *Query) ReplaceDB(db *gorm.DB) *Query {
LogsUserUsage: q.LogsUserUsage.replaceDB(db), LogsUserUsage: q.LogsUserUsage.replaceDB(db),
Permission: q.Permission.replaceDB(db), Permission: q.Permission.replaceDB(db),
Product: q.Product.replaceDB(db), Product: q.Product.replaceDB(db),
ProductDiscount: q.ProductDiscount.replaceDB(db),
ProductSku: q.ProductSku.replaceDB(db), ProductSku: q.ProductSku.replaceDB(db),
ProductSkuUser: q.ProductSkuUser.replaceDB(db), ProductSkuUser: q.ProductSkuUser.replaceDB(db),
Proxy: q.Proxy.replaceDB(db), Proxy: q.Proxy.replaceDB(db),
@@ -269,6 +275,7 @@ type queryCtx struct {
LogsUserUsage *logsUserUsageDo LogsUserUsage *logsUserUsageDo
Permission *permissionDo Permission *permissionDo
Product *productDo Product *productDo
ProductDiscount *productDiscountDo
ProductSku *productSkuDo ProductSku *productSkuDo
ProductSkuUser *productSkuUserDo ProductSkuUser *productSkuUserDo
Proxy *proxyDo Proxy *proxyDo
@@ -305,6 +312,7 @@ func (q *Query) WithContext(ctx context.Context) *queryCtx {
LogsUserUsage: q.LogsUserUsage.WithContext(ctx), LogsUserUsage: q.LogsUserUsage.WithContext(ctx),
Permission: q.Permission.WithContext(ctx), Permission: q.Permission.WithContext(ctx),
Product: q.Product.WithContext(ctx), Product: q.Product.WithContext(ctx),
ProductDiscount: q.ProductDiscount.WithContext(ctx),
ProductSku: q.ProductSku.WithContext(ctx), ProductSku: q.ProductSku.WithContext(ctx),
ProductSkuUser: q.ProductSkuUser.WithContext(ctx), ProductSkuUser: q.ProductSkuUser.WithContext(ctx),
Proxy: q.Proxy.WithContext(ctx), Proxy: q.Proxy.WithContext(ctx),

View File

@@ -119,13 +119,56 @@ func newLogsUserUsage(db *gorm.DB, opts ...gen.DOOption) logsUserUsage {
}, },
Short: struct { Short: struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}
}{ }{
RelationField: field.NewRelation("Resource.Short", "models.ResourceShort"), RelationField: field.NewRelation("Resource.Short", "models.ResourceShort"),
Sku: struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}{
RelationField: field.NewRelation("Resource.Short.Sku", "models.ProductSku"),
Product: struct {
field.RelationField
}{
RelationField: field.NewRelation("Resource.Short.Sku.Product", "models.Product"),
},
Discount: struct {
field.RelationField
}{
RelationField: field.NewRelation("Resource.Short.Sku.Discount", "models.ProductDiscount"),
},
},
}, },
Long: struct { Long: struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
}
}{ }{
RelationField: field.NewRelation("Resource.Long", "models.ResourceLong"), RelationField: field.NewRelation("Resource.Long", "models.ResourceLong"),
Sku: struct {
field.RelationField
}{
RelationField: field.NewRelation("Resource.Long.Sku", "models.ProductSku"),
},
},
Product: struct {
field.RelationField
}{
RelationField: field.NewRelation("Resource.Product", "models.Product"),
}, },
} }
@@ -336,9 +379,24 @@ type logsUserUsageBelongsToResource struct {
} }
Short struct { Short struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}
} }
Long struct { Long struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
}
}
Product struct {
field.RelationField
} }
} }

View File

@@ -0,0 +1,339 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
package queries
import (
"context"
"gorm.io/gorm"
"gorm.io/gorm/clause"
"gorm.io/gorm/schema"
"gorm.io/gen"
"gorm.io/gen/field"
"gorm.io/plugin/dbresolver"
"platform/web/models"
)
func newProductDiscount(db *gorm.DB, opts ...gen.DOOption) productDiscount {
_productDiscount := productDiscount{}
_productDiscount.productDiscountDo.UseDB(db, opts...)
_productDiscount.productDiscountDo.UseModel(&models.ProductDiscount{})
tableName := _productDiscount.productDiscountDo.TableName()
_productDiscount.ALL = field.NewAsterisk(tableName)
_productDiscount.ID = field.NewInt32(tableName, "id")
_productDiscount.CreatedAt = field.NewTime(tableName, "created_at")
_productDiscount.UpdatedAt = field.NewTime(tableName, "updated_at")
_productDiscount.DeletedAt = field.NewField(tableName, "deleted_at")
_productDiscount.Name = field.NewString(tableName, "name")
_productDiscount.Discount = field.NewInt32(tableName, "discount")
_productDiscount.fillFieldMap()
return _productDiscount
}
type productDiscount struct {
productDiscountDo
ALL field.Asterisk
ID field.Int32
CreatedAt field.Time
UpdatedAt field.Time
DeletedAt field.Field
Name field.String
Discount field.Int32
fieldMap map[string]field.Expr
}
func (p productDiscount) Table(newTableName string) *productDiscount {
p.productDiscountDo.UseTable(newTableName)
return p.updateTableName(newTableName)
}
func (p productDiscount) As(alias string) *productDiscount {
p.productDiscountDo.DO = *(p.productDiscountDo.As(alias).(*gen.DO))
return p.updateTableName(alias)
}
func (p *productDiscount) updateTableName(table string) *productDiscount {
p.ALL = field.NewAsterisk(table)
p.ID = field.NewInt32(table, "id")
p.CreatedAt = field.NewTime(table, "created_at")
p.UpdatedAt = field.NewTime(table, "updated_at")
p.DeletedAt = field.NewField(table, "deleted_at")
p.Name = field.NewString(table, "name")
p.Discount = field.NewInt32(table, "discount")
p.fillFieldMap()
return p
}
func (p *productDiscount) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
_f, ok := p.fieldMap[fieldName]
if !ok || _f == nil {
return nil, false
}
_oe, ok := _f.(field.OrderExpr)
return _oe, ok
}
func (p *productDiscount) fillFieldMap() {
p.fieldMap = make(map[string]field.Expr, 6)
p.fieldMap["id"] = p.ID
p.fieldMap["created_at"] = p.CreatedAt
p.fieldMap["updated_at"] = p.UpdatedAt
p.fieldMap["deleted_at"] = p.DeletedAt
p.fieldMap["name"] = p.Name
p.fieldMap["discount"] = p.Discount
}
func (p productDiscount) clone(db *gorm.DB) productDiscount {
p.productDiscountDo.ReplaceConnPool(db.Statement.ConnPool)
return p
}
func (p productDiscount) replaceDB(db *gorm.DB) productDiscount {
p.productDiscountDo.ReplaceDB(db)
return p
}
type productDiscountDo struct{ gen.DO }
func (p productDiscountDo) Debug() *productDiscountDo {
return p.withDO(p.DO.Debug())
}
func (p productDiscountDo) WithContext(ctx context.Context) *productDiscountDo {
return p.withDO(p.DO.WithContext(ctx))
}
func (p productDiscountDo) ReadDB() *productDiscountDo {
return p.Clauses(dbresolver.Read)
}
func (p productDiscountDo) WriteDB() *productDiscountDo {
return p.Clauses(dbresolver.Write)
}
func (p productDiscountDo) Session(config *gorm.Session) *productDiscountDo {
return p.withDO(p.DO.Session(config))
}
func (p productDiscountDo) Clauses(conds ...clause.Expression) *productDiscountDo {
return p.withDO(p.DO.Clauses(conds...))
}
func (p productDiscountDo) Returning(value interface{}, columns ...string) *productDiscountDo {
return p.withDO(p.DO.Returning(value, columns...))
}
func (p productDiscountDo) Not(conds ...gen.Condition) *productDiscountDo {
return p.withDO(p.DO.Not(conds...))
}
func (p productDiscountDo) Or(conds ...gen.Condition) *productDiscountDo {
return p.withDO(p.DO.Or(conds...))
}
func (p productDiscountDo) Select(conds ...field.Expr) *productDiscountDo {
return p.withDO(p.DO.Select(conds...))
}
func (p productDiscountDo) Where(conds ...gen.Condition) *productDiscountDo {
return p.withDO(p.DO.Where(conds...))
}
func (p productDiscountDo) Order(conds ...field.Expr) *productDiscountDo {
return p.withDO(p.DO.Order(conds...))
}
func (p productDiscountDo) Distinct(cols ...field.Expr) *productDiscountDo {
return p.withDO(p.DO.Distinct(cols...))
}
func (p productDiscountDo) Omit(cols ...field.Expr) *productDiscountDo {
return p.withDO(p.DO.Omit(cols...))
}
func (p productDiscountDo) Join(table schema.Tabler, on ...field.Expr) *productDiscountDo {
return p.withDO(p.DO.Join(table, on...))
}
func (p productDiscountDo) LeftJoin(table schema.Tabler, on ...field.Expr) *productDiscountDo {
return p.withDO(p.DO.LeftJoin(table, on...))
}
func (p productDiscountDo) RightJoin(table schema.Tabler, on ...field.Expr) *productDiscountDo {
return p.withDO(p.DO.RightJoin(table, on...))
}
func (p productDiscountDo) Group(cols ...field.Expr) *productDiscountDo {
return p.withDO(p.DO.Group(cols...))
}
func (p productDiscountDo) Having(conds ...gen.Condition) *productDiscountDo {
return p.withDO(p.DO.Having(conds...))
}
func (p productDiscountDo) Limit(limit int) *productDiscountDo {
return p.withDO(p.DO.Limit(limit))
}
func (p productDiscountDo) Offset(offset int) *productDiscountDo {
return p.withDO(p.DO.Offset(offset))
}
func (p productDiscountDo) Scopes(funcs ...func(gen.Dao) gen.Dao) *productDiscountDo {
return p.withDO(p.DO.Scopes(funcs...))
}
func (p productDiscountDo) Unscoped() *productDiscountDo {
return p.withDO(p.DO.Unscoped())
}
func (p productDiscountDo) Create(values ...*models.ProductDiscount) error {
if len(values) == 0 {
return nil
}
return p.DO.Create(values)
}
func (p productDiscountDo) CreateInBatches(values []*models.ProductDiscount, batchSize int) error {
return p.DO.CreateInBatches(values, batchSize)
}
// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (p productDiscountDo) Save(values ...*models.ProductDiscount) error {
if len(values) == 0 {
return nil
}
return p.DO.Save(values)
}
func (p productDiscountDo) First() (*models.ProductDiscount, error) {
if result, err := p.DO.First(); err != nil {
return nil, err
} else {
return result.(*models.ProductDiscount), nil
}
}
func (p productDiscountDo) Take() (*models.ProductDiscount, error) {
if result, err := p.DO.Take(); err != nil {
return nil, err
} else {
return result.(*models.ProductDiscount), nil
}
}
func (p productDiscountDo) Last() (*models.ProductDiscount, error) {
if result, err := p.DO.Last(); err != nil {
return nil, err
} else {
return result.(*models.ProductDiscount), nil
}
}
func (p productDiscountDo) Find() ([]*models.ProductDiscount, error) {
result, err := p.DO.Find()
return result.([]*models.ProductDiscount), err
}
func (p productDiscountDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.ProductDiscount, err error) {
buf := make([]*models.ProductDiscount, 0, batchSize)
err = p.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
defer func() { results = append(results, buf...) }()
return fc(tx, batch)
})
return results, err
}
func (p productDiscountDo) FindInBatches(result *[]*models.ProductDiscount, batchSize int, fc func(tx gen.Dao, batch int) error) error {
return p.DO.FindInBatches(result, batchSize, fc)
}
func (p productDiscountDo) Attrs(attrs ...field.AssignExpr) *productDiscountDo {
return p.withDO(p.DO.Attrs(attrs...))
}
func (p productDiscountDo) Assign(attrs ...field.AssignExpr) *productDiscountDo {
return p.withDO(p.DO.Assign(attrs...))
}
func (p productDiscountDo) Joins(fields ...field.RelationField) *productDiscountDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Joins(_f))
}
return &p
}
func (p productDiscountDo) Preload(fields ...field.RelationField) *productDiscountDo {
for _, _f := range fields {
p = *p.withDO(p.DO.Preload(_f))
}
return &p
}
func (p productDiscountDo) FirstOrInit() (*models.ProductDiscount, error) {
if result, err := p.DO.FirstOrInit(); err != nil {
return nil, err
} else {
return result.(*models.ProductDiscount), nil
}
}
func (p productDiscountDo) FirstOrCreate() (*models.ProductDiscount, error) {
if result, err := p.DO.FirstOrCreate(); err != nil {
return nil, err
} else {
return result.(*models.ProductDiscount), nil
}
}
func (p productDiscountDo) FindByPage(offset int, limit int) (result []*models.ProductDiscount, count int64, err error) {
result, err = p.Offset(offset).Limit(limit).Find()
if err != nil {
return
}
if size := len(result); 0 < limit && 0 < size && size < limit {
count = int64(size + offset)
return
}
count, err = p.Offset(-1).Limit(-1).Count()
return
}
func (p productDiscountDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
count, err = p.Count()
if err != nil {
return
}
err = p.Offset(offset).Limit(limit).Scan(result)
return
}
func (p productDiscountDo) Scan(result interface{}) (err error) {
return p.DO.Scan(result)
}
func (p productDiscountDo) Delete(models ...*models.ProductDiscount) (result gen.ResultInfo, err error) {
return p.DO.Delete(models)
}
func (p *productDiscountDo) withDO(do gen.Dao) *productDiscountDo {
p.DO = *do.(*gen.DO)
return p
}

View File

@@ -32,16 +32,22 @@ func newProductSku(db *gorm.DB, opts ...gen.DOOption) productSku {
_productSku.UpdatedAt = field.NewTime(tableName, "updated_at") _productSku.UpdatedAt = field.NewTime(tableName, "updated_at")
_productSku.DeletedAt = field.NewField(tableName, "deleted_at") _productSku.DeletedAt = field.NewField(tableName, "deleted_at")
_productSku.ProductID = field.NewInt32(tableName, "product_id") _productSku.ProductID = field.NewInt32(tableName, "product_id")
_productSku.DiscountId = field.NewInt32(tableName, "discount_id")
_productSku.Code = field.NewString(tableName, "code") _productSku.Code = field.NewString(tableName, "code")
_productSku.Name = field.NewString(tableName, "name") _productSku.Name = field.NewString(tableName, "name")
_productSku.Price = field.NewField(tableName, "price") _productSku.Price = field.NewField(tableName, "price")
_productSku.Discount = field.NewFloat32(tableName, "discount")
_productSku.Product = productSkuBelongsToProduct{ _productSku.Product = productSkuBelongsToProduct{
db: db.Session(&gorm.Session{}), db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("Product", "models.Product"), RelationField: field.NewRelation("Product", "models.Product"),
} }
_productSku.Discount = productSkuBelongsToDiscount{
db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("Discount", "models.ProductDiscount"),
}
_productSku.fillFieldMap() _productSku.fillFieldMap()
return _productSku return _productSku
@@ -56,12 +62,14 @@ type productSku struct {
UpdatedAt field.Time UpdatedAt field.Time
DeletedAt field.Field DeletedAt field.Field
ProductID field.Int32 ProductID field.Int32
DiscountId field.Int32
Code field.String Code field.String
Name field.String Name field.String
Price field.Field Price field.Field
Discount field.Float32
Product productSkuBelongsToProduct Product productSkuBelongsToProduct
Discount productSkuBelongsToDiscount
fieldMap map[string]field.Expr fieldMap map[string]field.Expr
} }
@@ -82,10 +90,10 @@ func (p *productSku) updateTableName(table string) *productSku {
p.UpdatedAt = field.NewTime(table, "updated_at") p.UpdatedAt = field.NewTime(table, "updated_at")
p.DeletedAt = field.NewField(table, "deleted_at") p.DeletedAt = field.NewField(table, "deleted_at")
p.ProductID = field.NewInt32(table, "product_id") p.ProductID = field.NewInt32(table, "product_id")
p.DiscountId = field.NewInt32(table, "discount_id")
p.Code = field.NewString(table, "code") p.Code = field.NewString(table, "code")
p.Name = field.NewString(table, "name") p.Name = field.NewString(table, "name")
p.Price = field.NewField(table, "price") p.Price = field.NewField(table, "price")
p.Discount = field.NewFloat32(table, "discount")
p.fillFieldMap() p.fillFieldMap()
@@ -102,16 +110,16 @@ func (p *productSku) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
} }
func (p *productSku) fillFieldMap() { func (p *productSku) fillFieldMap() {
p.fieldMap = make(map[string]field.Expr, 10) p.fieldMap = make(map[string]field.Expr, 11)
p.fieldMap["id"] = p.ID p.fieldMap["id"] = p.ID
p.fieldMap["created_at"] = p.CreatedAt p.fieldMap["created_at"] = p.CreatedAt
p.fieldMap["updated_at"] = p.UpdatedAt p.fieldMap["updated_at"] = p.UpdatedAt
p.fieldMap["deleted_at"] = p.DeletedAt p.fieldMap["deleted_at"] = p.DeletedAt
p.fieldMap["product_id"] = p.ProductID p.fieldMap["product_id"] = p.ProductID
p.fieldMap["discount_id"] = p.DiscountId
p.fieldMap["code"] = p.Code p.fieldMap["code"] = p.Code
p.fieldMap["name"] = p.Name p.fieldMap["name"] = p.Name
p.fieldMap["price"] = p.Price p.fieldMap["price"] = p.Price
p.fieldMap["discount"] = p.Discount
} }
@@ -119,12 +127,15 @@ func (p productSku) clone(db *gorm.DB) productSku {
p.productSkuDo.ReplaceConnPool(db.Statement.ConnPool) p.productSkuDo.ReplaceConnPool(db.Statement.ConnPool)
p.Product.db = db.Session(&gorm.Session{Initialized: true}) p.Product.db = db.Session(&gorm.Session{Initialized: true})
p.Product.db.Statement.ConnPool = db.Statement.ConnPool p.Product.db.Statement.ConnPool = db.Statement.ConnPool
p.Discount.db = db.Session(&gorm.Session{Initialized: true})
p.Discount.db.Statement.ConnPool = db.Statement.ConnPool
return p return p
} }
func (p productSku) replaceDB(db *gorm.DB) productSku { func (p productSku) replaceDB(db *gorm.DB) productSku {
p.productSkuDo.ReplaceDB(db) p.productSkuDo.ReplaceDB(db)
p.Product.db = db.Session(&gorm.Session{}) p.Product.db = db.Session(&gorm.Session{})
p.Discount.db = db.Session(&gorm.Session{})
return p return p
} }
@@ -209,6 +220,87 @@ func (a productSkuBelongsToProductTx) Unscoped() *productSkuBelongsToProductTx {
return &a return &a
} }
type productSkuBelongsToDiscount struct {
db *gorm.DB
field.RelationField
}
func (a productSkuBelongsToDiscount) Where(conds ...field.Expr) *productSkuBelongsToDiscount {
if len(conds) == 0 {
return &a
}
exprs := make([]clause.Expression, 0, len(conds))
for _, cond := range conds {
exprs = append(exprs, cond.BeCond().(clause.Expression))
}
a.db = a.db.Clauses(clause.Where{Exprs: exprs})
return &a
}
func (a productSkuBelongsToDiscount) WithContext(ctx context.Context) *productSkuBelongsToDiscount {
a.db = a.db.WithContext(ctx)
return &a
}
func (a productSkuBelongsToDiscount) Session(session *gorm.Session) *productSkuBelongsToDiscount {
a.db = a.db.Session(session)
return &a
}
func (a productSkuBelongsToDiscount) Model(m *models.ProductSku) *productSkuBelongsToDiscountTx {
return &productSkuBelongsToDiscountTx{a.db.Model(m).Association(a.Name())}
}
func (a productSkuBelongsToDiscount) Unscoped() *productSkuBelongsToDiscount {
a.db = a.db.Unscoped()
return &a
}
type productSkuBelongsToDiscountTx struct{ tx *gorm.Association }
func (a productSkuBelongsToDiscountTx) Find() (result *models.ProductDiscount, err error) {
return result, a.tx.Find(&result)
}
func (a productSkuBelongsToDiscountTx) Append(values ...*models.ProductDiscount) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Append(targetValues...)
}
func (a productSkuBelongsToDiscountTx) Replace(values ...*models.ProductDiscount) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Replace(targetValues...)
}
func (a productSkuBelongsToDiscountTx) Delete(values ...*models.ProductDiscount) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Delete(targetValues...)
}
func (a productSkuBelongsToDiscountTx) Clear() error {
return a.tx.Clear()
}
func (a productSkuBelongsToDiscountTx) Count() int64 {
return a.tx.Count()
}
func (a productSkuBelongsToDiscountTx) Unscoped() *productSkuBelongsToDiscountTx {
a.tx = a.tx.Unscoped()
return &a
}
type productSkuDo struct{ gen.DO } type productSkuDo struct{ gen.DO }
func (p productSkuDo) Debug() *productSkuDo { func (p productSkuDo) Debug() *productSkuDo {

View File

@@ -30,8 +30,7 @@ func newProductSkuUser(db *gorm.DB, opts ...gen.DOOption) productSkuUser {
_productSkuUser.ID = field.NewInt32(tableName, "id") _productSkuUser.ID = field.NewInt32(tableName, "id")
_productSkuUser.UserID = field.NewInt32(tableName, "user_id") _productSkuUser.UserID = field.NewInt32(tableName, "user_id")
_productSkuUser.ProductSkuID = field.NewInt32(tableName, "product_sku_id") _productSkuUser.ProductSkuID = field.NewInt32(tableName, "product_sku_id")
_productSkuUser.Price = field.NewField(tableName, "price") _productSkuUser.DiscountId = field.NewInt32(tableName, "discount_id")
_productSkuUser.Discount = field.NewFloat32(tableName, "discount")
_productSkuUser.CreatedAt = field.NewTime(tableName, "created_at") _productSkuUser.CreatedAt = field.NewTime(tableName, "created_at")
_productSkuUser.UpdatedAt = field.NewTime(tableName, "updated_at") _productSkuUser.UpdatedAt = field.NewTime(tableName, "updated_at")
_productSkuUser.User = productSkuUserBelongsToUser{ _productSkuUser.User = productSkuUserBelongsToUser{
@@ -114,6 +113,17 @@ func newProductSkuUser(db *gorm.DB, opts ...gen.DOOption) productSkuUser {
}{ }{
RelationField: field.NewRelation("ProductSku.Product", "models.Product"), RelationField: field.NewRelation("ProductSku.Product", "models.Product"),
}, },
Discount: struct {
field.RelationField
}{
RelationField: field.NewRelation("ProductSku.Discount", "models.ProductDiscount"),
},
}
_productSkuUser.Discount = productSkuUserBelongsToDiscount{
db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("Discount", "models.ProductDiscount"),
} }
_productSkuUser.fillFieldMap() _productSkuUser.fillFieldMap()
@@ -128,14 +138,15 @@ type productSkuUser struct {
ID field.Int32 ID field.Int32
UserID field.Int32 UserID field.Int32
ProductSkuID field.Int32 ProductSkuID field.Int32
Price field.Field DiscountId field.Int32
Discount field.Float32
CreatedAt field.Time CreatedAt field.Time
UpdatedAt field.Time UpdatedAt field.Time
User productSkuUserBelongsToUser User productSkuUserBelongsToUser
ProductSku productSkuUserBelongsToProductSku ProductSku productSkuUserBelongsToProductSku
Discount productSkuUserBelongsToDiscount
fieldMap map[string]field.Expr fieldMap map[string]field.Expr
} }
@@ -154,8 +165,7 @@ func (p *productSkuUser) updateTableName(table string) *productSkuUser {
p.ID = field.NewInt32(table, "id") p.ID = field.NewInt32(table, "id")
p.UserID = field.NewInt32(table, "user_id") p.UserID = field.NewInt32(table, "user_id")
p.ProductSkuID = field.NewInt32(table, "product_sku_id") p.ProductSkuID = field.NewInt32(table, "product_sku_id")
p.Price = field.NewField(table, "price") p.DiscountId = field.NewInt32(table, "discount_id")
p.Discount = field.NewFloat32(table, "discount")
p.CreatedAt = field.NewTime(table, "created_at") p.CreatedAt = field.NewTime(table, "created_at")
p.UpdatedAt = field.NewTime(table, "updated_at") p.UpdatedAt = field.NewTime(table, "updated_at")
@@ -178,8 +188,7 @@ func (p *productSkuUser) fillFieldMap() {
p.fieldMap["id"] = p.ID p.fieldMap["id"] = p.ID
p.fieldMap["user_id"] = p.UserID p.fieldMap["user_id"] = p.UserID
p.fieldMap["product_sku_id"] = p.ProductSkuID p.fieldMap["product_sku_id"] = p.ProductSkuID
p.fieldMap["price"] = p.Price p.fieldMap["discount_id"] = p.DiscountId
p.fieldMap["discount"] = p.Discount
p.fieldMap["created_at"] = p.CreatedAt p.fieldMap["created_at"] = p.CreatedAt
p.fieldMap["updated_at"] = p.UpdatedAt p.fieldMap["updated_at"] = p.UpdatedAt
@@ -191,6 +200,8 @@ func (p productSkuUser) clone(db *gorm.DB) productSkuUser {
p.User.db.Statement.ConnPool = db.Statement.ConnPool p.User.db.Statement.ConnPool = db.Statement.ConnPool
p.ProductSku.db = db.Session(&gorm.Session{Initialized: true}) p.ProductSku.db = db.Session(&gorm.Session{Initialized: true})
p.ProductSku.db.Statement.ConnPool = db.Statement.ConnPool p.ProductSku.db.Statement.ConnPool = db.Statement.ConnPool
p.Discount.db = db.Session(&gorm.Session{Initialized: true})
p.Discount.db.Statement.ConnPool = db.Statement.ConnPool
return p return p
} }
@@ -198,6 +209,7 @@ func (p productSkuUser) replaceDB(db *gorm.DB) productSkuUser {
p.productSkuUserDo.ReplaceDB(db) p.productSkuUserDo.ReplaceDB(db)
p.User.db = db.Session(&gorm.Session{}) p.User.db = db.Session(&gorm.Session{})
p.ProductSku.db = db.Session(&gorm.Session{}) p.ProductSku.db = db.Session(&gorm.Session{})
p.Discount.db = db.Session(&gorm.Session{})
return p return p
} }
@@ -312,6 +324,9 @@ type productSkuUserBelongsToProductSku struct {
Product struct { Product struct {
field.RelationField field.RelationField
} }
Discount struct {
field.RelationField
}
} }
func (a productSkuUserBelongsToProductSku) Where(conds ...field.Expr) *productSkuUserBelongsToProductSku { func (a productSkuUserBelongsToProductSku) Where(conds ...field.Expr) *productSkuUserBelongsToProductSku {
@@ -389,6 +404,87 @@ func (a productSkuUserBelongsToProductSkuTx) Unscoped() *productSkuUserBelongsTo
return &a return &a
} }
type productSkuUserBelongsToDiscount struct {
db *gorm.DB
field.RelationField
}
func (a productSkuUserBelongsToDiscount) Where(conds ...field.Expr) *productSkuUserBelongsToDiscount {
if len(conds) == 0 {
return &a
}
exprs := make([]clause.Expression, 0, len(conds))
for _, cond := range conds {
exprs = append(exprs, cond.BeCond().(clause.Expression))
}
a.db = a.db.Clauses(clause.Where{Exprs: exprs})
return &a
}
func (a productSkuUserBelongsToDiscount) WithContext(ctx context.Context) *productSkuUserBelongsToDiscount {
a.db = a.db.WithContext(ctx)
return &a
}
func (a productSkuUserBelongsToDiscount) Session(session *gorm.Session) *productSkuUserBelongsToDiscount {
a.db = a.db.Session(session)
return &a
}
func (a productSkuUserBelongsToDiscount) Model(m *models.ProductSkuUser) *productSkuUserBelongsToDiscountTx {
return &productSkuUserBelongsToDiscountTx{a.db.Model(m).Association(a.Name())}
}
func (a productSkuUserBelongsToDiscount) Unscoped() *productSkuUserBelongsToDiscount {
a.db = a.db.Unscoped()
return &a
}
type productSkuUserBelongsToDiscountTx struct{ tx *gorm.Association }
func (a productSkuUserBelongsToDiscountTx) Find() (result *models.ProductDiscount, err error) {
return result, a.tx.Find(&result)
}
func (a productSkuUserBelongsToDiscountTx) Append(values ...*models.ProductDiscount) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Append(targetValues...)
}
func (a productSkuUserBelongsToDiscountTx) Replace(values ...*models.ProductDiscount) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Replace(targetValues...)
}
func (a productSkuUserBelongsToDiscountTx) Delete(values ...*models.ProductDiscount) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Delete(targetValues...)
}
func (a productSkuUserBelongsToDiscountTx) Clear() error {
return a.tx.Clear()
}
func (a productSkuUserBelongsToDiscountTx) Count() int64 {
return a.tx.Count()
}
func (a productSkuUserBelongsToDiscountTx) Unscoped() *productSkuUserBelongsToDiscountTx {
a.tx = a.tx.Unscoped()
return &a
}
type productSkuUserDo struct{ gen.DO } type productSkuUserDo struct{ gen.DO }
func (p productSkuUserDo) Debug() *productSkuUserDo { func (p productSkuUserDo) Debug() *productSkuUserDo {

View File

@@ -141,9 +141,24 @@ func newProxy(db *gorm.DB, opts ...gen.DOOption) proxy {
} }
Short struct { Short struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}
} }
Long struct { Long struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
}
}
Product struct {
field.RelationField
} }
}{ }{
RelationField: field.NewRelation("Channels.Resource", "models.Resource"), RelationField: field.NewRelation("Channels.Resource", "models.Resource"),
@@ -154,13 +169,56 @@ func newProxy(db *gorm.DB, opts ...gen.DOOption) proxy {
}, },
Short: struct { Short: struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}
}{ }{
RelationField: field.NewRelation("Channels.Resource.Short", "models.ResourceShort"), RelationField: field.NewRelation("Channels.Resource.Short", "models.ResourceShort"),
Sku: struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}{
RelationField: field.NewRelation("Channels.Resource.Short.Sku", "models.ProductSku"),
Product: struct {
field.RelationField
}{
RelationField: field.NewRelation("Channels.Resource.Short.Sku.Product", "models.Product"),
},
Discount: struct {
field.RelationField
}{
RelationField: field.NewRelation("Channels.Resource.Short.Sku.Discount", "models.ProductDiscount"),
},
},
}, },
Long: struct { Long: struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
}
}{ }{
RelationField: field.NewRelation("Channels.Resource.Long", "models.ResourceLong"), RelationField: field.NewRelation("Channels.Resource.Long", "models.ResourceLong"),
Sku: struct {
field.RelationField
}{
RelationField: field.NewRelation("Channels.Resource.Long.Sku", "models.ProductSku"),
},
},
Product: struct {
field.RelationField
}{
RelationField: field.NewRelation("Channels.Resource.Product", "models.Product"),
}, },
}, },
Proxy: struct { Proxy: struct {
@@ -314,9 +372,24 @@ type proxyHasManyChannels struct {
} }
Short struct { Short struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}
} }
Long struct { Long struct {
field.RelationField field.RelationField
Sku struct {
field.RelationField
}
}
Product struct {
field.RelationField
} }
} }
Proxy struct { Proxy struct {

View File

@@ -35,16 +35,49 @@ func newResource(db *gorm.DB, opts ...gen.DOOption) resource {
_resource.ResourceNo = field.NewString(tableName, "resource_no") _resource.ResourceNo = field.NewString(tableName, "resource_no")
_resource.Active = field.NewBool(tableName, "active") _resource.Active = field.NewBool(tableName, "active")
_resource.Type = field.NewInt(tableName, "type") _resource.Type = field.NewInt(tableName, "type")
_resource.Code = field.NewString(tableName, "code")
_resource.Short = resourceHasOneShort{ _resource.Short = resourceHasOneShort{
db: db.Session(&gorm.Session{}), db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("Short", "models.ResourceShort"), RelationField: field.NewRelation("Short", "models.ResourceShort"),
Sku: struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}{
RelationField: field.NewRelation("Short.Sku", "models.ProductSku"),
Product: struct {
field.RelationField
}{
RelationField: field.NewRelation("Short.Sku.Product", "models.Product"),
},
Discount: struct {
field.RelationField
}{
RelationField: field.NewRelation("Short.Sku.Discount", "models.ProductDiscount"),
},
},
} }
_resource.Long = resourceHasOneLong{ _resource.Long = resourceHasOneLong{
db: db.Session(&gorm.Session{}), db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("Long", "models.ResourceLong"), RelationField: field.NewRelation("Long", "models.ResourceLong"),
Sku: struct {
field.RelationField
}{
RelationField: field.NewRelation("Long.Sku", "models.ProductSku"),
},
}
_resource.Product = resourceHasOneProduct{
db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("Product", "models.Product"),
} }
_resource.User = resourceBelongsToUser{ _resource.User = resourceBelongsToUser{
@@ -135,10 +168,13 @@ type resource struct {
ResourceNo field.String ResourceNo field.String
Active field.Bool Active field.Bool
Type field.Int Type field.Int
Code field.String
Short resourceHasOneShort Short resourceHasOneShort
Long resourceHasOneLong Long resourceHasOneLong
Product resourceHasOneProduct
User resourceBelongsToUser User resourceBelongsToUser
fieldMap map[string]field.Expr fieldMap map[string]field.Expr
@@ -164,6 +200,7 @@ func (r *resource) updateTableName(table string) *resource {
r.ResourceNo = field.NewString(table, "resource_no") r.ResourceNo = field.NewString(table, "resource_no")
r.Active = field.NewBool(table, "active") r.Active = field.NewBool(table, "active")
r.Type = field.NewInt(table, "type") r.Type = field.NewInt(table, "type")
r.Code = field.NewString(table, "code")
r.fillFieldMap() r.fillFieldMap()
@@ -180,7 +217,7 @@ func (r *resource) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
} }
func (r *resource) fillFieldMap() { func (r *resource) fillFieldMap() {
r.fieldMap = make(map[string]field.Expr, 11) r.fieldMap = make(map[string]field.Expr, 13)
r.fieldMap["id"] = r.ID r.fieldMap["id"] = r.ID
r.fieldMap["created_at"] = r.CreatedAt r.fieldMap["created_at"] = r.CreatedAt
r.fieldMap["updated_at"] = r.UpdatedAt r.fieldMap["updated_at"] = r.UpdatedAt
@@ -189,6 +226,7 @@ func (r *resource) fillFieldMap() {
r.fieldMap["resource_no"] = r.ResourceNo r.fieldMap["resource_no"] = r.ResourceNo
r.fieldMap["active"] = r.Active r.fieldMap["active"] = r.Active
r.fieldMap["type"] = r.Type r.fieldMap["type"] = r.Type
r.fieldMap["code"] = r.Code
} }
@@ -198,6 +236,8 @@ func (r resource) clone(db *gorm.DB) resource {
r.Short.db.Statement.ConnPool = db.Statement.ConnPool r.Short.db.Statement.ConnPool = db.Statement.ConnPool
r.Long.db = db.Session(&gorm.Session{Initialized: true}) r.Long.db = db.Session(&gorm.Session{Initialized: true})
r.Long.db.Statement.ConnPool = db.Statement.ConnPool r.Long.db.Statement.ConnPool = db.Statement.ConnPool
r.Product.db = db.Session(&gorm.Session{Initialized: true})
r.Product.db.Statement.ConnPool = db.Statement.ConnPool
r.User.db = db.Session(&gorm.Session{Initialized: true}) r.User.db = db.Session(&gorm.Session{Initialized: true})
r.User.db.Statement.ConnPool = db.Statement.ConnPool r.User.db.Statement.ConnPool = db.Statement.ConnPool
return r return r
@@ -207,6 +247,7 @@ func (r resource) replaceDB(db *gorm.DB) resource {
r.resourceDo.ReplaceDB(db) r.resourceDo.ReplaceDB(db)
r.Short.db = db.Session(&gorm.Session{}) r.Short.db = db.Session(&gorm.Session{})
r.Long.db = db.Session(&gorm.Session{}) r.Long.db = db.Session(&gorm.Session{})
r.Product.db = db.Session(&gorm.Session{})
r.User.db = db.Session(&gorm.Session{}) r.User.db = db.Session(&gorm.Session{})
return r return r
} }
@@ -215,6 +256,16 @@ type resourceHasOneShort struct {
db *gorm.DB db *gorm.DB
field.RelationField field.RelationField
Sku struct {
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}
} }
func (a resourceHasOneShort) Where(conds ...field.Expr) *resourceHasOneShort { func (a resourceHasOneShort) Where(conds ...field.Expr) *resourceHasOneShort {
@@ -296,6 +347,10 @@ type resourceHasOneLong struct {
db *gorm.DB db *gorm.DB
field.RelationField field.RelationField
Sku struct {
field.RelationField
}
} }
func (a resourceHasOneLong) Where(conds ...field.Expr) *resourceHasOneLong { func (a resourceHasOneLong) Where(conds ...field.Expr) *resourceHasOneLong {
@@ -373,6 +428,87 @@ func (a resourceHasOneLongTx) Unscoped() *resourceHasOneLongTx {
return &a return &a
} }
type resourceHasOneProduct struct {
db *gorm.DB
field.RelationField
}
func (a resourceHasOneProduct) Where(conds ...field.Expr) *resourceHasOneProduct {
if len(conds) == 0 {
return &a
}
exprs := make([]clause.Expression, 0, len(conds))
for _, cond := range conds {
exprs = append(exprs, cond.BeCond().(clause.Expression))
}
a.db = a.db.Clauses(clause.Where{Exprs: exprs})
return &a
}
func (a resourceHasOneProduct) WithContext(ctx context.Context) *resourceHasOneProduct {
a.db = a.db.WithContext(ctx)
return &a
}
func (a resourceHasOneProduct) Session(session *gorm.Session) *resourceHasOneProduct {
a.db = a.db.Session(session)
return &a
}
func (a resourceHasOneProduct) Model(m *models.Resource) *resourceHasOneProductTx {
return &resourceHasOneProductTx{a.db.Model(m).Association(a.Name())}
}
func (a resourceHasOneProduct) Unscoped() *resourceHasOneProduct {
a.db = a.db.Unscoped()
return &a
}
type resourceHasOneProductTx struct{ tx *gorm.Association }
func (a resourceHasOneProductTx) Find() (result *models.Product, err error) {
return result, a.tx.Find(&result)
}
func (a resourceHasOneProductTx) Append(values ...*models.Product) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Append(targetValues...)
}
func (a resourceHasOneProductTx) Replace(values ...*models.Product) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Replace(targetValues...)
}
func (a resourceHasOneProductTx) Delete(values ...*models.Product) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Delete(targetValues...)
}
func (a resourceHasOneProductTx) Clear() error {
return a.tx.Clear()
}
func (a resourceHasOneProductTx) Count() int64 {
return a.tx.Count()
}
func (a resourceHasOneProductTx) Unscoped() *resourceHasOneProductTx {
a.tx = a.tx.Unscoped()
return &a
}
type resourceBelongsToUser struct { type resourceBelongsToUser struct {
db *gorm.DB db *gorm.DB

View File

@@ -29,6 +29,7 @@ func newResourceLong(db *gorm.DB, opts ...gen.DOOption) resourceLong {
_resourceLong.ALL = field.NewAsterisk(tableName) _resourceLong.ALL = field.NewAsterisk(tableName)
_resourceLong.ID = field.NewInt32(tableName, "id") _resourceLong.ID = field.NewInt32(tableName, "id")
_resourceLong.ResourceID = field.NewInt32(tableName, "resource_id") _resourceLong.ResourceID = field.NewInt32(tableName, "resource_id")
_resourceLong.Code = field.NewString(tableName, "code")
_resourceLong.Live = field.NewInt32(tableName, "live") _resourceLong.Live = field.NewInt32(tableName, "live")
_resourceLong.Type = field.NewInt(tableName, "type") _resourceLong.Type = field.NewInt(tableName, "type")
_resourceLong.Quota = field.NewInt32(tableName, "quota") _resourceLong.Quota = field.NewInt32(tableName, "quota")
@@ -36,6 +37,21 @@ func newResourceLong(db *gorm.DB, opts ...gen.DOOption) resourceLong {
_resourceLong.Used = field.NewInt32(tableName, "used") _resourceLong.Used = field.NewInt32(tableName, "used")
_resourceLong.Daily = field.NewInt32(tableName, "daily") _resourceLong.Daily = field.NewInt32(tableName, "daily")
_resourceLong.LastAt = field.NewTime(tableName, "last_at") _resourceLong.LastAt = field.NewTime(tableName, "last_at")
_resourceLong.Sku = resourceLongHasOneSku{
db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("Sku", "models.ProductSku"),
Product: struct {
field.RelationField
}{
RelationField: field.NewRelation("Sku.Product", "models.Product"),
},
Discount: struct {
field.RelationField
}{
RelationField: field.NewRelation("Sku.Discount", "models.ProductDiscount"),
},
}
_resourceLong.fillFieldMap() _resourceLong.fillFieldMap()
@@ -48,6 +64,7 @@ type resourceLong struct {
ALL field.Asterisk ALL field.Asterisk
ID field.Int32 ID field.Int32
ResourceID field.Int32 ResourceID field.Int32
Code field.String
Live field.Int32 Live field.Int32
Type field.Int Type field.Int
Quota field.Int32 Quota field.Int32
@@ -55,6 +72,7 @@ type resourceLong struct {
Used field.Int32 Used field.Int32
Daily field.Int32 Daily field.Int32
LastAt field.Time LastAt field.Time
Sku resourceLongHasOneSku
fieldMap map[string]field.Expr fieldMap map[string]field.Expr
} }
@@ -73,6 +91,7 @@ func (r *resourceLong) updateTableName(table string) *resourceLong {
r.ALL = field.NewAsterisk(table) r.ALL = field.NewAsterisk(table)
r.ID = field.NewInt32(table, "id") r.ID = field.NewInt32(table, "id")
r.ResourceID = field.NewInt32(table, "resource_id") r.ResourceID = field.NewInt32(table, "resource_id")
r.Code = field.NewString(table, "code")
r.Live = field.NewInt32(table, "live") r.Live = field.NewInt32(table, "live")
r.Type = field.NewInt(table, "type") r.Type = field.NewInt(table, "type")
r.Quota = field.NewInt32(table, "quota") r.Quota = field.NewInt32(table, "quota")
@@ -96,9 +115,10 @@ func (r *resourceLong) GetFieldByName(fieldName string) (field.OrderExpr, bool)
} }
func (r *resourceLong) fillFieldMap() { func (r *resourceLong) fillFieldMap() {
r.fieldMap = make(map[string]field.Expr, 9) r.fieldMap = make(map[string]field.Expr, 11)
r.fieldMap["id"] = r.ID r.fieldMap["id"] = r.ID
r.fieldMap["resource_id"] = r.ResourceID r.fieldMap["resource_id"] = r.ResourceID
r.fieldMap["code"] = r.Code
r.fieldMap["live"] = r.Live r.fieldMap["live"] = r.Live
r.fieldMap["type"] = r.Type r.fieldMap["type"] = r.Type
r.fieldMap["quota"] = r.Quota r.fieldMap["quota"] = r.Quota
@@ -106,18 +126,110 @@ func (r *resourceLong) fillFieldMap() {
r.fieldMap["used"] = r.Used r.fieldMap["used"] = r.Used
r.fieldMap["daily"] = r.Daily r.fieldMap["daily"] = r.Daily
r.fieldMap["last_at"] = r.LastAt r.fieldMap["last_at"] = r.LastAt
} }
func (r resourceLong) clone(db *gorm.DB) resourceLong { func (r resourceLong) clone(db *gorm.DB) resourceLong {
r.resourceLongDo.ReplaceConnPool(db.Statement.ConnPool) r.resourceLongDo.ReplaceConnPool(db.Statement.ConnPool)
r.Sku.db = db.Session(&gorm.Session{Initialized: true})
r.Sku.db.Statement.ConnPool = db.Statement.ConnPool
return r return r
} }
func (r resourceLong) replaceDB(db *gorm.DB) resourceLong { func (r resourceLong) replaceDB(db *gorm.DB) resourceLong {
r.resourceLongDo.ReplaceDB(db) r.resourceLongDo.ReplaceDB(db)
r.Sku.db = db.Session(&gorm.Session{})
return r return r
} }
type resourceLongHasOneSku struct {
db *gorm.DB
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}
func (a resourceLongHasOneSku) Where(conds ...field.Expr) *resourceLongHasOneSku {
if len(conds) == 0 {
return &a
}
exprs := make([]clause.Expression, 0, len(conds))
for _, cond := range conds {
exprs = append(exprs, cond.BeCond().(clause.Expression))
}
a.db = a.db.Clauses(clause.Where{Exprs: exprs})
return &a
}
func (a resourceLongHasOneSku) WithContext(ctx context.Context) *resourceLongHasOneSku {
a.db = a.db.WithContext(ctx)
return &a
}
func (a resourceLongHasOneSku) Session(session *gorm.Session) *resourceLongHasOneSku {
a.db = a.db.Session(session)
return &a
}
func (a resourceLongHasOneSku) Model(m *models.ResourceLong) *resourceLongHasOneSkuTx {
return &resourceLongHasOneSkuTx{a.db.Model(m).Association(a.Name())}
}
func (a resourceLongHasOneSku) Unscoped() *resourceLongHasOneSku {
a.db = a.db.Unscoped()
return &a
}
type resourceLongHasOneSkuTx struct{ tx *gorm.Association }
func (a resourceLongHasOneSkuTx) Find() (result *models.ProductSku, err error) {
return result, a.tx.Find(&result)
}
func (a resourceLongHasOneSkuTx) Append(values ...*models.ProductSku) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Append(targetValues...)
}
func (a resourceLongHasOneSkuTx) Replace(values ...*models.ProductSku) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Replace(targetValues...)
}
func (a resourceLongHasOneSkuTx) Delete(values ...*models.ProductSku) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Delete(targetValues...)
}
func (a resourceLongHasOneSkuTx) Clear() error {
return a.tx.Clear()
}
func (a resourceLongHasOneSkuTx) Count() int64 {
return a.tx.Count()
}
func (a resourceLongHasOneSkuTx) Unscoped() *resourceLongHasOneSkuTx {
a.tx = a.tx.Unscoped()
return &a
}
type resourceLongDo struct{ gen.DO } type resourceLongDo struct{ gen.DO }
func (r resourceLongDo) Debug() *resourceLongDo { func (r resourceLongDo) Debug() *resourceLongDo {

View File

@@ -29,6 +29,7 @@ func newResourceShort(db *gorm.DB, opts ...gen.DOOption) resourceShort {
_resourceShort.ALL = field.NewAsterisk(tableName) _resourceShort.ALL = field.NewAsterisk(tableName)
_resourceShort.ID = field.NewInt32(tableName, "id") _resourceShort.ID = field.NewInt32(tableName, "id")
_resourceShort.ResourceID = field.NewInt32(tableName, "resource_id") _resourceShort.ResourceID = field.NewInt32(tableName, "resource_id")
_resourceShort.Code = field.NewString(tableName, "code")
_resourceShort.Live = field.NewInt32(tableName, "live") _resourceShort.Live = field.NewInt32(tableName, "live")
_resourceShort.Type = field.NewInt(tableName, "type") _resourceShort.Type = field.NewInt(tableName, "type")
_resourceShort.Quota = field.NewInt32(tableName, "quota") _resourceShort.Quota = field.NewInt32(tableName, "quota")
@@ -36,6 +37,21 @@ func newResourceShort(db *gorm.DB, opts ...gen.DOOption) resourceShort {
_resourceShort.Used = field.NewInt32(tableName, "used") _resourceShort.Used = field.NewInt32(tableName, "used")
_resourceShort.Daily = field.NewInt32(tableName, "daily") _resourceShort.Daily = field.NewInt32(tableName, "daily")
_resourceShort.LastAt = field.NewTime(tableName, "last_at") _resourceShort.LastAt = field.NewTime(tableName, "last_at")
_resourceShort.Sku = resourceShortHasOneSku{
db: db.Session(&gorm.Session{}),
RelationField: field.NewRelation("Sku", "models.ProductSku"),
Product: struct {
field.RelationField
}{
RelationField: field.NewRelation("Sku.Product", "models.Product"),
},
Discount: struct {
field.RelationField
}{
RelationField: field.NewRelation("Sku.Discount", "models.ProductDiscount"),
},
}
_resourceShort.fillFieldMap() _resourceShort.fillFieldMap()
@@ -48,6 +64,7 @@ type resourceShort struct {
ALL field.Asterisk ALL field.Asterisk
ID field.Int32 ID field.Int32
ResourceID field.Int32 ResourceID field.Int32
Code field.String
Live field.Int32 Live field.Int32
Type field.Int Type field.Int
Quota field.Int32 Quota field.Int32
@@ -55,6 +72,7 @@ type resourceShort struct {
Used field.Int32 Used field.Int32
Daily field.Int32 Daily field.Int32
LastAt field.Time LastAt field.Time
Sku resourceShortHasOneSku
fieldMap map[string]field.Expr fieldMap map[string]field.Expr
} }
@@ -73,6 +91,7 @@ func (r *resourceShort) updateTableName(table string) *resourceShort {
r.ALL = field.NewAsterisk(table) r.ALL = field.NewAsterisk(table)
r.ID = field.NewInt32(table, "id") r.ID = field.NewInt32(table, "id")
r.ResourceID = field.NewInt32(table, "resource_id") r.ResourceID = field.NewInt32(table, "resource_id")
r.Code = field.NewString(table, "code")
r.Live = field.NewInt32(table, "live") r.Live = field.NewInt32(table, "live")
r.Type = field.NewInt(table, "type") r.Type = field.NewInt(table, "type")
r.Quota = field.NewInt32(table, "quota") r.Quota = field.NewInt32(table, "quota")
@@ -96,9 +115,10 @@ func (r *resourceShort) GetFieldByName(fieldName string) (field.OrderExpr, bool)
} }
func (r *resourceShort) fillFieldMap() { func (r *resourceShort) fillFieldMap() {
r.fieldMap = make(map[string]field.Expr, 9) r.fieldMap = make(map[string]field.Expr, 11)
r.fieldMap["id"] = r.ID r.fieldMap["id"] = r.ID
r.fieldMap["resource_id"] = r.ResourceID r.fieldMap["resource_id"] = r.ResourceID
r.fieldMap["code"] = r.Code
r.fieldMap["live"] = r.Live r.fieldMap["live"] = r.Live
r.fieldMap["type"] = r.Type r.fieldMap["type"] = r.Type
r.fieldMap["quota"] = r.Quota r.fieldMap["quota"] = r.Quota
@@ -106,18 +126,110 @@ func (r *resourceShort) fillFieldMap() {
r.fieldMap["used"] = r.Used r.fieldMap["used"] = r.Used
r.fieldMap["daily"] = r.Daily r.fieldMap["daily"] = r.Daily
r.fieldMap["last_at"] = r.LastAt r.fieldMap["last_at"] = r.LastAt
} }
func (r resourceShort) clone(db *gorm.DB) resourceShort { func (r resourceShort) clone(db *gorm.DB) resourceShort {
r.resourceShortDo.ReplaceConnPool(db.Statement.ConnPool) r.resourceShortDo.ReplaceConnPool(db.Statement.ConnPool)
r.Sku.db = db.Session(&gorm.Session{Initialized: true})
r.Sku.db.Statement.ConnPool = db.Statement.ConnPool
return r return r
} }
func (r resourceShort) replaceDB(db *gorm.DB) resourceShort { func (r resourceShort) replaceDB(db *gorm.DB) resourceShort {
r.resourceShortDo.ReplaceDB(db) r.resourceShortDo.ReplaceDB(db)
r.Sku.db = db.Session(&gorm.Session{})
return r return r
} }
type resourceShortHasOneSku struct {
db *gorm.DB
field.RelationField
Product struct {
field.RelationField
}
Discount struct {
field.RelationField
}
}
func (a resourceShortHasOneSku) Where(conds ...field.Expr) *resourceShortHasOneSku {
if len(conds) == 0 {
return &a
}
exprs := make([]clause.Expression, 0, len(conds))
for _, cond := range conds {
exprs = append(exprs, cond.BeCond().(clause.Expression))
}
a.db = a.db.Clauses(clause.Where{Exprs: exprs})
return &a
}
func (a resourceShortHasOneSku) WithContext(ctx context.Context) *resourceShortHasOneSku {
a.db = a.db.WithContext(ctx)
return &a
}
func (a resourceShortHasOneSku) Session(session *gorm.Session) *resourceShortHasOneSku {
a.db = a.db.Session(session)
return &a
}
func (a resourceShortHasOneSku) Model(m *models.ResourceShort) *resourceShortHasOneSkuTx {
return &resourceShortHasOneSkuTx{a.db.Model(m).Association(a.Name())}
}
func (a resourceShortHasOneSku) Unscoped() *resourceShortHasOneSku {
a.db = a.db.Unscoped()
return &a
}
type resourceShortHasOneSkuTx struct{ tx *gorm.Association }
func (a resourceShortHasOneSkuTx) Find() (result *models.ProductSku, err error) {
return result, a.tx.Find(&result)
}
func (a resourceShortHasOneSkuTx) Append(values ...*models.ProductSku) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Append(targetValues...)
}
func (a resourceShortHasOneSkuTx) Replace(values ...*models.ProductSku) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Replace(targetValues...)
}
func (a resourceShortHasOneSkuTx) Delete(values ...*models.ProductSku) (err error) {
targetValues := make([]interface{}, len(values))
for i, v := range values {
targetValues[i] = v
}
return a.tx.Delete(targetValues...)
}
func (a resourceShortHasOneSkuTx) Clear() error {
return a.tx.Clear()
}
func (a resourceShortHasOneSkuTx) Count() int64 {
return a.tx.Count()
}
func (a resourceShortHasOneSkuTx) Unscoped() *resourceShortHasOneSkuTx {
a.tx = a.tx.Unscoped()
return &a
}
type resourceShortDo struct{ gen.DO } type resourceShortDo struct{ gen.DO }
func (r resourceShortDo) Debug() *resourceShortDo { func (r resourceShortDo) Debug() *resourceShortDo {

View File

@@ -162,5 +162,11 @@ func adminRouter(api fiber.Router) {
product.Post("/sku/page", handlers.PageProductSkuByAdmin) product.Post("/sku/page", handlers.PageProductSkuByAdmin)
product.Post("/sku/create", handlers.CreateProductSku) product.Post("/sku/create", handlers.CreateProductSku)
product.Post("/sku/update", handlers.UpdateProductSku) product.Post("/sku/update", handlers.UpdateProductSku)
product.Post("/sku/update/discount/batch", handlers.BatchUpdateProductSkuDiscount)
product.Post("/sku/remove", handlers.DeleteProductSku) product.Post("/sku/remove", handlers.DeleteProductSku)
product.Post("/discount/page", handlers.PageProductDiscountByAdmin)
product.Post("/discount/all", handlers.AllProductDiscountsByAdmin)
product.Post("/discount/create", handlers.CreateProductDiscount)
product.Post("/discount/update", handlers.UpdateProductDiscount)
product.Post("/discount/remove", handlers.DeleteProductDiscount)
} }

View File

@@ -0,0 +1,59 @@
package services
import (
"platform/web/core"
m "platform/web/models"
q "platform/web/queries"
"time"
"gorm.io/gen/field"
)
var ProductDiscount = &productDiscountService{}
type productDiscountService struct{}
func (s *productDiscountService) All() (result []*m.ProductDiscount, err error) {
return q.ProductDiscount.Find()
}
func (s *productDiscountService) Page(req *core.PageReq) (result []*m.ProductDiscount, count int64, err error) {
return q.ProductDiscount.FindByPage(req.GetOffset(), req.GetLimit())
}
func (s *productDiscountService) Create(data CreateProductDiscountData) (err error) {
return q.ProductDiscount.Create(&m.ProductDiscount{
Name: data.Name,
Discount: data.Discount,
})
}
type CreateProductDiscountData struct {
Name string `json:"name"`
Discount int32 `json:"discount" validate:"min=0,max=100"`
}
func (s *productDiscountService) Update(data UpdateProductDiscountData) (err error) {
do := make([]field.AssignExpr, 0)
if data.Name != nil {
do = append(do, q.ProductDiscount.Name.Value(*data.Name))
}
if data.Discount != nil {
do = append(do, q.ProductDiscount.Discount.Value(*data.Discount))
}
_, err = q.ProductDiscount.Where(q.ProductDiscount.ID.Eq(data.ID)).UpdateSimple(do...)
return err
}
type UpdateProductDiscountData struct {
ID int32 `json:"id"`
Name *string `json:"name"`
Discount *int32 `json:"discount" validate:"omitempty,min=0,max=100"`
}
func (s *productDiscountService) Delete(id int32) (err error) {
_, err = q.ProductDiscount.Where(q.ProductDiscount.ID.Eq(id)).UpdateColumn(q.ProductDiscount.DeletedAt, time.Now())
return
}

View File

@@ -21,6 +21,7 @@ func (s *productSkuService) Page(req *core.PageReq, productId *int32) (result []
do = append(do, q.ProductSku.ProductID.Eq(*productId)) do = append(do, q.ProductSku.ProductID.Eq(*productId))
} }
return q.ProductSku. return q.ProductSku.
Joins(q.ProductSku.Discount).
Where(do...). Where(do...).
FindByPage(req.GetOffset(), req.GetLimit()) FindByPage(req.GetOffset(), req.GetLimit())
} }
@@ -33,19 +34,19 @@ func (s *productSkuService) Create(create CreateProductSkuData) (err error) {
return q.ProductSku.Create(&m.ProductSku{ return q.ProductSku.Create(&m.ProductSku{
ProductID: create.ProductID, ProductID: create.ProductID,
DiscountId: create.DiscountID,
Code: create.Code, Code: create.Code,
Name: create.Name, Name: create.Name,
Price: price, Price: price,
Discount: create.Discount,
}) })
} }
type CreateProductSkuData struct { type CreateProductSkuData struct {
ProductID int32 `json:"product_id"` ProductID int32 `json:"product_id"`
DiscountID int32 `json:"discount_id"`
Code string `json:"code"` Code string `json:"code"`
Name string `json:"name"` Name string `json:"name"`
Price string `json:"price"` Price string `json:"price"`
Discount float32 `json:"discount"`
} }
func (s *productSkuService) Update(update UpdateProductSkuData) (err error) { func (s *productSkuService) Update(update UpdateProductSkuData) (err error) {
@@ -58,8 +59,8 @@ func (s *productSkuService) Update(update UpdateProductSkuData) (err error) {
} }
do = append(do, q.ProductSku.Price.Value(price)) do = append(do, q.ProductSku.Price.Value(price))
} }
if update.Discount != nil { if update.DiscountID != nil {
do = append(do, q.ProductSku.Discount.Value(*update.Discount)) do = append(do, q.ProductSku.DiscountId.Value(*update.DiscountID))
} }
if update.Code != nil { if update.Code != nil {
do = append(do, q.ProductSku.Code.Value(*update.Code)) do = append(do, q.ProductSku.Code.Value(*update.Code))
@@ -74,13 +75,25 @@ func (s *productSkuService) Update(update UpdateProductSkuData) (err error) {
type UpdateProductSkuData struct { type UpdateProductSkuData struct {
ID int32 `json:"id"` ID int32 `json:"id"`
DiscountID *int32 `json:"discount_id"`
Code *string `json:"code"` Code *string `json:"code"`
Name *string `json:"name"` Name *string `json:"name"`
Price *string `json:"price"` Price *string `json:"price"`
Discount *float32 `json:"discount"`
} }
func (s *productSkuService) Delete(id int32) (err error) { func (s *productSkuService) Delete(id int32) (err error) {
_, err = q.ProductSku.Where(q.ProductSku.ID.Eq(id)).UpdateColumn(q.ProductSku.DeletedAt, time.Now()) _, err = q.ProductSku.Where(q.ProductSku.ID.Eq(id)).UpdateColumn(q.ProductSku.DeletedAt, time.Now())
return return
} }
func (s *productSkuService) BatchUpdateDiscount(data BatchUpdateSkuDiscountData) (err error) {
_, err = q.ProductSku.Where(q.ProductSku.ProductID.Eq(data.ProductID)).UpdateSimple(
q.ProductSku.DiscountId.Value(data.DiscountID),
)
return
}
type BatchUpdateSkuDiscountData struct {
ProductID int32 `json:"product_id"`
DiscountID int32 `json:"discount_id"`
}

View File

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