## Background Currently when a mode change sub mode is an ABORT/ALARM sub mode, operators must refer to an Excel spreadsheet matrix of which paper checklists to complete. This feature is part of an effort to further digitize work instructions and streamline the process of determining which checklists should be completed depending on the reason why a reactor alarmed / aborted. ## Description of Change NICA_ORDERS_SERVICES (and the NICA Integration Service) now support an order type "ABORT_ALARM", which may be triggered when a reactor mode change occurs and the sub mode contains "ABORT/ALARM". Whether or not a NICA order is created depends on if the NICA checklist defined in OpenInsight applies to that reactor type (EpiPro is excluded for now). The "flows" of checklists to prescribe are defined in the REACT_PROB_CAT records for the ABORT/ALARM sub modes. Furthermore, NICA checklists defined in OpenInsight can now feature a property of whether or not they should _not_ be re-prescribed if a new NICA order is created of the same type while one is already active. ## Testing - Local testing - UAT by Jonathon Sperling ## Notes In the previous NICA integration feature, Intrusive Maintenance, the MonA group resource name was stored in environment variables instead of in ENVIRONMENT_SERVICES. After further testing, this turned out to be an unviable option as environment variables that are picked up are from the user's client or the terminal server they are running OpenInsight from. Setting environment variables on all clients and the terminal servers is not practical, so this was removed in a previous PR. Related work items: #175188
329 lines
12 KiB
Plaintext
329 lines
12 KiB
Plaintext
function wo_daily_sched_all_comm(Branch,CurrParm)
|
|
/***********************************************************************************************************************
|
|
|
|
Name : wo_daily_sched_all_comm
|
|
|
|
History : (Date, Initials, Notes)
|
|
04/20/21 djs Updated Form_Create GoSub to use PickPlace instead of Dedicated and Non-Dedicated
|
|
reactor assignments for form color purposes.
|
|
|
|
***********************************************************************************************************************/
|
|
#pragma precomp SRP_PreCompiler
|
|
|
|
declare function set_property, fieldcount, get_property, msg, dialog_box, security_check, Reactor_Log_Services
|
|
declare function send_message, utility, key_sort, start_window, entid, repository, Nica_Orders_Services
|
|
declare function relational_call, memberof, get_mode_icon, Database_Services, Reactor_Services
|
|
declare subroutine extract_si_keys, end_dialog, make.list, security_err_msg, Set_Property, SRP_Stopwatch, Dialog_Box
|
|
Declare subroutine Send_Message
|
|
|
|
$INSERT APPCOLORS
|
|
$INSERT MSG_EQUATES
|
|
$INSERT LSL_USERS_EQU
|
|
$INSERT RDS_EQU
|
|
$INSERT SECURITY_RIGHTS_EQU
|
|
$INSERT LOGICAL
|
|
$INSERT POPUP_EQUATES
|
|
$INSERT REACT_MODE_EQU
|
|
$INSERT WO_LOG_EQUATES
|
|
$INSERT WO_DAILY_SCHED_EQU
|
|
$INSERT WO_MASTER_SCHED_EQU
|
|
$INSERT REACTOR_EQUATES
|
|
$INSERT REACT_MODE_EQUATES
|
|
$INSERT REACT_STATUS_EQUATES
|
|
$INSERT REACT_LL_EQUATES
|
|
$Insert PS_EQUATES
|
|
$INSERT REACTOR_LOG_EQUATES
|
|
$INSERT REACT_MODE_NG_EQUATES
|
|
$INSERT REACTOR_CHILD_KEY_IDS_EQUATES
|
|
|
|
Equ CRLF$ to \0D0A\
|
|
EQU APPBRED$ TO 255 + ( 0*256) + ( 0*65536)
|
|
EQU APPRED$ TO 220 + (192*256) + (192*65536)
|
|
EQU APPPINK$ TO 220 + (192*256) + (192*65536)
|
|
EQU APPGREEN$ TO 192 + (220*256) + (192*65536)
|
|
EQU APPGREY$ TO 192 + (192*256) + (192*65536)
|
|
EQU APPYELLOW$ TO 255 + (255*256) + (202*65536)
|
|
EQU APPDKRED$ TO 128 + ( 0*256) + ( 0*65536)
|
|
EQU APPBLUE$ TO 0 + ( 0*256) + (255*65536)
|
|
EQU APPGANBLUE$ TO 181 + (235*256) + (251*65536) ;* Added GaN blue background to ID GaN reactors - dkk 6/6/16
|
|
ForceModeChange = FALSE$ ;* flag set to true when changing work order stamp
|
|
ReturnVar = 0
|
|
Branches = 'FORM_CREATE,REACT_DETAIL,IQSViolButton,ChecklistButton'
|
|
|
|
CONVERT ',' TO @FM IN Branches
|
|
|
|
LOCATE Branch IN Branches USING @FM SETTING Bpos THEN
|
|
ON Bpos gosub FORM_CREATE, REACT_DETAIL, IQSViolButton, ChecklistButton
|
|
END ELSE
|
|
Void = msg( '', 'Invalid Branch ':Bpos:' passed to wo_daily_sched_comm' )
|
|
END
|
|
|
|
RETURN ReturnVar
|
|
|
|
|
|
*===============================================================================================*
|
|
ChecklistButton:
|
|
|
|
Message = ''
|
|
ReactorNo = CurrParm[-1, 'B_']
|
|
|
|
Status_0311 = XLATE('REACTOR', ReactorNo, REACTOR_0311_ACTIVE$, 'X')
|
|
|
|
If Status_0311 EQ '' then Status_0311 = False$
|
|
|
|
CurrModeKey = Xlate('REACTOR_CHILD_KEY_IDS_NG', ReactorNo, REACTOR_CHILD_KEY_IDS_REACT_MODE_KEY_IDS$, 'X')
|
|
CurrRLKey = Xlate('REACT_MODE_NG', CurrModeKey, REACT_MODE_NG_START_RL_ID$, 'X')
|
|
ReactorNicaOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactorNo)
|
|
ReactorPmOrderIds = Nica_Orders_Services('GetActiveOrders', 'REACTOR_LOG', CurrRlKey)
|
|
|
|
ChecklistInfo = 'The following checklist(s) are active: '
|
|
|
|
If Status_0311 then ChecklistInfo<-1> = '0311 OCAP'
|
|
|
|
If ReactorPmOrderIds NE '' then
|
|
For each ReactorPmOrderId in ReactorPmOrderIds using @VM setting vPos
|
|
ProgressPercentage = Xlate('NICA_ORDERS', ReactorPmOrderId, 'PROGRESS_PERCENTAGE', 'X')
|
|
ChecklistInfo<-1> = Xlate('NICA_ORDERS', ReactorPmOrderId, 'ORDER_TYPE', 'X') : ' - ' : ProgressPercentage :'% Complete.'
|
|
Next RlPmType
|
|
end
|
|
|
|
If ReactorNicaOrders NE '' then
|
|
For each NicaOrderId in ReactorNicaOrders using @VM
|
|
ProgressPercentage = Xlate('NICA_ORDERS', NicaOrderId, 'PROGRESS_PERCENTAGE', 'X')
|
|
ChecklistInfo<-1> = Xlate('NICA_ORDERS', NicaOrderId, 'ORDER_TYPE', 'X') : ' - ' : ProgressPercentage :'% Complete.'
|
|
Next NicaOrderId
|
|
end
|
|
|
|
Swap @FM with CRLF$ in ChecklistInfo
|
|
|
|
MsgOverride = ''
|
|
MsgOverride<MICON$> = '!'
|
|
Msg(@Window, MsgOverride, 'IQS_BOX', '', 'R': ReactorNo : ' Checklist Info' : @FM : ChecklistInfo)
|
|
|
|
return
|
|
|
|
*===============================================================================================*
|
|
IQSViolButton:
|
|
Message = ''
|
|
ReactorNo = CurrParm[-1, 'B_']
|
|
CurrIQSData = Database_Services('ReadDataRow', 'CONFIG', 'IQS_VIOL_DATA')
|
|
ViolationInfo = ''
|
|
for ViolRow = 1 to DCount(CurrIQSData<1>, @VM)
|
|
ViolReactNo = CurrIQSData<1, ViolRow>
|
|
If ViolReactNo EQ ReactorNo then
|
|
ViolationInfo<-1> = CurrIQSData<2, ViolRow> : ' - ' : CurrIQSData<8,ViolRow>
|
|
end
|
|
Next ViolRow
|
|
Swap @FM with CRLF$ in ViolationInfo
|
|
Msg(@Window, '', 'IQS_BOX', '', 'R': ReactorNo : ' Violation Info' : @FM : ViolationInfo)
|
|
return
|
|
|
|
FORM_CREATE:
|
|
|
|
CurSize = Get_Property(@Window, "SIZE")
|
|
MinW = CurSize<3>
|
|
MinH = CurSize<4>
|
|
MaxW = CurSize<3>
|
|
MaxH = CurSize<4>
|
|
Set_Property(@Window,"TRACKINGSIZE",MinW:@FM:MinH:@FM:MaxW:@FM:MaxH)
|
|
|
|
IF Assigned(CurrParm) AND CurrParm NE '' THEN
|
|
Window = CurrParm
|
|
END ELSE
|
|
Window = @WINDOW
|
|
END
|
|
|
|
IF Window = 'WO_DAILY_SCHED_ALL' OR Window = 'REACT_STATUS_ODD' THEN
|
|
StartReact = 21
|
|
EndReact = 79
|
|
END ELSE
|
|
StartReact = 20
|
|
EndReact = 78
|
|
END
|
|
Qualifier = ''
|
|
Qualifier<1> = 1
|
|
Qualifier<4> = 0 ; * process synchronously (i.e. immediately)
|
|
|
|
For I = StartReact To EndReact STEP 2
|
|
IQSPicControl = Window : '.OLE_PIC_IQS_': i
|
|
Qualifier = 1: @fm: 2: "*": @appid<1>: "*OMNIEVENT*": Window : "."
|
|
EventQualified = Send_Message(IQSPicControl, 'QUALIFY_EVENT', 'OLE.OnClick', Qualifier)
|
|
|
|
ChecklistPicControl = Window : '.OLE_PIC_' : i
|
|
EventQualified = Send_Message(ChecklistPicControl, 'QUALIFY_EVENT', 'OLE.OnClick', Qualifier)
|
|
Next I
|
|
|
|
IQSData = Database_Services('ReadDataRow', 'CONFIG', 'IQS_VIOL_DATA')
|
|
|
|
FOR I = StartReact TO EndReact STEP 2
|
|
|
|
ReactRec = Xlate('REACTOR',I,'','X')
|
|
LLDisabled = ReactRec<REACTOR_LL_DISABLED$>
|
|
ReactAssign = ReactRec<REACTOR_REACT_ASSIGNMENT$>
|
|
PickPlace = ReactRec<REACTOR_PICK_PLACE$>
|
|
ReactType = ReactRec<REACTOR_REACT_TYPE$>
|
|
NotRepairable = ReactRec<REACTOR_NOT_REPAIRABLE$>
|
|
EpiPro = (ReactType EQ 'EPP')
|
|
EscElapsedTime = OCONV(XLATE('REACTOR',I,'ACT_ESC_HRS','X'),'MD2')
|
|
OutOfProdDTM = Xlate('REACT_STATUS',I,REACT_STATUS_OUT_OF_PROD_DTM$,'X')
|
|
|
|
BEGIN CASE
|
|
CASE EscElapsedTime NE '' ; BackColor = APPYELLOW$ ;* Reactor in escalation
|
|
CASE ReactAssign = 'G' ; BackColor = APPGANBLUE$ ;* Added GaN blue background to ID GaN reactors - dkk 6/6/16
|
|
CASE ReactAssign = 'O' ; BackColor = APPGREY$ ;* Out of service
|
|
CASE Not(NotRepairable)
|
|
|
|
ReactorLoaded = Reactor_Services('IsReactorLoaded', I)
|
|
TimeSinceLastUnload = Reactor_Services('GetReactorTimeSinceUnload', I)
|
|
CurrMode = Reactor_Services('GetReactCurrModeName', I)
|
|
E10State = Xlate('REACTOR_MODES', CurrMode, 'E10_STATE', 'X')
|
|
Productive = (E10State EQ 'Productive')
|
|
If Productive and Not(ReactorLoaded) and TimeSinceLastUnload GE 30 then
|
|
BackColor = APPRED$
|
|
end else
|
|
BackColor = APPGREEN$
|
|
end
|
|
* CASE ReactAssign = 'M' ; BackColor = APPRED$ ;* M = Dedicated
|
|
CASE NotRepairable ; BackColor = LTORANGE$
|
|
CASE 1 ; BackColor = APPGREY$
|
|
END CASE
|
|
Set_Property(Window:'.RPANEL':I,'BACKCOLOR',BackColor)
|
|
Set_Property(Window:'.RWO':I,'BACKCOLOR',BackColor)
|
|
Set_Property(Window:'.RCUST':I,'BACKCOLOR',BackColor)
|
|
Set_Property(Window:'.TIM':I,'BACKCOLOR',BackColor)
|
|
Set_Property(Window:'.ESC':I,'BACKCOLOR',BackColor)
|
|
|
|
RMId = 'REACT_MODE':I
|
|
|
|
CurrDTM = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTHS'),'DT') ;* Current Date-Time in internal format
|
|
|
|
CurrModeRec = XLATE('CONFIG',RMId,'','X')
|
|
CurrMode = CurrModeRec<Mode$>
|
|
|
|
ModeStartDt = CurrModeRec<Date$>
|
|
ModeStartTm = CurrModeRec<Time$>
|
|
|
|
StartDTM = ICONV(ModeStartDt:' ':ModeStartTm,'DT')
|
|
|
|
TimeInMode = OCONV(ICONV((CurrDTM - StartDTM)*24,'MD1'),'MD1')
|
|
TimeOutOfProd = OCONV(ICONV((CurrDTM - OutOfProdDTM)*24,'MD1'),'MD1')
|
|
IF CurrMode THEN
|
|
Icon = Get_Mode_Icon( CurrMode, Mode$ )
|
|
Extension = '.BMP'
|
|
DosBmp = 'BMPS\':Icon:Extension
|
|
Void = Set_Property( Window:'.RMODE':I, 'BITMAP', DosBmp )
|
|
END
|
|
|
|
DailySchedName = 'WO_DAILY_SCHED':I
|
|
DSR = XLATE( 'CONFIG', DailySchedName, '', 'X' )
|
|
WOCust = DSR<WOCust$>
|
|
WO = FIELD( WOCust, ' ', 1 )
|
|
Cust = FIELD( WOCust, ' ', 2, 999 )
|
|
|
|
Size = Xlate('REACTOR', I, REACTOR_SUSC_POCKET_SIZE$, 'X')
|
|
Size = Field(Size, ' ' , 3, 2)
|
|
|
|
CONVERT ' ' TO '' IN Size
|
|
|
|
WONo = WO[1,'.']
|
|
|
|
ActiveReactLLKey = XLATE('REACTOR',I, REACTOR_ACTIVE_LL_DISABLED$, 'X' ) ;* Drive asterisk from new field ACTIVE_LL_DISABLED
|
|
|
|
IF ActiveReactLLKey NE '' THEN
|
|
LLDisabled = XLATE('REACT_LL',ActiveReactLLKey,REACT_LL_DISABLED$,'X')
|
|
|
|
IF LLDisabled = 'L' THEN WO = '* ':WO
|
|
IF LLDisabled = 'R' THEN WO = WO:' *'
|
|
END
|
|
|
|
RPanelTitle = 'R':I:' - ':Size
|
|
If PickPlace = 1 Then
|
|
RPanelTitle := ' - PP'
|
|
END
|
|
|
|
Status_ProveIn = Xlate('REACTOR', I, REACTOR_PROVE_IN_ACTIVE$, 'X')
|
|
|
|
Status_0311 = XLATE('REACTOR', I, REACTOR_0311_ACTIVE$, 'X')
|
|
|
|
IF Status_0311 EQ '' THEN Status_0311 = FALSE$
|
|
|
|
Set_Property(Window:'.RPANEL':I, 'TEXT', RpanelTitle ) ;* Display Wafer Size in inches
|
|
Set_Property(Window:'.RWO':I, 'TEXT', WO ) ;* Display WO #
|
|
Set_Property(Window:'.RCUST':I, 'TEXT', Cust ) ;* Display Customer Name
|
|
|
|
If Status_ProveIn EQ True$ then
|
|
Set_Property(Window:'.OLE_PIC_':I, 'OLE.Image', '.\BMPS\ActiveProveIn.png')
|
|
end
|
|
|
|
If Status_0311 EQ True$ then
|
|
Set_Property(Window:'.OLE_PIC_':I, 'OLE.Image', '.\BMPS\Active_0311.png')
|
|
end
|
|
|
|
CurrModeKey = Xlate('REACTOR_CHILD_KEY_IDS_NG', I, 'REACT_MODE_KEY_IDS', 'X')
|
|
CurrModeKey = CurrModeKey[-1, 'B':@VM]
|
|
CurrRLKey = Xlate('REACT_MODE_NG', CurrModeKey, 'START_RL_ID', 'X')
|
|
Status_ReactorPM = Xlate('REACTOR_LOG', CurrRLKey, REACTOR_LOG_CHECKLIST_ACTIVE$, 'X')
|
|
|
|
If Status_ReactorPM EQ '' then Status_ReactorPM = False$
|
|
|
|
If Status_ReactorPM EQ True$ then
|
|
Set_Property(Window:'.OLE_PIC_':I, 'OLE.Image', '.\BMPS\ActiveReactorPM.png')
|
|
end
|
|
|
|
Status_HgCV_Alarm = Xlate('REACTOR', I, REACTOR_HGCV_CHECKLIST_ACTIVE$, 'X')
|
|
Status_Intrusive_Maint = Xlate('REACTOR', I, REACTOR_INTRUSIVE_MAINT_CHECKLIST_ACTIVE$, 'X')
|
|
Status_Abort_Alarm = Xlate('REACTOR', I, REACTOR_ABORT_ALARM_CHECKLIST_ACTIVE$, 'X')
|
|
If Status_HgCV_Alarm or Status_Intrusive_Maint or Status_Abort_Alarm then
|
|
Set_Property(Window:'.OLE_PIC_':I, 'OLE.Image', '.\BMPS\ActiveProveIn.png')
|
|
end
|
|
|
|
OlePicVisible = ( Status_ProveIn or Status_0311 or Status_ReactorPM or Status_HgCV_Alarm or Status_Intrusive_Maint or Status_Abort_Alarm )
|
|
Set_Property(Window:'.OLE_PIC_':I,'VISIBLE', OlePicVisible)
|
|
|
|
IQSPicControl = @Window : '.OLE_PIC_IQS_': i
|
|
Locate I in IQSData<1> using @VM setting vPos then
|
|
Set_Property(IQSPicControl,'VISIBLE', 1)
|
|
Set_Property(IQSPicControl, 'OLE.Image', '.\BMPS\IQS.PNG')
|
|
end else
|
|
Set_Property(IQSPicControl,'VISIBLE', 0)
|
|
end
|
|
WOLogRow = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
|
HotLot = WOLogRow<WO_LOG_HOT_FLAG$>
|
|
|
|
IF HotLot THEN
|
|
Set_Property(Window:'.RWO':I, 'FORECOLOR',APPBRED$) ;* Hot Lots font is red
|
|
END ELSE
|
|
Set_Property(Window:'.RWO':I, 'FORECOLOR',APPBLUE$)
|
|
END
|
|
|
|
ProdModes = 'Production':@VM
|
|
ProdModes := 'Production (incr sampling)':@VM
|
|
ProdModes := 'UP_WITH_RESTRICTIONS':@VM
|
|
ProdModes := 'UP':@VM
|
|
ProdModes := 'UP_WITH_INCREASED_SAMPLING':@VM
|
|
ProdModes := 'UP_WITH_INCREASED_SAMPLING_SURFACE':@VM
|
|
ProdModes := 'UP_WITH_INCREASED_SAMPLING_METROLOGY':@VM
|
|
ProdModes := 'UP_NOT_RUNNING'
|
|
|
|
LOCATE CurrMode IN ProdModes USING @VM SETTING DUMMY THEN
|
|
Set_Property(Window:'.TIM':I,'TEXT',TimeInMode)
|
|
Set_Property(Window:'.TIM':I,'FORECOLOR',APPBLUE$)
|
|
END ELSE
|
|
IF TimeOutOfProd > '99999.0' THEN TimeOutOfProd = '****'
|
|
Set_Property(Window:'.TIM':I,'TEXT',TimeOutOfProd)
|
|
Set_Property(Window:'.TIM':I,'FORECOLOR',APPDKRED$)
|
|
END
|
|
|
|
Skip:
|
|
NEXT I
|
|
|
|
RETURN
|
|
|
|
*===============================================================================================*
|
|
REACT_DETAIL:
|
|
Void = start_window( 'WO_DAILY_SCHED_SINGLE', @window, CurrParm:'*CENTER', '', '' )
|
|
return
|
|
*===============================================================================================*
|
|
|
|
|