Compare commits

...

3 Commits

Author SHA1 Message Date
9ae9fae2c8 Merge remote-tracking branch 'origin/develop' into develop 2026-06-15 09:26:08 +08:00
7374e17f2e feat(clinical): 添加临床检验管理API兼容层
- 新增ClinicalManageLaboratoryController支持检验结果页面API映射
- 新增ClinicalManageObservationController提供检查结果API兼容接口
- 实现检验结果分页查询和详情获取功能
- 为检查结果预留接口并返回空数据避免前端报错
- 修复封存表medical_record_id字段非空约束导致的插入错误
2026-06-15 09:25:57 +08:00
6ca467a81a refactor(ui): 优化页面布局和表格组件
- 将多个页面的固定高度样式改为flex布局,提升响应式体验
- 替换菜单管理页面的vxe-table为el-table组件以统一技术栈
- 为菜单名称添加图标标识区分不同菜单类型
- 调整表单和表格容器的尺寸计算方式,支持自适应高度
- 优化滚动和溢出处理,改善页面渲染性能
- 修复部分组件的样式和数据绑定问题
2026-06-15 09:25:29 +08:00
13 changed files with 182 additions and 3480 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,37 @@
package com.healthlink.his.web.Inspection.controller;
import com.core.common.core.domain.R;
import com.healthlink.his.web.Inspection.appservice.ILaboratoryManageAppService;
import com.healthlink.his.web.Inspection.dto.ReportResultManageDto;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import jakarta.servlet.http.HttpServletRequest;
/**
* 前端 lisPascResult 页面 API 兼容映射
* 前端调用 /clinical-manage/laboratory/* 和 /clinical-manage/observation/*
* 路由到已有的 /inspection/* 服务
*/
@RestController
@Slf4j
@AllArgsConstructor
@RequestMapping("/clinical-manage/laboratory")
public class ClinicalManageLaboratoryController {
private final ILaboratoryManageAppService appService;
@GetMapping("/result-page")
public R<?> getResultPage(ReportResultManageDto dto,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize,
@RequestParam(name = "searchKey", required = false) String searchKey,
HttpServletRequest request) {
return appService.getReportResultList(dto, pageNo, pageSize, searchKey, request);
}
@GetMapping("/result-detail/{id}")
public R<?> getResultDetail(@PathVariable Long id) {
return appService.getReportById(id);
}
}

View File

@@ -0,0 +1,30 @@
package com.healthlink.his.web.Inspection.controller;
import com.core.common.core.domain.R;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.Collections;
/**
* 前端 lisPascResult 检查结果 API 兼容映射
* 后端暂无检查结果独立服务,返回空列表避免前端报错
* TODO: 接入检查报告数据源后替换实现
*/
@RestController
@Slf4j
@AllArgsConstructor
@RequestMapping("/clinical-manage/observation")
public class ClinicalManageObservationController {
@GetMapping("/result-page")
public R<?> getResultPage(@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
// 暂时返回空列表,前端可正常渲染
return R.ok(new java.util.HashMap<String, Object>() {{
put("records", Collections.emptyList());
put("total", 0);
}});
}
}

View File

@@ -1,4 +1,4 @@
<template>
<template>
<div class="app-container">
<div class="left">
<el-form
@@ -147,7 +147,7 @@
ref="tableRef"
:data="infusionList"
border
style="width: 100%; height: 300px"
style="width: 100%; flex: 1; min-height: 0"
@checkbox-change="handleSelectionChange"
@cell-click="handleRowClick"
>
@@ -231,7 +231,7 @@
<vxe-table
:data="historyRecordsList"
border
style="width: 100%; height: 300px"
style="width: 100%; flex: 1; min-height: 0"
>
<vxe-column
field="occurrenceEndTime"
@@ -670,15 +670,24 @@ getList();
.app-container {
padding: 20px;
display: flex;
height: calc(100vh - 84px);
overflow: hidden;
}
.left {
width: 28%;
min-width: 0;
flex-shrink: 0;
display: flex;
flex-direction: column;
overflow: hidden;
}
.right {
margin-left: 2%;
width: 70%;
margin-left: 12px;
flex: 1;
min-width: 0;
overflow: auto;
}
:deep(.vxe-table tbody tr:hover > td) {

View File

@@ -60,12 +60,13 @@
</el-form>
<!-- 表格 -->
<div class="table-wrapper">
<vxe-table
ref="tableRef"
v-loading="loading"
:data="tableData"
border
max-height="calc(100vh - 280px)"
height="100%"
>
<vxe-column field="formNo" title="申请单号" align="center" width="180" show-overflow />
<vxe-column field="patientName" title="患者姓名" align="center" width="110" />
@@ -106,6 +107,7 @@
</template>
</vxe-column>
</vxe-table>
</div>
<pagination
v-show="total > 0"
@@ -244,6 +246,18 @@ getListData()
</script>
<style lang="scss" scoped>
.app-container {
display: flex;
flex-direction: column;
height: calc(100vh - 84px);
overflow: hidden;
}
.table-wrapper {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
}
.detail-content {
.item-list {
margin-top: 16px;

View File

@@ -8,7 +8,7 @@
:model="queryParams"
:inline="true"
label-position="right"
style="min-width: 500px"
>
<el-form-item
label="患者信息"
@@ -70,7 +70,7 @@
<vxe-table
:row-config="{ isCurrent: true }" :data="patientList"
border
style="width: 100%; height: 60vh"
style="width: 100%; flex: 1; min-height: 0"
@cell-click="handleCurrentChange"
>
<vxe-column
@@ -176,7 +176,7 @@
v-loading="loading"
:data="medicineInfoList"
border
style="width: 100%; height: 65vh; margin-top: 10px"
style="width: 100%; flex: 1; min-height: 0; margin-top: 10px"
:span-method="spanMethod"
@select="handleSelectionChange"
@cell-dblclick="handleCellDbClick"
@@ -1191,21 +1191,33 @@ function handleCancel() {
.app-container {
padding: 20px;
display: flex;
height: calc(100vh - 84px);
overflow: hidden;
}
.left {
width: 25%;
min-width: 0;
flex-shrink: 0;
display: flex;
flex-direction: column;
overflow: hidden;
.form {
width: 100%;
display: flex;
justify-content: space-between;
flex-shrink: 0;
flex-wrap: wrap;
gap: 8px;
}
}
.right {
margin-left: 2%;
width: 74%;
margin-left: 12px;
flex: 1;
min-width: 0;
overflow: auto;
}
:deep(.vxe-table tbody tr:hover > td) {
@@ -1248,25 +1260,7 @@ function handleCancel() {
}
/* 其他已有样式保持不变 */
.app-container {
padding: 20px;
display: flex;
}
.left {
width: 25%;
}
.form {
width: 100%;
display: flex;
justify-content: space-between;
}
.right {
margin-left: 2%;
width: 74%;
}
:deep(.vxe-table tbody tr:hover > td) {
background-color: inherit !important;

View File

@@ -8,7 +8,7 @@
:model="queryParams"
:inline="true"
label-position="right"
style="min-width: 500px"
>
<el-form-item
label="患者信息"
@@ -86,7 +86,7 @@
<vxe-table
:row-config="{ isCurrent: true }" :data="patientList"
border
style="width: 100%; height: 60vh"
style="width: 100%; flex: 1; min-height: 0"
@cell-click="handleCurrentChange"
>
<vxe-column
@@ -283,7 +283,7 @@
v-loading="loading"
:data="medicineInfoList"
border
style="width: 100%; height: 65vh; margin-top: 10px"
style="width: 100%; flex: 1; min-height: 0; margin-top: 10px"
:span-method="spanMethod"
:cell-class-name="cellClassName"
@select="handleSelectionChange"
@@ -1485,21 +1485,33 @@ function validate() {
.app-container {
padding: 20px;
display: flex;
height: calc(100vh - 84px);
overflow: hidden;
}
.left {
width: 25%;
min-width: 0;
flex-shrink: 0;
display: flex;
flex-direction: column;
overflow: hidden;
.form {
width: 100%;
display: flex;
justify-content: space-between;
flex-shrink: 0;
flex-wrap: wrap;
gap: 8px;
}
}
.right {
margin-left: 2%;
width: 74%;
margin-left: 12px;
flex: 1;
min-width: 0;
overflow: auto;
}
/* 表格文字颜色改为纯黑色 */

View File

@@ -1,4 +1,4 @@
<template>
<template>
<div class="app-container">
<el-form
v-show="showSearch"
@@ -103,23 +103,24 @@
/>
</el-row>
<vxe-table
v-if="refreshTable"
v-loading="loading"
<el-table v-if="refreshTable" ref="menuTableRef" v-loading="loading"
:data="menuList"
:row-config="{ keyField: 'menuId' }"
row-key="menuId"
:default-expand-all="isExpandAll"
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
>
<vxe-column
field="menuName"
<el-table-column
prop="menuName"
title="菜单名称"
:show-overflow="true"
show-overflow-tooltip
width="160"
>
<template #default="scope">
<span v-if="scope.row.menuType === 'M'" style="font-weight: 600; font-size: 14px;">
📁 {{ scope.row.menuName }}
</span>
<span
v-if="scope.row.menuType === 'C'"
v-else-if="scope.row.menuType === 'C'"
class="menu-name-link"
:title="`点击跳转到${scope.row.menuName}模块`"
style="cursor: pointer; color: #3B82F6;"
@@ -127,86 +128,84 @@
>
{{ scope.row.menuName }}
</span>
<span v-else>{{ scope.row.menuName }}</span>
<span v-else style="color: #909399;">
{{ scope.row.menuName }}
</span>
</template>
</vxe-column>
<vxe-column
field="icon"
</el-table-column>
<el-table-column
prop="icon"
title="图标"
align="center"
width="100"
>
<template #default="scope">
<svg-icon :icon-class="scope.row.icon" />
<svg-icon v-if="scope.row.icon" :icon-class="scope.row.icon" />
</template>
</vxe-column>
<vxe-column
field="orderNum"
</el-table-column>
<el-table-column
prop="orderNum"
title="排序"
width="60"
/>
<vxe-column
field="perms"
<el-table-column
prop="perms"
title="权限标识"
:show-overflow="true"
show-overflow-tooltip
/>
<vxe-column
field="path"
<el-table-column
prop="path"
title="路由地址"
:show-overflow="true"
show-overflow-tooltip
/>
<vxe-column
field="fullPath"
<el-table-column
prop="fullPath"
title="完整路径"
:show-overflow="true"
show-overflow-tooltip
>
<template #default="scope">
<span v-if="scope.row.fullPath">{{ scope.row.fullPath }}</span>
<span v-else-if="scope.row.path">{{ scope.row.path }}</span>
</template>
</vxe-column>
<vxe-column
field="component"
</el-table-column>
<el-table-column
prop="component"
title="组件路径"
:show-overflow="true"
show-overflow-tooltip
/>
<vxe-column
field="status"
<el-table-column
prop="status"
title="状态"
width="80"
>
<template #default="scope">
<dict-tag
:options="processedSysNormalDisable"
:value="scope.row.status"
<dict-tag v-if="scope.row.status !== null && scope.row.status !== undefined" :options="processedSysNormalDisable" :value="scope.row.status"
class="dict-tag"
/>
</template>
</vxe-column>
<vxe-column
field="visible"
</el-table-column>
<el-table-column
prop="visible"
title="显示状态"
width="100"
>
<template #default="scope">
<dict-tag
:options="processedSysShowHide"
:value="scope.row.visible"
<dict-tag v-if="scope.row.visible !== null && scope.row.visible !== undefined" :options="processedSysShowHide" :value="scope.row.visible"
class="dict-tag"
/>
</template>
</vxe-column>
<vxe-column
</el-table-column>
<el-table-column
title="创建时间"
align="center"
width="160"
field="createTime"
prop="createTime"
>
<template #default="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</vxe-column>
<vxe-column
</el-table-column>
<el-table-column
title="操作"
align="center"
width="210"
@@ -244,8 +243,8 @@
删除
</el-button>
</template>
</vxe-column>
</vxe-table>
</el-table-column>
</el-table>
<!-- 添加或修改菜单对话框 -->
<el-dialog
@@ -613,7 +612,7 @@ const title = ref("");
const menuOptions = ref([]);
const isExpandAll = ref(false);
const refreshTable = ref(true);
const iconSelectRef = ref(null);
const iconSelectRef = ref(null);const menuTableRef = ref(null);
const data = reactive({
form: {},
@@ -739,8 +738,8 @@ async function handleAdd(row) {
}
/** 展开/折叠操作 */
function toggleExpandAll() {
refreshTable.value = false;
isExpandAll.value = !isExpandAll.value;
refreshTable.value = false;
nextTick(() => {
refreshTable.value = true;
});
@@ -879,4 +878,7 @@ getList();
.menu-name-link:hover {
text-decoration: underline;
}
:deep(.el-table__row) {
cursor: pointer;
}
</style>