|  | @@ -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;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |