chenyc
2025-12-09 65e034683b28d799e73c7d7e5e4769fab5b9bc9c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
/**
 * 参数解析和转换模块
 * 负责参数字典、数据转换和关键数据提取
 */
 
// 费森透析机 5008S 参数字典 - 根据实际机器数据修正对照
const PARAMETER_DICT = {
  // 设备信息 (3个)
  'TSSRNB': '设备编号',                    // 8VSAGC00
  'DMBLDN': '设备型号',                    // 5008S
  'TSSSWV': '软件版本',                    // 450
  
  // 超滤参数 (3个)
  'DSUFVO': '超滤目标体积(ml)',             // 400
  'DCUFVO': '累计超滤量(ml)',               // 累计值
  'DSUFRA': '超滤速率设置(%)',              // 设置值
  
  // 治疗时长 (1个)
  'DCUFTM': '治疗时长(分钟)',              // 240
  
  // 透析液参数 (5个)
  'DSDLFW': '透析液流量设置(%)',            // 100
  'DCDAFL': '透析液流量实际(ml/min)',        // 实际值
  'DSDITP': '透析液温度设置(℃)',           // 385->38.5
  'DCNACV': '处方钠浓度(mmol/L)',           // 1380->138
  'DCENDC': '电导度(mS/cm)',               // 18->1.8
  
  // 血液/血流参数 (6个)
  'DCBLFL': '血流量(ml/min)',               // 240
  'DCTVBF': '有效血流量(ml/min)',           // 240
  'DCPRBV': '透析血容量(ml)',               // 2430
  'DCRIVO': '累计回血流量(ml)',             // 累计值230ml
  'DCPLNA': '血浆钠浓度(mmol/L)',            // 1370->137
  'DCCLMA': '清除率(ml/min)',               // 128
  
  // 质量指标 (2个)
  'DCEFKT': '即时KT',                     // KT即时值
  'DSTKTV': '设置目标KTV',                  // KTV目标值
  
  // 电解质参数 (1个)
  'DSNABI': '碳酸氢盐(BIC)浓度(mmol/L)',    // 315->31.5
  
  // 压力参数 (3个)
  'DCARPR': '动脉压(mmHg)',                 // 45
  'DCVEPR': '静脉压(mmHg)',                 // 65
  'DCTMPV': '跨膜压(TMP)(mmHg)',            // 20
  
  // 膜型参数 (1个)
  'DSFITY': '透析膜型号',                   // FX80
  
  // 状态参数 (2个)
  'DCRDST': '运行状态',
  'TSALST': '报警状态',                     // 0=正常 9=静脉压上限报警 11=动脉压上线报警 12=动脉压下行报警
  
  // 置换参数 (3个)
  'DCXESV': '预计置换液目标(L)',            // 预期目标
  'DCHDRA': '置换速率(ml/h)',               // 置换液速率
  'DCHDFV': '置换容量(L)'                   // 置换液容量
};
 
// 数据值转换规则 - 某些参数需要特殊转换 (9个转换规则)
const VALUE_CONVERTERS = {
  // ÷10 的参数 (7个)
  'DCNACV': (val) => val ? (parseInt(val) / 10).toFixed(1) : '-',  // 1380 -> 138
  'DCPLNA': (val) => val ? (parseInt(val) / 10).toFixed(1) : '-',  // 1370 -> 137
  'DSDITP': (val) => val ? (parseInt(val) / 10).toFixed(1) : '-',  // 385 -> 38.5
  'DSNABI': (val) => val ? (parseInt(val) / 10).toFixed(1) : '-',  // 315 -> 31.5
  'DCENDC': (val) => val ? (parseInt(val) / 10).toFixed(1) : '-',  // 18 -> 1.8
  'DCEFKT': (val) => val ? (parseInt(val) / 10).toFixed(1) : '-',  // KT即时值
  'DCXESV': (val) => val ? (parseInt(val) / 10).toFixed(1) : '-',  // 预计置换液目标
  
  // ÷100 的参数 (1个)
  'DSTKTV': (val) => val ? (parseInt(val) / 100).toFixed(2) : '-', // 130 -> 1.30
  
  // ÷1000 的参数 (1个)
  'DCHDFV': (val) => val ? (parseInt(val) / 1000).toFixed(1) : '-'  // 置换容量
};
 
class ParameterParser {
  /**
   * 获取参数字典
   */
  static getParameterDict() {
    return PARAMETER_DICT;
  }
 
  /**
   * 获取值转换器
   */
  static getValueConverters() {
    return VALUE_CONVERTERS;
  }
 
  /**
   * 根据参数ID和值进行转换
   * @param {string} paramId - 参数ID
   * @param {string} value - 参数值
   */
  static convertValue(paramId, value) {
    if (VALUE_CONVERTERS[paramId]) {
      return VALUE_CONVERTERS[paramId](value);
    }
    return value;
  }
 
  /**
   * 从XML字符串提取属性
   * @param {string} xml - XML字符串
   * @param {string} attr - 属性名
   */
  static extractAttribute(xml, attr) {
    const regex = new RegExp(`${attr}="([^"]*)"`, 'i');
    const match = xml.match(regex);
    return match ? match[1] : '';
  }
 
  /**
   * 从XML字符串提取元素值
   * @param {string} xml - XML字符串
   * @param {string} tag - 元素标签
   */
  static extractElement(xml, tag) {
    const regex = new RegExp(`<${tag}>([^<]*)<\/${tag}>`, 'i');
    const match = xml.match(regex);
    return match ? match[1] : '';
  }
 
  /**
   * 从XML提取所有参数
   * @param {string} xml - XML字符串
   */
  static extractAllParameters(xml) {
    const params = {};
    const regex = /<Prm><Id>([^<]+)<\/Id><Val>([^<]*)<\/Val><\/Prm>/g;
    let match;
 
    while ((match = regex.exec(xml)) !== null) {
      params[match[1]] = match[2];
    }
    return params;
  }
 
  /**
   * 从XML提取关键数据
   * @param {string} xml - XML字符串
   */
  static extractKeyData(xml) {
    const params = this.extractAllParameters(xml);
    
    return {
      deviceModel: params['DMBLDN'] || '-',
      serialNumber: params['TSSRNB'] || '-',
      softwareVersion: params['TSSSWV'] || '-',
      
      // 超滤参数 (3个)
      ultraFiltrateTarget: params['DSUFVO'] || '0',
      ultraFiltrateTotal: params['DCUFVO'] || '0',
      ultrafiltrateRateSet: params['DSUFRA'] || '0',
      
      // 透析液参数 (5个)
      dialysisFluidFlow: params['DSDLFW'] || '0',
      dialysisFluidActual: params['DCDAFL'] || '0',
      dialysisFluidTemp: this.convertValue('DSDITP', params['DSDITP']),
      sodiumConc: this.convertValue('DCNACV', params['DCNACV']),
      conductivity: this.convertValue('DCENDC', params['DCENDC']),
      
      // 血液/血流参数 (6个)
      bloodFlow: params['DCBLFL'] || '0',
      effectiveBloodFlow: params['DCTVBF'] || '0',
      dialysisBloodVolume: params['DCPRBV'] || '0',
      returnedBloodVolume: params['DCRIVO'] || '0',
      plasmaNA: this.convertValue('DCPLNA', params['DCPLNA']),
      clearanceRate: params['DCCLMA'] || '0',
      
      // 质量指标 (2个)
      instantKT: this.convertValue('DCEFKT', params['DCEFKT']),
      ktvTarget: this.convertValue('DSTKTV', params['DSTKTV']),
      
      // 电解质参数 (1个)
      bicarbonate: this.convertValue('DSNABI', params['DSNABI']),
      
      // 压力参数 (3个)
      arterialPressure: params['DCARPR'] || '-',
      venousPressure: params['DCVEPR'] || '-',
      transmembranePressure: params['DCTMPV'] || '-',
      
      // 膜型参数 (1个)
      dialysisMode: params['DSFITY'] || '-',
      
      // 状态参数 (2个)
      runStatus: params['DCRDST'] || '-',
      alarmStatus: params['TSALST'] || '-',
      treatmentDuration: params['DCUFTM'] || '-',
      
      // 置换参数 (3个)
      replacementFluidTarget: this.convertValue('DCXESV', params['DCXESV']),
      replacementRate: params['DCHDRA'] || '-',
      replacementVolume: this.convertValue('DCHDFV', params['DCHDFV'])
    };
  }
}
 
module.exports = ParameterParser;