z8018
2026-02-11 b8fb68b44c29e4667f6ea5746119413809a60a9e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
using System.ComponentModel.DataAnnotations;
 
namespace KH.WMS.Core.Api.Responses;
 
/// <summary>
/// 分页请求参数
/// </summary>
public class Pagination
{
    private int _pageIndex = 1;
    private int _pageSize = 20;
 
    /// <summary>
    /// 页码(从1开始)
    /// </summary>
    [Range(1, int.MaxValue, ErrorMessage = "页码必须大于0")]
    public int PageIndex
    {
        get => _pageIndex;
        set => _pageIndex = value < 1 ? 1 : value;
    }
 
    /// <summary>
    /// 每页数量
    /// </summary>
    [Range(1, 100, ErrorMessage = "每页数量必须在1-100之间")]
    public int PageSize
    {
        get => _pageSize;
        set => _pageSize = value < 1 ? 20 : value > 100 ? 100 : value;
    }
 
    /// <summary>
    /// 排序字段
    /// </summary>
    public string? SortField { get; set; }
 
    /// <summary>
    /// 排序方向(asc/desc)
    /// </summary>
    public string SortDirection { get; set; } = "asc";
 
    /// <summary>
    /// 计算跳过数量
    /// </summary>
    public int Skip => (PageIndex - 1) * PageSize;
 
    /// <summary>
    /// 获取数量
    /// </summary>
    public int Take => PageSize;
 
    /// <summary>
    /// 创建分页参数
    /// </summary>
    public static Pagination Create(int pageIndex = 1, int pageSize = 20, string? sortField = null, string sortDirection = "asc")
    {
        return new Pagination
        {
            PageIndex = pageIndex,
            PageSize = pageSize,
            SortField = sortField,
            SortDirection = sortDirection
        };
    }
}
 
/// <summary>
/// 分页结果
/// </summary>
public class PagedResult<T>
{
    /// <summary>
    /// 数据列表
    /// </summary>
    public List<T> Items { get; set; } = new();
 
    /// <summary>
    /// 总记录数
    /// </summary>
    public int Total { get; set; }
 
    /// <summary>
    /// 当前页码
    /// </summary>
    public int PageIndex { get; set; }
 
    /// <summary>
    /// 每页数量
    /// </summary>
    public int PageSize { get; set; }
 
    /// <summary>
    /// 总页数
    /// </summary>
    public int PageCount => PageSize > 0 ? (int)Math.Ceiling((double)Total / PageSize) : 0;
 
    /// <summary>
    /// 是否有上一页
    /// </summary>
    public bool HasPrevious => PageIndex > 1;
 
    /// <summary>
    /// 是否有下一页
    /// </summary>
    public bool HasNext => PageIndex < PageCount;
 
    /// <summary>
    /// 创建分页结果
    /// </summary>
    public static PagedResult<T> Create(List<T> items, int total, int pageIndex, int pageSize)
    {
        return new PagedResult<T>
        {
            Items = items,
            Total = total,
            PageIndex = pageIndex,
            PageSize = pageSize
        };
    }
 
    /// <summary>
    /// 创建空分页结果
    /// </summary>
    public static PagedResult<T> Empty(int pageIndex = 1, int pageSize = 20)
    {
        return new PagedResult<T>
        {
            Items = new List<T>(),
            Total = 0,
            PageIndex = pageIndex,
            PageSize = pageSize
        };
    }
}
 
/// <summary>
/// 分页响应包装
/// </summary>
public class PagedResponse<T> : ApiResponse<PagedResult<T>>
{
    /// <summary>
    /// 创建成功分页响应
    /// </summary>
    public static PagedResponse<T> Ok(List<T> items, int total, int pageIndex, int pageSize, string message = "查询成功")
    {
        return new PagedResponse<T>
        {
            Code = "200",
            Message = message,
            Data = PagedResult<T>.Create(items, total, pageIndex, pageSize)
        };
    }
 
    /// <summary>
    /// 创建空分页响应
    /// </summary>
    public static PagedResponse<T> Empty(int pageIndex = 1, int pageSize = 20, string message = "暂无数据")
    {
        return new PagedResponse<T>
        {
            Code = "200",
            Message = message,
            Data = PagedResult<T>.Empty(pageIndex, pageSize)
        };
    }
}