feat: 支持采购任务追溯并安全重新创建 (#186)

This commit is contained in:
chengma
2026-08-12 16:26:22 +08:00
parent 836aad5c26
commit 69bcf6116a
13 changed files with 298 additions and 57 deletions
+52 -23
View File
@@ -61,6 +61,31 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw,
"读取顺运宝货运单列表失败,数据没有被改动。刷新页面重试;一直失败请把这句话报给维护者。")
return
}
purchaseRows := append([]service.SybOrderView(nil), result.Rows...)
openSybID := strings.TrimSpace(c.Query("open_syb_id"))
openPurchaseSybID := ""
if openSybID != "" && c.Query("purchase_intent") == "1" {
focused, err := service.GetSybOrderView(h.db, openSybID)
if err != nil {
fail(c, http.StatusInternalServerError,
"读取原货运单采购信息失败,数据没有被改动。刷新页面重试。")
return
}
if focused != nil && focused.CanPurchase {
found := false
for _, row := range purchaseRows {
if row.SybID == focused.SybID {
found = true
break
}
}
if !found {
purchaseRows = append(purchaseRows, *focused)
}
openPurchaseSybID = focused.SybID
openSybID = ""
}
}
history, err := service.ListSybSyncHistory(h.db, service.ParsePage(c.Query("history_page")))
if err != nil {
fail(c, http.StatusInternalServerError,
@@ -161,28 +186,31 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw,
}
c.HTML(http.StatusOK, "syb/list", page(c, "syb", "顺运宝数据", gin.H{
"Keyword": keyword,
"ShopFilter": shop,
"StageFilter": stage,
"StageOptions": service.SybStageOptions(),
"CurrentPage": result.Page,
"Rows": result.Rows,
"Status": status,
"HasAny": result.HasAny,
"IsFiltered": result.IsFiltered,
"NeedLogin": needLogin,
"NeedLoginReason": loginReason,
"LoginHint": loginHint,
"Username": username,
"ConfigProblem": configProblem,
"Today": today,
"SyncDateFrom": dateFrom,
"SyncDateTo": dateTo,
"RangeError": c.Query("range_error"),
"RangeWarning": rangeWarning,
"SyncRunning": syncStatus.Running,
"SyncHistory": history,
"NeedSyncHistory": c.Query("history") == "1",
"Keyword": keyword,
"ShopFilter": shop,
"StageFilter": stage,
"StageOptions": service.SybStageOptions(),
"CurrentPage": result.Page,
"Rows": result.Rows,
"PurchaseRows": purchaseRows,
"OpenSybID": openSybID,
"OpenPurchaseSybID": openPurchaseSybID,
"Status": status,
"HasAny": result.HasAny,
"IsFiltered": result.IsFiltered,
"NeedLogin": needLogin,
"NeedLoginReason": loginReason,
"LoginHint": loginHint,
"Username": username,
"ConfigProblem": configProblem,
"Today": today,
"SyncDateFrom": dateFrom,
"SyncDateTo": dateTo,
"RangeError": c.Query("range_error"),
"RangeWarning": rangeWarning,
"SyncRunning": syncStatus.Running,
"SyncHistory": history,
"NeedSyncHistory": c.Query("history") == "1",
"HistoryFetchURL": sybHistoryPartialURL(history.Page,
keyword, shop, stage, dateFrom, dateTo),
"HistoryPagination": sybHistoryPagination(history.Page, history.TotalPages,
@@ -805,7 +833,8 @@ func (h *Handler) TaskList(c *gin.Context) {
// TaskDetail 渲染双击行弹出的只读详情弹窗内容(不是整页)。
//
// `[必须]` 只读。改派 / 重试 / 取消是后续工单的范围,这里不提供入口。
// `[必须]` 字段只读,不提供改派 / 重试 / 取消或直接创建入口。失败/取消采购
// 只生成返回原顺运宝明细的导航链接,真正创建仍走原确认表单和服务端门禁。
// 弹窗机制复用 #18 已有的那套(static/js/app.js 的 setupRowDetail),
// 不新造一套。
func (h *Handler) TaskDetail(c *gin.Context) {