|
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.fs.common.constant.Constants;
|
|
import com.fs.common.constant.Constants;
|
|
|
import com.fs.common.core.redis.RedisCache;
|
|
import com.fs.common.core.redis.RedisCache;
|
|
|
import com.fs.common.utils.StringUtils;
|
|
import com.fs.common.utils.StringUtils;
|
|
|
|
|
+import com.fs.his.config.HealthIndicatorConfig;
|
|
|
import lombok.val;
|
|
import lombok.val;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
@@ -110,21 +111,145 @@ public class FsUserHealthDataServiceImpl extends ServiceImpl<FsUserHealthDataMap
|
|
|
* @Date 2025/8/28 9:10
|
|
* @Date 2025/8/28 9:10
|
|
|
*/
|
|
*/
|
|
|
@Override
|
|
@Override
|
|
|
- public Map<String, Object> parseHealthIndicator() {
|
|
|
|
|
|
|
+ public HealthIndicatorConfig parseHealthIndicator() {
|
|
|
String str = redisCache.getCacheObject(Constants.SYS_CONFIG_KEY + HEALTH_INDICATOR_KEY);
|
|
String str = redisCache.getCacheObject(Constants.SYS_CONFIG_KEY + HEALTH_INDICATOR_KEY);
|
|
|
// str JSON串转 map
|
|
// str JSON串转 map
|
|
|
if(StringUtils.isEmpty(str)){
|
|
if(StringUtils.isEmpty(str)){
|
|
|
throw new RuntimeException("健康指标配置不存在,请联系管理人员");
|
|
throw new RuntimeException("健康指标配置不存在,请联系管理人员");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 解析健康指标JSON
|
|
|
|
|
-// {"bloodGlucose":{"fasting":{"normal":"1212.111111"},"post1Hour":{"normal":""},"post2Hour":{"normal":"2121"},"severity":[{"level":"normal","range":"","description":"12"},{"level":"mild","range":"121","description":"2121"},{"level":"severe","range":"212","description":"212"}]},"bloodPressure":{"protection":{"systolic":"","diastolic":""},"severity":[{"level":"normal","type":"systolic","range":"121","description":"121"},{"level":"mild","type":"systolic","range":"1212","description":"2121"},{"level":"severe","type":"systolic","range":"1212","description":"2121"},{"level":"normal","type":"diastolic","range":"121","description":"2121"},{"level":"mild","type":"diastolic","range":"212","description":"121"},{"level":"severe","type":"diastolic","range":"212","description":"121"}]},"uricAcid":{"activeGender":"male","male":[{"level":"normal","range":"<420","description":""},{"level":"poor","range":"420~480","description":""},{"level":"highRisk","range":">480","description":""}],"female":[{"level":"normal","range":"<360","description":""},{"level":"poor","range":"360~420","description":""},{"level":"highRisk","range":">420","description":""}]},"bmi":{"severity":[{"level":"normal","range":"18.5~23.9","description":""},{"level":"mild","range":"<18.5","description":""},{"level":"severe","range":"≥24.0","description":""}]}}
|
|
|
|
|
|
|
+ // 解析健康指标JSON 放入HealthIndicatorConfig
|
|
|
|
|
+ return HealthIndicatorConfig.fromJson(str);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public static void main(String[] args) {
|
|
|
|
|
+ // 解析健康指标JSON 放入map对象
|
|
|
|
|
+ String str="{\"bloodGlucose\":{\"fasting\":{\"normal\":\"3.9~6.1\"},\"post1Hour\":{\"normal\":\"<11.1\"},\"post2Hour\":{\"normal\":\"<7.8\"},\"severity\":[{\"level\":\"normal\",\"range\":\"<6.1\",\"description\":\"\"},{\"level\":\"mild\",\"range\":\"6.1~7.0\",\"description\":\"\"},{\"level\":\"severe\",\"range\":\"≥7.0\",\"description\":\"\"}]},\"bloodPressure\":{\"protection\":{\"systolic\":\"\",\"diastolic\":\"\"},\"severity\":[{\"level\":\"normal\",\"type\":\"systolic\",\"range\":\"<120\",\"description\":\"\"},{\"level\":\"mild\",\"type\":\"systolic\",\"range\":\"120~139\",\"description\":\"\"},{\"level\":\"severe\",\"type\":\"systolic\",\"range\":\"≥140\",\"description\":\"\"},{\"level\":\"normal\",\"type\":\"diastolic\",\"range\":\"<80\",\"description\":\"\"},{\"level\":\"mild\",\"type\":\"diastolic\",\"range\":\"80~89\",\"description\":\"\"},{\"level\":\"severe\",\"type\":\"diastolic\",\"range\":\"≥90\",\"description\":\"\"}]},\"uricAcid\":{\"activeGender\":\"male\",\"male\":[{\"level\":\"normal\",\"range\":\"<420\",\"description\":\"\"},{\"level\":\"poor\",\"range\":\"420~480\",\"description\":\"\"},{\"level\":\"highRisk\",\"range\":\">480\",\"description\":\"\"}],\"female\":[{\"level\":\"normal\",\"range\":\"<360\",\"description\":\"\"},{\"level\":\"poor\",\"range\":\"360~420\",\"description\":\"\"},{\"level\":\"highRisk\",\"range\":\">420\",\"description\":\"\"}]},\"bmi\":{\"severity\":[{\"level\":\"normal\",\"range\":\"18.5~23.9\",\"description\":\"\"},{\"level\":\"mild\",\"range\":\"<18.5\",\"description\":\"\"},{\"level\":\"severe\",\"range\":\"≥24.0\",\"description\":\"\"}]}}";
|
|
|
|
|
|
|
|
- Map<String, Object> map = JSON.parseObject(str, Map.class);
|
|
|
|
|
- // 校验健康指标配置
|
|
|
|
|
|
|
+ HealthIndicatorConfig config = HealthIndicatorConfig.fromJson(str);
|
|
|
|
|
+ System.out.println(getHealthIndicatorValue(config, "bloodGlucose", "fasting", "normal"));
|
|
|
|
|
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取健康指标值
|
|
|
|
|
+ * @param config 健康指标配置对象
|
|
|
|
|
+ * @param type 指标类型 (bloodGlucose 血糖, bloodPressure 血压, uricAcid 血酸(分男女), bmi 胖瘦)
|
|
|
|
|
+ * @param key 指标键值 (bloodGlucose使用(fasting 正常, post1Hour 饭后一小时, post2Hour 饭后两小时 )血酸(male 男性 female 女性) severity 等)
|
|
|
|
|
+ * @param level 指标级别 (normal 正常, mild 轻微, severe 严重 等)
|
|
|
|
|
+ * @param subType 子类型 (bloodPressure时使用,systolic 收缩压, diastolic 舒张压)
|
|
|
|
|
+ * @return 指标值
|
|
|
|
|
+ */
|
|
|
|
|
+ private static String getHealthIndicatorValue(HealthIndicatorConfig config, String type, String key, String level, String subType) {
|
|
|
|
|
+ if (config == null) {
|
|
|
|
|
+ throw new RuntimeException("健康指标配置不存在,请联系管理人员");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ switch (type) {
|
|
|
|
|
+ case "bloodGlucose":
|
|
|
|
|
+ Map<String, Object> bloodGlucose = config.getBloodGlucose();
|
|
|
|
|
+ if ("severity".equals(key)) {
|
|
|
|
|
+ // 处理严重程度级别
|
|
|
|
|
+ List<Map<String, Object>> severityList = (List<Map<String, Object>>) bloodGlucose.get("severity");
|
|
|
|
|
+ for (Map<String, Object> severity : severityList) {
|
|
|
|
|
+ if (level.equals(severity.get("level"))) {
|
|
|
|
|
+ return (String) severity.get("range");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 处理普通键值
|
|
|
|
|
+ Map<String, Object> keyMap = (Map<String, Object>) bloodGlucose.get(key);
|
|
|
|
|
+ if (keyMap != null) {
|
|
|
|
|
+ return (String) keyMap.get(level);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ case "bloodPressure":
|
|
|
|
|
+ Map<String, Object> bloodPressure = config.getBloodPressure();
|
|
|
|
|
+ if ("severity".equals(key)) {
|
|
|
|
|
+ // 处理血压严重程度级别
|
|
|
|
|
+ List<Map<String, Object>> severityList = (List<Map<String, Object>>) bloodPressure.get("severity");
|
|
|
|
|
+ for (Map<String, Object> severity : severityList) {
|
|
|
|
|
+ // 同时匹配级别和血压类型(收缩压/舒张压)
|
|
|
|
|
+ if (level.equals(severity.get("level")) && subType.equals(severity.get("type"))) {
|
|
|
|
|
+ return (String) severity.get("range");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 处理保护范围等
|
|
|
|
|
+ Map<String, Object> keyMap = (Map<String, Object>) bloodPressure.get(key);
|
|
|
|
|
+ if (keyMap != null) {
|
|
|
|
|
+ return (String) keyMap.get(level);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ case "uricAcid":
|
|
|
|
|
+ Map<String, Object> uricAcid = config.getUricAcid();
|
|
|
|
|
+ if ("severity".equals(key)) {
|
|
|
|
|
+ // 根据性别获取尿酸范围
|
|
|
|
|
+ String activeGender = (String) uricAcid.get("activeGender");
|
|
|
|
|
+ List<Map<String, Object>> genderList = (List<Map<String, Object>>) uricAcid.get(activeGender);
|
|
|
|
|
+ if (genderList != null) {
|
|
|
|
|
+ for (Map<String, Object> severity : genderList) {
|
|
|
|
|
+ if (level.equals(severity.get("level"))) {
|
|
|
|
|
+ return (String) severity.get("range");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 直接根据指定性别获取尿酸范围
|
|
|
|
|
+ if (subType != null && ("male".equals(subType) || "female".equals(subType))) {
|
|
|
|
|
+ List<Map<String, Object>> genderList = (List<Map<String, Object>>) uricAcid.get(subType);
|
|
|
|
|
+ if (genderList != null) {
|
|
|
|
|
+ for (Map<String, Object> severity : genderList) {
|
|
|
|
|
+ if (level.equals(severity.get("level"))) {
|
|
|
|
|
+ return (String) severity.get("range");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ case "bmi":
|
|
|
|
|
+ Map<String, Object> bmi = config.getBmi();
|
|
|
|
|
+ if ("severity".equals(key)) {
|
|
|
|
|
+ // 处理BMI严重程度级别
|
|
|
|
|
+ List<Map<String, Object>> severityList = (List<Map<String, Object>>) bmi.get("severity");
|
|
|
|
|
+ for (Map<String, Object> severity : severityList) {
|
|
|
|
|
+ if (level.equals(severity.get("level"))) {
|
|
|
|
|
+ return (String) severity.get("range");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ default:
|
|
|
|
|
+ throw new RuntimeException("不支持的健康指标类型: " + type);
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ throw new RuntimeException("获取健康指标值失败: " + e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取健康指标值 (重载方法,用于不需要subType的场景)
|
|
|
|
|
+ * @param config 健康指标配置对象
|
|
|
|
|
+ * @param type 指标类型
|
|
|
|
|
+ * @param key 指标键值
|
|
|
|
|
+ * @param level 指标级别
|
|
|
|
|
+ * @return 指标值
|
|
|
|
|
+ */
|
|
|
|
|
+ private static String getHealthIndicatorValue(HealthIndicatorConfig config, String type, String key, String level) {
|
|
|
|
|
+ return getHealthIndicatorValue(config, type, key, level, null);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
}
|
|
}
|