From 4ab0be7d4441f378add1f242b168d80fb27e65fe Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期五, 22 五月 2026 17:57:44 +0800
Subject: [PATCH] OA部分查询条件变更
---
src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js | 259 +++++++++++++++++++++++++++++++++++++++------------
1 files changed, 197 insertions(+), 62 deletions(-)
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
index fa9fade..67b9213 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
@@ -1,7 +1,6 @@
import {
getApprovalTemplateDetail,
listApprovalTemplate,
- TEMPLATE_TYPE_BUILTIN,
TEMPLATE_TYPE_CUSTOM,
} from "@/api/officeProcessAutomation/approvalTemplate.js";
import {
@@ -14,16 +13,26 @@
import useUserStore from "@/store/modules/user";
import { Search } from "@element-plus/icons-vue";
import { ElMessage, ElMessageBox } from "element-plus";
-import { computed, reactive, ref } from "vue";
+import { computed, getCurrentInstance, reactive, ref } from "vue";
import {
+ inferReimburseModuleKeyFromInstance,
+ loadReimburseDetailForInstance,
+ navigateToReimburseManageForEdit,
+ resolveFinReimbursementIdFromInstance,
+} from "../../ReimburseManage/shared/reimburseApproveBridge.js";
+import {
+ fetchBusinessTypeOptions,
formatDisplayTime,
mapEnabledFromApi,
- mapTemplateFromApi,
- unwrapTemplateDetail,
unwrapTemplateList,
} from "../approve-template/approveTemplateConstants.js";
-import { buildSubmitTemplateFromRow } from "../approve-template/formConfigUtils.js";
import {
+ buildFormPayloadRules,
+ buildTemplateBindingFromDetail,
+ validateTemplateBinding,
+} from "../approve-shared/approvalTemplateBindingUtils.js";
+import {
+ APPROVAL_STATUS_SEARCH_OPTIONS,
APPROVAL_TYPE_OPTIONS,
approvalStatusLabel,
approvalStatusTagType,
@@ -32,25 +41,34 @@
buildApproveInstanceDto,
buildEditFormFromInstanceRow,
buildInstanceDto,
- clearLegacyApproveListStorage,
createEmptySubmitForm,
mapInstanceFromApi,
mapSubmitTemplateCard,
- validateSubmitFlowNodes,
+ matchBusinessTypeValue,
unwrapInstancePage,
} from "./approveListConstants.js";
export function useApproveList() {
- clearLegacyApproveListStorage();
+ const { proxy } = getCurrentInstance() || {};
const userStore = useUserStore();
const tableData = ref([]);
- const submitTemplateCards = ref([]);
+ const searchBusinessTypeOptions = ref([]);
+ const submitBusinessTypeOptions = ref([]);
+ const allSubmitTemplates = ref([]);
+ const selectedBusinessType = ref("");
const submitTemplatesLoading = ref(false);
+ const submitTemplateCards = computed(() => {
+ if (selectedBusinessType.value == null || selectedBusinessType.value === "") return [];
+ return allSubmitTemplates.value.filter((card) =>
+ matchBusinessTypeValue(card.businessType, selectedBusinessType.value)
+ );
+ });
+
const searchForm = reactive({
- approvalType: "",
- applicantKeyword: "",
+ businessType: "",
+ status: "",
createTimeRange: [],
});
@@ -64,6 +82,16 @@
const approveOpinion = ref("");
const approveSubmitting = ref(false);
+ /** 宸梾/璐圭敤鎶ラ攢涓撶敤璇︽儏銆佸鎵瑰脊绐� */
+ const reimburseDialog = reactive({
+ visible: false,
+ mode: "detail",
+ moduleKey: "",
+ loading: false,
+ reimburseRow: {},
+ instanceRow: null,
+ });
+
const submitDialog = reactive({ visible: false, step: 1, mode: "add" });
const submitEditRow = ref(null);
const submitForm = reactive(createEmptySubmitForm(""));
@@ -75,9 +103,22 @@
if (submitDialog.mode === "edit") {
return `淇敼${activeTemplate.value?.label || submitForm.templateName || "瀹℃壒"}`;
}
- if (submitDialog.step === 1) return "閫夋嫨瀹℃壒妯℃澘";
+ if (submitDialog.step === 1) return "閫夋嫨妯℃澘绫诲瀷";
+ if (submitDialog.step === 2) return `閫夋嫨瀹℃壒妯℃澘${businessTypeLabel(selectedBusinessType.value) ? `锛�${businessTypeLabel(selectedBusinessType.value)}锛塦 : ""}`;
return `鎻愪氦${activeTemplate.value?.label || "瀹℃壒"}`;
});
+
+ const selectedBusinessTypeLabel = computed(() => businessTypeLabel(selectedBusinessType.value));
+
+ function businessTypeLabel(type) {
+ if (type == null || type === "") return "";
+ const hit = submitBusinessTypeOptions.value.find((x) => matchBusinessTypeValue(x.value, type));
+ return hit?.label || "";
+ }
+
+ function countTemplatesByBusinessType(type) {
+ return allSubmitTemplates.value.filter((card) => matchBusinessTypeValue(card.businessType, type)).length;
+ }
const activeTemplate = computed(() => submitForm.templateSnapshot || null);
@@ -88,26 +129,15 @@
return submitForm.formFieldDefs || [];
});
- const submitFormRules = computed(() => {
- const rules = {
- templateKey: [{ required: true, message: "璇烽�夋嫨瀹℃壒绫诲瀷", trigger: "change" }],
- };
- submitFormFields.value.forEach((f) => {
- if (!f.required) return;
- if (f.type === "number") {
- rules[`formPayload.${f.key}`] = [{ required: true, message: `璇峰~鍐�${f.label}`, trigger: "blur" }];
- } else if (f.type === "datetimerange") {
- rules[`formPayload.${f.key}`] = [{ required: true, message: `璇烽�夋嫨${f.label}`, trigger: "change" }];
- } else {
- rules[`formPayload.${f.key}`] = [{ required: true, message: `璇峰~鍐�${f.label}`, trigger: "blur" }];
- }
- });
- return rules;
- });
+ const submitFormRules = computed(() => ({
+ templateKey: [{ required: true, message: "璇烽�夋嫨瀹℃壒绫诲瀷", trigger: "change" }],
+ ...buildFormPayloadRules(submitFormFields.value),
+ }));
const tableColumn = ref([
{ label: "鐢宠浜虹紪鍙�", prop: "applicantNo", width: 110 },
{ label: "鐢宠浜哄悕绉�", prop: "applicantName", minWidth: 100 },
+ { label: "妯℃澘绫诲瀷", prop: "businessName", minWidth: 120 },
{
label: "瀹℃壒绫诲瀷",
prop: "approvalType",
@@ -186,17 +216,17 @@
async function loadSubmitTemplates() {
submitTemplatesLoading.value = true;
try {
- const [builtinRes, customRes] = await Promise.all([
- listApprovalTemplate(TEMPLATE_TYPE_BUILTIN),
+ const [typeOptions, customRes] = await Promise.all([
+ fetchBusinessTypeOptions(),
listApprovalTemplate(TEMPLATE_TYPE_CUSTOM),
]);
- const merged = [
- ...unwrapTemplateList(builtinRes),
- ...unwrapTemplateList(customRes),
- ].filter((row) => mapEnabledFromApi(row.enabled));
- submitTemplateCards.value = merged.map(mapSubmitTemplateCard);
+ submitBusinessTypeOptions.value = typeOptions;
+ allSubmitTemplates.value = unwrapTemplateList(customRes)
+ .filter((row) => mapEnabledFromApi(row.enabled))
+ .map(mapSubmitTemplateCard);
} catch {
- submitTemplateCards.value = [];
+ submitBusinessTypeOptions.value = [];
+ allSubmitTemplates.value = [];
ElMessage.error("鍔犺浇瀹℃壒妯℃澘澶辫触");
} finally {
submitTemplatesLoading.value = false;
@@ -209,10 +239,18 @@
}
function resetSearch() {
- searchForm.approvalType = "";
- searchForm.applicantKeyword = "";
+ searchForm.businessType = "";
+ searchForm.status = "";
searchForm.createTimeRange = [];
handleQuery();
+ }
+
+ async function loadSearchBusinessTypeOptions() {
+ try {
+ searchBusinessTypeOptions.value = await fetchBusinessTypeOptions();
+ } catch {
+ searchBusinessTypeOptions.value = [];
+ }
}
function pagination({ page: p, limit }) {
@@ -221,20 +259,58 @@
fetchApprovalList();
}
- function openDetail(row) {
+ async function openReimburseDetail(row, mode) {
+ const moduleKey = inferReimburseModuleKeyFromInstance(row);
+ if (!moduleKey) return false;
+ reimburseDialog.mode = mode;
+ reimburseDialog.moduleKey = moduleKey;
+ reimburseDialog.instanceRow = row;
+ reimburseDialog.visible = true;
+ reimburseDialog.loading = true;
+ reimburseDialog.reimburseRow = {};
+ try {
+ const { reimburseRow, moduleKey: resolvedMk } =
+ await loadReimburseDetailForInstance(row, moduleKey);
+ reimburseDialog.moduleKey = resolvedMk || moduleKey;
+ reimburseDialog.reimburseRow = reimburseRow;
+ return true;
+ } catch {
+ ElMessage.error("鍔犺浇鎶ラ攢璇︽儏澶辫触");
+ reimburseDialog.visible = false;
+ return false;
+ } finally {
+ reimburseDialog.loading = false;
+ }
+ }
+
+ async function openDetail(row) {
+ if (isReimburseApprovalInstance(row)) {
+ await openReimburseDetail(row, "detail");
+ return;
+ }
detailRow.value = { ...row };
detailDialog.visible = true;
}
- function openApprove(row) {
+ async function openApprove(row) {
+ if (inferReimburseModuleKeyFromInstance(row)) {
+ approveOpinion.value = "";
+ await openReimburseDetail(row, "approve");
+ return;
+ }
approveDialog.row = { ...row };
approveOpinion.value = "";
approveDialog.visible = true;
}
+ function isReimburseApprovalInstance(row) {
+ return Boolean(inferReimburseModuleKeyFromInstance(row));
+ }
+
function resetSubmitDialogState() {
submitDialog.mode = "add";
submitDialog.step = 1;
+ selectedBusinessType.value = "";
submitEditRow.value = null;
Object.assign(submitForm, createEmptySubmitForm(""));
}
@@ -245,9 +321,23 @@
loadSubmitTemplates();
}
- function openEditDialog(row) {
+ async function openEditDialog(row) {
if (row?.approvalStatus !== "pending") {
ElMessage.warning("浠呭鏍镐腑鐨勫鎵瑰彲淇敼");
+ return;
+ }
+ const moduleKey = inferReimburseModuleKeyFromInstance(row);
+ if (moduleKey) {
+ const rid = resolveFinReimbursementIdFromInstance(row);
+ if (rid == null) {
+ ElMessage.warning("鏃犳硶淇敼锛氱己灏戞姤閿�鍗� ID");
+ return;
+ }
+ try {
+ await navigateToReimburseManageForEdit(proxy?.$router, moduleKey, rid);
+ } catch {
+ ElMessage.warning("鏈壘鍒板樊鏃�/璐圭敤鎶ラ攢鑿滃崟璺敱锛岃浠庡乏渚ц彍鍗曡繘鍏ュ悗鍐嶇紪杈�");
+ }
return;
}
if (!row?.id) {
@@ -255,7 +345,7 @@
return;
}
submitDialog.mode = "edit";
- submitDialog.step = 2;
+ submitDialog.step = 3;
submitEditRow.value = { ...row };
Object.assign(submitForm, buildEditFormFromInstanceRow(row));
submitDialog.visible = true;
@@ -266,19 +356,14 @@
submitTemplatesLoading.value = true;
try {
const res = await getApprovalTemplateDetail(card.id);
- const mapped = mapTemplateFromApi(unwrapTemplateDetail(res));
- const tpl = {
- ...buildSubmitTemplateFromRow(mapped),
- templateId: mapped.id,
- };
- const base = createEmptySubmitForm(String(card.id), tpl, mapped.flowNodes);
+ const applied = buildTemplateBindingFromDetail(res);
Object.assign(submitForm, {
- ...base,
- templateName: mapped.templateName || tpl.label || "",
- templateSnapshot: tpl,
- formFieldDefs: tpl.fields || [],
+ templateKey: String(card.id),
+ ...applied,
+ businessType:
+ applied.businessType ?? card.businessType ?? selectedBusinessType.value,
});
- submitDialog.step = 2;
+ submitDialog.step = 3;
} catch {
ElMessage.error("鍔犺浇妯℃澘璇︽儏澶辫触");
} finally {
@@ -286,8 +371,22 @@
}
}
- function backToTemplatePick() {
+ function onBusinessTypePick(type) {
+ if (!countTemplatesByBusinessType(type)) {
+ ElMessage.warning("璇ョ被鍨嬩笅鏆傛棤鍙敤瀹℃壒妯℃澘");
+ return;
+ }
+ selectedBusinessType.value = type;
+ submitDialog.step = 2;
+ }
+
+ function backToBusinessTypePick() {
+ selectedBusinessType.value = "";
submitDialog.step = 1;
+ }
+
+ function backToTemplatePick() {
+ submitDialog.step = 2;
}
async function submitInstanceForm() {
@@ -303,9 +402,9 @@
return false;
}
if (!activeTemplate.value) return false;
- const flowCheck = validateSubmitFlowNodes(submitForm.flowNodes);
- if (!flowCheck.ok) {
- ElMessage.warning(flowCheck.message);
+ const bindingCheck = validateTemplateBinding({ flowNodes: submitForm.flowNodes });
+ if (!bindingCheck.ok) {
+ ElMessage.warning(bindingCheck.message);
return false;
}
if (!submitForm.templateId) {
@@ -320,7 +419,7 @@
submitForm,
activeTemplate: activeTemplate.value,
userStore,
- flowNodes: flowCheck.nodes,
+ flowNodes: bindingCheck.nodes,
})
);
submitDialog.visible = false;
@@ -342,9 +441,9 @@
return false;
}
if (!activeTemplate.value) return false;
- const flowCheck = validateSubmitFlowNodes(submitForm.flowNodes);
- if (!flowCheck.ok) {
- ElMessage.warning(flowCheck.message);
+ const bindingCheck = validateTemplateBinding({ flowNodes: submitForm.flowNodes });
+ if (!bindingCheck.ok) {
+ ElMessage.warning(bindingCheck.message);
return false;
}
if (!submitForm.instanceId) {
@@ -358,7 +457,7 @@
buildInstanceDto({
submitForm,
activeTemplate: activeTemplate.value,
- flowNodes: flowCheck.nodes,
+ flowNodes: bindingCheck.nodes,
existingRow: submitEditRow.value,
})
);
@@ -413,6 +512,29 @@
}
}
+ async function submitReimburseApprove(result) {
+ const row = reimburseDialog.instanceRow;
+ if (!row?.id) return { ok: false };
+ if (result === "rejected" && !(approveOpinion.value || "").trim()) {
+ return { needOpinion: true };
+ }
+ if (approveSubmitting.value) return { ok: false };
+ approveSubmitting.value = true;
+ try {
+ await approveApprovalInstance(
+ buildApproveInstanceDto(row, result, approveOpinion.value)
+ );
+ reimburseDialog.visible = false;
+ await fetchApprovalList();
+ return { ok: true, result };
+ } catch {
+ ElMessage.error("瀹℃壒鎿嶄綔澶辫触");
+ return { ok: false };
+ } finally {
+ approveSubmitting.value = false;
+ }
+ }
+
async function submitApprove(result) {
const row = approveDialog.row;
if (!row?.id) return { ok: false };
@@ -450,6 +572,9 @@
return {
Search,
APPROVAL_TYPE_OPTIONS,
+ APPROVAL_STATUS_SEARCH_OPTIONS,
+ searchBusinessTypeOptions,
+ loadSearchBusinessTypeOptions,
approvalTypeLabel,
approvalStatusLabel,
approvalStatusTagType,
@@ -461,9 +586,12 @@
tableColumn,
detailDialog,
detailRow,
+ reimburseDialog,
approveDialog,
approveOpinion,
approveSubmitting,
+ submitReimburseApprove,
+ isReimburseApprovalInstance,
submitDialog,
isSubmitEdit,
submitDialogTitle,
@@ -473,7 +601,12 @@
activeTemplate,
submitFormFields,
submitFormRules,
+ submitBusinessTypeOptions,
submitTemplateCards,
+ selectedBusinessType,
+ selectedBusinessTypeLabel,
+ businessTypeLabel,
+ countTemplatesByBusinessType,
submitTemplatesLoading,
handleQuery,
resetSearch,
@@ -481,7 +614,9 @@
resetSubmitDialogState,
openSubmitDialog,
openEditDialog,
+ onBusinessTypePick,
onTemplatePick,
+ backToBusinessTypePick,
backToTemplatePick,
submitInstanceForm,
submitNewApproval,
--
Gitblit v1.9.3