feat: 支持主列表选择每页条数 (#242)

This commit is contained in:
chengma
2026-08-15 15:15:38 +08:00
parent 8c09023434
commit b4558537d5
37 changed files with 479 additions and 160 deletions
+39 -22
View File
@@ -53,9 +53,10 @@ func sybLoginHint(ocrURL string) string {
// 是配置错了还是服务挂了,不能弹一个空的手工输入框了事。
func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw, msg, loginReason string) {
pageNum := service.ParsePage(pageRaw)
pageSize := service.ParsePageSize(c.Query("page_size"))
shop := strings.TrimSpace(c.Query("shop"))
stage := service.ParseSybStage(c.Query("stage"))
result, err := service.ListSybOrdersView(h.db, keyword, shop, stage, pageNum)
result, err := service.ListSybOrdersViewWithPageSize(h.db, keyword, shop, stage, pageNum, pageSize)
if err != nil {
if !service.IsValidationError(err) || result == nil {
fail(c, http.StatusInternalServerError,
@@ -131,6 +132,7 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw,
if shop != "" {
values.Set("shop", shop)
}
values.Set("page_size", strconv.Itoa(pageSize))
detailValues := url.Values{}
if keyword != "" {
detailValues.Set("order_no", keyword)
@@ -141,6 +143,7 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw,
if shop != "" {
detailValues.Set("shop", shop)
}
detailValues.Set("page_size", strconv.Itoa(pageSize))
detailValues.Set("page", strconv.Itoa(result.Page))
// `[必须]` 密码不读出来显示、也不回显到 HTML,见工单 #46。
@@ -214,6 +217,7 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw,
query.Set("stage", stage)
}
query.Set("page", strconv.Itoa(result.Page))
query.Set("page_size", strconv.Itoa(pageSize))
query.Set("date_from", dateFrom)
query.Set("date_to", dateTo)
return "/syb?" + query.Encode()
@@ -247,6 +251,7 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw,
"StageFilter": stage,
"StageOptions": service.SybStageOptions(),
"CurrentPage": result.Page,
"CurrentPageSize": pageSize,
"Rows": result.Rows,
"PurchaseRows": purchaseRows,
"OpenSybID": openSybID,
@@ -273,7 +278,7 @@ func (h *Handler) renderSybListWithLoginReason(c *gin.Context, keyword, pageRaw,
keyword, shop, stage, dateFrom, dateTo),
"HistoryFetchPagination": sybHistoryPartialPagination(history.Page, history.TotalPages,
keyword, shop, stage, dateFrom, dateTo),
"Pagination": service.NewPaginationView(result.Page, result.TotalPages, values.Encode()),
"Pagination": service.NewPaginationView(result.Page, pageSize, result.TotalPages, values.Encode()),
"DetailURL": "/syb/detail?" + detailValues.Encode(),
"AssignableClients": purchaseClients.Rows,
"PurchaseClientCount": purchaseClients.SelectableCount,
@@ -314,7 +319,8 @@ func (h *Handler) SybDetail(c *gin.Context) {
c.HTML(http.StatusOK, "syb/detail_modal", gin.H{
"D": detail, "CSRFToken": csrfToken(c), "AssignableClients": assignableClients,
"Keyword": c.Query("order_no"), "ShopFilter": c.Query("shop"), "StageFilter": c.Query("stage"),
"CurrentPage": service.ParsePage(c.Query("page")),
"CurrentPage": service.ParsePage(c.Query("page")),
"CurrentPageSize": service.ParsePageSize(c.Query("page_size")),
})
}
@@ -678,6 +684,7 @@ func (h *Handler) sybRedirectAfterStart(c *gin.Context, msg string) {
if stage := strings.TrimSpace(c.PostForm("stage")); stage != "" {
params.Set("stage", stage)
}
params.Set("page_size", strconv.Itoa(service.ParsePageSize(c.PostForm("page_size"))))
c.Redirect(http.StatusSeeOther, "/syb?"+params.Encode())
}
@@ -715,6 +722,7 @@ func appendSybFormState(params url.Values, c *gin.Context) {
params.Set(name, value)
}
}
params.Set("page_size", strconv.Itoa(service.ParsePageSize(c.PostForm("page_size"))))
}
// SybAssociatePdd 从货运单上下文关联 PDD 商品,实际业务规则与蝦皮详情共用。
@@ -869,6 +877,7 @@ func (h *Handler) SybDelete(c *gin.Context) {
// TaskList 渲染「采集采购」列表页。
func (h *Handler) TaskList(c *gin.Context) {
actor := currentUser(c)
pageSize := service.ParsePageSize(c.Query("page_size"))
creatorFilter := c.Query("creator")
filter := repository.TaskFilter{
Type: service.ParseTaskType(c.Query("type")),
@@ -876,7 +885,8 @@ func (h *Handler) TaskList(c *gin.Context) {
Keyword: c.Query("q"),
}
result, err := service.ListTasksViewForUser(h.db, actor, filter, creatorFilter, service.ParsePage(c.Query("page")))
result, err := service.ListTasksViewForUserWithPageSize(h.db, actor, filter, creatorFilter,
service.ParsePage(c.Query("page")), pageSize)
if err != nil {
fail(c, http.StatusInternalServerError,
"读取任务列表失败,数据没有被改动。刷新页面重试;一直失败请把这句话报给维护者。")
@@ -908,20 +918,22 @@ func (h *Handler) TaskList(c *gin.Context) {
if actor.IsAdmin() && creatorFilter != "" {
values.Set("creator", creatorFilter)
}
values.Set("page_size", strconv.Itoa(pageSize))
c.HTML(http.StatusOK, "task/list", page(c, "tasks", "采集采购", gin.H{
"Rows": result.Rows,
"Keyword": filter.Keyword,
"Status": statusLine,
"TypeFilter": string(filter.Type),
"StatusFilter": string(filter.Status),
"TypeOptions": service.TaskTypeOptions(),
"StatusOptions": service.TaskStatusOptions(),
"ShowCreator": actor.IsAdmin(),
"CreatorFilter": creatorFilter,
"CreatorOptions": creatorOptions,
"IsFiltered": result.IsFiltered,
"CurrentPage": result.Page,
"Pagination": service.NewPaginationView(result.Page, result.TotalPages, values.Encode()),
"Rows": result.Rows,
"Keyword": filter.Keyword,
"Status": statusLine,
"TypeFilter": string(filter.Type),
"StatusFilter": string(filter.Status),
"TypeOptions": service.TaskTypeOptions(),
"StatusOptions": service.TaskStatusOptions(),
"ShowCreator": actor.IsAdmin(),
"CreatorFilter": creatorFilter,
"CreatorOptions": creatorOptions,
"IsFiltered": result.IsFiltered,
"CurrentPage": result.Page,
"CurrentPageSize": pageSize,
"Pagination": service.NewPaginationView(result.Page, pageSize, result.TotalPages, values.Encode()),
}))
}
@@ -992,6 +1004,7 @@ func (h *Handler) taskRedirect(c *gin.Context, msg string) {
if p := c.PostForm("page"); p != "" {
params.Set("page", p)
}
params.Set("page_size", strconv.Itoa(service.ParsePageSize(c.PostForm("page_size"))))
if creator := c.PostForm("creator"); creator != "" && currentUser(c).IsAdmin() {
params.Set("creator", creator)
}
@@ -1018,9 +1031,10 @@ func (h *Handler) taskRedirect(c *gin.Context, msg string) {
func (h *Handler) ClientList(c *gin.Context) {
keyword := c.Query("name")
actor := currentUser(c)
pageSize := service.ParsePageSize(c.Query("page_size"))
result, err := service.ListClientPageForUser(h.db, actor, keyword, h.onlineThreshold,
service.ParsePage(c.Query("page")))
result, err := service.ListClientPageForUserWithPageSize(h.db, actor, keyword, h.onlineThreshold,
service.ParsePage(c.Query("page")), pageSize)
if err != nil {
fail(c, http.StatusInternalServerError,
"读取客户端列表失败,数据没有被改动。请稍后重试,或查看 data/logs/ 里的日志。")
@@ -1044,12 +1058,14 @@ func (h *Handler) ClientList(c *gin.Context) {
if strings.TrimSpace(keyword) != "" {
values.Set("name", keyword)
}
values.Set("page_size", strconv.Itoa(pageSize))
c.HTML(http.StatusOK, "client/list", page(c, "clients", "客户端列表", gin.H{
"Keyword": keyword, "Rows": result.Rows, "Status": status,
"Purchasers": purchasers, "Message": c.Query("msg"), "Error": c.Query("error"),
"CurrentPage": result.Page,
"Pagination": service.NewPaginationView(result.Page, result.TotalPages, values.Encode()),
"IsFiltered": strings.TrimSpace(keyword) != "",
"CurrentPage": result.Page,
"CurrentPageSize": pageSize,
"Pagination": service.NewPaginationView(result.Page, pageSize, result.TotalPages, values.Encode()),
"IsFiltered": strings.TrimSpace(keyword) != "",
}))
}
@@ -1102,6 +1118,7 @@ func redirectClients(c *gin.Context, message, errorMessage string) {
if page := c.PostForm("page"); page != "" {
query.Set("page", page)
}
query.Set("page_size", strconv.Itoa(service.ParsePageSize(c.PostForm("page_size"))))
if message != "" {
query.Set("msg", message)
}