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 @@
-
+
+ 暂无数据
+
+
+
+ handlePatientSelect(scope.row)"
+ class="custom-radio"
+ >
+
+
+
+
@@ -117,19 +95,18 @@
:span="24"
style="overflow: hidden; text-overflow: ellipsis; white-space: nowrap"
>
- 姓名:{{ scope.row.personName }}
-
-
-
+
+ 姓名:{{ scope.row.personName }}
+
-
- 性别:{{ scope.row.sex }}
- 年龄:{{ scope.row.age }}岁
+
+
+ 性别:{{ scope.row.sex }}
+
+
+ 年龄:{{ scope.row.age }}岁
+
@@ -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('删除失败')
+ }
+}