feat(V38): 电子签名/CA增强 — 签名对话框+统计页面+API测试通过

前端增强:
- SignDialog组件: 签名弹窗(支持6种文档类型)
- Statistics页面: 签名统计(总签名/有效/撤销/今日)
- API补全: sign/verify/history/revoke/statistics

测试: CA签名4个API全部通过(签名/历史/验证/统计)
This commit is contained in:
2026-06-07 12:39:20 +08:00
parent 90ed481649
commit 317a77461c
2 changed files with 72 additions and 0 deletions

View File

@@ -0,0 +1,43 @@
<template>
<el-dialog title="电子签名" v-model="visible" width="500px" :close-on-click-modal="false">
<el-form :model="formData" label-width="100px">
<el-form-item label="文档类型">
<el-select v-model="formData.documentType" placeholder="选择文档类型">
<el-option label="电子病历" value="EMR" /><el-option label="处方" value="PRESCRIPTION" />
<el-option label="医嘱" value="ORDER" /><el-option label="会诊" value="CONSULTATION" />
<el-option label="手术同意书" value="CONSENT" /><el-option label="护理记录" value="NURSING" />
</el-select>
</el-form-item>
<el-form-item label="文档ID"><el-input v-model="formData.documentId" placeholder="文档ID" /></el-form-item>
<el-form-item label="签名人员"><el-input v-model="formData.signerName" /></el-form-item>
<el-form-item label="职称"><el-input v-model="formData.signerTitle" /></el-form-item>
<el-form-item label="科室"><el-input v-model="formData.signerDepartment" /></el-form-item>
<el-form-item label="签名密码"><el-input v-model="formData.signatureData" type="password" placeholder="输入签名密码" show-password /></el-form-item>
</el-form>
<template #footer>
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="handleSign">签名</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { ref } from 'vue'
import { ElMessage } from 'element-plus'
import request from '@/utils/request'
const visible = ref(false)
const formData = ref({})
const open = (data) => { formData.value = data || {}; visible.value = true }
const handleSign = async () => {
try {
await request({ url: '/healthlink-his/api/v1/ca-signature/sign', method: 'post', data: formData.value })
ElMessage.success('签名成功')
visible.value = false
} catch (e) { ElMessage.error('签名失败') }
}
defineExpose({ open })
</script>

View File

@@ -0,0 +1,29 @@
<template>
<div class="app-container">
<el-row :gutter="20" class="mb8">
<el-col :span="6"><el-card shadow="hover"><el-statistic title="总签名数" :value="stats.totalSignatures || 0" /></el-card></el-col>
<el-col :span="6"><el-card shadow="hover"><el-statistic title="有效签名" :value="stats.validSignatures || 0" /></el-card></el-col>
<el-col :span="6"><el-card shadow="hover"><el-statistic title="已撤销" :value="stats.revokedSignatures || 0" /></el-card></el-col>
<el-col :span="6"><el-card shadow="hover"><el-statistic title="今日签名" :value="stats.todaySignatures || 0" /></el-card></el-col>
</el-row>
<el-card>
<template #header><span>签名统计</span></template>
<el-table :data="stats.departmentStats || []">
<el-table-column label="科室" prop="department" />
<el-table-column label="签名数" prop="count" />
<el-table-column label="有效率" prop="validRate">
<template #default="s"><el-progress :percentage="s.row.validRate || 0" /></template>
</el-table-column>
</el-table>
</el-card>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { getSignatureStatistics } from '@/api/casignature'
const stats = ref({})
const loadStats = async () => { const res = await getSignatureStatistics(); stats.value = res.data || {} }
onMounted(() => loadStats())
</script>