This commit is contained in:
yelan
2026-09-17 16:48:59 +08:00
22 changed files with 620 additions and 66 deletions
@@ -25,6 +25,7 @@ import type {
import type { SigningTaskRecord, SigningTemplate } from '@/api/workbench/types'
import NewSigningTaskDialog from '@/components/signing/NewSigningTaskDialog.vue'
import { useAppStore } from '@/stores/app'
import { useLoginStore } from '@/stores/login'
import { demoCampuses, demoDepartments } from '@/utils/mock-document-library'
import { mockFlags } from '@/utils/mock-flags'
import { clearMockState } from '@/utils/mock-storage'
@@ -65,8 +66,29 @@ import type {
*/
const router = useRouter()
const appStore = useAppStore()
const loginStore = useLoginStore()
const useMockLibrary = mockFlags.documents
const canCreateTemplate = computed(
() =>
!loginStore.isReadOnly &&
(useMockLibrary ||
loginStore.hasWritePermission(['sign:template:create', 'sign:template:version:create'])),
)
const canEditTemplate = computed(
() =>
!loginStore.isReadOnly &&
(useMockLibrary || loginStore.hasWritePermission('sign:template:version:create')),
)
const canArchiveTemplate = computed(
() =>
!loginStore.isReadOnly &&
(useMockLibrary || loginStore.hasWritePermission('sign:template:archive')),
)
const canInitiateSigning = computed(
() =>
!loginStore.isReadOnly && (useMockLibrary || loginStore.hasWritePermission('sign:task:create')),
)
/** 真实模式下的加载状态:区分"正在加载"与"确实没有模板" */
const libraryLoading = ref(false)
const libraryError = ref('')
@@ -361,6 +383,10 @@ async function handlePreview(template: DocumentTemplate) {
}
function showAddMessage() {
if (!canCreateTemplate.value) {
ElMessage.warning('当前账号没有创建文书模板的权限')
return
}
// Word 自维护方案:新增文书直接进入 Word 编辑器(粘贴/导入 .docx)。
wordEditingTemplate.value = null
wordEditorVisible.value = true
@@ -382,6 +408,11 @@ function closeWordEditor() {
* 保存后还会把模板正文冲掉。
*/
async function showEditMessage(template: DocumentTemplate) {
if (!canEditTemplate.value) {
ElMessage.warning('当前账号没有创建模板版本的权限')
return
}
if (useMockLibrary || template.contentHtml) {
wordEditingTemplate.value = template
wordEditorVisible.value = true
@@ -489,6 +520,11 @@ function toVersionPayload(form: TemplateEditorForm) {
}
async function saveTemplate(form: TemplateEditorForm) {
if ((!form.id && !canCreateTemplate.value) || (form.id && !canEditTemplate.value)) {
ElMessage.warning('当前账号没有保存此文书的权限')
return
}
if (useMockLibrary) {
if (form.id) {
updateLocalTemplate(form)
@@ -684,6 +720,11 @@ function closeVersions() {
* 语义上等于下架,已签署文书仍可追溯。
*/
async function removeTemplate(template: DocumentTemplate) {
if (!canArchiveTemplate.value) {
ElMessage.warning('当前账号没有下架文书的权限')
return
}
const confirmed = await ElMessageBox.confirm(
useMockLibrary
? `确定删除文书「${template.name}」?删除后不可恢复。`
@@ -765,6 +806,11 @@ async function toSigningTemplate(template: DocumentTemplate): Promise<SigningTem
}
async function openSigningDialog(template: DocumentTemplate) {
if (!canInitiateSigning.value) {
ElMessage.warning('当前账号没有发起签署任务的权限')
return
}
closePreview()
try {
@@ -856,6 +902,8 @@ onMounted(() => {
v-model="filters.keyword"
:total="filteredTemplates.length"
:show-reset="useMockLibrary"
:can-create="canCreateTemplate"
:can-export="useMockLibrary"
@add="showAddMessage"
@export="showExportMessage"
@reset="resetMockData"
@@ -880,6 +928,9 @@ onMounted(() => {
v-for="template in filteredTemplates"
:key="template.id"
:template="template"
:can-edit="canEditTemplate"
:can-initiate="canInitiateSigning"
:can-remove="canArchiveTemplate"
:is-mock="useMockLibrary"
@preview="handlePreview"
@edit="showEditMessage"