qnc-server-tob/app/main/api/internal/logic/query/querylistlogic.go
2025-06-09 13:56:39 +08:00

138 lines
4.5 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 query
import (
"context"
"qnc-server/app/main/api/internal/svc"
"qnc-server/app/main/api/internal/types"
"qnc-server/app/main/model"
"qnc-server/common/ctxdata"
"qnc-server/common/xerr"
"github.com/Masterminds/squirrel"
"github.com/pkg/errors"
"github.com/zeromicro/go-zero/core/logx"
)
type QueryListLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewQueryListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryListLogic {
return &QueryListLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *QueryListLogic) QueryList(req *types.QueryListReq) (resp *types.QueryListResp, err error) {
userID, getUidErr := ctxdata.GetUidFromCtx(l.ctx)
if getUidErr != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "订单列表查询, 获取用户信息失败, %+v", getUidErr)
}
// 构建子查询查找在query表中有记录的order_id
querySubQuery := squirrel.Select("order_id").From("query")
// 构建子查询查找在authorization表中状态为pending的order_id
authSubQuery := squirrel.Select("order_id").
From("authorization").
Where(squirrel.Eq{"status": model.AuthorizationStatusPending})
// 构建主查询条件
build := l.svcCtx.OrderModel.SelectBuilder().Where(squirrel.And{
squirrel.Eq{
"user_id": userID,
},
squirrel.NotEq{
"status": model.OrderStatusPending,
},
squirrel.Or{
// 在query表中有记录
squirrel.Expr("id IN (?)", querySubQuery),
// 或者在query表中没有记录但在authorization表中状态为pending
squirrel.And{
squirrel.Expr("id NOT IN (?)", querySubQuery),
squirrel.Expr("id IN (?)", authSubQuery),
},
},
})
// 从订单表分页查询
orderList, total, err := l.svcCtx.OrderModel.FindPageListByPageWithTotal(l.ctx, build, req.Page, req.PageSize, "create_time DESC")
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "订单列表查询, 查找订单列表错误, %+v", err)
}
var list []types.Query
if len(orderList) > 0 {
for _, orderModel := range orderList {
var query types.Query
query.CreateTime = orderModel.CreateTime.Format("2006-01-02 15:04:05")
query.UpdateTime = orderModel.UpdateTime.Format("2006-01-02 15:04:05")
// 设置订单ID
query.OrderId = orderModel.Id
query.UserId = orderModel.UserId
query.OrderNo = orderModel.OrderNo
// 获取商品信息
product, findProductErr := l.svcCtx.ProductModel.FindOne(l.ctx, orderModel.ProductId)
if findProductErr != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "订单列表查询, 获取商品信息失败, %+v", findProductErr)
}
query.ProductName = product.ProductName
// 设置订单支付状态
query.IsPaid = orderModel.Status == model.OrderStatusPaid
// 判断订单是否已退款
query.IsRefunded = orderModel.Status == model.OrderStatusRefunded
// 查询查询状态
queryInfo, findQueryErr := l.svcCtx.QueryModel.FindOneByOrderId(l.ctx, orderModel.Id)
if findQueryErr != nil && !errors.Is(findQueryErr, model.ErrNotFound) {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "订单列表查询, 获取查询信息失败, %+v", findQueryErr)
}
if errors.Is(findQueryErr, model.ErrNotFound) {
query.QueryState = "未创建"
query.IsQueryCompleted = false
// 获取授权状态
authInfo, findAuthErr := l.svcCtx.AuthorizationModel.FindOneByOrderId(l.ctx, orderModel.Id)
if findAuthErr != nil && !errors.Is(findAuthErr, model.ErrNotFound) {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "订单列表查询, 获取授权信息失败, %+v", findAuthErr)
}
if errors.Is(findAuthErr, model.ErrNotFound) {
query.IsAuthCompleted = true
} else {
// 授权存在
query.IsAuthCompleted = authInfo.Status == model.AuthorizationStatusSuccess
}
} else {
// 查询存在
query.Id = queryInfo.Id
query.QueryState = queryInfo.QueryState
query.IsQueryCompleted = queryInfo.QueryState == model.QueryStateSuccess
// 获取授权状态
authInfo, findAuthErr := l.svcCtx.AuthorizationModel.FindOneByOrderId(l.ctx, orderModel.Id)
if findAuthErr == nil {
// 授权存在
query.IsAuthCompleted = authInfo.Status == model.AuthorizationStatusSuccess
} else {
// 查询存在但授权不存在,视为已授权
query.IsAuthCompleted = true
}
}
list = append(list, query)
}
}
return &types.QueryListResp{
Total: total,
List: list,
}, nil
}