pre cutover push

This commit is contained in:
Infineon\StieberD
2024-09-04 20:33:41 -07:00
parent 6ea6969f4b
commit 7762b129af
2072 changed files with 130000 additions and 95295 deletions

View File

@ -50,17 +50,26 @@ $Insert REACT_UTIL_EQU
$Insert SCHED_DET_NG_EQUATES
$Insert REACT_STATUS_EQUATES
$Insert WO_LOG_EQUATES
$Insert REACTOR_DAILY_UPTIME_EQUATES
$Insert REACT_LL_EQUATES
equ WOCust$ to 2
//Uptime Percentage Equates
EQU PRODUCTIVE$ to 1
EQU UNSCHED$ to 2
EQU SCHED$ to 3
EQU NONSCHED$ to 4
EQU ENG$ to 5
Declare subroutine Error_Services, Reactor_Services, Memory_Services, RList, Database_Services, SRP_JSON, obj_React_Mode
Declare subroutine Excel_Services, Schedule_Services, Logging_Services, Set_Status, obj_React_Status, Errmsg,React_Assign_Conv
Declare subroutine Obj_Notes, Btree.Extract, SRP_Fastarray
Declare subroutine Obj_Notes, Btree.Extract, SRP_Fastarray, Delay, Mona_Services, SRP_List
Declare function SRP_Array, Reactor_Services, Memory_Services, Database_Services, SRP_Sort_Array, Excel_Services
Declare function SRP_Math, SRP_Hash, SRP_JSON, Epi_Part_Services, Schedule_Services, Date_Services, Environment_Services
Declare function Logging_Services, GetCommandLine, NextKey, Reactor_Log_Services, SRP_DateTime
Declare function Datetime, Reactor_Modes_Services, Work_Order_Services, React_Mode_NG_Services, Lsl_Users_Services
Declare function SRP_Time, Rds_Services, SRP_Fastarray
Declare function SRP_Time, Rds_Services, SRP_Fastarray, Httpclient_Services, SRP_List, Utility, Memberof, Error_Services
// Report paths for various performance report services.
TemplatesFolder = Environment_Services('GetApplicationRootPath') : '\Reports\Scheduler\Templates\'
@ -89,7 +98,7 @@ Return Response else ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Service Parameter Options
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options BOOLEAN = True$, False$
Options BOOLEAN = True$, False$
Options REACTORMETRIC = 'TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK', 'SUSC_WFR_CNT', 'LOWER_QUARTZ_THK', 'LOWER_QUARTZ_WFR', 'ARMS_WFR_CNT'
@ -1517,6 +1526,13 @@ Service GetReactorCurrLoad(ReactNo)
Response = LoadedCassettes
end service
Service GetReactorCurrLoadRDS(ReactNo)
Response = ''
ReactStatusRec = Database_Services('ReadDataRow', 'REACT_STATUS', ReactNo)
LoadedCassettes = ReactStatusRec<REACT_STATUS_LOAD_RDS$>
Response = LoadedCassettes
end service
Service GetReactCurrModeRec(ReactNo)
Response = ''
@ -1959,6 +1975,59 @@ Service CreateReactModeChange(UserID, ReactNo, Mode, ModeSubCat, ModeText, Force
end else
ErrorMsg = 'Failed to locate ModeSubCat.'
end
CurrentMode = PrevModeRec<REACT_MODE_NG_MODE$>
ActiveProveInPreventsModeChange = Reactor_Services('ActiveProveInPreventsModeChange', ReactNo, Mode, CurrentMode)
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
end else
If ActiveProveInPreventsModeChange EQ True$ then
ErrorMsg = 'A reactor prove in is required before changing the mode. Active prove in types: '
TypeList = ''
ProveInTypes = Xlate('REACTOR', ReactNo, REACTOR_PROVE_IN_TYPE$, 'X')
for each ProveInType in ProveInTypes using @VM setting Idx
If Idx GT 1 then
TypeList := ', '
end
TypeList := ProveInType
Next ProveInType
ErrorMsg := TypeList
end
end
IdleStartupRequired = Xlate('REACTOR', ReactNo, REACTOR_IDLE_STARTUP_REQUIRED$, 'X')
If ErrorMsg EQ '' and IdleStartupRequired and Mode[1, 2] EQ 'UP' then
ProveInTypes = Xlate('REACTOR', ReactNo, REACTOR_PROVE_IN_TYPE$, 'X')
IdleStartupActive = False$
for each ProveInType in ProveInTypes using @VM setting Idx
If ProveInType EQ 'IDLE' then
IdleStartupActive = True$
end
Next ProveInType
If IdleStartupActive EQ True$ then
ErrorMsg = "You must complete the IDLE_STARTUP prove in checklist before putting the reactor UP."
end else
ErrorMsg = "An IDLE_STARTUP prove in checklist is required before putting the reactor UP. Change the mode to IDLE_STARTUP, then complete the checklist."
end
end
If ErrorMsg EQ '' then
If Len(Mode) GT 10 and Mode[1, 10] EQ 'CHANGEOVER' then
Reactor_Services('CreateReactorProveInOrder', ReactNo, 'CHANGEOVER')
end
If Mode EQ 'INITIATE_IDLE' then
Reactor_Services('CreateReactorProveInOrder', ReactNo, 'INITIATE_IDLE')
end
If Mode EQ 'IDLE_STARTUP' then
Reactor_Services('CreateReactorProveInOrder', ReactNo, 'IDLE')
end
end
If ErrorMsg EQ '' then
//Log the current Mode Change
@ -2423,6 +2492,7 @@ Service ConvertRecordToJSON(ReactorNo, ItemURL, CurrUser, FullObject=BOOLEAN)
LoadLockDisabled = Xlate('REACT_LL', LLDisabledKey, 'DISABLED', 'X')
SRP_JSON(objReactor, 'SetValue', 'loadLockDown', LoadLockDisabled)
SRP_JSON(objReactor, 'SetValue', '0311Active', Xlate('REACTOR', ReactorNo, '0311_ACTIVE', 'X'), 'Boolean')
SRP_JSON(objReactor, 'SetValue', 'active0311Checklist', Xlate('REACTOR', ReactorNo, '0311_ACTIVE', 'X'), 'Boolean')
SRP_JSON(objReactor, 'SetValue', 'TubeBellJarCnt', Xlate('REACTOR', ReactorNo, REACTOR_TUBE_BELL_JAR_THK$, 'X'))
SRP_JSON(objReactor, 'SetValue', 'TubeBellJarThk', Xlate('REACTOR', ReactorNo, REACTOR_TUBE_BELL_JAR_WFR_CNT$, 'X'))
SRP_JSON(objReactor, 'SetValue', 'SusceptorCnt', Xlate('REACTOR', ReactorNo, REACTOR_SUSC_WFR_CNT$, 'X'))
@ -2446,7 +2516,7 @@ Service ConvertRecordToJSON(ReactorNo, ItemURL, CurrUser, FullObject=BOOLEAN)
SRP_JSON(objReactor, 'SetValue', 'loadedRDS', '')
end
//Add new reactor items here
// Add new reactor items here
InstItems = Xlate('REACTOR', ReactorNo, REACTOR_CURR_INST_ITEMS$, 'X')
If InstItems NE '' then
objInstItems = ''
@ -2507,6 +2577,7 @@ Service ConvertRecordToJSON(ReactorNo, ItemURL, CurrUser, FullObject=BOOLEAN)
end
end
// Reactor Mode object/properties
If FullObject then
// Add reactor mode object
JSONReactorMode = React_Mode_NG_Services('ConvertRecordToJSON', CurrModeKey, '', CurrUser)
@ -2526,6 +2597,56 @@ Service ConvertRecordToJSON(ReactorNo, ItemURL, CurrUser, FullObject=BOOLEAN)
SRP_JSON(objReactor, 'SetValue', 'e10State', E10State)
end
If Not(FullObject) then
// Add reactor log properties
CurrRlKey = Xlate('REACTOR', ReactorNo, 'CURR_MODE_RL_ID', 'X')
If CurrRLKey NE '' then
RlChecklistActive = Xlate('REACTOR_LOG', CurrRlKey, 'CHECKLIST_ACTIVE', 'X')
SRP_JSON(objReactor, 'SetValue', 'reactorLogChecklistActive', RlChecklistActive, 'Boolean')
If RlChecklistActive then
RlChecklistTypes = Xlate('REACTOR_LOG', CurrRlKey, 'CHECKLIST_TYPE', 'X')
RlChecklistOrderIds = Xlate('REACTOR_LOG', CurrRlKey, 'CHECKLIST_ORDER_ID', 'X')
objRlChecklistArray = ''
If SRP_JSON(objRlChecklistArray, 'New', 'Array') then
objChecklist = ''
For each RlChecklistType in RlChecklistTypes using @VM setting vPos
If SRP_JSON(objChecklist, 'New', 'Object') then
SRP_JSON(objChecklist, 'SetValue', 'reactorLogChecklistType', RlChecklistType)
RlChecklistOrderId = RlChecklistOrderIds<0, vPos>
SRP_JSON(objChecklist, 'SetValue', 'reactorLogChecklistOrderId', RlChecklistOrderId)
SRP_JSON(objRlChecklistArray, 'Add', objChecklist)
SRP_JSON(objChecklist, 'Release')
end
Next RlChecklistType
SRP_JSON(objReactor, 'Set', 'reactorLogChecklists', objRlChecklistArray)
SRP_JSON(objRlChecklistArray, 'Release')
end
end
end
// Add prove in checklist properties
PiChecklistActive = Xlate('REACTOR', ReactorNo, 'PROVE_IN_ACTIVE', 'X')
SRP_JSON(objReactor, 'SetValue', 'proveInChecklistActive', PiChecklistActive, 'Boolean')
If PiChecklistActive then
PiTypes = Xlate('REACTOR', ReactorNo, 'PROVE_IN_TYPE', 'X')
PiChecklistOrderIds = Xlate('REACTOR', ReactorNo, 'PROVE_IN_ORDER_ID', 'X')
objPiChecklistArray = ''
If SRP_JSON(objPiChecklistArray, 'New', 'Array') then
objProveIn = ''
For each PiType in PiTypes using @VM setting vPos
If SRP_JSON(objProveIn, 'New', 'Object') then
SRP_JSON(objProveIn, 'SetValue', 'proveInType', PiType)
PiChecklistOrderId = PiCheckListOrderIds<0, vPos>
SRP_JSON(objProveIn, 'SetValue', 'proveInOrderId', PiChecklistOrderId)
SRP_JSON(objPiChecklistArray, 'Add', objProveIn)
SRP_JSON(objProveIn, 'Release')
end
Next PiType
SRP_JSON(objReactor, 'Set', 'proveInChecklists', objPiChecklistArray)
SRP_JSON(objPiChecklistArray)
end
end
end
If itemURL NE '' then
// The itemURL was passed in so add HAL+JSON properties.
objLinks = ''
@ -2595,6 +2716,7 @@ Service ConvertJSONToRecord(KeyID, JSON)
end service
Service CleanReactStatus()
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
@ -2687,12 +2809,13 @@ Service GetReactModeKeysByTimeSpan(ReactorNo, StartDtm, StopDtm)
end
end service
Service GetReactorUptimePercentageByTimeSpan(ReactorNo, StartDtm, StopDtm)
Service GetReactorUptimeMetricsByTimeSpan(ReactorNo, StartDtm, StopDtm)
ToolData = ''
TotalProductiveMinutes = 0
TotalUnscheduledDownMinutes = 0
TotalScheduledDownMinutes = 0
TotalNonSchedMinutes = 0
TotalEngMinutes = 0
Begin Case
Case ReactorNo Eq ''
@ -2843,27 +2966,106 @@ Service GetReactorUptimePercentageByTimeSpan(ReactorNo, StartDtm, StopDtm)
end
end
TotalScheduledDownMinutes += MinutesInMode
Case E10State EQ 'Non-Scheduled' OR E10State EQ 'Standby'
if ModeStartDtm LT StartDtm then
//Mode Started Earlier than report time
If ModeStopDtm LT StopDtm then
//Mode finished within the timespan
If ModeStopDtm NE '' then
MinutesInMode = SRP_Datetime('MinuteSpan', StartDTM, ModeStopDtm)
end else
//Mode is not closed
If ModeStartDtm LT StartDtm then
//if ModeStartDtm is before StartDtm and is not close used the total report timespan
MinutesInMode = SRP_Datetime('MinuteSpan', StartDTM, StopDtm)
end else
//Use the ModeStartDtm and the StopDtm
MinutesInMode = SRP_Datetime('MinuteSpan', ModeStartDtm, StopDtm)
end
end
end else
//Mode finished after the timespan
MinutesInMode = SRP_Datetime('MinuteSpan', StartDTM, StopDtm)
end
end else
//Mode started after report time
If ModeStopDtm LT StopDtm then
//Mode finished within the timespan OR isn't yet closed
If ModeStopDtm NE '' then
//Mode is closed. Started and finished within the report time so use the Mode's start and stop
MinutesInMode = SRP_Datetime('MinuteSpan', ModeStartDtm, ModeStopDtm)
end else
//Mode is not closed. Started within the report time but has yet to stop.
MinutesInMode = SRP_Datetime('MinuteSpan', ModeStartDtm, StopDtm)
end
end else
//Mode finished after the timespan
MinutesInMode = SRP_Datetime('MinuteSpan', ModeStartDtm, StopDtm)
end
end
TotalNonSchedMinutes += MinutesInMode
Case E10State EQ 'Engineering'
if ModeStartDtm LT StartDtm then
//Mode Started Earlier than report time
If ModeStopDtm LT StopDtm then
//Mode finished within the timespan
If ModeStopDtm NE '' then
MinutesInMode = SRP_Datetime('MinuteSpan', StartDTM, ModeStopDtm)
end else
//Mode is not closed
If ModeStartDtm LT StartDtm then
//if ModeStartDtm is before StartDtm and is not close used the total report timespan
MinutesInMode = SRP_Datetime('MinuteSpan', StartDTM, StopDtm)
end else
//Use the ModeStartDtm and the StopDtm
MinutesInMode = SRP_Datetime('MinuteSpan', ModeStartDtm, StopDtm)
end
end
end else
//Mode finished after the timespan
MinutesInMode = SRP_Datetime('MinuteSpan', StartDTM, StopDtm)
end
end else
//Mode started after report time
If ModeStopDtm LT StopDtm then
//Mode finished within the timespan OR isn't yet closed
If ModeStopDtm NE '' then
//Mode is closed. Started and finished within the report time so use the Mode's start and stop
MinutesInMode = SRP_Datetime('MinuteSpan', ModeStartDtm, ModeStopDtm)
end else
//Mode is not closed. Started within the report time but has yet to stop.
MinutesInMode = SRP_Datetime('MinuteSpan', ModeStartDtm, StopDtm)
end
end else
//Mode finished after the timespan
MinutesInMode = SRP_Datetime('MinuteSpan', ModeStartDtm, StopDtm)
end
end
TotalEngMinutes += MinutesInMode
End Case
If E10State EQ 'Productive' then
end
Next key
ProdPercentage = (TotalProductiveMinutes / TotalReportMinutes) * 100
UnschedDownPercentage = (TotalUnscheduledDownMinutes / TotalReportMinutes) * 100
SchedDownPercentage = (TotalScheduledDownMinutes / TotalReportMinutes) * 100
NonSchedPercentage = (TotalNonSchedMinutes / TotalReportMinutes) * 100
EngPercentage = (TotalEngMinutes / TotalReportMinutes) * 100
EQU PRODUCTIVE$ To 1
EQU UNSCHED$ to 2
EQU SCHED$ to 3
//Percentages
ToolData<1, PRODUCTIVE$> = ProdPercentage
ToolData<1, UNSCHED$> = UnschedDownPercentage
ToolData<1, SCHED$> = SchedDownPercentage
ToolData<1, NONSCHED$> = NonSchedPercentage
ToolData<1, ENG$> = EngPercentage
//Total Minutes
ToolData<2, PRODUCTIVE$> = TotalProductiveMinutes
ToolData<2, UNSCHED$> = TotalUnscheduledDownMinutes
ToolData<2, SCHED$> = TotalScheduledDownMinutes
ToolData<2, NONSCHED$> = TotalNonSchedMinutes
ToolData<2, ENG$> = TotalEngMinutes
Response = ToolData
end else
Response = Error_Services('GetMessage')
@ -2873,6 +3075,125 @@ Service GetReactorUptimePercentageByTimeSpan(ReactorNo, StartDtm, StopDtm)
end
end service
Service GetReactorUptimeMetricsByTypeAndTimeSpan(startDtm, endDtm, reactType)
Begin Case
Case startDtm EQ ''
Error_Services('Add', 'Error getting reactor uptime metrics -> Report start date not supplied')
Case endDtm EQ ''
Error_Services('Add', 'Error getting reactor uptime metrics -> Report end date not supplied')
End Case
If reactType EQ '' then reactType = 'ALL'
If Error_Services('NoError') then
If endDtm GT Date() then
//This sets the current report end time to the current time.
endDtm = Datetime()
end
reportMinutes = SRP_Datetime('MinuteSpan', startDtm, endDtm)
if num(reportMinutes) then
Begin Case
Case reactType EQ 'ASM' or reactType EQ 'ASM+'
Reactors = Reactor_Services('GetReactorNumbers', 'ASM') : @FM : Reactor_Services('GetReactorNumbers', 'ASM+')
Case reactType EQ 'HTR'
Reactors = Reactor_Services('GetReactorNumbers', 'HTR')
Case reactType EQ 'EPP'
Reactors = Reactor_Services('GetReactorNumbers', 'EPP')
Case reactType EQ 'ALL'
Reactors = Reactor_Services('GetReactorNumbers', 'ASM') : @FM : Reactor_Services('GetReactorNumbers', 'ASM+') : @FM : Reactor_Services('GetReactorNumbers', 'HTR') : @FM : Reactor_Services('GetReactorNumbers', 'EPP')
End Case
AllReactorsScheduledMinutes = 0
AllReactorsUptimeMinutes = 0
AllReactorsProdMinutes = 0
AllReactorsUnschedDownMinutes = 0
AllReactorsSchedDownMinutes = 0
AllReactorsEngMinutes = 0
AllReactorsIdleMinutes = 0
AllReactorsSingleLL= 0
TotalMinutesUp = 0
ReactorsData = ''
ReactorsExcluded = ''
for each Reactor in Reactors using @FM
ReactorStateTimes = Reactor_Services('GetReactorUptimeMetricsByTimeSpan', Reactor, startDtm, endDtm)
PercentProd = ReactorStateTimes<1,PRODUCTIVE$>
MinuteProd = ReactorStateTimes<2,PRODUCTIVE$>
PercentUnSchedDown = ReactorStateTimes<1,UNSCHED$>
MinuteUnschedDown = ReactorStateTimes<2,UNSCHED$>
PercentSchedDown = ReactorStateTimes<1,SCHED$>
MinuteSchedDown = ReactorStateTimes<2,SCHED$>
PercentNonSched = ReactorStateTimes<1,NONSCHED$>
MinutesNonSched = ReactorStateTimes<2,NONSCHED$>
PercentEng = ReactorStateTimes<1, ENG$>
MinutesEng = ReactorStateTimes<2, ENG$>
if MinutesNonSched LT reportMinutes then
thisReactorExpectedAvailMinutes = reportMinutes - MinutesNonSched; * This is the amount of minutes the single reactor was scheduled to run work.
AllReactorsScheduledMinutes += thisReactorExpectedAvailMinutes; * Add it to the collective of reactors
thisReactorUptimeMinutes = MinuteProd + MinutesEng
AllReactorsUptimeMinutes = thisReactorUptimeMinutes + AllReactorsUptimeMinutes
AllReactorsProdMinutes += MinuteProd
AllReactorsUnschedDownMinutes += MinuteUnschedDown
AllReactorsSchedDownMinutes += MinuteSchedDown
AllReactorsEngMinutes += MinutesEng
AllReactorsIdleMinutes += MinutesNonSched
if reactType NE 'EPP' then
thisReactorDisabledLoadLock = Reactor_Services('GetReactorDownLL', Reactor) NE ''
AllReactorsSingleLL += thisReactorDisabledLoadLock
end else
thisReactorDisabledLoadLock = 0
end
ReactorsData<REACTOR_DAILY_UPTIME_INCL_REACTORS$,-1> = Reactor
ReactorsData<REACTOR_DAILY_UPTIME_INCL_REACTOR_PROD_PERCENTAGE$,-1> = PercentProd
ReactorsData<REACTOR_DAILY_UPTIME_INCL_REACTOR_PROD_MINUTES$,-1> = MinuteProd
ReactorsData<REACTOR_DAILY_UPTIME_INCL_REACTOR_ENG_PERCENTAGE$, -1> = PercentEng
ReactorsData<REACTOR_DAILY_UPTIME_INCL_REACTOR_ENG_MINUTES$, -1> = MinutesEng
ReactorsData<REACTOR_DAILY_UPTIME_INCL_REACTOR_DOWN_UNSCHED_PERCENTAGE$, -1> = PercentUnSchedDown
ReactorsData<REACTOR_DAILY_UPTIME_INCL_REACTOR_DOWN_UNSCHED_MINUTES$, -1> = MinuteUnschedDown
ReactorsData<REACTOR_DAILY_UPTIME_INCL_REACTOR_DOWN_SCHED_PERCENTAGE$, -1> = PercentSchedDown
ReactorsData<REACTOR_DAILY_UPTIME_INCL_REACTOR_DOWN_SCHED_MINUTES$, -1> = MinuteSchedDown
ReactorsData<REACTOR_DAILY_UPTIME_INCL_REACTOR_IDLE_PERCENTAGE$, -1> = PercentNonSched
ReactorsData<REACTOR_DAILY_UPTIME_INCL_REACTOR_IDLE_MINUTES$, -1> = MinutesNonSched
ReactorsData<REACTOR_DAILY_UPTIME_INCL_REACTOR_SINGLE_LL$, -1> = thisReactorDisabledLoadLock
end else
ReactorsData<REACTOR_DAILY_UPTIME_EXCLUDED_REACTORS$, -1> = Reactor
end
Next Reactor
if AllReactorsScheduledMinutes GT 0 then
TotalUptimePercent = SRP_Math('ROUND', AllReactorsUptimeMinutes / AllReactorsScheduledMinutes, 5)
TotalUptimeMinutes = SRP_Math('ROUND', AllReactorsUptimeMinutes, 5)
TotalAvailMinutes = SRP_Math('ROUND', AllReactorsScheduledMinutes, 5)
TotalProdPercent = SRP_Math('ROUND', AllReactorsProdMinutes / AllReactorsScheduledMinutes, 5)
TotalUnschedDownPercent = SRP_Math('ROUND', AllReactorsUnschedDownMinutes / AllReactorsScheduledMinutes, 5)
TotalSchedDownPercent = SRP_Math('ROUND', AllReactorsSchedDownMinutes / AllReactorsScheduledMinutes, 5)
TotalEngPercent = SRP_Math('ROUND', AllReactorsEngMinutes / AllReactorsScheduledMinutes, 5)
TotalIdlePercent = SRP_Math('ROUND', AllReactorsIdleMinutes / AllReactorsScheduledMinutes, 5)
end else
TotalUptimePercent = 0
TotalUptimeMinutes = 0
TotalAvailMinutes = 0
TotalProdPercent = 0
TotalUnschedDownPercent = 0
TotalSchedDownPercent = 0
TotalEngPercent = 0
TotalIdlePercent = 0
end
ReactorsData<REACTOR_DAILY_UPTIME_TOTAL_UPTIME_PERCENTAGE$> = TotalUptimePercent
ReactorsData<REACTOR_DAILY_UPTIME_TOTAL_PROD_PERCENTAGE$> = TotalProdPercent
ReactorsData<REACTOR_DAILY_UPTIME_TOTAL_PROD_MINUTES$> = AllReactorsProdMinutes
ReactorsData<REACTOR_DAILY_UPTIME_TOTAL_ENG_PERCENTAGE$> = TotalEngPercent
ReactorsData<REACTOR_DAILY_UPTIME_TOTAL_ENG_MINUTES$> = AllReactorsEngMinutes
ReactorsData<REACTOR_DAILY_UPTIME_TOTAL_DOWN_UNSCHED_PERCENTAGE$> = TotalUnschedDownPercent
ReactorsData<REACTOR_DAILY_UPTIME_TOTAL_DOWN_UNSCHED_MINUTES$> = AllReactorsUnschedDownMinutes
ReactorsData<REACTOR_DAILY_UPTIME_TOTAL_DOWN_SCHED_PERCENTAGE$> = TotalSchedDownPercent
ReactorsData<REACTOR_DAILY_UPTIME_TOTAL_DOWN_SCHED_MINUTES$> = AllReactorsSchedDownMinutes
ReactorsData<REACTOR_DAILY_UPTIME_TOTAL_IDLE_PERCENTAGE$> = TotalIdlePercent
ReactorsData<REACTOR_DAILY_UPTIME_TOTAL_IDLE_MINUTES$> = AllReactorsIdleMinutes
ReactorsData<REACTOR_DAILY_UPTIME_TOTAL_UPTIME_MINUTES$> = TotalUptimeMinutes
ReactorsData<REACTOR_DAILY_UPTIME_TOTAL_AVAIL_MINUTES$> = TotalAvailMinutes
ReactorsData<REACTOR_DAILY_UPTIME_TOTAL_SINGLE_LL$> = AllReactorsSingleLL
Response = ReactorsData
end else
Error_Services('Add', 'Error getting reactor uptime metrics -> Unable to get total report duration.')
end
end
end service
Service GetLoadedRds(ReactNo)
StopRDS = Xlate('REACT_STATE', ReactNo, 'LAST_RDS_NO', 'X')
@ -2912,11 +3233,540 @@ Service GetLoadedRds(ReactNo)
Response = RdsKeys
end service
Service CreateReactorProveInOrder(ReactNo, ProveInType)
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
ColumnWidths = 20 : @FM : 15 : @FM : 300
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ReactorProveIn'
makeDirSuccess = Utility("MAKEDIR", LogPath)
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : '_ReactorProveIn.csv'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'Attempting to craete prove in order for reactor ':ReactNo:' of type ':ProveInType
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactNo)
CurrentProveInTypes = ReactorRec<REACTOR_PROVE_IN_TYPE$>
ProveInTypeAlreadyActive = False$
for each ActiveProveInType in CurrentProveInTypes using @VM setting dummy
If ActiveProveInType EQ ProveInType then
ProveInTypeAlreadyActive = True$
end
Next ActiveProveInType
If ProveInTypeAlreadyActive EQ False$ then
ReactorRec<REACTOR_PROVE_IN_ACTIVE$> = True$
If CurrentProveInTypes NE '' then
ReactorRec<REACTOR_PROVE_IN_TYPE$> = CurrentProveInTypes : @VM : ProveInType
end else
ReactorRec<REACTOR_PROVE_IN_TYPE$> = ProveInType
end
If ProveInType EQ 'INITIATE_IDLE' then
ReactorRec<REACTOR_IDLE_STARTUP_REQUIRED$> = True$
end
// Call the API
ProveInUrl = Environment_Services("GetProveInApiUrl"):'/checklists?'
ProveInUrl = ProveInUrl:'checklistType=':ProveInType
ProveInUrl = ProveInUrl:'&reactorNumber=':ReactNo
Retries = 3
BackoffSeconds = 1
IsSuccessful = False$
OrderId = ''
Loop
while (IsSuccessful EQ False$ and Retries GT 0)
WaitSeconds = (2 - retries) * BackoffSeconds
Delay(WaitSeconds)
Retries = Retries - 1
HttpResponseJson = Httpclient_Services('SendHTTPRequest', 'POST', ProveInUrl, 'Accept':@VM:'*/*', '', '', '', '', '', '')
If HttpResponseJson NE '' then
ObjResponseJson = ''
If SRP_JSON(ObjResponseJson, 'Parse', HttpResponseJson) EQ '' then
OrderId = SRP_JSON(ObjResponseJson, 'GetValue', 'id')
If orderId NE '' then
IsSuccessful = True$
Response = OrderId
end
end
end
SRP_JSON(ObjResponseJson, 'Release')
Repeat
CurrentOrderIds = ReactorRec<REACTOR_PROVE_IN_ORDER_ID$>
If CurrentOrderIds NE '' then
ReactorRec<REACTOR_PROVE_IN_ORDER_ID$> = CurrentOrderIds : @VM : OrderId
end else
ReactorRec<REACTOR_PROVE_IN_ORDER_ID$> = OrderId
end
Database_Services('WriteDataRow', 'REACTOR', ReactNo, ReactorRec)
If Environment_Services('IsProd') then
MonAResource = 'GRP_OPENINSIGHT_MES_OP_FE_MESAPROVEINAPI'
end else
MonAResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_MESAPROVEINAPI_DEV'
end
StatusName = 'CreateReactorProveInOrder'
If IsSuccessful then
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'Successfully created prove in order for reactor ':ReactNo:' of type ':ProveInType
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
Mona_Services('SendBufferedStatus', MonAResource, StatusName, 'Ok')
end else
Response = 'error'
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'Error encountered when attempting to create prove in order for reactor ':ReactNo:' of type ':ProveInType
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
Mona_Services('SendBufferedStatus', MonAResource, StatusName, 'Critical')
Error_Services('Add', 'Error in ' : Service : ' service. Could not create NICA order.')
end
end
end service
Service GetReactorProveInStatus(ReactNo)
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
ColumnWidths = 20 : @FM : 15 : @FM : 300
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ReactorProveIn'
makeDirSuccess = Utility("MAKEDIR", LogPath)
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : '_ReactorProveIn.csv'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'Attempting to fetch prove in order for reactor ':ReactNo
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
Response = True$
IsSuccessful = True$
// Check flag on reactor first, then call api if necessary
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactNo)
ProveInActive = ReactorRec<REACTOR_PROVE_IN_ACTIVE$>
If ProveInActive then
BaseProveInUrl = Environment_Services("GetProveInApiUrl"):'/checklists?'
ProveInOrderIds = ReactorRec<REACTOR_PROVE_IN_ORDER_ID$>
ProveInOrderIdList = SRP_List("Create", ProveInOrderIds, @VM)
ProveInTypes = ReactorRec<REACTOR_PROVE_IN_TYPE$>
ProveInTypeList = SRP_List("Create", ProveInTypes, @VM)
for each ProveInOrderId in ProveInOrderIds using @VM setting Idx
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'Fetching prove in order ':ProveInOrderId
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
ProveInUrl = BaseProveInUrl:'checklistOrderId=':ProveInOrderId
Retries = 3
BackoffSeconds = 1
IsSuccessful = False$
Loop
while (IsSuccessful EQ False$ and Retries GT 0)
WaitSeconds = (2 - Retries) * BackoffSeconds
Delay(WaitSeconds)
Retries = Retries - 1
HttpResponseJson = Httpclient_Services('SendHTTPRequest', 'GET', ProveInUrl, 'Accept':@VM:'*/*', '', '', '', '', '', '')
If HttpResponseJson NE '' then
ObjResponseJson = ''
If SRP_JSON(ObjResponseJson, 'Parse', HttpResponseJson) EQ '' then
IsComplete = SRP_JSON(ObjResponseJson, 'GetValue', 'isComplete')
If IsComplete EQ True$ then
SRP_List('RemoveAt', ProveInOrderIdList, Idx)
ProveInType = SRP_List("GetAt", ProveInTypeList, Idx)
If ProveInType _EQC 'IDLE' then
ReactorRec<REACTOR_IDLE_STARTUP_REQUIRED$> = False$
end
SRP_List('RemoveAt', ProveInTypeList, Idx)
Response = True$
end else
Response = False$
end
end
end
SRP_JSON(ObjResponseJson, 'Release')
If Response EQ True$ or Response EQ False$ then
IsSuccessful = True$
end
Repeat
Next ProveInOrderId
If Environment_Services('IsProd') then
MonAResource = 'GRP_OPENINSIGHT_MES_OP_FE_MESAPROVEINAPI'
end else
MonAResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_MESAPROVEINAPI_DEV'
end
StatusName = 'GetReactorProveInOrderStatus'
If IsSuccessful and Response NE 'error' then
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'Successfully fetched prove in order for reactor ':ReactNo
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
Mona_Services('SendBufferedStatus', MonAResource, StatusName, 'Ok')
end else
Response = 'error'
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'Error encountered when fetching prove in order for reactor ':ReactNo
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
Mona_Services('SendBufferedStatus', MonAResource, StatusName, 'Critical')
Error_Services('Add', 'Error in ' : Service : ' service. Could not retrieve NICA order status.')
end
ReactorRec<REACTOR_PROVE_IN_ORDER_ID$> = SRP_List("GetVariable", ProveInOrderIdList, @VM)
ReactorRec<REACTOR_PROVE_IN_TYPE$> = SRP_List("GetVariable", ProveInTypeList, @VM)
SRP_List('Release', ProveInTypeList)
OrderIdCount = SRP_List("Count", ProveInOrderIdList)
SRP_List("Release", ProveInOrderIdList)
// remove flag if prove in passed
If OrderIdCount EQ 0 then
ReactorRec<REACTOR_PROVE_IN_ACTIVE$> = False$
end
Database_Services('WriteDataRow', 'REACTOR', ReactNo, ReactorRec)
end
end service
Service CancelReactorProveIn(ReactNo, OrderId)
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
ColumnWidths = 20 : @FM : 15 : @FM : 300
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ReactorProveIn'
makeDirSuccess = Utility("MAKEDIR", LogPath)
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : '_ReactorProveIn.csv'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'Attempting to cancel prove in order ' : OrderId : ' for reactor ' : ReactNo
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
Response = False$
BaseProveInUrl = Environment_Services("GetProveInApiUrl"):'/checklists?'
ProveInUrl = BaseProveInUrl:'checklistOrderId=':OrderId
ProveInUrl = ProveInUrl:'&checklistState=cancelled'
Retries = 3
BackoffSeconds = 1
IsSuccessful = False$
Loop
while (IsSuccessful EQ False$ and Retries GT 0)
WaitSeconds = (2 - Retries) * BackoffSeconds
Delay(WaitSeconds)
Retries = Retries - 1
HttpResponseJson = Httpclient_Services('SendHTTPRequest', 'PUT', ProveInUrl, 'Accept':@VM:'*/*', '', '', '', '', '', '')
If HttpResponseJson NE '' then
ObjResponseJson = ''
If SRP_JSON(ObjResponseJson, 'Parse', HttpResponseJson) EQ '' then
IsComplete = SRP_JSON(ObjResponseJson, 'GetValue', 'pendingUpdate')
If IsComplete EQ True$ then
Response = True$
end else
Response = False$
end
end
end
SRP_JSON(ObjResponseJson, 'Release')
If Response EQ True$ or Response EQ False$ then
IsSuccessful = True$
end
Repeat
If Environment_Services('IsProd') then
MonAResource = 'GRP_OPENINSIGHT_MES_OP_FE_MESAPROVEINAPI'
end else
MonAResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_MESAPROVEINAPI_DEV'
end
StatusName = 'UpdateReactorProveInOrderState'
If IsSuccessful and Response NE 'error' then
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactNo)
ProveInOrderIds = ReactorRec<REACTOR_PROVE_IN_ORDER_ID$>
ProveInOrderIdList = SRP_List('Create', ProveInOrderIds, @VM)
ProveInTypes = ReactorRec<REACTOR_PROVE_IN_TYPE$>
ProveInTypeList = SRP_List('Create', ProveInTypes, @VM)
for each ProveInOrderId in ProveInOrderIds using @VM setting Idx
If OrderId EQ ProveInOrderId then
ProveInType = SRP_List('GetAt', ProveInTypeList, Idx)
If ProveInType EQ 'IDLE' then
ReactorRec<REACTOR_IDLE_STARTUP_REQUIRED$> = False$
end
SRP_List('RemoveAt', ProveInOrderIdList, Idx)
SRP_List('RemoveAt', ProveInTypeList, Idx)
end
Next ProveInOrderId
ReactorRec<REACTOR_PROVE_IN_ORDER_ID$> = SRP_List("GetVariable", ProveInOrderIdList, @VM)
ReactorRec<REACTOR_PROVE_IN_TYPE$> = SRP_List("GetVariable", ProveInTypeList, @VM)
SRP_List('Release', ProveInTypeList)
OrderIdCount = SRP_List("Count", ProveInOrderIdList)
SRP_List("Release", ProveInOrderIdList)
// remove flag if prove in passed
If OrderIdCount EQ 0 then
ReactorRec<REACTOR_PROVE_IN_ACTIVE$> = False$
end
Database_Services('WriteDataRow', 'REACTOR', ReactNo, ReactorRec)
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'Successfully cancelled prove in order ' : ProveInOrderId : ' for reactor ' : ReactNo
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
Mona_Services('SendBufferedStatus', MonAResource, StatusName, 'Ok')
end else
Response = 'error'
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'Error encountered cancelling prove in order ' : ProveInOrderId : ' for reactor ' : ReactNo
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
Mona_Services('SendBufferedStatus', MonAResource, StatusName, 'Critical')
Error_Services('Add', 'Error in ' : Service : ' service. Could not cancel NICA order')
end
end service
Service ActiveProveInPreventsModeChange(ReactNo, NewMode, CurrentMode)
If (ReactNo EQ '') then
Error_Services('Add', 'Error in ' : Service : ' service. ReactNo was empty')
end
If (NewMode EQ '') then
Error_Services('Add', 'Error in ' : Service : ' service. NewMode was empty')
end
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactNo)
ActiveProveIn = ReactorRec<REACTOR_PROVE_IN_ACTIVE$>
If ActiveProveIn EQ True$ then
Reactor_Services('GetReactorProveInStatus', ReactNo)
If Error_Services('HasError') then
ErrMsg = Error_Services('GetMessage')
Error_Services('Add', ErrMsg)
end else
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactNo)
ActiveProveIn = ReactorRec<REACTOR_PROVE_IN_ACTIVE$>
If ActiveProveIn EQ True$ then
Begin Case
Case CurrentMode EQ 'INITIATE_IDLE'
IdleStartupActive = False$
CurrentProveInTypes = ReactorRec<REACTOR_PROVE_IN_TYPE$>
for each ProveInType in CurrentProveInTypes using @VM setting dummy
If ProveInType EQ 'INITIATE_IDLE' then IdleStartupActive = True$
Next ProveInType
If IdleStartupActive EQ True$ then
Response = True$
end else
Response = False$
end
Case Len(NewMode) GE 2 and NewMode[1, 2] EQ 'UP'
Response = True$
Case Otherwise$
Response = False$
End Case
end else
Response = False$
end
end
end else
Response = False$
end
end service
Service GetReactorDownLL(ReactNo)
Response = ''
If RowExists('REACTOR', ReactNo) then
LLDisabledID = Database_Services('ReadDataColumn', 'REACTOR', ReactNo, REACTOR_ACTIVE_LL_DISABLED$, True$, 0)
If LLDisabledID NE '' then
If RowExists('REACT_LL', LLDisabledID) then
DownLoadLock = Database_Services('ReadDataColumn', 'REACT_LL', LLDisabledID, REACT_LL_DISABLED$, True$, 0)
Response = DownLoadLock
end
end
end
end service
Service GetReactorLoadCountLimit(ReactNo)
ErrMsg = 'Error in ReactorServices -> GetReactorLoadCountLimit: '
MaxLoadCount = 999
If ReactNo NE '' then
If RowExists('REACTOR', ReactNo) then
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', ReactNo)
If Error_Services('NoError') then
ReactType = ReactorRec<REACTOR_REACT_TYPE$>
PickPlace = ReactorRec<REACTOR_PICK_PLACE$>
DisabledLoadLockCnt = DCount(ReactorRec<REACTOR_ACTIVE_LL_DISABLED$>, @VM)
Begin Case
Case ReactType EQ 'ASM'
If PickPlace then
MaxLoadCount = 2 - DisabledLoadLockCnt
end else
MaxLoadCount = 1
end
Case ReactType EQ 'ASM+'
If PickPlace then
MaxLoadCount = 2 - DisabledLoadLockCnt
end else
MaxLoadCount = 1
end
Case ReactType EQ 'HTR'
If PickPlace then
MaxLoadCount = 2 - DisabledLoadLockCnt
end else
MaxLoadCount = 1
end
Case ReactType EQ 'EPP'
MaxLoadCount = 2;*EPP needs to have an additional load capability.
End Case
end else
ErrMsg := Error_Services('GetMessage')
Error_Services('Add', ErrMsg)
end
end else
ErrMsg := 'Reactor ' : ReactNo : ' does not exist.'
Error_Services('Add', ErrMsg)
end
end else
ErrMsg := 'Reactor Number was null.'
Error_Services('Add', ErrMsg)
end
Response = MaxLoadCount
end service
Service GetReactorAvailChamberCount(ReactNo)
ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: '
AvailableChamberCount = 0
If ReactNo NE '' then
If RowExists('REACTOR', ReactNo) then
LoadedRDS = Reactor_Services('GetReactorCurrLoadRDS', ReactNo)
ReactorCurrLoadCnt = DCount(LoadedRDS, @VM)
ReactorCurrCapacity = Reactor_Services('GetReactorLoadCountLimit', ReactNo)
AvailableChamberCount = ReactorCurrCapacity - ReactorCurrLoadCnt
end else
ErrMsg := 'Reactor ' : ReactNo : ' does not exist.'
Error_Services('Add', ErrMsg)
end
end else
ErrMsg := 'Reactor Number was null.'
Error_Services('Add', ErrMsg)
end
Response = AvailableChamberCount
end service
Service RemoveRDSFromReactorLoad(RDSNo, ReactorNo, User)
Response = 0
If User NE '' then
If RDSNo NE '' then
If ReactorNo NE '' then
ReactStatusRec = Database_Services('ReadDataRow', 'REACT_STATUS', ReactorNo)
If Error_Services('NoError') then
Locate RDSNo in ReactStatusRec<REACT_STATUS_LOAD_RDS$> setting RDSPos then
ReactStatusRec = Delete(ReactStatusREc, REACT_STATUS_LOAD_RDS$, RDSPos, 0)
ReactStatusRec = Delete(ReactStatusREc, REACT_STATUS_LOAD_RDS_DTM$, RDSPos, 0)
ReactStatusRec = Delete(ReactStatusREc, REACT_STATUS_LOAD_CASS_ID$, RDSPos, 0)
ReactStatusRec = Delete(ReactStatusREc, REACT_STATUS_LOAD_DTM$, RDSPos, 0)
Database_Services('WriteDataRow', 'REACT_STATUS', ReactorNo, ReactStatusRec, 1, 0, 1)
If Error_Services('NoError') then
Response = 1
end else
ErrMsg = Error_Services('GetMessage')
Error_Services('Add', ErrMsg)
end
end else
Error_Services('Add', 'Error in Reactor Services -> RemoveRDSFromReactorLoad: RDS was not found as a loaded lot.')
end
end else
ErrMsg = Error_Services('GetMessage')
Error_Services('Add', ErrMsg)
end
end else
Error_Services('Add', 'Error in Reactor Services -> RemoveRDSFromReactorLoad: No Reactor No was supplied.')
end
end else
Error_Services('Add', 'Error in Reactor Services -> RemoveRDSFromReactorLoad: No RDS No was supplied.')
end
end else
Error_Services('Add', 'Error in Reactor Services -> RemoveRDSFromReactorLoad: No Username was supplied.')
end
end service
Service AddRDSToReactorLoad(RDSNo, ReactorNo)
Response = 0
If RDSNo NE '' then
If ReactorNo NE '' then
ReactStatusRec = Database_Services('ReadDataRow', 'REACT_STATUS', ReactorNo)
If Error_Services('NoError') then
Locate RDSNo in ReactStatusRec<REACT_STATUS_LOAD_RDS$> using @VM setting iPos else
WONo = Xlate('RDS', RDSNo, 'WO_NO', 'X')
CassNo = Xlate('RDS', RDSNo, 'CASS_NO', 'X')
WOMatKey = WONo : '*' : CassNo
ThisDTM = SRP_Datetime('Now')
ReactStatusRec<REACT_STATUS_LOAD_RDS$, -1> = RDSNo
ReactStatusRec<REACT_STATUS_LOAD_RDS_DTM$, -1> = ThisDTM
ReactStatusRec<REACT_STATUS_LOAD_CASS_ID$, -1> = WOMatKey
ReactStatusRec<REACT_STATUS_LOAD_DTM$, -1> = ThisDTM
Database_Services('WriteDataRow', 'REACT_STATUS', ReactorNo, ReactStatusRec, 1, 0, 1)
end
end else
ErrMsg = Error_Services('GetMessage')
Error_Services('Add', ErrMsg)
end
end else
Error_Services('Add', 'Error in Reactor Services -> RemoveRDSFromReactorLoad: No Reactor No was supplied.')
end
end else
Error_Services('Add', 'Error in Reactor Services -> RemoveRDSFromReactorLoad: No RDS No was supplied.')
end
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
RollbackReactUtil:
// Reopen previous REACT_UTIL record
@ -2939,7 +3789,3 @@ ClearCursors:
return