2023-09-16 02:56:39 +00:00
package models
import (
"context"
"encoding/json"
"errors"
"fmt"
"github.com/wechatpay-apiv3/wechatpay-go/core"
"github.com/wechatpay-apiv3/wechatpay-go/core/option"
"github.com/wechatpay-apiv3/wechatpay-go/services/certificates"
"github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi"
wechatpayutils "github.com/wechatpay-apiv3/wechatpay-go/utils"
"go-admin/app/admin/models/kuaidi"
orm "go-admin/common/global"
"go-admin/logger"
"golang.org/x/sync/errgroup"
"time"
)
const (
OrderCardStatusUnPick = 1 // 待取货中
OrderCardStatusPlaying = 2 // 游玩中
OrderCardStatusReturning = 3 // 归还中
OrderCardStatusCompleted = 4 // 已完成
OrderCardStatusCancel = 5 // 已取消
OrderCardStatusRefund = 6 // 已退款
DeliveryTypeStorePick = 1 // 门店取货
DeliveryTypeExpress = 2 // 快递取货
ExpressFeeProvince = 10 * 100 // 省内
ExpressFeeOutsideProvince = 15 * 100 // 省外
PayStatusUnPay = 1 // 未支付
PayStatusPaid = 2 // 已支付
)
// gen:qs
//
//go:generate goqueryset -in order.go
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
GameCardSerialNumber string ` json:"game_card_serial_number" gorm:"index" ` // 游戏卡编号
StoreId uint64 ` json:"store_id" gorm:"index" ` // 门店id
UserAddressId uint64 ` json:"user_address_id" ` // 地址id
DeliveryType uint8 ` json:"delivery_type" ` // 取货类型 1-门店自取 2-快递
Count uint32 ` json:"count" ` // 数量
PickupCode string ` json:"pickup_code" ` // 取货码
CardStatus uint8 ` json:"card_status" ` // 1-待取货中 2-游玩中 3-归还中 4-已完成 5-已取消
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" ` // 归还物流时长
CooperativeBusinessId uint32 ` json:"cooperative_business_id" ` // 合作商id
CooperativeName string ` json:"cooperative_name" ` // 合作商名称
GameCardSerialNumbers [ ] string ` json:"game_card_serial_numbers" gorm:"-" `
OrderCards [ ] OrderCard ` json:"order_cards" gorm:"-" `
}
func ( * Order ) TableName ( ) string {
return "order"
}
// gen:qs
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
CardStatus uint8 ` json:"card_status" ` // 1-待取货中 2-游玩中 3-归还中 4-已完成 5-已取消
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-已支付
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-正常
Postage uint32 ` json:"postage" gorm:"-" ` // 邮费
ExpressCompany string ` json:"express_company" gorm:"-" ` // 物流公司
ExpressCompanyNo string ` json:"express_company_no" gorm:"-" ` // 物流公司编号
ExpressNo string ` json:"express_no" gorm:"-" ` // 物流单号
CooperativeBusinessId uint32 ` json:"cooperative_business_id" ` // 合作商id
CooperativeName string ` json:"cooperative_name" ` // 合作商名称
GameName string ` json:"name" gorm:"-" ` // 名称
GamePrice uint32 ` json:"price" gorm:"-" ` // 价格
GameCoverImg string ` json:"cover_img" gorm:"-" ` // 封面
Order * Order ` json:"order" gorm:"-" ` // 订单
RevertStore * Store ` json:"revert_store" gorm:"-" ` // 归还门店
}
func ( * OrderCard ) TableName ( ) string {
return "order_card"
}
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" ` // 封面
}
const (
LogCorrelationOrderId = "order_id"
LogCorrelationOrderCard = "order_card_id"
LogCorrelationRecycleCardOrderId = "recycle_card_order_id"
)
const (
OperationTypeRevertRentCard = "revert_rent_card" // 归还租卡
OperationTypeUserShareCard = "user_share_card" // 用户共享卡
OperationTypeIssueCard = "issue_card" // 问题卡反馈
OperationTypeRecycleCardOrderImageUpdate = "recycle_card_order_image_update" // 回收卡上传图片
)
type ExpressNoInfo struct {
ExpressCompany string ` json:"express_company" gorm:"-" ` // 物流公司
ExpressCompanyNo string ` json:"express_company_no" gorm:"-" ` // 物流公司编号
ExpressNo string ` json:"express_no" gorm:"-" ` // 物流单号
StoreId uint32 ` json:"store_id" gorm:"-" `
OperationType string ` json:"operation_type" gorm:"-" `
CorrelationId uint32 ` json:"correlation_id" gorm:"-" `
Store * Store ` json:"store" gorm:"-" `
}
// gen:qs
type ExpressCompany struct {
Model
CompanyName string ` json:"company_name" `
CompanyCode string ` json:"company_code" `
}
func ( * ExpressCompany ) TableName ( ) string {
return "express_company"
}
type OrderListReq struct {
Uid uint64 ` json:"uid" `
OrderId uint64 ` json:"order_id" `
GameCardId uint64 ` json:"game_card_id" `
StoreId uint64 ` json:"store_id" ` // 门店id// 游戏id
CardStatus uint8 ` json:"card_status" ` // 1-待取货中 2-游玩中 3-归还中 4-已完成
PayStatus uint8 ` json:"pay_status" `
DeliveryType uint8 ` json:"delivery_type" `
SerialNumber string ` json:"serial_number" ` // 编号
PickupCode string ` json:"pickup_code" ` // 取货码
StartTime time . Time ` json:"start_time" ` // 开始时间
EndTime time . Time ` json:"end_time" ` // 结束时间
Page int ` json:"pageIndex" `
PageSize int ` json:"pageSize" `
}
//type OrderListResp struct {
//}
func ( m * OrderListReq ) List ( ) ( [ ] Order , int64 , error ) {
//orderInfos := make([]OrderInfo, 0)
var orderCards [ ] OrderCard
orders := make ( [ ] Order , 0 )
if m . PageSize == 0 {
m . PageSize = 10
}
qs := orm . Eloquent . Table ( "order" ) . Where ( "pay_status" , 2 )
isDeliver := true
if m . SerialNumber != "" {
isDeliver = false
////qs = qs.Where("game_card_serial_number", m.SerialNumber)
//err := orm.Eloquent.Table("order_card").Where("serial_number=?", m.SerialNumber).
// Order("id DESC").Order("card_status ASC").Limit(30).Find(&orderCards).Error
// //Where("card_status in (?)", []uint32{2, 3}).Order("id DESC").Order("card_status DESC").Limit(30).Find(&orderCards).Error
//if err != nil {
// logger.Error("err:", err)
// return orders, 0, err
//}
//order := Order{}
//if len(orderCards) > 0 {
// err := orm.Eloquent.Table("order").Where("id=?", orderCards[0].OrderId).Find(&order).Error
// if err != nil {
// logger.Error("err:", err)
// return orders, 0, err
// }
//}
//orders = append(orders, order)
//orders[0].OrderCards = OrderCardListSetGameInfo(orderCards)
//return orders, 1, nil
err := orm . Eloquent . Table ( "order_card" ) . Where ( "serial_number=?" , m . SerialNumber ) .
Order ( "id DESC" ) . Order ( "card_status ASC" ) . Find ( & orderCards ) . Error
//Where("card_status in (?)", []uint32{2, 3}).Order("id DESC").Order("card_status DESC").Limit(30).Find(&orderCards).Error
if err != nil {
logger . Error ( "err:" , err )
return orders , 0 , err
}
orderIds := make ( [ ] uint32 , 0 )
for i , _ := range orderCards {
orderIds = append ( orderIds , orderCards [ i ] . OrderId )
}
qs = qs . Where ( "id in (?)" , orderIds )
}
if m . PickupCode != "" {
isDeliver = false
qs = qs . Where ( "pickup_code" , m . PickupCode )
}
if m . PayStatus != 0 {
qs = qs . Where ( "pay_status" , m . PayStatus )
}
if m . DeliveryType != 0 {
qs = qs . Where ( "delivery_type" , m . DeliveryType )
}
if m . OrderId != 0 {
isDeliver = false
qs = qs . Where ( "id" , m . OrderId )
}
if isDeliver {
if m . Uid != 0 {
qs = qs . Where ( "uid" , m . Uid )
}
if m . GameCardId != 0 {
qs = qs . Where ( "game_card_id" , m . GameCardId )
}
if m . CardStatus != 0 {
qs = qs . Where ( "card_status" , m . CardStatus )
}
if m . StoreId != 0 {
qs = qs . Where ( "store_id" , m . StoreId )
}
if ! m . StartTime . IsZero ( ) {
fmt . Println ( "起始时间:" , m . StartTime . Unix ( ) )
qs = qs . Where ( "created_at > ?" , m . StartTime )
}
if ! m . EndTime . IsZero ( ) {
fmt . Println ( "时间:" , m . StartTime . Unix ( ) )
qs = qs . Where ( "created_at < ?" , m . EndTime )
}
}
var count int64
err := qs . Count ( & count ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return orders , 0 , err
}
page := m . Page
pageSize := m . PageSize
page -= 1
if page < 0 {
page = 0
}
err = qs . Order ( "created_at DESC" ) . Offset ( page * pageSize ) . Limit ( pageSize ) . Find ( & orders ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return orders , 0 , err
}
ids := make ( [ ] uint32 , 0 , len ( orders ) )
for i , _ := range orders {
ids = append ( ids , uint32 ( orders [ i ] . ID ) )
}
if len ( ids ) == 0 {
logger . Error ( "gameIds is nil" )
return orders , 0 , err
}
//var orderCards []OrderCard
err = orm . Eloquent . Table ( "order_card" ) . Where ( "order_id in (?)" , ids ) . Find ( & orderCards ) . Error
if err != nil {
logger . Error ( "err:" , err )
return orders , 0 , err
}
orderCards = OrderCardListSetGameInfo ( orderCards )
orderCardsMap := make ( map [ uint32 ] [ ] OrderCard , 0 )
for i , _ := range orderCards {
orderCardsMap [ orderCards [ i ] . OrderId ] = append ( orderCardsMap [ orderCards [ i ] . OrderId ] , orderCards [ i ] )
}
for i , _ := range orders {
if orders [ i ] . CardStatus == 2 || orders [ i ] . CardStatus == 3 {
orders [ i ] . CardStatus = 4
}
v , ok := orderCardsMap [ orders [ i ] . ID ]
if ok {
orders [ i ] . OrderCards = v
}
}
//fmt.Println("orders:", orders)
//fmt.Println("gameIds:", gameIds)
//games := make([]GameCard, 0)
//err = orm.Eloquent.Table("game_card").Where("id IN (?)", gameIds).Find(&games).Error
//if err != nil {
// logger.Errorf("err:", err)
// return orders, 0, err
//}
//fmt.Println("games:", games)
//gameMap := make(map[uint32]GameCard, 0)
//for i, _ := range games {
// gameMap[games[i].ID] = games[i]
//}
//for i, _ := range orders {
// game, ok := gameMap[uint32(orders[i].GameCardId)]
// if ok {
// orders = append(orders, orders[i].ToInfo(&game))
// }
//}
return orders , count , nil
}
func ( m * Order ) Info ( ) ( map [ string ] interface { } , error ) {
ret := make ( map [ string ] interface { } , 0 )
err := orm . Eloquent . Table ( "order" ) . Where ( "id" , m . ID ) . Find ( m ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return ret , err
}
var orderCards [ ] OrderCard
err = orm . Eloquent . Table ( "order_card" ) . Where ( "order_id=?" , m . ID ) . Find ( & orderCards ) . Error
if err != nil {
logger . Error ( "err:" , err )
return ret , err
}
var (
eg errgroup . Group
storeCh = make ( chan Store , 1 )
//revertStoreCh = make(chan Store, 1)
userAddressCh = make ( chan UserAddress , 1 )
userInfoCh = make ( chan UserInfo , 1 )
)
eg . Go ( func ( ) error {
var store Store
err := orm . Eloquent . Table ( "store" ) . Where ( "id" , m . StoreId ) . Find ( & store ) . Error
if err != nil && err != RecordNotFound {
storeCh <- store
logger . Errorf ( "err:" , err )
return err
}
storeCh <- store
return nil
} )
//eg.Go(func() error {
// var revertStore Store
// err := orm.Eloquent.Table("store").Where("id", m.RevertStoreId).Find(&revertStore).Error
// if err != nil && err != RecordNotFound {
// storeCh <- revertStore
// logger.Errorf("err:", err)
// return err
// }
// revertStoreCh <- revertStore
// return nil
//})
eg . Go ( func ( ) error {
var userAddress UserAddress
err := orm . Eloquent . Table ( "user_address" ) . Where ( "id" , m . UserAddressId ) . Find ( & userAddress ) . Error
if err != nil && err != RecordNotFound {
userAddressCh <- userAddress
logger . Errorf ( "err:" , err )
return err
}
userAddressCh <- userAddress
return nil
} )
eg . Go ( func ( ) error {
var userInfo UserInfo
err := orm . Eloquent . Table ( "user" ) . Where ( "id" , m . Uid ) . Find ( & userInfo ) . Error
if err != nil && err != RecordNotFound {
userInfoCh <- userInfo
logger . Errorf ( "err:" , err )
return err
}
userInfoCh <- userInfo
return nil
} )
err = eg . Wait ( )
if err != nil {
logger . Errorf ( "err:" , err )
return ret , err
}
m . OrderCards = OrderCardListSetGameInfo ( orderCards )
if m . CardStatus == 2 || m . CardStatus == 3 {
m . CardStatus = 4
}
ret [ "order" ] = * m
ret [ "store" ] = <- storeCh
//ret["revert_store"] = <-revertStoreCh
ret [ "userAddress" ] = <- userAddressCh
ret [ "user" ] = <- userInfoCh
return ret , nil
}
func ( m * Order ) Deliver ( ) ( error , string ) {
paraMap := make ( map [ string ] interface { } , 0 )
// TODO 减库存
// TODO 更新卡的状态
var order Order
err := orm . Eloquent . Table ( "order" ) . Where ( "id" , m . ID ) . Find ( & order ) . Error
if err != nil && err != RecordNotFound {
logger . Errorf ( "err:" , err )
return err , ""
}
fmt . Println ( "Order:" , m )
cards , err := m . GetOrderCardGameCardIdList ( )
if err != nil {
logger . Error ( "err:" , err )
return err , ""
}
if len ( m . GameCardSerialNumbers ) != len ( cards ) {
logger . Errorf ( "发货卡的数量与订单游戏卡数量不一致" )
return errors . New ( "发货卡的数量与订单游戏卡数量不一致" ) , "发货卡的数量与订单游戏卡数量不一致"
}
var user UserInfo
err = orm . Eloquent . Table ( "user" ) . Where ( "uid" , order . Uid ) . Find ( & user ) . Error
if err != nil {
logger . Error ( "err:" , err )
return err , ""
}
if user . MemberExpire . Before ( time . Now ( ) ) {
logger . Errorf ( "会员已过期,不能发货" )
return errors . New ( "会员已过期,不能发货" ) , "会员已过期,不能发货"
}
fmt . Println ( "m.GameCardSerialNumbers:" , m . GameCardSerialNumbers )
orderCardMaps := make ( map [ uint32 ] OrderCard , 0 )
for i , _ := range cards {
orderCardMaps [ cards [ i ] . ID ] = cards [ i ]
}
receiptTime := time . Time { }
if order . DeliveryType == 1 {
receiptTime = time . Now ( )
}
isUpdateOrder := false
begin := orm . Eloquent . Begin ( )
for _ , serialNumber := range m . GameCardSerialNumbers {
//cards, err = m.GetOrderCardGameCardIdList()
//if err != nil {
// logger.Error("err:", err)
// return err, ""
//}
var (
gameCardGoods GameCardGoods
orderCard * OrderCard
)
if serialNumber != "" {
paraMap [ "game_card_serial_number" ] = serialNumber
//var count int64
err := orm . Eloquent . Table ( "game_card_goods" ) . Where ( "serial_number" , serialNumber ) . Find ( & gameCardGoods ) . Error
if err != nil && err != RecordNotFound {
begin . Rollback ( )
logger . Errorf ( "err:" , err )
return err , ""
}
if err == RecordNotFound {
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" ) , "该卡状态,不能发货"
}
//err = orm.Eloquent.Table("order").Where("id", m.ID).Find(&order).Error
//if err != nil && err != RecordNotFound {
// begin.Rollback()
// logger.Errorf("err:", err)
// return err, ""
//}
if order . CardStatus != OrderCardStatusUnPick {
begin . Rollback ( )
logger . Errorf ( "order not unpick" )
return errors . New ( "order not unpick" ) , "订单不是待取货状态"
}
if order . PayStatus != PayStatusPaid {
begin . Rollback ( )
logger . Errorf ( "order not pay" )
return errors . New ( "order not pay" ) , "订单未支付"
}
//if order.GameCardId != gameCardGoods.GameCardId {
// logger.Errorf("游戏id卡未找到")
// return errors.New("游戏卡与订单游戏不一致"), "编号的游戏卡不存在"
//}
orderCard = GetOrderCardMapSerialNumberUnset ( orderCardMaps , uint32 ( gameCardGoods . GameCardId ) )
//orderCard, ok := cardMap[uint32(gameCardGoods.GameCardId)]
if orderCard == nil {
begin . Rollback ( )
//logger.Errorf("订单游戏卡已发货")
//return errors.New("订单游戏卡已发货"), "订单游戏卡已发货"
logger . Errorf ( "发货游戏卡错误" )
return errors . New ( "发货游戏卡错误" ) , "发货游戏卡错误"
}
//orderCard, ok := orderCardMaps[uint32(gameCardGoods.GameCardId)]
//if !ok {
// logger.Errorf("发货游戏卡错误")
// return errors.New("发货游戏卡错误"), "发货游戏卡错误"
//}
if m . StoreId != gameCardGoods . StoreId {
begin . Rollback ( )
logger . Errorf ( "游戏编号卡不是该门店" )
return errors . New ( "游戏编号卡不是该门店" ) , "该门店没有该游戏卡"
}
//fmt.Println("m.StoreId", m.StoreId)
//fmt.Println("m.RevertStoreId", m.RevertStoreId)
//fmt.Printf("m:%#v \n", m)
//fmt.Println("orderCard.StoreId", orderCard.StoreId)
if uint32 ( m . StoreId ) != orderCard . StoreId {
begin . Rollback ( )
// 订单锁库存
logger . Errorf ( "订单门店与发货门店不一致" )
return errors . New ( "订单门店与发货门店不一致" ) , "订单门店与发货门店不一致,请取消订单后重新下单"
}
}
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
}
err := begin . Table ( "order" ) . Where ( "id" , m . ID ) . Updates ( paraMap ) . Error
if err != nil {
begin . Rollback ( )
logger . Errorf ( "err:" , err )
return err , ""
}
isUpdateOrder = true
}
//goodsStatus := GameCardGoodsStatusInWay
//if m.DeliveryType == 1 {
goodsStatus := GameCardGoodsStatusCustomerHold
//}
var eg errgroup . Group
eg . Go ( func ( ) error {
err := begin . Table ( "game_card_goods" ) . Where ( "serial_number" , serialNumber ) .
Update ( "status" , goodsStatus ) . Error
if err != nil {
begin . Rollback ( )
logger . Errorf ( "err:" , err )
return err
}
return nil
} )
eg . Go ( func ( ) error {
sql := fmt . Sprintf ( "UPDATE game_card_goods_stock SET user_hold_stock= user_hold_stock+1 WHERE store_id=%d AND game_card_id=%d;" , m . StoreId , gameCardGoods . GameCardId )
fmt . Println ( "sql:" , sql )
err := begin . Exec ( sql ) . Error
if err != nil {
begin . Rollback ( )
logger . Errorf ( "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 := orm.Eloquent.Exec(sql).Error
// if err != nil {
// logger.Errorf("err:", err)
// return err
// }
// }
//
// return nil
//})
eg . Go ( func ( ) error {
var userInfo UserInfo
err := orm . Eloquent . Table ( "user" ) . Where ( "uid=?" , order . Uid ) . Find ( & userInfo ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return err
}
if userInfo . StoreId == 0 {
sql := fmt . Sprintf ( "UPDATE `user` SET store_id = %d WHERE uid =%d" , order . StoreId , order . Uid )
err := begin . Exec ( sql ) . Error
if err != nil {
begin . Rollback ( )
logger . Errorf ( "err:" , err )
return err
}
}
//var userInvite UserInvite
//err = orm.Eloquent.Table("user_11invite").Where("uid=?", order.Uid).Find(&userInvite).Error
//if err == RecordNotFound {
// invite := &UserInvite{
// FromUid: 0,
// UserType: 0,
// StoreId: order.StoreId,
// MemberOpenTime: userInfo.MemberExpire.AddDate(-1, 0, 0),
// MemberType: 2,
// MemberStatus: 2,
// ToUid: uint32(order.Uid),
// StoreType: 1,
// }
// err := orm.Eloquent.Create(invite).Error
// if err != nil {
// logger.Errorf("err:", err)
// return err
// }
//}
return nil
} )
eg . Go ( func ( ) error {
//var orderCard OrderCard
//err := orm.Eloquent.Table("order_card").Where("order_id=?", m.ID).Where("uid=?", order.Uid).
// Where("game_card_id=?", gameCardGoods.GameCardId).Where("serial_number=''").Limit(1).Find(&orderCard).Error
//if err != nil {
// logger.Errorf("err:", err)
// return err
//}
//err = begin.Table("order_card").Where("id=?", orderCard.ID).Updates(&map[string]interface{}{
// "game_card_goods_id": gameCardGoods.ID,
// "serial_number": gameCardGoods.SerialNumber,
// "card_status": 2,
//}).Error
err = begin . Table ( "order_card" ) . Where ( "id=?" , orderCard . ID ) . Updates ( & map [ string ] interface { } {
"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 . Errorf ( "err:" , err )
return err
}
delete ( orderCardMaps , orderCard . ID )
return nil
} )
err = eg . Wait ( )
if err != nil {
begin . Rollback ( )
logger . Errorf ( "err:" , err )
return err , ""
}
}
err = begin . Table ( "order_card" ) . Where ( "order_id=?" , m . ID ) . Where ( "uid=?" , order . Uid ) .
Where ( "serial_number=''" ) . Updates ( & map [ string ] interface { } {
"card_status" : 5 ,
} ) . Error
err = begin . Commit ( ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err , ""
}
if m . ExpressCompanyNo != "" && m . ExpressNo != "" {
_ , err = kuaidi . SubscribeExpressState ( m . ExpressCompanyNo , m . ExpressNo )
if err != nil {
logger . Error ( "subscribe express state err:" , err )
}
}
//DeliverTask{}
//err := orm.Eloquent.Table("order").Where("id", m.ID).Find(&order).Error
UpdateDeliverTaskSubState ( order . ID )
if user . OpenMemberChannel == OpenMemberChannelStorePromotion {
go func ( ) {
var orders [ ] Order
err = orm . Eloquent . Table ( "order" ) . Where ( "uid=?" , user . Uid ) .
Where ( "card_status!=?" , OrderCardStatusCancel ) . Where ( "pay_status=?" , 2 ) . Find ( & orders ) . Error
if err != nil {
logger . Error ( "order err:" , err )
return
}
if len ( orders ) == 1 && orders [ 0 ] . CardStatus == 4 {
err = orm . Eloquent . Table ( "user" ) . Where ( "uid=?" , user . Uid ) .
Update ( "store_id" , orders [ 0 ] . StoreId ) . Error
if err != nil {
logger . Error ( "update store err:" , err )
}
}
//if !exist && user.OpenMemberTime.Format(DateTimeFormat) == time.Now().Format(DateTimeFormat) {
// //_, err = NewUserQuerySet(model.DB).UidEq(uc.Uid).GetUpdater().SetStoreId(uint64(req.StoreId)).UpdateNum()
// if err != nil {
// logger.Error("update user err:", err)
// }
//}
} ( )
}
return nil , ""
}
func ( m * Order ) Revert ( ) error {
OrderJson , _ := json . Marshal ( m )
fmt . Println ( "归还订单:" , string ( OrderJson ) )
var order Order
err := orm . Eloquent . Table ( "order" ) . Where ( "id" , m . ID ) . Find ( & order ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return err
}
cardMap , err := order . GetOrderCardMap ( )
if err != nil {
logger . Error ( "err:" , err )
return err
}
orderCardIds := make ( [ ] uint32 , 0 , len ( cardMap ) )
for _ , card := range cardMap {
orderCardIds = append ( orderCardIds , card . ID )
}
//CardIssueFeedback{}
var issueCount int64
err = orm . Eloquent . Table ( "card_issue_feedback" ) . Where ( "relevance_id in (?)" , orderCardIds ) .
Where ( "state=?" , CardIssueStateFollowing ) . Count ( & issueCount ) . Error
if err != nil {
logger . Errorf ( "err:%#v" , err )
return err
}
if issueCount > 0 {
logger . Error ( "untreated_issue_feedback" )
return errors . New ( "untreated_issue_feedback" )
}
//for _, serialNumber := range m.GameCardSerialNumbers {
serialNumber := m . GameCardSerialNumber
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 " )
}
var gameCardGoods GameCardGoods
//err := orm.Eloquent.Table("order").Where("game_card_serial_number", m.GameCardSerialNumber).Find(&gameCardGoods).Error
err = orm . Eloquent . Table ( "game_card_goods" ) . Where ( "serial_number" , serialNumber ) . Find ( & gameCardGoods ) . Error
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 := orm . Eloquent . Begin ( )
var eg errgroup . Group
//eg.Go(func() error {
// fmt.Println("GameCardSerialNumber", serialNumber)
// fmt.Println("GameCardSerialNumber 更新订单信息:")
// // TODO
// err := orm.Eloquent.Table("order").Where("game_card_serial_number", serialNumber).Where("card_status in (?)", []int{OrderCardStatusReturning, OrderCardStatusPlaying}).
// Updates(map[string]interface{}{
// "card_status": OrderCardStatusCompleted,
// "revert_store_id": m.RevertStoreId,
// "revert_time": time.Now(),
// }).Error
// if err != nil {
// logger.Errorf("err:", err)
// return err
// }
// return nil
//})
eg . Go ( func ( ) error {
//err := orm.Eloquent.Table("game_card_goods").Where("serial_number", m.GameCardSerialNumber).
// Update("status", GameCardGoodsStatusStock,).Error
goodsStatus := GameCardGoodsStatusStock
if gameCardGoods . Status == 7 {
goodsStatus = GameCardGoodsStatusUnusual
}
err := orm . Eloquent . 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 {
logger . Errorf ( "err:" , err )
return err
}
return nil
} )
eg . Go ( func ( ) error {
if 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 = orm . Eloquent . Exec ( sqlStore ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return err
}
var count int64
err := orm . Eloquent . Table ( "game_card_goods_stock" ) . Where ( "store_id" , m . RevertStoreId ) .
Where ( "game_card_id" , gameCardGoods . GameCardId ) . Count ( & count ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return err
}
if count == 0 && ( gameCardGoods . Status != 7 || gameCardGoods . FunctionState != 1 ) {
goodsStock := & GameCardGoodsStock {
StoreId : m . RevertStoreId ,
GameCardId : gameCardGoods . GameCardId ,
StoreStock : 0 ,
RentStock : 1 ,
UserHoldStock : 0 ,
OrderCount : 0 ,
TotalStock : 1 ,
}
err := orm . Eloquent . Create ( goodsStock ) . Error
if err != nil {
logger . Errorf ( "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 = orm . Eloquent . Exec ( sql ) . Error
if err != nil {
logger . Errorf ( "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 = orm . Eloquent . Exec ( sqlStore ) . Error
if err != nil {
logger . Errorf ( "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 = orm . Eloquent . Exec ( sql ) . Error
if err != nil {
logger . Errorf ( "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 := orm . Eloquent . Exec ( sql ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return err
}
}
return nil
} )
eg . Go ( func ( ) error {
err := begin . Table ( "order_card" ) . Where ( "id=?" , orderCard . ID ) . Updates ( & map [ string ] interface { } {
//"store_id": m.StoreId,
"card_status" : OrderCardStatusCompleted ,
"revert_store_id" : m . RevertStoreId ,
"revert_time" : time . Now ( ) ,
} ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return err
}
var count int64
err = orm . Eloquent . Table ( "order_card" ) . Where ( "order_id=?" , orderCard . OrderId ) .
Where ( "card_status in (?)" , [ ] uint32 { 1 , 2 , 3 } ) . Count ( & count ) . Error
//NewOrderCardQuerySet(DB).OrderIdEq(order.ID).CardStatusIn(1, 2, 3).Count()
if err != nil {
logger . Error ( "err:" , err )
return err
}
if count == 0 {
err := begin . Table ( "order" ) . Where ( "id=?" , orderCard . OrderId ) . Updates ( & map [ string ] interface { } {
"card_status" : OrderCardStatusCompleted ,
} ) . Error
if err != nil {
logger . Error ( "err:" , err )
return err
}
}
return nil
} )
eg . Go ( func ( ) error {
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 )
//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 {
logger . Errorf ( "err:" , err )
return err
}
return nil
} )
//orderCard.StoreId
err = eg . Wait ( )
if err != nil {
logger . Errorf ( "err:" , err )
return err
}
err = begin . Commit ( ) . Error
if err != nil {
begin . Rollback ( )
logger . Error ( "err:" , err )
return err
}
return nil
}
func ( * ExpressCompany ) List ( ) ( [ ] ExpressCompany , error ) {
companys := make ( [ ] ExpressCompany , 0 )
err := orm . Eloquent . Table ( "express_company" ) . Order ( "id desc" ) . Find ( & companys ) . Error
if err != nil && err != RecordNotFound {
logger . Error ( "err:" , err )
return companys , err
}
return companys , nil
}
func ( m * Order ) Del ( ) error {
err := orm . Eloquent . Table ( "order" ) . Where ( "id" , m . ID ) . Delete ( m ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return err
}
return nil
}
func ( m * Order ) Refund ( ) error {
var order Order
err := orm . Eloquent . Table ( "order" ) . Where ( "id" , m . ID ) . Find ( & order ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return err
}
if order . CardStatus != OrderCardStatusCancel || order . PayStatus != PayStatusPaid {
logger . Error ( "order card status not cancel paid" )
return errors . New ( "order card status not cancel paid " )
}
err = orm . Eloquent . Table ( "order" ) . Where ( "id" , m . ID ) . Update ( "card_status" , OrderCardStatusRefund ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return err
}
return nil
}
func WxPayTransactionOrderClose ( outTradeNo string ) error {
var (
mchID string = "1609877389" // 商户号
mchCertificateSerialNumber string = "7540301D8FD52CCF7D6267DCF7CD2BC0AB467EFF" // 商户证书序列号
mchAPIv3Key string = "DeovoMingHuiRengTianTang45675123" // 商户APIv3密钥
)
// 微信商户
// 商户ID: 1609877389
// 操作密码: 456755
// 密钥API: DeovoMingHuiRengTianTang45675456
// 密钥APIv3: DeovoMingHuiRengTianTang45675123
// 证书序列号: 7540301D8FD52CCF7D6267DCF7CD2BC0AB467EFF
// 使用 utils 提供的函数从本地文件中加载商户私钥,商户私钥会用来生成请求的签名
privatePath := "/www/wwwroot/dev.admin.deovo.com/admin_server/go-admin/config/merchant/apiclient_key.pem" // TODO 测试
//privatePath := "/www/wwwroot/admin.deovo.com/admin_server/go-admin/config/merchant/apiclient_key.pem" // TODO 正式
mchPrivateKey , err := wechatpayutils . LoadPrivateKeyWithPath ( privatePath )
if err != nil {
//log.Fatal("load merchant private key error")
logger . Errorf ( "err:" , err )
}
ctx := context . Background ( )
// 使用商户私钥等初始化 client, 并使它具有自动定时获取微信支付平台证书的能力
opts := [ ] core . ClientOption {
option . WithWechatPayAutoAuthCipher ( mchID , mchCertificateSerialNumber , mchPrivateKey , mchAPIv3Key ) ,
}
client , err := core . NewClient ( ctx , opts ... )
if err != nil {
//log.Fatalf("new wechat pay client err:%s", err)
logger . Errorf ( "err:" , err )
}
// 发送请求,以下载微信支付平台证书为例
// https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay5_1.shtml
svc := certificates . CertificatesApiService { Client : client }
resp , result , err := svc . DownloadCertificates ( context . Background ( ) )
if err != nil {
logger . Errorf ( "err:" , err )
return err
}
//log.Printf("status=%d resp=%s", result.Response.StatusCode, resp)
logger . Infof ( "status=%d resp=%s" , result . Response . StatusCode , resp )
svcClient := jsapi . JsapiApiService { Client : client }
apiResult , err := svcClient . CloseOrder ( ctx , jsapi . CloseOrderRequest {
OutTradeNo : & outTradeNo ,
Mchid : & mchID ,
} )
if err != nil {
fmt . Println ( "err:" , err )
logger . Error ( err )
return err
}
fmt . Println ( "StatusCode:" , ( * apiResult ) . Response . StatusCode )
//bodyCloseOrder,_ := ioutil.ReadAll((*apiResult.Response.Body))
fmt . Println ( "apiResult:" , ( * apiResult ) . Response . StatusCode )
return nil
}
func IsUserHaveUnreturnedOrders ( uid uint32 ) ( bool , error ) {
fmt . Println ( "uid" , uid )
sql := fmt . Sprintf ( "SELECT COUNT(*) AS count FROM order_card WHERE uid = %d AND pay_status=2 AND card_status IN (1,2,3) ;" , uid )
//sql := fmt.Sprintf("SELECT COUNT(*) AS count FROM order_card 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" `
} { }
orm . Eloquent . Raw ( sql ) . Scan ( unreturned )
fmt . Println ( "订单数量count:" , unreturned . Count )
return unreturned . Count != 0 , nil
}
func ( m * Order ) GetOrderCardMap ( ) ( map [ string ] OrderCard , error ) {
cardMap := make ( map [ string ] OrderCard , 0 )
var orderCards [ ] OrderCard
err := orm . Eloquent . Table ( "order_card" ) .
Where ( "order_id=?" , m . ID ) .
//Where("uid=?", m.Uid).
Find ( & orderCards ) . Error
if err != nil {
logger . Error ( "err:" , err )
return cardMap , err
}
for i , _ := range orderCards {
cardMap [ orderCards [ i ] . SerialNumber ] = orderCards [ i ]
}
return cardMap , nil
}
func ( m * Order ) GetOrderCardGameCardIdList ( ) ( [ ] OrderCard , error ) {
var orderCards [ ] OrderCard
err := orm . Eloquent . Table ( "order_card" ) .
Where ( "order_id=?" , m . ID ) .
Where ( "card_status=?" , OrderCardStatusUnPick ) .
//Where("serial_number=''").
Find ( & orderCards ) . Error
if err != nil {
logger . Error ( "err:" , err )
return orderCards , err
}
return orderCards , nil
}
//func GetOrderCardSerialNumberUnset(list []OrderCard, gameCardId uint32) *OrderCard {
// for i, _ := range list {
// if list[i].GameCardId == gameCardId && list[i].SerialNumber == "" {
// return &list[i]
// }
// }
// return nil
//}
func GetOrderCardMapSerialNumberUnset ( list map [ uint32 ] OrderCard , gameCardId uint32 ) * OrderCard {
for _ , v := range list {
if v . GameCardId == gameCardId && v . SerialNumber == "" {
return & v
}
}
return nil
}
func OrderCardListSetGameInfo ( list [ ] OrderCard ) [ ] OrderCard {
ids := make ( [ ] uint32 , 0 , len ( list ) )
revertStoreIds := make ( [ ] uint32 , 0 , len ( list ) )
for i , _ := range list {
ids = append ( ids , list [ i ] . GameCardId )
revertStoreIds = append ( revertStoreIds , uint32 ( list [ i ] . RevertStoreId ) )
}
if len ( ids ) == 0 {
return list
}
fmt . Println ( "ids:" , ids )
cardMap , err := GameCardMap ( ids )
if err != nil {
logger . Error ( "err:" , err )
return list
}
storeMap , err := RevertStoreMap ( revertStoreIds )
if err != nil {
logger . Error ( "err:" , err )
return list
}
//fmt.Println("cardMap:", cardMap)
//fmt.Println("cardMap:", storeMap)
for i , _ := range list {
gameCard , ok1 := cardMap [ list [ i ] . GameCardId ]
store , ok2 := storeMap [ uint32 ( list [ i ] . RevertStoreId ) ]
if ok1 {
list [ i ] . GameName = gameCard . Name
list [ i ] . GameCoverImg = gameCard . CoverImg
list [ i ] . GamePrice = gameCard . Price
if ok2 {
list [ i ] . RevertStore = & store
}
}
}
return list
}
func GameCardMap ( ids [ ] uint32 ) ( map [ uint32 ] GameCard , error ) {
cardMap := make ( map [ uint32 ] GameCard , 0 )
if len ( ids ) == 0 {
return cardMap , nil
}
var cards [ ] GameCard
err := orm . Eloquent . Table ( "game_card" ) . Where ( "id in (?)" , ids ) . Find ( & cards ) . Error
if err != nil {
logger . Error ( "err:" , err )
return cardMap , err
}
if len ( cards ) == 0 {
return cardMap , nil
}
for i , _ := range cards {
cardMap [ cards [ i ] . ID ] = cards [ i ]
}
return cardMap , nil
}
func RevertStoreMap ( ids [ ] uint32 ) ( map [ uint32 ] Store , error ) {
storeMap := make ( map [ uint32 ] Store , 0 )
if len ( ids ) == 0 {
return storeMap , nil
}
var stores [ ] Store
err := orm . Eloquent . Table ( "store" ) . Where ( "id in (?)" , ids ) . Find ( & stores ) . Error
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 * ExpressNoInfo ) SetStore ( ) {
err := orm . Eloquent . Table ( "store" ) . Where ( "id=?" , m . StoreId ) . Find ( m . Store ) . Error
if err != nil {
logger . Error ( "err:%s" , err )
return
}
}
type FundRecordListReq struct {
Uid uint64 ` json:"uid" `
FundType string ` json:"fund_type" ` // -member_gold -member_platinum -member_black_gold
TransactionId string ` json:"transaction_id" ` // 支付单号
OutTradeNo string ` json:"out_trade_no" `
RefundId string ` json:"refund_id" `
PaymentNo string ` json:"payment_no" `
StartTime time . Time ` json:"start_time" ` // 开始时间
EndTime time . Time ` json:"end_time" ` // 结束时间
Page int ` json:"pageIndex" `
PageSize int ` json:"pageSize" `
}
func ( m * FundRecordListReq ) List ( ) ( [ ] FundRecord , int64 , error ) {
var fundRecords [ ] FundRecord
qs := orm . Eloquent . Table ( "fund_record" )
if m . FundType != "" {
qs = qs . Where ( "fund_type=?" , m . FundType )
}
if m . TransactionId != "" {
qs = qs . Where ( "transaction_id=?" , m . TransactionId )
}
if m . OutTradeNo != "" {
qs = qs . Where ( "out_trade_no=?" , m . OutTradeNo )
}
if m . RefundId != "" {
qs = qs . Where ( "refund_id=?" , m . RefundId )
}
if m . PaymentNo != "" {
qs = qs . Where ( "payment_no=?" , m . PaymentNo )
}
if m . Uid != 0 {
qs = qs . Where ( "uid=?" , m . Uid )
}
if ! m . StartTime . IsZero ( ) {
//fmt.Println("起始时间:", m.StartTime.Unix())
qs = qs . Where ( "created_at > ?" , m . StartTime )
}
if ! m . EndTime . IsZero ( ) {
//fmt.Println("时间:", m.StartTime.Unix())
qs = qs . Where ( "created_at < ?" , m . EndTime )
}
var count int64
err := qs . Count ( & count ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return fundRecords , 0 , err
}
if m . PageSize == 0 {
m . PageSize = 10
}
page := m . Page
pageSize := m . PageSize
page -= 1
if page < 0 {
page = 0
}
err = qs . Order ( "created_at DESC" ) . Offset ( page * pageSize ) . Limit ( pageSize ) . Find ( & fundRecords ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return fundRecords , 0 , err
}
return fundRecords , count , nil
}
type CooperativeOrderReq struct {
CooperativeBusinessId uint32 ` json:"cooperative_business_id" `
Uid uint64 ` json:"uid" `
OrderId uint64 ` json:"order_id" `
GameCardId uint64 ` json:"game_card_id" `
StoreId uint64 ` json:"store_id" ` // 门店id// 游戏id
CardStatus uint8 ` json:"card_status" ` // 1-待取货中 2-游玩中 3-归还中 4-已完成
PayStatus uint8 ` json:"pay_status" `
DeliveryType uint8 ` json:"delivery_type" `
SerialNumber string ` json:"serial_number" ` // 编号
PickupCode string ` json:"pickup_code" ` // 取货码
StartTime time . Time ` json:"start_time" ` // 开始时间
EndTime time . Time ` json:"end_time" ` // 结束时间
Page int ` json:"pageIndex" `
PageSize int ` json:"pageSize" `
}
func ( m * CooperativeOrderReq ) List ( ) ( [ ] Order , int64 , error ) {
var orderCards [ ] OrderCard
orders := make ( [ ] Order , 0 )
if m . PageSize == 0 {
m . PageSize = 10
}
qs := orm . Eloquent . Table ( "order" ) . Where ( "pay_status" , 2 ) .
Where ( "cooperative_business_id=?" , m . CooperativeBusinessId )
isDeliver := true
if m . SerialNumber != "" {
isDeliver = false
err := orm . Eloquent . Table ( "order_card" ) . Where ( "serial_number=?" , m . SerialNumber ) .
Order ( "id DESC" ) . Order ( "card_status ASC" ) . Find ( & orderCards ) . Error
//Where("card_status in (?)", []uint32{2, 3}).Order("id DESC").Order("card_status DESC").Limit(30).Find(&orderCards).Error
if err != nil {
logger . Error ( "err:" , err )
return orders , 0 , err
}
orderIds := make ( [ ] uint32 , 0 )
for i , _ := range orderCards {
orderIds = append ( orderIds , orderCards [ i ] . OrderId )
}
qs = qs . Where ( "id in (?)" , orderIds )
}
if m . PickupCode != "" {
isDeliver = false
qs = qs . Where ( "pickup_code" , m . PickupCode )
}
if m . PayStatus != 0 {
qs = qs . Where ( "pay_status" , m . PayStatus )
}
if m . DeliveryType != 0 {
qs = qs . Where ( "delivery_type" , m . DeliveryType )
}
if m . OrderId != 0 {
isDeliver = false
qs = qs . Where ( "id" , m . OrderId )
}
if isDeliver {
if m . Uid != 0 {
qs = qs . Where ( "uid" , m . Uid )
}
if m . GameCardId != 0 {
qs = qs . Where ( "game_card_id" , m . GameCardId )
}
if m . CardStatus != 0 {
qs = qs . Where ( "card_status" , m . CardStatus )
}
if m . StoreId != 0 {
qs = qs . Where ( "store_id" , m . StoreId )
}
if ! m . StartTime . IsZero ( ) {
fmt . Println ( "起始时间:" , m . StartTime . Unix ( ) )
qs = qs . Where ( "created_at > ?" , m . StartTime )
}
if ! m . EndTime . IsZero ( ) {
fmt . Println ( "时间:" , m . StartTime . Unix ( ) )
qs = qs . Where ( "created_at < ?" , m . EndTime )
}
}
var count int64
err := qs . Count ( & count ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return orders , 0 , err
}
page := m . Page
pageSize := m . PageSize
page -= 1
if page < 0 {
page = 0
}
err = qs . Order ( "created_at DESC" ) . Offset ( page * pageSize ) . Limit ( pageSize ) . Find ( & orders ) . Error
if err != nil {
logger . Errorf ( "err:" , err )
return orders , 0 , err
}
ids := make ( [ ] uint32 , 0 , len ( orders ) )
for i , _ := range orders {
ids = append ( ids , uint32 ( orders [ i ] . ID ) )
}
if len ( ids ) == 0 {
logger . Error ( "gameIds is nil" )
return orders , 0 , err
}
//var orderCards []OrderCard
err = orm . Eloquent . Table ( "order_card" ) . Where ( "order_id in (?)" , ids ) . Find ( & orderCards ) . Error
if err != nil {
logger . Error ( "err:" , err )
return orders , 0 , err
}
orderCards = OrderCardListSetGameInfo ( orderCards )
orderCardsMap := make ( map [ uint32 ] [ ] OrderCard , 0 )
for i , _ := range orderCards {
orderCardsMap [ orderCards [ i ] . OrderId ] = append ( orderCardsMap [ orderCards [ i ] . OrderId ] , orderCards [ i ] )
}
for i , _ := range orders {
if orders [ i ] . CardStatus == 2 || orders [ i ] . CardStatus == 3 {
orders [ i ] . CardStatus = 4
}
v , ok := orderCardsMap [ orders [ i ] . ID ]
if ok {
orders [ i ] . OrderCards = v
}
}
return orders , count , nil
}
2023-09-26 02:51:58 +00:00
func GetUserExpiredCards ( userId [ ] uint32 ) ( map [ uint32 ] [ ] OrderCard , error ) {
var m = make ( map [ uint32 ] [ ] OrderCard )
var oc [ ] OrderCard
err := orm . Eloquent . Table ( "order_card" ) .
Where ( "uid in (?)" , userId ) .
Where ( "pay_status = ?" , 2 ) . Where ( "card_status in ?" , [ ] int { 1 , 2 , 3 } ) .
Find ( & oc ) . Error
if err != nil {
return m , err
}
for _ , card := range oc {
l , ok := m [ card . Uid ]
if ok {
m [ card . Uid ] = append ( l , card )
} else {
m [ card . Uid ] = [ ] OrderCard { card }
}
}
return m , nil
}