123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- package org.dromara.web.service;
- import java.util.HashMap;
- import java.util.Map;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- /**
- * 营养代谢基础值查询工具类
- * 支持通过营养素名称、性别和年龄查询推荐值
- */
- public class NutritionDataUtil {
- // 营养素数据映射表
- private static final Map<String, Map<String, String>> NUTRIENT_MAP = new HashMap<>();
- // 年龄范围映射表
- private static final Map<String, AgeRange> AGE_RANGE_MAP = new HashMap<>();
- // 年龄范围类
- private static class AgeRange {
- final int min;
- final int max;
- final String groupName;
- AgeRange(int min, int max, String groupName) {
- this.min = min;
- this.max = max;
- this.groupName = groupName;
- }
- boolean contains(int age) {
- return age >= min && age <= max;
- }
- }
- static {
- // 初始化年龄范围映射
- initializeAgeRanges();
- // 初始化营养素数据
- initializeNutrientData();
- }
- // 初始化年龄范围
- private static void initializeAgeRanges() {
- AGE_RANGE_MAP.put("0-6月", new AgeRange(0, 0, "0-6月"));
- AGE_RANGE_MAP.put("7-12月", new AgeRange(0, 1, "7-12月"));
- AGE_RANGE_MAP.put("1-3岁", new AgeRange(1, 3, "1-3岁"));
- AGE_RANGE_MAP.put("4-6岁", new AgeRange(4, 6, "4-6岁"));
- AGE_RANGE_MAP.put("7-10岁", new AgeRange(7, 10, "7-10岁"));
- AGE_RANGE_MAP.put("11-13岁", new AgeRange(11, 13, "11-13岁"));
- AGE_RANGE_MAP.put("14-17岁", new AgeRange(14, 17, "14-17岁"));
- AGE_RANGE_MAP.put("18-49岁", new AgeRange(18, 49, "18-49岁"));
- AGE_RANGE_MAP.put("50-64岁", new AgeRange(50, 64, "50-64岁"));
- AGE_RANGE_MAP.put("≥65岁", new AgeRange(65, Integer.MAX_VALUE, "≥65岁"));
- AGE_RANGE_MAP.put("孕妇", new AgeRange(-1, -1, "孕妇(中期/晚期)"));
- AGE_RANGE_MAP.put("乳母", new AgeRange(-1, -1, "乳母"));
- }
- // 初始化营养素数据
- private static void initializeNutrientData() {
- // 常量元素
- addNutrientData("钙", "mg", "300 (AI)", "350 (AI)", "600", "800", "1000", "1200", "1000", "800", "1000", "1000", "1000/1200", "1000");
- addNutrientData("磷", "mg", "160 (AI)", "280 (AI)", "400", "500", "600", "800", "700", "700", "700", "700", "700", "700");
- addNutrientData("钾", "mg", "350 (AI)", "450 (AI)", "700", "900", "1300", "1800", "2000", "2000", "2000", "2000", "2000", "2000");
- addNutrientData("钠", "mg", "170 (AI)", "350 (AI)", "700", "900", "1200", "1500", "1500", "1500", "1500", "1500", "1500", "1500");
- addNutrientData("镁", "mg", "25 (AI)", "40 (AI)", "100", "120", "150", "200", "250", "330", "330", "330", "350", "350");
- addNutrientData("氯", "mg", "270 (AI)", "540 (AI)", "1000", "1200", "1700", "2300", "2300", "2300", "2300", "2300", "2300", "2300");
- // 微量元素
- addNutrientData("铁", "mg", "0.3 (AI)", "10", "9", "10", "12", "男16/女20", "男15/女20", "男12/女20", "12", "12", "24", "13");
- addNutrientData("锌", "mg", "1.5 (AI)", "3 (AI)", "4", "5", "7", "男10/女9", "男12.5/女7.5", "男12.5/女7.5", "男12.5/女7.5", "男12.5/女7.5", "10/12.5", "16.5");
- addNutrientData("硒", "μg", "15 (AI)", "20 (AI)", "20", "25", "30", "40", "50", "60", "60", "60", "65", "75");
- addNutrientData("铜", "mg", "0.2 (AI)", "0.3 (AI)", "0.8", "0.9", "1", "1.1", "1.1", "0.8", "0.8", "0.8", "1.3", "1.3");
- addNutrientData("锰", "mg", "0.05 (AI)", "0.08 (AI)", "1.5", "2.5", "3.5", "4.5", "4.5", "4.5", "4.5", "4.5", "4.5", "4.5");
- addNutrientData("碘", "μg", "85 (AI)", "115 (AI)", "90", "90", "120", "120", "120", "120", "120", "120", "230", "240");
- addNutrientData("氟", "mg", "0.01 (AI)", "0.05 (AI)", "0.7", "1", "1.5", "2", "2.5", "3", "3", "3", "3", "3");
- addNutrientData("铬", "μg", "5 (AI)", "10 (AI)", "15", "20", "25", "30", "30", "50", "50", "50", "50", "50");
- addNutrientData("钼", "μg", "2 (AI)", "4 (AI)", "6", "8", "10", "12", "15", "30", "30", "30", "30", "30");
- // 脂溶性维生素
- addNutrientData("维生素A", "μg RE", "400 (AI)", "400 (AI)", "400", "500", "600", "700", "700", "800", "700", "700", "800/900", "1200");
- addNutrientData("维生素D", "μg", "10 (AI)", "10 (AI)", "10", "10", "10", "10", "10", "10", "10", "10", "10", "10");
- addNutrientData("维生素E", "mg α-TE", "3 (AI)", "4 (AI)", "6", "7", "9", "11", "14", "14", "14", "14", "14", "14");
- addNutrientData("维生素K", "μg", "2 (AI)", "2.5 (AI)", "25", "30", "40", "50", "60", "80", "80", "80", "80", "80");
- // 水溶性维生素
- addNutrientData("维生素B1", "mg", "0.2 (AI)", "0.3 (AI)", "0.6", "0.8", "1", "男1.2/女1.0", "男1.3/女1.1", "男1.4/女1.2", "男1.4/女1.2", "男1.4/女1.2", "1.5/1.6", "1.6");
- addNutrientData("维生素B2", "mg", "0.2 (AI)", "0.3 (AI)", "0.6", "0.8", "1", "男1.2/女1.0", "男1.3/女1.1", "男1.4/女1.2", "男1.4/女1.2", "男1.4/女1.2", "1.5/1.6", "1.7");
- addNutrientData("维生素B6", "mg", "0.1 (AI)", "0.2 (AI)", "0.6", "0.8", "1", "男1.2/女1.0", "男1.4/女1.2", "男1.4/女1.2", "男1.4/女1.2", "男1.4/女1.2", "1.8", "2");
- addNutrientData("维生素B12", "μg", "0.3 (AI)", "0.4 (AI)", "0.7", "1", "1.3", "1.6", "2", "2.4", "2.4", "2.4", "2.6", "2.8");
- addNutrientData("烟酸", "mg NE", "2 (AI)", "3 (AI)", "6", "8", "11", "男14/女12", "男16/女14", "男18/女14", "男18/女14", "男18/女14", "18", "18");
- addNutrientData("维生素C", "mg", "40 (AI)", "50 (AI)", "60", "70", "80", "90", "100", "100", "100", "100", "115/130", "150");
- addNutrientData("叶酸", "μg DFE", "65 (AI)", "80 (AI)", "150", "200", "250", "300", "350", "400", "400", "400", "600", "500");
- addNutrientData("胆碱", "mg", "125 (AI)", "150 (AI)", "175", "200", "250", "300", "350", "400", "400", "400", "450", "550");
- addNutrientData("生物素", "μg", "5 (AI)", "6 (AI)", "8", "12", "15", "20", "25", "30", "30", "30", "30", "35");
- addNutrientData("泛酸", "mg", "1.7 (AI)", "2.0 (AI)", "3", "4", "4", "5", "5", "5", "5", "5", "6", "7");
- // 其他
- addNutrientData("膳食纤维", "g", "-", "-", "13", "14", "15", "18", "20", "25", "25", "25", "25", "25");
- }
- // 添加营养素数据
- private static void addNutrientData(String nutrient, String... values) {
- Map<String, String> dataMap = new HashMap<>();
- String[] ageGroups = {
- "0-6月", "7-12月", "1-3岁", "4-6岁", "7-10岁",
- "11-13岁", "14-17岁", "18-49岁", "50-64岁", "≥65岁",
- "孕妇(中期/晚期)", "乳母"
- };
- for (int i = 0; i < values.length && i < ageGroups.length; i++) {
- dataMap.put(ageGroups[i], values[i] + (values[i].equals("-") ? "" : " " ));
- }
- NUTRIENT_MAP.put(nutrient, dataMap);
- }
- /**
- * 根据整数年龄获取营养推荐值
- *
- * @param nutrient 营养素名称
- * @param gender 性别 (男/女,当不需要区分性别时可传null)
- * @param age 实际年龄 (整数)
- * @return 对应的营养值 (带单位),未找到返回null
- */
- public static String getValueByAge(String nutrient, String gender, int age) {
- String ageGroup = findAgeGroup(age);
- return getValue(nutrient, gender, ageGroup);
- }
- /**
- * 根据年龄组名称获取营养推荐值
- *
- * @param nutrient 营养素名称
- * @param gender 性别 (男/女,当不需要区分性别时可传null)
- * @param ageGroup 年龄组名称
- * @return 对应的营养值 (带单位),未找到返回null
- */
- public static String getValue(String nutrient, String gender, String ageGroup) {
- // 获取标准化的年龄组
- String normalizedAgeGroup = normalizeAgeGroup(ageGroup);
- // 获取营养素数据
- Map<String, String> nutrientData = NUTRIENT_MAP.get(nutrient);
- if (nutrientData == null) return null;
- // 获取原始值
- String rawValue = nutrientData.get(normalizedAgeGroup);
- if (rawValue == null) return null;
- // 处理带斜杠的值
- if (rawValue.contains("/")) {
- // 处理孕妇中期/晚期
- if ("孕妇(中期/晚期)".equals(normalizedAgeGroup)) {
- String[] parts = rawValue.split(" ")[0].split("/");
- return parts.length > 1 ? parts[0] + " (中期)" + "/" + parts[1] + " (晚期)" : rawValue;
- }
- // 处理性别区分值
- if (gender != null && rawValue.contains("男") && rawValue.contains("女")) {
- return extractGenderSpecificValue(rawValue, gender);
- }
- }
- return rawValue;
- }
- // 根据年龄查找对应的年龄组
- private static String findAgeGroup(int age) {
- // 特殊处理婴儿(0岁)
- if (age == 0) return "0-6月";
- for (Map.Entry<String, AgeRange> entry : AGE_RANGE_MAP.entrySet()) {
- AgeRange range = entry.getValue();
- if (range.contains(age)) {
- return entry.getKey();
- }
- }
- return "18-49岁"; // 默认值
- }
- // 标准化年龄组
- private static String normalizeAgeGroup(String ageGroup) {
- if (AGE_RANGE_MAP.containsKey(ageGroup)) {
- return AGE_RANGE_MAP.get(ageGroup).groupName;
- }
- return ageGroup;
- }
- // 提取性别特定值
- private static String extractGenderSpecificValue(String rawValue, String gender) {
- // 分离值和单位
- String[] parts = rawValue.split(" ");
- String valuePart = parts[0];
- String unit = parts.length > 1 ? " " + parts[1] : "";
- Pattern pattern = Pattern.compile("男([^/]+)/女([^/]+)");
- Matcher matcher = pattern.matcher(valuePart);
- if (matcher.find()) {
- String maleValue = matcher.group(1).trim();
- String femaleValue = matcher.group(2).trim();
- return ("男".equals(gender) ? maleValue : femaleValue) + unit;
- }
- return rawValue;
- }
- // 获取所有支持查询的营养素列表
- public static String[] getAvailableNutrients() {
- return NUTRIENT_MAP.keySet().toArray(new String[0]);
- }
- }
|