Browse Source

feat: 更新算法设计和穴位管理枚举字段

- 新算法:基于身体比例计算穴位位置(替代固定寸值)
- 新增参照位置表(胸椎C7-L5棘突偏移)
- 穴位管理基于智能穴位识别数据模型
- 新增经络枚举15个、身体部位枚举8个、部位分区枚举58个
- 部位分区按身体部位联动过滤
caitianqi 5 months ago
parent
commit
938860e297

BIN
需求工作区/需求材料/~$智能穴位识别数据模型.xlsx


BIN
需求工作区/需求材料/智能穴位识别数据模型.xlsx


+ 262 - 65
需求工作区/需求设计文档/智能穴位定位系统设计文档.md

@@ -543,53 +543,129 @@ interface ExpertStep {
 
 ## 四、核心算法设计
 
-### 4.1 指寸估算算法
+### 4.1 新算法设计思路(基于身体比例)
 
-当用户未提供指寸数据时,根据肩宽和身长估算:
-- **男性**:肩宽权重 0.6,身长权重 0.4
-- **女性**:肩宽权重 0.4,身长权重 0.6
+**核心思路**:不以固定"寸"为单位计算,而是基于人体标准参照系,通过用户身体比例计算穴位位置。
+
+**新算法流程**:
+
+```
+1. 标准人定义
+   ├── 定义标准身高男性:175cm,标准身高女性:165cm
+   ├── 定义标准坐高(含头部):85cm(男),78cm(女)
+   └── 定义标准肩宽:42cm(男),36cm(女)
+
+2. 参照位置定位(骨骼定位点)
+   ├── 大椎穴(第7颈椎棘突)- 基准点
+   ├── 第1-7胸椎棘突定位
+   ├── 肩胛骨定位
+   ├── 髂棘定位
+   └── 其他解剖学参照点
+
+3. 计算用户身体比例
+   ├── 纵向比例 = 用户坐高 / 标准坐高
+   ├── 横向比例 = 用户肩宽 / 标准肩宽
+   └── 组合比例 = 纵向×0.6 + 横向×0.4(性别区分权重)
+
+4. 计算用户参照位置
+   ├── 大椎穴设备坐标(由设备传感器检测)
+   ├── 其他胸椎对应用户位置 = 标准位置 × 用户比例
+
+5. 计算穴位实际坐标
+   ├── 读取穴位定位描述(如:第3胸椎棘突下,旁开1.5寸)
+   ├── 计算相对于参照点的偏移 = 描述值 × 用户组合比例
+   └── 转换为设备坐标
+```
+
+---
+
+### 4.2 身体比例系数计算
 
 ```typescript
-function estimateFingerWidth(
-  shoulderWidth: number,
-  bodyLength: number,
+// 标准人体数据
+const STANDARD_BODY = {
+  male: {
+    height: 175,        // cm,身高
+    sittingHeight: 88,  // cm,坐高(含头部)
+    shoulderWidth: 42,  // cm,肩宽
+    cervicalHeight: 145  // cm,大椎穴高度(颈后最突出点)
+  },
+  female: {
+    height: 165,
+    sittingHeight: 80,
+    shoulderWidth: 36,
+    cervicalHeight: 135
+  }
+};
+
+// 标准参照位置(以大椎穴为基准的相对偏移,单位:cm)
+const REFERENCE_POINTS = {
+  // 颈椎棘突序列(相对大椎穴的偏移)
+  C6: { offsetFromDazhui: -2.5, remark: "第6颈椎棘突" },   // 大椎穴下约2.5cm
+  C7: { offsetFromDazhui: 0, remark: "第7颈椎棘突(大椎穴)" },
+  C8: { offsetFromDazhui: 2.5, remark: "第8颈椎棘突" },
+  T1: { offsetFromDazhui: 5, remark: "第1胸椎棘突" },
+  T2: { offsetFromDazhui: 7.5, remark: "第2胸椎棘突" },
+  T3: { offsetFromDazhui: 10, remark: "第3胸椎棘突" },
+  T4: { offsetFromDazhui: 12.5, remark: "第4胸椎棘突" },
+  T5: { offsetFromDazhui: 15, remark: "第5胸椎棘突" },
+  T6: { offsetFromDazhui: 17.5, remark: "第6胸椎棘突" },
+  T7: { offsetFromDazhui: 20, remark: "第7胸椎棘突(至阳穴)" },
+  T8: { offsetFromDazhui: 22.5, remark: "第8胸椎棘突" },
+  T9: { offsetFromDazhui: 25, remark: "第9胸椎棘突" },
+  T10: { offsetFromDazhui: 27.5, remark: "第10胸椎棘突" },
+  T11: { offsetFromDazhui: 30, remark: "第11胸椎棘突" },
+  T12: { offsetFromDazhui: 32.5, remark: "第12胸椎棘突" },
+  L1: { offsetFromDazhui: 35, remark: "第1腰椎棘突" },
+  L2: { offsetFromDazhui: 37.5, remark: "第2腰椎棘突(命门穴)" },
+  L3: { offsetFromDazhui: 40, remark: "第3腰椎棘突" },
+  L4: { offsetFromDazhui: 42.5, remark: "第4腰椎棘突(腰阳关穴)" },
+  L5: { offsetFromDazhui: 45, remark: "第5腰椎棘突" }
+};
+
+// 计算用户身体比例系数
+function calculateBodyProportion(
+  userData: UserBodyData,
   gender: 'male' | 'female'
-): FingerWidth {
-  const STANDARD = {
-    male: {
-      shoulderWidth: 42,      // 男性平均肩宽(厘米)
-      bodyLength: 85,         // 男性平均坐高(厘米)
-      cun1: 2.2,              // 男性一寸约2.2cm
-      cun1_5: 3.3,            // 男性1.5寸约3.3cm
-      cun3: 6.5,              // 男性三寸约6.5cm
-      shoulderWeight: 0.6,    // 肩宽权重
-      lengthWeight: 0.4       // 身长权重
-    },
-    female: {
-      shoulderWidth: 36,      // 女性平均肩宽(厘米)
-      bodyLength: 78,         // 女性平均坐高(厘米)
-      cun1: 1.9,              // 女性一寸约1.9cm
-      cun1_5: 2.8,            // 女性1.5寸约2.8cm
-      cun3: 5.6,              // 女性三寸约5.6cm
-      shoulderWeight: 0.4,    // 肩宽权重
-      lengthWeight: 0.6       // 身长权重
-    }
+): BodyProportion {
+  const std = STANDARD_BODY[gender];
+  
+  const heightRatio = userData.bodyLength / std.sittingHeight;
+  const shoulderRatio = userData.shoulderWidth / std.shoulderWidth;
+  
+  // 性别权重
+  const heightWeight = gender === 'male' ? 0.6 : 0.4;
+  const shoulderWeight = 1 - heightWeight;
+  
+  // 综合比例系数
+  const combinedRatio = heightRatio * heightWeight + shoulderRatio * shoulderWeight;
+  
+  return {
+    heightRatio,        // 纵向比例
+    shoulderRatio,     // 横向比例
+    combinedRatio,    // 综合比例
+    gender
   };
+}
 
-  const ref = STANDARD[gender];
-  const widthScale = shoulderWidth / ref.shoulderWidth;
-  const lengthScale = bodyLength / ref.bodyLength;
+// 根据比例和定位描述计算穴位坐标
+function calculateAcupointPosition(
+  description: AcupointDescription,  // 穴位定位描述(来自穴位数据模型)
+  dazhuiPosition: DeviceCoordinate,      // 大椎穴设备坐标
+  bodyProportion: BodyProportion     // 用户身体比例
+): DeviceCoordinate {
+  const ratio = bodyProportion.combinedRatio;
   
-  const weightedScale = 
-    widthScale * ref.shoulderWeight + 
-    lengthScale * ref.lengthWeight;
-
-  const estimatedCun1 = ref.cun1 * weightedScale;
+  // 从定位描述中提取数值
+  // 例如:"第3胸椎棘突下,旁开1.5寸"
+  // → 胸椎编号: T3,offsetFromDazhui: 10cm, lateralOffset: 1.5寸
+  const vertebralOffset = description.vertebralOffset * ratio;
+  const lateralOffset = description.lateralCun * ratio * STD_CUN_VALUE;
   
   return {
-    cun1: estimatedCun1,
-    cun1_5: estimatedCun1 * 1.5,
-    cun3: estimatedCun1 * 3
+    x: dazhuiPosition.x + lateralOffset,
+    y: dazhuiPosition.y - vertebralOffset,  // Y轴向下为负
+    z: dazhuiPosition.z
   };
 }
 ```
@@ -1626,38 +1702,53 @@ interface UserAcupointTable {
 
 ---
 
-### 7.2 穴位管理
+### 7.2 穴位管理(基于智能穴位识别数据模型)
 
 #### 功能说明
 
-管理员维护系统穴位库,包括基础穴位信息(穴位名称、经络、功效、定位参数)和艾灸手法(一键艾灸、温和灸、雀啄灸、回旋灸等)。支持新增穴位、编辑穴位信息、设置穴位定位参数。专家方案中出现的新穴位会自动添加(状态:待完善),管理员需补充完善穴位信息后方可正式启用
+管理员维护系统穴位库,基于《智能穴位识别数据模型.xlsx》文档结构。穴位数��包含:身体部位、部位分区、胸椎编号、棘突下定位、后正中线旁开尺寸等详细信息。算法通过这些定位参数+用户身体比例计算穴位坐标
 
 **使用角色**:系统管理员
 
+**数据结构来源**:《智能穴位识别数据模型.xlsx》- 穴位数据模型
+- 身体部位(胸部、背部、上肢、下肢等)
+- 部位分区(前胸区、背部、腰部等)
+- 胸椎编号(T1-T12, L1-L5等)
+- 棘突下偏移值(cm)
+- 后正中线旁开值(寸)
+- 定位描述文本
+
 **使用场景**:
-- 管理员维护基础穴位库(12个常用穴位)
-- 管理员审核自动新增的穴位(待完善状态),补充经络、功效、定位参数
+- 管理员维护穴位基础数据(从Excel导入或手动录入
+- 管理员审核自动新增的穴位(待完善状态),补充定位参数
 - 管理员配置艾灸手法参数(温度范围、运动模式)
-- 管理员扩展新增穴位以支持更多治疗方案
+- 算法调用穴位定位数据进行坐标计算
 
 ---
 
-#### 穴位列表
+#### 穴位列表(按身体部位分类)
 
-| 多选框 | 序号 | 穴位ID | 穴位名称 | 所属经络 | 功效 | 定位方式 | 状态 | 操作 |
-|--------|------|--------|----------|----------|------|----------|------|------|
-| ☐ | 1 | dazhui | 大椎穴 | 督脉 | 驱寒、祛湿 | 相对定位 | 活跃 | 查看/编辑/删除 |
-| ☐ | 2 | fengmen | 风门穴 | 足太阳膀胱经 | 祛风解表 | 相对定位 | 活跃 | 查看/编辑/删除 |
-| ☐ | 3 | weizhong | 委中穴 | - | 待完善 | 待完善 | 待完善 | 完善/编辑/删除 |
+| 多选框 | 序号 | 穴位编号 | 穴位名称 | 单/双穴 | 所属经络 | 身体部位 | 部位分区 | 胸椎编号 | 状态 | 操作 |
+|--------|------|----------|----------|---------|----------|----------|----------|----------|------|
+| ☐ | 1 | feijing-01 | 中府 | 双穴 | 手太阴肺经 | 胸部 | 前胸区 | - | 活跃 | 查看/编辑 |
+| ☐ | 2 | jingwai-20 | 定喘 | 双穴 | 经外奇穴 | 背部 | 背部 | C7 | 活跃 | 查看/编辑 |
+| ☐ | 3 | dumai-14 | 大椎 | 单穴 | 督脉 | 背部 | 背部 | C7 | 活跃 | 查看/编辑 |
 
-#### 列表查询条件
+**列表查询条件**:
 
 | 查询字段 | 类型 | 说明 |
 |----------|------|------|
 | 穴位名称 | 文本输入 | 支持模糊搜索 |
-| 所属经络 | 下拉选择 | 全部 / 督脉 / 足太阳膀胱经 / 手太阳小肠经 / 其他 |
-| 定位方式 | 下拉选择 | 全部 / 相对定位 / 绝对定位 |
-| 状态 | 下拉选择 | 全部 / 活跃 / 待完善 |
+| 所属经络 | 下拉选择 | 全部 / 督脉 / 膀胱经 / 小肠经 / 肺经 / 肝经 / 胆经 / 任脉 / 经外奇穴 |
+| 身体部位 | 下拉选择 | 全部 / 头部 / 颈部 / 背部 / 胸部 / 腹部 / 上肢 / 下肢 |
+| 部位分区 | 下拉选择 | 按身体部位联动 |
+| 胸椎编号 | 下拉选择 | 全部 / C1-C7 / T1-T12 / L1-L5 |
+| 状态 | 下拉选择 | 全部 / 活跃 / 待完善 / 禁用 |
+
+**艾灸椅适用筛选**:
+| 字段 | 类型 | 说明 |
+|------|------|------|
+| 艾灸椅产品穴位 | 下拉选择 | 全部 / 是 / 否 |
 
 **查询规则**:
 - 点击【查询】按钮:根据输入条件筛选列表
@@ -1667,29 +1758,33 @@ interface UserAcupointTable {
 
 | 按钮 | 功能说明 |
 |------|----------|
-| 导入 | 批量导入穴位数据(提供Excel模板下载) |
+| 导入 | 从《智能穴位识别数据模型.xlsx》导入穴位数据 |
 | 导出 | 导出穴位库数据为Excel文件 |
 | 新增 | 进入新增穴位界面 |
 | 批量删除 | 选中多条记录后批量删除(需二次确认) |
 
-#### 新增/编辑操作
+#### 新增/编辑操作(基于数据模型结构)
 
 **新增穴位表单字段**:
 
 | 字段名 | 类型 | 必填 | 验证规则 | 说明 |
 |--------|------|------|----------|------|
-| 穴位名称 | 文本 | 是 | 最长50字符 | 如:合谷穴 |
-| 所属经络 | 下拉选择 | 是 | 从经络库选择 | 督脉/膀胱经/小肠经/胃经/其他 |
-| 功效描述 | 多选标签 | 是 | 至少选1项 | 驱寒/祛湿/祛风/化瘀/活血/化痰/养颜/扶阳 |
-| 定位方式 | 单选 | 是 | 相对定位 / 绝对定位 | - |
-| 相对大椎穴纵向偏移 | 数字 | 定位方式为相对时必填 | - | 单位:寸(一寸类型) |
-| 相对大椎穴横向偏移 | 数字 | 否 | - | 单位:寸(一寸类型),双侧穴位必填 |
+| 穴位编号 | 文本 | 是 | 唯一性,如:dumai-14 | 系统编码 |
+| 穴位名称 | 文本 | 是 | 最长50字符 | 如:大椎穴 |
+| 单/双穴 | 单选 | 是 | 单穴 / 双穴 | - |
+| 所属经络 | 下拉选择 | 是 | 枚举值(见下方经络表) | 从经络枚举选择 |
+| 身体部位 | 下拉选择 | 是 | 枚举值(见下方部位表) | 从身体部位枚举选择 |
+| 部位分区 | 下拉选择 | 是 | 枚举值(见下方分区表) | 按身体部位联动筛选 |
+| 胸椎编号 | 下拉选择 | 否 | C1-C7/T1-T12/L1-L5 | 参照位置表编号 |
+| 棘突下偏移(cm) | 数字 | 否 | 0-50 | 相对大椎穴的纵向偏移 |
+| 后正中线旁开(寸) | 数字 | 否 | 0-10 | 横向偏移 |
+| 寸类型 | 下拉选择 | 否 | 一寸 / 1.5寸 / 3寸 | 旁开值的寸类型 |
 | 侧别 | 单选 | 是 | 中心 / 左侧 / 右侧 / 双侧 | - |
-| 指寸类型 | 下拉选择 | 定位方式为相对时必填 | 一寸 / 1.5寸 / 三寸 | - |
-| 绝对坐标X | 数字 | 定位方式为绝对时必填 | - | 单位:mm |
-| 绝对坐标Y | 数字 | 定位方式为绝对时必填 | - | 单位:mm |
-| 绝对坐标Z | 数字 | 定位方式为绝对时必填 | - | 单位:mm |
+| 定位描述 | 文本域 | 是 | - | 完整的定位文字描述 |
+| 主管疾病 | 文本域 | 是 | - | 主治功效描述 |
 | 适用性别 | 单选 | 是 | 不限 / 仅男 / 仅女 | - |
+| 艾灸椅产品穴位 | 单选 | 是 | 是 / 否 | 是否在艾灸椅产品中使用 |
+| 状态 | 单选 | 是 | 活跃 / 待完善 / 禁用 | - |
 
 **操作按钮**:
 | 按钮 | 功能说明 |
@@ -1697,6 +1792,108 @@ interface UserAcupointTable {
 | 保存 | 保存穴位信息 |
 | 取消 | 放弃编辑,返回列表 |
 
+#### 参照位置表(新增 - 骨骼定位点)
+
+**功能说明**:维护身体参照位置,用于算法计算。标准人的脊椎棘突序列定位。
+
+**参照位置列表**:
+
+| 编号 | 名称 | 相对大椎穴偏移(cm) | 说明 |
+|------|------|-------------------|------|
+| C7 | 第7颈椎棘突(大椎穴) | 0 | 基准点,颈后最突出点 |
+| C6 | 第6颈椎棘突 | 2.5 | 大椎穴上方约2.5cm |
+| T1 | 第1胸椎棘突 | 5 | 大椎穴下方约5cm |
+| T2 | 第2胸椎棘突 | 7.5 | - |
+| T3 | 第3胸椎棘突 | 10 | 身柱穴区域 |
+| T4 | 第4胸椎棘突 | 12.5 | - |
+| T5 | 第5胸椎棘突 | 15 | - |
+| T6 | 第6胸椎棘突 | 17.5 | - |
+| T7 | 第7胸椎棘突 | 20 | 至阳穴区域 |
+| T8 | 第8胸椎棘突 | 22.5 | - |
+| T9 | 第9胸椎棘突 | 25 | - |
+| T10 | 第10胸椎棘突 | 27.5 | 中枢穴区域 |
+| T11 | 第11胸椎棘突 | 30 | - |
+| T12 | 第12胸椎棘突 | 32.5 | - |
+| L1 | 第1腰椎棘突 | 35 | 悬枢穴区域 |
+| L2 | 第2腰椎棘突 | 37.5 | 命门穴区域 |
+| L3 | 第3腰椎棘突 | 40 | - |
+| L4 | 第4腰椎棘突 | 42.5 | 腰阳关穴区域 |
+| L5 | 第5腰椎棘突 | 45 | - |
+
+**操作按钮**:仅维护,不可删除(系统基础数据)
+
+---
+
+#### 枚举字段表(系统基础数据)
+
+**数据来源**:《智能穴位识别数据模型.xlsx》导出枚举值
+
+**经络枚举表(15个)**:
+
+| 编号 | 经络名称 |
+|------|----------|
+| 1 | 任脉 |
+| 2 | 手厥阴心包经 |
+| 3 | 手太阳小肠经 |
+| 4 | 手太阴心经 |
+| 5 | 手太阴肺经 |
+| 6 | 手少阴三焦经 |
+| 7 | 手阳明大肠经 |
+| 8 | 督脉 |
+| 9 | 经外奇穴 |
+| 10 | 足厥阴肝经 |
+| 11 | 足太阳膀胱经 |
+| 12 | 足太阴脾经 |
+| 13 | 足少阳胆经 |
+| 14 | 足少阴肾经 |
+| 15 | 足阳明胃经 |
+
+**身体部位枚举表(8个)**:
+
+| 编号 | 身体部位 |
+|------|----------|
+| 1 | 上肢 |
+| 2 | 下肢 |
+| 3 | 会阴 |
+| 4 | 头部 |
+| 5 | 背部 |
+| 6 | 胸部 |
+| 7 | 腹部 |
+| 8 | 颈部 |
+
+**部位分区枚举表(58个,按身体部位联动)**:
+
+| 身体部位 | 可选部位分区 |
+|----------|-----------|
+| 头部 | 面部、头后部 |
+| 颈部 | 颈部前区、颈后部、颈外侧区 |
+| 背部 | 背部、肩胛区、腰部、骶区、臀部 |
+| 胸部 | 前胸区、侧胸区、胸外侧区 |
+| 腹部 | 上腹部、下腹部、侧腹区、腹股沟 |
+| 上肢 | 肩部、上臂前区、上臂后区、上臂内侧区、上臂外侧区、肘部前区、肘部后区、肘内侧区、肘部外侧区、前臂前区、前臂后区、前臂内侧区、前臂外侧区、手腕前区、手腕后区、手腕内侧区、手腕背区、手掌、手背、手内侧区、手外侧、手指 |
+| 下肢 | 股前区、股后区、股内侧区、股外侧区、膝部前区、膝后区、膝内侧区、膝外侧区、小腿前区、小腿后区、小腿内侧区、小腿外侧区、踝前区、踝内侧区、踝外侧区、足背区、足底、足跖内区、足跖外区、足趾区 |
+| 会阴 | 会阴区 |
+
+**部位分区联动关系**:
+
+| 用户选择的身体部位 | 系统自动过滤的部位分区选项 |
+|----------------|------------------------|
+| 头部 | 面部、头后部 |
+| 颈部 | 颈部前区、颈后部、颈外侧区 |
+| 背部 | 背部、肩胛区、腰部、骶区、臀部 |
+| 胸部 | 前胸区、侧胸区、胸外侧区 |
+| 腹部 | 上腹部、下腹部、侧腹区、腹股沟 |
+| 上肢 | 肩部、上臂前区、上臂后区、上臂内侧区、上臂外侧区、肘部前区、肘部后区、肘内侧区、肘部外侧区、前臂前区、前臂后区、前臂内侧区、前臂外侧区、手腕前区、手腕后区、手腕内侧区、手腕背区、手掌、手背、手内侧区、手外侧、手指 |
+| 下肢 | 股前区、股后区、股内侧区、股外侧区、膝部前区、膝后区、膝内侧区、膝外侧区、小腿前区、小腿后区、小腿内侧区、小腿外侧区、踝前区、踝内侧区、踝外侧区、足背区、足底、足跖内区、足跖外区、足趾区 |
+| 会阴 | 会阴区 |
+
+---
+
+**枚举表维护说明**:
+- 管理员可在后台"系统管理-枚举维护"中管理经络、身体部位、��位分区数据
+- 部位分区与身体部位联动,选择身体部位后,部位分区下拉列表自动过滤
+- 导入穴位数据时自动匹配枚举值,未匹配的新值可由管理员增补
+
 ---
 
 #### 艾灸手法列表