feat: 采购详情展示 PDD 核单结果 (#125)

This commit is contained in:
chengma
2026-08-10 19:59:47 +08:00
parent 3554608513
commit a7bc9a940a
6 changed files with 173 additions and 0 deletions
+64
View File
@@ -345,6 +345,14 @@ type TaskDetailView struct {
QuantityText string
PriceLimitText string
// PDD 核单结果只在采购任务详情显示。付款状态是 Client 核单上报时的快照,
// 不是 Admin 对 PDD 的实时查询结果。
HasPddOrder bool
PddOrderNo string
PddOrderedAt string
PddPaymentStatusText string
PddOrderResultText string
HasError bool
ErrorCode string
ErrorMessage string
@@ -377,6 +385,7 @@ func GetTaskDetail(db *sql.DB, taskID string) (*TaskDetailView, error) {
v.SpecText = specText(t.PddOptions)
v.QuantityText = quantityText(t.Quantity)
v.PriceLimitText = priceLimitText(t.MaxPriceCent)
setPddOrderResult(v, *t)
}
if t.ErrorCode != "" || t.ErrorMessage != "" {
@@ -392,6 +401,61 @@ func GetTaskDetail(db *sql.DB, taskID string) (*TaskDetailView, error) {
return v, nil
}
// purchaseResult 只声明详情页需要展示的字段,避免把 Client 的完整结果结构
// 复制到 Admin。其余原始字段仍保存在 result_data 并可在详情底部展开查看。
type purchaseResult struct {
Purchase *struct {
OrderNo string `json:"order_no"`
OrderedAt string `json:"ordered_at"`
PaymentStatus string `json:"payment_status"`
MatchStatus string `json:"match_status"`
OrderSubmitted bool `json:"order_submitted"`
} `json:"purchase"`
}
// setPddOrderResult 把采购结果翻成模板可直接显示的文字。
// 解析失败只影响结构化摘要,不能阻止详情页打开,也不能隐藏原始 result_data。
func setPddOrderResult(v *TaskDetailView, task model.Task) {
raw := strings.TrimSpace(task.ResultData)
if raw == "" {
switch task.Status {
case model.TaskManualReview:
v.PddOrderResultText = "订单结果不确定,请结合错误信息人工核对。"
case model.TaskFailed, model.TaskCancelled:
v.PddOrderResultText = "任务未产生可展示的 PDD 核单结果。"
default:
v.PddOrderResultText = "等待 Client 核单上报。"
}
return
}
var result purchaseResult
if err := json.Unmarshal([]byte(raw), &result); err != nil || result.Purchase == nil {
v.PddOrderResultText = "采购结果格式异常,请展开完整结果进行诊断。"
return
}
p := result.Purchase
if p.MatchStatus != "matched" || !p.OrderSubmitted {
v.PddOrderResultText = "本次结果没有已匹配的 PDD 订单。"
return
}
if strings.TrimSpace(p.OrderNo) == "" || p.PaymentStatus != "unpaid" {
v.PddOrderResultText = "采购结果格式异常,请展开完整结果进行诊断。"
return
}
orderedAt, ok := model.ParseISO(strings.TrimSpace(p.OrderedAt))
if !ok {
v.PddOrderResultText = "采购结果中的下单时间格式异常,请展开完整结果进行诊断。"
return
}
v.HasPddOrder = true
v.PddOrderNo = strings.TrimSpace(p.OrderNo)
v.PddOrderedAt = orderedAt.Local().Format("2006-01-02 15:04")
v.PddPaymentStatusText = "未付款(Client 上报时)"
v.PddOrderResultText = "Admin 不会查询 PDD 实时付款状态。"
}
func orPlaceholder(s string) string {
if s == "" {
return placeholder