完善开放接口日志并修复调试页刷新

This commit is contained in:
yml2213
2026-07-30 18:04:56 +08:00
parent f4f77a5d16
commit 2f0104be07
4 changed files with 82 additions and 14 deletions
+50 -13
View File
@@ -7,6 +7,7 @@ import (
"affiliate_dash/internal/middleware"
"affiliate_dash/internal/model"
"affiliate_dash/internal/pkg/openlog"
"affiliate_dash/internal/pkg/response"
"affiliate_dash/internal/service"
@@ -26,11 +27,14 @@ func NewOpenV1Handler(merchantSvc *service.MerchantService, fulfillmentSvc *serv
func (h *OpenV1Handler) ListProducts(c *gin.Context) {
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
size, _ := strconv.Atoi(c.DefaultQuery("size", "20"))
openlog.Info(c, "list_products start page=%d size=%d", page, size)
list, total, err := h.merchantSvc.ListMerchantProducts(middleware.GetMerchantID(c), page, size, true)
if err != nil {
openlog.Warn(c, "list_products fail err=%v", err)
response.ServerError(c, err.Error())
return
}
openlog.Info(c, "list_products ok total=%d returned=%d", total, len(list))
response.Page(c, list, total, page, size)
}
@@ -45,10 +49,12 @@ type openCreateOrderReq struct {
func (h *OpenV1Handler) CreateOrder(c *gin.Context) {
var req openCreateOrderReq
if err := c.ShouldBindJSON(&req); err != nil {
openlog.Warn(c, "create_order bind_fail err=%v", err)
response.BadRequest(c, "参数错误:client_order_no 与 sku 必填")
return
}
if key := c.GetHeader("Idempotency-Key"); key != "" && key != req.ClientOrderNo {
openlog.Warn(c, "create_order idempotency_key_mismatch header=%s body=%s", key, req.ClientOrderNo)
response.BadRequest(c, "Idempotency-Key 必须与 client_order_no 一致")
return
}
@@ -56,12 +62,15 @@ func (h *OpenV1Handler) CreateOrder(c *gin.Context) {
if len(req.Data) > 0 {
var decoded interface{}
if err := json.Unmarshal(req.Data, &decoded); err != nil {
openlog.Warn(c, "create_order bad_data err=%v", err)
response.BadRequest(c, "data 必须是有效 JSON")
return
}
data = decoded
}
client := middleware.GetAPIClient(c)
openlog.Info(c, "create_order start client_order_no=%s sku=%s quantity=%d buyer=%s",
req.ClientOrderNo, req.SKU, req.Quantity, req.BuyerReference)
result, err := h.fulfillmentSvc.CreateOrder(service.CreateFulfillmentOrderInput{
MerchantID: middleware.GetMerchantID(c),
APIClientID: client.ID,
@@ -72,6 +81,8 @@ func (h *OpenV1Handler) CreateOrder(c *gin.Context) {
RequestData: data,
})
if err != nil {
openlog.Warn(c, "create_order fail client_order_no=%s sku=%s err=%v",
req.ClientOrderNo, req.SKU, err)
response.BadRequest(c, err.Error())
return
}
@@ -79,6 +90,8 @@ func (h *OpenV1Handler) CreateOrder(c *gin.Context) {
if !result.Idempotent {
status = http.StatusCreated
}
openlog.Info(c, "create_order ok order_no=%s idempotent=%v amount=%d",
result.Order.OrderNo, result.Idempotent, result.Order.Amount)
c.JSON(status, response.Body{
Code: 0,
Message: "ok",
@@ -90,8 +103,11 @@ func (h *OpenV1Handler) CreateOrder(c *gin.Context) {
}
func (h *OpenV1Handler) QueryOrder(c *gin.Context) {
order, err := h.fulfillmentSvc.GetOrder(middleware.GetMerchantID(c), c.Param("order_no"))
orderNo := c.Param("order_no")
openlog.Info(c, "query_order start order_no=%s", orderNo)
order, err := h.fulfillmentSvc.GetOrder(middleware.GetMerchantID(c), orderNo)
if err != nil {
openlog.Warn(c, "query_order fail order_no=%s err=%v", orderNo, err)
if err.Error() == "订单不存在" {
response.NotFound(c, err.Error())
return
@@ -99,6 +115,8 @@ func (h *OpenV1Handler) QueryOrder(c *gin.Context) {
response.ServerError(c, err.Error())
return
}
openlog.Info(c, "query_order ok order_no=%s status=%s payment=%s",
order.OrderNo, order.FulfillmentStatus, order.PaymentStatus)
response.OK(c, buildOpenOrderResponse(order))
}
@@ -109,15 +127,20 @@ type openCancelOrderReq struct {
func (h *OpenV1Handler) CancelOrder(c *gin.Context) {
var req openCancelOrderReq
if err := c.ShouldBindJSON(&req); err != nil {
openlog.Warn(c, "cancel_order bind_fail err=%v", err)
response.BadRequest(c, "参数错误")
return
}
orderNo := c.Param("order_no")
openlog.Info(c, "cancel_order start order_no=%s reason=%s", orderNo, req.Reason)
client := middleware.GetAPIClient(c)
order, err := h.fulfillmentSvc.CancelOrder(middleware.GetMerchantID(c), client.ID, c.Param("order_no"), req.Reason)
order, err := h.fulfillmentSvc.CancelOrder(middleware.GetMerchantID(c), client.ID, orderNo, req.Reason)
if err != nil {
openlog.Warn(c, "cancel_order fail order_no=%s err=%v", orderNo, err)
response.BadRequest(c, err.Error())
return
}
openlog.Info(c, "cancel_order ok order_no=%s", order.OrderNo)
response.OK(c, buildOpenOrderResponse(order))
}
@@ -132,6 +155,7 @@ type openShipNotifyReq struct {
func (h *OpenV1Handler) ShipNotify(c *gin.Context) {
var req openShipNotifyReq
if err := c.ShouldBindJSON(&req); err != nil {
openlog.Warn(c, "client_ship_notify bind_fail err=%v", err)
response.BadRequest(c, "参数错误:ship_status 必填")
return
}
@@ -144,12 +168,14 @@ func (h *OpenV1Handler) ShipNotify(c *gin.Context) {
case "failed":
status = model.FulfillmentStatusFailed
default:
openlog.Warn(c, "client_ship_notify bad_status=%s", req.ShipStatus)
response.BadRequest(c, "ship_status 仅支持 processing、success、failed")
return
}
var result interface{}
if len(req.Result) > 0 {
if err := json.Unmarshal(req.Result, &result); err != nil {
openlog.Warn(c, "client_ship_notify bad_result err=%v", err)
response.BadRequest(c, "result 必须是有效 JSON")
return
}
@@ -160,9 +186,12 @@ func (h *OpenV1Handler) ShipNotify(c *gin.Context) {
orderNo = req.OrderNo
}
if orderNo == "" {
openlog.Warn(c, "client_ship_notify missing_order_no")
response.BadRequest(c, "order_no 必填")
return
}
openlog.Info(c, "client_ship_notify start order_no=%s ship_status=%s provider_no=%s",
orderNo, req.ShipStatus, req.ProviderOrderNo)
order, err := h.fulfillmentSvc.UpdateFulfillment(service.FulfillmentUpdateInput{
MerchantID: middleware.GetMerchantID(c),
APIClientID: client.ID,
@@ -173,18 +202,26 @@ func (h *OpenV1Handler) ShipNotify(c *gin.Context) {
ResultData: result,
})
if err != nil {
openlog.Warn(c, "client_ship_notify fail order_no=%s ship_status=%s err=%v",
orderNo, req.ShipStatus, err)
response.BadRequest(c, err.Error())
return
}
openlog.Info(c, "client_ship_notify ok order_no=%s status=%s",
order.OrderNo, order.FulfillmentStatus)
response.OK(c, buildOpenOrderResponse(order))
}
func (h *OpenV1Handler) GetWallet(c *gin.Context) {
openlog.Info(c, "get_wallet start")
wallet, err := h.fulfillmentSvc.GetWallet(middleware.GetMerchantID(c))
if err != nil {
openlog.Warn(c, "get_wallet fail err=%v", err)
response.ServerError(c, err.Error())
return
}
openlog.Info(c, "get_wallet ok balance=%d frozen=%d",
wallet.AvailableBalance, wallet.FrozenBalance)
response.OK(c, wallet)
}
@@ -201,18 +238,18 @@ func buildOpenOrderResponse(order *model.FulfillmentOrder) gin.H {
"sku": order.ProductSKU,
"name": order.ProductName,
},
"quantity": order.Quantity,
"base_amount": order.BaseAmount,
"fee_type": order.FeeType,
"quantity": order.Quantity,
"base_amount": order.BaseAmount,
"fee_type": order.FeeType,
"service_fee_amount": order.ServiceFeeAmount,
"amount": order.Amount,
"currency": order.Currency,
"buyer_reference": order.BuyerReference,
"provider_order_no": order.ProviderOrderNo,
"failure_reason": order.FailureReason,
"created_at": order.CreatedAt,
"delivered_at": order.DeliveredAt,
"cancelled_at": order.CancelledAt,
"amount": order.Amount,
"currency": order.Currency,
"buyer_reference": order.BuyerReference,
"provider_order_no": order.ProviderOrderNo,
"failure_reason": order.FailureReason,
"created_at": order.CreatedAt,
"delivered_at": order.DeliveredAt,
"cancelled_at": order.CancelledAt,
}
if json.Valid([]byte(order.RequestData)) {
data["data"] = json.RawMessage(order.RequestData)