Browse Source

user app 添加健康档案 数据检测功能

xgb 4 days ago
parent
commit
9c5ec1b0ba

+ 2 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserHealthDataController.java

@@ -9,6 +9,7 @@ import com.fs.his.config.HealthIndicatorConfig;
 import com.fs.his.domain.FsUserHealthData;
 import com.fs.his.service.IFsUserHealthDataService;
 import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -25,6 +26,7 @@ import java.util.Map;
  */
 @RestController
 @RequestMapping("/app/fs/health/data")
+@Api(tags = "用户身体检测数据血糖,尿酸,血压等")
 public class FsUserHealthDataController extends AppBaseController {
     @Autowired
     private IFsUserHealthDataService fsUserHealthDataService;

+ 5 - 1
fs-company-app/src/main/java/com/fs/app/controller/FsUserHealthProfileController.java

@@ -10,6 +10,7 @@ import com.fs.his.dto.FsUserHealthInfoDTO;
 import com.fs.his.service.IFsUserHealthDataService;
 import com.fs.his.service.IFsUserHealthProfileService;
 import com.fs.his.service.IFsUserInfoService;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -26,6 +27,7 @@ import java.util.Map;
  */
 @RestController
 @RequestMapping("/app/fs/health/profile")
+@Api(tags = "用户健康档案")
 public class FsUserHealthProfileController extends AppBaseController {
     @Autowired
     private IFsUserHealthProfileService fsUserHealthProfileService;
@@ -65,7 +67,9 @@ public class FsUserHealthProfileController extends AppBaseController {
         infoDTO.setAvatar(userInfo.getAvatar());
         infoDTO.setSex(userInfo.getSex());
         // 根据生日获取年龄
-        infoDTO.setAge(DateUtils.getAge(userInfo.getBirthdate()));
+        if(userInfo.getBirthdate()!=null){
+            infoDTO.setAge(DateUtils.getAge(userInfo.getBirthdate()));
+        }
 
         // 查询各指标 数据 测量类型(0-腰围,1-臀围,2-血糖,3-血压,4-尿酸 5-BMI)
         FsUserHealthData query = new FsUserHealthData();

+ 2 - 0
fs-company-app/src/main/java/com/fs/app/controller/FsUserInfoController.java

@@ -10,6 +10,7 @@ import com.fs.his.service.IFsUserInfoService;
 import com.fs.his.service.IFsUserService;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
@@ -25,6 +26,7 @@ import java.util.List;
  */
 @RestController
 @RequestMapping("/app/fs/userinfo")
+@Api(tags = "用户信息")
 public class FsUserInfoController extends AppBaseController {
     @Autowired
     private IFsUserInfoService fsUserInfoService;

+ 13 - 1
fs-service/src/main/java/com/fs/his/domain/FsUserHealthData.java

@@ -6,6 +6,7 @@ import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fs.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import com.fs.common.core.domain.BaseEntity;
 import lombok.EqualsAndHashCode;
@@ -21,38 +22,49 @@ import lombok.EqualsAndHashCode;
 public class FsUserHealthData extends BaseEntity{
 
     /** 自增主键 */
+    @ApiModelProperty("自增主键")
     private Long id;
 
     /** 用户ID */
+    @ApiModelProperty("用户ID")
     private Long userId;
 
     /** 测量类型(0-腰围,1-臀围,2-血糖,3-血压,4-尿酸 5-BMI) */
+    @ApiModelProperty("测量类型(0-腰围,1-臀围,2-血糖,3-血压,4-尿酸 5-BMI)")
     private Integer measurementType;
 
     /** 数值1(测量值1 测量值只有一个时默认填写/身高cm/舒张压) */
+    @ApiModelProperty("数值1(测量值1 测量值只有一个时默认填写/身高cm/舒张压)")
     private BigDecimal value1;
 
     /** 数值2(测量值2 体重kg/收缩压) */
+    @ApiModelProperty("数值2(测量值2 体重kg/收缩压)")
     private BigDecimal value2;
 
     /** 测量日期 */
     @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("测量日期")
     private Date measurementDate;
 
     /** 测量时间 */
     @JsonFormat(pattern = "HH:mm:ss")
+    @ApiModelProperty("测量时间")
     private Date measurementTime;
 
     /** 等级(无-0,轻微-1,严重-2) */
+    @ApiModelProperty("等级(无-0,轻微-1,严重-2)")
     private Integer level;
 
     /** 记录创建时间 */
     @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("记录创建时间")
     private Date createdAt;
 
     /** 性别(0:男, 1:女, 2:未知) */
+    @ApiModelProperty("性别(0:男, 1:女, 2:未知)")
     private Integer sex;
-
+    /** 查询时间 格式yyyy-MM-dd yyyy-MM-dd;yyyy-MM-dd yyyy-MM */
+    @ApiModelProperty("查询时间 格式yyyy-MM-dd yyyy-MM-dd;yyyy-MM-dd yyyy-MM")
     private String timeSearch;
 
 }

+ 19 - 0
fs-service/src/main/java/com/fs/his/domain/FsUserHealthProfile.java

@@ -5,6 +5,7 @@ import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fs.common.annotation.Excel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import com.fs.common.core.domain.BaseEntity;
 import lombok.EqualsAndHashCode;
@@ -20,59 +21,77 @@ import lombok.EqualsAndHashCode;
 public class FsUserHealthProfile extends BaseEntity{
 
     /** 用户ID(主键) */
+    @ApiModelProperty("用户ID(主键)")
     private Long userId;
 
     /** 身高(单位:厘米) */
+    @ApiModelProperty("身高(单位:厘米)")
     private BigDecimal height;
 
     /** 体重(单位:千克) */
+    @ApiModelProperty("体重(单位:千克)")
     private BigDecimal weight;
 
     /** 腰围(单位:厘米) */
+    @ApiModelProperty("腰围(单位:厘米)")
     private BigDecimal waistCircumference;
 
     /** 臀围(单位:厘米) */
+    @ApiModelProperty("臀围(单位:厘米)")
     private BigDecimal hipCircumference;
 
     /** 高血糖(无-0,轻微-1,严重-2) */
+    @ApiModelProperty("高血糖(无-0,轻微-1,严重-2)")
     private Long hyperglycemia;
 
     /** 高血糖测量值(单位:mmol/L) */
+    @ApiModelProperty("高血糖测量值(单位:mmol/L)")
     private BigDecimal hyperglycemiaValue;
 
     /** 高血压(无-0,轻微-1,严重-2) */
+    @ApiModelProperty("高血压(无-0,轻微-1,严重-2)")
     private Long hypertension;
 
     /** 收缩压(高压) */
+    @ApiModelProperty("收缩压(高压)")
     private BigDecimal systolicPressure;
 
     /** 舒张压(低压) */
+    @ApiModelProperty("舒张压(低压)")
     private BigDecimal diastolicPressure;
 
     /** 高血脂(无-0,轻微-1,严重-2) */
+    @ApiModelProperty("hyperlipidemia")
     private Long hyperlipidemia;
 
     /** 高尿酸(无-0,轻微-1,严重-2) */
+    @ApiModelProperty("高尿酸(无-0,轻微-1,严重-2)")
     private Long hyperuricemia;
 
     /** 高尿酸测量值(单位:μmol/L) */
+    @ApiModelProperty("高尿酸测量值(单位:μmol/L)")
     private BigDecimal hyperuricemiaValue;
 
     /** 高体重(正常-0,偏瘦-1,偏重-2) */
+    @ApiModelProperty("高体重(正常-0,偏瘦-1,偏重-2)")
     private Long bodyWeightStatus;
 
     /** 其他病史 */
+    @ApiModelProperty("其他病史")
     private String otherMedicalHistory;
 
     /** 症状史 */
+    @ApiModelProperty("症状史")
     private String symptomHistory;
 
     /** 创建时间 */
     @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("创建时间")
     private Date createdTime;
 
     /** 更新时间 */
     @JsonFormat(pattern = "yyyy-MM-dd")
+    @ApiModelProperty("更新时间")
     private Date updatedTime;
 
 

+ 34 - 0
fs-service/src/main/java/com/fs/his/domain/FsUserInfo.java

@@ -2,6 +2,7 @@ package com.fs.his.domain;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -21,169 +22,202 @@ public class FsUserInfo extends BaseEntity {
     /**
      * 用户ID
      */
+    @ApiModelProperty("用户ID")
     private Long userId;
 
     /**
      * 企业用户ID
      */
+    @ApiModelProperty("企业用户ID")
     private Long companyUserId;
 
     /**
      * 姓名
      */
+    @ApiModelProperty("姓名")
     private String username;
 
     /**
      * 头像
      */
+    @ApiModelProperty("头像")
     private String avatar;
 
     /**
      * 性别(0:男, 1:女, 2:未知)
      */
+    @ApiModelProperty("性别(0:男, 1:女, 2:未知)")
     private Integer sex;
 
     /**
      * 出生年月
      */
+    @ApiModelProperty("出生年月")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date birthdate;
 
     /**
      * 年龄
      */
+    @ApiModelProperty("年龄")
     private Integer age;
 
     /**
      * 电话
      */
+    @ApiModelProperty("电话")
     private String phone;
 
     /**
      * 身份证号
      */
+    @ApiModelProperty("身份证号")
     private String idCard;
 
     /**
      * 退休前工作单位
      */
+    @ApiModelProperty("退休前工作单位")
     private String previousEmployer;
 
     /**
      * 可支配收入(元)
      */
+    @ApiModelProperty("可支配收入(元)")
     private BigDecimal disposableIncome;
 
     /**
      * 实际消费(元)
      */
+    @ApiModelProperty("实际消费(元)")
     private BigDecimal actualConsumption;
 
     /**
      * 市区
      */
+    @ApiModelProperty("市区")
     private String city;
 
     /**
      * 详情小区
      */
+    @ApiModelProperty("详情小区")
     private String residentialCommunity;
 
     /**
      * 门牌号
      */
+    @ApiModelProperty("门牌号")
     private String houseNumber;
 
     /**
      * 面积(平方米)
      */
+    @ApiModelProperty("面积(平方米)")
     private BigDecimal area;
 
     /**
      * 楼层
      */
+    @ApiModelProperty("楼层")
     private String floor;
 
     /**
      * 伴侣姓名
      */
+    @ApiModelProperty("伴侣姓名")
     private String partnerName;
 
     /**
      * 伴侣年龄
      */
+    @ApiModelProperty("伴侣年龄")
     private String partnerAge;
 
     /**
      * 伴侣单位
      */
+    @ApiModelProperty("伴侣单位")
     private String partnerEmployer;
 
     /**
      * 孙辈学校
      */
+    @ApiModelProperty("孙辈学校")
     private String grandchildrenSchool;
 
     /**
      * 是否会员(0:不是, 1:是)
      */
+    @ApiModelProperty("是否会员(0:不是, 1:是)")
     private String isMember;
 
     /**
      * 会员分类/等级
      */
+    @ApiModelProperty("会员分类/等级")
     private String memberLevel;
 
     /**
      * 加入时间
      */
+    @ApiModelProperty("加入时间")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date joinTime;
 
     /**
      * 到期时间
      */
+    @ApiModelProperty("到期时间")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date expiryTime;
 
     /**
      * 管理月份(格式如: 2024-01)
      */
+    @ApiModelProperty("管理月份(格式如: 2024-01)")
     private String managementMonth;
 
     /**
      * 职位
      */
+    @ApiModelProperty("职位")
     private String position;
 
     /**
      * 癖好/平日喜好
      */
+    @ApiModelProperty("癖好/平日喜好")
     private String hobbies;
 
     /**
      * 特长
      */
+    @ApiModelProperty("特长")
     private String specialties;
 
     /**
      * 信仰
      */
+    @ApiModelProperty("信仰")
     private String faith;
 
     /**
      * 担忧
      */
+    @ApiModelProperty("担忧")
     private String concerns;
 
     /**
      * 用户想解决的问题
      */
+    @ApiModelProperty("用户想解决的问题")
     private String problemsToSolve;
 
     /**
      * 健康建议
      */
+    @ApiModelProperty("健康建议")
     private String healthSuggestions;
 
 }

+ 174 - 0
fs-user-app/src/main/java/com/fs/app/controller/FsUserHealthDataController.java

@@ -0,0 +1,174 @@
+package com.fs.app.controller;
+
+import com.fs.app.annotation.Login;
+import com.fs.common.core.domain.R;
+import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.StringUtils;
+import com.fs.his.config.HealthIndicatorConfig;
+import com.fs.his.domain.FsUserHealthData;
+import com.fs.his.service.IFsUserHealthDataService;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户身体检测数据Controller
+ *
+ * @author fs
+ * @date 2025-08-27
+ */
+@RestController
+@RequestMapping("/app/fs/health/data")
+@Api(tags = "用户身体检测数据血糖,尿酸,血压等")
+public class FsUserHealthDataController extends AppBaseController {
+    @Autowired
+    private IFsUserHealthDataService fsUserHealthDataService;
+
+
+    /**
+     * 查询用户身体检测数据列表
+     */
+    @Login
+    @GetMapping("/list")
+    @ApiOperation("获取用户列表信息")
+    public R list(FsUserHealthData fsUserHealthData,
+                  @RequestParam(required = false, defaultValue = "1") Integer pageNum,
+                  @RequestParam(required = false, defaultValue = "1000") Integer pageSize
+    ) {
+        // 时间格式字段处理
+        if (StringUtils.isNotEmpty(fsUserHealthData.getTimeSearch())) {
+            Map<String, Object> timeMap = new HashMap<>();
+            // 时间格式处理 2025-01-21 2025-01-01;2025-01-12 2025-01
+            if (fsUserHealthData.getTimeSearch().contains(";")) {
+                String[] timeArr = fsUserHealthData.getTimeSearch().split(";");
+                timeMap.put("beginTime", timeArr[0]);
+                timeMap.put("endTime", timeArr[1]);
+            } else if (fsUserHealthData.getTimeSearch().length() == 10) {
+                fsUserHealthData.setMeasurementDate(DateUtils.parseDate(fsUserHealthData.getTimeSearch()));
+            } else if (fsUserHealthData.getTimeSearch().length() == 7) {
+                // 按月 取当月第一个和最后一天
+                timeMap.put("beginTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, DateUtils.getStartOfMonth(DateUtils.parseDate(fsUserHealthData.getTimeSearch()))));
+                timeMap.put("endTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, DateUtils.getEndOfMonth(DateUtils.parseDate(fsUserHealthData.getTimeSearch()))));
+            }
+            fsUserHealthData.setParams(timeMap);
+        }
+
+
+        List<FsUserHealthData> list = fsUserHealthDataService.selectFsUserHealthDataList(fsUserHealthData);
+
+        Map<String, Object> data = new HashMap<>();
+        data.put("data", new PageInfo<>(list));
+
+
+        // 如果测量类型是空 需要查询各等级(无-0,轻微-1,严重-2) 数量
+        if (fsUserHealthData.getLevel() == null) {
+            for (int i = 0; i < 3; i++) {
+                fsUserHealthData.setLevel(i);
+                int num = fsUserHealthDataService.selectFsUserHealthDataListCount(fsUserHealthData);
+                data.put("count" + i, num);
+            }
+        }
+
+
+        return R.ok(data);
+    }
+
+    /**
+     * 根据检测类型获取 检测指标
+     */
+    @Login
+    @GetMapping("/flag")
+    @ApiOperation(" 根据检测类型获取 检测指标")
+    public R getInfo(@RequestParam("measurementType") Integer measurementType) {
+        // 获取检测指标 (0-腰围,1-臀围,2-血糖,3-血压,4-尿酸 5-BMI)
+        Map<String, Object> data = new HashMap<>();
+        // 血糖 尿酸 需要
+        HealthIndicatorConfig healthIndicatorConfig = fsUserHealthDataService.parseHealthIndicator();
+        if (measurementType == 2) { // 血糖
+            if (healthIndicatorConfig != null) {
+                String[] key = {"fasting", "post1Hour", "post2Hour"}; // 正常 餐后1小时 餐后2小时
+                for (int i = 0; i < key.length; i++) {
+                    String value = fsUserHealthDataService.getHealthIndicatorValue(healthIndicatorConfig, "bloodGlucose", key[i], "normal");
+                    // value json串转Map对象
+                    data.put(key[i], value);
+                }
+            }
+        } else if (measurementType == 4) {
+            String[] key = new String[]{"male", "female"};
+            for (int i = 0; i < key.length; i++) {
+                String value = fsUserHealthDataService.getHealthIndicatorValue(healthIndicatorConfig, "uricAcid", key[i], "normal");
+                data.put(key[i], value);
+            }
+        }
+        return R.ok().put("data", data);
+    }
+
+
+    /**
+     * 根据用户ID 查询用户身体检测最新数据
+     */
+    @Login
+    @GetMapping("/latest/info")
+    @ApiOperation("根据用户ID 获取用户身体检测最新数据")
+    public R getInfo(@RequestParam("userId") Long userId, @RequestParam("measurementType") Integer measurementType) {
+        FsUserHealthData fsUserHealthData = new FsUserHealthData();
+        fsUserHealthData.setUserId(userId);
+        fsUserHealthData.setMeasurementType(measurementType);
+        fsUserHealthData = fsUserHealthDataService.selectFsUserHealthDataByUserId(fsUserHealthData);
+        return R.ok().put("data", fsUserHealthData);
+    }
+
+    /**
+     * 根据ID 查询用户身体检测最新数据
+     */
+    @Login
+    @GetMapping("/info")
+    @ApiOperation("根据ID 获取用户身体检测最新数据")
+    public R getInfoById(@RequestParam("id") Long id) {
+        FsUserHealthData fsUserHealthData = fsUserHealthDataService.selectFsUserHealthDataById(id);
+        return R.ok().put("data", fsUserHealthData);
+    }
+
+    /**
+     * 新增用户身体检测数据
+     */
+    @Login
+    @PostMapping("/add")
+    @ApiOperation("新增用户身体检测数据")
+    public R add(@RequestBody FsUserHealthData fsUserHealthData) {
+        // 登记检测数据信息
+        fsUserHealthDataService.addHealthData(fsUserHealthData);
+        return R.ok();
+    }
+
+    /**
+     * 修改用户身体检测数据
+     */
+    @Login
+    @PostMapping("/update")
+    @ApiOperation("修改用户身体检测数据")
+    public R edit(@RequestBody FsUserHealthData fsUserHealthData) {
+        // 修改检测数据信息
+        fsUserHealthDataService.updateFsUserHealthDataAndLevel(fsUserHealthData);
+        return R.ok();
+    }
+
+    /**
+     * 删除用户身体检测数据
+     */
+    @Login
+    @GetMapping("/delete")
+    @ApiOperation("删除用户身体检测数据")
+    public R remove(@RequestParam Long id) {
+        if (fsUserHealthDataService.deleteFsUserHealthDataById(id) <= 0) {
+            return R.error("用户身体检测数据删除失败");
+        }
+        return R.ok();
+    }
+}

+ 139 - 0
fs-user-app/src/main/java/com/fs/app/controller/FsUserHealthProfileController.java

@@ -0,0 +1,139 @@
+package com.fs.app.controller;
+
+import com.fs.app.annotation.Login;
+import com.fs.common.core.domain.R;
+import com.fs.common.utils.DateUtils;
+import com.fs.his.domain.FsUserHealthData;
+import com.fs.his.domain.FsUserHealthProfile;
+import com.fs.his.domain.FsUserInfo;
+import com.fs.his.dto.FsUserHealthInfoDTO;
+import com.fs.his.service.IFsUserHealthDataService;
+import com.fs.his.service.IFsUserHealthProfileService;
+import com.fs.his.service.IFsUserInfoService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 用户健康档案Controller
+ *
+ * @author fs
+ * @date 2025-08-27
+ */
+@RestController
+@RequestMapping("/app/fs/health/profile")
+@Api(tags = "用户健康档案")
+public class FsUserHealthProfileController extends AppBaseController {
+    @Autowired
+    private IFsUserHealthProfileService fsUserHealthProfileService;
+    @Autowired
+    private IFsUserHealthDataService fsUserHealthDataService;
+    @Autowired
+    private IFsUserInfoService fsUserInfoService;
+
+
+    /**
+     * 获取用户健康档案详细信息
+     */
+    @Login
+    @GetMapping(value = "/info")
+    @ApiOperation("获取用户健康档案详细信息")
+    public R getInfo(@RequestParam("userId") Long userId) {
+        FsUserHealthProfile profile = fsUserHealthProfileService.selectFsUserHealthProfileByUserId(userId);
+        return R.ok().put("data", profile);
+    }
+
+
+    /**
+     * 获取用户健康档案主页信息
+     */
+    @Login
+    @GetMapping(value = "/home/info")
+    @ApiOperation("获取用户健康档案主页信息")
+    public R getHomeInfo(@RequestParam("userId") Long userId) {
+        FsUserHealthInfoDTO infoDTO = new FsUserHealthInfoDTO();
+        // 查询用户信息
+        FsUserInfo userInfo = fsUserInfoService.selectFsUserInfoById(userId);
+        if (userInfo == null) {
+            return R.error("用户不存在");
+        }
+        infoDTO.setUserId(userId);
+        infoDTO.setUsername(userInfo.getUsername());
+        infoDTO.setAvatar(userInfo.getAvatar());
+        infoDTO.setSex(userInfo.getSex());
+        // 根据生日获取年龄
+        if(userInfo.getBirthdate()!=null){
+            infoDTO.setAge(DateUtils.getAge(userInfo.getBirthdate()));
+        }
+
+        // 查询各指标 数据 测量类型(0-腰围,1-臀围,2-血糖,3-血压,4-尿酸 5-BMI)
+        FsUserHealthData query = new FsUserHealthData();
+        query.setUserId(userId);
+        Map<String, Object> dataMap = new HashMap<>();
+        for (int i = 0; i < 6; i++) {
+            query.setMeasurementType(i);
+            FsUserHealthData healthData = fsUserHealthDataService.selectFsUserHealthDataByUserId(query);
+            dataMap.put(String.valueOf(i), healthData);
+        }
+        infoDTO.setDataMap(dataMap);
+
+        // 查询健康档案
+        FsUserHealthProfile profile = fsUserHealthProfileService.selectFsUserHealthProfileByUserId(userId);
+        if (profile != null) {
+            infoDTO.setSymptomHistory(profile.getSymptomHistory());
+            infoDTO.setOtherMedicalHistory(profile.getOtherMedicalHistory());
+        }
+
+        return R.ok().put("data", infoDTO);
+    }
+
+
+    /**
+     * 新增用户健康档案
+     */
+    @Login
+    @PostMapping("/add")
+    @ApiOperation("新增用户健康档案")
+    @Transactional
+    public R add(@RequestBody FsUserHealthProfile fsUserHealthProfile) {
+
+        if (fsUserHealthProfileService.insertFsUserHealthProfile(fsUserHealthProfile) <= 0) {
+            return R.error("新增用户健康档案失败");
+        }
+
+        // 登记身体检测数据 FsUserHealthData
+        fsUserHealthDataService.initHealthData(fsUserHealthProfile);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改用户健康档案
+     */
+    @Login
+    @PostMapping("/update")
+    @ApiOperation("修改用户健康档案")
+    public R edit(@RequestBody FsUserHealthProfile fsUserHealthProfile) {
+        if (fsUserHealthProfileService.updateFsUserHealthProfile(fsUserHealthProfile) <= 0) {
+            return R.error("用户健康档案修改失败");
+        }
+        return R.ok();
+    }
+
+    /**
+     * 删除用户健康档案
+     */
+    @Login
+    @GetMapping("/delete")
+    public R remove(@RequestParam Long userId) {
+        if (fsUserHealthProfileService.deleteFsUserHealthProfileByUserId(userId) <= 0) {
+            return R.error("用户健康档案删除失败");
+        }
+        return R.ok();
+    }
+}

+ 91 - 0
fs-user-app/src/main/java/com/fs/app/controller/FsUserInfoController.java

@@ -0,0 +1,91 @@
+package com.fs.app.controller;
+
+import com.fs.app.annotation.Login;
+import com.fs.common.core.domain.R;
+import com.fs.common.utils.DateUtils;
+import com.fs.his.domain.FsUserInfo;
+import com.fs.his.service.IFsUserInfoService;
+import com.fs.his.service.IFsUserService;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 用户信息Controller
+ *
+ * @author fs
+ * @date 2025-08-25
+ */
+@RestController
+@RequestMapping("/app/fs/userinfo")
+@Api(tags = "用户信息")
+public class FsUserInfoController extends AppBaseController {
+    @Autowired
+    private IFsUserInfoService fsUserInfoService;
+
+    @Autowired
+    private IFsUserService fsUserService;
+
+    /**
+     * 获取用户信息详细信息
+     */
+    @Login
+    @GetMapping(value = "/info")
+    @ApiOperation("获取用户详情信息")
+    public R getInfo(@RequestParam("userId") Long userId) {
+        FsUserInfo fsUserInfo = fsUserInfoService.selectFsUserInfoById(userId);
+        if (fsUserInfo == null) {
+            return R.error("用户不存在");
+        } else {
+            if(fsUserInfo.getBirthdate()!=null){
+                fsUserInfo.setAge(DateUtils.getAge(fsUserInfo.getBirthdate()));
+            }
+        }
+        return R.ok().put("data", fsUserInfo);
+    }
+
+    /**
+     * 新增用户信息
+     */
+    @Login
+    @PostMapping("/add")
+    @ApiOperation("新增用户信息")
+    public R add(@RequestBody FsUserInfo fsUserInfo) {
+        fsUserInfoService.add(fsUserInfo);
+        return R.ok();
+    }
+
+    /**
+     * 修改用户信息
+     */
+    @Login
+    @PostMapping("/update")
+    @ApiOperation("修改用户信息")
+    public R edit(@RequestBody FsUserInfo fsUserInfo) {
+        if (fsUserInfoService.updateFsUserInfo(fsUserInfo) <= 0) {
+            return R.error("用户信息修改失败");
+        }
+        return R.ok();
+    }
+
+    /**
+     * 删除用户信息
+     */
+    @Login
+    @GetMapping("/delete")
+    @ApiOperation("删除用户信息")
+    @Transactional
+    public R remove(@RequestParam("userId") Long userId) {
+        // 更新fsUser表状态
+        if (fsUserService.deleteFsUserByUserId(userId) <= 0) {
+            return R.error("用户信息删除原表失败");
+        }
+        return R.ok();
+    }
+}

+ 13 - 0
fs-user-app/src/main/java/com/fs/app/exception/FSExceptionHandler.java

@@ -5,6 +5,7 @@ package com.fs.app.exception;
 
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
+import com.fs.common.exception.ServiceException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DuplicateKeyException;
@@ -37,6 +38,18 @@ public class FSExceptionHandler {
 		return r;
 	}
 
+	/**
+	 * 处理自定义异常
+	 */
+	@ExceptionHandler(ServiceException.class)
+	public R handleRRException(ServiceException e){
+		R r = new R();
+		r.put("code", e.getCode());
+		r.put("msg", e.getMessage());
+
+		return r;
+	}
+
 	@ExceptionHandler(NoHandlerFoundException.class)
 	public R handlerNoFoundException(Exception e) {
 		logger.error(e.getMessage(), e);