open-insight/LSL2/STPROC/REACTOR_LOG_SERVICES.txt
Stieber Daniel (CSC FI SPS MESLEO) 6050b346a5 Merged PR 13809: ABORT/ALARM Nica Integration
## 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
2025-03-26 22:03:25 +01:00

979 lines
39 KiB
Plaintext

Compile function Reactor_Log_Services(@Service, @Params)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from SRP Computer Solutions, Inc.
Name : Reactor_Log_Services
Description : Handler program for all module related services.
Notes : The generic parameters should contain all the necessary information to process the services. Often
this will be information like the data Record and Key ID.
Parameters :
Service [in] -- Name of the service being requested
Param1-10 [in/out] -- Additional request parameter holders
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
History : (Date, Initials, Notes)
??/??/?? jro Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert APP_INSERTS
$Insert SERVICE_SETUP
$Insert REACTOR_LOG_EQUATES
$Insert RLIST_EQUATES
$Insert REACT_STATE_EQUATES
$Insert REACTOR_PM_EQUATES
$Insert REACT_ITEM_EQUATES
$Insert RDS_EQUATES
$Insert REACT_SERVS_EQUATES
$Insert REACTOR_EQUATES
$Insert FEATURE_FLAGS_EQUATES
Declare function Database_Services, Reactor_Log_Services, Obj_React_Item, Set_Status, Errmsg, Error_Services, Utility
Declare function obj_Calendar, NextKey, SRP_JSON, Datetime, Reactor_Services, React_Servs_Services, Logging_Services
Declare function Environment_Services, HttpClient_Services, SRP_List, Nica_Orders_Services
Declare subroutine Set_Status, RList, Errmsg, Database_Services, Error_Services, obj_React_Reads, obj_Post_Log, Delay
Declare subroutine obj_Reactor_Log, Btree.Extract, SRP_JSON, Reactor_Services, Logging_Services, Mona_Services, SRP_List
Declare subroutine Reactor_Log_Services, Nica_Orders_Services
GoToService
Return Response or ""
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Service Parameter Options
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options BOOLEAN = True$,False$
Options PM_TYPES = 'ASM_HTR_TUBE_CHANGE','ASM_HTR_ANNUAL_PM','ASM_HTR_SEMIANNUAL_PM','ASM_HTR_FIVE_AND_TEN_YEAR_PM'
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SERVICES
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Service Create()
end service
Service UpdateReactorLog(ReactorLogID, ReactorLogRec)
ErrorMsg = ''
If ( RowExists('REACTOR_LOG', ReactorLogID) and (ReactorLogRec NE '') ) then
Database_Services('WriteDataRow', 'REACTOR_LOG', ReactorLogID, ReactorLogRec)
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
end else
ErrorMsg = 'Error in ':Service:' service. REACTOR_LOG record "':ReactorLogID:'" does not exist!'
end
If ErrorMsg EQ '' then
Response = True$
end else
Error_Services('Add', ErrorMsg)
Response = False$
end
end service
Service SignReactorLog(ReactorLogID, UserID)
Flag = ''
ErrCode = ''
ErrorMsg = ''
If RowExists('REACTOR_LOG', ReactorLogID) then
If Error_Services('NoError') then
If RowExists('LSL_USERS', UserID) then
ReactorLogRec = Database_Services('ReadDataRow', 'REACTOR_LOG', ReactorLogID)
If Error_Services('NoError') then
// Verify NICA checklists are complete
ActiveRlNicaOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR_LOG', ReactorLogID)
If ActiveRLNicaOrders EQ '' then
// Verify reactor number is populated
ReactorNo = ReactorLogRec<REACTOR_LOG_REACTOR$>
If ReactorNo NE '' then
// Verify wafer count is populated
WaferCount = ReactorLogRec<REACTOR_LOG_REACT_WFR_CNT_START$>
If WaferCount NE '' then
//Check if any of the services chosen require a reactor item
CurrServices = Xlate('REACTOR_LOG', ReactorLogID, REACTOR_LOG_REACT_SERV_ID$, 'X')
CurrItems = Xlate('REACTOR_LOG', ReactorLogID, REACTOR_LOG_REACT_ITEM_IDS$, 'X')
If CurrServices NE '' then
for each ServiceID in CurrServices using @VM setting sPos
If RowExists('REACT_SERVS', ServiceID) then
ServiceRec = Database_Services('ReadDataRow', 'REACT_SERVS', ServiceID)
If Error_Services('NoError') then
ItemReqd = ServiceRec<REACT_SERVS_GRAPHITE_OR_TUBE$>
If ItemReqd NE '' then
If CurrItems<1, sPos> NE '' then
CurrItemID = CurrItems<1, sPos>
If RowExists('REACT_ITEM', CurrItemID) then
CurrReactItemType = XLATE('REACT_ITEM', CurrItemID, REACT_ITEM_RI_TYPE$, 'X')
If CurrReactItemType NE ItemReqd then
ErrorMsg = 'React Item ' : CurrItemID : " doesn't match the required react item type!"
end
end else
ErrorMsg = 'React Item ' : CurrItemID : " doesn't exist!"
end
end else
ErrorMsg = 'Service ' : ServiceID : ' requires an item to be selected and none was selected.'
end
end
end else
ErrorMsg = 'Error reading service record for service ID: ' : ServiceID
end
end else
ErrorMsg = 'Invalid service selected! Service ID: ' : ServiceID
end
Until ErrorMsg NE ''
Next ServiceID
end
// Check if any react items are missing disposition codes
If ErrorMsg EQ '' then
RemRINos = Xlate('REACTOR_LOG', ReactorLogID, 'REM_RI_NO', 'X')
If RemRINos NE '' then
RemRIDispCDs = Xlate('REACTOR_LOG', ReactorLogID, 'REM_DISP_CD', 'X')
For each RemRINo in RemRINos using @VM setting vPos
If RemRIDispCDs<0, vPos> EQ '' then
ErrorMsg = 'Error in ':Service:' service. Disposition for REACT_ITEM ':RemRINo:' being removed has not been completed.'
end
Until ErrorMsg NE ''
Next RemRINo
end
AddedRINos = Xlate('REACTOR_LOG', ReactorLogID, 'REACT_ITEM_IDS', 'X')
If AddedRINos NE '' then
for each AddedRINo in AddedRINos using @VM
RIRec = Database_Services('ReadDataRow', 'REACT_ITEM', AddedRINo)
If RIRec<REACT_ITEM_RETIRE_DT$> NE '' then
ErrorMsg = 'Error in ':Service:' service. REACT_ITEM ':AddedRINo:' cannot be added because it is RETIRED.'
end
Until ErrorMsg NE ''
Next AddedRINo
end
end
If ErrorMsg EQ '' then
// Check if we need to "post" any items that are being installed
InstRINo = ReactorLogRec<REACTOR_LOG_INST_RI_NO$>
If InstRINo NE '' then
RIPostBy = ReactorLogRec<REACTOR_LOG_RI_POST_BY$>
If RIPostBy EQ '' then
obj_Reactor_Log('PostReactItems',ReactorLogID:@RM:UserID)
// Pull in a fresh copy of the record with the POST_BY signature set
ReactorLogRec = Database_Services('ReadDataRow', 'REACTOR_LOG', ReactorLogID)
If Get_Status(ErrCode) then
ErrorMsg = 'Error in ':Service:' service. Error calling obj_Reactor_Log("PostReactItems"). Error code: ':ErrCode:'.'
end
end
end
If ErrorMsg EQ '' then
// Check if we need to create a REACT_READS record
ReactWfrCntEnd = ReactorLogRec<REACTOR_LOG_REACT_WFR_CNT_END$>
If ReactWfrCntEnd EQ 0 then
CurrDTM = obj_Calendar('CurrDTM')
obj_React_Reads('Create',ReactorNo:@RM:UserID:@RM:CurrDTM:@RM:'0')
If Get_Status(ErrCode) then
ErrorMsg = 'Error in ':Service:' service. Error calling obj_React_Reads("Create"). Error code: ':ErrCode:'.'
end
end
If ErrorMsg EQ '' then
// Check if injector settings have been entered
ReactInjSetting = ReactorLogRec<REACTOR_LOG_INJ_SETTING$>
If ReactInjSetting NE '' then
plParms = 'REACT_STATE':@RM
plParms := ReactorNo:@RM
plParms := REACT_STATE_CURR_INJ_RL_ID$:@RM
plParms := ReactorLogID:@RM
obj_Post_Log('Create',plParms)
If Get_Status(ErrCode) then
ErrorMsg = 'Error in ':Service:' service. Error calling obj_Post_Log("Create"). Error code: ':ErrCode:'.'
end
end
If ErrorMsg EQ '' then
// Check reactor prevent maintenance records
CurServices = ReactorLogRec<REACTOR_LOG_REACT_SERV_ID$>
Loop
TestChar = CurServices[-1,1]
Until TestChar NE @VM or CurServices = ''
CurServices[-1,1] = ''
Repeat
CCnt = COUNT(CurServices,@VM) + (CurServices NE '')
IntrMaintFeatureFlag = Xlate('FEATURE_FLAGS', 'NICA_INTRUSIVE_MAINTENANCE', FEATURE_FLAGS.ENABLED$, 'X')
If ( (IntrMaintFeatureFlag EQ True$) and (CCnt GT 0) ) then
IntrMaintFlowCodes = React_Servs_Services('GetIntrMaintFlowIds', CurServices)
If IntrMaintFlowCodes NE '' then
ReactorType = Xlate('REACTOR', ReactorNo, REACTOR_REACT_TYPE$, 'X')
ChecklistIds = Nica_Orders_Services('GetFlowChecklistIds', IntrMaintFlowCodes, 'INTRUSIVE_MAINT', ReactorType)
If ChecklistIds NE '' then
// Create INTRUSIVE_MAINT NICA order
Nica_Orders_Services('CreateNewOrder', 'REACTOR', ReactorNo, 'INTRUSIVE_MAINT', IntrMaintFlowCodes, '', ChecklistIds)
If Error_Services('NoError') then
LogFlows = IntrMaintFlowCodes
Convert @VM to ', ' in LogFlows
Reactor_Log_Services('AddComment', ReactorNo, 'Intrusive Maintenance initiated for flow(s) ':LogFlows:'.', UserID)
end else
ErrorMsg = Error_Services('GetMessage')
end
end
end
end
If ErrorMsg EQ '' then
For ReactServsIndex = 1 to CCnt
CurService = CurServices<1,ReactServsIndex>
Open 'REACTOR_PM' to ReactorPMTable then
Open 'DICT.REACTOR_PM' to DictReactorPMTable then
SearchStr = 'REACT_SERV_ID':@VM:CurService:@FM
SearchStr := 'REACTOR':@VM:ReactorNo:@FM
SearchStr := 'COMPLETE_DATE':@VM:'':@FM
Btree.Extract(SearchStr, 'REACTOR_PM', DictReactorPMTable, OpenPMKeys, '', Flag)
If Flag EQ 0 then
EndDate = Date()
* Add Maintenance metric reset
AssocMetrics = ''
AssocMetrics = React_Servs_Services('GetAssociatedMetrics', CurService)
If AssocMetrics NE '' then
MetricCount = Dcount(AssocMetrics, @VM)
For MetricIndex = 1 to MetricCount
ThisMetric = AssocMetrics<1,MetricIndex>
Reactor_Services('ResetWfrMetric', ReactorNo, ThisMetric)
Next MetricIndex
End
If OpenPMKeys NE '' then
* If more than one, which should not happen then close all
KCnt = COUNT( OpenPMKeys, @VM ) + (OpenPMKeys NE '')
PMResched = False$
For I = 1 to KCnt
ThisOpenPMKey = OpenPMKeys<1,I>
otlParms = 'REACTOR_PM':@RM
otlParms := ThisOpenPMKey:@RM
otlParms := REACTOR_PM_COMPLETE_DATE$:@VM:REACTOR_PM_COMP_RL_NO$:@RM
otlParms := EndDate:@VM:ReactorLogID:@RM
If ThisOpenPMKey NE '' then
obj_Post_Log('Create',otlParms) ;* Closes previous PM record
If Not(Get_Status(ErrCode)) then
* Schedule next PM
PMDays = XLATE( 'REACT_SERVS', CurService, REACT_SERVS_PM_DAYS$, 'X' )
IF PMDays NE '' THEN
If PMResched EQ False$ then
PMNo = NextKey('REACTOR_PM')
If Error_Services('NoError') then
NewPMRec = ''
NewPMRec<REACTOR_PM_ENTRY_ID$> = UserID
NewPMRec<REACTOR_PM_ENTRY_DATE$> = Date()
NewPMRec<REACTOR_PM_REACTOR$> = ReactorNo
NewPMRec<REACTOR_PM_PREV_PM_COMP_DT$> = EndDate
NewPMRec<REACTOR_PM_DUE_DT$> = EndDate + PMDays
NewPMRec<REACTOR_PM_REACT_SERV_ID$> = CurService
NewPMRec<REACTOR_PM_ENTRY_RL_NO$> = ReactorLogID
Database_Services('WriteDataRow', 'REACTOR_PM', PMNo, NewPMRec)
If Error_Services('NoError') then
PMResched = True$
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. Error calling NextKey("REACTOR_PM").'
end
end
end
end else
ErrorMsg = 'Error in ':Service:' service. Error calling obj_Post_Log("Create"). Error code: ':ErrCode
end
end
Next I
end
end else
ErrorMsg = 'Error in ':Service:' serivce. Error calling Btree.Extract. Error code: ':Flag
end
end else
ErrorMsg = 'Error in ':Service:' service. Error opening DICT.REACTOR_PM table.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Error opening REACTOR_PM table.'
end
Next ReactServsIndex
end else
ErrorMsg = 'Error in ':Service:' service. Error creating INTRUSIVE_MAINT NICA order.'
end
end
end
end
end
end else
ErrorMsg = 'Error in ':Service:' service. Wafer count is missing.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Reactor number is missing.'
end
end else
ActiveChecklistTypes = Xlate('NICA_ORDERS', ActiveRlNicaOrders, 'ORDER_TYPE', 'X')
Swap @VM with ',' in ActiveChecklistTypes
ErrorMsg = 'Error in ':Service:' service. NICA order(s) ':ActiveChecklistTypes
ErrorMsg := ' must be completed prior to signing reactor log.'
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. LSL_USERS record "':UserID:'" does not exist.'
end
end else
ErrorMsg = Error_Services('GetMessage')
end
end else
ErrorMsg = 'Error in ':Service:' service. REACTOR_LOG record "':ReactorLogID:'" does not exist.'
end
If ErrorMsg EQ '' then
// Pull in a fresh copy of the record in case comments were added above
ReactorLogRec = Database_Services('ReadDataRow', 'REACTOR_LOG', ReactorLogID)
// Set signature, end date, and end time
ReactorLogRec<REACTOR_LOG_TECH_SIG$> = UserID
ReactorLogRec<REACTOR_LOG_END_DATE$> = Date()
ReactorLogRec<REACTOR_LOG_END_TIME$> = Time()
Database_Services('WriteDataRow', 'REACTOR_LOG', ReactorLogID, ReactorLogRec)
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
end
If ErrorMsg EQ '' then
Response = True$
end else
Error_Services('Add', ErrorMsg)
Response = False$
end
end service
Service ClearSignature(RLKey)
If RLKey NE '' then
RLRec = Database_Services('ReadDataRow', 'REACTOR_LOG', RLKey)
If Error_Services('NoError') then
RLRec<REACTOR_LOG_TECH_SIG$> = ''
RLRec<REACTOR_LOG_END_DATE$> = ''
RLRec<REACTOR_LOG_END_TIME$> = ''
RLRec<REACTOR_LOG_LO_REVIEWED$> = ''
RLRec<REACTOR_LOG_LO_NA$> = ''
RLRec<REACTOR_LOG_REACT_WFR_CNT_START$> = ''
Database_Services('WriteDataRow', 'REACTOR_LOG', RLKey, RLRec, True$, False$, False$)
If Error_Services('NoError') then
// Cancel active Intrusive Maintenance NICA orders in the event the maintenance user set an
// invalid service id or a difference service was required.
ReactorNo = RLRec<REACTOR_LOG_REACTOR$>
CurrActiveOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactorNo, 'INTRUSIVE_MAINT')
If CurrActiveOrders NE '' then
For each ActiveIntrMaintOrderId in CurrActiveOrders using @VM
Nica_Orders_Services('CancelOrder', ActiveIntrMaintOrderId)
Next ActiveIntrMaintOrderId
end
end
end
end
end service
Service SaveReactorLogRecord(RLKey, RLRec)
If ( (RLKey NE '') and (RLRec NE '') ) then
ReactNo = RLRec<REACTOR_LOG_REACTOR$>
RawReactItemIds = RLRec<REACTOR_LOG_REACT_ITEM_IDS$>
rawCnt = COUNT(RawReactItemIds,@VM) + (RawReactItemIds NE '')
InstRINos = ''
FOR I = 1 TO rawCnt
IF RawReactItemIds<1,I> NE '' THEN
InstRINos<1,-1> = obj_React_Item('Serial_RINo',RawReactItemIds<1,I>)
END
NEXT I
RLRec<REACTOR_LOG_INST_RI_NO$> = InstRINos
* Remove Calculation
PostedBy = RLRec<REACTOR_LOG_RI_POST_BY$>
IF PostedBy = '' THEN
NewRITypes = XLATE('REACT_ITEM',InstRINos,REACT_ITEM_RI_TYPE$,'X')
CurrRINos = Xlate('REACTOR_LOG', RLKey, 'CURR_RI_NO', 'X')
CurrRITypes = Xlate('REACTOR_LOG', RLKey, 'CURR_RI_TYPE', 'X')
CurrRIDTMs = Xlate('REACTOR_LOG', RLKey, 'CURR_RI_DTM', 'X')
nRICnt = COUNT(NewRITypes,@VM) + (NewRITypes NE '')
cRICnt = COUNT(CurrRITypes,@VM) + (CurrRITypes NE '')
RemRINos = ''
RemHistKeys = ''
FOR J = 1 TO nRICnt
NewRIType = NewRITypes<1,J>
FOR K = 1 TO cRICnt
CurrRIType = CurrRITypes<1,K>
IF CurrRIType[1,1] = NewRIType[1,1] THEN
RemNo = CurrRINos<0, K>
RemInstDTM = CurrRIDTMs<0, K>
RemHistKey = ReactNo:'*':RemNo:'*':RemInstDTM
LOCATE RemNo IN RemRINos USING @VM SETTING Pos ELSE
RemRINos = INSERT(RemRINos,1,Pos,0,RemNo)
RemHistKeys = INSERT(RemHistKeys,1,Pos,0,RemHistKey)
END
END
NEXT K ;* End of Curr Loop
NEXT J ;* End of New Loop
RLRec<REACTOR_LOG_REM_RIH_KEY$> = RemHistKeys
END ;* End of check for NOT Posted
Database_Services('WriteDataRow', 'REACTOR_LOG', RLKey, RLRec)
end
end service
Service IsSigned(ReactorLogID)
Response = 0
If ReactorLogID EQ '' then
Response = 'Error, null parameter passed for ReactorLogID'
return;
end
//Read record
ReactorLogRec = Database_Services('ReadDataRow', 'REACTOR_LOG', ReactorLogID)
ReactorLogTechSig = ReactorLogRec<REACTOR_LOG_TECH_SIG$>
If ReactorLogTechSig then
Response = 1
end else
Response = 0
end
End Service
Service IsMaint(ReactorLogID)
Response = 0
If ReactorLogID EQ '' then
Response = 'Error, null parameter passed for ReactorLogID'
return;
end
//Read record
ReactorLogRec = Database_Services('ReadDataRow', 'REACTOR_LOG', ReactorLogID)
ReactorLogCategory = ReactorLogRec<REACTOR_LOG_CATEGORY$>
If ReactorLogCategory EQ 'M' then
Response = 1
end else
Response = 0
end
End Service
Service GetLogsByReactor(ReactNo)
ReactLogList = ''
SelectSent = 'SELECT REACTOR_LOG WITH REACTOR EQ ': ReactNo : ' AND WITH START_DATE GT ' : Date() - 5475 : ' BY-DSND START_DATE'
Set_Status(0)
RList(SelectSent, TARGET_ACTIVELIST$, "", "", "")
IF Get_Status(errCode) THEN
ErrMsg(errCode)
Response = 0
RETURN
END
IF @RecCount then
EoF = 0
NumKeys = @RecCount
Cnt = 0
Loop
ReadNext log Else EoF = 1
until EoF
ReactLogList := log : @FM
Repeat
end
//to here
GoSub ClearCursors
ClearSelect TARGET_ACTIVELIST$
Response = ReactLogList
end service
Service GetLogsByReactorAndServID(ReactNo, ServID)
ServicesPerformed = ''
ServiceList = Reactor_Log_Services('GetLogsByReactor', ReactNo)
for each rlKey in ServiceList using @FM
ServiceIDs = XLATE('REACTOR_LOG', rlKey, 18, 'X')
for each ServiceID in ServiceIDs using @VM
If ServiceID EQ ServID then
Date = XLATE('REACTOR_LOG', rlKey, 'END_DTM', 'X')
ServiceDesc = XLATE('REACT_SERVS', ServiceID, 1, 'X')
ReactItemID = ''
RLServIDs = XLATE('REACTOR_LOG', rlKey, 18, 'X')
RLSerialNos = XLATE('REACTOR_LOG', rlKey, 15, 'X')
RLReactItemIDs = obj_React_Item('Serial_RINo',RLSerialNos)
Locate ServiceID in RLServIDs using @VM setting ServPos then
ReactItemID = RLReactItemIDs<1,ServPos>
end
ServicesPerformed := ServiceID : @VM : ServiceDesc : @VM: OCONV(Date, 'D4/') : @VM : rlKey : @VM : ReactItemID : @FM
end
Next ServiceID
Next rlKey
response = ServicesPerformed
end service
Service GetLatestReactorLogsByReactor(ReactNo)
ServicesPerformed = ''
ServiceList = Reactor_Log_Services('GetLogsByReactor', ReactNo)
//FoundResults = ''
for each rlKey in ServiceList using @FM
ServiceIDs = XLATE('REACTOR_LOG', rlKey, 18, 'X')
for each ServiceID in ServiceIDs using @VM
Date = XLATE('REACTOR_LOG', rlKey, 'END_DTM', 'X')
ServiceDesc = XLATE('REACT_SERVS', ServiceID, 1, 'X')
ReactItemID = ''
RLServIDs = XLATE('REACTOR_LOG', rlKey, 18, 'X')
RLSerialNos = XLATE('REACTOR_LOG', rlKey, 15, 'X')
RLReactItemIDs = obj_React_Item('Serial_RINo',RLSerialNos)
Locate ServiceID in RLServIDs using @VM setting ServPos then
ReactItemID = RLReactItemIDs<1,ServPos>
end
ReactItemSN = XLATE('REACT_ITEM', ReactItemID, 10, 'X')
ServicesPerformed := ServiceID : @VM : rlKey : @VM : ServiceDesc : @VM: OCONV(Date, 'D4/') : @VM: ReactItemID : @FM
Next ServiceID
Next rlKey
//remove duplicates
sortIndex = ''
existingServIDs = ''
SortedArray = ''
for ServiceIndex = 1 to DCOUNT(ServicesPerformed, @FM)
LOCATE ServicesPerformed<ServiceIndex, 1> IN existingServIDs using @FM setting DUMMY else
SortedArray := ServicesPerformed<ServiceIndex> : @FM
existingServIDs := ServicesPerformed<ServiceIndex, 1> : @FM
end
Next ServiceIndex
response = SortedArray
end service
Service GetAllServIDs()
ReactServsList = ''
SelectSent = 'SELECT REACT_SERVS BY SERV_ID'
Set_Status(0)
RList(SelectSent, TARGET_ACTIVELIST$, "", "", "")
IF @RecCount then
EoF = 0
NumKeys = @RecCount
Cnt = 0
Loop
ReadNext ReactServID Else EoF = 1
until EoF
Description = XLATE('REACT_SERVS', ReactServID, 1, 'X')
ReactServsList := ReactServID : @VM : Description : @FM
Repeat
end
//to here
GoSub ClearCursors
ClearSelect TARGET_ACTIVELIST$
Response = ReactServsList
end service
Service ConvertRecordToJSON(KeyID, Record, itemURL)
jsonRecord = ''
If KeyID NE '' then
If Record EQ '' then Record = Database_Services('ReadDataRow', 'REACTOR_LOG', KeyID)
If Error_Services('NoError') then
@DICT = Database_Services('GetTableHandle', 'DICT.REACTOR_LOG')
@ID = KeyID
@RECORD = Record
objJSON = ''
If SRP_JSON(objJSON, 'New', 'Object') then
If SRP_JSON(objReactorLog, 'New', 'Object') then
SRP_JSON(objReactorLog, 'SetValue', 'keyId', @ID)
SRP_JSON(objReactorLog, 'SetValue', 'reactor', {REACTOR})
SRP_JSON(objReactorLog, 'SetValue', 'reactType', {REACT_TYPE})
SRP_JSON(objReactorLog, 'SetValue', 'reactTypeDesc', {REACT_TYPE_DESC})
SRP_JSON(objReactorLog, 'SetValue', 'reactProbId', {REACT_PROB_ID})
SRP_JSON(objReactorLog, 'SetValue', 'category', {CATEGORY})
// Create an array of service info objects
If SRP_JSON(objServInfoArray, 'New', 'Array') then
ReactProbCatIDs = {REACT_PROB_CAT_ID}
For each ReactProbCatID in ReactProbCatIDs using @VM setting vPos
objServInfo = ''
If SRP_JSON(objServInfo, 'New', 'Object') then
SRP_JSON(objServInfo, 'SetValue', 'reactProbCatId', ReactProbCatID)
SRP_JSON(objServInfo, 'SetValue', 'reactProbCatDesc', {REACT_PROB_CAT_DESC}<0, vPos>)
SRP_JSON(objServInfo, 'SetValue', 'reactServId', {REACT_SERV_ID}<0, vPos>)
SRP_JSON(objServInfo, 'SetValue', 'reactServDesc', {REACT_SERV_DESC}<0, vPos>)
If {SCHEDULED}<0, vPos> EQ '' then
SRP_JSON(objServInfo, 'SetValue', 'scheduled', {SCHEDULED}<0, vPos>, 'Null')
end else
SRP_JSON(objServInfo, 'SetValue', 'scheduled', {SCHEDULED}<0, vPos>, 'Boolean')
end
SRP_JSON(objServInfo, 'SetValue', 'reactServSnType', {REACT_SERV_SN_TYPE}<0, vPos>)
SRP_JSON(objServInfo, 'SetValue', 'reactItemId', {REACT_ITEM_IDS}<0, vPos>)
SRP_JSON(objServInfo, 'SetValue', 'reactItemRiNo', {REACT_ITEM_RI_NO}<0, vPos>)
SRP_JSON(objServInfo, 'SetValue', 'reactItemMfrPartNo', {RI_MFR_PART_NO}<0, vPos>)
SRP_JSON(objServInfo, 'SetValue', 'reactItemMfrPartRev', {RI_MFR_PART_REV}<0, vPos>)
SRP_JSON(objServInfo, 'SetValue', 'reactItemMfrSerialNo', {RI_MFR_SERIAL_NO}<0, vPos>)
SRP_JSON(objServInfo, 'SetValue', 'remReactItemId', Field({REM_RIH_KEY}<0, vPos>, '*', 2))
SRP_JSON(objServInfo, 'SetValue', 'remReactItemDispCd', {REM_DISP_CD}<0, vPos>)
SRP_JSON(objServInfoArray, 'Add', objServInfo)
SRP_JSON(objServInfo, 'Release')
end
Next ReactProbCatID
SRP_JSON(objReactorLog, 'Set', 'servInfo', objServInfoArray)
SRP_JSON(objServInfoArray, 'Release')
end
SRP_JSON(objReactorLog, 'SetValue', 'reactUtilId', {REACT_UTIL_ID})
objWaferCount = ''
If SRP_JSON(objWaferCount, 'New', 'Object') then
SRP_JSON(objWaferCount, 'SetValue', 'startCount', {REACT_WFR_CNT_START})
StartDTM = OConv({START_DATE}, 'D4/') :' ': OConv({START_TIME}, 'MTH')
SRP_JSON(objWaferCount, 'SetValue', 'startDtm', StartDTM)
SRP_JSON(objWaferCount, 'SetValue', 'endCount', {REACT_WFR_CNT_END})
SRP_JSON(objReactorLog, 'Set', 'waferCount', objWaferCount)
SRP_JSON(objWaferCount, 'Release')
end
SRP_JSON(objReactorLog, 'SetValue', 'entryId', {ENTRY_ID})
SRP_JSON(objReactorLog, 'SetValue', 'entryDate', OConv({ENTRY_DATE}, 'D4/'))
SRP_JSON(objReactorLog, 'SetValue', 'techSig', {TECH_SIG})
EndDTM = OConv({END_DATE}, 'D4/') :' ': OConv({END_TIME}, 'MTH')
SRP_JSON(objReactorLog, 'SetValue', 'endDtm', Trim(EndDTM))
SRP_JSON(objReactorLog, 'SetValue', 'elapsedHours', {ELAPSED_HOURS})
If {LO_NA} EQ '' then
SRP_JSON(objReactorLog, 'SetValue', 'lockOutTagOutNA', {LO_NA}, 'Null')
end else
SRP_JSON(objReactorLog, 'SetValue', 'lockOutTagOutNA', {LO_NA}, 'Boolean')
end
If {LO_REVIEWED} EQ '' then
SRP_JSON(objReactorLog, 'SetValue', 'lockOutTagOutReviewed', {LO_REVIEWED}, 'Null')
end else
SRP_JSON(objReactorLog, 'SetValue', 'lockOutTagOutReviewed', {LO_REVIEWED}, 'Boolean')
end
If {ROTR} EQ '' then
SRP_JSON(objReactorLog, 'SetValue', 'ROTR', {ROTR}, 'Null')
end else
SRP_JSON(objReactorLog, 'SetValue', 'ROTR', {ROTR}, 'Boolean')
end
Notes = {NOTES}
NotesDTMs = OConv({NOTES_DTMS}, 'DT2/^H')
NotesUsers = OConv({NOTES_USERS}, '[CONV_XLATE,LSL_USERS*FIRST_LAST]')
If SRP_JSON(objNotesArray, 'New', 'Array') then
If Notes NE '' then
objNote = ''
For each Note in Notes using @VM setting vPos
If SRP_JSON(objNote, 'New', 'Object') then
SRP_JSON(objNote, 'SetValue', 'datetime', NotesDTMs<0, vPos>)
SRP_JSON(objNote, 'SetValue', 'user', NotesUsers<0, vPos>)
SRP_JSON(objNote, 'SetValue', 'comment', Notes<0, vPos>)
SRP_JSON(objNotesArray, 'Add', objNote)
SRP_JSON(objNote, 'Release')
end
Next Note
end
SRP_JSON(objReactorLog, 'Set', 'comments', objNotesArray)
SRP_JSON(objNotesArray, 'Release')
end
objInjSettings = ''
If SRP_JSON(objInjSettings, 'New', 'Object') then
For InjIndex = 1 to 5
SRP_JSON(objInjSettings, 'SetValue', InjIndex, {CURR_INJ_SETTINGS}<0, InjIndex>)
Next InjIndex
SRP_JSON(objReactorLog, 'Set', 'currInjSettings', objInjSettings)
SRP_JSON(objInjSettings, 'Release')
end
If {WAFERS_REMOVED} EQ '' then
SRP_JSON(objReactorLog, 'SetValue', 'wafersRemoved', {WAFERS_REMOVED}, 'Null')
end else
SRP_JSON(objReactorLog, 'SetValue', 'wafersRemoved', {WAFERS_REMOVED}, 'Boolean')
end
// Active NICA Orders
RlChecklistActive = {CHECKLIST_ACTIVE}
SRP_JSON(objReactorLog, 'SetValue', 'reactorLogChecklistActive', RlChecklistActive, 'Boolean')
If RlChecklistActive then
RlChecklistTypes = {CHECKLIST_TYPE}
RlChecklistOrderIds = {CHECKLIST_ORDER_ID}
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(objReactorLog, 'Set', 'reactorLogChecklists', objRlChecklistArray)
SRP_JSON(objRlChecklistArray, 'Release')
end
end
loadedRds = Reactor_Services('GetLoadedRds', {REACTOR})
loadedRdsArray = ''
If SRP_JSON(loadedRdsArray, 'New', 'Array') then
objLoadedRds = ''
For idx = 1 To 2
If SRP_JSON(objLoadedRds, 'New', 'Object') then
loadLockSide = Xlate('RDS', loadedRds<idx>, RDS_LOAD_LOCK_SIDE$, 'X')
SRP_JSON(objLoadedRds, 'SetValue', 'loadLockSide', loadLockSide)
currentRds = loadedRds<idx>
SRP_JSON(objLoadedRds, 'SetValue', 'rds', currentRds)
end
SRP_JSON(loadedRdsArray, 'Add', objLoadedRds)
SRP_JSON(objLoadedRds, 'Release')
Next idx
SRP_JSON(objReactorLog, 'Set', 'loadedRds', loadedRdsArray, @FM)
SRP_JSON(loadedRdsArray, 'Release')
end
SRP_JSON(objJSON, 'Set', 'reactorLog', objReactorLog)
SRP_JSON(objReactorLog, 'Release')
end
If itemURL NE '' then
// The itemURL was passed in so add HAL+JSON properties.
// Create the _links property and then all link objects needed for this resource.
objLinks = ''
If SRP_JSON(objLinks, 'New', 'Object') then
// Create a self link.
objLink = ''
If SRP_JSON(objLink, 'New', 'Object') then
SRP_JSON(objLink, 'SetValue', 'href', ItemURL, 'String')
SRP_JSON(objLink, 'SetValue', 'title', 'Self', 'String')
SRP_JSON(objLinks, 'Set', 'self', objLink)
SRP_JSON(objLink, 'Release')
end
SRP_JSON(objJSON, 'Set', '_links', objLinks)
SRP_JSON(objLinks, 'Release')
end
// Create the _class property for this resource.
SRP_JSON(objJSON, 'SetValue', '_class', 'resource')
end
jsonRecord = SRP_JSON(objJSON, 'Stringify', 'Styled')
SRP_JSON(objJSON, 'Release')
end else
Error_Services('Add', 'Unable to create JSON representation in the ' : Service : ' service.')
end
end
end else
Error_Services('Add', 'KeyID argument was missing in the ' : Service : ' service.')
end
Response = jsonRecord
end service
Service ConvertJSONToRecord(JSON)
If JSON NE '' then
If SRP_JSON(objJSON, 'Parse', JSON) EQ '' then
objReactorLog = SRP_JSON(objJSON, 'Get', 'reactorLog')
@ID = SRP_JSON(objReactorLog, 'GetValue', 'keyId')
If @ID NE '' then
@Record = Database_Services('ReadDataRow', 'REACTOR_LOG', @ID)
If Error_Services('NoError') then
@Dict = Database_Services('GetTableHandle', 'DICT.REACTOR_LOG')
{REACT_PROB_ID} = SRP_JSON(objReactorLog, 'GetValue', 'reactProbID', '')
objServInfoArray = SRP_JSON(objReactorLog, 'Get', 'servInfo')
NumObjects = SRP_JSON(objServInfoArray, 'GetCount')
ReactProbCatIds = ''
ReactServIds = ''
Scheduled = ''
ReactItemIds = ''
RemReactItemIds = ''
RemReactItemDispCds = ''
For ArrayIndex = 1 to NumObjects
ReactProbCatIds<0, ArrayIndex> = SRP_JSON(objServInfoArray, 'GetValue', '[':ArrayIndex:'].reactProbCatId', '')
ReactServIds<0, ArrayIndex> = SRP_JSON(objServInfoArray, 'GetValue', '[':ArrayIndex:'].reactServId', '')
Scheduled<0, ArrayIndex> = SRP_JSON(objServInfoArray, 'GetValue', '[':ArrayIndex:'].scheduled', '')
ReactItemIds<0, ArrayIndex> = SRP_JSON(objServInfoArray, 'GetValue', '[':ArrayIndex:'].reactItemId', '')
RemReactItemIds<0, ArrayIndex> = SRP_JSON(objServInfoArray, 'GetValue', '[':ArrayIndex:'].remReactItemId', '')
RemReactItemDispCds<0, ArrayIndex> = SRP_JSON(objServInfoArray, 'GetValue', '[':ArrayIndex:'].remReactItemDispCd', '')
Next ArrayIndex
SRP_JSON(objServInfoArray, 'Release')
Notes = ''
NotesDTMs = ''
NotesUsers = ''
objNotesArray = SRP_JSON(objReactorLog, 'Get', 'comments')
NumNotes = SRP_JSON(objNotesArray, 'GetCount')
TempID = @ID
TempRec = @Record
TempDict = @Dict
For ArrayIndex = 1 to NumNotes
Notes<0, ArrayIndex> = SRP_JSON(objNotesArray, 'GetValue', '[':ArrayIndex:'].comment', '')
NotesDTMs<0, ArrayIndex> = IConv(SRP_JSON(objNotesArray, 'GetValue', '[':ArrayIndex:'].datetime', ''), 'DT')
User = SRP_JSON(objNotesArray, 'GetValue', '[':ArrayIndex:'].user', '')
If User NE '' then
Query = 'SELECT LSL_USERS WITH FIRST_LAST EQ ':Quote(User)
RList(Query, TARGET_ACTIVELIST$, '', '', '')
ReadNext User else Null
GoSub ClearCursors
end
NotesUsers<0, ArrayIndex> = User
Next ArrayIndex
SRP_JSON(objNotesArray, 'Release')
@ID = TempID
@Record = TempRec
@Dict = TempDict
{NOTES} = Notes
{NOTES_DTMS} = NotesDTMs
{NOTES_USERS} = NotesUsers
{REACT_PROB_CAT_ID} = ReactProbCatIds
{REACT_SERV_ID} = ReactServIds
{SCHEDULED} = Scheduled
{REACT_ITEM_IDS} = ReactItemIds
{REM_DISP_CD} = RemReactItemDispCds
{REACT_UTIL_ID} = SRP_JSON(objReactorLog, 'GetValue', 'reactUtilId', '')
{REACT_WFR_CNT_START} = SRP_JSON(objReactorLog, 'GetValue', 'waferCount.startCount', '')
{TECH_SIG} = SRP_JSON(objReactorLog, 'GetValue', 'techSig', '')
{LO_NA} = SRP_JSON(objReactorLog, 'GetValue', 'lockOutTagOutNA', '')
{LO_REVIEWED} = SRP_JSON(objReactorLog, 'GetValue', 'lockOutTagOutReviewed', '')
{ROTR} = SRP_JSON(objReactorLog, 'GetValue', 'ROTR', '')
{WAFERS_REMOVED} = SRP_JSON(objReactorLog, 'GetValue', 'wafersRemoved', '')
objWafersRemovedRdsArray = SRP_JSON(objReactorLog, 'Get', 'wafersRemovedRds')
wafersRemovedRdsCount = SRP_JSON(objWafersRemovedRdsArray, 'GetCount')
wafersRemovedRds = ''
For idx = 1 to wafersRemovedRdsCount
If (idx GT 1) then wafersRemovedRds := @VM
rds = SRP_JSON(objWafersRemovedRdsArray, 'GetValue', '[':idx:']', '')
wafersRemovedRds := rds
Next idx
{WAFERS_REMOVED_RDS} = wafersRemovedRds
SRP_Json(objWafersRemovedRdsArray, 'Release')
{WAFERS_REMOVED} = SRP_JSON(objReactorLog, 'GetValue', 'wafersRemoved', '')
objWafersRemovedRdsArray = SRP_JSON(objReactorLog, 'Get', 'wafersRemovedRds')
wafersRemovedRdsCount = SRP_JSON(objWafersRemovedRdsArray, 'GetCount')
wafersRemovedRds = ''
For idx = 1 to wafersRemovedRdsCount
If (idx GT 1) then wafersRemovedRds := @VM
rds = SRP_JSON(objWafersRemovedRdsArray, 'GetValue', '[':idx:']', '')
wafersRemovedRds := rds
Next idx
{WAFERS_REMOVED_RDS} = wafersRemovedRds
SRP_Json(objWafersRemovedRdsArray, 'Release')
end
end else
Error_Services('Add', 'Error in ':Service:' service. Null value for reactorLog.keyID.')
end
SRP_JSON(objReactorLog, 'Release')
SRP_JSON(objJSON, 'Release')
end else
Error_Services('Add', 'Error in ':Service:' service. Unable to parse JSON payload.')
end
end else
Error_Services('Add', 'Error in ':Service:' service. Null JSON passed in.')
end
Response = @Record
end service
Service GetRlChecklistActive(RLKey)
If RLKey NE '' then
OrderTypes = 'ASM_HTR_TUBE_CHANGE' : @VM : 'ASM_HTR_ANNUAL_PM' : @VM : 'ASM_HTR_SEMIANNUAL_PM' : @VM : 'ASM_HTR_FIVE_AND_TEN_YEAR_PM'
ActiveRlOrderIds = Nica_Orders_Services('GetActiveOrders', 'REACTOR_LOG', RLKey, OrderTypes)
Response = ( ActiveRlOrderIds NE '' )
end else
Error_Services('Add', 'Error in ':Service:' service. Null ReactNo passed into service.')
end
end service
Service AddComment(Reactor, NewNote, User)
ReactModeNGKey = Xlate('REACTOR_CHILD_KEY_IDS_NG', Reactor, 'REACT_MODE_KEY_IDS', 'X')
RLKey = Xlate('REACT_MODE_NG', ReactModeNGKey, 'START_RL_ID', 'X')
If RLKey NE '' then
RLRec = Database_Services('ReadDataRow', 'REACTOR_LOG', RLKey)
If Error_Services('NoError') then
Notes = RLRec<REACTOR_LOG_NOTES$>
NumNotes = DCount(Notes, @VM)
RLRec<REACTOR_LOG_NOTES$, NumNotes + 1> = NewNote
RLRec<REACTOR_LOG_NOTES_DTMS$, NumNotes + 1> = Datetime()
RLRec<REACTOR_LOG_NOTES_USERS$, NumNotes + 1> = User
Database_Services('WriteDataRow', 'REACTOR_LOG', RLKey, RLRec)
end
end else
Error_Services('Add', 'Error in ':Service:' service. Error locating reactor log key for reactor ':Reactor:'.')
end
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ClearCursors:
For counter = 0 to 8
ClearSelect counter
Next counter
return