|
@@ -2991,6 +2991,21 @@ insertSysConfigSeed("gift_membership_pay_price", "198000", "送会员商品达
|
|
|
createFatGoalTable();
|
|
createFatGoalTable();
|
|
|
addProductVendorVisibleColumn();
|
|
addProductVendorVisibleColumn();
|
|
|
|
|
|
|
|
|
|
+ // 迁移360: products 表添加健康约束字段(基础疾病禁忌/过敏原/药物相互作用标记)
|
|
|
|
|
+ addProductHealthConstraintColumns();
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移361: 创建 drug_interactions 表(药物-食物禁忌对照表)
|
|
|
|
|
+ createDrugInteractionsTable();
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移362: 创建 disease_intake_limits 表(疾病-饮食摄入阈值)
|
|
|
|
|
+ createDiseaseIntakeLimitsTable();
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移363: 初始化 drug_interactions 种子数据
|
|
|
|
|
+ seedDrugInteractionsData();
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移364: 初始化 disease_intake_limits 种子数据
|
|
|
|
|
+ seedDiseaseIntakeLimitsData();
|
|
|
|
|
+
|
|
|
// 指标统一层迁移(356~362)
|
|
// 指标统一层迁移(356~362)
|
|
|
migrateIndicatorDefinitionsColumns();
|
|
migrateIndicatorDefinitionsColumns();
|
|
|
migrateIndicatorValuesColumns();
|
|
migrateIndicatorValuesColumns();
|
|
@@ -12308,4 +12323,123 @@ log.info("迁移298: 已为无 openid 的 child 账号补齐 family_members 记
|
|
|
private void addProductVendorVisibleColumn() {
|
|
private void addProductVendorVisibleColumn() {
|
|
|
ensureColumn("products", "vendor_visible", "TINYINT(1) DEFAULT NULL COMMENT '是否仅供应商体系内用户可见(列表接口生效,直接分享可bypass)'");
|
|
ensureColumn("products", "vendor_visible", "TINYINT(1) DEFAULT NULL COMMENT '是否仅供应商体系内用户可见(列表接口生效,直接分享可bypass)'");
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移360: products 表添加健康约束字段(基础疾病禁忌/过敏原/药物相互作用标记)
|
|
|
|
|
+ private void addProductHealthConstraintColumns() {
|
|
|
|
|
+ ensureColumn("products", "contraindicated_diseases", "VARCHAR(255) DEFAULT NULL COMMENT '禁忌基础疾病,逗号分隔(如\"慢性肾病,肝病\")'");
|
|
|
|
|
+ ensureColumn("products", "allergen_tags", "VARCHAR(255) DEFAULT NULL COMMENT '过敏原标签,逗号分隔(如\"花生,小麦\")'");
|
|
|
|
|
+ ensureColumn("products", "drug_interaction_flags", "TINYINT DEFAULT 0 COMMENT '是否命中药物-食物相互作用(1=是,需对照drug_interactions表)'");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移361: 创建 drug_interactions 表(药物-食物禁忌对照表)
|
|
|
|
|
+ private void createDrugInteractionsTable() {
|
|
|
|
|
+ try {
|
|
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS drug_interactions (" +
|
|
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
|
|
+ "drug_class VARCHAR(50) NOT NULL COMMENT '药物类别(如CCB/他汀/抗凝药/抗生素/铁剂/甲状腺药/利尿剂/MAOI/头孢/降糖药)', " +
|
|
|
|
|
+ "drug_specifics VARCHAR(100) NOT NULL COMMENT '具体药名(如硝苯地平/华法林)', " +
|
|
|
|
|
+ "interacting_subst VARCHAR(100) NOT NULL COMMENT '禁忌/需间隔的食材或成分(如西柚/维生素K)', " +
|
|
|
|
|
+ "risk_level TINYINT NOT NULL COMMENT '1=拦截 2=警告 3=需间隔', " +
|
|
|
|
|
+ "action_type VARCHAR(20) NOT NULL COMMENT 'block=硬拦截 warn=软警告 space=间隔', " +
|
|
|
|
|
+ "interval_minutes INT DEFAULT NULL COMMENT '需间隔时长(分钟)', " +
|
|
|
|
|
+ "note VARCHAR(255) COMMENT '风险说明', " +
|
|
|
|
|
+ "UNIQUE KEY uk_drug_food (drug_class, drug_specifics, interacting_subst), " +
|
|
|
|
|
+ "INDEX idx_interacting (interacting_subst)" +
|
|
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='药物-食物禁忌对照表'");
|
|
|
|
|
+ log.info("迁移361: 已创建drug_interactions表");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("迁移361: 创建drug_interactions表失败: {}", e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移362: 创建 disease_intake_limits 表(疾病-饮食摄入阈值)
|
|
|
|
|
+ private void createDiseaseIntakeLimitsTable() {
|
|
|
|
|
+ try {
|
|
|
|
|
+ jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS disease_intake_limits (" +
|
|
|
|
|
+ "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
|
|
|
|
|
+ "disease_type VARCHAR(50) NOT NULL COMMENT '疾病类型(慢性肾病/糖尿病/高血压/痛风/肝病/甲状腺疾病)', " +
|
|
|
|
|
+ "nutrient VARCHAR(20) NOT NULL COMMENT '校验营养素(protein/potassium/phosphorus/sodium/carb/glycemic/fructose/purine/alcohol/iodine)', " +
|
|
|
|
|
+ "unit VARCHAR(20) NOT NULL COMMENT '单位', " +
|
|
|
|
|
+ "threshold_max DECIMAL(8,2) DEFAULT NULL COMMENT '每日上限', " +
|
|
|
|
|
+ "threshold_min DECIMAL(8,2) DEFAULT NULL COMMENT '每日下限', " +
|
|
|
|
|
+ "block_foods VARCHAR(500) DEFAULT NULL COMMENT '硬拦截食材列表,逗号分隔(如杨桃)', " +
|
|
|
|
|
+ "stage_dependent TINYINT(1) DEFAULT 0 COMMENT '是否按病情分期(1=是 0=否)', " +
|
|
|
|
|
+ "INDEX idx_disease_nutrient (disease_type, nutrient)" +
|
|
|
|
|
+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='疾病-饮食摄入校验阈值表'");
|
|
|
|
|
+ log.info("迁移362: 已创建disease_intake_limits表");
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("迁移362: 创建disease_intake_limits表失败: {}", e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移363: 初始化 drug_interactions 种子数据(高危组合,幂等)
|
|
|
|
|
+ private void seedDrugInteractionsData() {
|
|
|
|
|
+ String[][] seed = {
|
|
|
|
|
+ {"CCB", "硝苯地平", "西柚", "1", "block", "0", "西柚抑制药物代谢酶,血药浓度升高数倍,低血压风险,服药期间完全避免"},
|
|
|
|
|
+ {"CCB", "氨氯地平", "西柚", "1", "block", "0", "西柚抑制药物代谢酶,血药浓度升高数倍,低血压风险,服药期间完全避免"},
|
|
|
|
|
+ {"他汀类", "辛伐他汀", "西柚", "1", "block", "0", "增加肌肉损伤、肝损伤风险"},
|
|
|
|
|
+ {"他汀类", "阿托伐他汀", "西柚", "1", "block", "0", "增加肌肉损伤、肝损伤风险"},
|
|
|
|
|
+ {"抗凝药", "华法林", "维生素K", "2", "warn", "0", "维K拮抗药效,摄入量保持稳定,调整饮食结构前先与医生沟通"},
|
|
|
|
|
+ {"抗凝药", "华法林", "大蒜", "2", "warn", "0", "大蒜可能增强抗凝作用,增加出血风险"},
|
|
|
|
|
+ {"抗生素", "四环素", "牛奶", "3", "space", "120", "钙与药物结合影响吸收,需间隔2小时以上"},
|
|
|
|
|
+ {"抗生素", "喹诺酮类", "牛奶", "3", "space", "120", "钙与药物结合影响吸收,需间隔2小时以上"},
|
|
|
|
|
+ {"抗生素", "喹诺酮类", "钙剂", "3", "space", "120", "钙与药物结合影响吸收,需间隔2小时以上"},
|
|
|
|
|
+ {"铁剂", "硫酸亚铁", "茶", "3", "space", "60", "鞣酸抑制铁吸收,需间隔1-2小时"},
|
|
|
|
|
+ {"铁剂", "硫酸亚铁", "咖啡", "3", "space", "60", "鞣酸抑制铁吸收,需间隔1-2小时"},
|
|
|
|
|
+ {"铁剂", "硫酸亚铁", "钙剂", "3", "space", "60", "钙抑制铁吸收,需间隔1-2小时"},
|
|
|
|
|
+ {"铁剂", "硫酸亚铁", "牛奶", "3", "space", "60", "钙抑制铁吸收,需间隔1-2小时"},
|
|
|
|
|
+ {"甲状腺药", "左甲状腺素", "豆浆", "3", "space", "240", "影响吸收,需间隔4小时"},
|
|
|
|
|
+ {"甲状腺药", "左甲状腺素", "高纤维食物", "3", "space", "240", "影响吸收,需间隔4小时"},
|
|
|
|
|
+ {"甲状腺药", "左甲状腺素", "钙剂", "3", "space", "240", "影响吸收,需间隔4小时"},
|
|
|
|
|
+ {"保钾利尿剂", "螺内酯", "高钾食物", "2", "warn", "0", "高钾血症风险,避免香蕉、橙汁、低钠盐大量集中摄入"},
|
|
|
|
|
+ {"MAOI", "苯乙肼", "发酵食品", "2", "warn", "0", "酪胺反应可致血压骤升,避免奶酪/豆豉/腌制品/陈年食品"},
|
|
|
|
|
+ {"头孢类", "头孢类", "酒精", "1", "block", "0", "双硫仑样反应,严重可危及生命"},
|
|
|
|
|
+ {"甲硝唑", "甲硝唑", "酒精", "1", "block", "0", "双硫仑样反应,严重可危及生命"},
|
|
|
|
|
+ {"降糖药", "磺脲类", "酒精", "1", "block", "0", "低血糖风险,避免空腹饮酒"}
|
|
|
|
|
+ };
|
|
|
|
|
+ for (String[] row : seed) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ Integer cnt = jdbcTemplate.queryForObject(
|
|
|
|
|
+ "SELECT COUNT(*) FROM drug_interactions WHERE drug_class=? AND drug_specifics=? AND interacting_subst=?",
|
|
|
|
|
+ Integer.class, row[0], row[1], row[2]);
|
|
|
|
|
+ if (cnt != null && cnt > 0) continue;
|
|
|
|
|
+ jdbcTemplate.update(
|
|
|
|
|
+ "INSERT INTO drug_interactions (drug_class, drug_specifics, interacting_subst, risk_level, action_type, interval_minutes, note) VALUES (?,?,?,?,?,?,?)",
|
|
|
|
|
+ row[0], row[1], row[2], Integer.valueOf(row[3]), row[4], Integer.valueOf(row[5]), row[6]);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("迁移363: 插入drug_interactions种子失败: {}", e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ log.info("迁移363: drug_interactions种子数据初始化完成");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 迁移364: 初始化 disease_intake_limits 种子数据(幂等)
|
|
|
|
|
+ private void seedDiseaseIntakeLimitsData() {
|
|
|
|
|
+ String[][] seed = {
|
|
|
|
|
+ {"慢性肾病", "protein", "g/kg/day", "0.8", "0.6", "杨桃", "1"},
|
|
|
|
|
+ {"慢性肾病", "potassium", "mmol/L/day", "5.0", "3.5", "杨桃,香蕉,橙子,土豆,菠菜,菌菇", "1"},
|
|
|
|
|
+ {"慢性肾病", "phosphorus", "mg/day", "800", "600", "杨桃,奶制品,坚果,加工食品", "1"},
|
|
|
|
|
+ {"糖尿病", "carb", "g/meal", "75", "30", "", "0"},
|
|
|
|
|
+ {"糖尿病", "fructose", "g/day", "50", "0", "含糖饮料,果汁,蜂蜜,甜点", "0"},
|
|
|
|
|
+ {"高血压", "sodium", "g/day", "5", "2", "腌菜,酱菜,酱油,加工肉制品,挂面,咸味零食", "0"},
|
|
|
|
|
+ {"痛风", "purine", "mg/day", "300", "150", "动物内脏,部分海鲜,浓肉汤", "0"},
|
|
|
|
|
+ {"痛风", "fructose", "g/day", "50", "0", "含糖饮料,蜂蜜", "0"},
|
|
|
|
|
+ {"肝病", "protein", "g/kg/day", "1.0", "0.5", "", "1"},
|
|
|
|
|
+ {"甲状腺疾病", "iodine", "ug/day", "300", "150", "海带,紫菜", "0"}
|
|
|
|
|
+ };
|
|
|
|
|
+ for (String[] row : seed) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ Integer cnt = jdbcTemplate.queryForObject(
|
|
|
|
|
+ "SELECT COUNT(*) FROM disease_intake_limits WHERE disease_type=? AND nutrient=?",
|
|
|
|
|
+ Integer.class, row[0], row[1]);
|
|
|
|
|
+ if (cnt != null && cnt > 0) continue;
|
|
|
|
|
+ jdbcTemplate.update(
|
|
|
|
|
+ "INSERT INTO disease_intake_limits (disease_type, nutrient, unit, threshold_max, threshold_min, block_foods, stage_dependent) VALUES (?,?,?,?,?,?,?)",
|
|
|
|
|
+ row[0], row[1], row[2], row[3], row[4], row[5], Integer.valueOf(row[6]));
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.warn("迁移364: 插入disease_intake_limits种子失败: {}", e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ log.info("迁移364: disease_intake_limits种子数据初始化完成");
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|