133 lines
6.3 KiB
Go
133 lines
6.3 KiB
Go
package model
|
||
|
||
import (
|
||
"database/sql/driver"
|
||
"encoding/json"
|
||
"errors"
|
||
|
||
"gorm.io/plugin/soft_delete"
|
||
)
|
||
|
||
// 增值套餐
|
||
type ValueAddBundleProfile struct {
|
||
Id int32 `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT" json:"id"`
|
||
UUID string `json:"uuid" gorm:"column:uuid;type:varchar(1024);comment:增值套餐UUID"`
|
||
Num int32 `json:"num" gorm:"column:num;type:int;comment:视频数量"`
|
||
OriginalPrice float32 `json:"originalPrice" gorm:"column:original_price;type:decimal(12,2);comment:原单价"`
|
||
DiscountPrice float32 `json:"discountPrice" gorm:"column:discount_price;type:decimal(12,2);comment:优惠单价"`
|
||
SavedAmount float32 `json:"savedAmount" gorm:"column:saved_amount;type:decimal(12,2);comment:节省金额"`
|
||
TotalPrice float32 `json:"totalPrice" gorm:"column:total_price;type:decimal(12,2);comment:套餐总价"`
|
||
DiscountPriceStatus bool `json:"discountPriceStatus" gorm:"column:discount_price_status;default:false;comment:优惠单价状态(true:等于 false:约等于)"`
|
||
Choose bool `json:"choose" gorm:"column:choose;default:false;comment:可选条数(true:可以 false:不可以)"`
|
||
//Type int32 `json:"type" gorm:"column:type;type:int;comment:类型 1:固定套餐 2:自定义套餐"`
|
||
PriceType int32 `json:"priceType" gorm:"column:price_type;type:int;comment:套餐价格类型 1:人民币 2:美元"`
|
||
Language string `json:"language" gorm:"column:language;type:varchar(32);comment:套餐语言 zh-CN EN"`
|
||
AddBundleCommonUid string `json:"addBundleCommonUid" gorm:"column:add_bundle_common_uid;type:varchar(1024);comment:套餐公共ID"`
|
||
CreatedAt int64 `gorm:"column:created_at;autoCreateTime"`
|
||
UpdatedAt int32 `gorm:"column:updated_at;autoCreateTime"`
|
||
DeletedAt soft_delete.DeletedAt
|
||
}
|
||
|
||
// 新增值套餐主表
|
||
type ValueAddService struct {
|
||
Id int32 `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT" json:"id"`
|
||
UUID string `json:"uuid" gorm:"column:uuid;type:varchar(1024);comment:增值套餐UUID"`
|
||
ServiceName string `json:"serviceName" gorm:"column:service_name;type:varchar(1024);comment:增值服务名称"`
|
||
ServiceType int32 `json:"serviceType" gorm:"column:service_type;type:int;comment:服务类型 1:视频 2:图文 3:数据报表 4:账号数 5:可用时长"`
|
||
ValueAddServiceLang []ValueAddServiceLang `gorm:"foreignKey:UUID;references:UUID"`
|
||
BundleToValueAddService []BundleToValueAddService `gorm:"foreignKey:ValueUid;references:UUID"`
|
||
CreatedAt int64 `gorm:"column:created_at;autoCreateTime"`
|
||
UpdatedAt int64 `gorm:"column:updated_at;autoCreateTime"`
|
||
DeletedAt soft_delete.DeletedAt
|
||
}
|
||
|
||
// 新增值套餐语言表
|
||
type ValueAddServiceLang struct {
|
||
Id int32 `gorm:"column:id;type:int(11);primary_key;AUTO_INCREMENT" json:"id"`
|
||
UUID string `json:"uuid" gorm:"column:uuid;type:varchar(1024);comment:增值套餐UUID"`
|
||
ServiceName string `json:"serviceName" gorm:"column:service_name;type:varchar(1024);comment:增值服务名称"`
|
||
ServiceType int32 `json:"serviceType" gorm:"column:service_type;type:int;comment:服务类型 1:视频 2:图文 3:数据报表 4:账号数 5:可用时长"`
|
||
PriceMode int32 `json:"priceMode" gorm:"column:price_mode;type:int;comment:套餐价格类型 1:单价 2:总价"`
|
||
OriginalPrice float32 `json:"originalPrice" gorm:"column:original_price;type:decimal(12,2);comment:原单价"`
|
||
TotalPrice float32 `json:"totalPrice" gorm:"column:total_price;type:decimal(12,2);comment:增值服务总价"`
|
||
Unit string `json:"unit" gorm:"column:unit;type:varchar(50);comment:单位 1:个 2:条 3:天 4:月 5:年"`
|
||
Language string `json:"language" gorm:"column:language;type:varchar(32);comment:套餐语言 zh-CN zh-TW EN de-DE js-JP(中繁英德日)"`
|
||
PriceType int64 `json:"priceType" gorm:"column:price_type;type:int;comment:币种 1:人民币 2:美元 3:日元 4:欧元"`
|
||
Options PriceOptions `gorm:"column:options;type:json" json:"options"`
|
||
CreatedAt int64 `gorm:"column:created_at;autoCreateTime"`
|
||
UpdatedAt int64 `gorm:"column:updated_at;autoCreateTime"`
|
||
DeletedAt soft_delete.DeletedAt
|
||
}
|
||
type PriceOptions []*PriceOption
|
||
type PriceOption struct {
|
||
Id int32 `json:"id"`
|
||
Num int32 `json:"num"`
|
||
Symbol string `json:"symbol"` // 符号> < = <= =>
|
||
Price float32 `json:"price"` // 价格(根据priceMode决定是单价还是总价)
|
||
}
|
||
|
||
// 实现 driver.Valuer 接口
|
||
func (o PriceOptions) Value() (driver.Value, error) {
|
||
return json.Marshal(o)
|
||
}
|
||
|
||
// 实现 sql.Scanner 接口
|
||
func (o *PriceOptions) Scan(value interface{}) error {
|
||
bytes, ok := value.([]byte)
|
||
if !ok {
|
||
return errors.New("实现 sql.Scanner 接口 failed: type assertion to []byte failed")
|
||
}
|
||
return json.Unmarshal(bytes, o)
|
||
}
|
||
|
||
// 校验Options是否合法,避免同一数字被多个规则覆盖
|
||
func ValidateOptions(options PriceOptions) (bool, error) {
|
||
symbolSet := map[string]struct{}{">": {}, "<": {}, ">=": {}, "<=": {}, "=": {}}
|
||
cover := make(map[int]struct{})
|
||
for _, opt := range options {
|
||
if opt.Num < 0 || opt.Num > 100 {
|
||
return false, errors.New("数字范围错误")
|
||
|
||
}
|
||
if _, ok := symbolSet[opt.Symbol]; !ok {
|
||
return false, errors.New("符号错误")
|
||
|
||
}
|
||
var nums []int
|
||
switch opt.Symbol {
|
||
case "=":
|
||
nums = []int{int(opt.Num)}
|
||
case ">":
|
||
for i := int(opt.Num) + 1; i <= 100; i++ {
|
||
nums = append(nums, i)
|
||
}
|
||
case ">=":
|
||
for i := int(opt.Num); i <= 100; i++ {
|
||
nums = append(nums, i)
|
||
}
|
||
case "<":
|
||
for i := 1; i < int(opt.Num); i++ {
|
||
nums = append(nums, i)
|
||
}
|
||
case "<=":
|
||
for i := 1; i <= int(opt.Num); i++ {
|
||
nums = append(nums, i)
|
||
}
|
||
}
|
||
for _, n := range nums {
|
||
if _, exist := cover[n]; exist {
|
||
return false, errors.New("逻辑存在冲突,请重新设置")
|
||
|
||
}
|
||
cover[n] = struct{}{}
|
||
}
|
||
}
|
||
return true, nil
|
||
}
|
||
func (m *ValueAddService) TableName() string {
|
||
return "value_add_service"
|
||
}
|
||
func (m *ValueAddServiceLang) TableName() string {
|
||
return "value_add_service_lang"
|
||
}
|