feat(documents): 接入文档库真实接口

This commit is contained in:
xy
2026-09-17 18:46:09 +08:00
parent 81530b5dd6
commit 8b1cbee16f
8 changed files with 136 additions and 59 deletions
@@ -10,6 +10,7 @@ const props = defineProps<{
template: DocumentTemplate
canEdit: boolean
canInitiate: boolean
canWorkflow: (action: TemplateVersionAction) => boolean
canRemove: boolean
/** 演示模式下「删除」是真删;真实模式下语义是下架(模板无 DELETE 接口,走归档) */
isMock: boolean
@@ -31,9 +32,7 @@ const statusTone = computed(() => readStatusTone(props.template))
/** 只有已发布 / 待复审的模板可以发起签署;草稿与已归档不可用 */
const canInitiateTemplate = computed(
() =>
props.canInitiate &&
(props.template.status === 'published' || props.template.status === 'review'),
() => props.canInitiate && Boolean(props.template.currentVersionId || props.isMock),
)
const initiateTitle = computed(() =>
@@ -64,6 +63,8 @@ const primaryAction = computed<{ key: TemplateVersionAction; label: string } | n
return { key: 'submit-review', label: '重新提交' }
case 'DISABLED':
return { key: 'publish', label: '重新启用' }
case 'APPROVED':
return { key: 'publish', label: '发布' }
default:
return null
}
@@ -75,21 +76,21 @@ const primaryAction = computed<{ key: TemplateVersionAction; label: string } | n
* 「驳回」不能只做成主动作的反面:审核通过和驳回是审核人的一对选择,
* 必须同时可见,否则待审核的文书就只能通过、不能打回。
*/
const secondaryActions = computed<
{ key: TemplateVersionAction; label: string; title: string }[]
>(() => {
if (props.template.backendStatus === 'PENDING_REVIEW') {
return [
{
key: 'reject',
label: '驳回',
title: '驳回后需填写原因,科室按意见修改并重新提交',
},
]
}
const secondaryActions = computed<{ key: TemplateVersionAction; label: string; title: string }[]>(
() => {
if (props.template.backendStatus === 'PENDING_REVIEW' && props.canWorkflow('reject')) {
return [
{
key: 'reject',
label: '驳回',
title: '驳回后需填写原因,科室按意见修改并重新提交',
},
]
}
return []
})
return []
},
)
/**
* 本次交付暂不包含「版本历史」与「删除 / 下架」入口,先隐藏对应按钮。
@@ -136,10 +137,9 @@ const removeTitle = computed(() => (props.isMock ? '删除此文书' : '下架
版本
</button>
<button
v-if="canInitiate"
v-if="canInitiateTemplate"
type="button"
class="card-button primary"
:disabled="!canInitiateTemplate"
:title="initiateTitle"
@click="emit('initiate', template)"
>
@@ -147,7 +147,7 @@ const removeTitle = computed(() => (props.isMock ? '删除此文书' : '下架
</button>
<!-- 还不能签署时,把「当前该做的下一步」放在同一位置,避免按钮越堆越多 -->
<button
v-else-if="primaryAction"
v-if="primaryAction && canWorkflow(primaryAction.key)"
type="button"
class="card-button primary"
:title="`${primaryAction.label}后才能发起签署`"
@@ -19,6 +19,7 @@ const props = defineProps<{
template: DocumentTemplate | null
campuses: CampusRecord[]
departments: DepartmentRecord[]
isMock: boolean
}>()
const emit = defineEmits<{
@@ -52,7 +53,7 @@ const form = reactive<TemplateEditorForm>({
campusId: props.campuses[0]?.id ?? '',
departmentId: '',
category: '知情同意书',
versionNo: 'v1.0.0',
versionNo: 'v1',
contentHtml: '',
})
@@ -80,7 +81,7 @@ watch(
campusId: template?.campusId ?? props.campuses[0]?.id ?? '',
departmentId: template?.departmentId ?? '',
category: template?.category ?? '知情同意书',
versionNo: template?.version ?? 'v1.0.0',
versionNo: template?.version ?? 'v1',
contentHtml: template?.contentHtml ?? '',
})
valueHtml.value = template?.contentHtml || '<p><br></p>'
@@ -224,11 +225,21 @@ function save() {
</label>
<label class="meta-field">
<span>文书编号</span>
<input v-model="form.templateCode" type="text" placeholder="如 TPL-XXX-001" />
<input
v-model="form.templateCode"
type="text"
placeholder="如 TPL-XXX-001"
:disabled="Boolean(template)"
:title="template ? '文书编号创建后不可修改' : undefined"
/>
</label>
<label class="meta-field">
<span>所属院区</span>
<select v-model="form.campusId" @change="handleCampusChange">
<select
v-model="form.campusId"
:disabled="Boolean(template)"
@change="handleCampusChange"
>
<option v-for="campus in campuses" :key="campus.id" :value="campus.id">
{{ campus.name }}
</option>
@@ -236,7 +247,7 @@ function save() {
</label>
<label class="meta-field">
<span>所属科室</span>
<select v-model="form.departmentId">
<select v-model="form.departmentId" :disabled="Boolean(template)">
<option value="">全院通用</option>
<option
v-for="department in availableDepartments"
@@ -253,7 +264,8 @@ function save() {
</label>
<label class="meta-field">
<span>版本号</span>
<input v-model="form.versionNo" type="text" />
<input v-if="isMock" v-model="form.versionNo" type="text" />
<span v-else class="auto-version">由系统按 vN 自动生成</span>
</label>
</div>