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