From 3a2ab7f3a7f89cd299df07126d74a2c6f3ce91f8 Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期三, 03 六月 2026 20:18:59 +0800
Subject: [PATCH] 提交:山西林昇焱工贸有限公司/山西羿神晟农生物科技发展有限公司 配置文件

---
 src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue |  176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 176 insertions(+), 0 deletions(-)

diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue
new file mode 100644
index 0000000..409dd41
--- /dev/null
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue
@@ -0,0 +1,176 @@
+<!--
+  涓氬姟妯″潡銆屾柊澧炪�嶆椂瀵煎叆瀹℃壒妯℃澘锛堝浐瀹� moduleKey锛屼粎灞曠ず璇ョ被鍨嬩笅妯℃澘锛�
+
+  鐢ㄦ硶锛�
+  <ApprovalTemplateBindDialog
+    v-model:visible="visible"
+    module-key="regular"
+    @confirm="onTemplateBound"
+  />
+-->
+<template>
+  <el-dialog
+    v-model="dialogVisible"
+    :title="dialogTitle"
+    :width="step === formStep ? 720 : 640"
+    append-to-body
+    class="approval-template-bind-dialog"
+    @closed="onClosed"
+  >
+    <template v-if="step === 1">
+      <div v-loading="templatesLoading || confirming">
+        <ApprovalTemplatePicker
+          :cards="templateCards"
+          :loading="false"
+          :hint="pickerHint"
+          @pick="onPickTemplate"
+        />
+      </div>
+    </template>
+
+    <template v-else>
+      <div v-loading="templatesLoading">
+        <el-form
+          ref="formRef"
+          :model="bindingForm"
+          :rules="mergedRules"
+          label-width="120px"
+        >
+          <ApprovalTemplateFormSection
+            :active-template="activeTemplate"
+            :fields="formFields"
+            :form-payload="bindingForm.formPayload"
+            v-model:flow-nodes="bindingForm.flowNodes"
+            v-model:attachments="bindingForm.storageBlobDTOs"
+            :template-attachments="bindingForm.templateAttachments"
+            :user-options="flowUserOptions"
+            allow-change-template
+            @change-template="step = 1"
+          />
+        </el-form>
+      </div>
+    </template>
+
+    <template #footer>
+      <el-button v-if="step === formStep" type="primary" :loading="confirming" @click="onConfirm">
+        纭� 瀹�
+      </el-button>
+      <el-button v-if="step === formStep" @click="step = 1">閲嶉�夋ā鏉�</el-button>
+      <el-button @click="dialogVisible = false">{{ step === 1 ? "鍙� 娑�" : "鍏� 闂�" }}</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+import { computed, ref, watch } from "vue";
+import { ElMessage } from "element-plus";
+import ApprovalTemplatePicker from "./ApprovalTemplatePicker.vue";
+import ApprovalTemplateFormSection from "./ApprovalTemplateFormSection.vue";
+import { useApprovalTemplateBinding } from "../useApprovalTemplateBinding.js";
+import { useFlowUserOptions } from "../useFlowUserOptions.js";
+import { getApprovalModuleConfig } from "../approvalModuleRegistry.js";
+
+const props = defineProps({
+  visible: { type: Boolean, default: false },
+  /** approvalModuleRegistry 涓殑 moduleKey */
+  moduleKey: { type: String, required: true },
+  /** 涓� true 鏃堕�夋ā鏉垮悗鐩存帴纭锛岃烦杩囥�岀‘璁ゅ鎵逛俊鎭�嶅~鎶ユ楠� */
+  skipFormConfirm: { type: Boolean, default: false },
+});
+
+const emit = defineEmits(["update:visible", "confirm", "closed"]);
+
+const dialogVisible = computed({
+  get: () => props.visible,
+  set: (v) => emit("update:visible", v),
+});
+
+const {
+  step,
+  bindingForm,
+  templateCards,
+  activeTemplate,
+  formFields,
+  formRules,
+  templatesLoading,
+  loadTemplates,
+  resetBinding,
+  pickTemplate,
+  validateBinding,
+  getBindingPayload,
+  moduleConfig,
+} = useApprovalTemplateBinding({ moduleKey: props.moduleKey, mode: "module" });
+
+const formStep = 2;
+const formRef = ref();
+const confirming = ref(false);
+const { flowUserOptions, loadFlowUsers } = useFlowUserOptions();
+
+const mergedRules = computed(() => ({ ...formRules.value }));
+
+const dialogTitle = computed(() => {
+  const label = moduleConfig.value?.label || "瀹℃壒";
+  return step.value === 1 ? `閫夋嫨${label}妯℃澘` : `纭${label}瀹℃壒淇℃伅`;
+});
+
+const pickerHint = computed(
+  () => `璇烽�夋嫨銆�${moduleConfig.value?.label || "鈥�"}銆嶇被鍨嬩笅宸插惎鐢ㄧ殑瀹℃壒妯℃澘锛屽鎵规祦绋嬪皢鑷姩甯﹀叆銆俙
+);
+
+watch(
+  () => props.visible,
+  async (v) => {
+    if (!v) return;
+    resetBinding();
+    step.value = 1;
+    await Promise.all([loadTemplates(), loadFlowUsers()]);
+    const cfg = getApprovalModuleConfig(props.moduleKey);
+    if (!cfg) {
+      ElMessage.warning(`鏈厤缃ā鍧椼��${props.moduleKey}銆嶏紝璇锋鏌� approvalModuleRegistry`);
+      return;
+    }
+    if (!templateCards.value.length) {
+      ElMessage.warning(
+        `銆�${cfg.label}銆嶄笅鏆傛棤宸插惎鐢ㄧ殑瀹℃壒妯℃澘锛岃鍏堝湪瀹℃壒妯℃澘绠$悊涓垱寤哄苟鍚敤瀵瑰簲绫诲瀷鐨勬ā鏉縛
+      );
+    }
+  }
+);
+
+async function onPickTemplate(card) {
+  const ok = await pickTemplate(card);
+  if (!ok) return;
+  if (props.skipFormConfirm) {
+    step.value = 1;
+    await onConfirm();
+    return;
+  }
+  step.value = formStep;
+}
+
+async function onConfirm() {
+  confirming.value = true;
+  try {
+    const check = await validateBinding(props.skipFormConfirm ? null : formRef.value);
+    if (!check.ok) {
+      if (check.message) ElMessage.warning(check.message);
+      return;
+    }
+    emit("confirm", { ...getBindingPayload(), flowNodes: check.nodes });
+    dialogVisible.value = false;
+  } finally {
+    confirming.value = false;
+  }
+}
+
+function onClosed() {
+  resetBinding();
+  emit("closed");
+}
+</script>
+
+<style scoped>
+.approval-template-bind-dialog :deep(.el-dialog__body) {
+  padding-top: 12px;
+}
+</style>

--
Gitblit v1.9.3