[613] | 1 | KMPDHU02 ;OAK/RAK - CM Tools Compile & File HL7 Daily Stats ;2/17/04 08:58
|
---|
| 2 | ;;2.0;CAPACITY MANAGEMENT TOOLS;;Mar 22, 2002
|
---|
| 3 | ;
|
---|
| 4 | DAILY(KMPDST,KMPDEN) ;-entry point
|
---|
| 5 | ;-----------------------------------------------------------------------
|
---|
| 6 | ; KMPDST... Start date in internal fileman format.
|
---|
| 7 | ; KMPDEN... End date in internal fileman format.
|
---|
| 8 | ;
|
---|
| 9 | ; This API gathers HL7 data and stores it in file 8973.1 (CM HL7 DATA)
|
---|
| 10 | ;
|
---|
| 11 | ; Variables used:
|
---|
| 12 | ; GBL...... Global where data is stored - for use with indirection
|
---|
| 13 | ; GBL1..... globas where compiled data is stored before filing -
|
---|
| 14 | ; used with indirection
|
---|
| 15 | ;-----------------------------------------------------------------------
|
---|
| 16 | ;
|
---|
| 17 | Q:'$G(KMPDST)
|
---|
| 18 | Q:'$G(KMPDEN)
|
---|
| 19 | ; make sure end date has hours
|
---|
| 20 | S:'$P(KMPDEN,".",2) $P(KMPDEN,".",2)="99"
|
---|
| 21 | S:'$G(DT) DT=$$DT^XLFDT
|
---|
| 22 | ;
|
---|
| 23 | N ERROR,GBL,GBL1,STR,X
|
---|
| 24 | ;
|
---|
| 25 | ; get data from hl7 api
|
---|
| 26 | W:'$D(ZTQUEUED) !,"Gathering HL7 data..."
|
---|
| 27 | ; global with 'raw' hl7 api data
|
---|
| 28 | S GBL=$NA(^TMP("KMPDH",$J)) K @GBL
|
---|
| 29 | ; set up global to get asynchronous data
|
---|
| 30 | K ^TMP($J)
|
---|
| 31 | S ^TMP($J,"HLUCM")="DEBUG GLOBAL"
|
---|
| 32 | S X=$$CM2^HLUCM(KMPDST,KMPDEN,1,1,"KMPDH","EITHER",.ERROR)
|
---|
| 33 | I 'X!($D(ERROR))!('$D(^TMP("KMPDH",$J))) D Q
|
---|
| 34 | .W:'$D(ZTQUEUED) " no data to report"
|
---|
| 35 | ;
|
---|
| 36 | ; global for storing compiled data before filing
|
---|
| 37 | S GBL1=$NA(^TMP("KMPDH-1",$J)) K @GBL1
|
---|
| 38 | ;
|
---|
| 39 | W:'$D(ZTQUEUED) !,"Compiling synchronous HL7 data..."
|
---|
| 40 | D SYNC
|
---|
| 41 | ;
|
---|
| 42 | W:'$D(ZTQUEUED) !,"Compiling asynchronous HL7 data..."
|
---|
| 43 | D ASYNC
|
---|
| 44 | ;
|
---|
| 45 | K @GBL,@GBL1,^TMP($J),^TMP("KMPDHERRTIME",$J)
|
---|
| 46 | W:'$D(ZTQUEUED) !,"Finished!"
|
---|
| 47 | ;
|
---|
| 48 | Q
|
---|
| 49 | ;
|
---|
| 50 | ;
|
---|
| 51 | ASYNC ;- asynchronous data
|
---|
| 52 | Q:$G(GBL)=""
|
---|
| 53 | Q:$G(GBL1)=""
|
---|
| 54 | ;
|
---|
| 55 | N COUNT,DATA,DATA1,DATA2,HOUR,I,IEN,IEN1,IEN2,J,LOCAL,MSG,NM,NODE
|
---|
| 56 | N OF,PIECE,PR,PTNP,SD,STDT,TIME1,TIME2,UNIT
|
---|
| 57 | ;
|
---|
| 58 | ; local site name
|
---|
| 59 | S LOCAL=$P($$SITE^VASITE,U,2) Q:LOCAL=""
|
---|
| 60 | S IEN=0
|
---|
| 61 | F S IEN=$O(^TMP($J,"HLUCMSTORE","U",IEN)) Q:'IEN S DATA=^(IEN) D
|
---|
| 62 | .; data = Protocol~Ien^Namespace
|
---|
| 63 | .; message type
|
---|
| 64 | .S MSG=$P(DATA,U,6)
|
---|
| 65 | .; quit if not 'complete' message
|
---|
| 66 | .Q:'$$ASYNCHK(MSG)
|
---|
| 67 | .; protocol - check protocol fist, then inferred protocol
|
---|
| 68 | .S PR=$S($P(DATA,U,7)]"":$P(DATA,U,7),$P(DATA,U,8)]"":$P(DATA,U,8),1:"") Q:PR=""
|
---|
| 69 | .; namespace - check namespace first, then inferred namespace
|
---|
| 70 | .S NM=$S($P(DATA,U,9)]"":$P(DATA,U,9),$P(DATA,U,10)]"":$P(DATA,U,10),1:"") Q:NM=""
|
---|
| 71 | .; other facility
|
---|
| 72 | .S OF=$P(DATA,U,11) S:OF["~" OF=$P(OF,"~",2) Q:OF=""
|
---|
| 73 | .; quit if other facility is LOCAL
|
---|
| 74 | .Q:OF[LOCAL
|
---|
| 75 | .; start date/time
|
---|
| 76 | .S STDT=$P(DATA,U,4) Q:'STDT
|
---|
| 77 | .; date without time
|
---|
| 78 | .S SD=$P(STDT,".") Q:'SD
|
---|
| 79 | .S $P(@GBL1@(SD,PR,NM,OF,99.2),U,11)=$P($P(DATA,U,11),"~")
|
---|
| 80 | .S $P(@GBL1@(SD,PR,NM,OF,99.2),U,12)=$P($P(DATA,U,11),"~",2)
|
---|
| 81 | .S $P(@GBL1@(SD,PR,NM,OF,99.2),U,13)=$P($P(DATA,U,11),"~",3)
|
---|
| 82 | .;
|
---|
| 83 | .S (COUNT,HOUR,IEN1)=0 K UNIT
|
---|
| 84 | .F S IEN1=$O(^TMP($J,"HLUCMSTORE","U",IEN,IEN1)) Q:'IEN1 D
|
---|
| 85 | ..; data1 = piece 1 - Characters
|
---|
| 86 | ..; piece 2 - Messages
|
---|
| 87 | ..; piece 3 - Seconds
|
---|
| 88 | ..; piece 4 - Begining Time
|
---|
| 89 | ..; piece 5 - End Time
|
---|
| 90 | ..; piece 6 - Type: msg, ca, aa or ca
|
---|
| 91 | ..; piece 7 - Protocol~Ien
|
---|
| 92 | ..; piece 8 - Namespace
|
---|
| 93 | ..S DATA1=$G(^TMP($J,"HLUCMSTORE","U",IEN,IEN1,"CCC")) Q:DATA1=""
|
---|
| 94 | ..S COUNT=COUNT+1,UNIT(COUNT)=DATA1
|
---|
| 95 | .;
|
---|
| 96 | .; back to IEN level
|
---|
| 97 | .; quit if unit() array is not complete
|
---|
| 98 | .Q:'$$UNITS(MSG)
|
---|
| 99 | .; hour of transaction
|
---|
| 100 | .S HOUR=+$E($P(STDT,".",2),1,2),HOUR=HOUR+1
|
---|
| 101 | .; prime time or non-prime time
|
---|
| 102 | .S PTNP=$$PTNP^KMPDHU03(STDT) Q:'PTNP
|
---|
| 103 | .; node: 5 - prime time
|
---|
| 104 | .; 6 - non-prime time
|
---|
| 105 | .S NODE=$S(PTNP=2:6,1:5)
|
---|
| 106 | .;
|
---|
| 107 | .; update msg unit count - prime time or non-prime time
|
---|
| 108 | .S $P(@GBL1@(SD,PR,NM,OF,99.5),U,PTNP)=$P($G(@GBL1@(SD,PR,NM,OF,99.5)),U,PTNP)+1
|
---|
| 109 | .;update msg unit count - both prime time & non-prime time
|
---|
| 110 | .S $P(@GBL1@(SD,PR,NM,OF,99.5),U,3)=$P($G(@GBL1@(SD,PR,NM,OF,99.5)),U,3)+1
|
---|
| 111 | .; totals
|
---|
| 112 | .F J=0:0 S J=$O(UNIT(J)) Q:'J F I=1:1:3 D
|
---|
| 113 | ..; total
|
---|
| 114 | ..S $P(@GBL1@(SD,PR,NM,OF,99.2),U,I)=$P($G(@GBL1@(SD,PR,NM,OF,99.2)),U,I)+$P(UNIT(J),U,I)
|
---|
| 115 | ..S $P(@GBL1@(SD,PR,NM,OF,99.3),U,(I+6))=$P($G(@GBL1@(SD,PR,NM,OF,99.3)),U,(I+6))+$P(UNIT(J),U,I)
|
---|
| 116 | ..; prime time or non-prime time
|
---|
| 117 | ..; ^ piece to set
|
---|
| 118 | ..S PIECE=I+$S(PTNP=2:3,1:0)
|
---|
| 119 | ..S $P(@GBL1@(SD,PR,NM,OF,99.3),U,PIECE)=$P($G(@GBL1@(SD,PR,NM,OF,99.3)),U,PIECE)+$P(UNIT(J),U,I)
|
---|
| 120 | .;
|
---|
| 121 | .; msg to ca - originating message to commit ack
|
---|
| 122 | .; ^ piece: 1 - characters
|
---|
| 123 | .; 2 - count
|
---|
| 124 | .; 3 - seconds
|
---|
| 125 | .F I=1:1:3 S $P(@GBL1@(SD,PR,NM,OF,NODE+(I*.1)),U,HOUR)=$P($G(@GBL1@(SD,PR,NM,OF,NODE+(I*.1))),U,HOUR)+($P(UNIT(1),U,I)+$P(UNIT(2),U,I))
|
---|
| 126 | .;
|
---|
| 127 | .; processing time (ca to aa) - commit ack ending time to application
|
---|
| 128 | .; ack starting time
|
---|
| 129 | .S TIME1=+$P(UNIT(3),U,4),TIME2=+$P(UNIT(2),U,5)
|
---|
| 130 | .S $P(@GBL1@(SD,PR,NM,OF,(NODE+(.4))),U,HOUR)=$$TIMEADD^KMPDU($P($G(@GBL1@(SD,PR,NM,OF,(NODE+(.4)))),U,HOUR)+$$FMDIFF^XLFDT(TIME2,(+TIME1),3))
|
---|
| 131 | .; processing time (ca to aa) - count
|
---|
| 132 | .S $P(@GBL1@(SD,PR,NM,OF,(NODE+(.5))),U,HOUR)=$P($G(@GBL1@(SD,PR,NM,OF,(NODE+(.5)))),U,HOUR)+1
|
---|
| 133 | .;
|
---|
| 134 | .; aa to ca - application ack to commit ack
|
---|
| 135 | .; ^ piece: 1 - characters
|
---|
| 136 | .; 2 - count
|
---|
| 137 | .; 3 - seconds
|
---|
| 138 | .F I=1:1:3 S $P(@GBL1@(SD,PR,NM,OF,NODE+(I+6*.1)),U,HOUR)=$P($G(@GBL1@(SD,PR,NM,OF,NODE+(I+6*.1))),U,HOUR)+($P(UNIT(3),U,I)+$P(UNIT(4),U,I))
|
---|
| 139 | ;
|
---|
| 140 | D:$D(@GBL1) FILE^KMPDHU03(2)
|
---|
| 141 | ;
|
---|
| 142 | Q
|
---|
| 143 | ;
|
---|
| 144 | ASYNCHK(KMPDMSG) ;-- extrinsic function - check for 'complete' message
|
---|
| 145 | ;-----------------------------------------------------------------------
|
---|
| 146 | ; KMPDMGS... message ack designations
|
---|
| 147 | ;
|
---|
| 148 | ; Return: 0 - not a complete message
|
---|
| 149 | ; 1 - complete message
|
---|
| 150 | ;-----------------------------------------------------------------------
|
---|
| 151 | Q:$G(KMPDMSG)="" 0
|
---|
| 152 | Q:MSG="MSG~CA~AA~CA" 1
|
---|
| 153 | Q:MSG="MSG~CA~AR~CA" 1
|
---|
| 154 | Q:MSG="MSG~AA" 1
|
---|
| 155 | Q 0
|
---|
| 156 | ;
|
---|
| 157 | UNITS(MSG) ;-- extrinsic function
|
---|
| 158 | ;-----------------------------------------------------------------------
|
---|
| 159 | ; MSG.... type of message: 'msg~aa', 'msg~ca~aa~ca', etc.
|
---|
| 160 | ;
|
---|
| 161 | ; Return: 0 - unit() array not complete
|
---|
| 162 | ; 1 - unit() array is complete
|
---|
| 163 | ;
|
---|
| 164 | ; unit() array must be segmented into the following format:
|
---|
| 165 | ; unit(1) = msg
|
---|
| 166 | ; unit(2) = ca
|
---|
| 167 | ; unit(3) = aa
|
---|
| 168 | ; unit(4) = ca
|
---|
| 169 | ; this data is then used to calculate characters, messages and seconds
|
---|
| 170 | ;-----------------------------------------------------------------------
|
---|
| 171 | Q:$G(MSG)="" 0
|
---|
| 172 | ; all messages must have unit(2)
|
---|
| 173 | Q:'$D(UNIT(2)) 0
|
---|
| 174 | ; "msg~ca~aa~ca" & "msg~ca~ar~ca" messages must have unit(3) & unit(4)
|
---|
| 175 | I MSG="MSG~CA~AA~CA"!(MSG="MSG~CA~AR~CA") Q:'$D(UNIT(3)) 0
|
---|
| 176 | I MSG="MSG~CA~AA~CA"!(MSG="MSG~CA~AR~CA") Q:'$D(UNIT(4)) 0
|
---|
| 177 | ; 'msg~aaa' messages contain only 2 unit() entries
|
---|
| 178 | ; create 4 unit() entries for processing
|
---|
| 179 | I MSG="MSG~AA" D
|
---|
| 180 | .S (UNIT(3),UNIT(4))=UNIT(2),UNIT(2)=UNIT(1)
|
---|
| 181 | .S $P(UNIT(1),U,1,3)="0^0^0"
|
---|
| 182 | .S $P(UNIT(4),U,1,3)="0^0^0"
|
---|
| 183 | ; calculate seconds
|
---|
| 184 | ; msg to ca
|
---|
| 185 | S $P(UNIT(2),U,3)=$$FMDIFF^XLFDT($P(UNIT(2),U,5),$P(UNIT(1),U,4),2)
|
---|
| 186 | S:$P(UNIT(2),U,3)<0 $P(UNIT(2),U,3)=0
|
---|
| 187 | ; ca to aa
|
---|
| 188 | S $P(UNIT(3),U,3)=$$FMDIFF^XLFDT($P(UNIT(3),U,5),$P(UNIT(2),U,5),2)
|
---|
| 189 | S:$P(UNIT(3),U,3)<0 $P(UNIT(3),U,3)=0
|
---|
| 190 | ; aa to ca
|
---|
| 191 | S $P(UNIT(4),U,3)=$$FMDIFF^XLFDT($P(UNIT(4),U,5),$P(UNIT(3),U,5),2)
|
---|
| 192 | S:$P(UNIT(4),U,3)<0 $P(UNIT(4),U,3)=0
|
---|
| 193 | ;
|
---|
| 194 | Q 1
|
---|
| 195 | ;
|
---|
| 196 | SYNC ;- synchronous data
|
---|
| 197 | ;-----------------------------------------------------------------------
|
---|
| 198 | ; SS1...... subscript 1 - identifies data
|
---|
| 199 | ; HR - hourly
|
---|
| 200 | ; NMSP - namespace
|
---|
| 201 | ; PROT - protocol
|
---|
| 202 | ; SS2...... subscript 2 - identifies data sorted within SS1
|
---|
| 203 | ; IO - incoming/outgoing messages
|
---|
| 204 | ; LR - local/remote messages
|
---|
| 205 | ; PR - protocol
|
---|
| 206 | ; TM - type of transmission
|
---|
| 207 | ;
|
---|
| 208 | ; SS3...... subcript 3 - which identifier for SS2 is being sorted
|
---|
| 209 | ; IO - I - incoming
|
---|
| 210 | ; O - outgoing
|
---|
| 211 | ; U - unknown
|
---|
| 212 | ; LR - L - local
|
---|
| 213 | ; R - remote
|
---|
| 214 | ; U - unknown
|
---|
| 215 | ; PR - P - placeholder for consistent subscripting
|
---|
| 216 | ; TM - M - mailman
|
---|
| 217 | ; T - tcp
|
---|
| 218 | ; U -unknown
|
---|
| 219 | ; SS4...... subscript 4 - according to SS1
|
---|
| 220 | ; HR - date.time
|
---|
| 221 | ; NMSP - namespace
|
---|
| 222 | ; PROT - protocal
|
---|
| 223 | ; SS5...... subcript 5 - according to SS1
|
---|
| 224 | ; HR - namespace
|
---|
| 225 | ; NMSP - date.tim
|
---|
| 226 | ; PROT - namespace
|
---|
| 227 | ; SS6...... subscript 6 - according to SS1
|
---|
| 228 | ; HR - protocol
|
---|
| 229 | ; NMSP - protocol
|
---|
| 230 | ; PROT - date.time
|
---|
| 231 | ;-----------------------------------------------------------------------
|
---|
| 232 | Q:$G(GBL)=""
|
---|
| 233 | Q:$G(GBL1)=""
|
---|
| 234 | N SS1,SS2,SS3,SS4,SS5,SS6
|
---|
| 235 | S SS1=""
|
---|
| 236 | F S SS1=$O(@GBL@(SS1)) Q:SS1="" I SS1'="RFAC" S SS2="" D
|
---|
| 237 | .F S SS2=$O(@GBL@(SS1,SS2)) Q:SS2="" S SS3="" D
|
---|
| 238 | ..F S SS3=$O(@GBL@(SS1,SS2,SS3)) Q:SS3="" S SS4="" D
|
---|
| 239 | ...F S SS4=$O(@GBL@(SS1,SS2,SS3,SS4)) Q:SS4="" S SS5="" D
|
---|
| 240 | ....Q:SS1="PROT"&(SS4="ZZZ")
|
---|
| 241 | ....F S SS5=$O(@GBL@(SS1,SS2,SS3,SS4,SS5)) Q:SS5="" S SS6="" D
|
---|
| 242 | .....; if SS1="NMSP" or SS1="PROT" quit if SS4 and SS5 (protocol/
|
---|
| 243 | .....; namespace pair) = ZZZ
|
---|
| 244 | .....I SS1="NMSP"!(SS1="PROT") Q:SS4="ZZZ"&(SS5="ZZZ")
|
---|
| 245 | .....F S SS6=$O(@GBL@(SS1,SS2,SS3,SS4,SS5,SS6)) Q:SS6="" D
|
---|
| 246 | ......Q:SS1="HR"&(SS6="ZZZ")
|
---|
| 247 | ......Q:SS1="NMSP"&(SS6="ZZZ")
|
---|
| 248 | ......; compile data into daily stats for file #8973.1 (CM HL7 DATA)
|
---|
| 249 | ......D COMPILE^KMPDHU03
|
---|
| 250 | ;
|
---|
| 251 | D:$D(@GBL1) FILE^KMPDHU03(1)
|
---|
| 252 | ;
|
---|
| 253 | K @GBL1
|
---|
| 254 | ;
|
---|
| 255 | Q
|
---|