From 930d38ed2a3c2131be3305a585602c7a5a275fe3 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期二, 19 五月 2026 17:09:12 +0800
Subject: [PATCH] Merge branch 'dev-new_pro_OA' of http://114.132.189.42:9002/r/product-inventory-management into dev-new_pro_OA

---
 src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue |   89 +++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 78 insertions(+), 11 deletions(-)

diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue b/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue
index a79d546..9d7324c 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue
@@ -1,4 +1,4 @@
-<!--OA妯″潡锛氬鎵规ā鏉匡紙绯荤粺甯哥敤 + 鑷畾涔夊鑺傜偣娴佺▼锛�-->
+<!--OA妯″潡锛氬鎵规ā鏉�-->
 <template>
   <div class="app-container approve-template-page">
     <el-tabs v-model="activeTab" class="template-tabs">
@@ -9,8 +9,9 @@
             浠ヤ笅涓� OA 妯″潡鍐呯疆鐨勫父鐢ㄥ鎵圭被鍨嬶紝濉姤瀛楁涓庨粯璁ゅ鎵规柟寮忕敱绯荤粺缁存姢锛涙彁浜ゅ鎵规椂鍙洿鎺ラ�夌敤銆�
           </template>
         </el-alert>
-        <div class="builtin-grid">
-          <div v-for="item in builtinTemplates" :key="item.key" class="builtin-card">
+        <div v-loading="builtinLoading" class="builtin-grid">
+          <template v-if="builtinTemplates.length">
+            <div v-for="item in builtinTemplates" :key="item.key" class="builtin-card">
             <span class="builtin-label">{{ item.label }}</span>
             <p class="builtin-summary">{{ item.summary }}</p>
             <div class="builtin-meta">
@@ -20,7 +21,9 @@
               </el-tag>
               <el-tag size="small" type="info" effect="plain">鍙</el-tag>
             </div>
-          </div>
+            </div>
+          </template>
+          <el-empty v-else-if="!builtinLoading" description="鏆傛棤绯荤粺甯哥敤瀹℃壒妯℃澘" :image-size="80" />
         </div>
       </el-tab-pane>
 
@@ -66,7 +69,7 @@
     <el-dialog
       v-model="formDialog.visible"
       :title="formDialog.title"
-      width="960px"
+      width="1020px"
       append-to-body
       destroy-on-close
       class="template-form-dialog"
@@ -74,12 +77,24 @@
     >
       <el-form ref="formRef" :model="form" :rules="formRules" label-width="100px">
         <el-row :gutter="20">
-          <el-col :span="12">
+          <el-col :span="8">
             <el-form-item label="妯℃澘鍚嶇О" prop="templateName">
               <el-input v-model="form.templateName" placeholder="濡傦細椤圭洰绔嬮」瀹℃壒" maxlength="50" show-word-limit />
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <el-col :span="8">
+            <el-form-item label="妯℃澘绫诲瀷" prop="templateType">
+              <el-select v-model="form.templateType" placeholder="璇烽�夋嫨" style="width: 100%">
+                <el-option
+                  v-for="opt in TEMPLATE_TYPE_OPTIONS"
+                  :key="opt.value"
+                  :label="opt.label"
+                  :value="opt.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
             <el-form-item label="鍚敤鐘舵��">
               <el-switch v-model="form.enabled" active-text="鍚敤" inactive-text="鍋滅敤" />
             </el-form-item>
@@ -94,6 +109,10 @@
             maxlength="200"
             show-word-limit
           />
+        </el-form-item>
+        <el-form-item label="濉姤閰嶇疆">
+          <FormConfigEditor v-model="form.formConfigData" />
+          <p class="flow-tip">閰嶇疆鎻愪氦瀹℃壒鏃堕渶濉啓鐨勮〃鍗曢」锛屼繚瀛樺悗鍐欏叆 formConfig锛圝SON锛夈��</p>
         </el-form-item>
         <el-form-item label="瀹℃壒娴佺▼" required>
           <TemplateFlowEditor v-model="form.flowNodes" :user-options="flowUserOptions" />
@@ -110,17 +129,44 @@
 
     <!-- 璇︽儏 -->
     <el-dialog v-model="detailDialog.visible" title="妯℃澘璇︽儏" width="880px" append-to-body destroy-on-close>
+      <div v-loading="detailLoading" class="detail-dialog-body">
       <el-descriptions :column="2" border>
         <el-descriptions-item label="妯℃澘鍚嶇О">{{ detailRow.templateName }}</el-descriptions-item>
+        <el-descriptions-item label="妯℃澘绫诲瀷">{{ templateTypeLabel(detailRow.templateType) }}</el-descriptions-item>
         <el-descriptions-item label="鐘舵��">
           <el-tag :type="detailRow.enabled !== false ? 'success' : 'info'" size="small">
             {{ detailRow.enabled !== false ? "鍚敤" : "鍋滅敤" }}
           </el-tag>
         </el-descriptions-item>
         <el-descriptions-item label="璇存槑" :span="2">{{ detailRow.description || "鈥�" }}</el-descriptions-item>
-        <el-descriptions-item label="鍒涘缓鏃堕棿">{{ detailRow.createTime || "鈥�" }}</el-descriptions-item>
-        <el-descriptions-item label="鏇存柊鏃堕棿">{{ detailRow.updateTime || "鈥�" }}</el-descriptions-item>
+        <el-descriptions-item label="濉姤鎻愮ず" :span="2">
+          {{ detailFormConfig.summaryPlaceholder || "鈥�" }}
+        </el-descriptions-item>
+        <el-descriptions-item label="鍒涘缓浜�">{{ detailRow.createdUserName || "鈥�" }}</el-descriptions-item>
+        <el-descriptions-item label="鍒涘缓鏃堕棿">{{ formatDisplayTime(detailRow.createdTime) }}</el-descriptions-item>
+        <el-descriptions-item label="鏇存柊鏃堕棿">{{ formatDisplayTime(detailRow.updatedTime) }}</el-descriptions-item>
       </el-descriptions>
+      <el-divider content-position="left">濉姤椤癸紙{{ detailFormConfig.fields?.length || 0 }} 椤癸級</el-divider>
+      <el-table
+        v-if="detailFormConfig.fields?.length"
+        :data="detailFormConfig.fields"
+        border
+        size="small"
+        class="mb16"
+      >
+        <el-table-column prop="label" label="鏄剧ず鍚嶇О" min-width="120" />
+        <el-table-column prop="key" label="瀛楁鏍囪瘑" min-width="100" />
+        <el-table-column label="绫诲瀷" width="100">
+          <template #default="{ row }">{{ formFieldTypeLabel(row.type) }}</template>
+        </el-table-column>
+        <el-table-column label="蹇呭~" width="70" align="center">
+          <template #default="{ row }">{{ row.required !== false ? "鏄�" : "鍚�" }}</template>
+        </el-table-column>
+        <el-table-column label="榛樿鍊�" min-width="120" show-overflow-tooltip>
+          <template #default="{ row }">{{ formatDefaultValueDisplay(row) }}</template>
+        </el-table-column>
+      </el-table>
+      <el-empty v-else description="鏈厤缃~鎶ラ」" :image-size="48" class="mb16" />
       <el-divider content-position="left">瀹℃壒娴佺▼锛坽{ detailRow.flowNodes?.length || 0 }} 涓妭鐐癸級</el-divider>
       <div v-if="detailRow.flowNodes?.length" class="detail-flow">
         <div v-for="(node, index) in detailRow.flowNodes" :key="index" class="detail-node">
@@ -145,6 +191,7 @@
         </div>
       </div>
       <el-empty v-else description="鏆傛棤娴佺▼鑺傜偣" :image-size="60" />
+      </div>
       <template #footer>
         <el-button @click="detailDialog.visible = false">鍏� 闂�</el-button>
         <el-button type="primary" @click="editFromDetail">缂� 杈�</el-button>
@@ -156,16 +203,23 @@
 <script setup>
 import { ArrowRight, Document, Plus, RefreshRight } from "@element-plus/icons-vue";
 import { ElMessage } from "element-plus";
-import { onMounted, ref } from "vue";
+import { computed, onMounted, ref } from "vue";
 import { userListNoPageByTenantId } from "@/api/system/user.js";
+import FormConfigEditor from "./components/FormConfigEditor.vue";
 import TemplateFlowEditor from "./components/TemplateFlowEditor.vue";
+import { formatDisplayTime } from "./approveTemplateConstants.js";
+import { formatDefaultValueDisplay, formFieldTypeLabel, parseFormConfigToData } from "./formConfigUtils.js";
 import { useApproveTemplate } from "./useApproveTemplate.js";
 
 const at = useApproveTemplate();
 const {
   Search,
+  TEMPLATE_TYPE_OPTIONS,
+  templateTypeLabel,
   activeTab,
   builtinTemplates,
+  builtinLoading,
+  loadBuiltinTemplates,
   nodeSignModeLabel,
   searchForm,
   tableLoading,
@@ -178,6 +232,8 @@
   formRules,
   detailDialog,
   detailRow,
+  detailLoading,
+  fetchTemplateList,
   handleQuery,
   resetSearch,
   pagination,
@@ -187,6 +243,10 @@
 } = at;
 
 const flowUserOptions = ref([]);
+
+const detailFormConfig = computed(() =>
+  parseFormConfigToData(detailRow.value?.formConfigData ?? detailRow.value?.formConfig)
+);
 
 function unwrapArray(payload) {
   if (Array.isArray(payload)) return payload;
@@ -227,7 +287,8 @@
 
 onMounted(() => {
   loadUsers();
-  handleQuery();
+  loadBuiltinTemplates();
+  fetchTemplateList();
 });
 </script>
 
@@ -237,6 +298,9 @@
 }
 .mb16 {
   margin-bottom: 16px;
+}
+.mb16.el-empty {
+  padding: 8px 0;
 }
 .ml10 {
   margin-left: 10px;
@@ -355,6 +419,9 @@
   transform: translateY(-50%);
   color: var(--el-text-color-placeholder);
 }
+.detail-dialog-body {
+  min-height: 120px;
+}
 .text-muted {
   font-size: 12px;
   color: var(--el-text-color-placeholder);

--
Gitblit v1.9.3