Code Templates

Funktionen, die man an mehreren Stellen immer wieder benötigt, können als Code Templates definiert werden. Alle Code Templates zusammen lassen sich über die Funktion Export Code Templates in eine Datei exportieren. Mit der Funktion Import Code Templates lassen sich alle Templates z.B. in ein anderes System importieren. Wichtig: Es ist nicht möglich, ein einzelnes Code Template zu exportieren oder zu importieren. Will man daher nur ein einzelnes Code Template von einem System zu einem anderen Übertragen, sollte man den JavaScript Sourcecode über die Zwischenablage vom Quell zum Zielsystem übertragen.

Hilfsfunktionen

Methoden zur Erweiterung der Basisklassen String, Date …

// Ziffern mit führenden Nullen auffüllen
String.prototype.lpad = function(padString, length) {
    var str = this;
    while (str.length < length)
        str = padString + str;
    return str;
}

Quelle
Verwendung: Formatierung einer 7-stelligen Fallnummer mit führender 0.

tmp['PV1']['PV1.19']['PV1.19.1'] = msg['PV1']['PV1.19']['PV1.19.1'].toString().lpad("0", 8)
// Mapping eines String Wertes auf einen anderen Wert
String.prototype.listlookup = function(lookupList, defaultValue) {
    var str = this;

    if (typeof (defaultValue) == 'undefined') defaultValue = '';
    tmpstr = lookupList[str];
	 if (typeof (tmpstr) == 'undefined') tmpstr = defaultValue;        
    return tmpstr;
}

Verwendung: Mappen eines Wertes auf einen anderen Wert. Wenn kein Wert in der Mappingtabelle gefunden wurde, wird der als defaultValue übergebene Wert gesetzt.

// Definition der Mappingtabelle als assoziatives Array
var mapping = {
	"A":"1",
	"B":"2",
	"C":"3"	
}

var a = "B";
b = a.listlookup(mapping);

Erstellen eines Sequencers

function incSequence() {
	
	var sequence = Number(globalChannelMap.get('Sequence'));
	
	sequence++;
	globalChannelMap.put('Sequence', sequence.toString().lpad("0",8));
	
	return;
}

Diese Funktion wird in das Postprocessor Skript eines Channel eingebunden. Bei der Verarbeitung einer Nachricht wird dann der Zähler jeweils um 1 hochgezählt und in der Channel-Variablen Sequence abgelegt. Auf diese Variable kann dann beispielsweise zur Erzeugung eines Dateinamens in einer Destination zugegriffen werden: File name: ${SYSTIME}-${Sequence}.hl7. Bei jedem Channel-deploy wird diese Variable allerdings wieder auf 0 zurückgesetzt.

Datumsfunktionen

// Parses a HL7-timestamp representation into a date object
Date.prototype.hl7parse = function(hl7DateString) {
	
	var tdate = this;
	
	if (hl7DateString.length &gt;=8)
	tdate.setDate(hl7DateString.substring(6,8));	
	tdate.setFullYear(hl7DateString.substring(0,4));
	tdate.setMonth(Number(hl7DateString.substring(4,6) - 1));
	if (hl7DateString.length == 14)
	{
		tdate.setHours(hl7DateString.substring(8,10));
		tdate.setMinutes(hl7DateString.substring(10,12));
		tdate.setSeconds(hl7DateString.substring(12,14));
	} else {
		tdate.setHours(0);
		tdate.setMinutes(0);
		tdate.setSeconds(0);
	}	  
	
	return tdate;
}

// Format Date object in SQL format %dY-%M-.%d
Date.prototype.toSqlDateString = function() {

	var SQLDateString = new String();
	
	month = this.getMonth() + 1;
	SQLDateString = this.getFullYear().toString().lpad("0",4)
	+ '-' + month.toString().lpad("0",2) 
	+ '-' + this.getDate().toString().lpad("0",2);
	
	return SQLDateString;
}

// Format Date object in german format %d.%d.%Y
Date.prototype.toGermanDateString = function() {

	var germanDateString = new String();
	
	month = this.getMonth() + 1;
	germanDateString = this.getDate().toString().lpad("0",2)
	+ '.' + month.toString().lpad("0",2) 
	+ '.' + this.getFullYear().toString().lpad("0",4);
	
	return germanDateString;
}

// Format Date object into german time-format %h:%m
Date.prototype.toGermanTimeString = function() {

	var germanTimeString = new String();
	
	germanTimeString = this.getHours().toString().lpad("0",2)
		+ ':' + this.getMinutes().toString().lpad("0",2);

	return germanTimeString;
}

// Returns a HL7-timestamp representation of a Date object
Date.prototype.toHl7DateString = function() {
	
   var hl7DateString = new String();
   
   month = this.getMonth() + 1;   
   hl7DateString = this.getFullYear().toString().lpad("0",4)
		+ month.toString().lpad("0",2)
		+ this.getDate().toString().lpad("0",2)
		+ this.getHours().toString().lpad("0",2)
		+ this.getMinutes().toString().lpad("0",2)
		+ this.getSeconds().toString().lpad("0",2);
	
	return hl7DateString;	
}

Mit folgender Funktion als Abwandlung der Prototypfunktion Array.join kann man einen Patientennamen zusammensetzten

/ Hilfsfunktion zum Zusammensetzen von strings mit dem String separator
Array.prototype.join2 = function(separator) { 
  var tarr = this;
  var result = '';

  for (var i = 0; i < tarr.length; i++) {
      aelement = tarr[i].toString();
      if (aelement.length > 0)
      if ( i == tarr.length - 1) {
      	result = result + aelement	
      } else {		
         result = result + aelement + separator;
      }	
  } 
  return result;
}

Aus Nachnamen, Adelsprädikat und Prefix läßt sich dann z.B. der Nachnamen wie folgt zusammensetzen:

nname = [
  msg['IN1'][0]['IN1.16']['IN1.16.4'].toString(), 
  msg['IN1'][0]['IN1.16']['IN1.16.5'].toString(), 
  msg['IN1'][0]['IN1.16']['IN1.16.1'].toString()
];
channelMap.put('vers_name', nname.join2(' '));

Hostname des Mirth Connect Servers ermitteln

function hostname() {
    return java.net.InetAddress.getLocalHost().getHostName();
}

Damit der Hostname nicht jedesmal bei Gebrauch mit dieser Funktion ermittelt werden kann, kann man diesen in einer Global map Variablen speichern

globalMap.put('hostname', hostname());

Innerhalb eines Alerts kann dann auch auf den Wert der Variablen zugegriffen werden, z.B.

mirthConnect@${hostname}: Error ${error} ...

Anlage eines Sequencers zur Erzeugung eines fortlaufenden Dateinamens

Benötigt werden zwei Funktionen der Sichtbarkeit Global Channel, die als Code Template definiert werden. Die erste Funktion wird im deploy script eines Channels ausgeführt. Sie liest den Wert des Sequencers aus einer Datei im Dateisystem beim Start des Channels ein. Dier Pfad der Sequenncerdatei ist entsprechend anzupassen.

// $Id$
function getSequence(sequenceName) {

    var sequence_file = 'M:/srv/mirth/data/persistent/' + sequenceName + '.seq'; 
	var sequence = '0'; 

	try {
		sequence = FileUtil.read('sequence_file');
	} catch (e) {
		sequence = '0';
		globalChannelMap.put('Sequence', sequence.lpad("0",8));
		return;
	}
	sequence = FileUtil.read('sequence_file');
	globalChannelMap.put('Sequence', sequence.lpad("0",8));

	return;
}

Im Aufruf des deploy skripts wird ein Sequencer-Name übergeben, dabei kann es sich z.B. um den Namen des Channel handeln:

// This script executes once when the channel is deployed
// You only have access to the globalMap and globalChannelMap here to persist data
getSequence('cHnoAdtUkbOut');
return;

Das zweite Skript inkrementiert den Seqencer und wird im Postprozessor-Skript eines Channels ausgeführt:

// $Id$
function incSequence(sequenceName) {
	
    var sequence_file = 'M:/srv/mirth/data/persistent/' + sequenceName + '.seq'; 
	var sequence = Number(globalChannelMap.get('Sequence'));
	
	sequence++;
	FileUtil.write(sequence_file, false, sequence.toString());
	globalChannelMap.put('Sequence', sequence.toString().lpad("0",8));
	
	return;
}
// This script executes once after a message has been processed
incSequence('cHnoAdtUkbOut');
return;

Der Dateiname läßt sich dann mit einem Konstrukt ${Sequence}.hl7 aus dem Seqencer-Wert bilden.

Advertisements