后台列表统一分页组件,工单/人员/账号改为服务端分页。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
linmianxun
2026-09-14 22:19:58 +08:00
co-authored by Cursor
parent 9d4889c482
commit 11ec728cf4
5 changed files with 298 additions and 43 deletions
@@ -17,6 +17,7 @@ import {
} from "/@/views/inquiry/staffRole/staffRole.api";
import ProtoIcon from "/@/views/inquiry/components/ProtoIcon.vue";
import AdminModal from "/@/views/inquiry/components/AdminModal.vue";
import AdminPagination from "/@/views/inquiry/components/AdminPagination.vue";
type StaffRole = "sales" | "air" | "sea" | "land";
@@ -49,6 +50,9 @@ const roleLabelMap: Record<StaffRole, string> = {
const rows = ref<StaffRow[]>([]);
const loading = ref(false);
const total = ref(0);
const pageNo = ref(1);
const pageSize = ref(10);
const counts = ref({ all: 0, sales: 0, air: 0, sea: 0, land: 0 });
const tab = ref<"all" | StaffRole>("all");
const filters = reactive({
@@ -134,11 +138,19 @@ async function loadList() {
roleCode,
routes: filters.route || undefined,
status: filters.status || undefined,
pageNo: 1,
pageSize: 200,
pageNo: pageNo.value,
pageSize: pageSize.value,
});
const records = res?.records || res?.result?.records || [];
const page = res?.records ? res : res?.result || {};
const records = page.records || [];
total.value = Number(page.total || records.length || 0);
rows.value = (records as any[]).map(mapRow);
const maxPage = Math.max(1, Math.ceil(total.value / pageSize.value) || 1);
if (pageNo.value > maxPage) {
pageNo.value = maxPage;
await loadList();
return;
}
await loadCounts();
} catch (e: any) {
message.error(e?.message || "加载员工失败");
@@ -151,11 +163,16 @@ let searchTimer: ReturnType<typeof setTimeout> | null = null;
watch(
() => [tab.value, filters.keyword, filters.role, filters.route, filters.status],
() => {
pageNo.value = 1;
if (searchTimer) clearTimeout(searchTimer);
searchTimer = setTimeout(() => loadList(), 200);
},
);
function onPageChange() {
loadList();
}
onMounted(() => loadList());
/** 企微根部门公司全称,下拉不展示 */
@@ -501,12 +518,14 @@ function routeTags(routes: string) {
</tbody>
</table>
</div>
<div class="pagination">
<span>共 <b style="color: #0f172a">{{ filtered.length }}</b> 名员工</span>
<div class="pages">
<button class="is-active" type="button">1</button>
</div>
</div>
<AdminPagination
v-model:page-no="pageNo"
v-model:page-size="pageSize"
:total="total"
unit="名员工"
:disabled="loading"
@change="onPageChange"
/>
</div>
<AdminModal