Browse Source

refactor(core): 移除复诊管理相关功能模块

- 删除了复诊控制器 FollowUpController 及其所有接口实现
- 移除了复诊相关的枚举类型 FollowUpStatus 和状态处理器
- 清理了与复诊有关的实体类、VO 类以及 MyBatis 映射器
- 从活动日志服务中移除了复诊相关活动类型的处理逻辑
- 更新了用户绑定服务中的错误码引用
- 精简了活动类型和关联实体类型的枚举定义,去除了复诊条目
- 调整了用户行为日志切面中的条件判断逻辑
mcbaiyun 4 weeks ago
parent
commit
c7db104c5e
17 changed files with 7 additions and 770 deletions
  1. 0 8
      src/main/java/work/baiyun/chronicdiseaseapp/aspect/UserActivityLogAspect.java
  2. 0 153
      src/main/java/work/baiyun/chronicdiseaseapp/controller/FollowUpController.java
  3. 0 9
      src/main/java/work/baiyun/chronicdiseaseapp/enums/ActivityType.java
  4. 0 6
      src/main/java/work/baiyun/chronicdiseaseapp/enums/ErrorCode.java
  5. 0 45
      src/main/java/work/baiyun/chronicdiseaseapp/enums/FollowUpStatus.java
  6. 0 1
      src/main/java/work/baiyun/chronicdiseaseapp/enums/RelatedEntityType.java
  7. 0 41
      src/main/java/work/baiyun/chronicdiseaseapp/handler/FollowUpStatusTypeHandler.java
  8. 0 9
      src/main/java/work/baiyun/chronicdiseaseapp/mapper/FollowUpMapper.java
  9. 0 44
      src/main/java/work/baiyun/chronicdiseaseapp/model/po/FollowUp.java
  10. 0 22
      src/main/java/work/baiyun/chronicdiseaseapp/model/vo/CreateFollowUpRequest.java
  11. 0 24
      src/main/java/work/baiyun/chronicdiseaseapp/model/vo/FollowUpPageResponse.java
  12. 0 43
      src/main/java/work/baiyun/chronicdiseaseapp/model/vo/FollowUpResponse.java
  13. 0 27
      src/main/java/work/baiyun/chronicdiseaseapp/model/vo/UpdateFollowUpRequest.java
  14. 0 34
      src/main/java/work/baiyun/chronicdiseaseapp/service/FollowUpService.java
  15. 0 291
      src/main/java/work/baiyun/chronicdiseaseapp/service/impl/FollowUpServiceImpl.java
  16. 6 12
      src/main/java/work/baiyun/chronicdiseaseapp/service/impl/UserActivityLogServiceImpl.java
  17. 1 1
      src/main/java/work/baiyun/chronicdiseaseapp/service/impl/UserBindingServiceImpl.java

+ 0 - 8
src/main/java/work/baiyun/chronicdiseaseapp/aspect/UserActivityLogAspect.java

@@ -153,12 +153,6 @@ public class UserActivityLogAspect {
             return ActivityType.MEDICATION_CREATE;
         } else if (combined.contains("medicine") && combined.contains("create")) {
             return ActivityType.MEDICINE_CREATE;
-        } else if (combined.contains("followup") && combined.contains("create")) {
-            return ActivityType.FOLLOW_UP_CREATE;
-        } else if (combined.contains("followup") && combined.contains("update")) {
-            return ActivityType.FOLLOW_UP_UPDATE;
-        } else if (combined.contains("followup") && combined.contains("confirm")) {
-            return ActivityType.FOLLOW_UP_CONFIRM;
         } else if (combined.contains("userbinding") && combined.contains("create")) {
             return ActivityType.USER_BINDING_CREATE;
         } else if (combined.contains("avatar") && combined.contains("upload")) {
@@ -188,8 +182,6 @@ public class UserActivityLogAspect {
             return RelatedEntityType.HEALTH_RECORD;
         } else if (className.toLowerCase().contains("medication")) {
             return RelatedEntityType.MEDICATION;
-        } else if (className.toLowerCase().contains("followup")) {
-            return RelatedEntityType.FOLLOW_UP;
         } else if (className.toLowerCase().contains("binding")) {
             return RelatedEntityType.USER_BINDING;
         } else if (className.toLowerCase().contains("avatar")) {

+ 0 - 153
src/main/java/work/baiyun/chronicdiseaseapp/controller/FollowUpController.java

@@ -1,153 +0,0 @@
-package work.baiyun.chronicdiseaseapp.controller;
-
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.responses.ApiResponse;
-import io.swagger.v3.oas.annotations.responses.ApiResponses;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.*;
-import work.baiyun.chronicdiseaseapp.common.R;
-import work.baiyun.chronicdiseaseapp.model.vo.BaseQueryRequest;
-import work.baiyun.chronicdiseaseapp.model.vo.FollowUpResponse;
-import work.baiyun.chronicdiseaseapp.model.vo.CreateFollowUpRequest;
-import work.baiyun.chronicdiseaseapp.model.vo.UpdateFollowUpRequest;
-import work.baiyun.chronicdiseaseapp.service.FollowUpService;
-import work.baiyun.chronicdiseaseapp.enums.ErrorCode;
-import work.baiyun.chronicdiseaseapp.exception.CustomException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@RestController
-@RequestMapping("/follow-up")
-@Tag(name = "复诊管理", description = "复诊预约与管理相关接口")
-public class FollowUpController {
-
-    private static final Logger logger = LoggerFactory.getLogger(FollowUpController.class);
-
-    @Autowired
-    private FollowUpService followUpService;
-
-    @Operation(summary = "创建复诊请求", description = "患者创建复诊预约请求")
-    @ApiResponses(value = {
-        @ApiResponse(responseCode = "200", description = "复诊请求创建成功",
-            content = @Content(mediaType = "application/json",
-                schema = @Schema(implementation = Void.class))),
-        @ApiResponse(responseCode = "400", description = "医生ID无效",
-            content = @Content(mediaType = "application/json",
-                schema = @Schema(implementation = Void.class))),
-        @ApiResponse(responseCode = "500", description = "服务器内部错误",
-            content = @Content(mediaType = "application/json",
-                schema = @Schema(implementation = Void.class)))
-    })
-    @PostMapping(path = "/create", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
-    public R<?> create(@RequestBody CreateFollowUpRequest req) {
-        try {
-            followUpService.createFollowUp(req);
-            return R.success(200, "复诊请求创建成功");
-        } catch (CustomException e) {
-            logger.error("create follow up request failed", e);
-            return R.fail(e.getCode(), e.getMessage());
-        } catch (Exception e) {
-            logger.error("create follow up request failed", e);
-            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 = Void.class))),
-        @ApiResponse(responseCode = "500", description = "服务器内部错误",
-            content = @Content(mediaType = "application/json",
-                schema = @Schema(implementation = Void.class)))
-    })
-    @PutMapping(path = "/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
-    public R<?> update(@PathVariable Long id, @RequestBody UpdateFollowUpRequest req) {
-        try {
-            // 将路径ID赋值到请求对象,保证一致性
-            req.setId(id);
-            followUpService.updateFollowUp(req);
-            return R.success(200, "复诊记录更新成功");
-        } catch (Exception e) {
-            logger.error("update follow up request failed", e);
-            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.FollowUpPageResponse.class))),
-        @ApiResponse(responseCode = "500", description = "服务器内部错误",
-            content = @Content(mediaType = "application/json",
-                schema = @Schema(implementation = Void.class)))
-    })
-    @PostMapping(path = "/list", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
-    public R<?> list(@RequestBody BaseQueryRequest req) {
-        try {
-            Page<FollowUpResponse> page = followUpService.listFollowUps(req);
-            work.baiyun.chronicdiseaseapp.model.vo.FollowUpPageResponse vo = new work.baiyun.chronicdiseaseapp.model.vo.FollowUpPageResponse();
-            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("list follow up records failed", e);
-            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.FollowUpPageResponse.class))),
-        @ApiResponse(responseCode = "403", description = "无权限访问",
-            content = @Content(mediaType = "application/json",
-                schema = @Schema(implementation = Void.class)))
-    })
-    @PostMapping(path = "/list-by-patient", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
-    public R<?> listByPatient(@RequestParam("patientUserId") Long patientUserId, @RequestBody BaseQueryRequest req) {
-        try {
-            Page<FollowUpResponse> page = followUpService.listFollowUpsByPatient(patientUserId, req);
-            work.baiyun.chronicdiseaseapp.model.vo.FollowUpPageResponse vo = new work.baiyun.chronicdiseaseapp.model.vo.FollowUpPageResponse();
-            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("list follow up records by patient failed", e);
-            return R.fail(ErrorCode.SYSTEM_ERROR.getCode(), ErrorCode.SYSTEM_ERROR.getMessage());
-        }
-    }
-
-    @Operation(summary = "删除复诊记录", description = "根据ID删除复诊记录")
-    @ApiResponses(value = {
-        @ApiResponse(responseCode = "200", description = "复诊记录删除成功",
-            content = @Content(mediaType = "application/json",
-                schema = @Schema(implementation = Void.class))),
-        @ApiResponse(responseCode = "500", description = "服务器内部错误",
-            content = @Content(mediaType = "application/json",
-                schema = @Schema(implementation = Void.class)))
-    })
-    @DeleteMapping(path = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
-    public R<?> delete(@PathVariable Long id) {
-        try {
-            followUpService.deleteFollowUp(id);
-            return R.success(200, "复诊记录删除成功");
-        } catch (Exception e) {
-            logger.error("delete follow up record failed", e);
-            return R.fail(ErrorCode.SYSTEM_ERROR.getCode(), ErrorCode.SYSTEM_ERROR.getMessage());
-        }
-    }
-}

+ 0 - 9
src/main/java/work/baiyun/chronicdiseaseapp/enums/ActivityType.java

@@ -26,15 +26,6 @@ public enum ActivityType {
     REMINDER_SAVE("REMINDER_SAVE", "提醒设置保存"),
     REMINDER_DELETE("REMINDER_DELETE", "提醒设置删除"),
 
-    // 复诊相关(患者)
-    FOLLOW_UP_CREATE("FOLLOW_UP_CREATE", "复诊请求创建"),
-    FOLLOW_UP_UPDATE("FOLLOW_UP_UPDATE", "复诊记录更新"),
-
-    // 医生复诊操作
-    FOLLOW_UP_CONFIRM("FOLLOW_UP_CONFIRM", "医生确认复诊"),
-    FOLLOW_UP_CANCEL("FOLLOW_UP_CANCEL", "医生取消复诊"),
-    FOLLOW_UP_COMPLETE("FOLLOW_UP_COMPLETE", "医生完成复诊"),
-
     // 用户绑定相关
     USER_BINDING_CREATE("USER_BINDING_CREATE", "用户绑定创建"),
     USER_BINDING_DELETE("USER_BINDING_DELETE", "用户绑定删除"),

+ 0 - 6
src/main/java/work/baiyun/chronicdiseaseapp/enums/ErrorCode.java

@@ -35,12 +35,6 @@ public enum ErrorCode {
     GEO_REQUEST_FAILED(5000, "地理位置请求失败"),
     GEO_SERVICE_UNAVAILABLE(5001, "地理位置服务不可用"),
     
-    // 复诊管理相关错误码 6000-6999
-    FOLLOW_UP_NOT_FOUND(6000, "复诊记录不存在"),
-    FOLLOW_UP_ACCESS_DENIED(6001, "无权访问复诊记录"),
-    FOLLOW_UP_STATUS_INVALID(6002, "复诊状态无效"),
-    INVALID_DOCTOR(6003, "医生ID无效"),
-    
     // 用药管理相关错误码 7000-7999
     MEDICATION_NOT_FOUND(7000, "用药记录不存在"),
     

+ 0 - 45
src/main/java/work/baiyun/chronicdiseaseapp/enums/FollowUpStatus.java

@@ -1,45 +0,0 @@
-package work.baiyun.chronicdiseaseapp.enums;
-
-import com.baomidou.mybatisplus.annotation.EnumValue;
-
-/**
- * 复诊状态枚举
- */
-public enum FollowUpStatus {
-    PENDING("PENDING", "待确认"),
-    CONFIRMED("CONFIRMED", "已确认"),
-    CANCELLED("CANCELLED", "已取消"),
-    COMPLETED("COMPLETED", "已完成");
-
-    @EnumValue
-    private final String code;
-    private final String description;
-
-    FollowUpStatus(String code, String description) {
-        this.code = code;
-        this.description = description;
-    }
-
-    public String getCode() { 
-        return code; 
-    }
-
-    public String getDescription() { 
-        return description; 
-    }
-
-    @Override
-    public String toString() { 
-        return description; 
-    }
-
-    public static FollowUpStatus fromCode(String code) {
-        if (code == null) return null;
-        for (FollowUpStatus status : FollowUpStatus.values()) {
-            if (status.code.equals(code)) return status;
-        }
-        throw new work.baiyun.chronicdiseaseapp.exception.CustomException(
-            work.baiyun.chronicdiseaseapp.enums.ErrorCode.PARAMETER_ERROR.getCode(),
-            "Unknown FollowUpStatus code: " + code);
-    }
-}

+ 0 - 1
src/main/java/work/baiyun/chronicdiseaseapp/enums/RelatedEntityType.java

@@ -13,7 +13,6 @@ public enum RelatedEntityType {
     HEALTH_RECORD("HEALTH_RECORD", "健康档案"),
     MEDICATION("MEDICATION", "用药记录"),
     REMINDER("REMINDER", "提醒设置"),
-    FOLLOW_UP("FOLLOW_UP", "复诊记录"),
     USER_BINDING("USER_BINDING", "用户绑定"),
     AVATAR("AVATAR", "头像"),
     MEDICINE("MEDICINE", "药品信息"),

+ 0 - 41
src/main/java/work/baiyun/chronicdiseaseapp/handler/FollowUpStatusTypeHandler.java

@@ -1,41 +0,0 @@
-package work.baiyun.chronicdiseaseapp.handler;
-
-import org.apache.ibatis.type.BaseTypeHandler;
-import org.apache.ibatis.type.JdbcType;
-import org.apache.ibatis.type.MappedJdbcTypes;
-import org.apache.ibatis.type.MappedTypes;
-import work.baiyun.chronicdiseaseapp.enums.FollowUpStatus;
-
-import java.sql.CallableStatement;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-@MappedJdbcTypes(JdbcType.VARCHAR)
-@MappedTypes(FollowUpStatus.class)
-public class FollowUpStatusTypeHandler extends BaseTypeHandler<FollowUpStatus> {
-
-    @Override
-    public void setNonNullParameter(PreparedStatement ps, int i, FollowUpStatus parameter, JdbcType jdbcType)
-            throws SQLException {
-        ps.setString(i, parameter.getCode());
-    }
-
-    @Override
-    public FollowUpStatus getNullableResult(ResultSet rs, String columnName) throws SQLException {
-        String code = rs.getString(columnName);
-        return code == null ? null : FollowUpStatus.fromCode(code);
-    }
-
-    @Override
-    public FollowUpStatus getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
-        String code = rs.getString(columnIndex);
-        return code == null ? null : FollowUpStatus.fromCode(code);
-    }
-
-    @Override
-    public FollowUpStatus getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
-        String code = cs.getString(columnIndex);
-        return code == null ? null : FollowUpStatus.fromCode(code);
-    }
-}

+ 0 - 9
src/main/java/work/baiyun/chronicdiseaseapp/mapper/FollowUpMapper.java

@@ -1,9 +0,0 @@
-package work.baiyun.chronicdiseaseapp.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import work.baiyun.chronicdiseaseapp.model.po.FollowUp;
-import org.apache.ibatis.annotations.Mapper;
-
-@Mapper
-public interface FollowUpMapper extends BaseMapper<FollowUp> {
-}

+ 0 - 44
src/main/java/work/baiyun/chronicdiseaseapp/model/po/FollowUp.java

@@ -1,44 +0,0 @@
-package work.baiyun.chronicdiseaseapp.model.po;
-
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import work.baiyun.chronicdiseaseapp.enums.FollowUpStatus;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "复诊记录表")
-@TableName("t_follow_up")
-@Data
-@EqualsAndHashCode(callSuper = false)
-public class FollowUp extends BaseEntity {
-    @Schema(description = "患者用户ID")
-    @TableField("patient_user_id")
-    private Long patientUserId;
-
-    @Schema(description = "医生用户ID")
-    @TableField("doctor_user_id")
-    private Long doctorUserId;
-
-    @Schema(description = "预约时间")
-    @TableField("appointment_time")
-    private LocalDateTime appointmentTime;
-
-    @Schema(description = "医生主动确认已完成的时间记录")
-    @TableField("actual_time")
-    private LocalDateTime actualTime;
-
-    @Schema(description = "复诊状态 (PENDING-待确认, CONFIRMED-已确认, CANCELLED-已取消, COMPLETED-已完成)")
-    @TableField(value = "status", typeHandler = work.baiyun.chronicdiseaseapp.handler.FollowUpStatusTypeHandler.class)
-    private FollowUpStatus status;
-
-    @Schema(description = "复诊原因")
-    @TableField("reason")
-    private String reason;
-
-    @Schema(description = "备注")
-    @TableField("notes")
-    private String notes;
-}

+ 0 - 22
src/main/java/work/baiyun/chronicdiseaseapp/model/vo/CreateFollowUpRequest.java

@@ -1,22 +0,0 @@
-package work.baiyun.chronicdiseaseapp.model.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import jakarta.validation.constraints.*;
-import java.time.LocalDateTime;
-
-@Schema(description = "创建复诊请求")
-@Data
-public class CreateFollowUpRequest {
-    @Schema(description = "医生用户ID", required = true)
-    @NotNull(message = "医生ID不能为空")
-    private Long doctorUserId;
-
-    @Schema(description = "预约时间", required = true)
-    @NotNull(message = "预约时间不能为空")
-    private LocalDateTime appointmentTime;
-
-    @Schema(description = "复诊原因")
-    private String reason;
-}

+ 0 - 24
src/main/java/work/baiyun/chronicdiseaseapp/model/vo/FollowUpPageResponse.java

@@ -1,24 +0,0 @@
-package work.baiyun.chronicdiseaseapp.model.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import java.util.List;
-
-@Schema(description = "复诊记录分页响应")
-@Data
-public class FollowUpPageResponse {
-    @Schema(description = "数据列表")
-    private List<FollowUpResponse> records;
-
-    @Schema(description = "总数")
-    private long total;
-
-    @Schema(description = "每页大小")
-    private long size;
-
-    @Schema(description = "当前页码")
-    private long current;
-
-    @Schema(description = "总页数")
-    private long pages;
-}

+ 0 - 43
src/main/java/work/baiyun/chronicdiseaseapp/model/vo/FollowUpResponse.java

@@ -1,43 +0,0 @@
-package work.baiyun.chronicdiseaseapp.model.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "复诊记录响应")
-@Data
-public class FollowUpResponse {
-    @Schema(description = "记录ID")
-    private String id;
-
-    @Schema(description = "患者用户ID")
-    private String patientUserId;
-
-    @Schema(description = "医生用户ID")
-    private String doctorUserId;
-
-    @Schema(description = "预约时间")
-    private LocalDateTime appointmentTime;
-
-    @Schema(description = "实际就诊时间")
-    private LocalDateTime actualTime;
-
-    @Schema(description = "复诊状态")
-    private String status;
-
-    @Schema(description = "复诊原因")
-    private String reason;
-
-    @Schema(description = "备注")
-    private String notes;
-
-    @Schema(description = "创建时间")
-    private LocalDateTime createTime;
-
-    @Schema(description = "患者昵称")
-    private String patientNickname;
-
-    @Schema(description = "医生昵称")
-    private String doctorNickname;
-}

+ 0 - 27
src/main/java/work/baiyun/chronicdiseaseapp/model/vo/UpdateFollowUpRequest.java

@@ -1,27 +0,0 @@
-package work.baiyun.chronicdiseaseapp.model.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import jakarta.validation.constraints.*;
-import java.time.LocalDateTime;
-
-@Schema(description = "更新复诊请求")
-@Data
-public class UpdateFollowUpRequest {
-    @Schema(description = "复诊记录ID", required = true)
-    @NotNull(message = "复诊记录ID不能为空")
-    private Long id;
-
-    @Schema(description = "预约时间")
-    private LocalDateTime appointmentTime;
-
-    @Schema(description = "复诊状态")
-    private String status;
-
-    @Schema(description = "备注")
-    private String notes;
-    
-    @Schema(description = "复诊原因")
-    private String reason;
-}

+ 0 - 34
src/main/java/work/baiyun/chronicdiseaseapp/service/FollowUpService.java

@@ -1,34 +0,0 @@
-package work.baiyun.chronicdiseaseapp.service;
-
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import work.baiyun.chronicdiseaseapp.model.vo.BaseQueryRequest;
-import work.baiyun.chronicdiseaseapp.model.vo.FollowUpResponse;
-import work.baiyun.chronicdiseaseapp.model.vo.CreateFollowUpRequest;
-import work.baiyun.chronicdiseaseapp.model.vo.UpdateFollowUpRequest;
-
-public interface FollowUpService {
-    /**
-     * 患者创建复诊请求
-     */
-    void createFollowUp(CreateFollowUpRequest request);
-
-    /**
-     * 更新复诊记录(医生确认、取消或患者修改)
-     */
-    void updateFollowUp(UpdateFollowUpRequest request);
-
-    /**
-     * 分页查询当前用户的复诊记录
-     */
-    Page<FollowUpResponse> listFollowUps(BaseQueryRequest request);
-
-    /**
-     * 医生分页查询患者的复诊记录
-     */
-    Page<FollowUpResponse> listFollowUpsByPatient(Long patientUserId, BaseQueryRequest request);
-
-    /**
-     * 删除复诊记录
-     */
-    void deleteFollowUp(Long id);
-}

+ 0 - 291
src/main/java/work/baiyun/chronicdiseaseapp/service/impl/FollowUpServiceImpl.java

@@ -1,291 +0,0 @@
-package work.baiyun.chronicdiseaseapp.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import work.baiyun.chronicdiseaseapp.mapper.FollowUpMapper;
-import work.baiyun.chronicdiseaseapp.mapper.UserInfoMapper;
-import work.baiyun.chronicdiseaseapp.model.po.FollowUp;
-import work.baiyun.chronicdiseaseapp.model.po.UserInfo;
-import work.baiyun.chronicdiseaseapp.model.vo.BaseQueryRequest;
-import work.baiyun.chronicdiseaseapp.model.vo.FollowUpResponse;
-import work.baiyun.chronicdiseaseapp.model.vo.CreateFollowUpRequest;
-import work.baiyun.chronicdiseaseapp.model.vo.UpdateFollowUpRequest;
-import work.baiyun.chronicdiseaseapp.service.FollowUpService;
-import work.baiyun.chronicdiseaseapp.util.SecurityUtils;
-import work.baiyun.chronicdiseaseapp.enums.PermissionGroup;
-import work.baiyun.chronicdiseaseapp.exception.CustomException;
-import work.baiyun.chronicdiseaseapp.enums.ErrorCode;
-import work.baiyun.chronicdiseaseapp.enums.FollowUpStatus;
-
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-@Service
-public class FollowUpServiceImpl implements FollowUpService {
-
-    @Autowired
-    private FollowUpMapper followUpMapper;
-
-    @Autowired
-    private UserInfoMapper userInfoMapper;
-
-    @Override
-    public void createFollowUp(CreateFollowUpRequest request) {
-        Long userId = SecurityUtils.getCurrentUserId();
-        
-        // 验证医生ID是否有效
-        UserInfo doctor = userInfoMapper.selectById(request.getDoctorUserId());
-        if (doctor == null || doctor.getRole() != PermissionGroup.DOCTOR) {
-            throw new CustomException(ErrorCode.INVALID_DOCTOR.getCode(), ErrorCode.INVALID_DOCTOR.getMessage());
-        }
-        
-        FollowUp followUp = new FollowUp();
-        BeanUtils.copyProperties(request, followUp);
-        followUp.setPatientUserId(userId);
-        followUp.setStatus(FollowUpStatus.PENDING); // 默认状态为待确认
-        followUpMapper.insert(followUp);
-    }
-
-    @Override
-    public void updateFollowUp(UpdateFollowUpRequest request) {
-        Long userId = SecurityUtils.getCurrentUserId();
-        FollowUp followUp = followUpMapper.selectById(request.getId());
-        
-        if (followUp == null) {
-            throw new CustomException(
-                ErrorCode.FOLLOW_UP_NOT_FOUND.getCode(),
-                "复诊记录不存在");
-        }
-        
-        // 权限检查:患者只能修改自己的记录,医生只能修改分配给自己的记录
-        PermissionGroup role = SecurityUtils.getCurrentUserRole();
-        if (role == PermissionGroup.PATIENT && 
-            !followUp.getPatientUserId().equals(userId)) {
-            throw new CustomException(
-                ErrorCode.FOLLOW_UP_ACCESS_DENIED.getCode(),
-                "无权操作该复诊记录");
-        }
-        
-        if ((role == PermissionGroup.DOCTOR || 
-             role == PermissionGroup.SYS_ADMIN) && 
-            !followUp.getDoctorUserId().equals(userId)) {
-            throw new CustomException(
-                ErrorCode.FOLLOW_UP_ACCESS_DENIED.getCode(),
-                "无权操作该复诊记录");
-        }
-        
-        // 如果患者修改了已确认的复诊申请的关键字段,重置状态为待确认
-        boolean isModifiedByPatient = role == PermissionGroup.PATIENT;
-        boolean isConfirmed = FollowUpStatus.CONFIRMED.equals(followUp.getStatus());
-        boolean hasModifiedAppointmentTime = request.getAppointmentTime() != null && 
-            !request.getAppointmentTime().equals(followUp.getAppointmentTime());
-        boolean hasModifiedReason = request.getReason() != null && 
-            !request.getReason().equals(followUp.getReason());
-        if (isModifiedByPatient && isConfirmed && (hasModifiedAppointmentTime || hasModifiedReason)) {
-            followUp.setStatus(FollowUpStatus.PENDING);
-        }
-        
-        // 更新字段
-        if (request.getAppointmentTime() != null) {
-            followUp.setAppointmentTime(request.getAppointmentTime());
-        }
-        if (request.getStatus() != null) {
-            followUp.setStatus(FollowUpStatus.fromCode(request.getStatus()));
-        }
-        if (request.getNotes() != null) {
-            followUp.setNotes(request.getNotes());
-        }
-        if (request.getReason() != null) {
-            followUp.setReason(request.getReason());
-        }
-        
-        // 如果状态更新为已完成,则设置实际就诊时间
-        if (FollowUpStatus.COMPLETED.equals(followUp.getStatus())) {
-            followUp.setActualTime(LocalDateTime.now());
-        }
-        
-        followUpMapper.updateById(followUp);
-    }
-
-    @Override
-    public Page<FollowUpResponse> listFollowUps(BaseQueryRequest request) {
-        Long userId = SecurityUtils.getCurrentUserId();
-        PermissionGroup role = SecurityUtils.getCurrentUserRole();
-        
-        Page<FollowUp> page = new Page<>(request.getPageNum(), request.getPageSize());
-        LambdaQueryWrapper<FollowUp> wrapper = new LambdaQueryWrapper<>();
-        
-        // 根据用户角色查询不同的数据
-        if (role == PermissionGroup.PATIENT) {
-            wrapper.eq(FollowUp::getPatientUserId, userId);
-        } else if (role == PermissionGroup.DOCTOR || 
-                   role == PermissionGroup.SYS_ADMIN) {
-            wrapper.eq(FollowUp::getDoctorUserId, userId);
-        }
-        
-        wrapper.ge(request.getStartTime() != null, FollowUp::getCreateTime, request.getStartTime())
-               .le(request.getEndTime() != null, FollowUp::getCreateTime, request.getEndTime())
-               .orderByDesc(FollowUp::getCreateTime);
-
-        Page<FollowUp> result = followUpMapper.selectPage(page, wrapper);
-
-        // 批量查询用户信息
-        Set<Long> userIds = result.getRecords().stream()
-            .flatMap(r -> java.util.stream.Stream.of(r.getPatientUserId(), r.getDoctorUserId()))
-            .filter(id -> id != null)
-            .collect(Collectors.toSet());
-
-        Map<Long, UserInfo> userInfoMap;
-        if (userIds.isEmpty()) {
-            userInfoMap = java.util.Collections.emptyMap();
-        } else {
-            List<UserInfo> userInfos = userInfoMapper.selectBatchIds(userIds);
-            userInfoMap = userInfos.stream().collect(Collectors.toMap(UserInfo::getId, u -> u));
-        }
-
-        List<FollowUpResponse> responses = result.getRecords().stream().map(r -> {
-            FollowUpResponse resp = new FollowUpResponse();
-            BeanUtils.copyProperties(r, resp);
-            resp.setId(r.getId().toString());
-            
-            // 设置用户ID为字符串类型,避免前端精度丢失
-            if (r.getPatientUserId() != null) {
-                resp.setPatientUserId(r.getPatientUserId().toString());
-            }
-            
-            if (r.getDoctorUserId() != null) {
-                resp.setDoctorUserId(r.getDoctorUserId().toString());
-            }
-            
-            // 设置昵称
-            UserInfo patient = userInfoMap.get(r.getPatientUserId());
-            if (patient != null) {
-                resp.setPatientNickname(patient.getNickname());
-            }
-            
-            UserInfo doctor = userInfoMap.get(r.getDoctorUserId());
-            if (doctor != null) {
-                resp.setDoctorNickname(doctor.getNickname());
-            }
-            
-            // 设置状态码
-            if (r.getStatus() != null) {
-                resp.setStatus(r.getStatus().getCode());
-            }
-            return resp;
-        }).collect(Collectors.toList());
-
-        Page<FollowUpResponse> responsePage = new Page<>();
-        responsePage.setRecords(responses);
-        responsePage.setCurrent(result.getCurrent());
-        responsePage.setSize(result.getSize());
-        responsePage.setTotal(result.getTotal());
-        responsePage.setPages(result.getPages());
-        return responsePage;
-    }
-
-    @Override
-    public Page<FollowUpResponse> listFollowUpsByPatient(Long patientUserId, BaseQueryRequest request) {
-        // 检查绑定关系
-        Long userId = SecurityUtils.getCurrentUserId();
-        PermissionGroup role = SecurityUtils.getCurrentUserRole();
-        
-        // 只有医生和管理员可以查询其他患者的复诊记录
-        if (role != PermissionGroup.DOCTOR && 
-            role != PermissionGroup.SYS_ADMIN) {
-            throw new CustomException(
-                ErrorCode.FOLLOW_UP_ACCESS_DENIED.getCode(),
-                "无权查询其他患者的复诊记录");
-        }
-        
-        Page<FollowUp> page = new Page<>(request.getPageNum(), request.getPageSize());
-        LambdaQueryWrapper<FollowUp> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(FollowUp::getPatientUserId, patientUserId)
-               .ge(request.getStartTime() != null, FollowUp::getCreateTime, request.getStartTime())
-               .le(request.getEndTime() != null, FollowUp::getCreateTime, request.getEndTime())
-               .orderByDesc(FollowUp::getCreateTime);
-
-        Page<FollowUp> result = followUpMapper.selectPage(page, wrapper);
-
-        // 批量查询用户信息
-        Set<Long> userIds = result.getRecords().stream()
-            .flatMap(r -> java.util.stream.Stream.of(r.getPatientUserId(), r.getDoctorUserId()))
-            .filter(id -> id != null)
-            .collect(Collectors.toSet());
-
-        Map<Long, UserInfo> userInfoMap;
-        if (userIds.isEmpty()) {
-            userInfoMap = java.util.Collections.emptyMap();
-        } else {
-            List<UserInfo> userInfos = userInfoMapper.selectBatchIds(userIds);
-            userInfoMap = userInfos.stream().collect(Collectors.toMap(UserInfo::getId, u -> u));
-        }
-
-        List<FollowUpResponse> responses = result.getRecords().stream().map(r -> {
-            FollowUpResponse resp = new FollowUpResponse();
-            BeanUtils.copyProperties(r, resp);
-            resp.setId(r.getId().toString());
-            
-            // 设置用户ID为字符串类型,避免前端精度丢失
-            if (r.getPatientUserId() != null) {
-                resp.setPatientUserId(r.getPatientUserId().toString());
-            }
-            
-            if (r.getDoctorUserId() != null) {
-                resp.setDoctorUserId(r.getDoctorUserId().toString());
-            }
-            
-            // 设置昵称
-            UserInfo patient = userInfoMap.get(r.getPatientUserId());
-            if (patient != null) {
-                resp.setPatientNickname(patient.getNickname());
-            }
-            
-            UserInfo doctor = userInfoMap.get(r.getDoctorUserId());
-            if (doctor != null) {
-                resp.setDoctorNickname(doctor.getNickname());
-            }
-            
-            // 设置状态码
-            if (r.getStatus() != null) {
-                resp.setStatus(r.getStatus().getCode());
-            }
-            return resp;
-        }).collect(Collectors.toList());
-
-        Page<FollowUpResponse> responsePage = new Page<>();
-        responsePage.setRecords(responses);
-        responsePage.setCurrent(result.getCurrent());
-        responsePage.setSize(result.getSize());
-        responsePage.setTotal(result.getTotal());
-        responsePage.setPages(result.getPages());
-        return responsePage;
-    }
-
-    @Override
-    public void deleteFollowUp(Long id) {
-        Long userId = SecurityUtils.getCurrentUserId();
-        FollowUp followUp = followUpMapper.selectById(id);
-        
-        if (followUp == null) {
-            throw new CustomException(
-                ErrorCode.FOLLOW_UP_NOT_FOUND.getCode(),
-                "复诊记录不存在");
-        }
-        
-        // 只有患者本人才能删除自己的复诊记录
-        if (!followUp.getPatientUserId().equals(userId)) {
-            throw new CustomException(
-                ErrorCode.FOLLOW_UP_ACCESS_DENIED.getCode(),
-                "无权删除该复诊记录");
-        }
-        
-        followUpMapper.deleteById(id);
-    }
-}

+ 6 - 12
src/main/java/work/baiyun/chronicdiseaseapp/service/impl/UserActivityLogServiceImpl.java

@@ -67,14 +67,12 @@ public class UserActivityLogServiceImpl implements UserActivityLogService {
             throw new RuntimeException("未绑定该患者");
         }
 
-        // 过滤特定活动类型(患者健康数据、健康档案、复诊
+        // 过滤特定活动类型(患者健康数据、健康档案)
         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
+            ActivityType.HEALTH_RECORD_CREATE, ActivityType.HEALTH_RECORD_UPDATE
         );
 
         // 如果前端指定了活动类型,则在允许的类型中进一步过滤
@@ -173,14 +171,12 @@ public class UserActivityLogServiceImpl implements UserActivityLogService {
             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
+            ActivityType.HEALTH_RECORD_CREATE, ActivityType.HEALTH_RECORD_UPDATE
         );
 
         // 如果前端指定了活动类型,则在允许的类型中进一步过滤
@@ -241,14 +237,12 @@ public class UserActivityLogServiceImpl implements UserActivityLogService {
             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
+            ActivityType.HEALTH_RECORD_CREATE, ActivityType.HEALTH_RECORD_UPDATE
         );
 
         // 如果前端指定了活动类型,则在允许的类型中进一步过滤

+ 1 - 1
src/main/java/work/baiyun/chronicdiseaseapp/service/impl/UserBindingServiceImpl.java

@@ -66,7 +66,7 @@ public class UserBindingServiceImpl implements UserBindingService {
 
         if (type == UserBindingType.DOCTOR) {
             if (bound.getRole() != PermissionGroup.DOCTOR) {
-                throw new CustomException(work.baiyun.chronicdiseaseapp.enums.ErrorCode.INVALID_DOCTOR.getCode(), "被绑定用户不是医生");
+                throw new CustomException(work.baiyun.chronicdiseaseapp.enums.ErrorCode.PARAMETER_ERROR.getCode(), "被绑定用户不是医生");
             }
         } else if (type == UserBindingType.FAMILY) {
             if (bound.getRole() != PermissionGroup.PATIENT_FAMILY) {