1.增加订单列表导出接口;
2.调整订单列表"卡片状态"查询规则:查询卡片状态时优先查询order_card表,组合同类状态数据返回;同一订单非同一类型数据不返回
This commit is contained in:
parent
5c0b6e2e16
commit
63ff71eedb
5
Makefile
5
Makefile
|
@ -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
|
||||
|
|
|
@ -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, "")
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) // 订单列表导出
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user