feat: 增加顺运宝店铺筛选 (#151)

This commit is contained in:
chengma
2026-08-11 14:39:13 +08:00
parent 30bdab3e2e
commit 9d4d6fc1e5
20 changed files with 313 additions and 56 deletions
+45 -15
View File
@@ -53,8 +53,9 @@ func sybLoginHint(ocrURL string) string {
// 是配置错了还是服务挂了,不能弹一个空的手工输入框了事。
func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw, msg, loginReason string) {
pageNum := service.ParsePage(pageRaw)
shop := strings.TrimSpace(c.Query("shop"))
stage := service.ParseSybStage(c.Query("stage"))
result, err := service.ListSybOrdersView(h.db, keyword, stage, pageNum)
result, err := service.ListSybOrdersView(h.db, keyword, shop, stage, pageNum)
if err != nil {
fail(c, http.StatusInternalServerError,
"读取顺运宝货运单列表失败,数据没有被改动。刷新页面重试;一直失败请把这句话报给维护者。")
@@ -88,6 +89,9 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw,
if stage != "" {
values.Set("stage", stage)
}
if shop != "" {
values.Set("shop", shop)
}
detailValues := url.Values{}
if keyword != "" {
detailValues.Set("order_no", keyword)
@@ -95,6 +99,9 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw,
if stage != "" {
detailValues.Set("stage", stage)
}
if shop != "" {
detailValues.Set("shop", shop)
}
detailValues.Set("page", strconv.Itoa(result.Page))
// `[必须]` 密码不读出来显示、也不回显到 HTML,见工单 #46。
@@ -155,6 +162,7 @@ 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,
@@ -176,11 +184,11 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw,
"SyncHistory": history,
"NeedSyncHistory": c.Query("history") == "1",
"HistoryFetchURL": sybHistoryPartialURL(history.Page,
keyword, dateFrom, dateTo),
keyword, shop, stage, dateFrom, dateTo),
"HistoryPagination": sybHistoryPagination(history.Page, history.TotalPages,
keyword, dateFrom, dateTo),
keyword, shop, stage, dateFrom, dateTo),
"HistoryFetchPagination": sybHistoryPartialPagination(history.Page, history.TotalPages,
keyword, dateFrom, dateTo),
keyword, shop, stage, dateFrom, dateTo),
"Pagination": service.NewPaginationView(result.Page, result.TotalPages, values.Encode()),
"DetailURL": "/syb/detail?" + detailValues.Encode(),
"AssignableClients": purchaseClients.Rows,
@@ -201,7 +209,7 @@ func (h *Handler) SybDetail(c *gin.Context) {
}
c.HTML(http.StatusOK, "syb/detail_modal", gin.H{
"D": detail, "CSRFToken": csrfToken(c),
"Keyword": c.Query("order_no"), "StageFilter": c.Query("stage"),
"Keyword": c.Query("order_no"), "ShopFilter": c.Query("shop"), "StageFilter": c.Query("stage"),
"CurrentPage": service.ParsePage(c.Query("page")),
})
}
@@ -211,6 +219,8 @@ func (h *Handler) SybDetail(c *gin.Context) {
func (h *Handler) SybSyncHistory(c *gin.Context) {
c.Header("Cache-Control", "no-store")
keyword := c.Query("order_no")
shop := strings.TrimSpace(c.Query("shop"))
stage := service.ParseSybStage(c.Query("stage"))
dateFrom := c.Query("date_from")
dateTo := c.Query("date_to")
history, err := service.ListSybSyncHistory(h.db, service.ParsePage(c.Query("history_page")))
@@ -221,16 +231,16 @@ func (h *Handler) SybSyncHistory(c *gin.Context) {
c.HTML(http.StatusOK, "syb/history_partial", gin.H{
"SyncHistory": history,
"HistoryFetchURL": sybHistoryPartialURL(history.Page,
keyword, dateFrom, dateTo),
keyword, shop, stage, dateFrom, dateTo),
"HistoryPagination": sybHistoryPagination(history.Page, history.TotalPages,
keyword, dateFrom, dateTo),
keyword, shop, stage, dateFrom, dateTo),
"HistoryFetchPagination": sybHistoryPartialPagination(history.Page, history.TotalPages,
keyword, dateFrom, dateTo),
keyword, shop, stage, dateFrom, dateTo),
})
}
func sybHistoryPagination(pageNum, totalPages int, keyword, dateFrom, dateTo string) service.PaginationView {
link := func(target int) string { return sybHistoryURL(target, keyword, dateFrom, dateTo) }
func sybHistoryPagination(pageNum, totalPages int, keyword, shop, stage, dateFrom, dateTo string) service.PaginationView {
link := func(target int) string { return sybHistoryURL(target, keyword, shop, stage, dateFrom, dateTo) }
view := service.PaginationView{
Page: pageNum, TotalPages: totalPages, HasPrev: pageNum > 1, HasNext: pageNum < totalPages,
FirstURL: link(1), LastURL: link(totalPages),
@@ -244,18 +254,24 @@ func sybHistoryPagination(pageNum, totalPages int, keyword, dateFrom, dateTo str
return view
}
func sybHistoryURL(pageNum int, keyword, dateFrom, dateTo string) string {
func sybHistoryURL(pageNum int, keyword, shop, stage, dateFrom, dateTo string) string {
values := url.Values{"history": {"1"}, "history_page": {strconv.Itoa(pageNum)}}
if keyword != "" {
values.Set("order_no", keyword)
}
if shop != "" {
values.Set("shop", shop)
}
if stage != "" {
values.Set("stage", stage)
}
values.Set("date_from", dateFrom)
values.Set("date_to", dateTo)
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) }
func sybHistoryPartialPagination(pageNum, totalPages int, keyword, shop, stage, dateFrom, dateTo string) service.PaginationView {
link := func(target int) string { return sybHistoryPartialURL(target, keyword, shop, stage, dateFrom, dateTo) }
view := service.PaginationView{
Page: pageNum, TotalPages: totalPages, HasPrev: pageNum > 1, HasNext: pageNum < totalPages,
FirstURL: link(1), LastURL: link(totalPages),
@@ -269,11 +285,17 @@ func sybHistoryPartialPagination(pageNum, totalPages int, keyword, dateFrom, dat
return view
}
func sybHistoryPartialURL(pageNum int, keyword, dateFrom, dateTo string) string {
func sybHistoryPartialURL(pageNum int, keyword, shop, stage, dateFrom, dateTo string) string {
values := url.Values{"history_page": {strconv.Itoa(pageNum)}}
if keyword != "" {
values.Set("order_no", keyword)
}
if shop != "" {
values.Set("shop", shop)
}
if stage != "" {
values.Set("stage", stage)
}
values.Set("date_from", dateFrom)
values.Set("date_to", dateTo)
return "/syb/sync-history?" + values.Encode()
@@ -285,6 +307,8 @@ func sybStatusLine(result *service.SybListResult) string {
prefix := fmt.Sprintf("共 %d 条货运单明细", result.Total)
if label := service.SybStageLabel(result.Stage); label != "" {
prefix = fmt.Sprintf("%s:%d 条", label, result.Total)
} else if result.IsFiltered {
prefix = fmt.Sprintf("筛选结果:%d 条货运单明细", result.Total)
}
if !result.HasAny {
return "还没有货运单明细。点上方「同步」从顺运宝拉取。"
@@ -521,6 +545,12 @@ func (h *Handler) sybRedirectAfterStart(c *gin.Context, msg string) {
if keyword := strings.TrimSpace(c.PostForm("order_no")); keyword != "" {
params.Set("order_no", keyword)
}
if shop := strings.TrimSpace(c.PostForm("shop")); shop != "" {
params.Set("shop", shop)
}
if stage := strings.TrimSpace(c.PostForm("stage")); stage != "" {
params.Set("stage", stage)
}
c.Redirect(http.StatusSeeOther, "/syb?"+params.Encode())
}
@@ -553,7 +583,7 @@ func (h *Handler) sybRedirectRange(c *gin.Context, message string) {
// appendSybFormState 保存同步/登录跳转后仍需要的页面状态。
func appendSybFormState(params url.Values, c *gin.Context) {
for _, name := range []string{"order_no", "stage", "page", "date_from", "date_to"} {
for _, name := range []string{"order_no", "shop", "stage", "page", "date_from", "date_to"} {
if value := strings.TrimSpace(c.PostForm(name)); value != "" {
params.Set(name, value)
}