bilibili-backup/app/service/openplatform/ticket-sales/model/order.go
2019-04-22 02:59:20 +00:00

470 lines
12 KiB
Go

package model
import (
"encoding/json"
"go-common/app/common/openplatform/encoding"
"go-common/app/service/openplatform/ticket-sales/api/grpc/type"
"go-common/app/service/openplatform/ticket-sales/api/grpc/v1"
"go-common/library/time"
"github.com/gogo/protobuf/types"
)
//OrderMain 订单主表结构
type OrderMain struct {
OrderID int64 `json:"order_id"`
UID string `json:"uid"`
OrderType int16 `json:"order_type"`
ItemID int64 `json:"item_id"`
ItemInfo *_type.OrderItemInfo `json:"item_info"`
Count int64 `json:"count"`
TotalMoney int64 `json:"total_money"`
PayMoney int64 `json:"pay_money"`
ExpressFee int64 `json:"express_fee"`
PayChannel int16 `json:"pay_channel"`
PayTime int64 `json:"pay_time"`
Source string `json:"source"`
Status int16 `json:"status"`
SubStatus int16 `json:"sub_status"`
RefundStatus int16 `json:"refund_status"`
IsDeleted int16 `json:"is_deleted"`
CTime time.Time `json:"ctime"`
MTime time.Time `json:"mtime"`
}
//OrderMainQuerier 订单表查询参数
type OrderMainQuerier v1.ListOrdersRequest
// OrderDetail 订单详情表信息
type OrderDetail struct {
OrderID int64 `json:"order_id"`
Buyer string `json:"buyer"`
Tel string `json:"tel"`
PersonalID string `json:"personal_id"`
ExpressCO string `json:"express_co"`
ExpressNO string `json:"express_no"`
ExpressType int16 `json:"express_type"`
Remark string `json:"remark"`
DeviceType int16 `json:"device_type"`
IP []byte `json:"ip"`
Coupon *_type.OrderCoupon `json:"coupon"`
DeliverDetail *_type.OrderDeliver `json:"deliver_detail"`
Detail *_type.OrderExtra `json:"detail"`
MSource string `json:"msource"`
CTime time.Time `json:"-"`
MTime time.Time `json:"-"`
}
//OrderSKU order_sku表结构
type OrderSKU _type.OrderSKU
//OrderPayCharge 订单支付表结构
type OrderPayCharge _type.OrderPayCharge
//GetFields 获取order_main表所有字段,参数是需要排除的字段
func (o *OrderMain) GetFields(except *types.FieldMask) []string {
fields := []string{
"order_id", "uid", "order_type", "item_id", "item_info",
"count", "total_money", "express_fee", "pay_money", "pay_channel",
"pay_time", "source", "status", "sub_status", "refund_status",
"is_deleted", "ctime", "mtime",
}
if except != nil {
lp := len(except.Paths)
mExcept := make(map[string]bool, lp)
for _, v := range except.Paths {
mExcept[v] = true
}
res := make([]string, len(fields)-lp)
i := 0
for _, v := range fields {
if ok := mExcept[v]; !ok {
res[i] = v
i++
}
}
return res
}
return fields
}
//GetFields 获取order_detail字段名称
func (o *OrderDetail) GetFields(except *types.FieldMask) []string {
fields := []string{
"order_id", "buyer", "tel", "personal_id", "express_co",
"express_no", "express_type", "remark", "device_type", "ip",
"coupon", "deliver_detail", "detail", "msource", "ctime",
"mtime",
}
if except != nil {
lp := len(except.Paths)
mExcept := make(map[string]bool, lp)
for _, v := range except.Paths {
mExcept[v] = true
}
res := make([]string, len(fields)-lp)
i := 0
for _, v := range fields {
if ok := mExcept[v]; !ok {
res[i] = v
i++
}
}
return res
}
return fields
}
//GetFields 获取order_sku对象的字段名
func (o *OrderSKU) GetFields(except *types.FieldMask) []string {
fields := []string{
"order_id", "sku_id", "count", "origin_price", "price",
"seat_ids", "ticket_type", "discounts", "ctime", "mtime",
}
if except != nil {
lp := len(except.Paths)
mExcept := make(map[string]bool, lp)
for _, v := range except.Paths {
mExcept[v] = true
}
res := make([]string, len(fields)-lp)
i := 0
for _, v := range fields {
if ok := mExcept[v]; !ok {
res[i] = v
i++
}
}
return res
}
return fields
}
//GetFields 获取order_pay_charge对象的字段名
func (o *OrderPayCharge) GetFields(except *types.FieldMask) []string {
fields := []string{
"order_id", "charge_id", "channel", "paid", "refunded",
"ctime", "mtime",
}
if except != nil {
lp := len(except.Paths)
mExcept := make(map[string]bool, lp)
for _, v := range except.Paths {
mExcept[v] = true
}
res := make([]string, len(fields)-lp)
i := 0
for _, v := range fields {
if ok := mExcept[v]; !ok {
res[i] = v
i++
}
}
return res
}
return fields
}
//GetPtrs 获取order_main对象指针
// 如果设置vptr参数,会把struct指针替换成string指针,并在vptr保存原struct指针(as value)和它在返回数组中的下标(as key)
func (o *OrderMain) GetPtrs(fields *types.FieldMask, vptr map[int]interface{}) []interface{} {
ptrs := map[string]interface{}{
"order_id": &o.OrderID,
"uid": &o.UID,
"order_type": &o.OrderType,
"item_id": &o.ItemID,
"item_info": &o.ItemInfo,
"count": &o.Count,
"total_money": &o.TotalMoney,
"express_fee": &o.ExpressFee,
"pay_money": &o.PayMoney,
"pay_channel": &o.PayChannel,
"pay_time": &o.PayTime,
"source": &o.Source,
"status": &o.Status,
"sub_status": &o.SubStatus,
"refund_status": &o.RefundStatus,
"is_deleted": &o.IsDeleted,
"ctime": &o.CTime,
"mtime": &o.MTime,
}
if fields == nil {
fields = &types.FieldMask{Paths: o.GetFields(nil)}
}
ret := make([]interface{}, len(fields.Paths))
i := 0
for _, f := range fields.Paths {
if vptr != nil && f == "item_info" {
var s string
ret[i] = &s
vptr[i] = ptrs[f]
} else {
ret[i] = ptrs[f]
}
i++
}
return ret
}
//GetPtrs 获取order_detail对象指针
func (o *OrderDetail) GetPtrs(fields *types.FieldMask, vptr map[int]interface{}) []interface{} {
ptrs := map[string]interface{}{
"order_id": &o.OrderID,
"buyer": &o.Buyer,
"tel": &o.Tel,
"personal_id": &o.PersonalID,
"express_co": &o.ExpressCO,
"express_no": &o.ExpressNO,
"express_type": &o.ExpressType,
"remark": &o.Remark,
"device_type": &o.DeviceType,
"ip": &o.IP,
"coupon": &o.Coupon,
"deliver_detail": &o.DeliverDetail,
"detail": &o.Detail,
"msource": &o.MSource,
"ctime": &o.CTime,
"mtime": &o.MTime,
}
if fields == nil {
fields = &types.FieldMask{Paths: o.GetFields(nil)}
}
ret := make([]interface{}, len(fields.Paths))
i := 0
for _, f := range fields.Paths {
if vptr != nil && (f == "coupon" || f == "deliver_detail" || f == "detail") {
var s string
ret[i] = &s
vptr[i] = ptrs[f]
} else {
ret[i] = ptrs[f]
}
i++
}
return ret
}
//GetPtrs 获取order_sku对象的字段指针
func (o *OrderSKU) GetPtrs(fields *types.FieldMask, vptr map[int]interface{}) []interface{} {
ptrs := map[string]interface{}{
"order_id": &o.OrderID,
"sku_id": &o.SKUID,
"count": &o.Count,
"origin_price": &o.OriginPrice,
"price": &o.Price,
"seat_ids": &o.SeatIDs,
"ticket_type": &o.TicketType,
"discounts": &o.Discounts,
"ctime": &o.CTime,
"mtime": &o.MTime,
}
if fields == nil {
fields = &types.FieldMask{Paths: o.GetFields(nil)}
}
ret := make([]interface{}, len(fields.Paths))
i := 0
for _, f := range fields.Paths {
if vptr != nil && (f == "discounts" || f == "seat_ids") {
var s string
ret[i] = &s
vptr[i] = ptrs[f]
} else {
ret[i] = ptrs[f]
}
i++
}
return ret
}
//GetPtrs 获取order_pay_charge对象的字段指针
func (o *OrderPayCharge) GetPtrs(fields *types.FieldMask, vptr map[int]interface{}) []interface{} {
ptrs := map[string]interface{}{
"order_id": &o.OrderID,
"charge_id": &o.ChargeID,
"channel": &o.Channel,
"paid": &o.Paid,
"refunded": &o.Refunded,
"ctime": &o.CTime,
"mtime": &o.MTime,
}
if fields == nil {
fields = &types.FieldMask{Paths: o.GetFields(nil)}
}
ret := make([]interface{}, len(fields.Paths))
i := 0
for _, f := range fields.Paths {
if vptr != nil && f == "discounts" {
var s string
ret[i] = &s
vptr[i] = ptrs[f]
} else {
ret[i] = ptrs[f]
}
i++
}
return ret
}
//GetVals 获取order_main对象里的值
func (o *OrderMain) GetVals(fields *types.FieldMask, asString bool) []interface{} {
vals := map[string]interface{}{
"order_id": o.OrderID,
"uid": o.UID,
"order_type": o.OrderType,
"item_id": o.ItemID,
"item_info": o.ItemInfo,
"count": o.Count,
"total_money": o.TotalMoney,
"express_fee": o.ExpressFee,
"pay_money": o.PayMoney,
"pay_channel": o.PayChannel,
"pay_time": o.PayTime,
"source": o.Source,
"status": o.Status,
"sub_status": o.SubStatus,
"refund_status": o.RefundStatus,
"is_deleted": o.IsDeleted,
"ctime": o.CTime,
"mtime": o.MTime,
}
if fields == nil {
fields = &types.FieldMask{Paths: o.GetFields(nil)}
}
ret := make([]interface{}, len(fields.Paths))
i := 0
for _, f := range fields.Paths {
if asString && f == "item_info" {
if b, err := json.Marshal(vals[f]); err == nil {
ret[i] = string(b)
}
} else {
ret[i] = vals[f]
}
i++
}
return ret
}
//GetVals 获取order_detail对象字段的值
func (o *OrderDetail) GetVals(fields *types.FieldMask, asString bool) []interface{} {
vals := map[string]interface{}{
"order_id": o.OrderID,
"buyer": o.Buyer,
"tel": o.Tel,
"personal_id": o.PersonalID,
"express_co": o.ExpressCO,
"express_no": o.ExpressNO,
"express_type": o.ExpressType,
"remark": o.Remark,
"device_type": o.DeviceType,
"ip": o.IP,
"coupon": o.Coupon,
"deliver_detail": o.DeliverDetail,
"detail": o.Detail,
"msource": o.MSource,
"ctime": o.CTime,
"mtime": o.MTime,
}
if fields == nil {
fields = &types.FieldMask{Paths: o.GetFields(nil)}
}
ret := make([]interface{}, len(fields.Paths))
i := 0
for _, f := range fields.Paths {
if asString && (f == "coupon" || f == "deliver_detail" || f == "detail") {
if b, err := json.Marshal(vals[f]); err == nil {
ret[i] = string(b)
}
} else {
ret[i] = vals[f]
}
i++
}
return ret
}
//GetVals 获取order_sku字段的值
func (o *OrderSKU) GetVals(fields *types.FieldMask, asString bool) []interface{} {
vals := map[string]interface{}{
"order_id": o.OrderID,
"sku_id": o.SKUID,
"count": o.Count,
"origin_price": o.OriginPrice,
"price": o.Price,
"seat_ids": o.SeatIDs,
"ticket_type": o.TicketType,
"discounts": o.Discounts,
"ctime": o.CTime,
"mtime": o.MTime,
}
if fields == nil {
fields = &types.FieldMask{Paths: o.GetFields(nil)}
}
ret := make([]interface{}, len(fields.Paths))
i := 0
for _, f := range fields.Paths {
if asString && (f == "discounts" || f == "seat_ids") {
if b, err := json.Marshal(vals[f]); err == nil {
ret[i] = string(b)
}
} else {
ret[i] = vals[f]
}
i++
}
return ret
}
func (o *OrderDetail) getEncryptPtrs() []*string {
res := make([]*string, 3)
res[0] = &o.Tel
res[1] = &o.PersonalID
if o.DeliverDetail != nil {
res[2] = &o.DeliverDetail.Tel
}
return res
}
//Encrypt 加密order_detail的字段
func (o *OrderDetail) Encrypt(c *encoding.EncryptConfig) {
for _, p := range o.getEncryptPtrs() {
if p != nil {
s, _ := encoding.Encrypt(*p, c)
*p = s
}
}
}
//Decrypt 解密order_detail字段
func (o *OrderDetail) Decrypt(c *encoding.EncryptConfig) {
for _, p := range o.getEncryptPtrs() {
if p != nil {
s, _ := encoding.Decrypt(*p, c)
*p = s
}
}
}
//GetSettleOrdersRequest 获取结算订单请求
type GetSettleOrdersRequest struct {
Date string `form:"date" validate:"required"`
Ref byte `form:"ref"`
ExtParams string `form:"extParams" validate:"omitempty,numeric"`
PageSize int `form:"pagesize"`
}
//SettleOrder 获取结算订单返回
type SettleOrder struct {
ID int64 `json:"-"`
OrderID int64 `json:"order_id"`
RefID int64 `json:"ref_id"`
RefundApplyTime time.Time `json:"-"`
}
//SettleOrders 获取结算订单返回
type SettleOrders struct {
Data []*SettleOrder `json:"data"`
ExtParams string `json:"extParams"`
}