feat:采购日志

This commit is contained in:
2026-10-31 12:24:00 +08:00
parent a7f8f9c639
commit 8f30e6fe57
17 changed files with 1241 additions and 32 deletions
+60 -1
View File
@@ -2,6 +2,7 @@ package handler
import (
"errors"
"fmt"
"strconv"
"strings"
@@ -100,12 +101,70 @@ func (h *RockHandler) PurchaseTokens(c *gin.Context) {
response.BadRequest(c, err.Error())
return
}
summary := h.rockSvc.LastPurchaseSummary()
message := "采购成功,已批量入库"
planned := len(tokens)
limitReason := ""
if summary != nil {
planned = summary.PlannedCount
limitReason = summary.LimitReason
switch summary.LimitReason {
case "upstream_stock":
message = fmt.Sprintf("上游货源不足,已按 %d 个采购", summary.PlannedCount)
case "points":
message = fmt.Sprintf("积分不足,已按 %d 个采购", summary.PlannedCount)
case "points_and_stock":
message = fmt.Sprintf("积分与上游库存不足,已按 %d 个采购", summary.PlannedCount)
case "points_snapshot":
message = fmt.Sprintf("积分不足(按快照估算),已按 %d 个采购", summary.PlannedCount)
}
}
response.OK(c, gin.H{
"purchased_count": len(tokens),
"message": "采购成功,已批量入库",
"requested_count": req.Count,
"planned_count": planned,
"limit_reason": limitReason,
"log_id": summaryLogID(summary),
"message": message,
})
}
func summaryLogID(summary *service.PurchaseSummary) uint {
if summary == nil {
return 0
}
return summary.LogID
}
// ListPurchaseLogs 分页查询采购流水
func (h *RockHandler) ListPurchaseLogs(c *gin.Context) {
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
triggerType := strings.TrimSpace(c.Query("trigger_type"))
status := strings.TrimSpace(c.Query("status"))
list, total, err := h.rockSvc.ListPurchaseLogs(c.Request.Context(), page, pageSize, triggerType, status)
if err != nil {
response.ServerError(c, err.Error())
return
}
response.OK(c, gin.H{"list": list, "total": total})
}
// GetPurchaseLog 查询单次采购详情(含各阶段原始报文)
func (h *RockHandler) GetPurchaseLog(c *gin.Context) {
id, err := strconv.ParseUint(c.Param("id"), 10, 64)
if err != nil || id == 0 {
response.BadRequest(c, "无效的日志 ID")
return
}
entry, stages, err := h.rockSvc.GetPurchaseLog(c.Request.Context(), uint(id))
if err != nil {
response.NotFound(c, "采购日志不存在")
return
}
response.OK(c, gin.H{"log": entry, "stages": stages})
}
// ListTokens 分页获取 Token 库存列表
func (h *RockHandler) ListTokens(c *gin.Context) {
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))