2021-06-30 02:12:05 +00:00
package model
import (
2022-01-26 08:02:21 +00:00
"encoding/json"
2021-06-30 02:12:05 +00:00
"errors"
"fmt"
"github.com/codinl/go-logger"
2022-01-16 10:47:48 +00:00
"github.com/jinzhu/gorm"
2022-05-10 07:17:34 +00:00
"golang.org/x/sync/errgroup"
2021-06-30 02:12:05 +00:00
"math/rand"
2022-05-12 05:42:45 +00:00
"mh-server/kuaidi"
2021-06-30 02:12:05 +00:00
"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 // 已支付
)
// gen:qs
2023-08-25 01:53:23 +00:00
//
//go:generate goqueryset -in order.go
2021-06-30 02:12:05 +00:00
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
2022-02-26 06:29:39 +00:00
GameCardSerialNumber string ` json:"game_card_serial_number" gorm:"index" ` // 游戏卡编号
StoreId uint64 ` json:"store_id" gorm:"index" ` // 门店id
2021-06-30 02:12:05 +00:00
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" ` // 发货时间
2022-04-18 05:50:31 +00:00
ReceiptTime time . Time ` json:"receipt_time" ` // 收货时间 签收时间
2021-06-30 02:12:05 +00:00
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" ` // 邮费
2022-09-29 07:49:16 +00:00
PostageType uint32 ` json:"postage_type" ` // 邮费类型:1-法币 2-包邮券
2021-06-30 02:12:05 +00:00
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" ` // 商户
2022-05-10 07:17:34 +00:00
CooperativeBusinessId uint32 ` json:"cooperative_business_id" gorm:"index" ` // 合作商id
CooperativeName string ` json:"cooperative_name" ` // 合作商名称
OrderCardId uint32 ` json:"order_card_id" gorm:"-" ` //
2022-01-29 02:21:38 +00:00
2022-05-10 07:17:34 +00:00
OrderCards [ ] OrderCard ` json:"order_cards" gorm:"-" `
Store * Store ` json:"store" gorm:"-" `
UserAddress * UserAddress ` json:"user_address" gorm:"-" `
2021-06-30 02:12:05 +00:00
}
2022-01-26 08:02:21 +00:00
// gen:qs
2022-01-16 08:56:20 +00:00
type OrderCard struct {
Model
2022-01-26 08:02:21 +00:00
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-27 14:24:29 +00:00
CardStatus uint32 ` json:"card_status" ` // 1-待取货中 2-游玩中 3-归还中 4-已完成 5-已取消
2022-01-26 08:02:21 +00:00
DeliveryTime time . Time ` json:"delivery_time" ` // 发货时间
ReceiptTime time . Time ` json:"receipt_time" ` // 收货时间
DeliveryType uint8 ` json:"delivery_type" ` // 取货类型 1-门店自取 2-快递
SerialNumber string ` json:"serial_number" gorm:"index" ` // 编号
PayStatus uint8 ` json:"pay_status" ` // 支付状态 1-未支付 2-已支付
2022-05-10 07:17:34 +00:00
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" ` // 归还物流时长
IssueType uint32 ` json:"issue_type" ` // 问题类型: 1-问题反馈 2-正常
CooperativeBusinessId uint32 ` json:"cooperative_business_id" gorm:"index" ` // 合作商id
CooperativeName string ` json:"cooperative_name" ` // 合作商名称
Postage uint32 ` json:"postage" gorm:"-" ` // 邮费
2022-09-29 07:49:16 +00:00
PostageType uint32 ` json:"postage_type" ` // 邮费类型
2022-05-10 07:17:34 +00:00
ExpressCompany string ` json:"express_company" gorm:"-" ` // 物流公司
ExpressCompanyNo string ` json:"express_company_no" gorm:"-" ` // 物流公司编号
ExpressNo string ` json:"express_no" gorm:"-" ` // 物流单号
GameName string ` json:"name" gorm:"-" ` // 名称
GamePrice uint32 ` json:"price" gorm:"-" ` // 价格
GameCoverImg string ` json:"cover_img" gorm:"-" ` // 封面
IssueFeedbackStoreId uint32 ` json:"issue_feedback_store_id" gorm:"-" ` // 问题反馈门店
Order * Order ` json:"order" gorm:"-" ` // 订单
GameCard * GameCard ` json:"game_card" gorm:"-" ` // 游戏
Store * Store ` json:"store" gorm:"-" ` // 游戏
2022-05-12 05:42:45 +00:00
RevertStore * Store ` json:"revert_store" gorm:"-" ` // 游戏
2022-01-26 08:02:21 +00:00
//Status uint8 `json:"status" gorm:"index"` // 1-待领取 2-游玩中 3-已归还 4-未领取
//PickupCode string `json:"pickup_code"` // 取货码
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 {
2022-01-26 08:02:21 +00:00
Order : * m ,
2021-06-30 02:12:05 +00:00
}
}
type OrderInfo struct {
Order
2022-01-26 08:02:21 +00:00
Cards [ ] OrderCard
2021-06-30 02:12:05 +00:00
}
2022-01-26 08:02:21 +00:00
func OrderCardListSetGameInfo ( list [ ] OrderCard ) [ ] OrderCard {
ids := make ( [ ] uint32 , 0 , len ( list ) )
orderIds := make ( [ ] uint32 , 0 , len ( list ) )
for i , _ := range list {
ids = append ( ids , list [ i ] . GameCardId )
orderIds = append ( orderIds , list [ i ] . OrderId )
}
if len ( ids ) == 0 || len ( orderIds ) == 0 {
return list
2021-06-30 02:12:05 +00:00
}
2022-01-26 08:02:21 +00:00
orderMap , err := OrderMap ( orderIds )
2021-06-30 02:12:05 +00:00
if err != nil {
2022-01-26 08:02:21 +00:00
logger . Error ( "err:" , err )
return list
2021-06-30 02:12:05 +00:00
}
2022-01-26 08:02:21 +00:00
cardMap , err := GameCardMap ( ids )
if err != nil {
logger . Error ( "err:" , err )
return list
}
2022-04-21 06:59:12 +00:00
2022-01-26 08:02:21 +00:00
for i , _ := range list {
gameCard , ok1 := cardMap [ list [ i ] . GameCardId ]
order , ok2 := orderMap [ list [ i ] . OrderId ]
if ok1 && ok2 {
2022-03-26 03:25:15 +00:00
if order . CardStatus == 2 || order . CardStatus == 3 {
2022-02-26 06:29:39 +00:00
order . CardStatus = 4
}
2022-01-26 08:02:21 +00:00
list [ i ] . GameName = gameCard . Name
list [ i ] . GameCoverImg = gameCard . CoverImg
list [ i ] . GamePrice = gameCard . Price
list [ i ] . Order = & order
}
2021-06-30 02:12:05 +00:00
}
2022-05-10 07:17:34 +00:00
2022-01-26 08:02:21 +00:00
return list
}
2021-06-30 02:12:05 +00:00
2022-01-26 08:02:21 +00:00
func GameCardMap ( ids [ ] uint32 ) ( map [ uint32 ] GameCard , error ) {
cardMap := make ( map [ uint32 ] GameCard , 0 )
2022-05-13 09:35:10 +00:00
if len ( ids ) == 0 {
return cardMap , nil
}
2022-01-26 08:02:21 +00:00
var cards [ ] GameCard
err := NewGameCardQuerySet ( DB ) . IDIn ( ids ... ) . All ( & cards )
if err != nil {
logger . Error ( "err:" , err )
return cardMap , err
2021-06-30 02:12:05 +00:00
}
2022-01-26 08:02:21 +00:00
if len ( cards ) == 0 {
return cardMap , nil
2021-06-30 02:12:05 +00:00
}
2022-01-26 08:02:21 +00:00
for i , _ := range cards {
cardMap [ cards [ i ] . ID ] = cards [ i ]
2021-06-30 02:12:05 +00:00
}
2022-01-26 08:02:21 +00:00
return cardMap , nil
}
2021-06-30 02:12:05 +00:00
2022-01-26 08:02:21 +00:00
func OrderMap ( ids [ ] uint32 ) ( map [ uint32 ] Order , error ) {
cardMap := make ( map [ uint32 ] Order , 0 )
2022-05-13 09:35:10 +00:00
if len ( ids ) == 0 {
return cardMap , nil
}
2022-01-26 08:02:21 +00:00
var cards [ ] Order
err := NewOrderQuerySet ( DB ) . IDIn ( ids ... ) . All ( & cards )
if err != nil {
logger . Error ( "err:" , err )
return cardMap , err
2021-06-30 02:12:05 +00:00
}
2022-01-26 08:02:21 +00:00
if len ( cards ) == 0 {
return cardMap , nil
2021-06-30 02:12:05 +00:00
}
2022-01-26 08:02:21 +00:00
for i , _ := range cards {
cardMap [ cards [ i ] . ID ] = cards [ i ]
}
return cardMap , nil
}
2021-06-30 02:12:05 +00:00
2022-01-26 08:02:21 +00:00
type OrderListReq struct {
Page int ` json:"page" `
PageSize int ` json:"page_size" `
OrderType uint32 ` json:"order_type" ` // 1-全部 2-进行中 3-已完成
Uid uint32 ` json:"uid" `
2021-06-30 02:12:05 +00:00
}
2022-01-26 08:02:21 +00:00
func ( m * OrderListReq ) GetOrderCardList ( ) ( [ ] OrderCard , uint32 , error ) {
2021-06-30 02:12:05 +00:00
var (
2022-01-26 08:02:21 +00:00
orderCards [ ] OrderCard
totalPage uint32
//orderInfos = make([]OrderInfo, 0, pageSize)
2021-06-30 02:12:05 +00:00
)
2022-01-26 08:02:21 +00:00
m . Page -= 1
if m . Page < 0 {
m . Page = 0
}
if m . PageSize == 0 {
m . PageSize = 10
}
oq := NewOrderCardQuerySet ( DB ) . PayStatusEq ( PayStatusPaid ) . UidEq ( m . Uid )
if m . OrderType == 2 {
oq = oq . CardStatusIn ( [ ] uint32 { 1 , 2 , 3 } ... )
}
if m . OrderType == 3 {
oq = oq . CardStatusEq ( 4 )
}
count , err := oq . Count ( )
2021-06-30 02:12:05 +00:00
if err != nil {
2022-01-26 08:02:21 +00:00
logger . Error ( "NewGameCardQuerySet err:" , err )
return orderCards , 0 , err
2021-06-30 02:12:05 +00:00
}
2022-01-26 08:02:21 +00:00
err = oq . OrderDescByCreatedAt ( ) . Offset ( m . Page * m . PageSize ) . Limit ( m . PageSize ) . All ( & orderCards )
2021-06-30 02:12:05 +00:00
if err != nil && err != RecordNotFound {
2022-01-26 08:02:21 +00:00
logger . Error ( "err:" , err )
return orderCards , 0 , err
}
totalPage = uint32 ( count / m . PageSize + 1 )
2022-02-26 06:29:39 +00:00
fmt . Println ( "orderCards:" , orderCards )
2022-01-26 08:02:21 +00:00
orderCards = OrderCardListSetGameInfo ( orderCards )
return orderCards , totalPage , nil
}
2022-01-27 14:24:29 +00:00
func ( m * Order ) Info ( orderCardId uint32 ) ( [ ] OrderCard , error ) {
2022-01-26 08:02:21 +00:00
//err := NewOrderQuerySet(DB).IDEq(m.ID).One(&order)
//if err != nil {
// logger.Error("err:", err)
// return nil, err
//}
//
//err = NewGameCardQuerySet(DB).IDEq(uint32(order.GameCardId)).One(&card)
//if err != nil && err != RecordNotFound {
// logger.Error("err:", err)
// return nil, err
//}
2022-01-27 14:24:29 +00:00
qs := NewOrderCardQuerySet ( DB ) . IDEq ( orderCardId )
//qs := NewOrderCardQuerySet(DB).OrderIdEq(m.ID).GameCardIdEq(uint32(m.GameCardId))
//if m.GameCardGoodsId != 0 {
// qs = qs.GameCardGoodsIdEq(uint32(m.GameCardGoodsId))
//}
2022-01-26 08:02:21 +00:00
var orderCards [ ] OrderCard
err := qs . All ( & orderCards )
if err != nil {
logger . Error ( "err:" , err )
2021-06-30 02:12:05 +00:00
return nil , err
}
2022-01-26 08:02:21 +00:00
orderCards = OrderCardListSetGameInfo ( orderCards )
2021-06-30 02:12:05 +00:00
2022-01-26 08:02:21 +00:00
//info := order.ToInfo(&card)
return orderCards , nil
2021-06-30 02:12:05 +00:00
}
2022-01-26 08:02:21 +00:00
func ( m * Order ) Revert ( ) error {
2021-06-30 02:12:05 +00:00
var (
2022-01-26 08:02:21 +00:00
orderCard OrderCard
//card GameCard
2021-06-30 02:12:05 +00:00
)
2021-11-01 03:32:23 +00:00
2022-01-26 08:02:21 +00:00
//qs := NewOrderQuerySet(DB).IDEq(m.ID)
//err := qs.One(&order)
//if err != nil {
2022-05-10 07:17:34 +00:00
// logger.Error("err:%#v", err)
2022-01-26 08:02:21 +00:00
// return err
//}
//if order.CardStatus == OrderCardStatusCompleted {
// logger.Error("order card status completed")
// return errors.New("order card status completed")
//}
2022-04-21 06:59:12 +00:00
//fmt.Println("GameCardGoodsId------:", m.GameCardGoodsId)
//fmt.Println("ID------:", m.ID)
//fmt.Println("OrderCardId------:", m.OrderCardId)
2022-01-29 02:21:38 +00:00
err := NewOrderCardQuerySet ( DB ) . IDEq ( m . OrderCardId ) . One ( & orderCard )
//err := NewOrderCardQuerySet(DB).OrderIdEq(m.ID).GameCardGoodsIdEq(uint32(m.GameCardGoodsId)).One(&orderCard)
2021-11-01 03:32:23 +00:00
if err != nil {
logger . Errorf ( "err:%#v" , err )
2022-01-26 08:02:21 +00:00
return err
2021-11-01 03:32:23 +00:00
}
2022-01-26 08:02:21 +00:00
if orderCard . CardStatus == OrderCardStatusCompleted {
2021-11-01 03:32:23 +00:00
logger . Error ( "order card status completed" )
2022-01-26 08:02:21 +00:00
return errors . New ( "order card status completed" )
2021-11-01 03:32:23 +00:00
}
2022-01-26 08:02:21 +00:00
//err = qs.GetUpdater().
// SetCardStatus(OrderCardStatusReturning).
// SetRevertTime(time.Now()).
// SetRevertStoreId(m.RevertStoreId).
// SetRevertExpressCompany(m.RevertExpressCompany).
// SetRevertExpressCompanyNo(m.RevertExpressCompanyNo).
// SetRevertExpressNo(m.RevertExpressNo).Update()
//if err != nil {
// logger.Error("err:", err)
// return nil, err
//}
//order.CardStatus = OrderCardStatusReturning
////order.RevertTime = time.Now()
//order.RevertStoreId = m.RevertStoreId
//order.RevertExpressCompany = m.RevertExpressCompany
//order.RevertExpressCompanyNo = m.RevertExpressCompanyNo
//order.RevertExpressNo = m.RevertExpressNo
2022-01-29 02:21:38 +00:00
_ , err = NewOrderCardQuerySet ( DB ) . IDEq ( m . OrderCardId ) . GetUpdater ( ) .
//_, err = NewOrderCardQuerySet(DB).OrderIdEq(m.ID).GameCardGoodsIdEq(uint32(m.GameCardGoodsId)).GetUpdater().
2021-06-30 02:12:05 +00:00
SetCardStatus ( OrderCardStatusReturning ) .
SetRevertTime ( time . Now ( ) ) .
SetRevertStoreId ( m . RevertStoreId ) .
SetRevertExpressCompany ( m . RevertExpressCompany ) .
SetRevertExpressCompanyNo ( m . RevertExpressCompanyNo ) .
2022-01-26 08:02:21 +00:00
SetRevertExpressNo ( m . RevertExpressNo ) . UpdateNum ( )
2021-06-30 02:12:05 +00:00
if err != nil {
2022-01-26 08:02:21 +00:00
logger . Error ( "err:" , err )
return err
2021-06-30 02:12:05 +00:00
}
//err = NewGameCardQuerySet(DB).IDEq(uint32(order.GameCardId)).One(&card)
//if err != nil && err != RecordNotFound {
2022-01-26 08:02:21 +00:00
// logger.Error("err:", err)
2021-06-30 02:12:05 +00:00
// return nil, err
//}
2022-01-26 08:02:21 +00:00
//info := order.ToInfo(&card)
return nil
2021-06-30 02:12:05 +00:00
}
2022-01-26 08:02:21 +00:00
func ( m * Order ) RevertCancel ( ) ( bool , error ) {
2021-11-01 03:32:23 +00:00
var (
2022-01-26 08:02:21 +00:00
orderCard OrderCard
//card GameCard
2021-11-01 03:32:23 +00:00
)
2022-01-26 08:02:21 +00:00
//qs := NewOrderQuerySet(DB).IDEq(m.ID)
//err := qs.One(&order)
//if err != nil {
2022-05-10 07:17:34 +00:00
// logger.Error("err:%#v", err)
2022-01-26 08:02:21 +00:00
// return false, err
//}
//if order.CardStatus != OrderCardStatusReturning {
// logger.Error("order card status completed")
// return false, errors.New("order card status completed")
//}
2022-01-29 02:21:38 +00:00
err := NewOrderCardQuerySet ( DB ) . IDEq ( m . OrderCardId ) . One ( & orderCard )
//err := NewOrderCardQuerySet(DB).OrderIdEq(m.ID).GameCardGoodsIdEq(uint32(m.GameCardGoodsId)).One(&orderCard)
2021-11-01 03:32:23 +00:00
if err != nil {
logger . Errorf ( "err:%#v" , err )
2022-01-26 08:02:21 +00:00
return false , err
2021-11-01 03:32:23 +00:00
}
2022-01-26 08:02:21 +00:00
if orderCard . CardStatus != OrderCardStatusReturning {
logger . Error ( "order card status returning" )
return false , errors . New ( "order card status returning" )
2021-11-01 03:32:23 +00:00
}
2022-01-26 08:02:21 +00:00
//err = qs.GetUpdater().
// SetCardStatus(OrderCardStatusPlaying).
// SetRevertStoreId(0).
// SetRevertExpressCompany("").
// SetRevertExpressCompanyNo("").
// SetRevertExpressNo("").Update()
//if err != nil {
// logger.Error("err:", err)
// return nil, err
//}
//order.CardStatus = OrderCardStatusCancel
////order.RevertTime = time.Now()
//order.RevertStoreId = m.RevertStoreId
//order.RevertExpressCompany = m.RevertExpressCompany
//order.RevertExpressCompanyNo = m.RevertExpressCompanyNo
//order.RevertExpressNo = m.RevertExpressNo
2022-01-29 02:21:38 +00:00
_ , err = NewOrderCardQuerySet ( DB ) . IDEq ( m . OrderCardId ) . GetUpdater ( ) .
2022-02-26 06:29:39 +00:00
//_, err = NewOrderCardQuerySet(DB).OrderIdEq(m.ID).GameCardGoodsIdEq(uint32(m.GameCardGoodsId)).GetUpdater().
2021-11-01 03:32:23 +00:00
SetCardStatus ( OrderCardStatusPlaying ) .
2022-01-26 08:02:21 +00:00
//SetRevertTime(time.Time{}).
2021-11-01 03:32:23 +00:00
SetRevertStoreId ( 0 ) .
SetRevertExpressCompany ( "" ) .
SetRevertExpressCompanyNo ( "" ) .
2022-01-26 08:02:21 +00:00
SetRevertExpressNo ( "" ) . UpdateNum ( )
2021-11-01 03:32:23 +00:00
if err != nil {
2022-01-26 08:02:21 +00:00
logger . Error ( "err:" , err )
return false , err
}
isRecede := false
//if order.DeliveryType == 2 && order.Postage > 0 {
// isHaveOnDeliver, err := IsHaveOnDeliverOrderCards(m.ID)
// if err != nil {
// logger.Error("err:", err)
// return false, err
// }
// if !isHaveOnDeliver {
// isRecede = true
// }
//}
//info := order.ToInfo(&card)
return isRecede , nil
2021-11-01 03:32:23 +00:00
}
2022-01-26 08:02:21 +00:00
func ( m * Order ) OrderCreate ( gdb * gorm . DB ) error {
err := m . Create ( gdb )
2021-06-30 02:12:05 +00:00
if err != nil {
2022-01-26 08:02:21 +00:00
logger . Error ( "err:" , err )
2021-06-30 02:12:05 +00:00
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 {
2022-01-26 08:02:21 +00:00
logger . Error ( "err:" , err )
2021-06-30 02:12:05 +00:00
return nil , err
}
info := m . ToInfo ( & card )
return & info , nil
}
2022-01-26 08:02:21 +00:00
func ( m * UserRentCard ) IsHaveUnreturnedOrders ( RentCount uint32 ) ( bool , error ) {
fmt . Println ( "uid" , m . Uid )
2021-11-01 03:32:23 +00:00
2022-01-26 08:02:21 +00:00
sql := fmt . Sprintf ( "SELECT COUNT(order_card.id) FROM `order` RIGHT JOIN order_card ON `order`.id = order_card.order_id WHERE `order`.uid=%d AND `order`.pay_status=2 AND order_card.card_status IN (1,2,3) ;" , m . Uid )
//sql := fmt.Sprintf("SELECT COUNT(*) AS count FROM `order` WHERE uid = %d AND pay_status=2 AND card_status IN (1,2,3) ;", m.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)
2021-11-01 03:32:23 +00:00
//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" `
} { }
2022-01-26 08:02:21 +00:00
err := DB . Raw ( sql ) . Scan ( unreturned ) . Error
if err != nil {
logger . Error ( "err:" , err )
return false , err
}
2021-11-01 03:32:23 +00:00
fmt . Println ( "订单数量count:" , unreturned . Count )
2022-01-26 08:02:21 +00:00
return uint32 ( unreturned . Count ) + RentCount > m . LevelRentCount , nil
}
func IsHaveOnDeliverOrderCards ( orderId uint32 ) ( bool , error ) {
2022-01-27 14:24:29 +00:00
count , err := NewOrderCardQuerySet ( DB ) . OrderIdEq ( orderId ) . CardStatusEq ( OrderCardStatusUnPick ) . Count ( )
2022-01-26 08:02:21 +00:00
if err != nil {
logger . Error ( "err:" , err )
return false , err
}
return 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 )
2022-03-05 03:32:38 +00:00
//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)
2022-03-26 03:25:15 +00:00
sql := fmt . Sprintf ( "SELECT COUNT(*) AS count FROM order_card WHERE uid = %d AND pay_status IN (2) AND card_status IN (1,2,3) ;" , uid )
2021-12-25 08:38:30 +00:00
//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
}
}
//将时间戳设置成种子数
2022-04-04 11:03:22 +00:00
}
func GetShareCardRetrievePickupCode ( ) string {
for {
rand . Seed ( time . Now ( ) . UnixNano ( ) )
code := fmt . Sprintf ( "%d" , rand . Intn ( 1000000 ) + 100000 )
//count, err := NewOrderQuerySet(DB).PickupCodeEq(code).Count()
count , err := NewShareCardRetrieveQuerySet ( DB ) . PickupCodeEq ( code ) . Count ( )
if err != nil {
logger . Error ( "err:" , err )
}
if count == 0 {
return code
}
}
//将时间戳设置成种子数
2021-06-30 02:12:05 +00:00
}
2021-11-01 03:32:23 +00:00
2022-01-29 02:21:38 +00:00
func ( m * Order ) Cancel ( ) ( bool , Order , error ) {
2022-01-26 08:02:21 +00:00
var (
order Order
orderCard OrderCard
)
err := NewOrderQuerySet ( DB ) . IDEq ( m . ID ) . One ( & order )
2021-11-01 03:32:23 +00:00
if err != nil {
2022-01-26 08:02:21 +00:00
logger . Error ( "err:" , err )
2022-01-29 02:21:38 +00:00
return false , order , err
2021-11-01 03:32:23 +00:00
}
2022-01-27 14:24:29 +00:00
orderJson , _ := json . Marshal ( m )
fmt . Println ( "orderJson:" , string ( orderJson ) )
2022-01-26 08:02:21 +00:00
2022-01-29 02:21:38 +00:00
err = NewOrderCardQuerySet ( DB ) . IDEq ( m . OrderCardId ) . One ( & orderCard )
//err = NewOrderCardQuerySet(DB).OrderIdEq(m.ID).GameCardIdEq(uint32(m.GameCardId)).CardStatusEq(OrderCardStatusUnPick).Limit(1).One(&orderCard)
2022-01-26 08:02:21 +00:00
if err != nil && err != RecordNotFound {
logger . Errorf ( "err:%#v" , err )
2022-01-29 02:21:38 +00:00
return false , order , err
2021-11-01 03:32:23 +00:00
}
2022-01-26 08:02:21 +00:00
if err == RecordNotFound {
logger . Error ( "order card status not unpick" )
2022-01-29 02:21:38 +00:00
return false , order , errors . New ( "order card status not unpick" )
}
if orderCard . CardStatus != OrderCardStatusUnPick {
logger . Error ( "order card status not unpick" )
return false , order , errors . New ( "order card status not unpick" )
2021-11-01 03:32:23 +00:00
}
2022-01-26 08:02:21 +00:00
//if userOrder.CardStatus != OrderCardStatusUnPick {
// logger.Error("card status not unpick err: ")
// return false,errors.New("card status not unpick")
//}
//if userOrder.PayStatus == PayStatusUnPay && userOrder.CreatedAt.Add(30*time.Minute).Before(time.Now()) {
// //if userOrder.PayStatus == PayStatusUnPay && userOrder.CreatedAt.Add(3*time.Minute).Before(time.Now()) {
// logger.Error("card status expire err: ")
// return errors.New("card status expire")
//}
2021-11-01 03:32:23 +00:00
//fmt.Println("PayStatus",userOrder.PayStatus)
//fmt.Println("DeliveryType",userOrder.DeliveryType)
//fmt.Println("CreatedAt",userOrder.CreatedAt.Add(4*time.Minute))
//fmt.Println("Now",time.Now())
2022-01-26 08:02:21 +00:00
//if userOrder.PayStatus == PayStatusPaid && userOrder.DeliveryType == DeliveryTypeStorePick && userOrder.CreatedAt.Add(24*time.Hour).Before(time.Now()) {
// //if userOrder.PayStatus == PayStatusPaid && userOrder.DeliveryType == DeliveryTypeStorePick && userOrder.CreatedAt.Add(4*time.Minute).Before(time.Now()) {
// logger.Error("card status expire err: ")
// return errors.New("card status expire")
//}
2021-11-01 03:32:23 +00:00
begin := DB . Begin ( )
2022-01-26 08:02:21 +00:00
//err = NewOrderQuerySet(begin).IDEq(orderCard.OrderId).GetUpdater().SetCardStatus(OrderCardStatusCancel).Update()
//if err != nil {
// begin.Rollback()
// logger.Error("err:", err)
// return false,err
//}
_ , err = NewOrderCardQuerySet ( DB ) . IDEq ( orderCard . ID ) . GetUpdater ( ) . SetCardStatus ( OrderCardStatusCancel ) . UpdateNum ( )
2021-11-01 03:32:23 +00:00
if err != nil {
begin . Rollback ( )
2022-01-26 08:02:21 +00:00
logger . Error ( "err:" , err )
2022-01-29 02:21:38 +00:00
return false , order , err
2021-11-01 03:32:23 +00:00
}
2022-01-26 08:02:21 +00:00
sql := fmt . Sprintf ( "UPDATE game_card_goods_stock SET rent_stock= rent_stock+1 WHERE store_id=%d AND game_card_id=%d;" , orderCard . StoreId , orderCard . GameCardId )
2021-11-01 03:32:23 +00:00
fmt . Println ( "sql:" , sql )
err = begin . Exec ( sql ) . Error
if err != nil {
begin . Rollback ( )
logger . Errorf ( "err:%#v" , err )
2022-01-29 02:21:38 +00:00
return false , order , err
2021-11-01 03:32:23 +00:00
}
2022-01-27 14:24:29 +00:00
//UserRentCard{}
sqlRent := fmt . Sprintf ( "UPDATE user_rent_card SET have_rent_count = have_rent_count-1,can_rent_count=can_rent_count+1 WHERE uid =%d;" , order . Uid )
fmt . Println ( "sqlRent:" , sqlRent )
err = begin . Exec ( sqlRent ) . Error
if err != nil {
begin . Rollback ( )
logger . Errorf ( "err:%#v" , err )
2022-01-29 02:21:38 +00:00
return false , order , err
2022-01-27 14:24:29 +00:00
}
2021-11-01 03:32:23 +00:00
err = begin . Commit ( ) . Error
if err != nil {
begin . Rollback ( )
logger . Errorf ( "err:%#v" , err )
2022-01-29 02:21:38 +00:00
return false , order , err
2022-01-26 08:02:21 +00:00
}
2022-01-27 14:24:29 +00:00
isHaveOnDeliver , err := IsHaveOnDeliverOrderCards ( m . ID )
if err != nil {
logger . Error ( "err:" , err )
2022-01-29 02:21:38 +00:00
return false , order , err
2022-01-27 14:24:29 +00:00
}
if ! isHaveOnDeliver {
err = NewOrderQuerySet ( DB ) . IDEq ( order . ID ) . GetUpdater ( ) . SetCardStatus ( OrderCardStatusCancel ) . Update ( )
2022-01-26 08:02:21 +00:00
if err != nil {
logger . Error ( "err:" , err )
2022-01-29 02:21:38 +00:00
return false , order , err
2022-01-26 08:02:21 +00:00
}
2022-01-27 14:24:29 +00:00
}
isRecede := false
if order . DeliveryType == 2 && order . Postage > 0 {
2022-01-26 08:02:21 +00:00
if ! isHaveOnDeliver {
isRecede = true
}
2021-11-01 03:32:23 +00:00
}
2022-06-03 03:30:03 +00:00
if order . DeliveryType == 2 {
UpdateDeliverTaskSubStateCancel ( order . ID )
}
2022-01-29 02:21:38 +00:00
//m.ID = order.ID
//m.Uid = order.Uid
//m.PayPrice = order.PayPrice
return isRecede , order , nil
2021-11-01 03:32:23 +00:00
}
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 {
2022-01-26 08:02:21 +00:00
logger . Error ( "err:" , err )
2021-11-01 03:32:23 +00:00
return
}
fmt . Println ( "Order:" , order )
begin := DB . Begin ( )
_ , err = NewOrderQuerySet ( begin ) . IDEq ( order . ID ) . GetUpdater ( ) .
SetCardStatus ( OrderCardStatusCancel ) . UpdateNum ( )
if err != nil {
begin . Rollback ( )
2022-01-26 08:02:21 +00:00
logger . Error ( "err:" , err )
2021-11-01 03:32:23 +00:00
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 ( )
2022-01-26 08:02:21 +00:00
logger . Error ( "err:" , err )
2021-11-01 03:32:23 +00:00
return
}
err = begin . Commit ( ) . Error
if err != nil {
begin . Rollback ( )
2022-01-26 08:02:21 +00:00
logger . Error ( "err:" , err )
}
}
//func (m *Order) CreateByCardInfoList(cardInfos []CardInfo, gdb *gorm.DB) error {
// err := gdb.Create(m).Error
// if err != nil {
// logger.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
//}
func IsCardGoodsStockEnough ( cards [ ] CardInfo , storeId uint32 ) ( bool , error ) {
for i , _ := range cards {
var gameCardGoodsStock GameCardGoodsStock
err := NewGameCardGoodsStockQuerySet ( DB ) . StoreIdEq ( uint64 ( storeId ) ) . GameCardIdEq ( uint64 ( cards [ i ] . GameCardId ) ) .
One ( & gameCardGoodsStock )
2022-01-27 14:24:29 +00:00
if err != nil && err != RecordNotFound {
2022-01-26 08:02:21 +00:00
logger . Error ( "err:" , err )
return false , err
}
2022-01-27 14:24:29 +00:00
if err == RecordNotFound {
logger . Error ( "order stock out:" )
return false , err
}
2022-01-26 08:02:21 +00:00
if gameCardGoodsStock . RentStock < cards [ i ] . Count {
logger . Error ( "order stock out " )
return false , errors . New ( "order stock out" )
}
2021-11-01 03:32:23 +00:00
}
2022-01-26 08:02:21 +00:00
return false , nil
}
2021-11-01 03:32:23 +00:00
2022-01-26 08:02:21 +00:00
func GameCardGoodsInventoryReduction ( cards [ ] CardInfo , storeId uint32 , gdb * gorm . DB ) error {
for i , _ := range cards {
2022-07-25 04:02:53 +00:00
sql := fmt . Sprintf (
"UPDATE game_card_goods_stock SET rent_stock= rent_stock-%d WHERE store_id=%d AND game_card_id=%d;" ,
cards [ i ] . Count , storeId , cards [ i ] . GameCardId )
2022-01-26 08:02:21 +00:00
fmt . Println ( "sql:" , sql )
err := gdb . Exec ( sql ) . Error
if err != nil {
logger . Error ( "err:" , err )
return err
}
}
return nil
2021-11-01 03:32:23 +00:00
}
2022-01-16 10:47:48 +00:00
2022-01-26 08:02:21 +00:00
func ( m * Order ) InventoryReduction ( gdb * gorm . DB ) error {
var cards [ ] OrderCard
2022-01-27 14:24:29 +00:00
err := NewOrderCardQuerySet ( DB ) . UidEq ( uint32 ( m . Uid ) ) . OrderIdEq ( m . ID ) . All ( & cards )
2022-01-16 10:47:48 +00:00
if err != nil {
2022-01-26 08:02:21 +00:00
logger . Error ( "err:" , err )
2022-01-16 10:47:48 +00:00
return err
}
2022-01-26 08:02:21 +00:00
2022-01-27 14:24:29 +00:00
//fmt.Println("cards:", cards)
2022-01-26 08:02:21 +00:00
for i , _ := range cards {
2022-01-29 02:21:38 +00:00
var gameCardGoodsStock GameCardGoodsStock
err := NewGameCardGoodsStockQuerySet ( DB ) . GameCardIdEq ( uint64 ( cards [ i ] . GameCardId ) ) . StoreIdEq ( m . StoreId ) . One ( & gameCardGoodsStock )
if err != nil {
logger . Error ( "err:" , err )
return err
}
2022-01-27 14:24:29 +00:00
//fmt.Println("cards:", cards[i].GameCardId, cards[i].StoreId, cards[i].Uid)
2022-01-29 02:21:38 +00:00
if gameCardGoodsStock . RentStock < 1 {
logger . Error ( "rent stock not enough:" )
return errors . New ( "rent stock not enough" )
}
2022-01-26 08:02:21 +00:00
sql := fmt . Sprintf ( "UPDATE game_card_goods_stock SET rent_stock= rent_stock-1 WHERE store_id=%d AND game_card_id=%d;" , m . StoreId , cards [ i ] . GameCardId )
fmt . Println ( "sql:" , sql )
2022-01-29 02:21:38 +00:00
err = gdb . Exec ( sql ) . Error
2022-01-26 08:02:21 +00:00
if err != nil {
logger . Error ( "err:" , err )
return err
}
2022-01-16 10:47:48 +00:00
}
2022-01-27 14:24:29 +00:00
err = OrderCardUserRentCard ( uint32 ( m . Uid ) , uint32 ( len ( cards ) ) , nil , gdb )
if err != nil {
logger . Error ( "err:" , err )
}
2022-01-26 08:02:21 +00:00
return nil
}
func ( m * Order ) CreatOrderCard ( cards [ ] CardInfo , storeId uint32 , gdb * gorm . DB ) error {
for _ , v := range cards {
2022-01-16 10:47:48 +00:00
for i := 0 ; i < int ( v . Count ) ; i ++ {
2022-01-26 08:02:21 +00:00
orderCard := & OrderCard {
2022-05-13 09:35:10 +00:00
OrderId : m . ID ,
Uid : uint32 ( m . Uid ) ,
GameCardId : v . GameCardId ,
GameCardGoodsId : 0 ,
StoreId : storeId ,
CardStatus : OrderCardStatusUnPick ,
DeliveryTime : time . Time { } ,
ReceiptTime : time . Time { } ,
DeliveryType : m . DeliveryType ,
SerialNumber : "" ,
PayStatus : m . PayStatus ,
IssueType : 2 ,
CooperativeBusinessId : m . CooperativeBusinessId ,
CooperativeName : m . CooperativeName ,
2022-01-26 08:02:21 +00:00
}
err := gdb . Create ( orderCard ) . Error
if err != nil {
logger . Error ( "err:" , err )
return err
}
2022-01-16 10:47:48 +00:00
}
}
return nil
}
2022-04-22 02:45:15 +00:00
2022-04-23 07:47:13 +00:00
type RecordExist struct {
RecordExist int64 ` json:"record_exist" `
}
func QueryRecordExist ( sql string ) ( bool , error ) {
var recordExist RecordExist
existSql := fmt . Sprintf ( "SELECT EXISTS (%s) AS record_exist;" , sql )
err := DB . Raw ( existSql ) . Scan ( & recordExist ) . Error
if err != nil {
logger . Error ( "err:" , err )
return false , err
}
return recordExist . RecordExist == 1 , nil
2022-04-22 02:45:15 +00:00
}
2022-05-10 07:17:34 +00:00
type CooperativeRentCardOrderReq struct {
SerialNumber string ` json:"serial_number" ` // 编号
PickupCode string ` json:"pickup_code" ` // 取货码
OrderId uint32 ` json:"order_id" ` // 取货码
}
func ( m * CooperativeRentCardOrderReq ) Info ( ) ( Order , error ) {
var order Order
if m . PickupCode != "" {
err := NewOrderQuerySet ( DB ) . PickupCodeEq ( m . PickupCode ) . PayStatusEq ( PayStatusPaid ) .
CardStatusEq ( OrderCardStatusUnPick ) . One ( & order )
if err != nil {
logger . Error ( "order err:" , err )
return order , err
}
} else if m . SerialNumber != "" {
var orderCard OrderCard
err := NewOrderCardQuerySet ( DB ) . SerialNumberEq ( m . SerialNumber ) . CardStatusIn ( OrderCardStatusPlaying ,
OrderCardStatusReturning ) . One ( & orderCard )
if err != nil {
logger . Error ( "order card err:" , err )
return order , err
}
err = NewOrderQuerySet ( DB ) . IDEq ( orderCard . OrderId ) . One ( & order )
if err != nil {
logger . Error ( "order err:" , err )
return order , err
}
} else if m . OrderId != 0 {
err := NewOrderQuerySet ( DB ) . IDEq ( m . OrderId ) . One ( & order )
if err != nil {
logger . Error ( "order err:" , err )
return order , err
}
} else {
return order , errors . New ( "parameter_err" )
}
var orderCards [ ] OrderCard
err := NewOrderCardQuerySet ( DB ) . OrderIdEq ( order . ID ) . All ( & orderCards )
if err != nil {
logger . Error ( "order card err:" , err )
return order , err
}
var store Store
err = NewStoreQuerySet ( DB ) . IDEq ( uint32 ( order . StoreId ) ) . One ( & store )
if err != nil {
logger . Error ( "store err:" , err )
return order , err
}
if order . UserAddressId != 0 {
var address UserAddress
err = NewUserAddressQuerySet ( DB ) . IDEq ( uint32 ( order . UserAddressId ) ) . One ( & address )
if err != nil {
logger . Error ( "address err:" , err )
return order , err
}
order . UserAddress = & address
}
order . Store = & store
order . OrderCards = CooperativeOrderCardListSetInfo ( orderCards )
return order , nil
}
func CooperativeOrderCardListSetInfo ( list [ ] OrderCard ) [ ] OrderCard {
ids := make ( [ ] uint32 , 0 , len ( list ) )
2022-05-12 05:42:45 +00:00
storeIds := make ( [ ] uint32 , 0 , len ( list ) )
2022-05-10 07:17:34 +00:00
for i , _ := range list {
ids = append ( ids , list [ i ] . GameCardId )
2022-05-12 05:42:45 +00:00
storeIds = append ( storeIds , uint32 ( list [ i ] . RevertStoreId ) )
2022-05-10 07:17:34 +00:00
}
if len ( ids ) == 0 {
return list
}
cardMap , err := GameCardMap ( ids )
if err != nil {
2022-05-12 05:42:45 +00:00
logger . Error ( "game card map err:" , err )
return list
}
storeMap , err := GetStoreMap ( storeIds )
if err != nil {
logger . Error ( "store map err:" , err )
2022-05-10 07:17:34 +00:00
return list
}
for i , _ := range list {
gameCard , ok1 := cardMap [ list [ i ] . GameCardId ]
if ok1 {
list [ i ] . GameName = gameCard . Name
list [ i ] . GameCoverImg = gameCard . CoverImg
list [ i ] . GamePrice = gameCard . Price
}
2022-05-12 05:42:45 +00:00
revertStore , ok2 := storeMap [ uint32 ( list [ i ] . RevertStoreId ) ]
if ok2 {
list [ i ] . RevertStore = & revertStore
}
2022-05-10 07:17:34 +00:00
}
return list
}
func GetStoreMap ( ids [ ] uint32 ) ( map [ uint32 ] Store , error ) {
storeMap := make ( map [ uint32 ] Store , 0 )
if len ( ids ) == 0 {
return storeMap , nil
}
var stores [ ] Store
err := NewStoreQuerySet ( DB ) . IDIn ( ids ... ) . All ( & stores )
if err != nil {
logger . Error ( "err:" , err )
return storeMap , err
}
if len ( stores ) == 0 {
return storeMap , nil
}
for i , _ := range stores {
storeMap [ stores [ i ] . ID ] = stores [ i ]
}
return storeMap , nil
}
func ( m * Order ) GetById ( ) error {
err := NewOrderQuerySet ( DB ) . IDEq ( m . ID ) . One ( m )
if err != nil {
logger . Error ( "get order err" )
return err
}
return nil
}
func ( m * Order ) SetUnPickOrderCards ( ) error {
var cards [ ] OrderCard
err := NewOrderCardQuerySet ( DB ) . OrderIdEq ( m . ID ) . CardStatusEq ( OrderCardStatusUnPick ) . All ( & cards )
if err != nil {
logger . Error ( "get order err" )
return err
}
m . OrderCards = cards
return nil
}
func ( m * Order ) SetOrderCards ( ) error {
var cards [ ] OrderCard
err := NewOrderCardQuerySet ( DB ) . OrderIdEq ( m . ID ) . All ( & cards )
if err != nil {
logger . Error ( "get order err" )
return err
}
m . OrderCards = cards
return nil
}
func ( m * Order ) GetOrderCardMap ( ) ( map [ string ] OrderCard , error ) {
cardMap := make ( map [ string ] OrderCard , 0 )
err := m . SetOrderCards ( )
if err != nil {
logger . Error ( "order card err:" , err )
return cardMap , err
}
for i , _ := range m . OrderCards {
cardMap [ m . OrderCards [ i ] . SerialNumber ] = m . OrderCards [ i ]
}
return cardMap , nil
}
type CooperativeRentCardOrderDeliverReq struct {
OrderId uint32 ` json:"order_id" `
SerialNumbers [ ] string ` json:"serial_numbers" `
StoreId uint32 ` json:"store_id" `
ExpressCompany string ` json:"express_company" `
ExpressCompanyNo string ` json:"express_company_no" `
ExpressNo string ` json:"express_no" `
OperationUid uint32 ` json:"operation_uid" `
}
func ( m * CooperativeRentCardOrderDeliverReq ) Deliver ( ) ( error , string ) {
2022-05-12 05:42:45 +00:00
2022-05-10 07:17:34 +00:00
order := new ( Order )
order . ID = m . OrderId
err := order . GetById ( )
if err != nil && err != RecordNotFound {
logger . Error ( "err:" , err )
return err , ""
}
err = order . SetUnPickOrderCards ( )
if err != nil {
logger . Error ( "err:" , err )
return err , ""
}
2022-05-12 05:42:45 +00:00
2022-05-10 07:17:34 +00:00
if len ( m . SerialNumbers ) != len ( order . OrderCards ) || len ( m . SerialNumbers ) == 0 {
logger . Error ( "发货卡的数量与订单游戏卡数量不一致" )
return errors . New ( "发货卡的数量与订单游戏卡数量不一致" ) , "发货卡的数量与订单游戏卡数量不一致"
}
user := GetUserByUid ( uint32 ( order . Uid ) )
if user . MemberExpire . Before ( time . Now ( ) ) {
logger . Error ( "会员已过期,不能发货" )
return errors . New ( "会员已过期,不能发货" ) , "会员已过期,不能发货"
}
orderCardMaps := make ( map [ uint32 ] OrderCard , 0 )
for i , _ := range order . OrderCards {
orderCardMaps [ order . OrderCards [ i ] . ID ] = order . OrderCards [ i ]
}
2022-05-12 05:42:45 +00:00
2022-05-10 07:17:34 +00:00
receiptTime := time . Time { }
if order . DeliveryType == 1 {
receiptTime = time . Now ( )
}
2022-05-12 05:42:45 +00:00
2022-05-10 07:17:34 +00:00
serialNumberMap := make ( map [ string ] GameCardGoods , 0 )
var serialGoods [ ] GameCardGoods
err = NewGameCardGoodsQuerySet ( DB ) . SerialNumberIn ( m . SerialNumbers ... ) . All ( & serialGoods )
if err != nil {
logger . Error ( "serial goods err:" , err )
return err , ""
}
for i , _ := range serialGoods {
serialNumberMap [ serialGoods [ i ] . SerialNumber ] = serialGoods [ i ]
}
isUpdateOrder := false
begin := DB . Begin ( )
for _ , serialNumber := range m . SerialNumbers {
2022-05-12 05:42:45 +00:00
if serialNumber == "" {
2022-05-10 07:17:34 +00:00
continue
}
2022-05-12 05:42:45 +00:00
gameCardGoods , ok := serialNumberMap [ serialNumber ]
2022-05-10 07:17:34 +00:00
if ! ok {
begin . Rollback ( )
logger . Errorf ( "游戏编号卡未找到:%s" , serialNumber )
return errors . New ( "游戏卡未找到" ) , "编号的游戏卡不存在"
}
if gameCardGoods . Status == GameCardGoodsStatusCannibalize {
begin . Rollback ( )
return errors . New ( "card goods status err" ) , "该卡在调拨中,不能发货"
}
if gameCardGoods . Status != GameCardGoodsStatusStock {
begin . Rollback ( )
return errors . New ( "card goods status err" ) , "该卡状态,不能发货"
}
if order . CardStatus != OrderCardStatusUnPick {
begin . Rollback ( )
logger . Error ( "order not unpick" )
return errors . New ( "order not unpick" ) , "订单不是待取货状态"
}
if order . PayStatus != PayStatusPaid {
begin . Rollback ( )
logger . Error ( "order not pay" )
return errors . New ( "order not pay" ) , "订单未支付"
}
orderCard := GetOrderCardMapSerialNumberUnset ( orderCardMaps , uint32 ( gameCardGoods . GameCardId ) )
if orderCard == nil {
begin . Rollback ( )
logger . Error ( "发货游戏卡错误" )
return errors . New ( "发货游戏卡错误" ) , "发货游戏卡错误"
}
if m . StoreId != uint32 ( gameCardGoods . StoreId ) {
begin . Rollback ( )
logger . Error ( "游戏编号卡不是该门店" )
return errors . New ( "游戏编号卡不是该门店" ) , "该门店没有改游戏卡"
}
2022-05-12 05:42:45 +00:00
if ( m . StoreId ) != orderCard . StoreId {
2022-05-10 07:17:34 +00:00
begin . Rollback ( )
// 订单锁库存
logger . Error ( "订单门店与发货门店不一致" )
return errors . New ( "订单门店与发货门店不一致" ) , "订单门店与发货门店不一致,请取消订单后重新下单"
}
2022-05-12 05:42:45 +00:00
paraMap := make ( map [ string ] interface { } , 0 )
//paraMap["game_card_serial_number"] = serialNumber
2022-05-10 07:17:34 +00:00
if ! isUpdateOrder {
if m . StoreId != 0 {
paraMap [ "store_id" ] = m . StoreId
paraMap [ "pickup_code" ] = "已取货"
paraMap [ "card_status" ] = 4
paraMap [ "store_id" ] = m . StoreId
paraMap [ "delivery_time" ] = time . Now ( )
}
if m . ExpressCompany != "" {
paraMap [ "express_company" ] = m . ExpressCompany
}
if m . ExpressCompanyNo != "" {
paraMap [ "express_company_no" ] = m . ExpressCompanyNo
}
if m . ExpressNo != "" {
paraMap [ "express_no" ] = m . ExpressNo
}
2022-05-12 05:42:45 +00:00
err := begin . Table ( "order" ) . Where ( "id=?" , m . OrderId ) . Updates ( paraMap ) . Error
2022-05-10 07:17:34 +00:00
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err , ""
}
isUpdateOrder = true
}
var eg errgroup . Group
eg . Go ( func ( ) error {
2022-05-12 05:42:45 +00:00
err := begin . Table ( "game_card_goods" ) . Where ( "serial_number=?" , serialNumber ) .
2022-05-10 07:17:34 +00:00
Update ( "status" , GameCardGoodsStatusCustomerHold ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
return nil
} )
eg . Go ( func ( ) error {
goodsStock := & GameCardGoodsStock {
StoreId : uint64 ( m . StoreId ) ,
GameCardId : gameCardGoods . GameCardId ,
}
err = goodsStock . AddUserHoldStock ( begin )
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
return nil
} )
eg . Go ( func ( ) error {
user := GetUserByUid ( uint32 ( order . Uid ) )
if user . StoreId == 0 {
sql := fmt . Sprintf ( "UPDATE `user` SET store_id = %d WHERE uid =%d" , order . StoreId , order . Uid )
err := DB . Exec ( sql ) . Error
if err != nil {
logger . Error ( "err:" , err )
return err
}
}
return nil
} )
eg . Go ( func ( ) error {
2022-05-12 05:42:45 +00:00
err = begin . Table ( "order_card" ) . Where ( "id=?" , orderCard . ID ) . Updates ( map [ string ] interface { } {
2022-05-10 07:17:34 +00:00
"store_id" : m . StoreId ,
"delivery_time" : time . Now ( ) ,
"game_card_goods_id" : gameCardGoods . ID ,
"serial_number" : gameCardGoods . SerialNumber ,
"card_status" : 2 ,
"receipt_time" : receiptTime ,
} ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
delete ( orderCardMaps , orderCard . ID )
return nil
} )
err = eg . Wait ( )
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err , ""
}
}
2022-05-12 05:42:45 +00:00
err = begin . Commit ( ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err , ""
}
err = DB . Table ( "order_card" ) . Where ( "order_id=?" , m . OrderId ) . Where ( "uid=?" , order . Uid ) .
2022-05-10 07:17:34 +00:00
Where ( "serial_number=''" ) . Updates ( & map [ string ] interface { } {
"card_status" : 5 ,
} ) . Error
if err != nil {
logger . Error ( "err:" , err )
return err , ""
}
2022-05-12 05:42:45 +00:00
go func ( ) {
if m . ExpressCompanyNo != "" && m . ExpressNo != "" {
_ , err = kuaidi . SubscribeExpressState ( m . ExpressCompanyNo , m . ExpressNo )
if err != nil {
logger . Error ( "subscribe express state err:" , err )
}
}
2022-05-10 07:17:34 +00:00
2022-05-12 05:42:45 +00:00
operationLog := & OperationLog {
Uid : m . OperationUid ,
Description : "借卡发货" ,
OperationType : OperationTypeRentCardDeliver ,
CorrelationId : order . ID ,
CorrelationName : LogCorrelationOrderId ,
StoreId : m . StoreId ,
StoreName : "" ,
CooperativeName : "" ,
//SerialNumber: m.SerialNumber,
}
operationLog . AddLog ( )
} ( )
2022-05-10 07:17:34 +00:00
return nil , ""
}
type CooperativeRentCardOrderRevertReq struct {
OrderId uint32 ` json:"order_id" `
SerialNumber string ` json:"serial_number" `
RevertStoreId uint32 ` json:"revert_store_id" `
OperationUid uint32 ` json:"operation_uid" `
}
func ( m * CooperativeRentCardOrderRevertReq ) Revert ( ) error {
order := new ( Order )
order . ID = m . OrderId
err := order . GetById ( )
if err != nil {
logger . Error ( "get order err:" , err )
return err
}
cardMap , err := order . GetOrderCardMap ( )
if err != nil {
logger . Error ( "err:" , err )
return err
}
orderCardIds := make ( [ ] uint32 , 0 , len ( cardMap ) )
orderCardIdString := ""
for _ , card := range cardMap {
orderCardIds = append ( orderCardIds , card . ID )
orderCardIdString += fmt . Sprintf ( "%d," , card . ID )
}
recordExist , err := QueryRecordExist ( fmt . Sprintf (
"SELECT * FROM card_issue_feedback WHERE state='%s' AND relevance_id in (%s)" ,
CardIssueStateFollowing , orderCardIdString [ : len ( orderCardIdString ) - 1 ] ) )
if err != nil {
logger . Errorf ( "err:%#v" , err )
return err
}
if recordExist {
logger . Error ( "untreated_issue_feedback" )
return errors . New ( "untreated_issue_feedback" )
}
serialNumber := m . SerialNumber
orderCard , ok := cardMap [ serialNumber ]
if ! ok {
logger . Error ( "order card is not revert card" )
return errors . New ( "order card is not revert card" )
}
if m . RevertStoreId == 0 {
logger . Error ( "revert store id null" )
return errors . New ( "revert store id null" )
}
if orderCard . CardStatus != OrderCardStatusReturning && orderCard . CardStatus != OrderCardStatusPlaying {
logger . Error ( "order card status not returning playing " )
return errors . New ( "order card status not returning playing " )
}
gameCardGoods , err := GetGameCardGoodsBySerialNumber ( serialNumber )
if err != nil {
logger . Errorf ( "err:%#v" , err )
return err
}
if order . StoreId != gameCardGoods . StoreId {
logger . Error ( "order store id not game card goods store id" )
return errors . New ( "order store id not game card goods store id" )
}
begin := DB . Begin ( )
var eg errgroup . Group
eg . Go ( func ( ) error {
goodsStatus := GameCardGoodsStatusStock
if gameCardGoods . Status == 7 {
goodsStatus = GameCardGoodsStatusUnusual
}
err := begin . Table ( "game_card_goods" ) . Where ( "serial_number=?" , serialNumber ) .
Updates ( map [ string ] interface { } {
"status" : goodsStatus ,
"store_id" : m . RevertStoreId ,
"stock_time" : time . Now ( ) ,
} ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
return nil
} )
eg . Go ( func ( ) error {
if uint32 ( gameCardGoods . StoreId ) != m . RevertStoreId {
sqlStore := fmt . Sprintf (
"UPDATE game_card_goods_stock SET user_hold_stock= user_hold_stock-1,order_count=order_count+1,total_stock=total_stock-1 WHERE store_id=%d AND game_card_id=%d;" ,
order . StoreId , gameCardGoods . GameCardId )
fmt . Println ( "sqlStore:" , sqlStore )
err = begin . Exec ( sqlStore ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
var count int64
2022-05-12 05:42:45 +00:00
err := DB . Table ( "game_card_goods_stock" ) . Where ( "store_id=?" , m . RevertStoreId ) .
Where ( "game_card_id=?" , gameCardGoods . GameCardId ) . Count ( & count ) . Error
2022-05-10 07:17:34 +00:00
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
if count == 0 && ( gameCardGoods . Status != 7 || gameCardGoods . FunctionState != 1 ) {
goodsStock := & GameCardGoodsStock {
StoreId : uint64 ( m . RevertStoreId ) ,
GameCardId : gameCardGoods . GameCardId ,
StoreStock : 0 ,
RentStock : 1 ,
UserHoldStock : 0 ,
OrderCount : 0 ,
TotalStock : 1 ,
}
err := begin . Create ( goodsStock ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
return nil
} else {
if gameCardGoods . Status != 7 || gameCardGoods . FunctionState != 1 {
sql := fmt . Sprintf ( "UPDATE game_card_goods_stock SET rent_stock= rent_stock+1,total_stock=total_stock+1 WHERE store_id=%d AND game_card_id=%d;" , m . RevertStoreId , gameCardGoods . GameCardId )
fmt . Println ( "sql:" , sql )
err = begin . Exec ( sql ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
}
}
} else {
//sqlStore := fmt.Sprintf("UPDATE game_card_goods_stock SET user_hold_stock= user_hold_stock-1,order_count=order_count+1,order_count=order_count+1 WHERE store_id=%d AND game_card_id=%d;", order.StoreId, gameCardGoods.GameCardId)
sqlStore := fmt . Sprintf ( "UPDATE game_card_goods_stock SET user_hold_stock= user_hold_stock-1,order_count=order_count+1 WHERE store_id=%d AND game_card_id=%d;" , order . StoreId , gameCardGoods . GameCardId )
fmt . Println ( "sqlStore:" , sqlStore )
err = begin . Exec ( sqlStore ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
if gameCardGoods . Status != 7 || gameCardGoods . FunctionState != 1 {
//sql := fmt.Sprintf("UPDATE game_card_goods_stock SET rent_stock= rent_stock+1,user_hold_stock= user_hold_stock-1 WHERE store_id=%d AND game_card_id=%d;", m.RevertStoreId, gameCardGoods.GameCardId)
sql := fmt . Sprintf ( "UPDATE game_card_goods_stock SET rent_stock= rent_stock+1 WHERE store_id=%d AND game_card_id=%d;" , m . RevertStoreId , gameCardGoods . GameCardId )
fmt . Println ( "sql:" , sql )
err = begin . Exec ( sql ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
}
}
return nil
} )
eg . Go ( func ( ) error {
if order . GameCardId != 0 {
sql := fmt . Sprintf ( "UPDATE game_card SET order_count = order_count+1 WHERE id = %d" , order . GameCardId )
err := begin . Exec ( sql ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
}
return nil
} )
eg . Go ( func ( ) error {
2022-05-12 05:42:45 +00:00
err := begin . Table ( "order_card" ) . Where ( "id=?" , orderCard . ID ) . Updates ( map [ string ] interface { } {
2022-05-10 07:17:34 +00:00
"card_status" : OrderCardStatusCompleted ,
"revert_store_id" : m . RevertStoreId ,
"revert_time" : time . Now ( ) ,
} ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
var count int64
err = DB . Table ( "order_card" ) . Where ( "order_id=?" , orderCard . OrderId ) .
Where ( "card_status in (?)" , [ ] uint32 { 1 , 2 , 3 } ) . Count ( & count ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
if count == 0 {
2022-05-12 05:42:45 +00:00
err := begin . Table ( "order" ) . Where ( "id=?" , orderCard . OrderId ) . Updates ( map [ string ] interface { } {
2022-05-10 07:17:34 +00:00
"card_status" : OrderCardStatusCompleted ,
} ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
}
return nil
} )
eg . Go ( func ( ) error {
2022-05-12 05:42:45 +00:00
sql := fmt . Sprintf (
"UPDATE user_rent_card SET have_rent_count = have_rent_count-1,can_rent_count=can_rent_count+1 WHERE uid =%d;" ,
orderCard . Uid )
2022-05-10 07:17:34 +00:00
//sql := fmt.Sprintf("UPDATE user_rent_card SET have_rent_count = have_rent_count-1,can_rent_count=can_rent_count+1 WHERE uid =%d;", m.Uid)
fmt . Println ( "sql:" , sql )
err = begin . Exec ( sql ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
return nil
} )
err = eg . Wait ( )
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
err = begin . Commit ( ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
operationLog := & OperationLog {
Uid : m . OperationUid ,
Description : "借卡归还入库" ,
OperationType : OperationTypeRentCardRevert ,
CorrelationId : orderCard . ID ,
CorrelationName : LogCorrelationOrderCard ,
StoreId : m . RevertStoreId ,
StoreName : "" ,
CooperativeName : "" ,
SerialNumber : m . SerialNumber ,
}
operationLog . AddLog ( )
return nil
}