feat(fulfillment): 接入Rock发货平台(0666.pro)代理履约、通用库存池与UID强一致风控
1. 数据库新增 012_rock_fulfillment 迁移,创建 rock_configs 配置表与 rock_tokens 通用库存表,补齐黑色ROCK长袖T恤与蓝色运动服上衣商品目录; 2. 封装 RockClient 与 RockService,实现 0666.pro 平台 Bearer Token 极简连通校验、批量采购50个入库、水位监控巡检与自动补货; 3. 新增 RockProvider 实现标准履约路由,引入 Anti-Ghost 旧绑定基线比对与 UID 强一致门禁,扫错号硬阻断并记录为 mismatch 状态; 4. 针对黑色ROCK与蓝色运动服实现动态发货(绑定后发货前动态选择 skin),并提取腾讯官方发货流水号 fulfillId 对账; 5. 新增全局自动发货总开关(Kill Switch),支持一键软熔断降级转人工接单处理; 6. 前端新增 PlatformRock 管理大屏,提供总开关切换、Token配置与连通测试、库存监控、一键补货及错单解冻重置。
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
package handler
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"affiliate_dash/internal/pkg/response"
|
||||
"affiliate_dash/internal/service"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
type RockHandler struct {
|
||||
rockSvc *service.RockService
|
||||
}
|
||||
|
||||
func NewRockHandler(rockSvc *service.RockService) *RockHandler {
|
||||
return &RockHandler{rockSvc: rockSvc}
|
||||
}
|
||||
|
||||
// GetConfig 获取 Rock 平台配置
|
||||
func (h *RockHandler) GetConfig(c *gin.Context) {
|
||||
cfg, err := h.rockSvc.GetConfig(c.Request.Context())
|
||||
if err != nil {
|
||||
response.ServerError(c, err.Error())
|
||||
return
|
||||
}
|
||||
response.OK(c, cfg)
|
||||
}
|
||||
|
||||
// UpdateConfig 更新 Rock 平台配置
|
||||
func (h *RockHandler) UpdateConfig(c *gin.Context) {
|
||||
var req service.UpdateRockConfigReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
response.BadRequest(c, "参数解析失败")
|
||||
return
|
||||
}
|
||||
cfg, err := h.rockSvc.UpdateConfig(c.Request.Context(), req)
|
||||
if err != nil {
|
||||
response.ServerError(c, err.Error())
|
||||
return
|
||||
}
|
||||
response.OK(c, cfg)
|
||||
}
|
||||
|
||||
type testConnReq struct {
|
||||
BearerToken string `json:"bearer_token"`
|
||||
}
|
||||
|
||||
// TestConnection 测试上游 Token 连通性
|
||||
func (h *RockHandler) TestConnection(c *gin.Context) {
|
||||
var req testConnReq
|
||||
_ = c.ShouldBindJSON(&req)
|
||||
me, err := h.rockSvc.TestConnection(c.Request.Context(), req.BearerToken)
|
||||
if err != nil {
|
||||
response.BadRequest(c, err.Error())
|
||||
return
|
||||
}
|
||||
response.OK(c, me)
|
||||
}
|
||||
|
||||
// GetStats 获取概览数据与库存统计
|
||||
func (h *RockHandler) GetStats(c *gin.Context) {
|
||||
stats, err := h.rockSvc.GetStats(c.Request.Context())
|
||||
if err != nil {
|
||||
response.ServerError(c, err.Error())
|
||||
return
|
||||
}
|
||||
response.OK(c, stats)
|
||||
}
|
||||
|
||||
type purchaseReq struct {
|
||||
Count int `json:"count"`
|
||||
}
|
||||
|
||||
// PurchaseTokens 手动采购并入库 Token
|
||||
func (h *RockHandler) PurchaseTokens(c *gin.Context) {
|
||||
var req purchaseReq
|
||||
if err := c.ShouldBindJSON(&req); err != nil || req.Count <= 0 {
|
||||
req.Count = 50
|
||||
}
|
||||
tokens, err := h.rockSvc.PurchaseTokens(c.Request.Context(), req.Count, false)
|
||||
if err != nil {
|
||||
response.BadRequest(c, err.Error())
|
||||
return
|
||||
}
|
||||
response.OK(c, gin.H{
|
||||
"purchased_count": len(tokens),
|
||||
"message": "采购成功,已批量入库",
|
||||
})
|
||||
}
|
||||
|
||||
// ListTokens 分页获取 Token 库存列表
|
||||
func (h *RockHandler) ListTokens(c *gin.Context) {
|
||||
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
||||
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
|
||||
status := strings.TrimSpace(c.Query("status"))
|
||||
search := strings.TrimSpace(c.Query("search"))
|
||||
|
||||
tokens, total, err := h.rockSvc.ListTokens(c.Request.Context(), page, pageSize, status, search)
|
||||
if err != nil {
|
||||
response.ServerError(c, err.Error())
|
||||
return
|
||||
}
|
||||
response.OK(c, gin.H{
|
||||
"list": tokens,
|
||||
"total": total,
|
||||
"page": page,
|
||||
"page_size": pageSize,
|
||||
})
|
||||
}
|
||||
|
||||
// ResetToken 客服人工重置 mismatch 状态的 Token
|
||||
func (h *RockHandler) ResetToken(c *gin.Context) {
|
||||
idUint, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
||||
if err != nil {
|
||||
response.BadRequest(c, "无效的 Token ID")
|
||||
return
|
||||
}
|
||||
if err := h.rockSvc.ResetMismatchToken(c.Request.Context(), uint(idUint)); err != nil {
|
||||
response.BadRequest(c, err.Error())
|
||||
return
|
||||
}
|
||||
response.OK(c, gin.H{"message": "重置成功,Token 已重新释放至可用库存"})
|
||||
}
|
||||
Reference in New Issue
Block a user