1.增加订单列表导出接口;

2.调整订单列表"卡片状态"查询规则:查询卡片状态时优先查询order_card表,组合同类状态数据返回;同一订单非同一类型数据不返回
This commit is contained in:
chenlin 2023-12-14 10:29:22 +08:00
parent 5c0b6e2e16
commit 63ff71eedb
4 changed files with 404 additions and 7 deletions

View File

@ -19,3 +19,8 @@ build:
build:
GOOS=linux GOARCH=amd64 go build -o go-admin main.go
dev:
GOOS=linux GOARCH=amd64 go build -o dev_mh_goadmin_server main.go
pro:
GOOS=linux GOARCH=amd64 go build -o mh_goadmin_server main.go

View File

@ -35,7 +35,7 @@ func OrderList(c *gin.Context) {
//
//}
list, count, err := req.List()
list, count, _, err := req.List(0)
if err != nil {
logger.Errorf("err:", logger.Field("err", err))
app.Error(c, http.StatusInternalServerError, err, "查询失败")
@ -264,3 +264,35 @@ func FundRecordList(c *gin.Context) {
}
app.OK(c, ret, "")
}
// OrderListExport 导出订单列表
// @Summary 导出订单列表
// @Tags 订单管理
// @Produce json
// @Accept json
// @Param request body models.OrderListReq true "导出订单列表模型"
// @Success 200 {object} app.Response "{"code": 200, "data": { "export_url": "" }}"
// @Router /api/v1/order/list_export [post]
func OrderListExport(c *gin.Context) {
req := &models.OrderListReq{}
if c.ShouldBindJSON(req) != nil {
logger.Errorf("para err")
app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
return
}
reqJson, _ := json.Marshal(req)
fmt.Println("reqJson:", string(reqJson))
_, _, filePath, err := req.List(1)
if err != nil {
logger.Errorf("OrderListExport err:", logger.Field("err", err))
app.Error(c, http.StatusInternalServerError, err, "导出失败")
return
}
ret := map[string]interface{}{
"export_url": filePath,
}
app.OK(c, ret, "")
}

View File

@ -10,10 +10,12 @@ import (
"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"
"golang.org/x/sync/errgroup"
"gorm.io/gorm"
"time"
)
@ -185,10 +187,10 @@ 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"`
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"` // 开始时间
@ -200,7 +202,7 @@ type OrderListReq struct {
//type OrderListResp struct {
//}
func (m *OrderListReq) List() ([]Order, int64, error) {
func (m *OrderListReq) List_bak() ([]Order, int64, error) {
//orderInfos := make([]OrderInfo, 0)
var orderCards []OrderCard
orders := make([]Order, 0)
@ -353,6 +355,363 @@ func (m *OrderListReq) List() ([]Order, int64, error) {
return orders, count, nil
}
func (m *OrderListReq) List(exportFlag int) ([]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)
} else {
orders, count, err = m.queryListFormOrder(exportFlag)
}
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) ([]Order, int64, error) {
var orderCards []OrderCard
orders := make([]Order, 0)
qs := orm.Eloquent.Table("order_card").Where("card_status=?", m.CardStatus)
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) ([]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)
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", "游戏卡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,
list[rowId].OrderCards[i].GameCardId,
list[rowId].OrderCards[i].GameName,
cardState}
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:", fileName)
if err := file.SaveAs("/www/server/images/export/" + 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

View File

@ -31,7 +31,8 @@ func registerOrderManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMi
//}
order := v1.Group("/order")
{
order.POST("/list", ordermanage.OrderList) // 订单列表
order.POST("/list", ordermanage.OrderList) // 订单列表
order.POST("/list_export", ordermanage.OrderListExport) // 订单列表导出
}
}