Fix Bug #584: AI修复

This commit is contained in:
2026-05-27 03:14:45 +08:00
parent 4ee4dceb91
commit b95544dcdf
4 changed files with 319 additions and 53 deletions

View File

@@ -0,0 +1,145 @@
<template>
<div class="surgery-apply-list-container">
<el-card shadow="never">
<template #header>
<div class="card-header">
<span>手术申请历史列表</span>
<el-button type="primary" @click="handleRefresh">刷新</el-button>
</div>
</template>
<el-table :data="tableData" v-loading="loading" border style="width: 100%">
<el-table-column prop="applyNo" label="申请单号" width="160" />
<el-table-column prop="patientName" label="患者姓名" width="120" />
<el-table-column prop="surgeryName" label="手术名称" min-width="200" show-overflow-tooltip />
<el-table-column prop="applyTime" label="申请时间" width="180" />
<el-table-column prop="status" label="状态" width="120">
<template #default="{ row }">
<el-tag :type="getStatusType(row.status)">{{ getStatusLabel(row.status) }}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="180" fixed="right" class-name="operation-cell">
<template #default="{ row }">
<el-dropdown trigger="click" @command="(cmd) => handleOperation(cmd, row)">
<el-button type="primary" link size="small">
操作<el-icon class="el-icon--right"><arrow-down /></el-icon>
</el-button>
<template #dropdown>
<el-dropdown-menu>
<!-- 待签发 (0) -->
<el-dropdown-item v-if="row.status === 0" command="edit">编辑</el-dropdown-item>
<el-dropdown-item v-if="row.status === 0" command="delete" divided>删除</el-dropdown-item>
<!-- 已签发 (1) -->
<el-dropdown-item v-if="row.status === 1" command="revoke">撤回</el-dropdown-item>
<!-- 已校对/已执行/已安排/已完成 (2/3/4/5) -->
<el-dropdown-item v-if="[2,3,4,5].includes(row.status)" command="print">打印</el-dropdown-item>
<!-- 通用 -->
<el-dropdown-item command="detail" divided>详情</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-card>
<!-- 详情/编辑弹窗复用 -->
<SurgeryApplyDialog
v-model="dialogVisible"
:mode="dialogMode"
:data="currentRow"
@success="handleRefresh"
/>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { ElMessage, ElMessageBox } from 'element-plus';
import { ArrowDown } from '@element-plus/icons-vue';
import { getSurgeryApplyList, deleteSurgeryApply, revokeSurgeryApply } from '@/api/inpatient/surgery';
import SurgeryApplyDialog from './components/SurgeryApplyDialog.vue';
const loading = ref(false);
const tableData = ref<any[]>([]);
const dialogVisible = ref(false);
const dialogMode = ref<'view' | 'edit'>('view');
const currentRow = ref<any>(null);
const STATUS_MAP: Record<number, { label: string; type: string }> = {
0: { label: '待签发', type: 'info' },
1: { label: '已签发', type: 'warning' },
2: { label: '已校对', type: 'success' },
3: { label: '已执行', type: 'primary' },
4: { label: '已安排', type: '' },
5: { label: '已完成', type: 'success' },
6: { label: '已撤销', type: 'danger' },
7: { label: '已作废', type: 'info' }
};
const getStatusLabel = (status: number) => STATUS_MAP[status]?.label || '未知';
const getStatusType = (status: number) => STATUS_MAP[status]?.type || 'info';
const fetchData = async () => {
loading.value = true;
try {
const res = await getSurgeryApplyList({ patientId: 'current_patient_id' });
tableData.value = res.data || [];
} finally {
loading.value = false;
}
};
const handleRefresh = () => fetchData();
const handleOperation = async (command: string, row: any) => {
switch (command) {
case 'detail':
dialogMode.value = 'view';
currentRow.value = row;
dialogVisible.value = true;
break;
case 'edit':
dialogMode.value = 'edit';
currentRow.value = row;
dialogVisible.value = true;
break;
case 'delete':
try {
await ElMessageBox.confirm(
'确认删除该笔手术申请单吗?删除后数据还原将无法恢复。',
'删除确认',
{ confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning', confirmButtonClass: 'el-button--danger' }
);
await deleteSurgeryApply(row.id);
ElMessage.success('删除成功');
handleRefresh();
} catch (e) {
// 用户取消或请求失败
}
break;
case 'revoke':
try {
await revokeSurgeryApply(row.id);
ElMessage.success('撤回成功,单据已恢复至待签发状态');
handleRefresh();
} catch (err: any) {
ElMessage.error(err.response?.data?.msg || '撤回失败');
}
break;
case 'print':
window.open(`/inpatient/surgery/print/${row.id}`, '_blank');
break;
}
};
onMounted(fetchData);
</script>
<style scoped>
.surgery-apply-list-container { padding: 16px; }
.card-header { display: flex; justify-content: space-between; align-items: center; }
</style>