From 9cba8fea1242372dd2f837462087f1f336afdb54 Mon Sep 17 00:00:00 2001 From: sindir Date: Mon, 19 Jan 2026 15:43:34 +0800 Subject: [PATCH 01/14] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=8C=BB=E7=94=9F?= =?UTF-8?q?=E5=B8=B8=E7=94=A8=E8=AF=AD=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20###=20=E5=90=8E=E7=AB=AF=E4=BF=AE=E6=94=B9=201.=20=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E7=B1=BBDoctorPhrase=EF=BC=9A=E5=AD=97=E6=AE=B5/?= =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E8=B0=83=E6=95=B4=202.=20=E6=9E=9A=E4=B8=BE?= =?UTF-8?q?=E5=AE=8C=E5=96=84=EF=BC=9A=E6=96=B0=E5=A2=9EDoctorPhraseAppTyp?= =?UTF-8?q?eEnum/DoctorPhraseBizTypeEnum=EF=BC=8C=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E4=B8=9A=E5=8A=A1=E5=88=86=E7=B1=BB=203.=20=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=B1=BB=EF=BC=9A=E4=BF=AE=E6=AD=A3=E7=B1=BB?= =?UTF-8?q?=E5=90=8D=E6=8B=BC=E5=86=99=EF=BC=88DoctorPhraesAppS=20?= =?UTF-8?q?=E2=86=92=20DoctorPhraseAppServiceImpl=20###=20=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E4=BF=AE=E6=94=B9=201.=20=E5=B8=B8=E7=94=A8=E8=AF=AD?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2=EF=BC=88doctorphrase/index?= =?UTF-8?q?.vue=EF=BC=89=EF=BC=9A=20=20=20=20=E4=B8=9A=E5=8A=A1=E5=88=86?= =?UTF-8?q?=E7=B1=BB=E7=A1=AC=E7=BC=96=E7=A0=81=E6=9B=BF=E6=8D=A2=E4=B8=BA?= =?UTF-8?q?=E6=9E=9A=E4=B8=BE=EF=BC=88=E4=B8=BB=E8=AF=89/=E7=8E=B0?= =?UTF-8?q?=E7=97=85=E5=8F=B2/=E6=9C=AF=E5=89=8D/=E6=9C=AF=E5=90=8E/?= =?UTF-8?q?=E6=97=A2=E5=BE=80=E5=8F=B2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...l.java => DoctorPhraseAppServiceImpl.java} | 2 +- .../openhis/template/domain/DoctorPhrase.java | 7 + .../enums/DoctorPhraseBizTypeEnum.java | 40 ++ .../doctorstation/doctorphrase/index.vue | 398 ++++++++---------- 4 files changed, 228 insertions(+), 219 deletions(-) rename openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/{DoctorPhraesAppServiceImpl.java => DoctorPhraseAppServiceImpl.java} (97%) create mode 100644 openhis-server-new/openhis-domain/src/main/java/com/openhis/template/enums/DoctorPhraseBizTypeEnum.java diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorPhraesAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorPhraseAppServiceImpl.java similarity index 97% rename from openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorPhraesAppServiceImpl.java rename to openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorPhraseAppServiceImpl.java index 0f7e7dd6..a3113190 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorPhraesAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/doctorstation/appservice/impl/DoctorPhraseAppServiceImpl.java @@ -13,7 +13,7 @@ import javax.annotation.Resource; import java.util.List; @Service -public class DoctorPhraesAppServiceImpl implements IDoctorPhraseAppService { +public class DoctorPhraseAppServiceImpl implements IDoctorPhraseAppService { @Resource private IDoctorPhraseService doctorPhraseService; diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/domain/DoctorPhrase.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/domain/DoctorPhrase.java index df260baa..0a15e4fe 100644 --- a/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/domain/DoctorPhrase.java +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/domain/DoctorPhrase.java @@ -1,12 +1,14 @@ package com.openhis.template.domain; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import javax.validation.constraints.NotBlank; import java.time.LocalDateTime; @Data @@ -28,8 +30,13 @@ public class DoctorPhrase { private Integer phraseType; /** 业务分类(主诉/现病史等) */ + @NotBlank(message = "业务分类不能为空") private String phraseCategory; + // 非数据库字段,用于前端展示名称 + @TableField(exist = false) + private String businessTypeName; + /** 模板内容 */ private String phraseContent; diff --git a/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/enums/DoctorPhraseBizTypeEnum.java b/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/enums/DoctorPhraseBizTypeEnum.java new file mode 100644 index 00000000..71808efa --- /dev/null +++ b/openhis-server-new/openhis-domain/src/main/java/com/openhis/template/enums/DoctorPhraseBizTypeEnum.java @@ -0,0 +1,40 @@ +package com.openhis.template.enums; + +// 枚举类不需要任何Lombok注解(@Data/@AllArgsConstructor/@NoArgsConstructor都删掉) +public enum DoctorPhraseBizTypeEnum { + // 1. 枚举项:直接传值(不用code:xxx,直接写字符串) + MAIN_COMPLAINT("MAIN_COMPLAINT", "主诉"), + PRESENT_HISTORY("PRESENT_HISTORY", "现病史"), + PRE_OPERATION("PRE_OPERATION", "术前"), + POST_OPERATION("POST_OPERATION", "术后"), + PAST_HISTORY("PAST_HISTORY", "既往史"); + + // 2. 定义枚举的成员变量(private final 保证不可变) + private final String code; // 数据库存储的编码 + private final String name; // 前端展示的名称 + + // 3. 手动写私有构造器(枚举构造器必须私有,且要给变量赋值) + DoctorPhraseBizTypeEnum(String code, String name) { + this.code = code; + this.name = name; + } + + // 4. 提供getter方法(枚举没有setter,因为枚举项是常量,不能改) + public String getCode() { + return code; + } + + public String getName() { + return name; + } + + // 【可选】添加工具方法:根据code找对应的枚举(前端传code时,后端快速匹配) + public static DoctorPhraseBizTypeEnum getByCode(String code) { + for (DoctorPhraseBizTypeEnum enumObj : values()) { + if (enumObj.getCode().equals(code)) { + return enumObj; + } + } + return null; // 或抛异常:throw new IllegalArgumentException("无效的业务分类编码:" + code); + } +} \ No newline at end of file diff --git a/openhis-ui-vue3/src/views/doctorstation/doctorphrase/index.vue b/openhis-ui-vue3/src/views/doctorstation/doctorphrase/index.vue index 41fb025d..cea611dd 100644 --- a/openhis-ui-vue3/src/views/doctorstation/doctorphrase/index.vue +++ b/openhis-ui-vue3/src/views/doctorstation/doctorphrase/index.vue @@ -7,65 +7,46 @@ - - 查询 - 重置 - 增加 + + + + 查询 + + + 重置 + + + 增加 + @@ -96,37 +69,23 @@ diff --git a/openhis-ui-vue3/src/views/inpatientNurse/inOut/index.vue b/openhis-ui-vue3/src/views/inpatientNurse/inOut/index.vue index 214adfba..e750de3f 100644 --- a/openhis-ui-vue3/src/views/inpatientNurse/inOut/index.vue +++ b/openhis-ui-vue3/src/views/inpatientNurse/inOut/index.vue @@ -44,16 +44,15 @@ const thirdRef = ref(); onBeforeMount(() => {}); onMounted(() => {}); defineExpose({ state }); -const test = () => { - nextTick(() => { - if (activeTabName.value == 'first') { - firstRef?.value?.refreshTap(); - } else if (activeTabName.value == 'second') { - secondRef?.value?.refreshTap(); - } else if (activeTabName.value == 'third') { - thirdRef?.value?.refreshTap(); - } - }); +const test = async () => { + await nextTick(); + if (activeTabName.value == 'first') { + await firstRef?.value?.refreshTap(); + } else if (activeTabName.value == 'second') { + await secondRef?.value?.refreshTap(); + } else if (activeTabName.value == 'third') { + await thirdRef?.value?.refreshTap(); + } }; const activeTabName = ref('first'); diff --git a/openhis-ui-vue3/src/views/inpatientNurse/nursingstatistics/operationrecord.vue b/openhis-ui-vue3/src/views/inpatientNurse/nursingstatistics/operationrecord.vue index 85432de3..8b290748 100644 --- a/openhis-ui-vue3/src/views/inpatientNurse/nursingstatistics/operationrecord.vue +++ b/openhis-ui-vue3/src/views/inpatientNurse/nursingstatistics/operationrecord.vue @@ -496,7 +496,7 @@ const dateChange = () => { }; // 计算时间 rulesFrom.value.recordTime = computed(() => { - console.log('11111111111111'); + console.log('操作记录时间计算', rulesFrom.value.date + ' ' + rulesFrom.value.time); return rulesFrom.value.date + ' ' + rulesFrom.value.time; }); diff --git a/openhis-ui-vue3/src/views/inpatientNurse/tprChart/index.vue b/openhis-ui-vue3/src/views/inpatientNurse/tprChart/index.vue index 782f7da2..ea03f1f9 100644 --- a/openhis-ui-vue3/src/views/inpatientNurse/tprChart/index.vue +++ b/openhis-ui-vue3/src/views/inpatientNurse/tprChart/index.vue @@ -274,7 +274,7 @@ function init1(data) { * 点击患者列表行 获取患者体温单数据 */ function viewPatient(row) { - console.log('1232312123221231'); + console.log('查看患者体温单数据', row.patientName); patientInfo.value = row; console.log('点击患者列表行 获取患者体温单数据', row); diff --git a/openhis-ui-vue3/src/views/medicationmanagement/statisticalManagement/medicationDetails.vue b/openhis-ui-vue3/src/views/medicationmanagement/statisticalManagement/medicationDetails.vue index 389c139c..be7df767 100644 --- a/openhis-ui-vue3/src/views/medicationmanagement/statisticalManagement/medicationDetails.vue +++ b/openhis-ui-vue3/src/views/medicationmanagement/statisticalManagement/medicationDetails.vue @@ -557,7 +557,7 @@ watch( queryParams.value.dispenseTimeETime = newQuery.occurrenceTimeETime + ' 23:59:59'; } queryParams.value.flag = 1; - console.log('11111111111111'); + console.log('药品明细查询参数已设置完成'); // 执行查询 getList(); diff --git a/openhis-ui-vue3/src/views/patientmanagement/patientmanagement/index.vue b/openhis-ui-vue3/src/views/patientmanagement/patientmanagement/index.vue index f0c81478..6078292c 100644 --- a/openhis-ui-vue3/src/views/patientmanagement/patientmanagement/index.vue +++ b/openhis-ui-vue3/src/views/patientmanagement/patientmanagement/index.vue @@ -218,7 +218,7 @@ watch( if (currentMonth < birthMonth || (currentMonth === birthMonth && currentDay < birthDay)) { age--; } - console.log('22222222'); + console.log('计算患者年龄完成:', age); form.value.age = age; } From a3dce8de60624511ae6766d9c20adb8a05d70620 Mon Sep 17 00:00:00 2001 From: chenqi Date: Mon, 19 Jan 2026 23:18:38 +0800 Subject: [PATCH 07/14] =?UTF-8?q?fix(inhospitalnurse):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BD=8F=E9=99=A2=E6=8A=A4=E5=A3=AB=E7=AB=99=E6=82=A3?= =?UTF-8?q?=E8=80=85=E7=AE=A1=E7=90=86=E5=92=8C=E5=BA=8A=E4=BD=8D=E5=88=86?= =?UTF-8?q?=E9=85=8D=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除住院参与者更新失败时的异常返回,改为静默处理 - 更新床位分配提示信息,为用户提供更清晰的操作指导 - 实现实施科室下拉选择器的远程搜索功能,提升大数据量下的用户体验 - 添加节点切换时的未保存数据确认提醒,防止数据丢失 - 优化实施科室管理页面的选项过滤和加载状态管理 --- .../impl/ATDManageAppServiceImpl.java | 7 +-- .../basicmanage/implementDepartment/index.vue | 60 ++++++++++++++++--- .../inOut/components/bedAllocation.vue | 6 +- 3 files changed, 59 insertions(+), 14 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java index c99a1604..5a5e4509 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/inhospitalnursestation/appservice/impl/ATDManageAppServiceImpl.java @@ -293,11 +293,8 @@ public class ATDManageAppServiceImpl implements IATDManageAppService { if (admissionPatientInfoDto.getPriorityEnum() != null) { // 更新患者病情 encounterService.updatePriorityEnumById(encounterId, admissionPatientInfoDto.getPriorityEnum()); - // 将之前的住院参与者更新为已完成 - Integer result = encounterParticipantService.updateEncounterParticipantsStatus(encounterId); - if (result == 0) { - return R.fail("患者信息更新失败,请联系管理员"); - } + // 将之前的住院参与者更新为已完成(如果存在的话) + encounterParticipantService.updateEncounterParticipantsStatus(encounterId); // 更新住院参与者 // 住院医生 encounterParticipantService.creatEncounterParticipants(encounterId, startTime, diff --git a/openhis-ui-vue3/src/views/basicmanage/implementDepartment/index.vue b/openhis-ui-vue3/src/views/basicmanage/implementDepartment/index.vue index 69dc396e..ad3c574a 100644 --- a/openhis-ui-vue3/src/views/basicmanage/implementDepartment/index.vue +++ b/openhis-ui-vue3/src/views/basicmanage/implementDepartment/index.vue @@ -81,15 +81,15 @@ v-model="scope.row.activityDefinitionId" filterable remote - reserve-keyword - placeholder="请选择" - remote-show-suffix + :remote-method="(query) => handleRemoteQuery(query, scope.row)" + :loading="scope.row.loading" + placeholder="请输入并搜索项目" style="width: 400px; max-width: 500px" :class="{ 'error-border': scope.row.error }" clearable > { + if (!row.hasOwnProperty('filteredOptions')) { + row.filteredOptions = allImplementDepartmentList.value.slice(0, 100); // 限制为前100个 + row.loading = false; + } + }); + loading.value = false; }); } @@ -253,6 +262,26 @@ function handleSelectionChange(selection) { single.value = selection.length != 1; multiple.value = !selection.length; } +// 远程搜索处理函数 +function handleRemoteQuery(query, row) { + if (query !== '') { + // 设置加载状态 + row.loading = true; + // 模拟异步延迟 + setTimeout(() => { + // 过滤选项 + row.filteredOptions = allImplementDepartmentList.value.filter(item => { + return item.label.toLowerCase().includes(query.toLowerCase()) || + item.value.toLowerCase().includes(query.toLowerCase()); + }); + row.loading = false; + }, 300); // 300ms 延迟,模拟网络请求 + } else { + // 如果查询为空,显示所有选项(但限制数量以提高性能) + row.filteredOptions = allImplementDepartmentList.value.slice(0, 100); // 限制为前100个 + } +} + // 新增项目 function handleAddItem() { if (data.isAdding) { @@ -262,9 +291,11 @@ function handleAddItem() { const newRow = { startTime: '00:00:00', endTime: '23:59:59', + loading: false, // 添加加载状态 + filteredOptions: allImplementDepartmentList.value.slice(0, 100), // 初始化过滤选项,限制数量 }; catagoryList.value.push(newRow); - total.value = organization.value.length; + total.value = catagoryList.value.length; // 修正:使用实际数据列表长度,而不是组织结构长度 data.isAdding = true; // 设置标志位为 true,表示有未保存的 } // 批量添加 @@ -272,6 +303,7 @@ function handleBacthAddItem() { // 批量添加显示对话框 bacthAddItemDialogVisible.value = true; } + // 检验 编辑或 保存数据 function handleBlur(row, index) { let hasError = false; @@ -344,9 +376,23 @@ function deleteSelectedRows(row) { } /** 节点单击事件 */ function handleNodeClick(res, node) { - // 新增按钮是否 disable - data.isAdding = false; + // 检查是否有未保存的数据 + if (data.isAdding) { + proxy.$modal.confirm('当前有未保存的数据,切换节点将丢失未保存的数据,是否继续?').then(() => { + // 确认切换,重置状态 + data.isAdding = false; + continueHandleNodeClick(node); + }).catch(() => { + // 取消切换,保持当前状态 + return; + }); + } else { + continueHandleNodeClick(node); + } +} +// 实际的节点点击处理逻辑 +function continueHandleNodeClick(node) { // 新增按钮是否 disable if (node.parent === null || node.level === 1) { isAddDisable.value = true; diff --git a/openhis-ui-vue3/src/views/inpatientNurse/inOut/components/bedAllocation.vue b/openhis-ui-vue3/src/views/inpatientNurse/inOut/components/bedAllocation.vue index d453267f..1d7650f8 100644 --- a/openhis-ui-vue3/src/views/inpatientNurse/inOut/components/bedAllocation.vue +++ b/openhis-ui-vue3/src/views/inpatientNurse/inOut/components/bedAllocation.vue @@ -371,8 +371,9 @@ const handleTransferInOk = async () => { // 单击患者卡片事件 - 直接触发入科选床界面 function handleCardClick(item: any, index: number) { if (item.encounterStatus == 2) { + // 显示提示信息,指导用户如何分配床位 ElMessage({ - message: '请分配病床!', + message: '该患者尚未分配病床,请通过拖拽操作将患者分配到右侧床位', type: 'warning', grouping: true, showClose: true, @@ -390,8 +391,9 @@ function handleCardClick(item: any, index: number) { // 双击患者卡片事件 - 保持原有逻辑 function handleCardDblClick(item: any) { if (item.encounterStatus == 2) { + // 显示提示信息,指导用户如何分配床位 ElMessage({ - message: '请分配病床!', + message: '该患者尚未分配病床,请通过拖拽操作将患者分配到右侧床位', type: 'warning', grouping: true, showClose: true, From 649f7bcf5b3458024df3c5a0eef3926ba6f47545 Mon Sep 17 00:00:00 2001 From: chenqi Date: Tue, 20 Jan 2026 08:24:07 +0800 Subject: [PATCH 08/14] =?UTF-8?q?fix(database):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=82=A3=E8=80=85=E9=A6=96=E9=A1=B5=E6=9F=A5=E8=AF=A2=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E6=95=B0=E6=8D=AE=E5=92=8C=E5=85=B3=E8=81=94=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在ATDManageAppMapper.xml中添加DISTINCT关键字解决入院患者信息重复问题 - 重构PatientHomeAppMapper.xml中的复杂查询逻辑,使用子查询替代多层JOIN提高性能 - 修复vital signs查询中的字段关联错误,将base_service_req_id改为request_id - 优化前端implementDepartment组件的数据加载逻辑,添加异步处理和错误捕获 - 为诊疗项目下拉框添加数据加载状态检查,防止空数据导致的界面异常 - 实现防抖机制和数据量限制,提升大数据量下的响应性能 - 添加并行数据加载,减少页面初始化时间 --- .../ATDManageAppMapper.xml | 2 +- .../inpatientmanage/PatientHomeAppMapper.xml | 409 ++++++++++-------- .../inpatientmanage/VitalSignsAppMapper.xml | 2 +- .../basicmanage/implementDepartment/index.vue | 108 +++-- 4 files changed, 314 insertions(+), 207 deletions(-) diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/ATDManageAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/ATDManageAppMapper.xml index 274ba3c1..63956bc9 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/ATDManageAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/inhospitalnursestation/ATDManageAppMapper.xml @@ -224,7 +224,7 @@ SELECT - T1.id, - T1.active_flag, - T1.temp_flag, - T1."name" AS patientName, -- 患者姓名 - T1.name_json, - T1.bus_no AS patientNo, -- 病历号 - T1.gender_enum, -- 患者性别 - T1.birth_date, - T1.deceased_date, - T1.marital_status_enum, - T1.prfs_enum, - T1.phone, -- 患者手机号 - COALESCE(NULLIF(T1.address, ''), '') AS address, -- 处理空地址 - T1.address_province, - T1.address_city, - T1.address_district, - T1.address_street, - T1.address_json, - T1.nationality_code, - T1.id_card, - T1.py_str, - T1.wb_str, - T1.blood_abo, - T1.blood_rh, - T1.work_company, - T1.native_place, - T1.country_code, - T1.link_name, - T1.link_relation_code, - T1.link_telcom, - T1.link_jsons, - T1.tenant_id, - T2.bus_no AS hospitalNo, -- 住院号 - T2.id AS encounterId, -- 就诊ID - T2.priority_enum, -- 护理级别 - T2.status_enum, -- 患者状态 - T2.organization_id,-- 入院科室 - T2.start_time AS admissionDate, -- 入院日期 - T2.end_time AS dischargeDate, -- 出院日期 - T2.class_enum, -- 就诊类别 - Doctor.name AS responsibleDoctor, -- 责任医生 - Nurse.name AS responsibleNurse, -- 责任护士 - T6.type_code, -- 费别 - T7.status_enum AS surgeryStatusEnum, -- 手术状态 - T8.start_time AS surgeryStartTime, -- 手术开始时间 - T8.end_time AS surgeryEndTime, -- 手术结束时间 - T9.id AS encounterLocationId, -- 就诊位置ID - T9.location_id, -- 床位号 - T11."name" AS caty, -- 入院科室 - T12."name" AS mainDiagnosis -- 主要诊断 - FROM adm_patient AS T1 - LEFT JOIN adm_encounter T2 - ON T1.id = T2.patient_id -- 患者ID - AND T2.delete_flag = '0' - AND T2.class_enum = '1' -- 仅选择住院患者 - -- 获取责任医生 - LEFT JOIN ( - SELECT - encounter_id, - practitioner_id, - "name", - ROW_NUMBER() OVER (PARTITION BY encounter_id ORDER BY practitioner_id) as rn - FROM ( - SELECT - T3.encounter_id, - T4."name", - T3.practitioner_id - FROM adm_encounter_participant T3 - LEFT JOIN adm_practitioner T4 - ON T3.practitioner_id = T4.id - AND T4.delete_flag = '0' - WHERE T3.type_code = '9' -- 责任医生类型 - AND T3.delete_flag = '0' - ) sub - ) Doctor ON T2.id = Doctor.encounter_id AND Doctor.rn = 1 - -- 获取责任护士 - LEFT JOIN ( - SELECT - encounter_id, - practitioner_id, - "name", - ROW_NUMBER() OVER (PARTITION BY encounter_id ORDER BY practitioner_id) as rn - FROM ( - SELECT - T3.encounter_id, - T4."name", - T3.practitioner_id - FROM adm_encounter_participant T3 - LEFT JOIN adm_practitioner T4 - ON T3.practitioner_id = T4.id - AND T4.delete_flag = '0' - WHERE T3.type_code = '2' -- 责任护士类型 - AND T3.delete_flag = '0' - ) sub - ) Nurse ON T2.id = Nurse.encounter_id AND Nurse.rn = 1 - LEFT JOIN adm_encounter_diagnosis T5 - ON T2.id = T5.encounter_id -- 就诊ID - AND T5.maindise_flag = 1 - AND T5.delete_flag = '0' - LEFT JOIN adm_account T6 - ON T2.id = T6.encounter_id -- 就诊ID - AND T6.delete_flag = '0' - LEFT JOIN cli_procedure T7 - ON T1.id = T7.patient_id -- 患者ID - AND T7.delete_flag = '0' - LEFT JOIN cli_procedure_performer T8 - ON T7.id = T8.procedure_id -- 手术ID - AND T8.delete_flag = '0' - LEFT JOIN adm_encounter_location T9 - ON T2.id = T9.encounter_id -- 就诊ID - AND T9.form_enum = 8 - AND T9.delete_flag = '0' - LEFT JOIN adm_organization T11 - ON T2.organization_id = T11.id - AND T11.type_enum = 2 - AND T11.delete_flag = '0' - LEFT JOIN cli_condition_definition T12 - ON T5.condition_id = T12.id - AND T12.delete_flag = '0' - LEFT JOIN wor_service_request T13 - ON T2.id = T13.encounter_id - AND T7.base_service_req_id = T13.id - AND T13.delete_flag = '0' - LEFT JOIN wor_service_request_detail T14 - ON T13.id = T14.service_req_id - AND T14.type_code = '3' - AND T14.delete_flag = '0' - - T1.delete_flag = '0' - -- 患者ID - - AND T1.id = #{patientId} - + id, + active_flag, + temp_flag, + patientName, + name_json, + patientNo, + gender_enum, + birth_date, + deceased_date, + marital_status_enum, + prfs_enum, + phone, + address, + address_province, + address_city, + address_district, + address_street, + address_json, + nationality_code, + id_card, + py_str, + wb_str, + blood_abo, + blood_rh, + work_company, + native_place, + country_code, + link_name, + link_relation_code, + link_telcom, + link_jsons, + tenant_id, + hospitalNo, + encounterId, + priority_enum, + status_enum, + organization_id, + admissionDate, + dischargeDate, + class_enum, + responsibleDoctor, + responsibleNurse, + type_code, + surgeryStatusEnum, + surgeryStartTime, + surgeryEndTime, + encounterLocationId, + location_id, + caty, + mainDiagnosis + FROM ( + SELECT + patient_base.*, + ROW_NUMBER() OVER (PARTITION BY patient_base.id ORDER BY patient_base.encounterId) as rn + FROM ( + SELECT DISTINCT + T1.id, + T1.active_flag, + T1.temp_flag, + T1."name" AS patientName, -- 患者姓名 + T1.name_json, + T1.bus_no AS patientNo, -- 病历号 + T1.gender_enum, -- 患者性别 + T1.birth_date, + T1.deceased_date, + T1.marital_status_enum, + T1.prfs_enum, + T1.phone, -- 患者手机号 + COALESCE(NULLIF(T1.address, ''), '') AS address, -- 处理空地址 + T1.address_province, + T1.address_city, + T1.address_district, + T1.address_street, + T1.address_json, + T1.nationality_code, + T1.id_card, + T1.py_str, + T1.wb_str, + T1.blood_abo, + T1.blood_rh, + T1.work_company, + T1.native_place, + T1.country_code, + T1.link_name, + T1.link_relation_code, + T1.link_telcom, + T1.link_jsons, + T1.tenant_id, + T2.bus_no AS hospitalNo, -- 住院号 + T2.id AS encounterId, -- 就诊ID + T2.priority_enum, -- 护理级别 + T2.status_enum, -- 患者状态 + T2.organization_id,-- 入院科室 + T2.start_time AS admissionDate, -- 入院日期 + T2.end_time AS dischargeDate, -- 出院日期 + T2.class_enum, -- 就诊类别 + -- 获取责任医生(使用子查询确保只返回一个值) + (SELECT p."name" + FROM adm_encounter_participant ep + LEFT JOIN adm_practitioner p ON ep.practitioner_id = p.id AND p.delete_flag = '0' + WHERE ep.encounter_id = T2.id + AND ep.type_code = '9' + AND ep.delete_flag = '0' + ORDER BY ep.practitioner_id + LIMIT 1) AS responsibleDoctor, + -- 获取责任护士(使用子查询确保只返回一个值) + (SELECT p."name" + FROM adm_encounter_participant ep + LEFT JOIN adm_practitioner p ON ep.practitioner_id = p.id AND p.delete_flag = '0' + WHERE ep.encounter_id = T2.id + AND ep.type_code = '2' + AND ep.delete_flag = '0' + ORDER BY ep.practitioner_id + LIMIT 1) AS responsibleNurse, + T6.type_code, -- 费别 + T7.status_enum AS surgeryStatusEnum, -- 手术状态 + T8.start_time AS surgeryStartTime, -- 手术开始时间 + T8.end_time AS surgeryEndTime, -- 手术结束时间 + T9.id AS encounterLocationId, -- 就诊位置ID + T9.location_id, -- 床位号 + T11."name" AS caty, -- 入院科室 + T12."name" AS mainDiagnosis -- 主要诊断 + FROM adm_patient AS T1 + INNER JOIN adm_encounter T2 -- 改为INNER JOIN确保患者有就诊记录 + ON T1.id = T2.patient_id -- 患者ID + AND T2.delete_flag = '0' + AND T2.class_enum = '1' -- 仅选择住院患者 + LEFT JOIN adm_encounter_diagnosis T5 + ON T2.id = T5.encounter_id -- 就诊ID + AND T5.maindise_flag = 1 + AND T5.delete_flag = '0' + LEFT JOIN adm_account T6 + ON T2.id = T6.encounter_id -- 就诊ID + AND T6.delete_flag = '0' + LEFT JOIN ( + SELECT + patient_id, + status_enum, + id, + request_id, + ROW_NUMBER() OVER (PARTITION BY patient_id ORDER BY id DESC) as rn + FROM cli_procedure + WHERE delete_flag = '0' + ) T7 ON T1.id = T7.patient_id AND T7.rn = 1 + LEFT JOIN ( + SELECT + procedure_id, + start_time, + end_time, + ROW_NUMBER() OVER (PARTITION BY procedure_id ORDER BY id DESC) as rn + FROM cli_procedure_performer + WHERE delete_flag = '0' + ) T8 ON T7.id = T8.procedure_id AND T8.rn = 1 + LEFT JOIN adm_encounter_location T9 + ON T2.id = T9.encounter_id -- 就诊ID + AND T9.form_enum = 8 + AND T9.delete_flag = '0' + LEFT JOIN adm_organization T11 + ON T2.organization_id = T11.id + AND T11.type_enum = 2 + AND T11.delete_flag = '0' + LEFT JOIN cli_condition_definition T12 + ON T5.condition_id = T12.id + AND T12.delete_flag = '0' + WHERE T1.delete_flag = '0' + -- 患者ID + + AND T1.id = #{patientId} + - -- 在科 - - AND T9.status_enum = 2 - + -- 在科 + + AND T9.status_enum = 2 + - -- 待出院 - - AND T2.status_enum = 4 - + -- 待出院 + + AND T2.status_enum = 4 + - -- 危重 - - AND T2.priority_enum = 1 - + -- 危重 + + AND T2.priority_enum = 1 + - -- 手术 - - AND T14.type_code = '3' - - - -- 欠费 - - AND T6.balance_amount < 0 - - - -- 已出院 - - AND T2.status_enum = 5 - - - - AND ( - -- 住院号 - T2.bus_no = #{searchKey} - -- 患者姓名 - OR T1.name like concat('%', #{searchKey}, '%') - -- 责任医生 - OR Doctor.name like concat('%', #{searchKey}, '%') - -- 责任护士 - OR Nurse.name like concat('%', #{searchKey}, '%') + -- 手术 + + AND EXISTS ( + SELECT 1 + FROM wor_service_request_detail wsrd + INNER JOIN wor_service_request wsr ON wsrd.service_req_id = wsr.id + WHERE wsr.encounter_id = T2.id + AND wsrd.type_code = '3' + AND wsr.delete_flag = '0' + AND wsrd.delete_flag = '0' ) - - + - ORDER BY T9.location_id ASC + -- 欠费 + + AND T6.balance_amount < 0 + + + -- 已出院 + + AND T2.status_enum = 5 + + + + AND ( + -- 住院号 + T2.bus_no = #{searchKey} + -- 患者姓名 + OR T1.name like concat('%', #{searchKey}, '%') + -- 责任医生(在子查询中处理) + OR EXISTS ( + SELECT 1 + FROM adm_encounter_participant ep + LEFT JOIN adm_practitioner p ON ep.practitioner_id = p.id AND p.delete_flag = '0' + WHERE ep.encounter_id = T2.id + AND ep.type_code = '9' + AND ep.delete_flag = '0' + AND p."name" like concat('%', #{searchKey}, '%') + ) + -- 责任护士(在子查询中处理) + OR EXISTS ( + SELECT 1 + FROM adm_encounter_participant ep + LEFT JOIN adm_practitioner p ON ep.practitioner_id = p.id AND p.delete_flag = '0' + WHERE ep.encounter_id = T2.id + AND ep.type_code = '2' + AND ep.delete_flag = '0' + AND p."name" like concat('%', #{searchKey}, '%') + ) + ) + + ) patient_base + ) ranked_result + WHERE rn = 1 + ORDER BY location_id ASC diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/inpatientmanage/VitalSignsAppMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/inpatientmanage/VitalSignsAppMapper.xml index 9aed0bb4..225d6d1f 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/inpatientmanage/VitalSignsAppMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/inpatientmanage/VitalSignsAppMapper.xml @@ -46,7 +46,7 @@ AND T6.delete_flag = '0' LEFT JOIN wor_service_request T7 ON T1.encounter_id = T7.encounter_id - AND T5.base_service_req_id = T7.id + AND T5.request_id = T7.id AND T7.delete_flag = '0' LEFT JOIN wor_service_request_detail T8 ON T7.id = T8.service_req_id diff --git a/openhis-ui-vue3/src/views/basicmanage/implementDepartment/index.vue b/openhis-ui-vue3/src/views/basicmanage/implementDepartment/index.vue index ad3c574a..421bb342 100644 --- a/openhis-ui-vue3/src/views/basicmanage/implementDepartment/index.vue +++ b/openhis-ui-vue3/src/views/basicmanage/implementDepartment/index.vue @@ -236,24 +236,34 @@ const filterNode = (value, data) => { }; // 所有诊疗项目列表 const allImplementDepartmentList = ref([]); -function getAllImplementDepartment() { +async function getAllImplementDepartment() { loading.value = true; - getAllTreatmentList().then((res) => { + try { + const res = await getAllTreatmentList(); allImplementDepartmentList.value = res.data.map((item) => ({ value: item.activityDefinitionId, label: item.activityDefinitionName, })); - // 为所有现有行初始化过滤选项 - catagoryList.value.forEach(row => { - if (!row.hasOwnProperty('filteredOptions')) { - row.filteredOptions = allImplementDepartmentList.value.slice(0, 100); // 限制为前100个 - row.loading = false; - } - }); + // 为所有现有行初始化过滤选项(使用防抖处理,避免频繁更新) + if (catagoryList.value && catagoryList.value.length > 0) { + // 使用 setTimeout 将 DOM 更新推迟到下一个事件循环,避免阻塞 + setTimeout(() => { + catagoryList.value.forEach(row => { + if (!row.hasOwnProperty('filteredOptions')) { + row.filteredOptions = allImplementDepartmentList.value.slice(0, 100); // 限制为前100个 + row.loading = false; + } + }); + }, 0); + } loading.value = false; - }); + } catch (error) { + console.error('获取诊疗项目列表失败:', error); + loading.value = false; + proxy.$message.error('获取诊疗项目列表失败'); + } } /** 选择条数 */ @@ -269,16 +279,30 @@ function handleRemoteQuery(query, row) { row.loading = true; // 模拟异步延迟 setTimeout(() => { - // 过滤选项 - row.filteredOptions = allImplementDepartmentList.value.filter(item => { + // 确保数据已加载 + if (!allImplementDepartmentList.value || allImplementDepartmentList.value.length === 0) { + row.filteredOptions = []; + row.loading = false; + return; + } + + // 过滤选项,限制结果数量以提高性能 + const filtered = allImplementDepartmentList.value.filter(item => { return item.label.toLowerCase().includes(query.toLowerCase()) || item.value.toLowerCase().includes(query.toLowerCase()); }); + + // 限制返回结果数量,避免过多选项导致性能问题 + row.filteredOptions = filtered.slice(0, 100); // 限制为前100个匹配项 row.loading = false; }, 300); // 300ms 延迟,模拟网络请求 } else { // 如果查询为空,显示所有选项(但限制数量以提高性能) - row.filteredOptions = allImplementDepartmentList.value.slice(0, 100); // 限制为前100个 + if (allImplementDepartmentList.value && allImplementDepartmentList.value.length > 0) { + row.filteredOptions = allImplementDepartmentList.value.slice(0, 100); // 限制为前100个 + } else { + row.filteredOptions = []; + } } } @@ -288,6 +312,15 @@ function handleAddItem() { proxy.$message.warning('请先保存当前行后再新增!'); return; } + + // 确保 allImplementDepartmentList 已经初始化 + if (!allImplementDepartmentList.value || allImplementDepartmentList.value.length === 0) { + proxy.$message.warning('正在加载数据,请稍后再试!'); + // 如果数据还未加载完成,尝试重新加载 + getAllImplementDepartment(); + return; + } + const newRow = { startTime: '00:00:00', endTime: '23:59:59', @@ -411,26 +444,28 @@ function continueHandleNodeClick(node) { } /** 目录分类查询 */ -function getDiseaseTreatmentList() { +async function getDiseaseTreatmentList() { loading.value = true; - getDiseaseTreatmentInit().then(({ data }) => { - loading.value = false; + try { + const { data } = await getDiseaseTreatmentInit(); - //分类目录初始化获取 + // 分类目录初始化获取 catagoryDicts.value = data.diagnosisCategoryOptions.sort((a, b) => { return parseInt(a.value) - parseInt(b.value); }); - }); - // 诊疗目录分类查询下拉树结d构 - loading.value = true; - // 诊疗目录分类查询下拉树结d构 - getImplDepartList(); + } catch (error) { + console.error('获取疾病治疗初始化数据失败:', error); + proxy.$message.error('获取分类目录失败'); + } + + // 诊疗目录分类查询下拉树结构 + await getImplDepartList(); + loading.value = false; } // 诊疗目录分类查询下拉树结d构 -function getImplDepartList() { - loading.value = true; - getImplementDepartmentList().then((res) => { - loading.value = false; +async function getImplDepartList() { + try { + const res = await getImplementDepartmentList(); if (res.code === 200) { if (res.data.records.length > 0) { organization.value = res.data.records.map((res) => { @@ -444,13 +479,24 @@ function getImplDepartList() { organization.value = []; } } else { - this.$modal.msgError(res.code); + proxy.$modal.msgError(res.code); } - }); + } catch (error) { + console.error('获取实施部门列表失败:', error); + proxy.$message.error('获取科室信息失败'); + } } -onMounted(() => { - getAllImplementDepartment(); - getDiseaseTreatmentList(); +onMounted(async () => { + try { + // 并行加载数据,提高效率 + await Promise.all([ + getAllImplementDepartment(), + getDiseaseTreatmentList() + ]); + } catch (error) { + console.error('初始化数据加载失败:', error); + proxy.$message.error('数据加载失败,请稍后重试'); + } }); - diff --git a/query_serial_number.sql b/query_serial_number.sql new file mode 100644 index 00000000..570379f5 --- /dev/null +++ b/query_serial_number.sql @@ -0,0 +1,121 @@ +-- ============================================ +-- 查询流水号相关SQL语句 +-- ============================================ + +-- 1. 查询所有挂号记录的流水号(主键ID)及相关信息 +SELECT + id AS 流水号, + display_order AS 就诊序号, + bus_no AS 就诊编码, + patient_id AS 患者ID, + organization_id AS 科室ID, + create_time AS 挂号时间, + status_enum AS 状态 +FROM adm_encounter +WHERE delete_flag = '0' +ORDER BY create_time DESC; + +-- 2. 根据流水号(主键ID)查询某条挂号记录的详细信息 +SELECT + e.id AS 流水号, + e.display_order AS 就诊序号, + e.bus_no AS 就诊编码, + p.name AS 患者姓名, + p.id_card AS 身份证号, + p.phone AS 联系电话, + o.name AS 科室名称, + pr.name AS 医生姓名, + e.create_time AS 挂号时间, + e.status_enum AS 状态 +FROM adm_encounter e +LEFT JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0' +LEFT JOIN adm_organization o ON e.organization_id = o.id AND o.delete_flag = '0' +LEFT JOIN adm_encounter_participant ep ON e.id = ep.encounter_id AND ep.delete_flag = '0' AND ep.type_code = 'PRF' +LEFT JOIN adm_practitioner pr ON ep.practitioner_id = pr.id AND pr.delete_flag = '0' +WHERE e.id = 1234567890123456789 -- 替换为实际的流水号(主键ID) + AND e.delete_flag = '0'; + +-- 3. 根据患者姓名或身份证号查询流水号 +SELECT + e.id AS 流水号, + e.display_order AS 就诊序号, + p.name AS 患者姓名, + p.id_card AS 身份证号, + e.create_time AS 挂号时间, + o.name AS 科室名称 +FROM adm_encounter e +LEFT JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0' +LEFT JOIN adm_organization o ON e.organization_id = o.id AND o.delete_flag = '0' +WHERE e.delete_flag = '0' + AND (p.name LIKE '%张三%' OR p.id_card = '110101199001011234') -- 替换为实际的患者姓名或身份证号 +ORDER BY e.create_time DESC; + +-- 4. 查询当日的挂号记录及流水号 +SELECT + e.id AS 流水号, + e.display_order AS 就诊序号, + e.bus_no AS 就诊编码, + p.name AS 患者姓名, + p.id_card AS 身份证号, + o.name AS 科室名称, + pr.name AS 医生姓名, + e.create_time AS 挂号时间, + e.status_enum AS 状态 +FROM adm_encounter e +LEFT JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0' +LEFT JOIN adm_organization o ON e.organization_id = o.id AND o.delete_flag = '0' +LEFT JOIN adm_encounter_participant ep ON e.id = ep.encounter_id AND ep.delete_flag = '0' AND ep.type_code = 'PRF' +LEFT JOIN adm_practitioner pr ON ep.practitioner_id = pr.id AND pr.delete_flag = '0' +WHERE e.delete_flag = '0' + AND DATE(e.create_time) = CURRENT_DATE -- 查询当日 +ORDER BY e.display_order ASC, e.create_time ASC; + +-- 5. 查询指定日期范围的挂号记录及流水号 +SELECT + e.id AS 流水号, + e.display_order AS 就诊序号, + e.bus_no AS 就诊编码, + p.name AS 患者姓名, + p.id_card AS 身份证号, + o.name AS 科室名称, + e.create_time AS 挂号时间 +FROM adm_encounter e +LEFT JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0' +LEFT JOIN adm_organization o ON e.organization_id = o.id AND o.delete_flag = '0' +WHERE e.delete_flag = '0' + AND e.create_time >= '2024-01-01 00:00:00' -- 开始时间 + AND e.create_time <= '2024-01-31 23:59:59' -- 结束时间 +ORDER BY e.create_time DESC; + +-- 6. 查询指定科室的挂号记录及流水号 +SELECT + e.id AS 流水号, + e.display_order AS 就诊序号, + p.name AS 患者姓名, + o.name AS 科室名称, + e.create_time AS 挂号时间 +FROM adm_encounter e +LEFT JOIN adm_patient p ON e.patient_id = p.id AND p.delete_flag = '0' +LEFT JOIN adm_organization o ON e.organization_id = o.id AND o.delete_flag = '0' +WHERE e.delete_flag = '0' + AND o.name LIKE '%心内科%' -- 替换为实际的科室名称 + AND DATE(e.create_time) = CURRENT_DATE +ORDER BY e.display_order ASC; + +-- 7. 统计每日挂号数量及流水号范围 +SELECT + DATE(create_time) AS 日期, + COUNT(*) AS 挂号数量, + MIN(id) AS 最小流水号, + MAX(id) AS 最大流水号, + MIN(display_order) AS 最小就诊序号, + MAX(display_order) AS 最大就诊序号 +FROM adm_encounter +WHERE delete_flag = '0' +GROUP BY DATE(create_time) +ORDER BY 日期 DESC +LIMIT 30; -- 最近30天 + + + + diff --git a/sql/query_today_outpatient_patients.sql b/sql/query_today_outpatient_patients.sql new file mode 100644 index 00000000..5aac3e13 --- /dev/null +++ b/sql/query_today_outpatient_patients.sql @@ -0,0 +1,224 @@ +-- ============================================ +-- 查询今日门诊患者数据(用于调试分诊排队页面) +-- 简化版:直接查询,不考虑登录和租户 +-- ============================================ + +-- 1. 最简单查询:查看今天所有的挂号记录(不关联患者表) +SELECT + enc.id AS encounterId, + enc.patient_id AS patientId, + enc.start_time AS registerTime, + enc.status_enum AS statusEnum, + enc.organization_id AS departmentId, + enc.tenant_id AS tenantId, + enc.delete_flag AS deleteFlag, + enc.bus_no AS encounterBusNo +FROM adm_encounter enc +WHERE enc.delete_flag = '0' + AND enc.start_time::DATE = CURRENT_DATE +ORDER BY enc.start_time DESC +LIMIT 100; + +-- ============================================ +-- 2. 完整查询:直接查询患者信息(简化版,不考虑租户) +-- ============================================ +SELECT + enc.id AS encounterId, + enc.patient_id AS patientId, + pt.name AS patientName, + pt.gender_enum AS genderEnum, + pt.birth_date AS birthDate, + pt.id_card AS idCard, + pt.phone AS phone, + enc.bus_no AS encounterBusNo, + enc.start_time AS registerTime, + enc.reception_time AS receptionTime, + enc.status_enum AS statusEnum, + enc.subject_status_enum AS subjectStatusEnum, + CASE + WHEN enc.reception_time IS NOT NULL + THEN EXTRACT(EPOCH FROM (enc.reception_time - enc.start_time)) / 60 + ELSE EXTRACT(EPOCH FROM (NOW() - enc.start_time)) / 60 + END AS waitingDuration, + CASE + WHEN enc.end_time IS NOT NULL AND enc.reception_time IS NOT NULL + THEN EXTRACT(EPOCH FROM (enc.end_time - enc.reception_time)) / 60 + ELSE NULL + END AS visitDuration, + pt.type_code AS typeCode, + enc.important_flag AS importantFlag, + -- 医生信息(左关联) + ep.practitioner_id AS doctorId +FROM adm_encounter enc +INNER JOIN adm_patient pt + ON enc.patient_id = pt.id + AND pt.delete_flag = '0' +LEFT JOIN adm_encounter_participant ep + ON enc.id = ep.encounter_id + AND ep.type_code = 'admitter' + AND ep.delete_flag = '0' +WHERE enc.delete_flag = '0' + AND enc.start_time::DATE = CURRENT_DATE +ORDER BY enc.start_time DESC +LIMIT 10000; + +-- ============================================ +-- 3. 检查数据条件:查看可能影响查询结果的数据 +-- ============================================ + +-- 3.1 检查今天的挂号记录总数 +SELECT + COUNT(*) AS total_count, + COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count, + COUNT(CASE WHEN delete_flag = '1' THEN 1 END) AS deleted_count +FROM adm_encounter +WHERE start_time::DATE = CURRENT_DATE; + +-- 3.2 检查不同租户的数据分布 +SELECT + tenant_id, + COUNT(*) AS count, + COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count +FROM adm_encounter +WHERE start_time::DATE = CURRENT_DATE +GROUP BY tenant_id +ORDER BY tenant_id; + +-- 3.3 检查不同状态的数据分布 +SELECT + status_enum, + COUNT(*) AS count, + COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count +FROM adm_encounter +WHERE start_time::DATE = CURRENT_DATE + AND delete_flag = '0' +GROUP BY status_enum +ORDER BY status_enum; + +-- 3.4 检查是否有患者数据关联 +SELECT + COUNT(DISTINCT enc.id) AS encounter_count, + COUNT(DISTINCT pt.id) AS patient_count, + COUNT(DISTINCT CASE WHEN pt.delete_flag = '0' THEN pt.id END) AS patient_not_deleted_count +FROM adm_encounter enc +LEFT JOIN adm_patient pt ON enc.patient_id = pt.id +WHERE enc.start_time::DATE = CURRENT_DATE + AND enc.delete_flag = '0'; + +-- 3.5 检查医生参与信息 +SELECT + COUNT(DISTINCT enc.id) AS encounter_count, + COUNT(DISTINCT ep.encounter_id) AS has_doctor_count, + COUNT(DISTINCT ep.practitioner_id) AS doctor_count +FROM adm_encounter enc +LEFT JOIN adm_encounter_participant ep + ON enc.id = ep.encounter_id + AND ep.type_code = 'admitter' + AND ep.delete_flag = '0' +WHERE enc.start_time::DATE = CURRENT_DATE + AND enc.delete_flag = '0'; + +-- ============================================ +-- 4. 快速查询:直接查看患者姓名和挂号信息(最简单) +-- ============================================ +SELECT + enc.id AS 就诊记录ID, + pt.name AS 患者姓名, + pt.id_card AS 身份证号, + pt.phone AS 联系电话, + enc.start_time AS 挂号时间, + enc.create_time AS 创建时间, + enc.status_enum AS 状态, + enc.bus_no AS 就诊流水号 +FROM adm_encounter enc +INNER JOIN adm_patient pt ON enc.patient_id = pt.id +WHERE enc.delete_flag = '0' + AND pt.delete_flag = '0' + AND enc.start_time::DATE = CURRENT_DATE +ORDER BY enc.start_time DESC; + +-- ============================================ +-- 4.1 使用 create_time 查询(和门诊挂号页面一致) +-- ============================================ +SELECT + enc.id AS 就诊记录ID, + pt.name AS 患者姓名, + pt.id_card AS 身份证号, + pt.phone AS 联系电话, + enc.create_time AS 创建时间, + enc.start_time AS 开始时间, + enc.status_enum AS 状态, + enc.bus_no AS 就诊流水号 +FROM adm_encounter enc +INNER JOIN adm_patient pt ON enc.patient_id = pt.id +WHERE enc.delete_flag = '0' + AND pt.delete_flag = '0' + AND enc.create_time::DATE = CURRENT_DATE +ORDER BY enc.create_time DESC; + +-- ============================================ +-- 4.2 完全模拟门诊挂号页面的查询(包含支付状态) +-- ============================================ +SELECT + enc.id AS 就诊记录ID, + pt.name AS 患者姓名, + pt.id_card AS 身份证号, + pt.phone AS 联系电话, + enc.create_time AS 挂号时间, + enc.status_enum AS 状态, + enc.bus_no AS 就诊流水号, + ci.total_price AS 挂号金额, + pr.status_enum AS 支付状态 +FROM adm_encounter enc +INNER JOIN adm_patient pt ON enc.patient_id = pt.id AND pt.delete_flag = '0' +LEFT JOIN adm_charge_item ci ON enc.id = ci.encounter_id AND ci.delete_flag = '0' AND ci.context_enum = 1 +LEFT JOIN fin_payment_reconciliation pr ON ci.id::TEXT = ANY(string_to_array(pr.charge_item_ids,',')) + AND pr.delete_flag = '0' + AND pr.status_enum = 1 +WHERE enc.delete_flag = '0' + AND enc.class_enum = 1 -- 门诊 + AND enc.create_time::DATE = CURRENT_DATE +ORDER BY enc.create_time DESC; + +-- ============================================ +-- 5. 快速检查:查看最近7天的挂号记录数量(使用 start_time) +-- ============================================ +SELECT + start_time::DATE AS register_date, + COUNT(*) AS total_count, + COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count +FROM adm_encounter +WHERE start_time::DATE >= CURRENT_DATE - INTERVAL '7 days' +GROUP BY start_time::DATE +ORDER BY start_time::DATE DESC; + +-- ============================================ +-- 5.1 快速检查:查看最近7天的挂号记录数量(使用 create_time) +-- ============================================ +SELECT + create_time::DATE AS register_date, + COUNT(*) AS total_count, + COUNT(CASE WHEN delete_flag = '0' THEN 1 END) AS not_deleted_count +FROM adm_encounter +WHERE create_time::DATE >= CURRENT_DATE - INTERVAL '7 days' + AND class_enum = 1 -- 门诊 +GROUP BY create_time::DATE +ORDER BY create_time::DATE DESC; + +-- ============================================ +-- 6. 对比 start_time 和 create_time 的差异 +-- ============================================ +SELECT + id AS 就诊记录ID, + start_time AS 开始时间, + create_time AS 创建时间, + (start_time::DATE) AS 开始日期, + (create_time::DATE) AS 创建日期, + status_enum AS 状态, + delete_flag AS 是否删除 +FROM adm_encounter +WHERE (start_time::DATE = CURRENT_DATE OR create_time::DATE = CURRENT_DATE) + AND delete_flag = '0' +ORDER BY create_time DESC +LIMIT 20; + diff --git a/排查指南-字段查询问题.md b/排查指南-字段查询问题.md new file mode 100644 index 00000000..ddebfb9e --- /dev/null +++ b/排查指南-字段查询问题.md @@ -0,0 +1,284 @@ +# 排查指南:字段查询不到数据的问题 + +## 问题类型 +**症状**:SQL 查询条件使用了某个字段,但查询结果为空,而数据库中明明有数据。 + +**根本原因**:查询条件使用的字段在数据插入/更新时没有被设置(为 NULL 或默认值)。 + +--- + +## 排查步骤 + +### 第一步:确认字段是否存在 +```sql +-- 检查表结构,确认字段是否存在 +SELECT column_name, data_type, is_nullable, column_default +FROM information_schema.columns +WHERE table_name = 'adm_encounter' + AND column_name = 'start_time'; +``` + +**检查点**: +- ✅ 字段确实存在 +- ❌ 字段不存在 → 检查字段名拼写、大小写 + +--- + +### 第二步:检查字段是否有值 +```sql +-- 检查字段的实际值 +SELECT + id, + start_time, -- 检查这个字段 + create_time, -- 对比其他时间字段 + status_enum +FROM adm_encounter +WHERE delete_flag = '0' + AND create_time::DATE = CURRENT_DATE -- 用能查到数据的条件 +LIMIT 10; +``` + +**检查点**: +- ✅ `start_time` 有值 → 继续排查查询条件 +- ❌ `start_time` 为 NULL → **问题确认**:字段没有被设置 + +--- + +### 第三步:检查插入/更新代码 +找到创建/更新数据的 Service 方法,检查是否设置了该字段。 + +**检查位置**: +1. **Service 实现类**:查找 `save`、`insert`、`update` 相关方法 +2. **Mapper XML**:检查 INSERT/UPDATE 语句 +3. **Entity 类**:检查字段定义和默认值 + +**示例检查**: +```java +// ❌ 错误示例:没有设置 start_time +Encounter encounter = new Encounter(); +encounter.setBusNo("xxx"); +encounter.setPatientId(123L); +// 没有 encounter.setStartTime(...) +iEncounterService.save(encounter); + +// ✅ 正确示例:设置了 start_time +Encounter encounter = new Encounter(); +encounter.setBusNo("xxx"); +encounter.setPatientId(123L); +encounter.setStartTime(new Date()); // 设置了字段 +iEncounterService.save(encounter); +``` + +--- + +### 第四步:对比能查到数据的方法 +找到系统中**能查到数据**的类似查询,对比差异。 + +**对比维度**: +1. **使用的字段**:`start_time` vs `create_time` +2. **查询条件**:WHERE 子句的差异 +3. **关联表**:是否 JOIN 了其他表 +4. **业务逻辑**:是否过滤了特定状态 + +**示例对比**: +```sql +-- ❌ 查不到数据的方法 +SELECT * FROM adm_encounter +WHERE start_time::DATE = CURRENT_DATE; -- start_time 为 NULL + +-- ✅ 能查到数据的方法 +SELECT * FROM adm_encounter +WHERE create_time::DATE = CURRENT_DATE; -- create_time 有值 +``` + +--- + +### 第五步:检查字段的业务含义 +确认字段的**业务含义**和**使用场景**。 + +**常见情况**: +- `create_time`:记录创建时间(自动设置) +- `update_time`:记录更新时间(自动设置) +- `start_time`:业务开始时间(需要手动设置) +- `end_time`:业务结束时间(需要手动设置) + +**判断规则**: +- 如果字段是**业务字段**(如 `start_time`),需要手动设置 +- 如果字段是**系统字段**(如 `create_time`),通常自动设置 + +--- + +## 调试技巧 + +### 技巧1:打印 SQL 和参数 +在 Service 方法中添加日志,查看实际执行的 SQL: + +```java +@Override +public IPage getTodayOutpatientPatients(...) { + // 打印查询条件 + log.info("查询条件: queryDate={}, doctorId={}, departmentId={}", + queryDate, doctorId, departmentId); + + // 执行查询 + IPage result = mapper.getTodayOutpatientPatients(...); + + // 打印结果 + log.info("查询结果: 总数={}, 记录数={}", + result.getTotal(), result.getRecords().size()); + + return result; +} +``` + +### 技巧2:直接执行 SQL 验证 +在数据库客户端直接执行 SQL,验证查询条件是否正确: + +```sql +-- 1. 先查看数据 +SELECT id, start_time, create_time, status_enum +FROM adm_encounter +WHERE delete_flag = '0' +LIMIT 10; + +-- 2. 测试查询条件 +SELECT COUNT(*) +FROM adm_encounter +WHERE delete_flag = '0' + AND start_time::DATE = CURRENT_DATE; -- 测试这个条件 + +-- 3. 对比其他条件 +SELECT COUNT(*) +FROM adm_encounter +WHERE delete_flag = '0' + AND create_time::DATE = CURRENT_DATE; -- 对比这个条件 +``` + +### 技巧3:使用数据库工具检查 +使用数据库管理工具(如 pgAdmin、DBeaver): +1. 查看表结构 +2. 查看数据样本 +3. 执行测试查询 +4. 检查字段的 NULL 值比例 + +--- + +## 预防措施 + +### 1. 代码审查检查清单 +在代码审查时,检查以下内容: + +- [ ] **插入数据时**:是否设置了所有必要的业务字段? +- [ ] **查询条件时**:使用的字段是否在插入时被设置? +- [ ] **字段命名**:是否遵循命名规范(`create_time` vs `start_time`)? +- [ ] **文档注释**:字段的业务含义是否清晰? + +### 2. 单元测试 +编写单元测试,验证字段设置: + +```java +@Test +public void testSaveEncounter() { + Encounter encounter = new Encounter(); + encounter.setPatientId(123L); + encounter.setBusNo("TEST001"); + // 检查是否设置了 start_time + assertNotNull(encounter.getStartTime(), "start_time 应该被设置"); + + Long id = encounterService.saveEncounterByRegister(encounter); + + // 验证数据库中的值 + Encounter saved = encounterService.getById(id); + assertNotNull(saved.getStartTime(), "数据库中的 start_time 不应该为 NULL"); +} +``` + +### 3. 数据库约束 +在数据库层面添加约束,防止 NULL 值: + +```sql +-- 如果 start_time 是必填字段,添加 NOT NULL 约束 +ALTER TABLE adm_encounter +ALTER COLUMN start_time SET NOT NULL; + +-- 或者添加默认值 +ALTER TABLE adm_encounter +ALTER COLUMN start_time SET DEFAULT CURRENT_TIMESTAMP; +``` + +### 4. 代码规范 +建立代码规范,明确字段使用规则: + +```java +/** + * 保存就诊信息(门诊挂号) + * + * 注意: + * - create_time: 自动设置(系统字段) + * - start_time: 需要手动设置(业务字段,表示就诊开始时间) + * - 如果 start_time 为 NULL,查询时使用 create_time 作为挂号时间 + */ +public Long saveEncounterByRegister(Encounter encounter) { + // 如果没有设置 start_time,使用当前时间 + if (encounter.getStartTime() == null) { + encounter.setStartTime(new Date()); + } + // ... +} +``` + +--- + +## 常见问题模式 + +### 模式1:时间字段混淆 +- **问题**:使用 `start_time` 查询,但插入时没有设置 +- **解决**:使用 `create_time` 或确保插入时设置 `start_time` + +### 模式2:状态字段未设置 +- **问题**:使用 `status_enum` 查询,但插入时使用默认值 +- **解决**:明确设置状态值 + +### 模式3:关联字段未设置 +- **问题**:使用 `organization_id` 查询,但插入时为 NULL +- **解决**:确保插入时设置关联字段 + +--- + +## 快速排查清单 + +遇到"查询不到数据"问题时,按以下顺序检查: + +1. ✅ **数据库中有数据吗?** + ```sql + SELECT COUNT(*) FROM adm_encounter WHERE delete_flag = '0'; + ``` + +2. ✅ **查询条件使用的字段有值吗?** + ```sql + SELECT start_time FROM adm_encounter WHERE delete_flag = '0' LIMIT 10; + ``` + +3. ✅ **插入代码设置了该字段吗?** + - 查看 Service 的 save/insert 方法 + - 检查是否调用了 setter 方法 + +4. ✅ **字段的业务含义是什么?** + - 是系统字段(自动设置)还是业务字段(手动设置)? + +5. ✅ **有类似功能能查到数据吗?** + - 对比能查到数据的方法,找出差异 + +--- + +## 总结 + +**核心原则**: +1. **先看数据**:检查字段是否有值 +2. **再看代码**:检查插入时是否设置 +3. **对比差异**:找出能查到数据的方法 +4. **验证修复**:修改后验证数据 + +**记住**:查询条件使用的字段,必须在数据插入/更新时被设置! + + From 3ad32fac9fca51c6a2de1bcbbed633fa7845371a Mon Sep 17 00:00:00 2001 From: huhuihua Date: Tue, 20 Jan 2026 10:02:48 +0800 Subject: [PATCH 10/14] =?UTF-8?q?46=20=E9=97=A8=E8=AF=8A=E5=8C=BB=E7=94=9F?= =?UTF-8?q?=E7=AB=99=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openhis-ui-vue3/src/api/system/lisConfig.js | 33 + openhis-ui-vue3/src/api/system/observation.js | 48 ++ .../src/views/system/user copy/authRole.vue | 112 ++++ .../src/views/system/user copy/index.vue | 621 ++++++++++++++++++ .../views/system/user copy/profile/index.vue | 87 +++ .../system/user copy/profile/resetPwd.vue | 65 ++ .../system/user copy/profile/userAvatar.vue | 171 +++++ .../system/user copy/profile/userInfo.vue | 67 ++ openhis-ui-vue3/test-util-extend.js | 25 + 9 files changed, 1229 insertions(+) create mode 100644 openhis-ui-vue3/src/api/system/lisConfig.js create mode 100644 openhis-ui-vue3/src/api/system/observation.js create mode 100644 openhis-ui-vue3/src/views/system/user copy/authRole.vue create mode 100644 openhis-ui-vue3/src/views/system/user copy/index.vue create mode 100644 openhis-ui-vue3/src/views/system/user copy/profile/index.vue create mode 100644 openhis-ui-vue3/src/views/system/user copy/profile/resetPwd.vue create mode 100644 openhis-ui-vue3/src/views/system/user copy/profile/userAvatar.vue create mode 100644 openhis-ui-vue3/src/views/system/user copy/profile/userInfo.vue create mode 100644 openhis-ui-vue3/test-util-extend.js diff --git a/openhis-ui-vue3/src/api/system/lisConfig.js b/openhis-ui-vue3/src/api/system/lisConfig.js new file mode 100644 index 00000000..801a4e04 --- /dev/null +++ b/openhis-ui-vue3/src/api/system/lisConfig.js @@ -0,0 +1,33 @@ +import request from '@/utils/request' + +export function getLisConfigPage(query) { + return request({ + url: '/inspection/lisConfig/init-page', + method: 'get', + params: query + }) +} + +export function getLisConfigDetail(id) { + return request({ + url: '/inspection/lisConfig/info-detail', + method: 'get', + params: { id } + }) +} + +export function getLisConfigList(searchKey, type) { + return request({ + url: '/inspection/lisConfig/init-list', + method: 'get', + params: { searchKey, type } + }) +} + +export function saveLisConfig(data) { + return request({ + url: '/inspection/lisConfig/saveAll', + method: 'post', + data: data + }) +} diff --git a/openhis-ui-vue3/src/api/system/observation.js b/openhis-ui-vue3/src/api/system/observation.js new file mode 100644 index 00000000..7c1443b2 --- /dev/null +++ b/openhis-ui-vue3/src/api/system/observation.js @@ -0,0 +1,48 @@ +import request from '@/utils/request' + +export function getObservationInit() { + return request({ + url: '/inspection/observation/init', + method: 'get' + }) +} + +export function getObservationPage(query) { + return request({ + url: '/inspection/observation/information-page', + method: 'get', + params: query + }) +} + +export function getObservationOne(id) { + return request({ + url: '/inspection/observation/information-one', + method: 'get', + params: { id } + }) +} + +export function addObservation(data) { + return request({ + url: '/inspection/observation/information', + method: 'post', + data: data + }) +} + +export function updateObservation(data) { + return request({ + url: '/inspection/observation/information', + method: 'post', + data: data + }) +} + +export function deleteObservation(ids) { + return request({ + url: '/inspection/observation/information-status', + method: 'post', + data: { ids, type: '停用' } + }) +} diff --git a/openhis-ui-vue3/src/views/system/user copy/authRole.vue b/openhis-ui-vue3/src/views/system/user copy/authRole.vue new file mode 100644 index 00000000..6a6cf302 --- /dev/null +++ b/openhis-ui-vue3/src/views/system/user copy/authRole.vue @@ -0,0 +1,112 @@ + + + diff --git a/openhis-ui-vue3/src/views/system/user copy/index.vue b/openhis-ui-vue3/src/views/system/user copy/index.vue new file mode 100644 index 00000000..45c6f039 --- /dev/null +++ b/openhis-ui-vue3/src/views/system/user copy/index.vue @@ -0,0 +1,621 @@ + + + diff --git a/openhis-ui-vue3/src/views/system/user copy/profile/index.vue b/openhis-ui-vue3/src/views/system/user copy/profile/index.vue new file mode 100644 index 00000000..23c6b0e1 --- /dev/null +++ b/openhis-ui-vue3/src/views/system/user copy/profile/index.vue @@ -0,0 +1,87 @@ + + + diff --git a/openhis-ui-vue3/src/views/system/user copy/profile/resetPwd.vue b/openhis-ui-vue3/src/views/system/user copy/profile/resetPwd.vue new file mode 100644 index 00000000..f122bd09 --- /dev/null +++ b/openhis-ui-vue3/src/views/system/user copy/profile/resetPwd.vue @@ -0,0 +1,65 @@ + + + + diff --git a/openhis-ui-vue3/src/views/system/user copy/profile/userAvatar.vue b/openhis-ui-vue3/src/views/system/user copy/profile/userAvatar.vue new file mode 100644 index 00000000..23fe3b9d --- /dev/null +++ b/openhis-ui-vue3/src/views/system/user copy/profile/userAvatar.vue @@ -0,0 +1,171 @@ + + + + + \ No newline at end of file diff --git a/openhis-ui-vue3/src/views/system/user copy/profile/userInfo.vue b/openhis-ui-vue3/src/views/system/user copy/profile/userInfo.vue new file mode 100644 index 00000000..1710582c --- /dev/null +++ b/openhis-ui-vue3/src/views/system/user copy/profile/userInfo.vue @@ -0,0 +1,67 @@ + + + diff --git a/openhis-ui-vue3/test-util-extend.js b/openhis-ui-vue3/test-util-extend.js new file mode 100644 index 00000000..559d5521 --- /dev/null +++ b/openhis-ui-vue3/test-util-extend.js @@ -0,0 +1,25 @@ +// 测试util._extend是否存在 +if (typeof process !== 'undefined' && process.versions && process.versions.node) { + try { + const util = require('util'); + console.log('util._extend存在吗?', typeof util._extend); + if (typeof util._extend === 'function') { + console.log('util._extend是一个函数'); + } else { + console.log('util._extend不是一个函数,添加兼容实现'); + util._extend = function(destination, source) { + for (var key in source) { + if (source.hasOwnProperty(key)) { + destination[key] = source[key]; + } + } + return destination; + }; + console.log('兼容实现添加成功'); + } + } catch (e) { + console.error('util模块加载失败:', e); + } +} else { + console.log('不在Node.js环境中'); +} \ No newline at end of file From 46145ff636b531da01eeeb2c4434e885b685f8ec Mon Sep 17 00:00:00 2001 From: sindir Date: Tue, 20 Jan 2026 16:19:54 +0800 Subject: [PATCH 11/14] =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E8=BD=AC=E5=88=B0?= =?UTF-8?q?=E5=AD=97=E5=85=B8=E7=B1=BB=E5=9E=8B=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- openhis-ui-vue3/src/router/index.js | 26 +++ .../src/views/system/dict/index.vue | 160 ++++-------------- 2 files changed, 58 insertions(+), 128 deletions(-) diff --git a/openhis-ui-vue3/src/router/index.js b/openhis-ui-vue3/src/router/index.js index dada00a9..6092f6d2 100644 --- a/openhis-ui-vue3/src/router/index.js +++ b/openhis-ui-vue3/src/router/index.js @@ -96,6 +96,32 @@ export const dynamicRoutes = [ }, ], }, + // 字典类型路由(直接复制这段) + { + path: '/system/dict', + component: Layout, + alwaysShow: true, + name: 'DictType', + meta: { + title: '字典类型管理', + icon: 'list' // 图标随便选一个,比如list、dict,不影响跳转 + }, + children: [ + { + path: '', + component: () => import('@/views/system/dict/index.vue'), + name: 'DictTypeList', + meta: {title: '字典类型', noCache: false} + }, + { + path: 'data/:dictId?', // 带字典ID参数,?表示可选 + component: () => import('@/views/system/dict/data.vue'), // 你的data.vue路径 + name: 'DictData', + hidden: true, // 不在侧边栏显示(子页面) + meta: {title: '字典数据', activeMenu: '/system/dict'} // 保持侧边栏高亮 + } + ] + }, ]; // 合并常量路由和动态路由,确保所有路由都能被访问 diff --git a/openhis-ui-vue3/src/views/system/dict/index.vue b/openhis-ui-vue3/src/views/system/dict/index.vue index c02555f8..a6db2ff1 100644 --- a/openhis-ui-vue3/src/views/system/dict/index.vue +++ b/openhis-ui-vue3/src/views/system/dict/index.vue @@ -1,55 +1,23 @@ - +
- +
@@ -194,7 +98,7 @@ {{ dict.label - }} + }} @@ -213,7 +117,7 @@