From 856f10107b7681f91114dc48991ebd121a3a8c3f Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期四, 21 五月 2026 15:20:30 +0800
Subject: [PATCH] 查询条件分类查询区分
---
src/pages/oa/ApproveManage/approve-list/_components/ApproveInstanceDetailBody.vue | 18 +-
src/pages/oa/_utils/approvalFormField.js | 19 ++
src/pages/oa/ReimburseManage/travel-reimburse/index.vue | 15 -
src/pages/oa/_utils/approvalModuleListSearch.js | 132 +++++++++++++++++++++
src/pages/oa/_components/ApprovalInstanceListPage.vue | 11 -
src/pages/oa/ReimburseManage/cost-reimburse/index.vue | 15 -
src/pages/oa/_utils/approvalModuleRegistry.js | 57 ++++++++
src/pages/oa/_utils/approveListUtils.js | 91 +++++++++++---
8 files changed, 285 insertions(+), 73 deletions(-)
diff --git a/src/pages/oa/ApproveManage/approve-list/_components/ApproveInstanceDetailBody.vue b/src/pages/oa/ApproveManage/approve-list/_components/ApproveInstanceDetailBody.vue
index da62d09..72d30b6 100644
--- a/src/pages/oa/ApproveManage/approve-list/_components/ApproveInstanceDetailBody.vue
+++ b/src/pages/oa/ApproveManage/approve-list/_components/ApproveInstanceDetailBody.vue
@@ -146,6 +146,7 @@
computeLeaveDurationDisplay,
computeOvertimeHoursDisplay,
} from "../../../_utils/approvalModuleApplyExtras.js";
+ import { resolveInstanceFormPayload } from "../../../_utils/approvalModuleListSearch.js";
import {
businessStatusTagType,
businessStatusText,
@@ -161,7 +162,6 @@
taskStatusTagType,
taskStatusText,
} from "../../../_utils/approveListUtils.js";
- import { parseApprovalFormConfig } from "../../../_utils/approvalFormField.js";
const props = defineProps({
row: { type: Object, default: () => ({}) },
@@ -186,27 +186,25 @@
const statusTagType = status =>
isBusinessModule.value ? businessStatusTagType(status) : instanceStatusTagType(status);
- const displayFields = computed(() =>
- resolveInstanceDisplayFields(props.row?.formConfig)
- );
+ const displayFields = computed(() => resolveInstanceDisplayFields(props.row));
const moduleExtraRows = computed(() => {
const rows = [];
- const cfg = parseApprovalFormConfig(props.row?.formConfig);
- const payload = {};
- (cfg.fields || []).forEach(f => {
- if (f?.key) payload[f.key] = f.value ?? "";
+ const { fields, formPayload } = resolveInstanceFormPayload(props.row);
+ const payload = { ...formPayload };
+ (fields || []).forEach(f => {
+ if (f?.key && payload[f.key] == null) payload[f.key] = f.value ?? "";
});
if (props.moduleKey === APPROVAL_MODULE_KEYS.LEAVE) {
const balance = payload.leaveBalanceDays;
if (balance != null && balance !== "") {
rows.push({ label: "鍋囨湡浣欓", value: `${balance} 澶ー });
}
- const days = computeLeaveDurationDisplay(cfg.fields, payload);
+ const days = computeLeaveDurationDisplay(fields, payload);
if (days) rows.push({ label: "璇峰亣鏃堕暱", value: `${days} 澶ー });
}
if (props.moduleKey === APPROVAL_MODULE_KEYS.OVERTIME) {
- const hours = computeOvertimeHoursDisplay(cfg.fields, payload);
+ const hours = computeOvertimeHoursDisplay(fields, payload);
if (hours) rows.push({ label: "鍔犵彮鏃堕暱", value: `${hours} 灏忔椂` });
}
if (props.moduleKey === APPROVAL_MODULE_KEYS.TRANSFER) {
diff --git a/src/pages/oa/ReimburseManage/cost-reimburse/index.vue b/src/pages/oa/ReimburseManage/cost-reimburse/index.vue
index 5343c75..52fb9a1 100644
--- a/src/pages/oa/ReimburseManage/cost-reimburse/index.vue
+++ b/src/pages/oa/ReimburseManage/cost-reimburse/index.vue
@@ -1,18 +1,11 @@
<!--
- OA / 鎶ラ攢绠$悊 / 璐圭敤鎶ラ攢
- 璺敱锛�/pages/oa/ReimburseManage/cost-reimburse/index
+ OA / 鎶ラ攢绠$悊 / 璐圭敤鎶ラ攢锛堝鎵瑰疄渚嬪垪琛級
-->
<template>
- <OaListPage v-if="config"
- :page-key="pageKey"
- :page-config="config" />
+ <ApprovalInstanceListPage :module-key="APPROVAL_MODULE_KEYS.COST_REIMBURSE" />
</template>
<script setup>
- /** OA - 鎶ラ攢绠$悊 - 璐圭敤鎶ラ攢 */
- import OaListPage from "../../_components/OaListPage.vue";
- import { useOaPage } from "../../_utils/useOaPage.js";
-
- const pageKey = "ReimburseManage/cost-reimburse";
- const { config } = useOaPage(pageKey);
+ import ApprovalInstanceListPage from "../../_components/ApprovalInstanceListPage.vue";
+ import { APPROVAL_MODULE_KEYS } from "../../_utils/approvalModuleRegistry.js";
</script>
diff --git a/src/pages/oa/ReimburseManage/travel-reimburse/index.vue b/src/pages/oa/ReimburseManage/travel-reimburse/index.vue
index df4dac1..41126a0 100644
--- a/src/pages/oa/ReimburseManage/travel-reimburse/index.vue
+++ b/src/pages/oa/ReimburseManage/travel-reimburse/index.vue
@@ -1,18 +1,11 @@
<!--
- OA / 鎶ラ攢绠$悊 / 宸梾鎶ラ攢
- 璺敱锛�/pages/oa/ReimburseManage/travel-reimburse/index
+ OA / 鎶ラ攢绠$悊 / 宸梾鎶ラ攢锛堝鎵瑰疄渚嬪垪琛級
-->
<template>
- <OaListPage v-if="config"
- :page-key="pageKey"
- :page-config="config" />
+ <ApprovalInstanceListPage :module-key="APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE" />
</template>
<script setup>
- /** OA - 鎶ラ攢绠$悊 - 宸梾鎶ラ攢 */
- import OaListPage from "../../_components/OaListPage.vue";
- import { useOaPage } from "../../_utils/useOaPage.js";
-
- const pageKey = "ReimburseManage/travel-reimburse";
- const { config } = useOaPage(pageKey);
+ import ApprovalInstanceListPage from "../../_components/ApprovalInstanceListPage.vue";
+ import { APPROVAL_MODULE_KEYS } from "../../_utils/approvalModuleRegistry.js";
</script>
diff --git a/src/pages/oa/_components/ApprovalInstanceListPage.vue b/src/pages/oa/_components/ApprovalInstanceListPage.vue
index cdf0e39..86b102f 100644
--- a/src/pages/oa/_components/ApprovalInstanceListPage.vue
+++ b/src/pages/oa/_components/ApprovalInstanceListPage.vue
@@ -119,7 +119,7 @@
import { fetchApprovalTemplateTypes } from "../_utils/approvalTemplateType.js";
import {
getApprovalModuleConfig,
- resolveModuleBusinessType,
+ getModuleListBusinessType,
} from "../_utils/approvalModuleRegistry.js";
import {
buildModuleListDto,
@@ -260,15 +260,12 @@
};
const initBusinessType = async () => {
+ const fixed = getModuleListBusinessType(props.moduleKey);
+ businessType.value = fixed != null && fixed !== "" ? fixed : "";
try {
typeOptions.value = await fetchApprovalTemplateTypes();
- const resolved = resolveModuleBusinessType(props.moduleKey, typeOptions.value);
- businessType.value =
- resolved != null && resolved !== ""
- ? resolved
- : moduleConfig.value?.approvalType ?? "";
} catch {
- businessType.value = moduleConfig.value?.approvalType ?? "";
+ typeOptions.value = [];
}
};
diff --git a/src/pages/oa/_utils/approvalFormField.js b/src/pages/oa/_utils/approvalFormField.js
index 1215674..813d05e 100644
--- a/src/pages/oa/_utils/approvalFormField.js
+++ b/src/pages/oa/_utils/approvalFormField.js
@@ -17,17 +17,25 @@
datetime: "YYYY-MM-DD HH:mm:ss",
};
-/** 瑙f瀽 formConfig JSON */
+/** 瑙f瀽 formConfig JSON锛堝惈宓屽 formPayload锛屼笌 Web parseInstanceFormConfig 涓�鑷达級 */
export function parseApprovalFormConfig(raw) {
- if (!raw) return { prompt: "", fields: [] };
+ if (!raw) return { prompt: "", fields: [], formPayload: {} };
try {
const obj = typeof raw === "string" ? JSON.parse(raw) : raw;
+ const payload = obj?.formPayload;
return {
- prompt: obj?.prompt || "",
- fields: Array.isArray(obj?.fields) ? obj.fields : [],
+ prompt: obj?.prompt || obj?.summaryPlaceholder || "",
+ summaryPlaceholder: obj?.summaryPlaceholder || "",
+ approvalType: obj?.approvalType || "",
+ fields: Array.isArray(obj?.fields)
+ ? obj.fields
+ : Array.isArray(obj?.formFields)
+ ? obj.formFields
+ : [],
+ formPayload: payload && typeof payload === "object" ? payload : {},
};
} catch {
- return { prompt: "", fields: [] };
+ return { prompt: "", fields: [], formPayload: {} };
}
}
@@ -45,6 +53,7 @@
valueMap[field.key] = val;
}
});
+ Object.assign(valueMap, instance.formPayload || {});
const baseFields = template.fields.length ? template.fields : instance.fields;
return {
prompt: instance.prompt || template.prompt,
diff --git a/src/pages/oa/_utils/approvalModuleListSearch.js b/src/pages/oa/_utils/approvalModuleListSearch.js
index 45a7d43..a81b174 100644
--- a/src/pages/oa/_utils/approvalModuleListSearch.js
+++ b/src/pages/oa/_utils/approvalModuleListSearch.js
@@ -4,7 +4,10 @@
getApprovalModuleConfig,
getModuleMatchingBusinessTypes,
} from "./approvalModuleRegistry.js";
-import { parseApprovalFormConfig } from "./approvalFormField.js";
+import {
+ parseApprovalFormConfig,
+ parseDatetimerangeValue,
+} from "./approvalFormField.js";
import { matchBusinessTypeValue } from "./approvalTemplateType.js";
/** 涓� Web leave-apply LEAVE_TYPE_OPTIONS 涓�鑷� */
@@ -49,16 +52,53 @@
return payload;
}
+function guessFieldTypeFromValue(val) {
+ if (Array.isArray(val)) return "datetimerange";
+ if (typeof val === "number") return "number";
+ return "text";
+}
+
/** 瑙f瀽瀹炰緥 formConfig / formPayload锛堜笌 Web resolveInstanceFormFields 瀵归綈锛� */
export function resolveInstanceFormPayload(row) {
const cfg = parseApprovalFormConfig(row?.formConfig);
- const fields = (row?.formFieldDefs?.length ? row.formFieldDefs : cfg.fields) || [];
+ let fields = (row?.formFieldDefs?.length ? row.formFieldDefs : cfg.fields) || [];
const formPayload = {
...(fields.length ? buildFormPayloadFromFields(fields) : {}),
...cfg.formPayload,
...(row?.formPayload || {}),
};
+ if (!fields.length && Object.keys(formPayload).length) {
+ fields = Object.keys(formPayload)
+ .filter(k => k && k !== "summary")
+ .map(k => ({
+ key: k,
+ label: k,
+ type: guessFieldTypeFromValue(formPayload[k]),
+ required: false,
+ options: [],
+ }));
+ }
+ fields = fields.map(field => ({
+ ...field,
+ value:
+ formPayload[field.key] ?? field.value ?? field.defaultValue ?? "",
+ }));
return { fields, formPayload };
+}
+
+/** 宸茬煡涓嬫媺瀛楁 value 鈫� 灞曠ず鏂囨锛堟ā鏉挎湭甯� options 鏃跺厹搴曪級 */
+export function formatKnownSelectLabel(prop, val) {
+ if (val === undefined || val === null || val === "") return "";
+ const maps = {
+ leaveType: LEAVE_TYPE_OPTIONS,
+ overtimeType: OVERTIME_TYPE_OPTIONS,
+ handoverStatus: HANDOVER_STATUS_OPTIONS,
+ handoverType: HANDOVER_TYPE_OPTIONS,
+ };
+ const options = maps[prop];
+ if (!options) return "";
+ const hit = options.find(o => String(o.value) === String(val));
+ return hit?.label || "";
}
export function getRowPayloadValue(row, keys) {
@@ -69,6 +109,73 @@
if (formPayload[k] != null && formPayload[k] !== "") return formPayload[k];
}
return "";
+}
+
+const DATETIME_RANGE_KEYS = [
+ "dateRange",
+ "leaveTime",
+ "overtimeTime",
+ "timeRange",
+];
+
+function pickDatetimerangeRaw(formPayload, fields = []) {
+ for (const key of DATETIME_RANGE_KEYS) {
+ const v = formPayload?.[key];
+ if (v != null && v !== "") return v;
+ const field = (fields || []).find(f => f?.key === key);
+ const fv = field?.value ?? field?.defaultValue;
+ if (fv != null && fv !== "") return fv;
+ }
+ const rangeField = (fields || []).find(
+ f => String(f?.type || "").toLowerCase() === "datetimerange"
+ );
+ if (rangeField?.key) {
+ const v =
+ formPayload?.[rangeField.key] ?? rangeField.value ?? rangeField.defaultValue;
+ if (v != null && v !== "") return v;
+ }
+ return null;
+}
+
+function splitRangeValue(val) {
+ if (val === undefined || val === null || val === "") {
+ return { start: "", end: "" };
+ }
+ if (Array.isArray(val)) {
+ return { start: val[0] || "", end: val[1] || "" };
+ }
+ return parseDatetimerangeValue(val);
+}
+
+/**
+ * 鍒楄〃鍒� prop 涓� formPayload 瀵归綈锛堣鍋� startTime/endTime 鏉ヨ嚜 dateRange锛�
+ */
+export function resolveListFieldRawValue(prop, row, fields = [], formPayload = {}) {
+ const payload = formPayload || {};
+ const direct = payload[prop] ?? row?.[prop];
+
+ if (prop === "startTime" || prop === "endTime") {
+ if (direct != null && direct !== "") return direct;
+ const altStart =
+ payload.start ?? payload.startDate ?? payload.beginTime ?? row?.startTime;
+ const altEnd =
+ payload.end ?? payload.endDate ?? payload.finishTime ?? row?.endTime;
+ if (prop === "startTime" && altStart) return altStart;
+ if (prop === "endTime" && altEnd) return altEnd;
+ const { start, end } = splitRangeValue(pickDatetimerangeRaw(payload, fields));
+ return prop === "startTime" ? start : end;
+ }
+
+ if (prop === "overtimeDate") {
+ const d = payload.overtimeDate ?? payload.date ?? direct;
+ if (d != null && d !== "") return Array.isArray(d) ? d[0] || "" : d;
+ const { start } = splitRangeValue(pickDatetimerangeRaw(payload, fields));
+ return start || "";
+ }
+
+ if (direct != null && direct !== "") return direct;
+ const hit = (fields || []).find(f => f?.key === prop);
+ return hit?.value ?? hit?.defaultValue ?? "";
}
function pickDateRange(searchForm) {
@@ -95,6 +202,10 @@
return { applicantKeyword: "", leaveType: "" };
case APPROVAL_MODULE_KEYS.OVERTIME:
return { applicantKeyword: "", overtimeType: "" };
+ case APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE:
+ case APPROVAL_MODULE_KEYS.COST_REIMBURSE:
+ case APPROVAL_MODULE_KEYS.ENTERPRISE_NEWS:
+ return { applicantKeyword: "" };
default:
return {};
}
@@ -218,6 +329,10 @@
matchApplicantKeyword(row, sf.applicantKeyword) &&
matchSelectValue(row, ["overtimeType", "鍔犵彮绫诲瀷"], sf.overtimeType)
);
+ case APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE:
+ case APPROVAL_MODULE_KEYS.COST_REIMBURSE:
+ case APPROVAL_MODULE_KEYS.ENTERPRISE_NEWS:
+ return list.filter(row => matchApplicantKeyword(row, sf.applicantKeyword));
default:
return list;
}
@@ -292,6 +407,19 @@
},
],
};
+ case APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE:
+ case APPROVAL_MODULE_KEYS.COST_REIMBURSE:
+ case APPROVAL_MODULE_KEYS.ENTERPRISE_NEWS:
+ return {
+ fields: [
+ {
+ key: "applicantKeyword",
+ type: "input",
+ label: "鐢宠浜�",
+ placeholder: "濮撳悕鎴栫紪鍙�",
+ },
+ ],
+ };
default:
return { fields: [] };
}
diff --git a/src/pages/oa/_utils/approvalModuleRegistry.js b/src/pages/oa/_utils/approvalModuleRegistry.js
index 63d0c59..2fca61e 100644
--- a/src/pages/oa/_utils/approvalModuleRegistry.js
+++ b/src/pages/oa/_utils/approvalModuleRegistry.js
@@ -6,12 +6,28 @@
WORK_HANDOVER: "work_handover",
LEAVE: "leave",
OVERTIME: "overtime",
+ TRAVEL_REIMBURSE: "travel_reimburse",
+ COST_REIMBURSE: "cost_reimburse",
+ ENTERPRISE_NEWS: "enterprise_news",
+};
+
+/** 瀹℃壒瀹炰緥 listPage businessType锛堜笌鍚庣绾﹀畾涓�鑷达級 */
+export const APPROVAL_BUSINESS_TYPE = {
+ [APPROVAL_MODULE_KEYS.REGULAR]: 10,
+ [APPROVAL_MODULE_KEYS.TRANSFER]: 11,
+ [APPROVAL_MODULE_KEYS.WORK_HANDOVER]: 13,
+ [APPROVAL_MODULE_KEYS.LEAVE]: 14,
+ [APPROVAL_MODULE_KEYS.OVERTIME]: 15,
+ [APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE]: 16,
+ [APPROVAL_MODULE_KEYS.COST_REIMBURSE]: 17,
+ [APPROVAL_MODULE_KEYS.ENTERPRISE_NEWS]: 18,
};
export const APPROVAL_MODULE_REGISTRY = {
[APPROVAL_MODULE_KEYS.REGULAR]: {
label: "杞鐢宠",
approvalType: "regular",
+ businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.REGULAR],
typeLabels: ["杞", "杞鐢宠"],
listFields: [
{ label: "鍏ヨ亴鏃ユ湡", prop: "entryDate" },
@@ -21,6 +37,7 @@
[APPROVAL_MODULE_KEYS.TRANSFER]: {
label: "璋冨矖鐢宠",
approvalType: "transfer",
+ businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.TRANSFER],
typeLabels: ["璋冨矖", "璋冨姩", "璋冨矖鐢宠", "璋冨姩鐢宠"],
listFields: [
{ label: "鍘熷矖浣�", prop: "fromPost" },
@@ -30,6 +47,7 @@
[APPROVAL_MODULE_KEYS.WORK_HANDOVER]: {
label: "宸ヤ綔浜ゆ帴",
approvalType: "work_handover",
+ businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.WORK_HANDOVER],
typeLabels: ["宸ヤ綔浜ゆ帴", "浜ゆ帴", "宸ヤ綔浜ゆ帴瀹℃壒"],
listFields: [
{ label: "浜ゆ帴浜�", prop: "handoverTo" },
@@ -39,6 +57,7 @@
[APPROVAL_MODULE_KEYS.LEAVE]: {
label: "璇峰亣鐢宠",
approvalType: "leave",
+ businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.LEAVE],
typeLabels: ["璇峰亣", "璇峰亣鐢宠", "璇峰亣瀹℃壒"],
listFields: [
{ label: "璇峰亣绫诲瀷", prop: "leaveType" },
@@ -49,11 +68,33 @@
[APPROVAL_MODULE_KEYS.OVERTIME]: {
label: "鍔犵彮鐢宠",
approvalType: "overtime",
+ businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.OVERTIME],
typeLabels: ["鍔犵彮", "鍔犵彮鐢宠", "鍔犵彮瀹℃壒"],
listFields: [
{ label: "鍔犵彮鏃ユ湡", prop: "overtimeDate" },
{ label: "鏃堕暱(灏忔椂)", prop: "hours" },
],
+ },
+ [APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE]: {
+ label: "宸梾鎶ラ攢",
+ approvalType: "travel_reimburse",
+ businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE],
+ typeLabels: ["宸梾", "宸梾鎶ラ攢", "鍑哄樊鎶ラ攢"],
+ listFields: [],
+ },
+ [APPROVAL_MODULE_KEYS.COST_REIMBURSE]: {
+ label: "璐圭敤鎶ラ攢",
+ approvalType: "cost_reimburse",
+ businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.COST_REIMBURSE],
+ typeLabels: ["璐圭敤", "璐圭敤鎶ラ攢"],
+ listFields: [],
+ },
+ [APPROVAL_MODULE_KEYS.ENTERPRISE_NEWS]: {
+ label: "浼佷笟鏂伴椈",
+ approvalType: "enterprise_news",
+ businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.ENTERPRISE_NEWS],
+ typeLabels: ["浼佷笟鏂伴椈", "鏂伴椈", "鏂伴椈鍙戝竷"],
+ listFields: [],
},
};
@@ -66,7 +107,7 @@
const cfg = getApprovalModuleConfig(moduleKey);
if (!cfg) return "";
if (cfg.businessType != null && cfg.businessType !== "") return cfg.businessType;
- return cfg.approvalType || "";
+ return APPROVAL_BUSINESS_TYPE[moduleKey] ?? "";
}
function matchBiz(a, b) {
@@ -77,7 +118,9 @@
export function resolveModuleBusinessType(moduleKey, typeOptions = []) {
const cfg = getApprovalModuleConfig(moduleKey);
if (!cfg) return null;
- if (cfg.businessType != null && cfg.businessType !== "") return cfg.businessType;
+
+ const fixed = getModuleListBusinessType(moduleKey);
+ if (fixed != null && fixed !== "") return fixed;
const labels = [cfg.label, ...(cfg.typeLabels || [])].filter(Boolean);
const hitByLabel = (typeOptions || []).find(opt => {
@@ -97,17 +140,19 @@
if (hitByValue?.value != null && hitByValue.value !== "") return hitByValue.value;
}
- return cfg.approvalType || null;
+ return null;
}
export function getModuleMatchingBusinessTypes(moduleKey, typeOptions = []) {
const cfg = getApprovalModuleConfig(moduleKey);
if (!cfg) return [];
+ const fixed = getModuleListBusinessType(moduleKey);
+ if (fixed != null && fixed !== "") return [fixed];
+
const values = new Set();
const primary = resolveModuleBusinessType(moduleKey, typeOptions);
if (primary != null && primary !== "") values.add(primary);
- if (cfg.approvalType) values.add(cfg.approvalType);
const labels = [cfg.label, ...(cfg.typeLabels || [])].filter(Boolean);
for (const opt of typeOptions || []) {
@@ -123,13 +168,15 @@
return [...values];
}
-/** 鍒楄〃椤� moduleKey 涓庤矾鐢� pageKey 瀵圭収 */
export const PAGE_KEY_TO_MODULE = {
"HrManage/regular-apply": APPROVAL_MODULE_KEYS.REGULAR,
"HrManage/transfer-apply": APPROVAL_MODULE_KEYS.TRANSFER,
"HrManage/work-handover": APPROVAL_MODULE_KEYS.WORK_HANDOVER,
"AttendManage/leave-apply": APPROVAL_MODULE_KEYS.LEAVE,
"AttendManage/overtime-apply": APPROVAL_MODULE_KEYS.OVERTIME,
+ "ReimburseManage/travel-reimburse": APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE,
+ "ReimburseManage/cost-reimburse": APPROVAL_MODULE_KEYS.COST_REIMBURSE,
+ "EnterpriseNews/news-manage": APPROVAL_MODULE_KEYS.ENTERPRISE_NEWS,
};
export function getModuleKeyFromPageKey(pageKey) {
diff --git a/src/pages/oa/_utils/approveListUtils.js b/src/pages/oa/_utils/approveListUtils.js
index 965b3dd..f7ddc00 100644
--- a/src/pages/oa/_utils/approveListUtils.js
+++ b/src/pages/oa/_utils/approveListUtils.js
@@ -5,6 +5,11 @@
isSelectField,
mergeFormConfigForEdit,
} from "./approvalFormField.js";
+import {
+ formatKnownSelectLabel,
+ resolveInstanceFormPayload,
+ resolveListFieldRawValue,
+} from "./approvalModuleListSearch.js";
export const DETAIL_STORAGE_KEY = "oa_approve_instance_detail_row";
@@ -57,9 +62,19 @@
return parseTime(val, "{y}-{m}-{d} {h}:{i}:{s}") || String(val);
}
-/** 瑙f瀽瀹炰緥 formConfig 涓哄彧璇诲睍绀哄瓧娈� */
-export function resolveInstanceDisplayFields(formConfig) {
- const merged = mergeFormConfigForEdit("", formConfig);
+/** 瑙f瀽瀹炰緥涓哄彧璇诲睍绀哄瓧娈碉紙鍚堝苟 formPayload锛屾敮鎸佷紶鏁磋鎴栦粎 formConfig锛� */
+export function resolveInstanceDisplayFields(formConfigOrRow) {
+ const row =
+ formConfigOrRow &&
+ typeof formConfigOrRow === "object" &&
+ (formConfigOrRow.formConfig != null ||
+ formConfigOrRow.formPayload != null ||
+ formConfigOrRow.formFieldDefs != null)
+ ? formConfigOrRow
+ : { formConfig: formConfigOrRow };
+ const { fields } = resolveInstanceFormPayload(row);
+ if (fields.length) return fields.filter(f => f?.key);
+ const merged = mergeFormConfigForEdit("", row.formConfig);
return (merged.fields || []).filter(f => f?.key);
}
@@ -67,10 +82,39 @@
const val = field.value ?? field.defaultValue;
if (val === undefined || val === null || val === "") return "-";
if (isSelectField(field)) {
- return getFieldOptionLabel(field, val) || String(val);
+ const fromOptions = getFieldOptionLabel(field, val);
+ if (fromOptions && fromOptions !== "-") return fromOptions;
+ const known = formatKnownSelectLabel(field.key, val);
+ if (known) return known;
+ return String(val);
}
+ const known = formatKnownSelectLabel(field?.key, val);
+ if (known) return known;
const shown = formatFieldDisplayValue(field, val);
return shown || String(val);
+}
+
+const DATETIME_LIST_PROPS = new Set([
+ "startTime",
+ "endTime",
+ "overtimeDate",
+ "applyTime",
+]);
+
+function formatListFieldDisplay(prop, val, field) {
+ if (val === undefined || val === null || val === "") return "-";
+ if (DATETIME_LIST_PROPS.has(prop)) {
+ const shown = formatDateTime(val);
+ if (shown && shown !== "-") return shown;
+ }
+ if (field?.type === "datetimerange") {
+ const shown = formatFieldDisplayValue(field, val);
+ if (shown) return shown;
+ }
+ if (field) return displayFieldValue({ ...field, value: val });
+ const known = formatKnownSelectLabel(prop, val);
+ if (known) return known;
+ return String(val);
}
/** 瀹℃壒璁板綍 result锛歛pproved | rejected | pending */
@@ -279,18 +323,23 @@
};
}
-/** 浠� formConfig 鎻愬彇鍒楄〃灞曠ず瀛楁锛坙abel + value锛� */
-export function buildFormDisplayRows(formConfig, listFields = []) {
- const fields = resolveInstanceDisplayFields(formConfig);
+/** 浠庡疄渚嬭鎻愬彇鍒楄〃灞曠ず瀛楁锛坙abel + value锛屽惈 formPayload锛� */
+export function buildFormDisplayRows(row, listFields = []) {
+ const { fields, formPayload } = resolveInstanceFormPayload(row);
+ const fieldByKey = new Map((fields || []).map(f => [f.key, f]));
const rows = [];
- const propKeys = (listFields || []).map(f => f.prop).filter(Boolean);
+ const defs = listFields || [];
- if (propKeys.length) {
- propKeys.forEach(prop => {
- const hit = fields.find(f => f.key === prop);
- if (hit) {
- rows.push({ label: hit.label, value: displayFieldValue(hit) });
- }
+ if (defs.length) {
+ defs.forEach(def => {
+ if (!def?.prop) return;
+ const prop = def.prop;
+ const hit = fieldByKey.get(prop);
+ const raw = resolveListFieldRawValue(prop, row, fields, formPayload);
+ rows.push({
+ label: def.label || hit?.label || prop,
+ value: formatListFieldDisplay(prop, raw, hit),
+ });
});
} else {
fields.slice(0, 3).forEach(f => {
@@ -303,17 +352,14 @@
/** 鍒楄〃琛屽寮猴紙淇濈暀鍘熷瀛楁渚涜鎯�/缂栬緫锛� */
export function mapInstanceListRow(row, listFields = []) {
if (!row) return {};
- const displayRows = buildFormDisplayRows(row.formConfig, listFields);
+ const displayRows = buildFormDisplayRows(row, listFields);
const extra = {};
- const formFields = resolveInstanceDisplayFields(row.formConfig);
+ const { fields, formPayload } = resolveInstanceFormPayload(row);
(listFields || []).forEach(def => {
if (!def?.prop) return;
- const hit = formFields.find(f => f.key === def.prop);
- extra[def.prop] = hit ? displayFieldValue(hit) : "-";
- });
- const formPayload = {};
- formFields.forEach(f => {
- if (f?.key) formPayload[f.key] = f.value ?? f.defaultValue ?? "";
+ const hit = fields.find(f => f.key === def.prop);
+ const raw = resolveListFieldRawValue(def.prop, row, fields, formPayload);
+ extra[def.prop] = formatListFieldDisplay(def.prop, raw, hit);
});
return {
...row,
@@ -322,6 +368,7 @@
createTime: formatDateTime(row.applyTime || row.createTime),
displayRows,
formPayload,
+ formFieldDefs: fields,
...extra,
};
}
--
Gitblit v1.9.3