| 1 | MAGJLS2 ;WIRMFO/JHC Rad. Workstation RPC calls ; 29 Jul 2003  9:58 AM
 | 
|---|
| 2 |  ;;3.0;IMAGING;**22,18**;Mar 07, 2006
 | 
|---|
| 3 |  ;; +---------------------------------------------------------------+
 | 
|---|
| 4 |  ;; | Property of the US Government.                                |
 | 
|---|
| 5 |  ;; | No permission to copy or redistribute this software is given. |
 | 
|---|
| 6 |  ;; | Use of unreleased versions of this software requires the user |
 | 
|---|
| 7 |  ;; | to execute a written test agreement with the VistA Imaging    |
 | 
|---|
| 8 |  ;; | Development Office of the Department of Veterans Affairs,     |
 | 
|---|
| 9 |  ;; | telephone (301) 734-0100.                                     |
 | 
|---|
| 10 |  ;; |                                                               |
 | 
|---|
| 11 |  ;; | The Food and Drug Administration classifies this software as  |
 | 
|---|
| 12 |  ;; | a medical device.  As such, it may not be changed in any way. |
 | 
|---|
| 13 |  ;; | Modifications to this software may result in an adulterated   |
 | 
|---|
| 14 |  ;; | medical device under 21CFR820, the use of which is considered |
 | 
|---|
| 15 |  ;; | to be a violation of US Federal Statutes.                     |
 | 
|---|
| 16 |  ;; +---------------------------------------------------------------+
 | 
|---|
| 17 |  ;;
 | 
|---|
| 18 |  Q
 | 
|---|
| 19 |  ;  ACTIVE -- list exams (Unread, Recent, &/or Pending) for input Imaging Type(s)
 | 
|---|
| 20 |  ;       RPC Call: MAGJ RADACTIVEEXAMS
 | 
|---|
| 21 |  ;  BKGND -- EP for Bkgnd Compile of UNREAD list
 | 
|---|
| 22 |  ;  BKGND2 -- EP for Bkgnd Compile of RECENT list
 | 
|---|
| 23 |  Q
 | 
|---|
| 24 | BKGERR S ERRCOUNT=$G(ERRCOUNT)+1 H 3 I ERRCOUNT>2 K ZTQUEUED G ^XUSCLEAN ; prevent bkgnd loop
 | 
|---|
| 25 | ERR1 I $G(LSTNAM)]"" L -^XTMP("MAGJ2","BKGND",LSTNAM,"COMPILE")
 | 
|---|
| 26 |  L -^XTMP("MAGJ2","BKGND2","RUN")
 | 
|---|
| 27 | ERR N ERR S ERR=$$EC^%ZOSV S ^TMP($J,"RET",0)="0^4~"_ERR
 | 
|---|
| 28 |  S MAGGRY=$NA(^TMP($J,"RET"))
 | 
|---|
| 29 |  D @^%ZOSF("ERRTN")
 | 
|---|
| 30 |  Q:$Q 1  Q
 | 
|---|
| 31 | ACTIVE(MAGGRY,DATA) ; EP--get Active (Unread/Recent/Pend) Exam Lists
 | 
|---|
| 32 |  ; MAGGRY holds $NA ref to ^TMP where return msg is assembled
 | 
|---|
| 33 |  ;   all refs to MAGGRY use SS indirection
 | 
|---|
| 34 |  ; If not use bkgnd, compile in foregnd
 | 
|---|
| 35 |  ;
 | 
|---|
| 36 |  N BKGND,COMPFAIL,MAGLST,LSTPARAM,LSTREQ,LSTID,LSTNUM,LSTNAM,NEWLIST
 | 
|---|
| 37 |  N $ETRAP,$ESTACK S $ETRAP="D ERR^MAGJLS2"
 | 
|---|
| 38 |  S X=$P(DATA,U) D PARAMS^MAGJLS2B(X)
 | 
|---|
| 39 |  I 'LSTID S MAGGRY=$NA(^TMP($J,"RET")),@MAGGRY@(0)="0^4~Problem with Exams List Compile--"_DATA_"." Q
 | 
|---|
| 40 |  I BKGND,LSTREQ="U" D BKREQU Q  ; UNREAD in bkgnd
 | 
|---|
| 41 |  I BKGND,LSTREQ="R" D BKREQR Q  ; RECENT in bkgnd
 | 
|---|
| 42 |  I BKGND,LSTREQ="A" D BKREQA(DATA) Q  ; ALL Active Exams
 | 
|---|
| 43 |  D FOREGND  ; other list types, or bkgnd compile not enabled
 | 
|---|
| 44 | ACTIVEZ Q
 | 
|---|
| 45 |  ;
 | 
|---|
| 46 | FOREGND ; compile in foregnd
 | 
|---|
| 47 |  I LSTREQ="H" G HISTORY
 | 
|---|
| 48 |  D BLDACTV^MAGJLS3(.MAGLST,LSTPARAM)
 | 
|---|
| 49 |  D LSTOUT^MAGJLS2B(.MAGGRY,LSTID,MAGLST) K @MAGLST
 | 
|---|
| 50 |  Q
 | 
|---|
| 51 |  ;
 | 
|---|
| 52 | HISTORY ; compile History list
 | 
|---|
| 53 |  D BLDACTV^MAGJLS3(.MAGLST,LSTPARAM)
 | 
|---|
| 54 |  D LSTOUT^MAGJLS2B(.MAGGRY,LSTID,MAGLST)
 | 
|---|
| 55 |  ; copy data from above compile into History file
 | 
|---|
| 56 |  N EXID,HISTIEN,IEN,REC1,REC2,CDAT,TMP,PC
 | 
|---|
| 57 |  I +$G(@MAGLST@(0,1)) D
 | 
|---|
| 58 |  . S IEN="" F  S IEN=$O(@MAGLST@(IEN)) Q:(IEN="")  S REC1=^(IEN,1),REC2=^(2) D
 | 
|---|
| 59 |  . . I IEN=0 S ^XTMP("MAGJ2","HISTORY",DUZ,DUZ(2),IEN,1)=REC1,^(2)=REC2 Q  ; header string
 | 
|---|
| 60 |  . . S HISTIEN=+$P(REC2,"|",3) Q:'HISTIEN  S EXID=$P(REC2,"|",2)
 | 
|---|
| 61 |  . . S X=$G(^XTMP("MAGJ2","HISTORY",DUZ,DUZ(2),0,"ADD",HISTIEN))
 | 
|---|
| 62 |  . . I X]"" D
 | 
|---|
| 63 |  . . . I EXID'=$P(X,"|",2) Q
 | 
|---|
| 64 |  . . . ; copy Client data into list column fields 12-15 in node 2
 | 
|---|
| 65 |  . . . S CDAT=$P(REC2,"|",3),TMP=$P(REC2,"|")
 | 
|---|
| 66 |  . . . F I=1:1:4 S PC=11+I,$P(TMP,U,PC)=$P(CDAT,U,I)
 | 
|---|
| 67 |  . . . S TMP=TMP_U ; pad extra nil piece
 | 
|---|
| 68 |  . . . S $P(REC2,"|")=TMP,$P(REC2,"|",3)=HISTIEN ; preserve IEN in PP3
 | 
|---|
| 69 |  . . . S ^XTMP("MAGJ2","HISTORY",DUZ,DUZ(2),HISTIEN,1)=REC1,^(2)=REC2
 | 
|---|
| 70 |  . . . K ^XTMP("MAGJ2","HISTORY",DUZ,DUZ(2),0,"ADD",HISTIEN) ; Kill input node
 | 
|---|
| 71 |  K @MAGLST
 | 
|---|
| 72 |  Q
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 | BKREQU ; UNREAD exams from bkgnd
 | 
|---|
| 75 |  L +^XTMP("MAGJ2","BKGND2","RUN"):0
 | 
|---|
| 76 |  E  D BKOUT("UNREAD") Q  ; bkgnd process IS running
 | 
|---|
| 77 |  ; NOT running, so start it!
 | 
|---|
| 78 |  ; 2nd errtrap is to deal with locks if error occurs
 | 
|---|
| 79 |  N $ETRAP,$ESTACK S $ETRAP="D ERR1^MAGJLS2"
 | 
|---|
| 80 |  N ZTDESC,ZTDTH,ZTIO,ZTRTN
 | 
|---|
| 81 |  S ZTRTN="BKGND^MAGJLS2",ZTDESC="IMAGING VistaRad UNREAD List Compile"
 | 
|---|
| 82 |  S ZTDTH=$H,ZTIO="" D ^%ZTLOAD
 | 
|---|
| 83 |  S X=$$CURLIST(LSTNAM),LSTAGE=$P(X,U,2),LSTNUM=+X
 | 
|---|
| 84 |  I LSTAGE>(DELTA+300)  S BKGPROC=2 D  ; Foregnd compile if need fresh list
 | 
|---|
| 85 |  . D LSTCOMP(.COMPFAIL) K BKGPROC S X=$$CURLIST(LSTNAM),LSTAGE=$P(X,U,2),LSTNUM=+X
 | 
|---|
| 86 |  L -^XTMP("MAGJ2","BKGND2","RUN")
 | 
|---|
| 87 |  I +$G(COMPFAIL) S MAGGRY=$NA(^TMP($J,"RET")),@MAGGRY@(0)="0^4~Unable to Compile Unread Exams list"
 | 
|---|
| 88 |  E  D LSTOUT^MAGJLS2B(.MAGGRY,LSTID,$NA(^XTMP("MAGJ2",LSTNAM,LSTNUM)),LSTAGE)
 | 
|---|
| 89 |  Q
 | 
|---|
| 90 |  ;
 | 
|---|
| 91 | BKREQR ; Recent Exams from bkgnd
 | 
|---|
| 92 |  D BKOUT("RECENT")
 | 
|---|
| 93 |  Q
 | 
|---|
| 94 |  ;
 | 
|---|
| 95 | BKOUT(LSTNM) ; output list from the bkgnd process
 | 
|---|
| 96 |  S X=$$CURLIST(LSTNAM),LSTAGE=$P(X,U,2),LSTNUM=+X
 | 
|---|
| 97 |  I 'LSTNUM S MAGGRY=$NA(^TMP($J,"RET")),@MAGGRY@(0)="0^4~Problem with "_LSTNM_" List Compile program (age="_LSTAGE_" for "_LSTNAM_")"_$S(LSTNAM["9992":"--May need to Schedule RECENT List Compile in TaskMan.",1:"")
 | 
|---|
| 98 |  E  D LSTOUT^MAGJLS2B(.MAGGRY,LSTID,$NA(^XTMP("MAGJ2",LSTNAM,LSTNUM)),LSTAGE)
 | 
|---|
| 99 |  Q
 | 
|---|
| 100 |  ;
 | 
|---|
| 101 | BKREQA(DATA) ; ALL Active from Bkgnd
 | 
|---|
| 102 |  ; Copy compiles of Unread & Recent to a scratch global, & call lstout
 | 
|---|
| 103 |  N ALLGO,CNT,GETLST,ICNT,REPLY
 | 
|---|
| 104 |  S ALLGO=1,CNT=0
 | 
|---|
| 105 |  F GETLST=9991,9992 D  I 'ALLGO S REPLY="Component List "_GETLST_ALLGO Q
 | 
|---|
| 106 |  . D PARAMS^MAGJLS2B(GETLST) I 'LSTID S ALLGO=" not properly defined."  Q
 | 
|---|
| 107 |  . S X=$$CURLIST(LSTNAM),LSTAGE=$P(X,U,2),LSTNUM=+X
 | 
|---|
| 108 |  . I 'LSTNUM S ALLGO=" needs more time to compile." Q
 | 
|---|
| 109 |  . F ICNT=1:1:$G(^XTMP("MAGJ2",LSTNAM,LSTNUM,0,1)) S X=^XTMP("MAGJ2",LSTNAM,LSTNUM,ICNT,1),Y=^(2),CNT=CNT+1,^TMP($J,"MAGJ",CNT,1)=X,^(2)=Y
 | 
|---|
| 110 |  I ALLGO D
 | 
|---|
| 111 |  . S ^TMP($J,"MAGJ",0,1)=CNT_U_"1~ALL Active Exams",^(2)=""
 | 
|---|
| 112 |  . D PARAMS^MAGJLS2B($P(DATA,U))
 | 
|---|
| 113 |  . D LSTOUT^MAGJLS2B(.MAGGRY,LSTID,$NA(^TMP($J,"MAGJ")))
 | 
|---|
| 114 |  I 'ALLGO S MAGGRY=$NA(^TMP($J,"RET")),@MAGGRY@(0)="0^4~Problem with ALL Exams List Compile "_DATA_". "_REPLY
 | 
|---|
| 115 |  Q
 | 
|---|
| 116 |  ;
 | 
|---|
| 117 | BKGND ; EP for background compile of UNREAD exams
 | 
|---|
| 118 |  L +^XTMP("MAGJ2","BKGND2","RUN"):600 ; allow fgnd job to finish compile
 | 
|---|
| 119 |  E  Q  ; I must already be running!
 | 
|---|
| 120 |  N BKGLSTID S BKGLSTID=9991 G BKGNDA
 | 
|---|
| 121 |  Q
 | 
|---|
| 122 | BKGND2 ; EP--bkgnd compile RECENT
 | 
|---|
| 123 |  N BKGLSTID S BKGLSTID=9992 G BKGNDA
 | 
|---|
| 124 |  Q
 | 
|---|
| 125 | BKGNDA S BKGPROC=1,U="^"
 | 
|---|
| 126 |  N $ETRAP,$ESTACK S $ETRAP="D BKGERR^MAGJLS2"
 | 
|---|
| 127 |  D MAGJOBNC^MAGJUTL3
 | 
|---|
| 128 |  D PARAMS^MAGJLS2B(BKGLSTID)
 | 
|---|
| 129 | BKLOOP ; Loop & compile "master" UNREAD List only
 | 
|---|
| 130 |  S BKLOOP=$G(BKLOOP)+1
 | 
|---|
| 131 |  I BKLOOP>1 D PARAMS^MAGJLS2B(9991)
 | 
|---|
| 132 |  I 'LSTID D  G BKGNDZ
 | 
|---|
| 133 |  . S X="0^4~Problem with BACKGROUND Compile of Exams List"
 | 
|---|
| 134 |  . F I=1,2 K ^XTMP("MAGJ2",LSTNAM,I)
 | 
|---|
| 135 |  . F I=1,2 S ^XTMP("MAGJ2",LSTNAM,I,0,1)=X,^(2)=""  ; get msg to WS user
 | 
|---|
| 136 |  I 'BKGND G BKGNDZ  ; need this to cover for excessive time to compile
 | 
|---|
| 137 |  S X=$$CURLIST(LSTNAM),LSTAGE=$P(X,U,2),LSTNUM=+X
 | 
|---|
| 138 |  I LSTREQ="U",(LSTAGE<DELTA) D  I 'BKGND G BKGNDZ ;bkgnd compile off?
 | 
|---|
| 139 |  . N ITEST,TEST,MORE
 | 
|---|
| 140 |  . S TEST=(DELTA-LSTAGE)\5,MORE=(DELTA-LSTAGE)-(5*TEST)
 | 
|---|
| 141 |  . ; while waiting, periodic chk for stop conditions
 | 
|---|
| 142 |  . F ITEST=1:1:TEST H 5 D  Q:'BKGND
 | 
|---|
| 143 |  .. S BKGND=+$P($G(^MAG(2006.69,1,0)),U,8) Q:'BKGND
 | 
|---|
| 144 |  .. I $D(ZTQUEUED),$$S^%ZTLOAD S BKGND=0 ; Exit bkgnd via TaskMan Req
 | 
|---|
| 145 |  . H MORE
 | 
|---|
| 146 |  D LSTCOMP()
 | 
|---|
| 147 |  I LSTREQ="R" D NEWINT
 | 
|---|
| 148 |  I LSTREQ="U" D UPDR G BKLOOP  ;UNREAD loops; RECENT uses TaskMan
 | 
|---|
| 149 | BKGNDZ I LSTREQ="U" L -^XTMP("MAGJ2","BKGND2","RUN")
 | 
|---|
| 150 |  N ZTREQ S ZTREQ="@"  ;  clean up task entry
 | 
|---|
| 151 |  K BKLOOP,DELTA
 | 
|---|
| 152 |  Q  ; Exit bkgnd
 | 
|---|
| 153 |  ;
 | 
|---|
| 154 | UPDR ; Add Newly Interp exams to Recent
 | 
|---|
| 155 |  D PARAMS^MAGJLS2B(9995)
 | 
|---|
| 156 |  I 'LSTID G UPDRZ
 | 
|---|
| 157 |  S X=$$CURLIST(LSTNAM),LSTAGE=$P(X,U,2),LSTNUM=+X
 | 
|---|
| 158 |  D LSTCOMP()
 | 
|---|
| 159 | UPDRZ Q  ;
 | 
|---|
| 160 |  ;
 | 
|---|
| 161 | NEWINT ; Exams newly Interp since Recent Compile started
 | 
|---|
| 162 |  ; are added to Recent List (add to "RECENT" index)
 | 
|---|
| 163 |  ; 1st, get list of all potential candidates:
 | 
|---|
| 164 |  N INDX L +^XTMP("MAGJ2","RECENT"):15
 | 
|---|
| 165 |  E  Q
 | 
|---|
| 166 |  S INDX=+$G(^TMP($J,"NEWINT")) ; counter when Recent Compile started
 | 
|---|
| 167 |  I INDX S INDX=INDX-1 F  S INDX=$O(^XTMP("MAGJ2","RECENT",INDX)) Q:'INDX  S X=^(INDX) I X S ^TMP($J,"NEWINT",0,INDX)=X
 | 
|---|
| 168 |  K ^XTMP("MAGJ2","RECENT") S ^("RECENT",0)=0 ; init this index
 | 
|---|
| 169 |  L -^XTMP("MAGJ2","RECENT")
 | 
|---|
| 170 |  ;find those not included in Recent Compile, and add to index
 | 
|---|
| 171 |  S INDX=""
 | 
|---|
| 172 |  F  S INDX=$O(^TMP($J,"NEWINT",0,INDX)) Q:'INDX  S X=^(INDX) D
 | 
|---|
| 173 |  . I $D(^TMP($J,"NEWINT",$P(X,U,1,3))) Q  ; already in the compile
 | 
|---|
| 174 |  . L +^XTMP("MAGJ2","RECENT"):15
 | 
|---|
| 175 |  . E  Q
 | 
|---|
| 176 |  . S I=+$G(^XTMP("MAGJ2","RECENT",0))+1,$P(^(0),U)=I,^(I)=X ; add to indx
 | 
|---|
| 177 |  . L -^XTMP("MAGJ2","RECENT")
 | 
|---|
| 178 |  K ^TMP($J,"NEWINT")
 | 
|---|
| 179 |  Q
 | 
|---|
| 180 |  ;
 | 
|---|
| 181 | LSTCOMP(COMPFAIL) ; Compile new list; subrtn used by Active and Bkgnd tags
 | 
|---|
| 182 |  S COMPFAIL=0 ; Return T/F for "Executed a List Compile?"
 | 
|---|
| 183 |  L +^XTMP("MAGJ2","BKGND",LSTNAM,"COMPILE"):60 ; shouldn't need any time
 | 
|---|
| 184 |  E  S COMPFAIL=1 G LSTCOMZ
 | 
|---|
| 185 |  S NEWLIST=$S(LSTNUM=1:2,1:1) ; toggle node to use for new compile
 | 
|---|
| 186 |  N TS,COMTIM
 | 
|---|
| 187 |  S TS="" F I=2,0 S %H=$H+I D YMD^%DTC S TS=TS_$S(TS="":"",1:U)_X
 | 
|---|
| 188 |  S ^XTMP("MAGJ2",0)=TS_U_"VistaRad List Compile"
 | 
|---|
| 189 |  S ^XTMP("MAGJ2",0,LSTNAM,NEWLIST)=$H
 | 
|---|
| 190 |  D BLDACTV^MAGJLS3(.MAGGRY,LSTPARAM,$NA(^XTMP("MAGJ2",LSTNAM,NEWLIST)))
 | 
|---|
| 191 |  S COMTIM=$$DELTA($P(^XTMP("MAGJ2",0,LSTNAM,NEWLIST),U))
 | 
|---|
| 192 |  S ^XTMP("MAGJ2",LSTNAM,NEWLIST)=$H_U_$J_U_COMTIM
 | 
|---|
| 193 |  S ^XTMP("MAGJ2","BKGND",LSTNAM,0)=NEWLIST_U_$H
 | 
|---|
| 194 |  I $G(^XTMP("MAGJ2",0,"TIME")) D
 | 
|---|
| 195 |  . S T1=$P($H,",",2)/3600,T2=$E(100+(T1\1),2,3),T=T2_":"_$E(100+(T1-T2*60),2,3)
 | 
|---|
| 196 |  . S ^XTMP("MAGJ2",0,"TIME",LSTNAM,+$H,T)=COMTIM K T,T1,T2
 | 
|---|
| 197 | LSTCOMZ L -^XTMP("MAGJ2","BKGND",LSTNAM,"COMPILE")
 | 
|---|
| 198 |  Q  ;
 | 
|---|
| 199 |  ;
 | 
|---|
| 200 | CURLIST(LSTNAM,WAIT) ; return current list & its age in seconds
 | 
|---|
| 201 |  ;
 | 
|---|
| 202 |  S WAIT=+$G(WAIT)
 | 
|---|
| 203 |  N X,RET,AGE,TRY,START,EXTRATIM
 | 
|---|
| 204 |  S TRY=0,START=$H,EXTRATIM=$S(LSTREQ="U":600,1:1800)
 | 
|---|
| 205 |  S X=$G(^XTMP("MAGJ2","BKGND",LSTNAM,0))  ; Cur # ^ $H created
 | 
|---|
| 206 |  I X="" S RET="^86400" G CURLISZ  ; this lstnam not yet compiled!
 | 
|---|
| 207 |  S AGE=$$DELTA($P(X,U,2)),RET=$P(X,U)_U_AGE
 | 
|---|
| 208 |  I AGE>(DELTA+EXTRATIM) S $P(RET,U)=""  ; Something's wrong w/ compile; force error message
 | 
|---|
| 209 | CURLISZ Q RET
 | 
|---|
| 210 |  ;
 | 
|---|
| 211 | DELTA(X,Y) ; calc # seconds between 2 $h values; default 2nd value = now
 | 
|---|
| 212 |  ; useful limit is one day
 | 
|---|
| 213 |  I $G(Y)="" S Y=$H
 | 
|---|
| 214 |  I +Y=+X
 | 
|---|
| 215 |  E  D
 | 
|---|
| 216 |  . I Y-X=1 S $P(Y,",",2)=86400+$P(Y,",",2)  ; cross midnight boundary
 | 
|---|
| 217 |  . E  S $P(X,",",2)=0,$P(Y,",",2)=86400  ; more than one day
 | 
|---|
| 218 |  Q ($P(Y,",",2)-$P(X,",",2))
 | 
|---|
| 219 |  ;
 | 
|---|
| 220 | END ;
 | 
|---|