From 82f861542ffb411b4d745f3e25f3623fd69e6aec Mon Sep 17 00:00:00 2001 From: let5sne Date: Thu, 9 Jul 2026 10:50:19 +0800 Subject: [PATCH] fix(aihr): paginate org snapshot view --- .../controller/AihrOrgSyncController.java | 4 +++- .../dromara/aihr/domain/AihrOrgSyncDto.java | 2 ++ .../aihr/service/AihrOrgSyncService.java | 14 +++++++----- frontend/src/api/aihr/mobile-admin.ts | 4 ++++ frontend/src/views/admin/org-permission.vue | 22 ++++++++++++++++--- 5 files changed, 37 insertions(+), 9 deletions(-) diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrOrgSyncController.java b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrOrgSyncController.java index 68167145..b72772f6 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrOrgSyncController.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/controller/AihrOrgSyncController.java @@ -30,7 +30,9 @@ public class AihrOrgSyncController { @RequestParam(required = false) String projectCode, @RequestParam(required = false) String positionLevel, @RequestParam(required = false) String status, + @RequestParam(required = false, defaultValue = "1") Integer pageNum, + @RequestParam(required = false) Integer pageSize, @RequestParam(required = false, defaultValue = "200") Integer limit) { - return R.ok(orgSyncService.snapshot(keyword, projectCode, positionLevel, status, limit)); + return R.ok(orgSyncService.snapshot(keyword, projectCode, positionLevel, status, pageNum, pageSize, limit)); } } diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/domain/AihrOrgSyncDto.java b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/domain/AihrOrgSyncDto.java index 564d45bd..e0592d07 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/domain/AihrOrgSyncDto.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/domain/AihrOrgSyncDto.java @@ -35,6 +35,8 @@ public final class AihrOrgSyncDto { int total, int active, int departed, + int pageNum, + int pageSize, List projects, List levels, List rows diff --git a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrOrgSyncService.java b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrOrgSyncService.java index ae5ecbad..a823b2fa 100644 --- a/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrOrgSyncService.java +++ b/backend/ruoyi-modules/ruoyi-aihr/src/main/java/org/dromara/aihr/service/AihrOrgSyncService.java @@ -113,16 +113,20 @@ public class AihrOrgSyncService { ); } - public OrgSnapshotResponse snapshot(String keyword, String projectCode, String positionLevel, String status, Integer limit) { + public OrgSnapshotResponse snapshot(String keyword, String projectCode, String positionLevel, String status, + Integer pageNum, Integer pageSize, Integer limit) { requireSnapshotTable(); - int safeLimit = clamp(limit, 200, 1, MAX_PAGE_SIZE); + int safePageNum = clamp(pageNum, 1, 1, 100000); + int safePageSize = clamp(pageSize == null ? limit : pageSize, 20, 1, MAX_PAGE_SIZE); + int offset = (safePageNum - 1) * safePageSize; List args = new ArrayList<>(); String where = orgSnapshotWhere(keyword, projectCode, positionLevel, status, args); int total = countOrgRows("select count(*) from aihr_org_snapshot" + where, args); int active = countOrgRows("select count(*) from aihr_org_snapshot" + where + " and employment_status = 'active'", args); int departed = countOrgRows("select count(*) from aihr_org_snapshot" + where + " and employment_status = 'departed'", args); List rowArgs = new ArrayList<>(args); - rowArgs.add(safeLimit); + rowArgs.add(safePageSize); + rowArgs.add(offset); List rows = jdbcTemplate.query(""" select id, project_code, project_name, dept_name, ext_party_id, person_name, position_name, position_level, employment_status, @@ -130,7 +134,7 @@ public class AihrOrgSyncService { from aihr_org_snapshot """ + where + """ order by project_name, dept_name, position_level, person_name - limit ? + limit ? offset ? """, (rs, rowNum) -> new OrgPersonRow( rs.getLong("id"), rs.getString("project_code"), @@ -143,7 +147,7 @@ public class AihrOrgSyncService { rs.getString("employment_status"), rs.getString("snapshot_date") ), rowArgs.toArray()); - return new OrgSnapshotResponse(total, active, departed, orgProjects(), orgLevels(), rows); + return new OrgSnapshotResponse(total, active, departed, safePageNum, safePageSize, orgProjects(), orgLevels(), rows); } private List fetchOptional(String baseUrl, String token, SyncRequest req, String resourceType, diff --git a/frontend/src/api/aihr/mobile-admin.ts b/frontend/src/api/aihr/mobile-admin.ts index c0dc8431..3ea4dd86 100644 --- a/frontend/src/api/aihr/mobile-admin.ts +++ b/frontend/src/api/aihr/mobile-admin.ts @@ -138,6 +138,8 @@ export type OrgSnapshotParams = { projectCode?: string; positionLevel?: string; status?: string; + pageNum?: number; + pageSize?: number; limit?: number; }; @@ -145,6 +147,8 @@ export type OrgSnapshotResponse = { total: number; active: number; departed: number; + pageNum: number; + pageSize: number; projects: OrgProjectOption[]; levels: string[]; rows: OrgPersonRow[]; diff --git a/frontend/src/views/admin/org-permission.vue b/frontend/src/views/admin/org-permission.vue index 6fab95b8..986ec4d9 100644 --- a/frontend/src/views/admin/org-permission.vue +++ b/frontend/src/views/admin/org-permission.vue @@ -29,7 +29,7 @@
- + @@ -40,7 +40,7 @@ - 查询 + 查询
@@ -58,6 +58,13 @@ +
@@ -147,6 +154,10 @@ const orgFilters = reactive({ positionLevel: '', status: 'active' }); +const orgPage = reactive({ + pageNum: 1, + pageSize: 20 +}); const metrics = [ { label: '权威组织源', value: '快照', note: '阶段三前用 aihr_org_snapshot' }, @@ -180,7 +191,7 @@ const projectScopes = computed(() => const loadOrgSnapshot = async () => { orgLoading.value = true; try { - const result = await getOrgSnapshot({ ...orgFilters, limit: 200 }); + const result = await getOrgSnapshot({ ...orgFilters, pageNum: orgPage.pageNum, pageSize: orgPage.pageSize }); orgSnapshot.value = result.data; } catch (error) { ElMessage.error('组织人员快照加载失败'); @@ -189,6 +200,11 @@ const loadOrgSnapshot = async () => { } }; +const searchOrgSnapshot = () => { + orgPage.pageNum = 1; + loadOrgSnapshot(); +}; + const runSync = async () => { if (!dryRun.value) { await ElMessageBox.confirm('写入模式会覆盖当前租户组织快照,确认继续吗?', '组织同步', { type: 'warning' });