|
|
@@ -551,7 +551,7 @@ export async function collectTransferChanges(employees = [], options = {}) {
|
|
|
|
|
|
/**
|
|
|
* 分页查询人事异动(后端 POST /main/user-changes/page)
|
|
|
- * 支持 userName / approvalStatus / changeType / deptId / organizationId /
|
|
|
+ * 支持 userName / approvalStatus / deptId / organizationId /
|
|
|
* effectiveDateStart / effectiveDateEnd 等筛选,及 sortName / orderBy 排序
|
|
|
*/
|
|
|
export async function getUserChangePage(params = {}) {
|
|
|
@@ -561,7 +561,6 @@ export async function getUserChangePage(params = {}) {
|
|
|
offset: keepBigIntId(params.offset),
|
|
|
userName: params.userName,
|
|
|
approvalStatus: params.approvalStatus,
|
|
|
- changeType: params.changeType,
|
|
|
deptId: keepBigIntId(params.deptId),
|
|
|
organizationId: keepBigIntId(params.organizationId),
|
|
|
effectiveDateStart: params.effectiveDateStart,
|
|
|
@@ -577,107 +576,26 @@ export async function getUserChangePage(params = {}) {
|
|
|
};
|
|
|
}
|
|
|
|
|
|
-/** 归一化异动类型集合(去重、大写、去空) */
|
|
|
-function normalizeChangeTypes(types = []) {
|
|
|
- const raw = Array.isArray(types) ? types : [types];
|
|
|
- return [
|
|
|
- ...new Set(
|
|
|
- raw.map((item) => String(item || "").trim().toUpperCase()).filter(Boolean),
|
|
|
- ),
|
|
|
- ];
|
|
|
-}
|
|
|
-
|
|
|
-/** 单次异动分页请求,返回后端原始行与总数 */
|
|
|
-async function requestUserChangePage(body = {}) {
|
|
|
- const data = await unwrap(await request.post("/main/user-changes/page", body));
|
|
|
- const list = Array.isArray(data?.list) ? data.list : [];
|
|
|
- return {
|
|
|
- list,
|
|
|
- count: Number(data?.count ?? data?.total ?? list.length) || 0,
|
|
|
- };
|
|
|
-}
|
|
|
-
|
|
|
-/** 排序值比较:可转数字的按数值比,其余按字符串比 */
|
|
|
-function compareSortValue(a, b) {
|
|
|
- const na = Number(a);
|
|
|
- const nb = Number(b);
|
|
|
- if (!Number.isNaN(na) && !Number.isNaN(nb)) return na - nb;
|
|
|
- return String(a == null ? "" : a).localeCompare(String(b == null ? "" : b));
|
|
|
-}
|
|
|
-
|
|
|
-/** 多类型合并时单个类型最多拉取的条数,避免深分页把每类都拉成全量 */
|
|
|
-const TRANSFER_MERGE_MAX_SIZE = 500;
|
|
|
-
|
|
|
/**
|
|
|
- * 岗位调动台账:直接走服务端 POST 分页,失败直接抛,不做兜底。
|
|
|
- *
|
|
|
- * 后端 changeType 只支持单值,而台账覆盖 TRANSFER_CHANGE_TYPES 多类异动,
|
|
|
- * 因此多类型时按类型并发各取「前 pageNum*size 条」,合并去重后在前端切片:
|
|
|
- * 各类型与合并结果用同一排序字段,各类前 N 条并集的前 N 条即全局正确顺序,
|
|
|
- * 总数为各类型 count 之和,分页与总数都保持正确。
|
|
|
+ * 岗位调动台账:一次列表加载只发 1 个 POST /main/user-changes/page,直接走服务端分页。
|
|
|
+ * 不再按 changeType 过滤(后端该字段只支持单值),列表即全部人事异动单。
|
|
|
*/
|
|
|
export async function loadTransferChangeList(params = {}) {
|
|
|
- const pageNum = Math.max(1, Number(params.pageNum) || 1);
|
|
|
- const size = Math.max(1, Number(params.size) || 20);
|
|
|
- const types = normalizeChangeTypes(
|
|
|
- params.changeTypes || (params.changeType ? [params.changeType] : []),
|
|
|
- );
|
|
|
- const common = {
|
|
|
- offset: keepBigIntId(params.offset),
|
|
|
+ const { list, count } = await getUserChangePage({
|
|
|
+ pageNum: params.pageNum,
|
|
|
+ size: params.size,
|
|
|
+ offset: params.offset,
|
|
|
userName: params.userName,
|
|
|
approvalStatus: params.approvalStatus,
|
|
|
- deptId: keepBigIntId(params.deptId),
|
|
|
- organizationId: keepBigIntId(params.organizationId),
|
|
|
+ deptId: params.deptId,
|
|
|
+ organizationId: params.organizationId,
|
|
|
effectiveDateStart: params.effectiveDateStart,
|
|
|
effectiveDateEnd: params.effectiveDateEnd,
|
|
|
sortName: params.sortName,
|
|
|
orderBy: params.orderBy,
|
|
|
- };
|
|
|
-
|
|
|
- // 单类型(不限类型):沿用后端分页
|
|
|
- if (types.length <= 1) {
|
|
|
- const data = await requestUserChangePage(
|
|
|
- compact({ pageNum, size, changeType: types[0], ...common }),
|
|
|
- );
|
|
|
- const list = data.list.map((item) => adaptUserChange(item));
|
|
|
- list.forEach((item) => rememberUserChangeId(item.id));
|
|
|
- return { list, count: data.count || list.length };
|
|
|
- }
|
|
|
-
|
|
|
- const fetchSize = Math.min(pageNum * size, TRANSFER_MERGE_MAX_SIZE);
|
|
|
- const pages = await Promise.all(
|
|
|
- types.map((changeType) =>
|
|
|
- requestUserChangePage(
|
|
|
- compact({ pageNum: 1, size: fetchSize, changeType, ...common }),
|
|
|
- ),
|
|
|
- ),
|
|
|
- );
|
|
|
-
|
|
|
- const seen = new Set();
|
|
|
- const rows = [];
|
|
|
- pages.forEach((page) => {
|
|
|
- page.list.forEach((raw) => {
|
|
|
- const key = raw?.id != null ? String(raw.id) : "";
|
|
|
- if (key) {
|
|
|
- if (seen.has(key)) return;
|
|
|
- seen.add(key);
|
|
|
- }
|
|
|
- rows.push(adaptUserChange(raw));
|
|
|
- });
|
|
|
});
|
|
|
-
|
|
|
- const sortName = params.sortName || "createTime";
|
|
|
- const direction = String(params.orderBy || "descending")
|
|
|
- .toLowerCase()
|
|
|
- .startsWith("asc")
|
|
|
- ? 1
|
|
|
- : -1;
|
|
|
- rows.sort((a, b) => direction * compareSortValue(a[sortName], b[sortName]));
|
|
|
-
|
|
|
- const list = rows.slice((pageNum - 1) * size, pageNum * size);
|
|
|
list.forEach((item) => rememberUserChangeId(item.id));
|
|
|
- const total = pages.reduce((sum, page) => sum + page.count, 0);
|
|
|
- return { list, count: total || rows.length };
|
|
|
+ return { list, count };
|
|
|
}
|
|
|
|
|
|
export async function listUserChangesByIds(ids = []) {
|