From 5b248a9716688d8132cfb02b4ba0abecd4060b06 Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期三, 20 五月 2026 11:49:08 +0800
Subject: [PATCH] 审批模板流程化
---
src/views/officeProcessAutomation/HrManage/regular-apply/index.vue | 101 +++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 82 insertions(+), 19 deletions(-)
diff --git a/src/views/officeProcessAutomation/HrManage/regular-apply/index.vue b/src/views/officeProcessAutomation/HrManage/regular-apply/index.vue
index b95b6e7..a807e6b 100644
--- a/src/views/officeProcessAutomation/HrManage/regular-apply/index.vue
+++ b/src/views/officeProcessAutomation/HrManage/regular-apply/index.vue
@@ -28,7 +28,7 @@
<el-button @click="resetSearch">閲嶇疆</el-button>
</div>
<div>
- <el-button type="primary" @click="openFormDialog('add')">鏂板杞鐢宠</el-button>
+ <el-button type="primary" @click="openAddWithTemplate">鏂板杞鐢宠</el-button>
</div>
</div>
<div class="table_list">
@@ -87,7 +87,7 @@
/>
</el-form-item>
</el-col>
- <el-col :span="12">
+ <el-col v-if="!form.hasTemplateBinding" :span="12">
<el-form-item label="瀹℃壒鏂瑰紡" prop="approvalMode">
<el-radio-group v-model="form.approvalMode">
<el-radio value="parallel">涓庣</el-radio>
@@ -96,7 +96,20 @@
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="24">
+ <template v-if="form.hasTemplateBinding">
+ <ApprovalTemplateFormSection
+ :active-template="form.templateSnapshot"
+ :fields="form.formFieldDefs"
+ :form-payload="form.formPayload"
+ v-model:flow-nodes="form.flowNodes"
+ v-model:attachments="form.storageBlobDTOs"
+ :template-attachments="form.templateAttachments"
+ :user-options="flowUserOptions"
+ :allow-change-template="formDialog.mode === 'add'"
+ @change-template="reopenTemplateBind"
+ />
+ </template>
+ <el-row v-else :gutter="24">
<el-col :span="24">
<el-form-item label="瀹℃壒浜�" prop="approverIds">
<el-tree-select
@@ -129,7 +142,7 @@
</el-form-item>
</el-col>
</el-row>
- <el-row :gutter="24">
+ <el-row v-if="!form.hasTemplateBinding" :gutter="24">
<el-col :span="24">
<el-form-item label="闄勪欢">
<div class="upload-block">
@@ -146,6 +159,12 @@
</div>
</template>
</el-dialog>
+
+ <ApprovalTemplateBindDialog
+ v-model:visible="templateBindVisible"
+ :module-key="APPROVAL_MODULE_KEYS.REGULAR"
+ @confirm="onTemplateBound"
+ />
<!-- 璇︽儏锛堝彧璇伙級 -->
<el-dialog v-model="detailDialog.visible" title="杞鐢宠璇︽儏" width="640px" append-to-body>
@@ -204,6 +223,14 @@
import FileUpload from "@/components/AttachmentUpload/file/index.vue";
import { deptTreeSelect, userListNoPageByTenantId } from "@/api/system/user.js";
import { computed, getCurrentInstance, nextTick, onMounted, reactive, ref, watch } from "vue";
+import ApprovalTemplateBindDialog from "../../ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue";
+import ApprovalTemplateFormSection from "../../ApproveManage/approve-shared/components/ApprovalTemplateFormSection.vue";
+import { APPROVAL_MODULE_KEYS } from "../../ApproveManage/approve-shared/approvalModuleRegistry.js";
+import {
+ applyBindingToForm,
+ buildFormPayloadRules,
+} from "../../ApproveManage/approve-shared/approvalTemplateBindingUtils.js";
+import { useFlowUserOptions } from "../../ApproveManage/approve-shared/useFlowUserOptions.js";
/** 涓庡悗绔害瀹氬瓧娈碉紙鍗犱綅锛� */
const createEmptyForm = () => ({
@@ -216,6 +243,15 @@
approverIds: [],
approverNames: "",
attachmentList: [],
+ hasTemplateBinding: false,
+ templateId: "",
+ templateName: "",
+ templateSnapshot: null,
+ formFieldDefs: [],
+ formPayload: {},
+ flowNodes: [],
+ templateAttachments: [],
+ storageBlobDTOs: [],
});
const { proxy } = getCurrentInstance();
@@ -511,22 +547,27 @@
});
const formRef = ref();
const form = reactive(createEmptyForm());
+const templateBindVisible = ref(false);
+const { flowUserOptions, loadFlowUsers } = useFlowUserOptions();
-const formRules = {
- applicantName: [{ required: true, message: "璇疯緭鍏ョ敵璇蜂汉", trigger: "blur" }],
- applyDate: [{ required: true, message: "璇烽�夋嫨鐢宠鏃ユ湡", trigger: "change" }],
- regularizationDate: [{ required: true, message: "璇烽�夋嫨杞鏃ユ湡", trigger: "change" }],
- probationSummary: [{ required: true, message: "璇峰~鍐欒瘯鐢ㄦ湡宸ヤ綔鎬荤粨", trigger: "blur" }],
- approvalMode: [{ required: true, message: "璇烽�夋嫨瀹℃壒鏂瑰紡", trigger: "change" }],
- approverIds: [
- {
- type: "array",
- required: true,
- message: "璇烽�夋嫨瀹℃壒浜�",
- trigger: "change",
- },
- ],
-};
+const formRules = computed(() => {
+ const base = {
+ applicantName: [{ required: true, message: "璇疯緭鍏ョ敵璇蜂汉", trigger: "blur" }],
+ applyDate: [{ required: true, message: "璇烽�夋嫨鐢宠鏃ユ湡", trigger: "change" }],
+ regularizationDate: [{ required: true, message: "璇烽�夋嫨杞鏃ユ湡", trigger: "change" }],
+ probationSummary: [{ required: true, message: "璇峰~鍐欒瘯鐢ㄦ湡宸ヤ綔鎬荤粨", trigger: "blur" }],
+ };
+ if (form.hasTemplateBinding) {
+ return { ...base, ...buildFormPayloadRules(form.formFieldDefs) };
+ }
+ return {
+ ...base,
+ approvalMode: [{ required: true, message: "璇烽�夋嫨瀹℃壒鏂瑰紡", trigger: "change" }],
+ approverIds: [
+ { type: "array", required: true, message: "璇烽�夋嫨瀹℃壒浜�", trigger: "change" },
+ ],
+ };
+});
const detailDialog = reactive({ visible: false });
const detailRow = ref({});
@@ -569,6 +610,27 @@
return;
}
proxy?.$modal?.msgSuccess?.(`宸叉ā鎷熶笅杞斤細${row.name}`);
+}
+
+function openAddWithTemplate() {
+ templateBindVisible.value = true;
+}
+
+function onTemplateBound(binding) {
+ Object.assign(form, createEmptyForm());
+ applyBindingToForm(form, binding);
+ form.hasTemplateBinding = true;
+ formDialog.mode = "add";
+ formDialog.title = "鏂板杞鐢宠";
+ loadApproverTree();
+ loadFlowUsers();
+ formDialog.visible = true;
+ nextTick(() => formRef.value?.clearValidate?.());
+}
+
+function reopenTemplateBind() {
+ formDialog.visible = false;
+ templateBindVisible.value = true;
}
function openFormDialog(mode, row) {
@@ -637,6 +699,7 @@
onMounted(() => {
loadApproverTree();
+ loadFlowUsers();
});
</script>
--
Gitblit v1.9.3