[613] | 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
|
---|