产品名称:医学影像和数据处理与通讯软件 型号:浩连 版本:1.0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

305 lines
11 KiB

1 month ago
class ParseDataType {
constructor(data, deviceInfo) {
if (!data) return []
this.extractData = data
this.eyeType = {
OS: '',
OD: ''
}
this.brand = deviceInfo.brand
this.model = deviceInfo.model
this.eyeType.OS = data.match(/OS/)
this.eyeType.OD = data.match(/OD/)
console.log('OS',this.eyeType.OS ? this.eyeType.OS[0] : '')
console.log('OD',this.eyeType.OD ? this.eyeType.OD[0] : '')
if (data.match(/Axial length values/) || data.match(/轴长值/)) {
// 人工晶体生物测量 1
this.keyWords = 'IOL-Master500-1'
} else if (data.match(/公式:/)) {
// 人工晶体生物测量 2
this.keyWords = 'IOL-Master500-2'
} else if (data.match(/Corneal Wavefront Analyzer/) && data.match(/Keratron™ Scout/)) {
// 角膜地形图(阿玛仕) OCULUS Keratograph
this.keyWords = 'OPTIKON'
} else if (data.match(/IOL 计算/)) {
// IOL-Master700
this.keyWords = 'IOL-Master700'
} else if (data.match(/超声生物显微镜检查报告单/)) {
// UBM
// this.keyWords = 'UBM'
}
}
analysis() {
console.log('keyWords',this.keyWords);
switch (this.keyWords) {
case 'IOL-Master500-1':
return this.master5001()
case 'IOL-Master500-2':
return this.master5002()
case 'OPTIKON':
return this.corneal()
case 'IOL-Master700':
return this.master700()
case 'UBM':
return this.ubmData()
}
}
regexKey(start, end) {
const regex =new RegExp(`${start}(.*?)${end}`, "g");
return [...this.extractData.matchAll(regex)].map(m => m[1]);
}
// 取start和mideele之间的值
regexKeyB(start, middle, end) {
const regex =new RegExp(`${start}.*?${middle}(.*?)${end}\\s*`, "g");
return [...this.extractData.matchAll(regex)].map(m => m[1]);
}
regexKeyC(start) {
const regex =new RegExp(`${start}\\s*(.*?)(?=\\s|$)`);
return [...this.extractData.match(regex)].map(m => m[1]);
}
// 取middle和end之间的值
regexKeyD() {
const regex = /(OD)-(Steep|Flat):.*?@(\d*)°/g;
return [...this.extractData.matchAll(regex)].map(m => m[3] || '');
}
regexKeyE() {
const regex = /(OS)-(Steep|Flat):.*?@(\d*)°/g;
return [...this.extractData.matchAll(regex)].map(m => m[3] || '');
}
regexKeyF() {
const regex = /Off:[^@]*@(\d+)°/g;
return [...this.extractData.matchAll(regex)].map(m => m[1] || '');
}
/**
* master500
*/
master5001() {
let data = {}
const examTime = this.regexKey('Examination date:', 'n:').length ? this.regexKey('Examination date:', 'n:') : this.regexKey('检查日期:', 'n:')
const AL = this.regexKey('Comp. AL:', 'mm').length ? this.regexKey('Comp. AL:', 'mm') : this.regexKey('复合AL:', 'mm')
const K1_D = this.regexKey('MV: ', '/').length ? this.regexKey('MV: ', '/') : this.regexKey('平均值: ', '/')
const regex1 = /平均值:\s*\d+\.\d+\/(\d+\.\d+)\s*D/g;
const regex2 = /MV:\s*\d+\.\d+\/(\d+\.\d+)\s*D/g;
const K2_D = [...this.extractData.matchAll(regex1)].map(match => match[1].trim()).length ? [...this.extractData.matchAll(regex1)].map(match => match[1].trim()) : [...this.extractData.matchAll(regex2)].map(match => match[1].trim());
console.log('examTime',examTime);
data = [{
AL: AL.length === 2 ? AL[0] : '',
K1_D: K1_D.length === 2 ? K1_D[0] : '',
K2_D: K1_D.length === 2 ? K2_D[0] : '',
examTime: examTime.length === 1 ? examTime[0].replace(/\//g, '-') + ' 00:00:00' : '',
eye_type: 'OD'
},{
AL: AL.length === 2 ? AL[1] : '',
K1_D: K1_D.length === 2 ? K1_D[1] : '',
K2_D: K1_D.length === 2 ? K2_D[1] : '',
examTime: examTime.length === 1 ? examTime[0].replace(/\//g, '-') + ' 00:00:00' : '',
eye_type: 'OS'
},
{
AL: AL.length === 1 ? AL[0] : '',
K1_D: K1_D.length === 1 ? K1_D[0] : '',
K2_D: K1_D.length === 1 ? K2_D[0] : '',
examTime: examTime.length === 1 ? examTime[0].replace(/\//g, '-') + ' 00:00:00' : '',
eye_type: ''
}]
console.log(data)
return data;
}
/**
* master500
*/
master5002() {
let data = {}
const examTime = this.regexKey('检查日期:', 'n:')
const AL = this.regexKey('AL:', 'mm')
const K1_D = this.regexKey('K1:', 'D')
const K1_A = this.regexKeyB('K1','@', '°')
const K1_R = this.regexKeyB('K1', '/', 'mm')
const K2_D = this.regexKey('K2:', 'D')
const K2_A = this.regexKeyB('K2','@', '°')
const K2_R = this.regexKeyB('K2', '/', 'mm')
const ACD = this.regexKey('ACD:', 'mm')
const Cyl = this.regexKey('Cyl.:', 'D')
const Cyl_A = this.regexKeyB('Cyl.:','@', '°')
data = [
{
AL: AL.length === 2 ? AL[0] : '',
K1_D: K1_D.length === 2 ? K1_D[0] : '',
K1_A: K1_A.length === 2 ? K1_A[0] : '',
K1_R: K1_R.length === 2 ? K1_R[0] : '',
K2_D: K2_D.length === 2 ? K2_D[0] : '',
K2_A: K2_A.length === 2 ? K2_A[0] : '',
K2_R: K2_R.length === 2 ? K2_R[0] : '',
ACD: ACD.length === 2 ? ACD[0] : '',
Cyl: Cyl.length === 2 ? Cyl[0] : '',
Cyl_A: Cyl_A.length === 2 ? Cyl_A[0] : '',
examTime: examTime.length === 1 ? examTime[0].replace(/\//g, '-') + ' 00:00:00' : '',
eye_type: 'OD'
},{
AL: AL.length === 2 ? AL[1] : '',
K1_D: K1_D.length === 2 ? K1_D[1] : '',
K1_A: K1_A.length === 2 ? K1_A[1] : '',
K1_R: K1_R.length === 2 ? K1_R[1] : '',
K2_D: K2_D.length === 2 ? K2_D[1] : '',
K2_A: K2_A.length === 2 ? K2_A[1] : '',
K2_R: K2_R.length === 2 ? K2_R[1] : '',
ACD: ACD.length === 2 ? ACD[1] : '',
Cyl: Cyl.length === 2 ? Cyl[1] : '',
Cyl_A: Cyl_A.length === 2 ? Cyl_A[1] : '',
examTime: examTime.length === 1 ? examTime[0].replace(/\//g, '-') + ' 00:00:00' : '',
eye_type: 'OS'
},{
AL: AL.length === 1 ? AL[0] : '',
K1_D: K1_D.length === 1 ? K1_D[0] : '',
K1_A: K1_A.length === 1 ? K1_A[0] : '',
K1_R: K1_R.length === 1 ? K1_R[0] : '',
K2_D: K2_D.length === 1 ? K2_D[0] : '',
K2_A: K2_A.length === 1 ? K2_A[0] : '',
K2_R: K2_R.length === 1 ? K2_R[0] : '',
ACD: ACD.length === 1 ? ACD[0] : '',
Cyl: Cyl.length === 1 ? Cyl[0] : '',
Cyl_A: Cyl_A.length === 1 ? Cyl_A[0] : '',
examTime: examTime.length === 1 ? examTime[0].replace(/\//g, '-') + ' 00:00:00' : '',
eye_type: ''
}]
console.log(data)
return data;
}
/**
* master700
*/
master700() {
let data = {}
const examTime = this.regexKey('测量日期:', 'n:')
const AL = this.regexKey('AL:', 'mm')
const WTW = this.regexKey('WTW:', 'mm')
data = [
{
AL: AL.length === 2 ? AL[0] : '',
WTW: WTW.length === 2 ? WTW[0] : '',
examTime: examTime.length === 1 ? examTime[0].replace(/\//g, '-') + ' 00:00:00' : '',
eye_type: 'OD'
},{
AL: AL.length === 2 ? AL[1] : '',
WTW: WTW.length === 2 ? WTW[1] : '',
examTime: examTime.length === 1 ? examTime[0].replace(/\//g, '-') + ' 00:00:00' : '',
eye_type: 'OS'
},{
AL: AL.length === 1 ? AL[0] : '',
WTW: WTW.length === 1 ? WTW[0] : '',
examTime: examTime.length === 1 ? examTime[0].replace(/\//g, '-') + ' 00:00:00' : '',
eye_type: ''
}]
console.log(data)
return data;
}
/**
* OPTIKON Keratron Scout
*/
corneal() {
let data = {}
const regex2 = /Date of Exam\.: (\d{4}\/\d{2}\/\d{2})/;
const examDate = this.extractData.match(regex2);
console.log('examDate',examDate[1]);
const regex3 = /Time of Exam\.: (\d{2}:\d{2}:\d{2})/;
const examTime = this.extractData.match(regex3);
console.log('examTime',examTime[1]);
//OD
const CF_K1_D_OD = this.regexKey('OD-Steep:', 'D')
const CF_K1_A_OD = this.regexKeyD()[0]
const CF_K2_D_OD = this.regexKey('OD-Flat:', 'D')
const CF_K2_A_OD = this.regexKeyD()[1]
console.log('CF_K1_A_OD',CF_K1_A_OD);
console.log('CF_K1_D_OD',CF_K1_D_OD);
console.log('CF_K2_A_OD',CF_K2_A_OD);
console.log('CF_K2_D_OD',CF_K2_D_OD);
const CF_Offset_MM = this.regexKey('Off:','mm')
// OS
const CF_K1_D_OS = this.regexKey('OS-Steep:', 'D')
const CF_K1_A_OS = this.regexKeyE()[0]
const CF_K2_D_OS = this.regexKey('OS-Flat:', 'D')
const CF_K2_A_OS = this.regexKeyE()[1]
const CF_Offset_A = this.regexKeyF()
console.log('CF_Offset_A',CF_Offset_A);
data = [
{
CF_K1_D: CF_K1_D_OD.length === 1 ? CF_K1_D_OD[0] : '',
CF_K1_A: CF_K1_A_OD ? CF_K1_A_OD : '',
CF_K2_D: CF_K2_D_OD.length === 1 ? CF_K2_D_OD[0] : '',
CF_K2_A: CF_K2_A_OD ? CF_K2_A_OD : '',
CF_Offset_MM: CF_Offset_MM.length === 2 ? CF_Offset_MM[0] : '',
CF_Offset_A: CF_Offset_A.length === 2 ? CF_Offset_A[0] : '',
examTime: examDate[1].replace(/\//g, '-') + ' ' + examTime[1],
eye_type: 'OD'
},
{
CF_K1_D: CF_K1_D_OS.length === 1 ? CF_K1_D_OS[0] : '',
CF_K1_A: CF_K1_A_OS ? CF_K1_A_OS : '',
CF_K2_D: CF_K2_D_OS.length === 1 ? CF_K2_D_OS[0] : '',
CF_K2_A: CF_K2_A_OS ? CF_K2_A_OS : '',
CF_Offset_MM: CF_Offset_MM.length === 2 ? CF_Offset_MM[1] : '',
CF_Offset_A: CF_Offset_A.length === 2 ? CF_Offset_A[1] : '',
examTime: examDate[1].replace(/\//g, '-') + ' ' + examTime[1],
eye_type: 'OS'
},
]
console.log('data',data)
return data;
}
/**
* UBM
*/
extractValidDates(text) {
const dateRegex = /\b\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])\b/g;
const potentialDates = text.match(dateRegex) || [];
return potentialDates.filter(dateStr => {
const date = new Date(dateStr);
return !isNaN(date.getTime()); // 检查是否是有效日期
});
}
ubmData(){
let data = {}
const sourceData = JSON.parse(JSON.stringify(this.extractData))
this.extractData = this.extractData.replace(/[\s\n]+/g, '');
console.log(this.extractData);
const examTime = this.extractValidDates(sourceData)
const UBN_QFSD = this.regexKey('前房深度约为', 'mm')
const GDG_SP = this.regexKey('水平两睫状沟间距离约', 'mm')
const GDG_CZ = this.regexKey('垂直两睫状沟间距离约', 'mm')
const JTQG = this.regexKey('矢高约为', 'mm')
const eye_type = this.extractData.match(/右眼/)
console.log('eye_type',this.extractData.match(/右眼/));
data = [{
UBN_QFSD: UBN_QFSD.length ? UBN_QFSD[0] : '',
GDG_SP: GDG_SP.length ? GDG_SP[0] : '',
GDG_CZ: GDG_CZ.length ? GDG_CZ[0] : '',
JTQG: JTQG.length ? JTQG[0] : '',
examTime: examTime.length === 1 ? examTime[0].replace(/\//g, '-') + ' 00:00:00' : '',
eye_type: eye_type.length ? eye_type[0] : '',
},{
// AL: AL.length === 2 ? AL[1] : '',
// K1_D: K1_D.length === 2 ? K1_D[1] : '',
// K2_D: K1_D.length === 2 ? K2_D[1] : '',
// examTime: examTime.length === 1 ? examTime[0].replace(/\//g, '-') + ' 00:00:00' : '',
// eye_type: 'OS'
},
{
// AL: AL.length === 1 ? AL[0] : '',
// K1_D: K1_D.length === 1 ? K1_D[0] : '',
// K2_D: K1_D.length === 1 ? K2_D[0] : '',
// examTime: examTime.length === 1 ? examTime[0].replace(/\//g, '-') + ' 00:00:00' : '',
// eye_type: ''
}]
console.log(data)
return data;
}
}
window.dealData = (msg, device) => {
return new ParseDataType(msg, device).analysis()
}