1 | VDEFREQ ;INTEGIC/AM & BPOIFO/JG - VDEF Request Processor ; 15 Nov 2005 3:00 PM
|
---|
2 | ;;1.0;VDEF;**3**;Dec 28, 2004
|
---|
3 | ;Per VHA Directive 2004-038, this routine should not be modified.
|
---|
4 | ;
|
---|
5 | ; IA: 10063 - $$S^%ZTLOAD
|
---|
6 | ; 10063 - $$ASKSTOP^%ZTLOAD
|
---|
7 | ;
|
---|
8 | Q ; No bozos
|
---|
9 | ;
|
---|
10 | EN ; Main entry point for the Request Queue processor from TaskMan
|
---|
11 | ;
|
---|
12 | ; Input parameter:
|
---|
13 | ; QIEN - Request Queue IEN passed in by TaskMan
|
---|
14 | ;
|
---|
15 | ; Output parameters:
|
---|
16 | ; ZTSTOP - flag indicating whether to stop processing: 0 by default
|
---|
17 | ; 1 if an outside request to stop the Processor or internal error
|
---|
18 | ; 2 if VistA HL7 API errored out
|
---|
19 | ; ZTREQ - Tells the Submanager to delete this task's record if "@"
|
---|
20 | ;
|
---|
21 | N DSTDATA,DSTIEN,ERR,FDA,NVPIEN,QUEUE,SCHED,IEN,VDEFWAIT,VDEFTSK
|
---|
22 | S VDEFTSK=ZTSK
|
---|
23 | ;
|
---|
24 | ; Lock this Request Queue from other processors. If it's already locked,
|
---|
25 | ; another process has it.
|
---|
26 | L +^VDEFHL7(579.3,"QUEUE",QIEN):1 G EXIT:'$T
|
---|
27 | ;
|
---|
28 | EN1 ; Re-entry point after the wait period has expired
|
---|
29 | ;
|
---|
30 | ; Quit if there has been a request to stop processing
|
---|
31 | S ZTSTOP=$$S^%ZTLOAD() G EXIT:ZTSTOP
|
---|
32 | ;
|
---|
33 | ; Get the queue data
|
---|
34 | S QUEUE=$G(^VDEFHL7(579.3,QIEN,0))
|
---|
35 | ;
|
---|
36 | ; Quit if this Request Queue is suspended
|
---|
37 | G EXIT:$P(QUEUE,U,9)="S"
|
---|
38 | ;
|
---|
39 | ; Set the wait period to the REQUEST QUEUE WAKEUP
|
---|
40 | S VDEFWAIT=+$P(QUEUE,U,2)
|
---|
41 | ;
|
---|
42 | ; See if current time is in a scheduling rule
|
---|
43 | S SCHED=$$SCHEDULE^VDEFQM(QIEN,$H) G EN2:'SCHED
|
---|
44 | ;
|
---|
45 | ; If current time is in a suspend rule, set wait period to
|
---|
46 | ; the next start time or the basic wakeup period whichever is longer.
|
---|
47 | I $P(SCHED,U)="S",$P(SCHED,U,2)>VDEFWAIT S VDEFWAIT=$P(SCHED,U,2) G WAITLOOP
|
---|
48 | ;
|
---|
49 | EN2 ; Update the Request Queue definition with the current task #
|
---|
50 | K FDA S FDA(1,579.3,QIEN_",",.11)=VDEFTSK D FILE^DIE("","FDA(1)","ERR(1)")
|
---|
51 | ;
|
---|
52 | ; Store VDEF Destination data in a local array
|
---|
53 | S DSTIEN=0 F S DSTIEN=$O(^VDEFHL7(579.2,DSTIEN)) Q:'DSTIEN D
|
---|
54 | . S DSTDATA(DSTIEN)=$G(^VDEFHL7(579.2,DSTIEN,0))
|
---|
55 | ;
|
---|
56 | ; Loop through the Queued Up requests for this queue
|
---|
57 | S (ZTSTOP,IEN)=0
|
---|
58 | F S IEN=$O(^VDEFHL7(579.3,"C","Q",QIEN,IEN)) Q:IEN="" D Q:ZTSTOP
|
---|
59 | . ;
|
---|
60 | . ; Quit if there has been a request to stop processing
|
---|
61 | . S ZTSTOP=$$S^%ZTLOAD() Q:ZTSTOP
|
---|
62 | . I $P($G(^VDEFHL7(579.3,QIEN,0)),U,9)="S" S ZTSTOP=1 Q
|
---|
63 | . N DSTPROT,DSTTYP,DYNAMIC,ERR,SITEPARM
|
---|
64 | . N FDA,VDEFHL,HLA,HLCS,IEN577,IENS,II,HL
|
---|
65 | . N NAMEVAL,PAIR,REQUEST,SUBT,VAL,VDEFERR
|
---|
66 | . S IENS=IEN_","_QIEN_"," ; Request Queue IEN string
|
---|
67 | . L +^VDEFHL7(579.3,QIEN,IEN):5 Q:'$T
|
---|
68 | . M VAL=^VDEFHL7(579.3,QIEN,1,IEN) S REQUEST=$G(VAL(0))
|
---|
69 | . M NAMEVAL=VAL(.05) ; Name Value pairs
|
---|
70 | . M DYNAMIC=VAL(.19) ; Dynamic Addressing information
|
---|
71 | . K VAL
|
---|
72 | . ;
|
---|
73 | . ; Check for an incomplete record
|
---|
74 | . I '$D(NAMEVAL(1)) L -^VDEFHL7(579.3,QIEN,IEN) Q
|
---|
75 | . ;
|
---|
76 | . ; Change request status from "Q"ueued Up to "C"hecked Out
|
---|
77 | . S FDA(1,579.31,IENS,.02)="C" D FILE^DIE("","FDA(1)") K FDA
|
---|
78 | . ;
|
---|
79 | . ; Get the Event Subtype
|
---|
80 | . S SUBT="",PAIR=$P($G(NAMEVAL(1,0)),U,2)
|
---|
81 | . I $P(PAIR,"=",1)="SUBTYPE" S SUBT=$P(PAIR,"=",2)
|
---|
82 | . E D ERR("Subtype missing from Name/Value Pair") L -^VDEFHL7(579.3,QIEN,IEN) Q
|
---|
83 | . ;
|
---|
84 | . ; Get the VistA data file IEN
|
---|
85 | . S NVPIEN="",PAIR=$P($G(NAMEVAL(2,0)),U,2)
|
---|
86 | . I $P(PAIR,"=",1)="IEN" S NVPIEN=$P(PAIR,"=",2)
|
---|
87 | . E D ERR("IEN missing from Name/Value Pair") L -^VDEFHL7(579.3,QIEN,IEN) Q
|
---|
88 | . ;
|
---|
89 | . ; Retrieve the Destination information for this request
|
---|
90 | . S DSTIEN=$P(REQUEST,U,7),DSTTYP=$P($G(DSTDATA(+DSTIEN)),U,2)
|
---|
91 | . ;
|
---|
92 | . ; Get the VDEF Event IEN
|
---|
93 | . S IEN577=$P(REQUEST,U,18)
|
---|
94 | . ;
|
---|
95 | . ; Get the VISTA HL7 Protocol
|
---|
96 | . S DSTPROT=$P($G(^VDEFHL7(577,IEN577,0)),U,7)
|
---|
97 | . I DSTPROT="" D ERR("Protocol not defined in VDEF event file") S ZTSTOP=1 L -^VDEFHL7(579.3,QIEN,IEN) Q
|
---|
98 | . ;
|
---|
99 | . ; Create delimiter structure to use when building segments
|
---|
100 | . D INIT^HLFNC2(DSTPROT,.VDEFHL)
|
---|
101 | . I '$D(VDEFHL) D ERR("No HL7 parameters for this Protocol") S ZTSTOP=1 L -^VDEFHL7(579.3,QIEN,IEN) Q
|
---|
102 | . S HLCS=$E(VDEFHL("ECH")) M HL=VDEFHL ; Some called routines use 'HL' array
|
---|
103 | . ;
|
---|
104 | . ; Get the site parameters
|
---|
105 | . S SITEPARM=$$PARAM^HLCS2
|
---|
106 | . ;
|
---|
107 | . ; If no IEN don't generate an HL7 message
|
---|
108 | . I $G(NVPIEN)="" D STATUS^VDEFREQ1(IENS,"P"),ERR("Invalid IEN") S ZTSTOP=1 L -^VDEFHL7(579.3,QIEN,IEN) Q
|
---|
109 | . D NOW^%DTC S FDA(1,579.31,IENS,.09)=%
|
---|
110 | . ;
|
---|
111 | . ; Update this Request record with the current date & time
|
---|
112 | . D FILE^DIE("","FDA(1)","ERR(1)") K FDA
|
---|
113 | . ;
|
---|
114 | . ; Generate HL7 message for this request
|
---|
115 | . D GENERATE^VDEFREQ1(NVPIEN,.HLA,HLCS,IEN577,SUBT,DSTPROT,DSTTYP,.ZTSTOP,.VDEFHL,.DYNAMIC)
|
---|
116 | . ;
|
---|
117 | . ; Update request status from Checked Out to Processed or Errored Out
|
---|
118 | . ; Leave Request Checked Out if VistA HL7 errored out (ZTSTOP=2)
|
---|
119 | . I ZTSTOP'=2 D STATUS^VDEFREQ1(IENS,$S(ZTSTOP=1:"E",1:"P")) S ZTSTOP=0
|
---|
120 | . I ZTSTOP=2 S ZTSTOP=0 ; If VistA HL7 errored out, continue processing
|
---|
121 | . ;
|
---|
122 | . ; Unlock the record
|
---|
123 | . L -^VDEFHL7(579.3,QIEN,IEN)
|
---|
124 | ;
|
---|
125 | ; Quit if necessary.
|
---|
126 | G EXIT:ZTSTOP
|
---|
127 | ; Wait for the next time to run.
|
---|
128 | ; The wait process is in a loop so it can check if there
|
---|
129 | ; has been a request to stop processing before the wait expires.
|
---|
130 | WAITLOOP N I S ZTSTOP=0 F I=1:1:VDEFWAIT D Q:ZTSTOP
|
---|
131 | . S ZTSTOP=$$S^%ZTLOAD() Q:ZTSTOP
|
---|
132 | . I $P(^VDEFHL7(579.3,QIEN,0),U,9)="S" S ZTSTOP=1 Q
|
---|
133 | . H 1
|
---|
134 | ;
|
---|
135 | ; Quit or resume processing
|
---|
136 | I 'ZTSTOP K I G EN1
|
---|
137 | ;
|
---|
138 | ; Quit
|
---|
139 | ; Unlock the record in case it left the loop with an error
|
---|
140 | EXIT L -^VDEFHL7(579.3,"QUEUE",QIEN),-^VDEFHL7(579.3,QIEN,IEN)
|
---|
141 | D ALERT^VDEFUTIL("VDEF REQUEST QUEUE PROCESSOR FOR "_$P(QUEUE,U)_" HAS EXITED.")
|
---|
142 | ;
|
---|
143 | ; Stop the task and delete this task's record
|
---|
144 | N X,I S ZTSK=VDEFTSK,X=$$ASKSTOP^%ZTLOAD(ZTSK),ZTREQ="@"
|
---|
145 | F I=1:1:5 D STAT^%ZTLOAD Q:ZTSK(1)=0!(ZTSK(1)>2) H 1
|
---|
146 | K X,I
|
---|
147 | Q
|
---|
148 | ;
|
---|
149 | ERR(TEXT) ; Error processing
|
---|
150 | N FDA,ERR
|
---|
151 | S VDEFERR=$TR(TEXT,"^"),FDA(1,579.31,IENS,.17)=VDEFERR
|
---|
152 | D FILE^DIE("","FDA(1)","ERR")
|
---|
153 | Q
|
---|