1 | HLEVAPI3 ;O-OIFO/LJA - Event Monitor APIs ;02/04/2004 14:42
|
---|
2 | ;;1.6;HEALTH LEVEL SEVEN;**109**;Oct 13, 1995
|
---|
3 | ;
|
---|
4 | EVENTONE(HLEVIENM,HLEVNM,HLEVIENE) ; Master job check of an event...
|
---|
5 | ; ZTSKMST -- req
|
---|
6 | N CONT,CURR,CURRNOW,IEN,LAPSEMIN,LASTRUN,MAILGRP,MCHECK,MSTART,NO,NODE
|
---|
7 | N NODE0,NODE40,PAR1,PAR2,PAR3,PAR4,PAR5,PAR6,PAR7,PAR8,RUNNOW
|
---|
8 | N START,STAT,ZTDESC,ZTDTH,ZTIO,ZTRTN
|
---|
9 | ;
|
---|
10 | S NODE0=$G(^HLEV(776.1,+$G(HLEVIENE),0))
|
---|
11 | I NODE0']"" D RECEVM(HLEVIENM,HLEVIENE,"X^NO-0-NODE") QUIT ;->
|
---|
12 | S STAT=$P(NODE0,U,2) I STAT'="A" D RECEVM(HLEVIENM,HLEVIENE,"I") QUIT ;->
|
---|
13 | ; Requeue minutes for monitor...
|
---|
14 | S LAPSE=$P(NODE0,U,4) I LAPSE'?1.N D RECEVM(HLEVIENM,HLEVIENE,"X^INVALID-LAPSE") QUIT ;->
|
---|
15 | ;
|
---|
16 | ; Required M TAG^RTN for monitor...
|
---|
17 | S MSTART=$TR($P(NODE0,U,6),"~",U) I '$$OKMCODE^HLEVAPI0(MSTART) D QUIT ;->
|
---|
18 | . D RECEVM(HLEVIENM,HLEVIENE,"X^INVALID-M ["_$TR(MSTART,U,"~")_"]")
|
---|
19 | ;
|
---|
20 | ; Optional M $$EXTFUNCTION^RTN for determining whether new job should start
|
---|
21 | S MCHECK=$TR($P(NODE0,U,7),"~",U)
|
---|
22 | ;
|
---|
23 | ; If M check for start code exists, but is not valid M code, quit...
|
---|
24 | I MCHECK]"",'$$OKMCODE^HLEVAPI0($P(MCHECK,"$$",2,99)) D QUIT ;->
|
---|
25 | . D RECEVM(HLEVIENM,HLEVIENE,"X-INVALID-M-CHK ["_$TR(MCHECK,U,"~")_"]")
|
---|
26 | ;
|
---|
27 | ; When last run (started)? Return NULL if not completed...
|
---|
28 | S IEN=$O(^HLEV(776,"M",+HLEVIENE,":"),-1)
|
---|
29 | S (NODE,LASTRUN(1))=$G(^HLEV(776,+IEN,0))
|
---|
30 | S LASTRUN=$P(NODE,U),LASTRUN=$S(LASTRUN?7N1"."1.N:LASTRUN,1:"")
|
---|
31 | S X=$P(NODE,U,2) I X?7N1"."1.N S LASTRUN=X
|
---|
32 | ;
|
---|
33 | ; Set start new job default to YES...
|
---|
34 | S CONT=1
|
---|
35 | ;
|
---|
36 | ; If M start check code doesn't exist, check usual fields...
|
---|
37 | I MCHECK']"" D QUIT:'CONT ;->
|
---|
38 | .
|
---|
39 | . ;Start new monitor if last job running and timestamp is current,
|
---|
40 | . ;or monitor never run...
|
---|
41 | .
|
---|
42 | . ; Never run, so start new monitor...
|
---|
43 | . QUIT:LASTRUN']""
|
---|
44 | .
|
---|
45 | . ; Monitor running now, and is current, so don't do anything...
|
---|
46 | . S CURRNOW=$$CURR^HLEVAPI1(+IEN) I CURRNOW D QUIT ;->
|
---|
47 | . . I CURRNOW S CONT=0
|
---|
48 | . . D RECEVM(HLEVIENM,HLEVIENE,"R") ; Monitor running already...
|
---|
49 | .
|
---|
50 | . ; Monitor run, and if time to run new monitor, quit...
|
---|
51 | . S RUNNOW=$$RUNEV^HLEVAPI0(LASTRUN,LAPSE) QUIT:RUNNOW ;->
|
---|
52 | .
|
---|
53 | . S CONT=0 ; Set "no new monitor job needed" variable...
|
---|
54 | . D RECEVM(HLEVIENM,HLEVIENE,"E") QUIT ;-> Too early...
|
---|
55 | ;
|
---|
56 | I MCHECK]"" D QUIT:'CONT ;->
|
---|
57 | . N HLEVRUN
|
---|
58 | . D RUNS(HLEVIENE,.HLEVRUN) ; Define recent monitor runs for API call...
|
---|
59 | . S CONT="S CONT="_MCHECK X CONT
|
---|
60 | . S CONT=$S(CONT=1:1,1:0) QUIT:CONT ;->
|
---|
61 | . D RECEVM(HLEVIENM,HLEVIENE,"M") ; Package API check failed...
|
---|
62 | ;
|
---|
63 | S HLEVIENJ=$$NEWEVENT^HLEVAPI(HLEVIENE) I HLEVIENJ'>0 D QUIT ;->
|
---|
64 | . KILL HLPAR1D,HLPAR2D,HLPAR3D,HLPAR4D,HLPAR5D,HLPAR6D,HLPAR7D,HLPAR8D
|
---|
65 | ;
|
---|
66 | ; Queue a new job...
|
---|
67 | S ZTIO="",ZTDTH=$H,ZTDESC="HL Event Monitor - #"_HLEVIENE
|
---|
68 | S ZTRTN="QUEUEV^HLEVAPI3"
|
---|
69 | S ZTSAVE("HLEVIENJ")="",ZTSAVE("HLEVIENE")=""
|
---|
70 | S ZTSAVE("HLEVNM")="",ZTSAVE("HLEVIENM")=""
|
---|
71 | D ^%ZTLOAD
|
---|
72 | ;
|
---|
73 | ; Save info in 776.2...
|
---|
74 | D RECEVM(HLEVIENM,HLEVIENE,"Q",ZTSK,+HLEVIENJ)
|
---|
75 | ;
|
---|
76 | ; Save task number in 776...
|
---|
77 | D UPDFLDE^HLEVAPI(+HLEVIENJ,8,ZTSK)
|
---|
78 | ;
|
---|
79 | ; Reset back...
|
---|
80 | S ZTSK=ZTSKMST
|
---|
81 | ;
|
---|
82 | QUIT
|
---|
83 | ;
|
---|
84 | RUNS(HLEVIENE,RUN) ; Find latest 10 runs for calling API...
|
---|
85 | N CT,IEN,NODE
|
---|
86 | KILL RUN
|
---|
87 | S CT=0,IEN=":"
|
---|
88 | F S IEN=$O(^HLEV(776,"M",HLEVIENE,IEN),-1) Q:'IEN D QUIT:CT>9
|
---|
89 | . S NODE=$G(^HLEV(776,+IEN,0)) QUIT:NODE']"" ;->
|
---|
90 | . S CT=CT+1
|
---|
91 | . S RUN(CT)=NODE
|
---|
92 | Q
|
---|
93 | ;
|
---|
94 | RECEVM(HLEVIENM,HLEVIENE,RES,ZTSK,HLEVIENJ) ;
|
---|
95 | N CT,DATA,REA
|
---|
96 | ;
|
---|
97 | I $E(RES)="X" S REA=$P(RES,U,2),RES="X"
|
---|
98 | ;
|
---|
99 | S RES=$S($G(RES)]"":RES,1:"?")
|
---|
100 | S NOEVCHK(RES)=$G(NOEVCHK(RES))+1
|
---|
101 | ;
|
---|
102 | QUIT:$G(^HLEV(776.2,+$G(HLEVIENM),0))']"" ;->
|
---|
103 | QUIT:$G(^HLEV(776.1,+$G(HLEVIENE),0))']"" ;->
|
---|
104 | ;
|
---|
105 | S CT=$O(^HLEV(776.2,+HLEVIENM,51,":"),-1)+1
|
---|
106 | S ^HLEV(776.2,+HLEVIENM,51,0)="^776.2051PA^"_CT_U_CT
|
---|
107 | S DATA=HLEVIENE_U_$G(RES)_U_$$NOW^XLFDT
|
---|
108 | I $G(ZTSK) S $P(DATA,U,4)=ZTSK
|
---|
109 | I $G(REA)]"" S $P(DATA,U,7)=REA
|
---|
110 | I $G(HLEVIENJ)>0 S $P(DATA,U,8)=HLEVIENJ
|
---|
111 | S ^HLEV(776.2,+HLEVIENM,51,+CT,0)=DATA
|
---|
112 | S ^HLEV(776.2,+HLEVIENM,51,"B",HLEVIENE,CT)=""
|
---|
113 | ;
|
---|
114 | Q
|
---|
115 | ;
|
---|
116 | QUEUEV ; Queued event job starts here...
|
---|
117 | ; HLEVIENE,HLEVIENJ,HLEVIENM -- req
|
---|
118 | N EVMCODE,EVMGRP,EVNAME,NODE,EVPAR1,EVPAR2,EVPAR3,EVPAR4,EVPAR5
|
---|
119 | N EVPAR6,DVPAR7,EVPAR8
|
---|
120 | ;
|
---|
121 | S ZTREQ="@"
|
---|
122 | ;
|
---|
123 | ; Mark RUNNING before doing anything else...
|
---|
124 | D EVRES^HLEVAPI0(+HLEVIENM,+HLEVIENE,"R",+HLEVIENJ)
|
---|
125 | ;
|
---|
126 | S NODE=$G(^HLEV(776.1,+$G(HLEVIENE),0)) I NODE']"" D QUIT ;->
|
---|
127 | . D EVRES^HLEVAPI0(+HLEVIENM,+HLEVIENE,"XE",+HLEVIENJ)
|
---|
128 | S EVNAME=$P(NODE,U),EVMGRP=$P(NODE,U,5)
|
---|
129 | S EVMCODE=$TR($P(NODE,U,6),"~",U) I EVMCODE'?1.8E1"^"1.8E D QUIT ;->
|
---|
130 | . D EVRES^HLEVAPI0(+HLEVIENM,+HLEVIENE,"XE",+HLEVIENJ)
|
---|
131 | ;
|
---|
132 | ; Node 40...
|
---|
133 | S NODE40=$G(^HLEV(776.1,+HLEVIENE,40))
|
---|
134 | F NO=1:1:8 S @("EVPAR"_NO)=$P(NODE40,U,NO)
|
---|
135 | ;
|
---|
136 | ; Final M code check...
|
---|
137 | I '$$OKMCODE^HLEVAPI0(EVMCODE) D QUIT ;->
|
---|
138 | . D EVRES^HLEVAPI0(+HLEVIENM,+HLEVIENE,"XM",+HLEVIENJ)
|
---|
139 | ;
|
---|
140 | D @EVMCODE
|
---|
141 | ;
|
---|
142 | D EVRES^HLEVAPI0(+HLEVIENM,+HLEVIENE,"F",+HLEVIENJ)
|
---|
143 | ;
|
---|
144 | Q
|
---|
145 | ;
|
---|
146 | MAILIT ; Generic mail out call...
|
---|
147 | ; HLEVIENE,HLEVIENJ -- req
|
---|
148 | ; XMY(...) can be created before this call...
|
---|
149 | N MGRP
|
---|
150 | ;
|
---|
151 | D DEBUG^HLEVAPI2("MAILIT") ; Debug data created conditionally
|
---|
152 | ;
|
---|
153 | ; Stop all event monitoring to enable on-site debugging...
|
---|
154 | QUIT:$G(^TMP("HLEVFLAG",$J))["STOP" ;->
|
---|
155 | ;
|
---|
156 | D ADDXMYS^HLEVAPI2(HLEVIENE,$G(XTMP))
|
---|
157 | ;
|
---|
158 | ; If no mail group, and no passed in XMY, use DUZ...
|
---|
159 | I '$D(XMY),$G(DUZ)>0 S XMY(DUZ)=""
|
---|
160 | ;
|
---|
161 | QUIT:'$D(XMY)
|
---|
162 | ;
|
---|
163 | D SENDMAIL^HLEVAPI(HLEVIENE,+$G(HLEVIENJ),.XMY) ; Use generic email...
|
---|
164 | ;
|
---|
165 | KILL XMSUB,XMTEXT,XMY
|
---|
166 | ;
|
---|
167 | Q
|
---|
168 | ;
|
---|
169 | MONFLAG(VAL) ; Set ^TMP("HLEVFLAG",$J), or return it's value...
|
---|
170 | ; User may pass in the following values for VAL...
|
---|
171 | ;
|
---|
172 | ; * ABORT,STOP -> Will set ^TMP("HLEVFLAG",$J)="STOP"
|
---|
173 | ; * START,RUN,XEC -> Will kill ^TMP("HLEVFLAG",$J)
|
---|
174 | ; * SHOW,"" -> Will return value of ^TMP("HLEVFLAG",$J)
|
---|
175 | ;
|
---|
176 | ; What did user pass in?
|
---|
177 | S VAL=$$UP^XLFSTR($G(VAL))
|
---|
178 | S VAL=$S(VAL="STOP":"STOP",VAL="ABORT":"STOP",VAL="SET":"STOP",VAL="KILL":"@",VAL="START":"@",VAL="RUN":"@",VAL="XEC":"@",1:"")
|
---|
179 | ;
|
---|
180 | I VAL']"" QUIT $G(^TMP("HLEVFLAG",$J)) ;-> Just show value...
|
---|
181 | I VAL="@" KILL ^TMP("HLEVFLAG",$J) QUIT "" ;->
|
---|
182 | I VAL="STOP" S ^TMP("HLEVFLAG",$J)="STOP" QUIT "STOP" ;->
|
---|
183 | ;
|
---|
184 | Q $G(^TMP("HLEVFLAG",$J))
|
---|
185 | ;
|
---|
186 | COUNT(MON,STATUS,GBL,LIM) ; Number of entries for monitor with STATUS...
|
---|
187 | ;
|
---|
188 | ; Pass in... MON -> Name or IEN of monitor
|
---|
189 | ;
|
---|
190 | ; STATUS -> 776's STATUS field code or full expansion
|
---|
191 | ; -- Default = RUNNING
|
---|
192 | ; -- Pass in ALL for all entries
|
---|
193 | ;
|
---|
194 | ; [GBL] -> Global for entry storage. [OPTIONAL]
|
---|
195 | ; Creates @GBL@(#)=IEN ~ 776 zero node
|
---|
196 | ; (KILL @GBL at beginning!)
|
---|
197 | ;
|
---|
198 | ; [LIM] -> Limit to # entries/status to store in GBL.
|
---|
199 | ;
|
---|
200 | ;
|
---|
201 | ; Examples:
|
---|
202 | ;
|
---|
203 | ; $$COUNT("FAST HL7 PURGE #2") -> # events running (default)
|
---|
204 | ; $$COUNT("FAST HL7 PURGE #2","R") -> # events running
|
---|
205 | ; $$COUNT("FAST HL7 PURGE #2","ALL") -> # events of all statuses
|
---|
206 | ;
|
---|
207 | ; The call... $$COUNT("FAST HL7 PURGE #2","ALL","HLEV",1)
|
---|
208 | ;
|
---|
209 | ; Returns... (1) # event entries that exist of all statuses.
|
---|
210 | ; (2) Stores entries in HLEV(#)=zero node
|
---|
211 | ; (3) Stores only the most recent entry (LIM=1)
|
---|
212 | ;
|
---|
213 | ; If LIM>2, for example, the most recent two entries
|
---|
214 | ; would be returned. But, note that the subscripting
|
---|
215 | ; is not oldest to newest, but newest (with subscript
|
---|
216 | ; of 1) to oldest (with subscript of 2.)
|
---|
217 | ;
|
---|
218 | N CT,IEN,NO
|
---|
219 | ;
|
---|
220 | QUIT:$G(MON)']"" "" ;->
|
---|
221 | S:$G(STATUS)']"" STATUS="R" ; Default to RUNNING...
|
---|
222 | S:STATUS="ALL" STATUS="EFQR"
|
---|
223 | I STATUS'="EFQR" S STATUS=$$UP^XLFSTR($E($G(STATUS)_" "))
|
---|
224 | QUIT:"EFQR"'[STATUS "" ;->
|
---|
225 | ;
|
---|
226 | ; If passed GBL, check/set limit..
|
---|
227 | S GBL=$G(GBL),LIM=$G(LIM)
|
---|
228 | S LIM=$S(LIM:LIM,1:999999)
|
---|
229 | ;
|
---|
230 | ; It's OK to pass in the IEN...
|
---|
231 | I MON'=+MON S MON=$O(^HLEV(776.1,"B",MON,0)) QUIT:MON'>0 "" ;->
|
---|
232 | ;
|
---|
233 | ; Remove any data hanging around from before call...
|
---|
234 | I GBL]"" KILL @GBL
|
---|
235 | ;
|
---|
236 | S CT=0,IEN=":"
|
---|
237 | F S IEN=$O(^HLEV(776,"M",+MON,IEN),-1) Q:'IEN D
|
---|
238 | . S DATA=$G(^HLEV(776,+IEN,0))
|
---|
239 | . ; Don't count if doesn't even have a status!
|
---|
240 | . QUIT:$P(DATA,U,4)']"" ;->
|
---|
241 | . ; If STATUS="EFQR", every status should be counted...
|
---|
242 | . I STATUS'="EFQR" QUIT:$P(DATA,U,4)'=STATUS ;->
|
---|
243 | . S CT=CT+1
|
---|
244 | . QUIT:$G(GBL)']"" ;-> Don't store and return...
|
---|
245 | . S CT(1)=$O(@GBL@($P(DATA,U,4),":"),-1)+1
|
---|
246 | . QUIT:CT(1)>LIM ;->
|
---|
247 | . S @GBL@($P(DATA,U,4),+CT(1))=IEN_"~"_DATA
|
---|
248 | ;
|
---|
249 | Q $S(CT:CT,1:"")
|
---|
250 | ;
|
---|
251 | MARKERR ; Mark any RUNNING, but non-current entry's status to ERROR...
|
---|
252 | N DATA,IEN776,HLEVIENE,HLEVIENM,STAT
|
---|
253 | ;
|
---|
254 | S IEN776=0
|
---|
255 | F S IEN776=$O(^HLEV(776,IEN776)) Q:'IEN776 D
|
---|
256 | . S DATA=$G(^HLEV(776,+IEN776,0))
|
---|
257 | . S STAT=$P(DATA,U,4) QUIT:STAT'="R"&(STAT'="Q") ;->
|
---|
258 | . QUIT:$$CURR^HLEVAPI1(+IEN776) ;->
|
---|
259 | . S HLEVIENE=$P(DATA,U,3) QUIT:$G(^HLEV(776.1,+HLEVIENE,0))']"" ;->
|
---|
260 | . S HLEVIENM=$P(DATA,U,9) QUIT:$G(^HLEV(776.2,+HLEVIENM,0))']"" ;->
|
---|
261 | . D EVRES^HLEVAPI0(HLEVIENM,HLEVIENE,"XE",IEN776)
|
---|
262 | ;
|
---|
263 | Q
|
---|
264 | ;
|
---|
265 | EOR ;HLEVAPI3 - Event Monitor APIs ;5/16/03 14:42
|
---|