Compare commits

...

5 Commits

3 changed files with 83 additions and 67 deletions

View File

@@ -1193,6 +1193,30 @@ public class AdviceManageAppServiceImpl implements IAdviceManageAppService {
.set(DeviceRequest::getStatusEnum, RequestStatus.PENDING_STOP.getValue())
.set(DeviceRequest::getUpdateBy, stopUserName));
}
// 🔧 Bug #782 修复:兜底处理未被以上任何类型过滤器捕获的医嘱
// 当批量停嘱包含非标准 adviceType如 type=31、type=7 等)时,这些医嘱
// 不会被药品/诊疗/耗材任一组捕获,导致状态未更新为 PENDING_STOP造成状态不一致
// 将所有未匹配类型的医嘱统一按诊疗请求ServiceRequest处理
Set<Long> handledIds = new HashSet<>();
handledIds.addAll(medicineRequestIds);
handledIds.addAll(activityRequestIds);
handledIds.addAll(deviceRequestIds);
List<Long> fallbackRequestIds = paramList.stream()
.map(AdviceBatchOpParam::getRequestId)
.filter(Objects::nonNull)
.filter(id -> !handledIds.contains(id))
.collect(Collectors.toList());
if (!fallbackRequestIds.isEmpty()) {
log.info("Bug #782 兜底停嘱处理未匹配类型的医嘱requestIds: {}, 共{}条",
fallbackRequestIds, fallbackRequestIds.size());
iServiceRequestService.update(new LambdaUpdateWrapper<ServiceRequest>()
.in(ServiceRequest::getId, fallbackRequestIds)
.set(ServiceRequest::getOccurrenceEndTime, stopTime)
.set(ServiceRequest::getStatusEnum, RequestStatus.PENDING_STOP.getValue())
.set(ServiceRequest::getUpdateBy, stopUserName));
}
return R.ok(null, MessageUtils.createMessage(PromptMsgConstant.Common.M00004, new Object[]{"医嘱停止"}));
}

View File

@@ -81,6 +81,7 @@
class="inspection-table"
:row-config="{ keyField: 'applicationId', keyField: 'itemId' }"
@checkbox-change="handleSelectionChange"
@current-change="handleRowClick"
@cell-click="handleCellClick"
>
<vxe-column
@@ -2141,32 +2142,15 @@ const handleSave = () => {
let hasErrors = false
// 修复【#406】保存前尝试从 props 同步患者信息,避免因加载时序导致信息缺失
if (props.patientInfo && props.patientInfo.encounterId) {
// encounterId 来自 adm_encounter 表lab_apply 表无此字段,需始终从 props 同步
if (!formData.encounterId) {
formData.encounterId = props.patientInfo.encounterId || ''
}
if (!formData.patientName?.trim()) {
formData.patientName = props.patientInfo.patientName || ''
}
if (!formData.medicalrecordNumber?.trim()) {
formData.medicalrecordNumber = props.patientInfo.identifierNo || ''
}
if (!formData.visitNo) {
formData.visitNo = props.patientInfo.busNo || ''
}
if (!formData.patientId) {
formData.patientId = props.patientInfo.patientId || ''
}
if (!formData.applyDepartment) {
formData.applyDepartment = props.patientInfo.organizationName || ''
}
if (!formData.applyDeptCode) {
formData.applyDeptCode = props.patientInfo.organizationName || ''
}
if (!formData.applyOrganizationId) {
formData.applyOrganizationId = props.patientInfo.orgId || ''
}
if ((!formData.patientName?.trim() || !formData.medicalrecordNumber?.trim()) && props.patientInfo && props.patientInfo.encounterId) {
formData.patientName = props.patientInfo.patientName || ''
formData.medicalrecordNumber = props.patientInfo.identifierNo || ''
formData.encounterId = props.patientInfo.encounterId || ''
formData.visitNo = props.patientInfo.busNo || ''
formData.patientId = props.patientInfo.patientId || ''
formData.applyDepartment = props.patientInfo.organizationName || ''
formData.applyDeptCode = props.patientInfo.organizationName || ''
formData.applyOrganizationId = props.patientInfo.orgId || ''
}
// P0检查患者信息是否已加载
@@ -2473,13 +2457,10 @@ const handleDelete = (row) => {
}
// 单元格点击 - 点击表格行时加载申请单详情
const handleCellClick = (params) => {
// vxe-table cell-click 事件参数是 { row, column, $event, ... } 对象,需安全提取行数据
const row = params.row || params;
const column = params.column || params;
const handleCellClick = (row, column) => {
// 如果点击的是操作列或展开列,不触发数据填充
if (column.type === 'expand' || column.type === 'selection' ||
column.title === '操作' || column.property === '操作') {
if (column.property === '操作' || column.label === '操作' ||
column.type === 'expand' || column.type === 'selection') {
return;
}
// 点击表格行时,将该申请单的数据加载到表单中
@@ -2489,6 +2470,15 @@ const handleCellClick = (params) => {
}
}
// 行点击事件处理
const handleRowClick = (currentRow, oldRow) => {
// 点击表格行时,将该申请单的数据加载到表单中
// 使用 applyNo 判断是否有效,同时检查是否处于删除状态
if (currentRow && currentRow.applyNo && !isDeleting.value) {
loadApplicationToForm(currentRow);
}
}
// 提取公共方法加载申请单到表单
const loadApplicationToForm = async (row) => {
// 停止申请日期实时更新(加载已保存的申请单)

View File

@@ -196,6 +196,7 @@
v-model="open"
:title="title"
width="1200px"
class="surgery-dialog"
:close-on-click-modal="false"
@close="cancel"
>
@@ -1757,13 +1758,13 @@ defineExpose({
height: 100%;
width: 100%;
padding: 10px;
/* 顶部操作栏样式 */
.top-operation-bar {
height: 60px;
align-items: center;
margin-bottom: 16px;
.add-button {
background-color: #5b8fb9;
color: white;
@@ -1774,7 +1775,7 @@ defineExpose({
box-shadow: 0 4px 8px rgba(91, 143, 185, 0.3);
}
}
.refresh-button {
background-color: transparent;
border: 1px solid #dcdfe6;
@@ -1786,14 +1787,14 @@ defineExpose({
}
}
}
/* 表格样式 */
.vxe-table {
:deep(.cancelled-row) {
background-color: #f5f5f5;
color: #999;
text-decoration: line-through;
:deep(.cell) {
opacity: 0.6;
}
@@ -1801,47 +1802,48 @@ defineExpose({
}
}
/* 对话框样式 */
.el-dialog {
/* Bug #770: Dialog flex 布局 — 防止 footer 按钮遮盖表单字段 */
:deep(.surgery-dialog) {
display: flex;
flex-direction: column;
max-height: 85vh;
margin-top: 7.5vh;
}
:deep(.surgery-dialog .el-dialog__header) {
flex-shrink: 0;
padding: 16px 20px;
border-bottom: 1px solid #ebeef5;
}
:deep(.surgery-dialog .el-dialog__body) {
flex: 1;
min-height: 0;
overflow-y: auto;
padding: 20px;
}
:deep(.surgery-dialog .el-dialog__footer) {
flex-shrink: 0;
padding: 12px 20px;
border-top: 1px solid #ebeef5;
}
/* 对话框圆角 */
:deep(.surgery-dialog .el-dialog) {
border-radius: 12px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
}
.dialog-footer {
text-align: center;
padding: 20px 0;
}
/* Bug #770: Dialog flex 布局 — 防止 footer 按钮遮盖表单字段 */
:deep(.el-dialog) {
display: flex;
}
:deep(.el-dialog__header) {
flex-shrink: 0;
}
:deep(.el-dialog__body) {
flex: 1;
min-height: 0;
}
:deep(.el-dialog__footer) {
flex-shrink: 0;
border-top: 1px solid #ebeef5;
}
/* 响应式:小屏幕下对话框宽度自适应 */
@media (max-width: 1200px) {
:deep(.el-dialog) {
:deep(.surgery-dialog) {
width: 95vw !important;
margin: 2.5vh auto;
}
}
</style>
display: flex;
flex-direction: column;
max-height: 85vh;
overflow-y: auto;
padding: 20px;
padding: 12px 20px 12px;
</style>