151 lines
4.2 KiB
Go
151 lines
4.2 KiB
Go
package coupon
|
||
|
||
import (
|
||
"encoding/json"
|
||
"log"
|
||
"time"
|
||
|
||
"loreal.com/dit/utils"
|
||
// "loreal.com/dit/cmd/coupon-service/rule"
|
||
)
|
||
|
||
// KeyBindingRuleProperties 生成的Coupon包含类型为map的Properties字段,用来保存多样化数据。KeyBindingRuleProperties对应的值是该券在兑换时需要满足的条件。
|
||
const KeyBindingRuleProperties string = "binding_rule_properties"
|
||
|
||
// Template 卡券的模板
|
||
type Template struct {
|
||
ID string `json:"id"`
|
||
Name string `json:"name"`
|
||
Description string `json:"description"`
|
||
Creator string `json:"creator"`
|
||
Rules map[string]interface{} `json:"rules"`
|
||
CreatedTime time.Time `json:"created_time,omitempty" type:"DATETIME" default:"datetime('now','localtime')"`
|
||
UpdatedTime time.Time `json:"updated_time,omitempty" type:"DATETIME"`
|
||
DeletedTime time.Time `json:"deleted_time,omitempty" type:"DATETIME"`
|
||
}
|
||
|
||
// CTState 卡券类型的状态定义
|
||
type CTState int32
|
||
|
||
// 卡券的状态
|
||
const (
|
||
CTSActive State = iota
|
||
CTSRevoked
|
||
CTSUnknown
|
||
)
|
||
|
||
// PublishedCouponType 已经发布的卡券类型
|
||
type PublishedCouponType struct {
|
||
ID string `json:"id"`
|
||
Name string `json:"name"`
|
||
TemplateID string `json:"template_id"`
|
||
Description string `json:"description"`
|
||
InternalDescription string `json:"internal_description"`
|
||
State CTState `json:"state"`
|
||
Publisher string `json:"publisher"`
|
||
VisibleStartTime time.Time `json:"visible_start_time" type:"DATETIME"`
|
||
VisibleEndTime time.Time `json:"visible_end_time"`
|
||
StrRules map[string]string `json:"rules"`
|
||
Rules map[string]map[string]interface{}
|
||
CreatedTime time.Time `json:"created_time" type:"DATETIME" default:"datetime('now','localtime')"`
|
||
DeletedTime time.Time `json:"deleted_time" type:"DATETIME"`
|
||
}
|
||
|
||
// InitRules //TODO 未来会重构掉
|
||
func (t *PublishedCouponType) InitRules() {
|
||
t.Rules = map[string]map[string]interface{}{}
|
||
for k, v := range t.StrRules {
|
||
var obj map[string]interface{}
|
||
err := json.Unmarshal([]byte(v), &obj)
|
||
if nil == err {
|
||
t.Rules[k] = obj
|
||
} else {
|
||
log.Panic(err)
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
// State 卡券的状态类型定义
|
||
type State int32
|
||
|
||
// 卡券的状态
|
||
// TODO [HUBIN]: 增加 SExpired 状态
|
||
const (
|
||
SActive State = iota //如果非一次兑换类型,那么在有效兑换次数内,仍然是active
|
||
SRevoked
|
||
SDeleteCoupon
|
||
SRedeemed //无论多次还是一次,全部用完后置为该状态
|
||
SExpired
|
||
SUnknown
|
||
)
|
||
|
||
// Coupon 用来封装一个Coupon实体的结构
|
||
type Coupon struct {
|
||
ID string
|
||
CouponTypeID string
|
||
ConsumerID string
|
||
ConsumerRefID string
|
||
ChannelID string
|
||
State State
|
||
Properties map[string]interface{}
|
||
CreatedTime *time.Time
|
||
Transactions []*Transaction
|
||
}
|
||
|
||
// CreatedTimeToLocal 使用localtime
|
||
func (c *Coupon) CreatedTimeToLocal() {
|
||
l := c.CreatedTime.Local()
|
||
c.CreatedTime = &l
|
||
}
|
||
|
||
// RedeemedCoupons 传递被核销卡券信息的结构,
|
||
type RedeemedCoupons struct {
|
||
ExtraInfo string `json:"extrainfo,omitempty"`
|
||
Coupons []*Coupon `json:"coupons,omitempty"`
|
||
}
|
||
|
||
// TransType 卡券被操作的状态类型
|
||
type TransType int32
|
||
|
||
// 卡券被操作的种类
|
||
const (
|
||
TTIssueCoupon TransType = iota
|
||
TTDeactiveCoupon
|
||
TTDeleteCoupon
|
||
TTRedeemCoupon //可多次存在
|
||
TTExpired
|
||
TTUnknownTransaction
|
||
)
|
||
|
||
// Transaction 用来封装一次Coupon的状态变动
|
||
type Transaction struct {
|
||
ID string
|
||
CouponID string
|
||
ActorID string
|
||
TransType TransType
|
||
ExtraInfo string
|
||
CreatedTime time.Time
|
||
}
|
||
|
||
// EncryptExtraInfo 给ExtraInfo 使用AES256加密
|
||
func (t *Transaction) EncryptExtraInfo() string {
|
||
return utils.AES256URLEncrypt(t.ExtraInfo, encryptKey)
|
||
}
|
||
|
||
// DecryptExtraInfo 给ExtraInfo 使用AES256解密
|
||
func (t *Transaction) DecryptExtraInfo(emsg string) error {
|
||
p, e := utils.AES256URLDecrypt(emsg, encryptKey)
|
||
if nil != e {
|
||
return e
|
||
}
|
||
t.ExtraInfo = p
|
||
return nil
|
||
}
|
||
|
||
// CreatedTimeToLocal 给ExtraInfo 使用AES256解密
|
||
func (t *Transaction) CreatedTimeToLocal() {
|
||
l := t.CreatedTime.Local()
|
||
t.CreatedTime = l
|
||
}
|