Kaynağa Gözat

岗位调动刷新接口很多遍的bug

lihaiting 1 hafta önce
ebeveyn
işleme
11ab7d3f81

+ 10 - 92
src/api/hr/userChange.js

@@ -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 = []) {

+ 3 - 4
src/views/hrManagement/positionTransfer/index.vue

@@ -374,7 +374,6 @@ import { getByCode as getDictByCode } from "@/api/system/dictionary-data";
 import {
   APPROVAL_STATUS_OPTIONS,
   CHANGE_TYPE_OPTIONS,
-  TRANSFER_CHANGE_TYPES,
   USER_CHANGE_APPROVAL_BUSINESS_KEY,
   canCancelUserChange,
   canEditUserChange,
@@ -759,8 +758,7 @@ export default {
         size: limit,
         userName: this.filters.employeeName.trim(),
         approvalStatus: this.mapDocStatusToApprovalStatus(this.filters.docStatus),
-        // 台账口径:覆盖岗位调动、部门调动、复合变更、晋升/降职等全部调动类异动
-        changeTypes: TRANSFER_CHANGE_TYPES,
+        // 不再按 changeType 过滤:后端该字段只支持单值,一次请求直接取服务端分页结果
         effectiveDateStart: dateRange[0] || "",
         effectiveDateEnd: dateRange[1] || "",
         sortName: "createTime",
@@ -771,8 +769,9 @@ export default {
       return { list: this.records, count: result.count };
     },
     async bootstrap() {
+      // 列表首屏加载由 ele-pro-table 的 mounted(initLoad) 自动触发,
+      // 这里不再调 loadList,避免同一页数据被并发拉两次(每次 = 9 个分页请求)
       await Promise.all([
-        this.loadList(),
         this.loadOrganizations(),
         this.loadTemplates(),
         this.loadPositionNatureOptions(),