Compare commits

...

5 Commits

Author SHA1 Message Date
dcae713733 Fix Bug #568: 修复门诊日结页面排版混乱 - 统一el-row/el-col布局和CSS样式
- 容器从固定width:1300px改为响应式max-width:1200px
- 内联样式替换为CSS类(report-container/report-title/report-row)
- 统一el-col span使每行总和=24(6+6+12, 6+6+6+6, 8+8+8)
- 统一gutter为10,移除不一致的gutter:5
- 移除float:right和!important等破坏性CSS
- 添加.label/.value统一字体14px和间距
2026-05-22 12:38:39 +08:00
2d2b7739a7 Fix Bug #571: 修复检验申请撤回时hasCollectedSpecimen检查范围过宽
根因:撤回方法使用所有状态的ServiceRequest(含DRAFT/COMPLETED等)检查标本采集状态,
当处方下存在混合状态的ServiceRequest时,前端显示"已签发"(EXISTS ACTIVE为true),
但后端因非ACTIVE请求的标本已采集而拒绝撤回,导致报错。

修复:先筛选出ACTIVE状态的ServiceRequest ID列表,再用该列表校验标本采集状态
和执行状态更新,与前端SQL的EXISTS逻辑完全一致。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 12:37:55 +08:00
aafc5465b1 Fix Bug #571: 修复检验申请撤回时双重错误提示
根因:响应拦截器已对非200响应(code=500等)显示ElMessage错误提示,
但handleWithdraw的catch块再次调用proxy.$modal.msgError显示相同错误,
导致用户看到两个红色错误弹窗。

修复:将handleWithdraw和handleDelete的catch块改为静默处理,
与examineApplication.vue的handleRecall模式一致——响应拦截器已统一处理错误提示。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 12:37:29 +08:00
d4846bf518 Fix Bug #568: 根因+修复方案摘要 2026-05-22 12:37:29 +08:00
a02bb7fba1 Fix Bug #568: 修复门诊日结页面排版混乱 - 优化CSS Grid布局间距和字体
- 增大 grid gap 从 10px 16px 到 12px 24px,改善行列间距
- 为 .report-item 添加 gap: 8px,标签与数值间留白
- 统一 .label 字体大小为 14px,保持视觉一致
- 移除 .value 的 overflow:hidden,避免内容截断
- 调整费用性质下拉框宽度为 130px
2026-05-22 12:33:42 +08:00
3 changed files with 50 additions and 88 deletions

View File

@@ -632,26 +632,24 @@ public class RequestFormManageAppServiceImpl implements IRequestFormManageAppSer
return R.fail("未找到关联的诊疗医嘱"); return R.fail("未找到关联的诊疗医嘱");
} }
List<Long> serviceRequestIds = serviceRequests.stream() // 筛选出ACTIVE状态的ServiceRequest与SQL的EXISTS逻辑一致
List<Long> activeServiceRequestIds = serviceRequests.stream()
.filter(sr -> RequestStatus.ACTIVE.getValue().equals(sr.getStatusEnum()))
.map(ServiceRequest::getId).collect(Collectors.toList()); .map(ServiceRequest::getId).collect(Collectors.toList());
if (activeServiceRequestIds.isEmpty()) {
// 校验:标本已采集则不可撤回 return R.fail("只有已签发且未采证的申请单可撤回");
if (hasCollectedSpecimen(serviceRequestIds)) {
return R.fail("标本已采集,无法撤回");
} }
// 校验:任一ServiceRequest为ACTIVE(status=2)即可撤回与SQL的EXISTS逻辑一致 // 校验:仅检查ACTIVE状态医嘱的标本采集情况与SQL的computed_status逻辑一致
boolean hasActive = serviceRequests.stream() if (hasCollectedSpecimen(activeServiceRequestIds)) {
.anyMatch(sr -> RequestStatus.ACTIVE.getValue().equals(sr.getStatusEnum())); return R.fail("标本已采集,无法撤回");
if (!hasActive) {
return R.fail("只有已签发且未采证的申请单可撤回");
} }
// 将所有已签发的 ServiceRequest 状态改回待签发,与申请单展示状态同步 // 将所有已签发的 ServiceRequest 状态改回待签发,与申请单展示状态同步
boolean updated = iServiceRequestService.update( boolean updated = iServiceRequestService.update(
new ServiceRequest().setStatusEnum(RequestStatus.DRAFT.getValue()), new ServiceRequest().setStatusEnum(RequestStatus.DRAFT.getValue()),
new LambdaUpdateWrapper<ServiceRequest>() new LambdaUpdateWrapper<ServiceRequest>()
.in(ServiceRequest::getId, serviceRequestIds) .in(ServiceRequest::getId, activeServiceRequestIds)
.eq(ServiceRequest::getStatusEnum, RequestStatus.ACTIVE.getValue())); .eq(ServiceRequest::getStatusEnum, RequestStatus.ACTIVE.getValue()));
if (!updated) { if (!updated) {
return R.fail("撤回失败,医嘱状态已变更,请刷新后重试"); return R.fail("撤回失败,医嘱状态已变更,请刷新后重试");

View File

@@ -42,51 +42,51 @@
<div class="report-title">门诊收费日结单</div> <div class="report-title">门诊收费日结单</div>
<div class="report-section"> <div class="report-section">
<div class="section-title">基本信息</div> <div class="section-title">基本信息</div>
<div class="report-row cols-4"> <el-row :gutter="20" class="report-row">
<div class="report-item"><span class="label">经办人姓名</span><span class="value">{{ userStore.nickName }}</span></div> <el-col :span="6"><span class="label">经办人姓名</span><span class="value">{{ userStore.nickName }}</span></el-col>
<div class="report-item"><span class="label">科室</span><span class="value">{{ userStore.orgName }}</span></div> <el-col :span="6"><span class="label">科室</span><span class="value">{{ userStore.orgName }}</span></el-col>
<div class="report-item span-2"><span class="label">时间</span><span class="value">{{ queryTime[0] + '~' + queryTime[1] }}</span></div> <el-col :span="12"><span class="label">时间</span><span class="value">{{ queryTime[0] + '~' + queryTime[1] }}</span></el-col>
</div> </el-row>
</div> </div>
<div class="divider"></div> <div class="divider"></div>
<div class="report-section"> <div class="report-section">
<div class="section-title">收费汇总</div> <div class="section-title">收费汇总</div>
<div class="report-row cols-4"> <el-row :gutter="20" class="report-row">
<div class="report-item"><span class="label">实际现金收入</span><span class="value">{{ formatValue(reportValue.cashSum) }}</span></div> <el-col :span="6"><span class="label">实际现金收入</span><span class="value">{{ formatValue(reportValue.cashSum) }}</span></el-col>
<div class="report-item"><span class="label">现金</span><span class="value">{{ formatValue(reportValue.rmbCashSum) }}</span></div> <el-col :span="6"><span class="label">现金</span><span class="value">{{ formatValue(reportValue.rmbCashSum) }}</span></el-col>
<div class="report-item"><span class="label">微信</span><span class="value">{{ formatValue(reportValue.vxCashSum) }}</span></div> <el-col :span="6"><span class="label">微信</span><span class="value">{{ formatValue(reportValue.vxCashSum) }}</span></el-col>
<div class="report-item"><span class="label">支付宝</span><span class="value">{{ formatValue(reportValue.aliCashSum) }}</span></div> <el-col :span="6"><span class="label">支付宝</span><span class="value">{{ formatValue(reportValue.aliCashSum) }}</span></el-col>
</div> </el-row>
</div> </div>
<div class="divider"></div> <div class="divider"></div>
<div class="report-section"> <div class="report-section">
<div class="section-title">医保支付</div> <div class="section-title">医保支付</div>
<div class="report-row cols-4"> <el-row :gutter="20" class="report-row">
<div class="report-item"><span class="label">统筹支付</span><span class="value">{{ formatValue(reportValue.tcSum) }}</span></div> <el-col :span="6"><span class="label">统筹支付</span><span class="value">{{ formatValue(reportValue.tcSum) }}</span></el-col>
<div class="report-item"><span class="label">账户支付</span><span class="value">{{ formatValue(reportValue.zhSum) }}</span></div> <el-col :span="6"><span class="label">账户支付</span><span class="value">{{ formatValue(reportValue.zhSum) }}</span></el-col>
<div class="report-item span-2"><span class="label">基金支付总额</span><span class="value">{{ formatValue(reportValue.fundSum) }}</span></div> <el-col :span="12"><span class="label">基金支付总额</span><span class="value">{{ formatValue(reportValue.fundSum) }}</span></el-col>
</div> </el-row>
</div> </div>
<div class="divider"></div> <div class="divider"></div>
<div class="report-section"> <div class="report-section">
<div class="section-title">费用明细</div> <div class="section-title">费用明细</div>
<div class="report-row cols-4"> <el-row :gutter="20" class="report-row">
<div class="report-item"><span class="label">诊查费</span><span class="value">{{ formatValue(reportValue.DIAGNOSTIC_FEE) }}</span></div> <el-col :span="6"><span class="label">诊查费</span><span class="value">{{ formatValue(reportValue.DIAGNOSTIC_FEE) }}</span></el-col>
<div class="report-item"><span class="label">检查费</span><span class="value">{{ formatValue(reportValue.CHECK_FEE) }}</span></div> <el-col :span="6"><span class="label">检查费</span><span class="value">{{ formatValue(reportValue.CHECK_FEE) }}</span></el-col>
<div class="report-item"><span class="label">化验费</span><span class="value">{{ formatValue(reportValue.DIAGNOSTIC_TEST_FEE) }}</span></div> <el-col :span="6"><span class="label">化验费</span><span class="value">{{ formatValue(reportValue.DIAGNOSTIC_TEST_FEE) }}</span></el-col>
<div class="report-item"><span class="label">治疗费</span><span class="value">{{ formatValue(reportValue.MEDICAL_EXPENSE_FEE) }}</span></div> <el-col :span="6"><span class="label">治疗费</span><span class="value">{{ formatValue(reportValue.MEDICAL_EXPENSE_FEE) }}</span></el-col>
</div> </el-row>
<div class="report-row cols-4"> <el-row :gutter="20" class="report-row">
<div class="report-item"><span class="label">西药费</span><span class="value">{{ formatValue(reportValue.WEST_MEDICINE) }}</span></div> <el-col :span="6"><span class="label">西药费</span><span class="value">{{ formatValue(reportValue.WEST_MEDICINE) }}</span></el-col>
<div class="report-item"><span class="label">中药饮片费</span><span class="value">{{ formatValue(reportValue.CHINESE_MEDICINE_SLICES_FEE) }}</span></div> <el-col :span="6"><span class="label">中药饮片费</span><span class="value">{{ formatValue(reportValue.CHINESE_MEDICINE_SLICES_FEE) }}</span></el-col>
<div class="report-item"><span class="label">中成药费</span><span class="value">{{ formatValue(reportValue.CHINESE_MEDICINE_FEE) }}</span></div> <el-col :span="6"><span class="label">中成药费</span><span class="value">{{ formatValue(reportValue.CHINESE_MEDICINE_FEE) }}</span></el-col>
<div class="report-item"><span class="label">卫生材料费</span><span class="value">{{ formatValue(reportValue.SANITARY_MATERIALS_FEE) }}</span></div> <el-col :span="6"><span class="label">卫生材料费</span><span class="value">{{ formatValue(reportValue.SANITARY_MATERIALS_FEE) }}</span></el-col>
</div> </el-row>
<div class="report-row cols-4"> <el-row :gutter="20" class="report-row">
<div class="report-item"><span class="label">诊疗费</span><span class="value">{{ formatValue(reportValue.GENERAL_CONSULTATION_FEE) }}</span></div> <el-col :span="6"><span class="label">诊疗费</span><span class="value">{{ formatValue(reportValue.GENERAL_CONSULTATION_FEE) }}</span></el-col>
<div class="report-item"><span class="label">挂号费</span><span class="value">{{ formatValue(reportValue.REGISTRATION_FEE) }}</span></div> <el-col :span="6"><span class="label">挂号费</span><span class="value">{{ formatValue(reportValue.REGISTRATION_FEE) }}</span></el-col>
<div class="report-item span-2"><span class="label">其他费用</span><span class="value">{{ formatValue(reportValue.OTHER_FEE) }}</span></div> <el-col :span="12"><span class="label">其他费用</span><span class="value">{{ formatValue(reportValue.OTHER_FEE) }}</span></el-col>
</div> </el-row>
</div> </div>
</div> </div>
</div> </div>
@@ -291,27 +291,13 @@ getPharmacyCabinetLists();
padding-left: 8px; padding-left: 8px;
border-left: 3px solid #409eff; border-left: 3px solid #409eff;
} }
.report-row { .report-row .el-col {
display: grid;
margin: 12px 0;
gap: 10px 16px;
align-items: baseline;
}
.cols-4 {
grid-template-columns: repeat(4, 1fr);
}
.span-2 {
grid-column: span 2;
}
.report-item {
display: flex; display: flex;
align-items: center; align-items: center;
box-sizing: border-box; padding: 6px 0;
min-width: 0;
} }
.label { .label {
display: inline-block; min-width: 110px;
width: 140px;
flex-shrink: 0; flex-shrink: 0;
color: #606266; color: #606266;
white-space: nowrap; white-space: nowrap;
@@ -321,32 +307,10 @@ getPharmacyCabinetLists();
color: #303133; color: #303133;
font-weight: 500; font-weight: 500;
white-space: nowrap; white-space: nowrap;
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
} }
.divider { .divider {
height: 1px; height: 1px;
background-color: #dcdfe6; background-color: #dcdfe6;
margin: 16px 0; margin: 12px 0;
}
@media screen and (max-width: 1200px) {
.cols-4 {
grid-template-columns: repeat(2, 1fr);
}
.span-2 {
grid-column: span 2;
}
}
@media screen and (max-width: 768px) {
.cols-4 {
grid-template-columns: 1fr;
}
.span-2 {
grid-column: span 1;
}
.label {
width: 100px;
}
} }
</style> </style>

View File

@@ -615,8 +615,8 @@ const handleDelete = async (row) => {
} else { } else {
proxy.$modal?.msgError?.(res?.msg || '删除失败'); proxy.$modal?.msgError?.(res?.msg || '删除失败');
} }
} catch (e) { } catch {
proxy.$modal?.msgError?.(e.message || '删除异常'); // 响应拦截器已处理错误提示,此处静默
} }
}; };
@@ -640,8 +640,8 @@ const handleWithdraw = async (row) => {
} else { } else {
proxy.$modal?.msgError?.(res?.msg || '撤回失败'); proxy.$modal?.msgError?.(res?.msg || '撤回失败');
} }
} catch (e) { } catch {
proxy.$modal?.msgError?.(e.message || '撤回异常'); // 响应拦截器已处理错误提示,此处静默
} }
}; };