From d87da93abdbffcdebeceecd1f50db0c2d83f2bd3 Mon Sep 17 00:00:00 2001 From: Euni4U <958079825@qq.com> Date: Thu, 27 Feb 2025 16:45:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BD=93=E6=A3=80=E7=99=BB?= =?UTF-8?q?=E8=AE=B0=E6=A0=B7=E5=BC=8F=E4=BB=A5=E5=8F=8A=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=82=A3=E8=80=85=E4=BF=A1=E6=81=AF=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/inspect/inspectpatientitems/index.ts | 5 + src/views/Charge/Charge.vue | 18 +- src/views/inspect/physicalEnroll/index.vue | 314 +++++++++++++------ 3 files changed, 233 insertions(+), 104 deletions(-) diff --git a/src/api/inspect/inspectpatientitems/index.ts b/src/api/inspect/inspectpatientitems/index.ts index 79a4dcd..81cd922 100644 --- a/src/api/inspect/inspectpatientitems/index.ts +++ b/src/api/inspect/inspectpatientitems/index.ts @@ -58,6 +58,11 @@ export const PatientitemsApi = { return await request.delete({ url: `/Inspect/patientitems/delete?id=` + id }) }, + // 删除患者所有体检项目 + deletePatientitemsAll: async (medicalSn: string) => { + return await request.delete({ url: `/Inspect/patientitems/deletemedicalSn?medicalSn=` + medicalSn }) + }, + // 导出患者体检项目 Excel exportPatientitems: async (params) => { return await request.download({ url: `/Inspect/patientitems/export-excel`, params }) diff --git a/src/views/Charge/Charge.vue b/src/views/Charge/Charge.vue index b710cac..2e93f85 100644 --- a/src/views/Charge/Charge.vue +++ b/src/views/Charge/Charge.vue @@ -446,18 +446,26 @@ const fetchPatientsByDate = async () => { `${formatDate(startDate)} 00:00:00`, `${formatDate(endDate)} 23:59:59` ], - // 添加收费状态筛选参数 - chargeStatus: chargeStatus.value === 'unpaid' ? '0' : '1', // 添加搜索关键词 pname: searchQuery.value || undefined } const res = await PatientApi.getPatientPage(params) - patients.value = res.list - total.value = res.total + + // 在前端根据chargeType字段筛选 + if (chargeStatus.value === 'unpaid') { + // 筛选未收费的患者(chargeType为null、undefined或空字符串) + patients.value = res.list.filter(patient => !patient.chargeType || patient.chargeType === '') + } else { + // 筛选已收费的患者(chargeType有值且不为空字符串) + patients.value = res.list.filter(patient => patient.chargeType && patient.chargeType !== '') + } + + // 更新总数 + total.value = patients.value.length // 如果没有查询到患者,清除选中状态 - if (!patients.value.length) { + if (patients.value.length === 0) { selectedPatient.value = null } } catch (error) { diff --git a/src/views/inspect/physicalEnroll/index.vue b/src/views/inspect/physicalEnroll/index.vue index 8324531..b8c4177 100644 --- a/src/views/inspect/physicalEnroll/index.vue +++ b/src/views/inspect/physicalEnroll/index.vue @@ -39,38 +39,6 @@ 已登记 -
- - 新增 - - - 读取身份证 - -
@@ -89,11 +57,6 @@ - + + + + @@ -312,6 +289,7 @@ 'width: 110px' ]" v-show="!personInfoCustomAdd && !isEditing" + :disabled="!selectedPatient" > 修改信息 @@ -351,9 +329,55 @@ width: 126px; " v-show="!personInfoCustomAdd" + :disabled="!selectedPatient" > 打印导检单 + + 新增 + + + 读取身份证 + + + 删除此人 + - 删除 + 删除项目 @@ -835,6 +859,7 @@ const checkInfoParam_extra = ref({ }) //表格核心 const personData = ref([]) +const personDataOriginal = ref([]) // 添加一个存储原始数据的ref const personTotal = ref(0) const projectTable = ref([{}, {}, {}, {}]) const projectTable_extra = ref({ @@ -909,10 +934,6 @@ const handlePhotographRemove = () => { } const handlePersonInfoEdit = () => { - if (!selectedPatient.value) { - message.warning('请先在左侧选择一名患者') - return - } isEditing.value = true } @@ -920,6 +941,8 @@ const handlePersonInfoCustomAdd = () => { personInfoCustomAdd.value = true isEditing.value = true // 清空表单数据,准备新增 + selectedPatient.value = null + selectedPatientId.value = null personParam.value = { avatar: '', testNum: '', @@ -930,8 +953,6 @@ const handlePersonInfoCustomAdd = () => { mobile: '' } comboInfoTable1.value = [] - // 取消当前选中的患者 - selectedPatient.value = null } const handlePersonInfoIDCard2nd = () => { @@ -1039,7 +1060,8 @@ const handlePersonInfoCancel = () => { if (selectedPatient.value) { handlePatientSelect(selectedPatient.value) } else { - // 否则清空表单 + // 否则清空表单和单选按钮 + selectedPatientId.value = null personParam.value = { avatar: '', testNum: '', @@ -1064,13 +1086,11 @@ const getPatientData = async () => { checkPersonLoading.value = true const params = { pageNo: searchForm.value.pageNumber, - pageSize: searchForm.value.pageSize, - // 只有当有输入时才加入姓名查询条件 - ...(searchForm.value.personName && { pname: searchForm.value.personName }) + pageSize: searchForm.value.pageSize } const res = await PatientApi.getPatientPage(params) - personData.value = res.list.map(item => ({ + const mappedData = res.list.map(item => ({ id: item.id, medicalSn: item.medicalSn, personName: item.pname, @@ -1082,10 +1102,14 @@ const getPatientData = async () => { physicalType: item.chargeType, status: item.status })) + + personDataOriginal.value = mappedData // 保存原始数据 + personData.value = mappedData personTotal.value = res.total || 0 } catch (error) { console.error('获取患者数据出错:', error) message.error('获取患者数据出错') + personDataOriginal.value = [] personData.value = [] personTotal.value = 0 } finally { @@ -1106,10 +1130,18 @@ const calculateAge = (birthday) => { return age.toString() } -// 使用防抖处理搜索 +// 修改搜索监听函数,使用本地过滤 const debouncedSearch = debounce(() => { - searchForm.value.pageNumber = 1 - getPatientData() + const keyword = searchForm.value.personName?.trim().toLowerCase() + if (!keyword) { + personData.value = personDataOriginal.value + } else { + personData.value = personDataOriginal.value.filter(item => + item.personName.toLowerCase().includes(keyword) + ) + } + // 更新总数 + personTotal.value = personData.value.length }, 300) // 修改监听函数,使用防抖 @@ -1130,6 +1162,7 @@ watch(() => searchForm_extra.value.passStatus, () => { // 添加选中患者的 ref const selectedPatient = ref(null) +const selectedPatientId = ref(null) // 修改加载患者项目的方法,减少不必要的API请求 const loadPatientProjects = async (medicalSn) => { @@ -1177,11 +1210,12 @@ const loadPatientProjects = async (medicalSn) => { // 修改选择患者的处理方法 const handlePatientSelect = async (row) => { try { - console.log('选中患者:', row) // 添加调试日志 - - // 如果点击的是当前选中行,则取消选中并清空右侧页面 + // 如果点击的是当前选中行,则取消选中 if (selectedPatient.value?.id === row.id) { selectedPatient.value = null + selectedPatientId.value = null + + // 清空表单数据 personParam.value = { avatar: '', testNum: '', @@ -1192,15 +1226,22 @@ const handlePatientSelect = async (row) => { mobile: '' } comboInfoTable1.value = [] + + personInfoEdit.value = false + personInfoDelete.value = false + return } // 设置新选中的患者 - selectedPatient.value = row + selectedPatient.value = { + ...row, + chargeType: row.chargeType + } + selectedPatientId.value = row.id // 获取患者详情 const res = await PatientApi.getPatient(row.id) - console.log('获取到患者详情:', res) // 添加调试日志 if (res) { personParam.value = { @@ -1220,17 +1261,15 @@ const handlePatientSelect = async (row) => { // 如果有体检编号,加载体检项目 if (res.medicalSn) { - console.log('开始加载患者体检项目, 体检编号:', res.medicalSn) // 添加调试日志 await loadPatientProjects(res.medicalSn) } else { - console.log('患者没有体检编号,不加载项目') // 添加调试日志 comboInfoTable1.value = [] } } } catch (error) { - console.error('获取患者详情失败:', error) - ElMessage.error('获取患者详情失败') + message.error('获取患者详情失败') selectedPatient.value = null + selectedPatientId.value = null // 确保出错时也有默认值 personParam.value = { avatar: '', @@ -1310,7 +1349,6 @@ const handleComboInfoSearch = () => { // 选中套餐项目 const handleComboInfoSelection = (selection) => { - console.log('套餐选择变化:', selection) // 添加调试日志 comboInfoSelectedData.value = selection } @@ -1368,11 +1406,10 @@ const handleCheckInfoSearch = () => { // 选中检查项目 const handleCheckInfoSelection = (selection) => { - console.log('检查项目选择变化:', selection) // 添加调试日志 checkInfoSelectedData.value = selection } -// 修复确认选择项目的方法 - 只在UI中添加项目,不保存到数据库 +// 修改确认选择项目的方法 const confirmSelectedProjects = async () => { try { let selectedProjects: ProjectDetail[] = [] @@ -1384,14 +1421,10 @@ const confirmSelectedProjects = async () => { processedItemCodes.add(item.itemCode) }) - console.log('现有项目的itemCode:', Array.from(processedItemCodes)) - if (selectProjectDrawerTabName.value === 'comboInfo') { // 处理套餐项目 for (const combo of comboInfoSelectedData.value) { try { - console.log('处理选中的套餐:', combo) - // 获取套餐下的所有项目 const moduleItems = await ExammoduleApi.getListExammodule() // 过滤出当前套餐的项目 @@ -1399,23 +1432,16 @@ const confirmSelectedProjects = async () => { item.examModuleID === combo.examModuleID ) - console.log('当前套餐的项目:', filteredItems) - // 逐个处理套餐中的项目 for (const moduleItem of filteredItems) { // 如果已经处理过这个itemCode,跳过 if (processedItemCodes.has(moduleItem.itemCode)) { - console.log(`项目 ${moduleItem.itemCode} 已存在,跳过`) continue } try { - // 使用itemCode查询项目详情 - console.log('查询项目详情,itemCode:', moduleItem.itemCode) - - // 获取项目详情 - 使用自定义方法通过itemCode查询 + // 获取项目详情 const itemDetail = await getItemDetailByCode(moduleItem.itemCode) - console.log('获取到项目详情:', itemDetail) // 添加到已处理集合 processedItemCodes.add(moduleItem.itemCode) @@ -1444,7 +1470,6 @@ const confirmSelectedProjects = async () => { }) } } catch (itemError) { - console.error('处理项目失败:', itemError) // 出错时也尝试添加项目,使用套餐数据 if (!processedItemCodes.has(moduleItem.itemCode)) { processedItemCodes.add(moduleItem.itemCode) @@ -1461,7 +1486,7 @@ const confirmSelectedProjects = async () => { } } } catch (comboError) { - console.error('处理套餐失败:', comboError) + message.error('处理套餐失败') } } } else if (selectProjectDrawerTabName.value === 'checkInfo') { @@ -1469,7 +1494,6 @@ const confirmSelectedProjects = async () => { for (const item of checkInfoSelectedData.value) { // 如果已经处理过这个itemCode,跳过 if (processedItemCodes.has(item.itemCode)) { - console.log(`项目 ${item.itemCode} 已存在,跳过`) continue } @@ -1488,8 +1512,6 @@ const confirmSelectedProjects = async () => { } } - console.log('最终要添加的项目:', selectedProjects) - if (selectedProjects.length > 0) { // 只添加到前端表格,不保存到数据库 comboInfoTable1.value = [...comboInfoTable1.value, ...selectedProjects] @@ -1500,7 +1522,6 @@ const confirmSelectedProjects = async () => { selectProjectDrawerShow.value = false } catch (error) { - console.error('添加项目失败:', error) message.error('添加项目失败') } } @@ -1648,7 +1669,10 @@ const handleIdCardInput = (value) => { // 添加行类名方法 const getRowClassName = ({ row }) => { // 如果处于编辑/新增模式,添加禁用样式 - return personInfoCustomAdd.value ? 'disabled-row' : '' + if (personInfoCustomAdd.value) return 'disabled-row' + // 如果是选中的行,添加选中样式 + if (selectedPatient.value?.id === row.id) return 'selected-row' + return '' } // 确保表格分页参数正确 @@ -1665,6 +1689,72 @@ watch(() => [comboInfoParam.value.pageNumber, comboInfoParam.value.pageSize], () const isEditable = computed(() => { return personInfoCustomAdd.value || isEditing.value }) + +// 在 script setup 部分添加删除方法 +const handlePersonInfoDelete = async () => { + if (!selectedPatient.value) { + message.warning('请先选择要删除的人员') + return + } + + // 添加收费状态判断 + const data = await PatientApi.getPatient(selectedPatient.value.id) + if (data.chargeType) { + ElMessage.error('已收费的记录不能删除') + return + } + + try { + // 确认删除 + await ElMessageBox.confirm( + '删除后将无法恢复,是否确认删除该人员及其所有体检项目?', + '警告', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + } + ) + + // 1. 删除患者的体检项目 + if (data.chargeType) { + ElMessage.error('已收费的记录不能删除') + } + else { + await PatientitemsApi.deletePatientitemsAll(selectedPatient.value.medicalSn) + } + + // 2. 删除患者信息 + await PatientApi.deletePatient(selectedPatient.value.id) + + message.success('删除成功') + + // 3. 重置选中状态 + selectedPatient.value = null + selectedPatientId.value = null + + // 4. 清空右侧表单 + personParam.value = { + avatar: '', + testNum: '', + personName: '', + sex: '', + age: '', + idCard: '', + mobile: '' + } + comboInfoTable1.value = [] + + // 5. 刷新列表 + await getPatientData() + + } catch (error) { + if (error === 'cancel') { + return + } + message.error('删除失败') + } +}