fix: 同步记录弹窗改为局部刷新 (#62)

This commit is contained in:
chengma
2026-08-09 21:02:28 +08:00
parent ee1e060e3a
commit d8a24247df
9 changed files with 243 additions and 62 deletions
+51 -1
View File
@@ -156,14 +156,39 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw,
"SyncRunning": syncStatus.Running,
"SyncHistory": history,
"NeedSyncHistory": c.Query("history") == "1",
"HistoryRefreshURL": sybHistoryURL(history.Page,
"HistoryFetchURL": sybHistoryPartialURL(history.Page,
keyword, dateFrom, dateTo),
"HistoryPagination": sybHistoryPagination(history.Page, history.TotalPages,
keyword, dateFrom, dateTo),
"HistoryFetchPagination": sybHistoryPartialPagination(history.Page, history.TotalPages,
keyword, dateFrom, dateTo),
"Pagination": service.NewPaginationView(result.Page, result.TotalPages, values.Encode()),
}))
}
// SybSyncHistory 只返回同步记录弹窗内部的 HTML。它只读本地数据库,不调用
// 顺运宝;完整页面和局部刷新共用同一份模板,避免字段或分页标记漂移。
func (h *Handler) SybSyncHistory(c *gin.Context) {
c.Header("Cache-Control", "no-store")
keyword := c.Query("order_no")
dateFrom := c.Query("date_from")
dateTo := c.Query("date_to")
history, err := service.ListSybSyncHistory(h.db, service.ParsePage(c.Query("history_page")))
if err != nil {
c.String(http.StatusInternalServerError, "读取同步记录失败,请稍后重试")
return
}
c.HTML(http.StatusOK, "syb/history_partial", gin.H{
"SyncHistory": history,
"HistoryFetchURL": sybHistoryPartialURL(history.Page,
keyword, dateFrom, dateTo),
"HistoryPagination": sybHistoryPagination(history.Page, history.TotalPages,
keyword, dateFrom, dateTo),
"HistoryFetchPagination": sybHistoryPartialPagination(history.Page, history.TotalPages,
keyword, dateFrom, dateTo),
})
}
func sybHistoryPagination(pageNum, totalPages int, keyword, dateFrom, dateTo string) service.PaginationView {
link := func(target int) string { return sybHistoryURL(target, keyword, dateFrom, dateTo) }
view := service.PaginationView{
@@ -189,6 +214,31 @@ func sybHistoryURL(pageNum int, keyword, dateFrom, dateTo string) string {
return "/syb?" + values.Encode()
}
func sybHistoryPartialPagination(pageNum, totalPages int, keyword, dateFrom, dateTo string) service.PaginationView {
link := func(target int) string { return sybHistoryPartialURL(target, keyword, dateFrom, dateTo) }
view := service.PaginationView{
Page: pageNum, TotalPages: totalPages, HasPrev: pageNum > 1, HasNext: pageNum < totalPages,
FirstURL: link(1), LastURL: link(totalPages),
}
if view.HasPrev {
view.PrevURL = link(pageNum - 1)
}
if view.HasNext {
view.NextURL = link(pageNum + 1)
}
return view
}
func sybHistoryPartialURL(pageNum int, keyword, dateFrom, dateTo string) string {
values := url.Values{"history_page": {strconv.Itoa(pageNum)}}
if keyword != "" {
values.Set("order_no", keyword)
}
values.Set("date_from", dateFrom)
values.Set("date_to", dateTo)
return "/syb/sync-history?" + values.Encode()
}
// sybStatusLine 组装底部状态条的默认文案(没有 msg 覆盖时)。
// `[必须]` 显示筛选后的**全量**总数,不是本页行数,见工单 #43 定下的规则。
func sybStatusLine(result *service.SybListResult) string {