2021-06-30 02:12:05 +00:00
package model
import (
"errors"
"fmt"
"github.com/codinl/go-logger"
2022-01-16 10:47:48 +00:00
"github.com/jinzhu/gorm"
2021-06-30 02:12:05 +00:00
"math/rand"
"qiniupkg.com/x/log.v7"
"time"
)
const (
OrderCardStatusUnPick = 1 // 待取货中
OrderCardStatusPlaying = 2 // 游玩中
OrderCardStatusReturning = 3 // 归还中
OrderCardStatusCompleted = 4 // 已完成
2021-11-01 03:32:23 +00:00
OrderCardStatusCancel = 5 // 已取消
OrderCardStatusRefund = 6 // 已退款
2021-06-30 02:12:05 +00:00
DeliveryTypeStorePick = 1 // 门店取货
DeliveryTypeExpress = 2 // 快递取货
ExpressFeeProvince = 10 * 100 // 省内
ExpressFeeOutsideProvince = 15 * 100 // 省外
PayStatusUnPay = 1 // 未支付
PayStatusPaid = 2 // 已支付
)
//go:generate goqueryset -in order.go
// gen:qs
type Order struct {
Model
Uid uint64 ` json:"uid" gorm:"index" `
GameCardId uint64 ` json:"game_card_id" gorm:"index" ` // 游戏id
GameCardGoodsId uint64 ` json:"game_card_goods_id" gorm:"index" ` // 游戏卡id
StoreId uint64 ` json:"store_id" ` // 门店id
UserAddressId uint64 ` json:"user_address_id" ` // 地址id
DeliveryType uint8 ` json:"delivery_type" ` // 取货类型 1-门店自取 2-快递
Count uint32 ` json:"count" ` // 数量
PickupCode string ` json:"pickup_code" ` // 取货码
2021-11-01 03:32:23 +00:00
CardStatus uint8 ` json:"card_status" ` // 1-待取货中 2-游玩中 3-归还中 4-已完成 5-已取消
2021-06-30 02:12:05 +00:00
DeliveryTime time . Time ` json:"delivery_time" ` // 发货时间
ReceiptTime time . Time ` json:"receipt_time" ` // 收货时间
PayTime time . Time ` json:"pay_time" ` // 支付时间
PayStatus uint8 ` json:"pay_status" ` // 支付状态 1-未支付 2-已支付
OrderSn string ` json:"order_sn" gorm:"type:varchar(255);not null;COMMENT:'订单编号'" ` // 订单编号
PayPrice uint32 ` json:"pay_price" ` // 实际付款金额(包含运费)
Postage uint32 ` json:"postage" ` // 邮费
ExpressCompany string ` json:"express_company" ` // 物流公司
ExpressCompanyNo string ` json:"express_company_no" ` // 物流公司编号
ExpressNo string ` json:"express_no" ` // 物流单号
ExpressDuration uint64 ` json:"express_duration" ` // 物流时长
RevertStoreId uint64 ` json:"revert_store_id" ` // 归还门店id
RevertTime time . Time ` json:"revert_time" ` // 归还时间
RevertExpressCompany string ` json:"revert_express_company" ` // 归还物流公司
RevertExpressCompanyNo string ` json:"revert_express_company_no" ` // 归还物流公司编号
RevertExpressNo string ` json:"revert_express_no" ` // 归还物流单号
RevertExpressDuration uint64 ` json:"revert_express_duration" ` // 归还物流时长
2021-11-01 03:32:23 +00:00
OutTradeNo string ` json:"out_trade_no" ` // 支付订单
Mchid string ` json:"mchid" ` // 商户
2021-06-30 02:12:05 +00:00
}
2022-01-16 08:56:20 +00:00
type OrderCard struct {
Model
OrderId uint32 ` json:"order_id" gorm:"index" `
Uid uint32 ` json:"uid" gorm:"index" `
GameCardId uint32 ` json:"game_card_id" gorm:"index" ` // 游戏id
GameCardGoodsId uint32 ` json:"game_card_goods_id" gorm:"index" ` // 游戏卡id
StoreId uint32 ` json:"store_id" gorm:"index" ` // 门店id
2022-01-16 10:47:48 +00:00
Status uint8 ` json:"status" gorm:"index" ` // 1-待领取 2-游玩中 3-已归还 4-未领取
2022-01-16 08:56:20 +00:00
}
2021-06-30 02:12:05 +00:00
func ( * Order ) TableName ( ) string {
return "order"
}
func ( m * Order ) ToInfo ( card * GameCard ) OrderInfo {
return OrderInfo {
Order : * m ,
GameName : card . Name ,
GamePrice : card . Price ,
GameCoverImg : card . CoverImg ,
}
}
type OrderInfo struct {
Order
GameName string ` json:"name" gorm:"index" ` // 名称
GamePrice uint32 ` json:"price" gorm:"index" ` // 价格
GameCoverImg string ` json:"cover_img" ` // 封面
}
func GetOrderList ( uid uint64 , page , pageSize int ) ( [ ] OrderInfo , uint32 , error ) {
var (
orders [ ] Order
totalPage uint32
orderInfos = make ( [ ] OrderInfo , 0 , pageSize )
)
page -= 1
if page < 0 {
page = 0
}
2021-11-01 03:32:23 +00:00
//oq := NewOrderQuerySet(DB).UidEq(uid).OrderDescByCreatedAt().PayStatusEq(PayStatusPaid)
oq := NewOrderQuerySet ( DB ) . UidEq ( uid ) . OrderDescByCreatedAt ( )
2021-06-30 02:12:05 +00:00
count , err := oq . Count ( )
if err != nil {
log . Error ( "NewGameCardQuerySet err:" , err )
return orderInfos , 0 , err
}
err = oq . Offset ( page * pageSize ) . Limit ( pageSize ) . All ( & orders )
if err != nil && err != RecordNotFound {
log . Error ( "err:" , err )
return orderInfos , 0 , err
}
totalPage = uint32 ( count / pageSize + 1 )
var games [ ] GameCard
gameIds := make ( [ ] uint32 , 0 , len ( orders ) )
for i , _ := range orders {
gameIds = append ( gameIds , uint32 ( orders [ i ] . GameCardId ) )
}
if len ( gameIds ) == 0 {
log . Error ( "gameIds is null" )
return orderInfos , 0 , err
}
err = NewGameCardQuerySet ( DB ) . IDIn ( gameIds ... ) . All ( & games )
if err != nil && err != RecordNotFound {
log . Error ( "err:" , err )
return orderInfos , 0 , err
}
gamesMap := make ( map [ uint32 ] * GameCard )
for i , _ := range games {
gamesMap [ games [ i ] . ID ] = & games [ i ]
}
for i , _ := range orders {
card , ok := gamesMap [ uint32 ( orders [ i ] . GameCardId ) ]
if ! ok {
continue
}
orderInfos = append ( orderInfos , orders [ i ] . ToInfo ( card ) )
}
return orderInfos , totalPage , nil
}
func ( m * Order ) Info ( ) ( * OrderInfo , error ) {
var (
order Order
card GameCard
)
err := NewOrderQuerySet ( DB ) . IDEq ( m . ID ) . One ( & order )
if err != nil {
log . Error ( "err:" , err )
return nil , err
}
err = NewGameCardQuerySet ( DB ) . IDEq ( uint32 ( order . GameCardId ) ) . One ( & card )
if err != nil && err != RecordNotFound {
log . Error ( "err:" , err )
return nil , err
}
info := order . ToInfo ( & card )
return & info , nil
}
func ( m * Order ) Revert ( ) ( * OrderInfo , error ) {
var (
order Order
card GameCard
)
2021-11-01 03:32:23 +00:00
qs := NewOrderQuerySet ( DB ) . IDEq ( m . ID )
err := qs . One ( & order )
if err != nil {
logger . Errorf ( "err:%#v" , err )
return nil , err
}
if order . CardStatus == OrderCardStatusCompleted {
logger . Error ( "order card status completed" )
return nil , errors . New ( "order card status completed" )
}
err = qs . GetUpdater ( ) .
2021-06-30 02:12:05 +00:00
SetCardStatus ( OrderCardStatusReturning ) .
SetRevertTime ( time . Now ( ) ) .
SetRevertStoreId ( m . RevertStoreId ) .
SetRevertExpressCompany ( m . RevertExpressCompany ) .
SetRevertExpressCompanyNo ( m . RevertExpressCompanyNo ) .
SetRevertExpressNo ( m . RevertExpressNo ) . Update ( )
if err != nil {
log . Error ( "err:" , err )
return nil , err
}
2021-11-01 03:32:23 +00:00
order . CardStatus = OrderCardStatusReturning
order . RevertTime = time . Now ( )
order . RevertStoreId = m . RevertStoreId
order . RevertExpressCompany = m . RevertExpressCompany
order . RevertExpressCompanyNo = m . RevertExpressCompanyNo
order . RevertExpressNo = m . RevertExpressNo
2021-06-30 02:12:05 +00:00
//err = NewGameCardQuerySet(DB).IDEq(uint32(order.GameCardId)).One(&card)
//if err != nil && err != RecordNotFound {
// log.Error("err:", err)
// return nil, err
//}
info := order . ToInfo ( & card )
return & info , nil
}
2021-11-01 03:32:23 +00:00
func ( m * Order ) RevertCancel ( ) ( * OrderInfo , error ) {
var (
order Order
card GameCard
)
qs := NewOrderQuerySet ( DB ) . IDEq ( m . ID )
err := qs . One ( & order )
if err != nil {
logger . Errorf ( "err:%#v" , err )
return nil , err
}
if order . CardStatus != OrderCardStatusReturning {
logger . Error ( "order card status completed" )
return nil , errors . New ( "order card status completed" )
}
err = qs . GetUpdater ( ) .
SetCardStatus ( OrderCardStatusPlaying ) .
SetRevertStoreId ( 0 ) .
SetRevertExpressCompany ( "" ) .
SetRevertExpressCompanyNo ( "" ) .
SetRevertExpressNo ( "" ) . Update ( )
if err != nil {
log . Error ( "err:" , err )
return nil , err
}
order . CardStatus = OrderCardStatusPlaying
//order.RevertTime = time.Now()
order . RevertStoreId = m . RevertStoreId
order . RevertExpressCompany = m . RevertExpressCompany
order . RevertExpressCompanyNo = m . RevertExpressCompanyNo
order . RevertExpressNo = m . RevertExpressNo
info := order . ToInfo ( & card )
return & info , nil
}
2021-06-30 02:12:05 +00:00
func ( m * Order ) OrderCreate ( ) error {
err := m . Create ( DB )
if err != nil {
log . Error ( "err:" , err )
return err
}
return nil
}
func ( m * Order ) Modify ( ) ( * OrderInfo , error ) {
if m . ID == 0 {
return nil , errors . New ( "orderId is null" )
}
fields := make ( [ ] OrderDBSchemaField , 0 )
if m . CardStatus != 0 {
fields = append ( fields , OrderDBSchema . CardStatus )
}
if len ( fields ) > 0 {
err := m . Update ( DB . Where ( & Order { Model : Model { ID : m . ID } , Uid : m . Uid } ) , fields ... )
if err != nil {
logger . Error ( "err:" , err )
return nil , err
}
}
var card GameCard
err := NewGameCardQuerySet ( DB ) . IDEq ( uint32 ( m . GameCardId ) ) . One ( & card )
if err != nil && err != RecordNotFound {
log . Error ( "err:" , err )
return nil , err
}
info := m . ToInfo ( & card )
return & info , nil
}
func IsHaveUnreturnedOrders ( uid uint32 ) ( bool , error ) {
2021-11-01 03:32:23 +00:00
fmt . Println ( "uid" , uid )
sql := fmt . Sprintf ( "SELECT COUNT(*) AS count FROM `order` WHERE uid = %d AND pay_status=2 AND card_status IN (1,2,3) ;" , uid )
//count, err := NewOrderQuerySet(DB).UidEq(uint64(uid)).PayStatusEq(PayStatusPaid).CardStatusIn(1, 2, 3).Count()
//if err != nil {
// logger.Error("err:", err)
// return false, err
//}
unreturned := & struct {
Count int ` json:"count" `
} { }
DB . Raw ( sql ) . Scan ( unreturned )
fmt . Println ( "订单数量count:" , unreturned . Count )
return unreturned . Count != 0 , nil
2021-06-30 02:12:05 +00:00
}
2021-12-25 08:38:30 +00:00
func IsUserHaveUnreturnedOrder ( uid uint32 ) ( bool , error ) {
fmt . Println ( "uid" , uid )
sql := fmt . Sprintf ( "SELECT COUNT(*) AS count FROM `order` WHERE uid = %d AND pay_status IN (1,2) AND card_status IN (1,2,3) ;" , uid )
//count, err := NewOrderQuerySet(DB).UidEq(uint64(uid)).PayStatusEq(PayStatusPaid).CardStatusIn(1, 2, 3).Count()
//if err != nil {
// logger.Error("err:", err)
// return false, err
//}
unreturned := & struct {
Count int ` json:"count" `
} { }
DB . Raw ( sql ) . Scan ( unreturned )
fmt . Println ( "订单数量count:" , unreturned . Count )
return unreturned . Count != 0 , nil
}
2021-06-30 02:12:05 +00:00
// gen:qs
type ExpressCompany struct {
Model
CompanyName string ` json:"company_name" `
CompanyCode string ` json:"company_code" `
}
func ( * ExpressCompany ) TableName ( ) string {
return "express_company"
}
func ( * ExpressCompany ) List ( ) ( [ ] ExpressCompany , error ) {
companys := make ( [ ] ExpressCompany , 0 )
err := NewExpressCompanyQuerySet ( DB ) . OrderAscByID ( ) . All ( & companys )
if err != nil && err != RecordNotFound {
logger . Error ( "err:" , err )
return companys , err
}
return companys , nil
}
func GetPickupCode ( ) string {
for {
rand . Seed ( time . Now ( ) . UnixNano ( ) )
code := fmt . Sprintf ( "%d" , rand . Intn ( 1000000 ) + 100000 )
count , err := NewOrderQuerySet ( DB ) . PickupCodeEq ( code ) . Count ( )
if err != nil {
logger . Error ( "err:" , err )
}
if count == 0 {
return code
}
}
//将时间戳设置成种子数
}
2021-11-01 03:32:23 +00:00
func ( m * Order ) Cancel ( ) error {
var userOrder Order
err := NewOrderQuerySet ( DB ) . IDEq ( m . ID ) . One ( & userOrder )
if err != nil {
log . Error ( "err:" , err )
return err
}
if userOrder . CardStatus != OrderCardStatusUnPick {
log . Error ( "card status not unpick err: " )
return errors . New ( "card status not unpick" )
}
if userOrder . PayStatus == PayStatusUnPay && userOrder . CreatedAt . Add ( 30 * time . Minute ) . Before ( time . Now ( ) ) {
2021-12-25 08:38:30 +00:00
//if userOrder.PayStatus == PayStatusUnPay && userOrder.CreatedAt.Add(3*time.Minute).Before(time.Now()) {
2021-11-01 03:32:23 +00:00
log . Error ( "card status expire err: " )
return errors . New ( "card status expire" )
}
//fmt.Println("PayStatus",userOrder.PayStatus)
//fmt.Println("DeliveryType",userOrder.DeliveryType)
//fmt.Println("CreatedAt",userOrder.CreatedAt.Add(4*time.Minute))
//fmt.Println("Now",time.Now())
if userOrder . PayStatus == PayStatusPaid && userOrder . DeliveryType == DeliveryTypeStorePick && userOrder . CreatedAt . Add ( 24 * time . Hour ) . Before ( time . Now ( ) ) {
2021-12-25 08:38:30 +00:00
//if userOrder.PayStatus == PayStatusPaid && userOrder.DeliveryType == DeliveryTypeStorePick && userOrder.CreatedAt.Add(4*time.Minute).Before(time.Now()) {
2021-11-01 03:32:23 +00:00
log . Error ( "card status expire err: " )
return errors . New ( "card status expire" )
}
begin := DB . Begin ( )
err = NewOrderQuerySet ( begin ) . IDEq ( m . ID ) . GetUpdater ( ) . SetCardStatus ( OrderCardStatusCancel ) . Update ( )
if err != nil {
begin . Rollback ( )
log . Error ( "err:" , err )
return err
}
sql := fmt . Sprintf ( "UPDATE game_card_goods_stock SET rent_stock= rent_stock+1 WHERE store_id=%d AND game_card_id=%d;" , userOrder . StoreId , userOrder . GameCardId )
fmt . Println ( "sql:" , sql )
err = begin . Exec ( sql ) . Error
if err != nil {
begin . Rollback ( )
logger . Errorf ( "err:%#v" , err )
return err
}
err = begin . Commit ( ) . Error
if err != nil {
begin . Rollback ( )
logger . Errorf ( "err:%#v" , err )
return err
}
2021-12-25 08:38:30 +00:00
* m = userOrder
2021-11-01 03:32:23 +00:00
return nil
}
func UnPayOrderSetCancel ( uid uint32 ) {
fmt . Println ( "uid:" , uid )
var order Order
err := NewOrderQuerySet ( DB . Debug ( ) ) . UidEq ( uint64 ( uid ) ) . PayStatusEq ( PayStatusUnPay ) . CardStatusEq ( OrderCardStatusUnPick ) . One ( & order )
if err != nil {
log . Error ( "err:" , err )
return
}
fmt . Println ( "Order:" , order )
begin := DB . Begin ( )
_ , err = NewOrderQuerySet ( begin ) . IDEq ( order . ID ) . GetUpdater ( ) .
SetCardStatus ( OrderCardStatusCancel ) . UpdateNum ( )
if err != nil {
begin . Rollback ( )
log . Error ( "err:" , err )
return
}
sql := fmt . Sprintf ( "UPDATE game_card_goods_stock SET rent_stock= rent_stock+1 WHERE store_id=%d AND game_card_id=%d;" , order . StoreId , order . GameCardId )
fmt . Println ( "sql:" , sql )
err = begin . Exec ( sql ) . Error
if err != nil {
begin . Rollback ( )
log . Error ( "err:" , err )
return
}
err = begin . Commit ( ) . Error
if err != nil {
begin . Rollback ( )
log . Error ( "err:" , err )
}
}
2022-01-16 10:47:48 +00:00
func ( m * Order ) CreateByCardInfoList ( cardInfos [ ] CardInfo , gdb * gorm . DB ) error {
err := gdb . Create ( m ) . Error
if err != nil {
log . Error ( "err:" , err )
return err
}
if m . ID == 0 {
return errors . New ( "order id is 0" )
}
for _ , v := range cardInfos {
for i := 0 ; i < int ( v . Count ) ; i ++ {
//OrderCard{
// OrderId: m.ID,
// Uid: uint32(m.Uid),
// GameCardId: v.GameCardId,
// GameCardGoodsId: 0,
// StoreId: uint32(m.StoreId),
// Status: 0,
//}
}
}
return nil
}