Files
affiliate_dash/backend/internal/handler/order.go
T

137 lines
3.6 KiB
Go

package handler
import (
"strconv"
"affiliate_dash/internal/middleware"
"affiliate_dash/internal/model"
"affiliate_dash/internal/pkg/response"
"affiliate_dash/internal/service"
"github.com/gin-gonic/gin"
)
type OrderHandler struct {
svc *service.OrderService
}
func NewOrderHandler(svc *service.OrderService) *OrderHandler {
return &OrderHandler{svc: svc}
}
func (h *OrderHandler) List(c *gin.Context) {
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
size, _ := strconv.Atoi(c.DefaultQuery("size", "20"))
q := service.OrderListQuery{
MerchantID: middleware.GetMerchantID(c),
Page: page,
Size: size,
Status: c.Query("status"),
}
// 分销商只能看自己的订单
if middleware.GetRole(c) == model.RoleDistributor {
id := middleware.GetUserID(c)
q.DistributorID = &id
} else if d := c.Query("distributor_id"); d != "" {
id, _ := strconv.ParseUint(d, 10, 64)
uid := uint(id)
q.DistributorID = &uid
}
list, total, err := h.svc.List(q)
if err != nil {
response.ServerError(c, err.Error())
return
}
response.Page(c, list, total, page, size)
}
type createOrderReq struct {
SkinID uint `json:"skin_id" binding:"required"`
BuyerName string `json:"buyer_name"`
Remark string `json:"remark"`
Status string `json:"status"` // 管理员可指定初始状态(联调造异常单)
DistributorID *uint `json:"distributor_id"` // 管理员可指定分销商
}
func (h *OrderHandler) Create(c *gin.Context) {
var req createOrderReq
if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "参数错误:请选择商品")
return
}
distributorID := middleware.GetUserID(c)
status := ""
// 管理员可指定分销商、任意初始状态(方便联调)
if middleware.GetRole(c) == model.RoleAdmin {
if req.DistributorID != nil && *req.DistributorID > 0 {
distributorID = *req.DistributorID
}
if d := c.Query("distributor_id"); d != "" {
id, _ := strconv.ParseUint(d, 10, 64)
distributorID = uint(id)
}
status = req.Status
}
if req.BuyerName == "" {
req.BuyerName = "测试买家"
}
order, err := h.svc.Create(service.CreateOrderInput{
MerchantID: middleware.GetMerchantID(c),
SkinID: req.SkinID,
DistributorID: distributorID,
BuyerName: req.BuyerName,
Remark: req.Remark,
Status: status,
})
if err != nil {
response.BadRequest(c, err.Error())
return
}
response.OK(c, order)
}
type orderStatusReq struct {
Status string `json:"status" binding:"required"`
}
func (h *OrderHandler) UpdateStatus(c *gin.Context) {
id, _ := strconv.ParseUint(c.Param("id"), 10, 64)
var req orderStatusReq
if err := c.ShouldBindJSON(&req); err != nil {
response.BadRequest(c, "参数错误")
return
}
if err := h.svc.UpdateStatus(middleware.GetMerchantID(c), uint(id), req.Status); err != nil {
response.BadRequest(c, err.Error())
return
}
response.OK(c, nil)
}
func (h *OrderHandler) Dashboard(c *gin.Context) {
stats, err := h.svc.Dashboard(middleware.GetMerchantID(c))
if err != nil {
response.ServerError(c, err.Error())
return
}
response.OK(c, stats)
}
// ListShipLogs 发货推送记录(管理端)
func (h *OrderHandler) ListShipLogs(c *gin.Context) {
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
size, _ := strconv.Atoi(c.DefaultQuery("size", "20"))
list, total, err := h.svc.ListShipLogs(service.ShipLogListQuery{
MerchantID: middleware.GetMerchantID(c),
Page: page,
Size: size,
OrderNo: c.Query("order_no"),
ShipStatus: c.Query("ship_status"),
})
if err != nil {
response.ServerError(c, err.Error())
return
}
response.Page(c, list, total, page, size)
}