Quellcode durchsuchen

feat(user): 新增家属查询绑定家人健康动态功能

- 在UserActivityLogController中新增queryBoundFamiliesActivities接口
- 支持家属按权限查询绑定家人的健康相关动态
- 在UserActivityLogService中定义queryBoundFamiliesActivitiesForFamily方法
- 在UserActivityLogServiceImpl中实现家属动态查询逻辑
- 添加家属角色权限校验与绑定家人ID获取
- 过滤并限定可查询的活动类型范围
- 支持分页查询及活动类型筛选
- 使用JsonUtils反序列化活动元数据字段
mcbaiyun vor 1 Monat
Ursprung
Commit
6f781b9478

+ 30 - 0
src/main/java/work/baiyun/chronicdiseaseapp/controller/UserActivityLogController.java

@@ -109,4 +109,34 @@ public class UserActivityLogController {
             return R.fail(ErrorCode.SYSTEM_ERROR.getCode(), ErrorCode.SYSTEM_ERROR.getMessage());
             return R.fail(ErrorCode.SYSTEM_ERROR.getCode(), ErrorCode.SYSTEM_ERROR.getMessage());
         }
         }
     }
     }
+
+    @Operation(summary = "家属查询绑定家人动态", description = "家属查询绑定家人的健康相关动态")
+    @ApiResponses(value = {
+        @ApiResponse(responseCode = "200", description = "成功查询绑定家人动态",
+            content = @Content(mediaType = "application/json",
+                schema = @Schema(implementation = work.baiyun.chronicdiseaseapp.model.vo.UserActivityPageResponse.class))),
+        @ApiResponse(responseCode = "403", description = "无权限访问",
+            content = @Content(mediaType = "application/json",
+                schema = @Schema(implementation = Void.class)))
+    })
+    @PostMapping(path = "/query-bound-families-activities", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<?> queryBoundFamiliesActivities(@RequestBody(required = false) PatientActivityQueryRequest req) {
+        try {
+            // 如果请求体为空,创建默认请求对象
+            if (req == null) {
+                req = new PatientActivityQueryRequest();
+            }
+            Page<UserActivityResponse> page = userActivityLogService.queryBoundFamiliesActivitiesForFamily(req);
+            work.baiyun.chronicdiseaseapp.model.vo.UserActivityPageResponse vo = new work.baiyun.chronicdiseaseapp.model.vo.UserActivityPageResponse();
+            vo.setRecords(page.getRecords());
+            vo.setTotal(page.getTotal());
+            vo.setSize(page.getSize());
+            vo.setCurrent(page.getCurrent());
+            vo.setPages(page.getPages());
+            return R.success(200, "ok", vo);
+        } catch (Exception e) {
+            logger.error("query bound families activities failed", e);
+            return R.fail(ErrorCode.SYSTEM_ERROR.getCode(), ErrorCode.SYSTEM_ERROR.getMessage());
+        }
+    }
 }
 }

+ 5 - 0
src/main/java/work/baiyun/chronicdiseaseapp/service/UserActivityLogService.java

@@ -31,4 +31,9 @@ public interface UserActivityLogService {
      * 医生查询所有绑定患者的动态
      * 医生查询所有绑定患者的动态
      */
      */
     Page<UserActivityResponse> queryBoundPatientsActivitiesForDoctor(PatientActivityQueryRequest request);
     Page<UserActivityResponse> queryBoundPatientsActivitiesForDoctor(PatientActivityQueryRequest request);
+
+    /**
+     * 家属查询所有绑定家人的动态
+     */
+    Page<UserActivityResponse> queryBoundFamiliesActivitiesForFamily(PatientActivityQueryRequest request);
 }
 }

+ 69 - 0
src/main/java/work/baiyun/chronicdiseaseapp/service/impl/UserActivityLogServiceImpl.java

@@ -223,4 +223,73 @@ public class UserActivityLogServiceImpl implements UserActivityLogService {
         resultPage.setTotal(page.getTotal());
         resultPage.setTotal(page.getTotal());
         return resultPage;
         return resultPage;
     }
     }
+
+    @Override
+    public Page<UserActivityResponse> queryBoundFamiliesActivitiesForFamily(PatientActivityQueryRequest request) {
+        Long currentUserId = SecurityUtils.getCurrentUserId();
+        PermissionGroup role = SecurityUtils.getCurrentUserRole();
+
+        // 权限校验:仅家属
+        if (!PermissionGroup.PATIENT_FAMILY.equals(role)) {
+            throw new RuntimeException("无权限");
+        }
+
+        // 获取家属绑定的所有家人ID
+        List<Long> boundFamilyIds = userBindingService.getBoundPatientIds(currentUserId);
+        if (boundFamilyIds.isEmpty()) {
+            // 如果没有绑定家人,返回空结果
+            return new Page<>(request.getPageNum(), request.getPageSize());
+        }
+
+        // 过滤特定活动类型(家人健康数据、健康档案、复诊)
+        List<ActivityType> allowedTypes = List.of(
+            ActivityType.BLOOD_GLUCOSE_UPLOAD, ActivityType.BLOOD_GLUCOSE_UPDATE,
+            ActivityType.BLOOD_GLUCOSE_DELETE, ActivityType.BLOOD_PRESSURE_UPLOAD,
+            ActivityType.HEART_RATE_UPLOAD, ActivityType.PHYSICAL_DATA_UPLOAD,
+            ActivityType.HEALTH_RECORD_CREATE, ActivityType.HEALTH_RECORD_UPDATE,
+            ActivityType.FOLLOW_UP_CREATE, ActivityType.FOLLOW_UP_UPDATE,
+            ActivityType.FOLLOW_UP_CONFIRM
+        );
+
+        // 如果前端指定了活动类型,则在允许的类型中进一步过滤
+        List<ActivityType> queryTypes = allowedTypes;
+        if (request.getActivityTypes() != null && !request.getActivityTypes().isEmpty()) {
+            queryTypes = request.getActivityTypes().stream()
+                .filter(allowedTypes::contains)
+                .collect(Collectors.toList());
+            // 如果过滤后没有匹配的类型,返回空结果
+            if (queryTypes.isEmpty()) {
+                return new Page<>(request.getPageNum(), request.getPageSize());
+            }
+        }
+
+        QueryWrapper<UserActivityLog> wrapper = new QueryWrapper<>();
+        wrapper.in("user_id", boundFamilyIds)
+               .in("activity_type", queryTypes)
+               .orderByDesc("create_time");
+
+        Page<UserActivityLog> page = userActivityLogMapper.selectPage(
+            new Page<>(request.getPageNum(), request.getPageSize()), wrapper);
+
+        // 转换为响应VO,使用 JsonUtils 反序列化 metadata
+        List<UserActivityResponse> responses = page.getRecords().stream().map(log -> {
+            UserActivityResponse resp = new UserActivityResponse();
+            resp.setId(String.valueOf(log.getId()));
+            resp.setUserId(log.getUserId());
+            resp.setActivityType(log.getActivityType());
+            resp.setActivityDescription(log.getActivityDescription());
+            resp.setRelatedEntityType(log.getRelatedEntityType());
+            resp.setRelatedEntityId(log.getRelatedEntityId());
+            // 使用 JsonUtils 反序列化 metadata
+            resp.setMetadata(JsonUtils.fromJson(log.getMetadata(), Object.class));
+            resp.setCreateTime(log.getCreateTime());
+            return resp;
+        }).collect(Collectors.toList());
+
+        Page<UserActivityResponse> resultPage = new Page<>();
+        resultPage.setRecords(responses);
+        resultPage.setTotal(page.getTotal());
+        return resultPage;
+    }
+
 }
 }