hsy
8 小时以前 2d3530a7c11557a40807ad7c0b9e302ce6ce3a9f
src/views/officeProcessAutomation/ReimburseManage/shared/finReimbursementMappers.js
@@ -165,11 +165,81 @@
function pickApplicantQuery(searchForm = {}) {
  const kw = (searchForm.applicantKeyword || "").trim();
  if (!kw) return {};
  if (/[\u4e00-\u9fa5]/.test(kw)) return { applicantName: kw };
  return { applicantCode: kw };
  // 占位「姓名或编号」:姓名走 applicantName;编号另传 applicantCode
  const out = { applicantName: kw };
  if (!/[\u4e00-\u9fa5]/.test(kw)) {
    out.applicantCode = kw;
  }
  return out;
}
/** 组装 listPage 查询参数(page + finReimbursementDto) */
export function expenseTypeToCategory(typeLabel) {
  const hit = EXPENSE_CATEGORY_OPTIONS.find((x) => x.label === typeLabel || x.value === typeLabel);
  return hit?.value || typeLabel || "";
}
/** 是否存在列表筛选条件 */
export function hasActiveReimbursementSearch(searchForm = {}) {
  return Boolean(
    (searchForm?.applicantKeyword || "").trim() ||
    searchForm?.deptId ||
    searchForm?.expenseCategory ||
    (searchForm?.applyTimeRange && searchForm.applyTimeRange.length === 2)
  );
}
/** 服务端未生效时,按条件做前端兜底筛选 */
export function filterReimbursementRowsBySearch(rows, searchForm = {}) {
  const list = Array.isArray(rows) ? rows : [];
  let result = list;
  const kw = (searchForm?.applicantKeyword || "").trim().toLowerCase();
  if (kw) {
    result = result.filter((row) => {
      const parts = [
        row.applicantName,
        row.employeeName,
        row.applicantNo,
        row.applicantCode,
        row.employeeNo,
      ]
        .filter((v) => v != null && v !== "")
        .map((v) => String(v).toLowerCase());
      return parts.some((p) => p.includes(kw));
    });
  }
  if (searchForm?.deptId) {
    result = result.filter(row => String(row.deptId) === String(searchForm.deptId));
  }
  if (searchForm?.expenseCategory) {
    result = result.filter(row => row.expenseCategory === searchForm.expenseCategory);
  }
  if (searchForm?.applyTimeRange && searchForm.applyTimeRange.length === 2) {
    const start = searchForm.applyTimeRange[0];
    const end = searchForm.applyTimeRange[1];
    result = result.filter(row => {
      const t = (row.applyTime || row.createTime || "").substring(0, 10);
      return t >= start && t <= end;
    });
  }
  return result;
}
/** 扁平化为 Spring GET 可绑定的 query(finReimbursementDto.xxx,勿用方括号) */
function appendDotNotationQuery(target, prefix, fields) {
  if (!fields || typeof fields !== "object") return;
  for (const [key, value] of Object.entries(fields)) {
    if (value == null || value === "") continue;
    target[`${prefix}.${key}`] = value;
  }
}
/** 组装 listPage 查询参数(扁平 page.* / finReimbursementDto.*,与 detail 接口一致) */
export function buildFinReimbursementListParams({
  page,
  searchForm,
@@ -178,44 +248,29 @@
}) {
  const dto = {
    reimbursementType,
    deptId: searchForm.deptId || undefined,
    expenseType: searchForm.expenseCategory ? expenseCategoryToType(searchForm.expenseCategory) : undefined,
    createTimeStart: searchForm.applyTimeRange?.[0] || undefined,
    createTimeEnd: searchForm.applyTimeRange?.[1] || undefined,
    ...pickApplicantQuery(searchForm),
    ...(extraDto && typeof extraDto === "object" ? extraDto : {}),
  };
  if (searchForm?.billStatus) {
    dto.billStatus = searchForm.billStatus;
  }
  const range =
    searchForm?.createTimeRange ??
    searchForm?.applyDateRange ??
    (searchForm?.applyTimeFrom || searchForm?.applyTimeTo
      ? [searchForm.applyTimeFrom, searchForm.applyTimeTo]
      : null);
  if (Array.isArray(range) && range[0]) {
    dto.createTimeStart = range[0];
  }
  if (Array.isArray(range) && range[1]) {
    dto.createTimeEnd = range[1];
  }
  if (reimbursementType === FIN_REIMBURSEMENT_TYPE.TRAVEL) {
    if (searchForm?.travelStartFrom) {
      dto.startTimeStart = searchForm.travelStartFrom;
    }
    if (searchForm?.travelEndTo) {
      dto.endTimeEnd = searchForm.travelEndTo;
    }
  }
  return {
    page: {
      current: page.current,
      size: page.size,
    },
    finReimbursementDto: dto,
  const params = {
    current: page.current,
    size: page.size,
    "page.current": page.current,
    "page.size": page.size,
    ...dto,
  };
  if (searchForm.applyTimeRange && searchForm.applyTimeRange.length === 2) {
    params["params[beginTime]"] = searchForm.applyTimeRange[0] + " 00:00:00";
    params["params[endTime]"] = searchForm.applyTimeRange[1] + " 23:59:59";
  }
  appendDotNotationQuery(params, "finReimbursementDto", dto);
  return params;
}
function pickTravelField(obj, keys) {
@@ -306,7 +361,8 @@
    applicantName: row.applicantName || "",
    employeeNo: row.applicantCode || "",
    employeeName: row.applicantName || "",
    applicantDeptName: row.applicantDeptName || "",
    applicantDeptName: row.deptName || "",
    deptId: row.deptId,
    reimburseReason: row.reason || "",
    travelStartTime: formatReimbursementDateTime(travel.startTime),
    travelEndTime: formatReimbursementDateTime(travel.endTime),
@@ -362,12 +418,14 @@
    applicantName: row.applicantName || "",
    employeeNo: row.applicantCode || "",
    employeeName: row.applicantName || "",
    applicantDeptName: row.applicantDeptName || "",
    applicantDeptName: row.deptName || "",
    deptId: row.deptId,
    reimburseReason: row.reason || "",
    expenseCategory: row.expenseType || "",
    expenseCategory: expenseTypeToCategory(row.expenseType) || "",
    applyAmount: row.applyAmount,
    applyTime: formatReimbursementDateTime(row.createTime),
    payee: row.payeeName || "",
    payer: row.payer || "",
    payeeAccount: row.payeeAccount || "",
    bankBranch: row.payeeBank || "",
    billStatus: row.billStatus,
@@ -833,6 +891,7 @@
    applyAmount,
    detailTotalAmount: detailTotal,
    payeeName: form.payee || "",
    payer: form.payer || "",
    payeeAccount: form.payeeAccount || "",
    payeeBank: form.bankBranch || form.payeeBank || "",
    billStatus: "IN_APPROVAL",