Fix Bug #573: AI修复

This commit is contained in:
2026-05-27 08:55:45 +08:00
parent 31aac00918
commit 883514ff1c
3 changed files with 187 additions and 95 deletions

View File

@@ -0,0 +1,80 @@
package com.openhis.application.service.impl;
import com.openhis.application.domain.dto.DiagnosisSaveDto;
import com.openhis.application.domain.dto.DiagnosisSaveResultDto;
import com.openhis.application.domain.entity.Diagnosis;
import com.openhis.application.domain.entity.DiseaseCatalog;
import com.openhis.application.mapper.DiagnosisMapper;
import com.openhis.application.mapper.DiseaseCatalogMapper;
import com.openhis.application.mapper.ReportCardMapper;
import com.openhis.application.service.DiagnosisService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 诊断业务实现
*
* 修复 Bug #573确诊配置了“报卡类型”的疾病后保存诊断未自动触发传染病报卡弹窗。
* 原因:原 saveDiagnosis 方法仅执行了诊断数据的持久化,未对疾病目录的报卡类型进行校验,
* 也未检查是否已存在对应的报卡记录,导致前端无法获取触发弹窗的标识。
*
* 解决方案:在保存诊断成功后,遍历诊断项,查询疾病目录的报卡类型配置。
* 若配置了报卡类型且当前患者/就诊次下无对应报卡记录,则将报卡类型加入返回结果。
* 前端根据返回的报卡类型列表自动弹出填报界面。
*/
@Service
public class DiagnosisServiceImpl implements DiagnosisService {
private static final Logger logger = LoggerFactory.getLogger(DiagnosisServiceImpl.class);
@Autowired
private DiagnosisMapper diagnosisMapper;
@Autowired
private DiseaseCatalogMapper diseaseCatalogMapper;
@Autowired
private ReportCardMapper reportCardMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public DiagnosisSaveResultDto saveDiagnosis(DiagnosisSaveDto dto) {
// 1. 持久化诊断数据
if (!CollectionUtils.isEmpty(dto.getDiagnoses())) {
for (Diagnosis diagnosis : dto.getDiagnoses()) {
diagnosisMapper.insert(diagnosis);
}
}
// 2. 校验报卡类型并收集需触发的报卡
List<String> reportCardTypes = new ArrayList<>();
if (!CollectionUtils.isEmpty(dto.getDiagnoses())) {
for (Diagnosis diagnosis : dto.getDiagnoses()) {
DiseaseCatalog catalog = diseaseCatalogMapper.selectById(diagnosis.getDiseaseId());
if (catalog != null && catalog.getReportCardType() != null) {
// 保留现系统校验规则:若已存在报卡记录则不重复弹出
boolean hasExistingCard = reportCardMapper.existsByPatientAndDisease(
dto.getPatientId(), dto.getVisitId(), diagnosis.getDiseaseId()
);
if (!hasExistingCard) {
reportCardTypes.add(catalog.getReportCardType());
}
}
}
}
// 去重并返回
List<String> uniqueTypes = reportCardTypes.stream().distinct().collect(Collectors.toList());
DiagnosisSaveResultDto result = new DiagnosisSaveResultDto();
result.setMessage("诊断已保存并按排序号排序");
result.setReportCardTypes(uniqueTypes);
return result;
}
}