mh_goadmin_server/app/admin/models/order.go
chenlin 0a5fe58bbe 优化生产反馈缺陷:
1.小程序调用erp登录接口不判断验证码;
2.修改原接口的翻页相关字段;
3.修复float64转int32精度丢失的缺陷;
4.注释库存导入时采购价需大于0的校验;
5.相关域名改成生产环境域名;
2024-07-03 18:56:33 +08:00

1776 lines
57 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package models
import (
"context"
"encoding/json"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"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"
"github.com/xuri/excelize/v2"
"go-admin/app/admin/models/kuaidi"
orm "go-admin/common/global"
"go-admin/logger"
"go-admin/tools"
"go-admin/tools/config"
"golang.org/x/sync/errgroup"
"gorm.io/gorm"
"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:"-"`
DeliverShopperCode string `json:"deliver_shopper_code" gorm:"-"` //发货店员码
RevertShopperCode string `json:"revert_shopper_code" gorm:"-"`
PhoneExt string `json:"phone_ext" gorm:"-"`
User *UserInfo `json:"user" gorm:"foreignKey:uid;references:uid"`
}
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:"-"` // 归还门店
DeliverShopperCode string `json:"deliver_shopper_code"` //发货店员码
RevertShopperCode string `json:"revert_shopper_code"` //收货识别码
DeliverShopper *ShopperPromotionCode `json:"deliver_shopper" gorm:"foreignKey:deliver_shopper_code;references:code"` //发货店员
RevertShopper *ShopperPromotionCode `json:"revert_shopper" gorm:"foreignKey:revert_shopper_code;references:code"` //收货店员
GameCard *GameCard `json:"game_card" gorm:"foreignKey:game_card_id;references:id"` //卡带信息
}
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-已完成 5-已取消
PayStatus uint8 `json:"pay_status"` // 支付状态 1-未支付 2-已支付
DeliveryType uint8 `json:"delivery_type"` // 取货类型 1-门店自取 2-快递
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 *OrderListReq) List(exportFlag int, c *gin.Context) ([]Order, int64, string, error) {
orders := make([]Order, 0)
if m.PageSize == 0 {
m.PageSize = 10
}
var count int64
var err error
// 如果卡片类型不为空则优先查询order_card表
if m.CardStatus != 0 {
orders, count, err = m.queryListFormOrderCard(exportFlag, c)
} else {
orders, count, err = m.queryListFormOrder(exportFlag, c)
}
filePath := ""
if exportFlag == 1 {
filePath, err = OrderListExport(orders)
if err != nil {
logger.Error("OrderListExport err:", logger.Field("err", err))
return orders, 0, "", err
}
}
return orders, count, filePath, nil
}
func (m *OrderListReq) queryListFormOrderCard(exportFlag int, c *gin.Context) ([]Order, int64, error) {
var orderCards []OrderCard
orders := make([]Order, 0)
qs := orm.Eloquent.Table("order_card").Where("card_status=?", m.CardStatus)
// 非管理员才判断所属门店
if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") {
sysUser, err := GetSysUserByCtx(c)
if err != nil {
return nil, 0, err
}
// 返回sysUser未过期的门店id列表
storeList := GetValidStoreIDs(sysUser.StoreData)
if m.StoreId != 0 {
if !Contains(storeList, uint32(m.StoreId)) {
return nil, 0, errors.New("您没有该门店权限")
}
} else {
if len(storeList) > 0 {
if len(storeList) == 1 {
qs = qs.Where("store_id = ?", storeList[0])
} else {
qs = qs.Where("store_id IN (?)", storeList)
}
} else {
return nil, 0, errors.New("用户未绑定门店")
}
}
}
if m.SerialNumber != "" {
qs = qs.Where("serial_number=?", m.SerialNumber)
}
if m.DeliveryType != 0 { // 共有
qs = qs.Where("delivery_type", m.DeliveryType)
}
if m.Uid != 0 { // 用户id共有
qs = qs.Where("uid", m.Uid)
}
if m.GameCardId != 0 { // 游戏卡id共有
qs = qs.Where("game_card_id", m.GameCardId)
}
if m.StoreId != 0 { // 门店id共有
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)
}
err := qs.Find(&orderCards).Error
if err != nil {
logger.Error("err:", logger.Field("err", err))
return nil, 0, err
}
orderIds := make([]uint32, 0)
for i, _ := range orderCards {
orderIds = append(orderIds, orderCards[i].OrderId)
}
orderQs := orm.Eloquent.Table("order").Where("pay_status", 2).Where("id in (?)", orderIds)
var count int64
err = orderQs.Count(&count).Error
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
return nil, 0, err
}
page := m.Page
pageSize := m.PageSize
page -= 1
if page < 0 {
page = 0
}
if exportFlag == 1 { //一次性导出excel
orderQs = orderQs.Preload("User").Order("created_at DESC")
} else {
orderQs = orderQs.Preload("User").Order("created_at DESC").Offset(page * pageSize).Limit(pageSize)
}
err = orderQs.Find(&orders).Error
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
return nil, 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 nil, 0, err
}
err = orm.Eloquent.Table("order_card").Where("order_id in (?)", ids).Find(&orderCards).Error
if err != nil {
logger.Error("err:", logger.Field("err", err))
return nil, 0, err
}
orderCards = OrderCardListSetGameInfo(orderCards)
orderCardsMap := make(map[uint32][]OrderCard, 0)
for i, _ := range orderCards {
if orderCards[i].CardStatus == m.CardStatus { //卡片状态相同的租卡订单才返回,方便财务导出数据
orderCardsMap[orderCards[i].OrderId] = append(orderCardsMap[orderCards[i].OrderId], orderCards[i])
}
}
for i, _ := range orders {
//2023-12-12 跟产品讨论后确认状态按原来的5种进行展示
//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
}
func (m *OrderListReq) queryListFormOrder(exportFlag int, c *gin.Context) ([]Order, int64, error) {
var orderCards []OrderCard
orders := make([]Order, 0)
if m.PageSize == 0 {
m.PageSize = 10
}
var qs *gorm.DB
qs = orm.Eloquent.Table("order").Where("pay_status", 2)
// 非管理员才判断所属门店
if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") {
sysUser, err := GetSysUserByCtx(c)
if err != nil {
return nil, 0, err
}
// 返回sysUser未过期的门店id列表
storeList := GetValidStoreIDs(sysUser.StoreData)
if m.StoreId != 0 {
if !Contains(storeList, uint32(m.StoreId)) {
return nil, 0, errors.New("您没有该门店权限")
}
} else {
if len(storeList) > 0 {
if len(storeList) == 1 {
qs = qs.Where("store_id = ?", storeList[0])
} else {
qs = qs.Where("store_id IN (?)", storeList)
}
} else {
return nil, 0, errors.New("用户未绑定门店")
}
}
}
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:", logger.Field("err", err))
return nil, 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.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:", logger.Field("err", err))
return nil, 0, err
}
page := m.Page
pageSize := m.PageSize
page -= 1
if page < 0 {
page = 0
}
if exportFlag == 1 { //一次性导出excel
qs = qs.Preload("User").Order("created_at DESC")
} else {
qs = qs.Preload("User").Order("created_at DESC").Offset(page * pageSize).Limit(pageSize)
}
err = qs.Find(&orders).Error
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
return nil, 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 nil, 0, err
}
err = orm.Eloquent.Table("order_card").Where("order_id in (?)", ids).Find(&orderCards).Error
if err != nil {
logger.Error("err:", logger.Field("err", err))
return nil, 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 {
//2023-12-12 跟产品讨论后确认状态按原来的5种进行展示
//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
}
// OrderListExport 导出订单列表
func OrderListExport(list []Order) (string, error) {
file := excelize.NewFile()
streamWriter, err := file.NewStreamWriter("Sheet1")
if err != nil {
fmt.Println(err)
}
url := ExportUrl
fileName := time.Now().Format(TimeFormat) + "租赁订单" + ".xlsx"
fmt.Println("url fileName:", url+fileName)
title := []interface{}{"租赁ID", "用户ID", "会员剩余时长", "取货方式", "状态", "取货码", "实付款", "下单时间", "游戏卡ID",
"游戏名称", "游戏卡状态", "商品串码"}
cell, _ := excelize.CoordinatesToCellName(1, 1)
if err = streamWriter.SetRow(cell, title); err != nil {
fmt.Println(err)
}
var row []interface{}
nExcelStartRow := 0
for rowId := 0; rowId < len(list); rowId++ {
state := "待取货"
switch list[rowId].CardStatus {
case 2:
state = "游玩中"
case 3:
state = "归还中"
case 4:
state = "已完成"
case 5:
state = "已取消"
}
deliveryType := "门店自提"
switch list[rowId].DeliveryType {
case 1:
deliveryType = "门店自提"
case 2:
deliveryType = "物流配送"
}
// user有可能为空
memberExpire := ""
if list[rowId].User != nil {
memberExpire = calculateRemainingDays(*list[rowId].User.MemberExpire)
}
for i := 0; i < len(list[rowId].OrderCards); i++ {
cardState := "待取货"
switch list[rowId].OrderCards[i].CardStatus {
case 2:
cardState = "游玩中"
case 3:
cardState = "归还中"
case 4:
cardState = "已完成"
case 5:
cardState = "已取消"
}
row = []interface{}{
list[rowId].ID,
list[rowId].Uid,
memberExpire,
deliveryType,
state,
list[rowId].PickupCode,
list[rowId].PayPrice,
list[rowId].PayTime,
//list[rowId].OrderCards[i].ID, // 租赁卡ID不导出
list[rowId].OrderCards[i].GameCardId,
list[rowId].OrderCards[i].GameName,
cardState,
list[rowId].OrderCards[i].SerialNumber,
}
cell, _ := excelize.CoordinatesToCellName(1, nExcelStartRow+2)
if err := streamWriter.SetRow(cell, row); err != nil {
fmt.Println(err)
}
nExcelStartRow++
}
}
if err := streamWriter.Flush(); err != nil {
fmt.Println(err)
}
fmt.Println("save fileName:", config.ExportConfig.Path+fileName)
if err := file.SaveAs(config.ExportConfig.Path + fileName); err != nil {
fmt.Println(err)
}
return url + fileName, nil
}
// 计算剩余时长
func calculateRemainingDays(expirationTime time.Time) string {
currentTime := time.Now()
remainingTime := expirationTime.Sub(currentTime)
// 如果过期时间在当前时间之前返回0天
if remainingTime < 0 {
return "0天"
}
remainingDays := int(remainingTime.Hours() / 24)
return fmt.Sprintf("%d天", remainingDays)
}
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:", logger.Field("err", err))
return ret, err
}
var orderCards []OrderCard
err = orm.Eloquent.Table("order_card").
Preload("DeliverShopper").
Preload("DeliverShopper.User").
Preload("RevertShopper").
Preload("RevertShopper.User").
Where("order_id=?", m.ID).
Find(&orderCards).
Error
if err != nil {
logger.Error("err:", logger.Field("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:", logger.Field("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:",logger.Field("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:", logger.Field("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:", logger.Field("err", err))
return err
}
userInfoCh <- userInfo
return nil
})
err = eg.Wait()
if err != nil {
logger.Errorf("err:", logger.Field("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:", logger.Field("err", err))
return err, ""
}
fmt.Println("Order:", m)
cards, err := m.GetOrderCardGameCardIdList()
if err != nil {
logger.Error("err:", logger.Field("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:", logger.Field("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:",logger.Field("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:", logger.Field("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:",logger.Field("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:", logger.Field("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:", logger.Field("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:%s", err.Error())
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:",logger.Field("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:", logger.Field("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:", logger.Field("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:",logger.Field("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:",logger.Field("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,
"deliver_shopper_code": m.DeliverShopperCode,
}).Error
if err != nil {
begin.Rollback()
logger.Errorf("err:", logger.Field("err", err))
return err
}
delete(orderCardMaps, orderCard.ID)
return nil
})
err = eg.Wait()
if err != nil {
begin.Rollback()
logger.Errorf("err:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:",logger.Field("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").Preload("User").Where("id", m.ID).Find(&order).Error
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
return err
}
if m.PhoneExt != "" && !order.User.CheckPhoneExt(m.PhoneExt, 4) {
return errors.New("手机尾号校验不正确")
}
cardMap, err := order.GetOrderCardMap()
if err != nil {
logger.Error("err:", logger.Field("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", logger.Field("err", err))
return err
}
if issueCount > 0 {
logger.Error("untreated_issue_feedback")
return errors.New("请先检测用户反馈问题卡")
}
//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", logger.Field("err", 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:",logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("err", err))
return err
}
}
return nil
})
eg.Go(func() error {
if m.RevertExpressNo != "" { // 物流单号不为空则记录到数据库2024/2/1 产品新需求,解决用户物流归还但小程序不提交归还信息,店员要输入手机号的问题
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(),
"revert_shopper_code": m.RevertShopperCode,
"revert_express_no": m.RevertExpressNo,
}).Error
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
return err
}
} else {
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(),
"revert_shopper_code": m.RevertShopperCode,
}).Error
if err != nil {
logger.Errorf("err:", logger.Field("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).Total()
if err != nil {
logger.Error("err:", logger.Field("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:", logger.Field("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:", logger.Field("err", err))
return err
}
return nil
})
//orderCard.StoreId
err = eg.Wait()
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
return err
}
err = begin.Commit().Error
if err != nil {
begin.Rollback()
logger.Error("err:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("err", err))
return err
}
return nil
}
func WxPayTransactionOrderClose(outTradeNo string) error {
var (
mchID string = "1609877389" // 商户号
mchCertificateSerialNumber string = "7540301D8FD52CCF7D6267DCF7CD2BC0AB467EFF" // 商户证书序列号
mchAPIv3Key string = "DeovoMingHuiRengTianTang45675123" // 商户APIv3密钥
)
// 微信商户
// 商户ID1609877389
// 操作密码456755
// 密钥APIDeovoMingHuiRengTianTang45675456
// 密钥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:", logger.Field("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",logger.Field("err",err))
logger.Errorf("err:", logger.Field("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:", logger.Field("err", err))
return err
}
//log.Printf("status=%d resp=%s", result.Response.StatusCode, resp)
logger.Info("WxPayTransactionOrderClose", logger.Field("status", result.Response.StatusCode), logger.Field("resp", resp))
svcClient := jsapi.JsapiApiService{Client: client}
apiResult, err := svcClient.CloseOrder(ctx, jsapi.CloseOrderRequest{
OutTradeNo: &outTradeNo,
Mchid: &mchID,
})
if err != nil {
fmt.Println("err:", logger.Field("err", err))
logger.Error(err.Error())
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).Total()
//if err != nil {
// logger.Error("err:",logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("err", err))
return list
}
storeMap, err := RevertStoreMap(revertStoreIds)
if err != nil {
logger.Error("err:", logger.Field("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:", logger.Field("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:", logger.Field("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", logger.Field("err", 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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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:", logger.Field("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
}
func GetUserExpiredCards(userId []uint32) (map[uint32][]OrderCard, error) {
var m = make(map[uint32][]OrderCard)
var oc []OrderCard
err := orm.Eloquent.Table("order_card").
Preload("GameCard").
Where("uid in (?)", userId).
Where("pay_status = ?", HavePaid).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
}