|
|
@@ -196,14 +196,64 @@ public class HealthReportService {
|
|
|
|
|
|
/**
|
|
|
* 获取全家所有健康报告(用于方案页选择已有报告)
|
|
|
+ * 优先通过家庭所有成员(subject_id/user_id)反查报告,兼容报告表 family_id 未填充的历史数据;
|
|
|
+ * 同时补充按报告表 family_id 匹配的报告,合并去重。
|
|
|
*/
|
|
|
public List<HealthReport> getFamilyReports(Long familyId) {
|
|
|
- return healthReportMapper.selectList(
|
|
|
+ if (familyId == null) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ // 1. 查家庭所有成员 id(family_members.id + user_id)
|
|
|
+ Set<Long> memberIds = new HashSet<>();
|
|
|
+ try {
|
|
|
+ List<FamilyMember> members = familyMemberMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<FamilyMember>().eq(FamilyMember::getFamilyId, familyId));
|
|
|
+ for (FamilyMember m : members) {
|
|
|
+ memberIds.add(m.getId());
|
|
|
+ if (m.getUserId() != null) {
|
|
|
+ memberIds.add(m.getUserId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("查询家庭{}成员失败: {}", familyId, e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 按成员反查报告(subject_id/user_id 匹配)
|
|
|
+ List<HealthReport> reports = new ArrayList<>();
|
|
|
+ if (!memberIds.isEmpty()) {
|
|
|
+ reports = healthReportMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<HealthReport>()
|
|
|
+ .and(w -> w.in(HealthReport::getSubjectId, memberIds)
|
|
|
+ .or(w2 -> w2.isNull(HealthReport::getSubjectId)
|
|
|
+ .in(HealthReport::getUserId, memberIds)))
|
|
|
+ .eq(HealthReport::getStatus, "active")
|
|
|
+ .orderByDesc(HealthReport::getReportDate));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 补充按报告表 family_id 匹配的报告(去重)
|
|
|
+ List<HealthReport> byFamily = healthReportMapper.selectList(
|
|
|
new LambdaQueryWrapper<HealthReport>()
|
|
|
.eq(HealthReport::getFamilyId, familyId)
|
|
|
.eq(HealthReport::getStatus, "active")
|
|
|
- .orderByDesc(HealthReport::getReportDate)
|
|
|
- );
|
|
|
+ .orderByDesc(HealthReport::getReportDate));
|
|
|
+ Set<Long> seen = new HashSet<>();
|
|
|
+ for (HealthReport r : reports) {
|
|
|
+ seen.add(r.getId());
|
|
|
+ }
|
|
|
+ for (HealthReport r : byFamily) {
|
|
|
+ if (seen.add(r.getId())) {
|
|
|
+ reports.add(r);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 按报告日期倒序
|
|
|
+ reports.sort((a, b) -> {
|
|
|
+ java.util.Date da = a.getReportDate();
|
|
|
+ java.util.Date db = b.getReportDate();
|
|
|
+ if (da == null) return 1;
|
|
|
+ if (db == null) return -1;
|
|
|
+ return db.compareTo(da);
|
|
|
+ });
|
|
|
+ return reports;
|
|
|
}
|
|
|
|
|
|
/**
|