Fix: 修复bug:430 门诊医生站-检查申请:实现套餐金额变更与检查部位的金额/检查申请单开立的项目金额实时同步联动

bug400: 完诊时triage_queue_item.status更新增加回退查询容错
This commit is contained in:
wangjian963
2026-05-09 13:23:58 +08:00
parent cb33f4dbe9
commit b48ca4fb4a
2 changed files with 47 additions and 0 deletions

View File

@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.core.common.core.domain.R; import com.core.common.core.domain.R;
import com.openhis.check.domain.CheckPackage; import com.openhis.check.domain.CheckPackage;
import com.openhis.check.domain.CheckPackageDetail; import com.openhis.check.domain.CheckPackageDetail;
import com.openhis.check.domain.CheckPart;
import com.openhis.check.service.ICheckPackageDetailService; import com.openhis.check.service.ICheckPackageDetailService;
import com.openhis.check.service.ICheckPackageService; import com.openhis.check.service.ICheckPackageService;
import com.openhis.check.service.ICheckPartService;
import com.openhis.web.check.appservice.ICheckPackageAppService; import com.openhis.web.check.appservice.ICheckPackageAppService;
import com.openhis.web.check.dto.CheckPackageDetailDto; import com.openhis.web.check.dto.CheckPackageDetailDto;
import com.openhis.web.check.dto.CheckPackageDto; import com.openhis.web.check.dto.CheckPackageDto;
@@ -34,6 +36,7 @@ public class CheckPackageAppServiceImpl implements ICheckPackageAppService {
private final ICheckPackageService checkPackageService; private final ICheckPackageService checkPackageService;
private final ICheckPackageDetailService checkPackageDetailService; private final ICheckPackageDetailService checkPackageDetailService;
private final ICheckPartService checkPartService;
/** /**
* 转换明细 DTO 列表为实体列表 * 转换明细 DTO 列表为实体列表
@@ -61,6 +64,25 @@ public class CheckPackageAppServiceImpl implements ICheckPackageAppService {
return details; return details;
} }
/**
* 同步更新引用此套餐的检查部位价格
*/
private void syncCheckPartPrice(String packageName, java.math.BigDecimal newPrice) {
if (packageName == null || newPrice == null) {
return;
}
List<CheckPart> parts = checkPartService.list(
new LambdaQueryWrapper<CheckPart>()
.eq(CheckPart::getPackageName, packageName)
);
if (parts.isEmpty()) {
return;
}
parts.forEach(part -> part.setPrice(newPrice.doubleValue()));
checkPartService.updateBatchById(parts);
log.info("套餐[{}]价格更新为 {},已同步更新 {} 个检查部位的价格", packageName, newPrice, parts.size());
}
@Override @Override
public R<?> getCheckPackageList() { public R<?> getCheckPackageList() {
try { try {
@@ -134,6 +156,9 @@ public class CheckPackageAppServiceImpl implements ICheckPackageAppService {
} }
} }
// 同步更新引用此套餐的检查部位价格
syncCheckPartPrice(checkPackage.getPackageName(), checkPackage.getPackagePrice());
return R.ok(checkPackage.getId(), "保存成功"); return R.ok(checkPackage.getId(), "保存成功");
} catch (Exception e) { } catch (Exception e) {
log.error("新增检查套餐失败", e); log.error("新增检查套餐失败", e);
@@ -193,6 +218,9 @@ public class CheckPackageAppServiceImpl implements ICheckPackageAppService {
checkPackageDetailService.saveBatch(details); checkPackageDetailService.saveBatch(details);
} }
// 同步更新引用此套餐的检查部位价格
syncCheckPartPrice(existPackage.getPackageName(), checkPackage.getPackagePrice());
return R.ok("更新成功"); return R.ok("更新成功");
} catch (Exception e) { } catch (Exception e) {
log.error("更新检查套餐失败", e); log.error("更新检查套餐失败", e);

View File

@@ -303,6 +303,22 @@ public class DoctorStationMainAppServiceImpl implements IDoctorStationMainAppSer
.eq(TriageQueueItem::getDeleteFlag, "0") .eq(TriageQueueItem::getDeleteFlag, "0")
); );
// 当天未找到时回退:不限日期查最近一条(防止跨日就诊队列项遗漏更新)
if (queueItem == null) {
queueItem = triageQueueItemService.getOne(
new LambdaQueryWrapper<TriageQueueItem>()
.eq(TriageQueueItem::getTenantId, tenantId)
.eq(TriageQueueItem::getEncounterId, encounterId)
.eq(TriageQueueItem::getDeleteFlag, "0")
.orderByDesc(TriageQueueItem::getQueueDate)
.last("LIMIT 1")
);
if (queueItem != null) {
log.warn("完诊:当天队列项未找到,回退使用最近队列记录 queueDate={}, id={}",
queueItem.getQueueDate(), queueItem.getId());
}
}
// 如果队列项存在且未完成,更新队列状态为已完成 // 如果队列项存在且未完成,更新队列状态为已完成
// 使用排除法而非白名单:只要不是"已完成"就可以完诊,覆盖跳过、等待等非标准流转状态 // 使用排除法而非白名单:只要不是"已完成"就可以完诊,覆盖跳过、等待等非标准流转状态
if (queueItem != null && if (queueItem != null &&
@@ -311,6 +327,9 @@ public class DoctorStationMainAppServiceImpl implements IDoctorStationMainAppSer
queueItem.setStatus(TriageQueueStatus.COMPLETED.getValue()); queueItem.setStatus(TriageQueueStatus.COMPLETED.getValue());
queueItem.setUpdateTime(nowLocal); queueItem.setUpdateTime(nowLocal);
triageQueueItemService.updateById(queueItem); triageQueueItemService.updateById(queueItem);
} else if (queueItem == null) {
log.error("完诊:未找到任何 triage_queue_item 记录encounterId={}, tenantId={}",
encounterId, tenantId);
} }
// 写入 div_log 审计日志(独立于队列项,确保每次完诊都生成记录) // 写入 div_log 审计日志(独立于队列项,确保每次完诊都生成记录)