|
@@ -7,17 +7,20 @@ import com.fs.common.utils.date.DateUtil;
|
|
|
import com.fs.his.domain.FsAttachment;
|
|
|
import com.fs.his.service.IFsAttachmentService;
|
|
|
import com.fs.medical.domain.PhysicalExamReport;
|
|
|
+import com.fs.medical.domain.ReportIndicatorResult;
|
|
|
import com.fs.medical.mapper.PhysicalExamReportMapper;
|
|
|
+import com.fs.medical.param.PhysicalExamReportCompareDto;
|
|
|
import com.fs.medical.param.PhysicalExamReportQueryDto;
|
|
|
import com.fs.medical.service.PhysicalExamReportService;
|
|
|
+import com.fs.medical.service.ReportIndicatorResultService;
|
|
|
import com.fs.store.service.cache.IFsUserCacheService;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.time.LocalDateTime;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* 体检报告服务实现类
|
|
@@ -35,6 +38,9 @@ public class PhysicalExamReportServiceImpl implements PhysicalExamReportService
|
|
|
|
|
|
@Autowired
|
|
|
private ICompanyUserCacheService companyUserCacheService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ReportIndicatorResultService reportIndicatorResultService;
|
|
|
|
|
|
@Override
|
|
|
public PhysicalExamReport getById(Long reportId) {
|
|
@@ -54,10 +60,10 @@ public class PhysicalExamReportServiceImpl implements PhysicalExamReportService
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public boolean save(PhysicalExamReport report) {
|
|
|
- if (report.getCreateTime() == null){
|
|
|
+ if (report.getCreateTime() == null) {
|
|
|
report.setCreateTime(LocalDateTime.now());
|
|
|
}
|
|
|
- boolean flag = physicalExamReportMapper.insert(report)>0;
|
|
|
+ boolean flag = physicalExamReportMapper.insert(report) > 0;
|
|
|
if (flag) {
|
|
|
createFile(report);
|
|
|
}
|
|
@@ -66,11 +72,12 @@ public class PhysicalExamReportServiceImpl implements PhysicalExamReportService
|
|
|
|
|
|
/**
|
|
|
* 存储到我的附件
|
|
|
+ *
|
|
|
* @param report
|
|
|
*/
|
|
|
private void createFile(PhysicalExamReport report) {
|
|
|
Long userId = report.getUserId();
|
|
|
- if (userId == null){
|
|
|
+ if (userId == null) {
|
|
|
return;
|
|
|
}
|
|
|
//更新文件夹
|
|
@@ -79,7 +86,7 @@ public class PhysicalExamReportServiceImpl implements PhysicalExamReportService
|
|
|
String fileName = "体检报告";
|
|
|
//查看文件夹是否存在
|
|
|
FsAttachment folder = attachmentService.selectFsAttachmentByFolderName(folderName);
|
|
|
- if (folder == null){
|
|
|
+ if (folder == null) {
|
|
|
//新建文件
|
|
|
folder = new FsAttachment();
|
|
|
folder.setParentId(0L);
|
|
@@ -119,20 +126,170 @@ public class PhysicalExamReportServiceImpl implements PhysicalExamReportService
|
|
|
public List<PhysicalExamReport> selectPageList(PhysicalExamReportQueryDto queryDto) {
|
|
|
List<PhysicalExamReport> physicalExamReports = physicalExamReportMapper.selectPageList(queryDto);
|
|
|
for (PhysicalExamReport physicalExamReport : physicalExamReports) {
|
|
|
- if(ObjectUtils.isNotNull(physicalExamReport.getUserId())) {
|
|
|
+ if (ObjectUtils.isNotNull(physicalExamReport.getUserId())) {
|
|
|
String userNameById = fsUserCacheService.selectUserNameById(physicalExamReport.getUserId());
|
|
|
- if(StringUtils.isNotBlank(userNameById)) {
|
|
|
+ if (StringUtils.isNotBlank(userNameById)) {
|
|
|
physicalExamReport.setUserName(userNameById);
|
|
|
}
|
|
|
}
|
|
|
- if(ObjectUtils.isNotNull(physicalExamReport.getCompanyUserId())) {
|
|
|
+ if (ObjectUtils.isNotNull(physicalExamReport.getCompanyUserId())) {
|
|
|
String userNameById = companyUserCacheService.selectCompanyUserNameUserById(physicalExamReport.getCompanyUserId());
|
|
|
- if(StringUtils.isNotBlank(userNameById)) {
|
|
|
+ if (StringUtils.isNotBlank(userNameById)) {
|
|
|
physicalExamReport.setCompanyUserName(userNameById);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
return physicalExamReports;
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> compareReport(PhysicalExamReportCompareDto reportCompareDto) {
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
+
|
|
|
+ // 检查参数
|
|
|
+ if (reportCompareDto == null || reportCompareDto.getReport1() == null || reportCompareDto.getReport2() == null) {
|
|
|
+ result.put("success", false);
|
|
|
+ result.put("message", "参数不能为空");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取两份报告
|
|
|
+ PhysicalExamReport report1 = physicalExamReportMapper.getById(reportCompareDto.getReport1());
|
|
|
+ PhysicalExamReport report2 = physicalExamReportMapper.getById(reportCompareDto.getReport2());
|
|
|
+
|
|
|
+ if (report1 == null || report2 == null) {
|
|
|
+ result.put("success", false);
|
|
|
+ result.put("message", "报告不存在");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置基本信息
|
|
|
+ result.put("report1", report1);
|
|
|
+ result.put("report2", report2);
|
|
|
+ result.put("success", true);
|
|
|
+
|
|
|
+ // 根据类型进行对比
|
|
|
+ Integer type = reportCompareDto.getType();
|
|
|
+ if (type != null && type == 0) {
|
|
|
+ // 身体信息对比
|
|
|
+ Map<String, Object> bodyInfoComparison = compareBodyInfo(report1, report2);
|
|
|
+ result.put("comparison", bodyInfoComparison);
|
|
|
+ } else if (type != null && type == 1) {
|
|
|
+ // 指标检查对比
|
|
|
+ List<Map<String, Object>> indicatorComparison = compareIndicators(reportCompareDto.getReport1(), reportCompareDto.getReport2());
|
|
|
+ result.put("comparison", indicatorComparison);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 对比两份报告的身体信息
|
|
|
+ *
|
|
|
+ * @param report1 第一份报告
|
|
|
+ * @param report2 第二份报告
|
|
|
+ * @return 对比结果
|
|
|
+ */
|
|
|
+ private Map<String, Object> compareBodyInfo(PhysicalExamReport report1, PhysicalExamReport report2) {
|
|
|
+ Map<String, Object> comparison = new HashMap<>();
|
|
|
+
|
|
|
+ // 计算身高差异
|
|
|
+ if (report1.getHeight() != null && report2.getHeight() != null) {
|
|
|
+ BigDecimal heightDiff = report2.getHeight().subtract(report1.getHeight());
|
|
|
+ comparison.put("heightDiff", heightDiff);
|
|
|
+ comparison.put("heightChange", heightDiff.compareTo(BigDecimal.ZERO) > 0 ? "1" : "0");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算体重差异
|
|
|
+ if (report1.getWeight() != null && report2.getWeight() != null) {
|
|
|
+ BigDecimal weightDiff = report2.getWeight().subtract(report1.getWeight());
|
|
|
+ comparison.put("weightDiff", weightDiff);
|
|
|
+ comparison.put("weightChange", weightDiff.compareTo(BigDecimal.ZERO) > 0 ? "1" : "0");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算BMI差异
|
|
|
+ if (report1.getBmi() != null && report2.getBmi() != null) {
|
|
|
+ BigDecimal bmiDiff = report2.getBmi().subtract(report1.getBmi());
|
|
|
+ comparison.put("bmiDiff", bmiDiff);
|
|
|
+ comparison.put("bmiChange", bmiDiff.compareTo(BigDecimal.ZERO) > 0 ? "1" : "0");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算腰围差异
|
|
|
+ if (report1.getWaistCircumference() != null && report2.getWaistCircumference() != null) {
|
|
|
+ BigDecimal waistDiff = report2.getWaistCircumference().subtract(report1.getWaistCircumference());
|
|
|
+ comparison.put("waistDiff", waistDiff);
|
|
|
+ comparison.put("waistChange", waistDiff.compareTo(BigDecimal.ZERO) > 0 ? "1" : "0");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算胸围差异
|
|
|
+ if (report1.getChestCircumference() != null && report2.getChestCircumference() != null) {
|
|
|
+ BigDecimal chestDiff = report2.getChestCircumference().subtract(report1.getChestCircumference());
|
|
|
+ comparison.put("chestDiff", chestDiff);
|
|
|
+ comparison.put("chestChange", chestDiff.compareTo(BigDecimal.ZERO) > 0 ? "1" : "0");
|
|
|
+ }
|
|
|
+
|
|
|
+ return comparison;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 对比两份报告的指标检查结果
|
|
|
+ *
|
|
|
+ * @param reportId1 第一份报告 ID
|
|
|
+ * @param reportId2 第二份报告 ID
|
|
|
+ * @return 对比结果列表
|
|
|
+ */
|
|
|
+ private List<Map<String, Object>> compareIndicators(Long reportId1, Long reportId2) {
|
|
|
+ List<Map<String, Object>> results = new ArrayList<>();
|
|
|
+
|
|
|
+ // 获取两份报告的所有指标结果
|
|
|
+ List<ReportIndicatorResult> indicators1 = reportIndicatorResultService.listByReportId(reportId1);
|
|
|
+ List<ReportIndicatorResult> indicators2 = reportIndicatorResultService.listByReportId(reportId2);
|
|
|
+
|
|
|
+ // 将第二份报告的指标按 indicatorId 进行索引,方便快速查找
|
|
|
+ Map<Long, ReportIndicatorResult> indicatorMap2 = new HashMap<>();
|
|
|
+ for (ReportIndicatorResult indicator : indicators2) {
|
|
|
+ if (indicator.getIndicatorId() != null) {
|
|
|
+ indicatorMap2.put(indicator.getIndicatorId(), indicator);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理每个指标的对比
|
|
|
+ for (ReportIndicatorResult indicator1 : indicators1) {
|
|
|
+ if (indicator1.getIndicatorId() == null) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查找第二份报告中对应的指标结果
|
|
|
+ ReportIndicatorResult indicator2 = indicatorMap2.get(indicator1.getIndicatorId());
|
|
|
+
|
|
|
+ // 如果两份报告都有该指标,进行对比
|
|
|
+ if (indicator2 != null) {
|
|
|
+ Map<String, Object> comparison = new HashMap<>();
|
|
|
+
|
|
|
+ // 指标名称和基本信息
|
|
|
+ comparison.put("indicatorId", indicator1.getIndicatorId());
|
|
|
+ comparison.put("indicatorName", indicator1.getIndicatorName());
|
|
|
+ comparison.put("unitName", indicator1.getUnitName());
|
|
|
+ comparison.put("refRange", indicator1.getRefRange());
|
|
|
+
|
|
|
+ // 数值比较
|
|
|
+ comparison.put("value1", indicator1.getTestValue());
|
|
|
+ comparison.put("value2", indicator2.getTestValue());
|
|
|
+
|
|
|
+ // 判断变化方向
|
|
|
+ String change = "0"; // 默认为"减少"
|
|
|
+ if (indicator1.getTestValue() != null && indicator2.getTestValue() != null) {
|
|
|
+ int compareResult = indicator2.getTestValue().compareTo(indicator1.getTestValue());
|
|
|
+ if (compareResult > 0) {
|
|
|
+ change = "1"; // 增加
|
|
|
+ }
|
|
|
+ }
|
|
|
+ comparison.put("change", change);
|
|
|
+
|
|
|
+ results.add(comparison);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return results;
|
|
|
+ }
|
|
|
+}
|