/**
|
* 参数解析和转换模块
|
* 负责参数字典、数据转换和关键数据提取
|
*/
|
|
// 费森透析机 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;
|