Compile function Nica_Orders_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 Infineon Technologies. Name : Nica_Orders_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) 12/05/24 djs Original programmer. ***********************************************************************************************************************/ #pragma precomp SRP_PreCompiler $Insert APP_INSERTS $Insert SERVICE_SETUP $Insert REACTOR_EQUATES $Insert REACTOR_LOG_EQUATES $Insert NICA_ORDERS_EQUATES $Insert NICA_ORDERS_CHECKLISTS_EQUATES $Insert RLIST_EQUATES Declare function Environment_Services, Database_Services, Error_Services, Logging_Services, Nica_Orders_Services Declare function Httpclient_Services, SRP_JSON, Reactor_Services, Reactor_Log_Services, SRP_Array Declare subroutine Error_Services, Btree.Extract, Database_Services, Logging_Services, Nica_Orders_Services, Delay Declare subroutine Httpclient_Services, SRP_JSON, Mona_Services, Service_Services, Extract_SI_Keys Machine = Environment_Services('GetServer') LogDate = Oconv(Date(), 'D4/') LogTime = Oconv(Time(), 'MTS') LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM GoToService Return Response or "" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Service Parameter Options //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Options BOOLEAN = True$, False$ Options ENTITY_TYPES = 'REACTOR','REACTOR_LOG' Options ORDER_TYPES = 'INTRUSIVE_MAINT','CHANGEOVER','INITIATE_IDLE','IDLE','ASM_HTR_TUBE_CHANGE','ASM_HTR_ANNUAL_PM','ASM_HTR_SEMIANNUAL_PM','ASM_HTR_FIVE_AND_TEN_YEAR_PM','IQS_HGCV_ALARM' Options ORDER_STATUSES = 'new','creating','not-started','in-progress','cancelled','done' Options REACTOR_TYPES = 'ASM','ASM+','HTR','EPP' //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // SERVICES //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Service GetOrderIds(EntityType=ENTITY_TYPES, EntityID, OrderTypes=ORDER_TYPES, OrderStatus=ORDER_STATUSES, IsComplete=BOOLEAN) OrderKeys = '' ErrorMsg = '' If ( (EntityType NE '') or (EntityID NE '') or (OrderTypes NE '') or (OrderStatus NE '') or (IsComplete NE '') ) then Open 'DICT.NICA_ORDERS' to hDict then Query = '' Table = 'NICA_ORDERS' Option = 'E' Flag = '' If EntityType NE '' then Query := 'ENTITY_TYPE' : @VM : EntityType : @FM If EntityID NE '' then Query := 'ENTITY_ID' : @VM : EntityID : @FM If OrderTypes NE '' then Query := 'ORDER_TYPE' For each OrderType in OrderTypes using @VM Query := @VM : OrderType Next OrderType Query := @FM end If OrderStatus NE '' then Query := 'ORDER_STATUS' : @VM : OrderStatus : @FM If IsComplete NE '' then Query := 'IS_COMPLETE' For each Val in IsComplete using @VM Query := @VM : Val Next Val end Btree.Extract(Query, Table, hDict, OrderKeys, Option, Flag) If Flag NE 0 then ErrorMsg = 'Error in ':Service:' service. Btree.Extract call failed.' end end else ErrorMsg = 'Error in ':Service:' service. Failed to open DICT.NICA_ORDERS.' end end else ErrorMsg = 'Error in ':Service:' service. At least one search parameter must be provided.' end If ErrorMsg EQ '' then Response = OrderKeys end else Error_Services('Add', ErrorMsg) end End Service Service GetOrderUpdates() hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') Lock hSysLists, ServiceKeyID then ActiveOrderIds = Nica_Orders_Services('GetActiveOrders') For each OrderId in ActiveOrderIds using @VM Nica_Orders_Services('GetOrderStatusUpdate', OrderId) Next OrderId Unlock hSysLists, ServiceKeyID else Null Nica_Orders_Services('UpdateNicaFlags') end end service Service UpdateNicaFlags() ErrCode = '' ReactNos = Reactor_Services('GetReactorNumbers') Open 'REACTOR' to hReactor then Open 'REACTOR_LOG' to hReactorLog then For each ReactNo in ReactNos using @FM ProveInActive = Reactor_Services('GetProveInActive', ReactNo) HgCVChecklistActive = (Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactNo, 'IQS_HGCV_ALARM') NE '') IntrMaintChecklistActive = (Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactNo, 'INTRUSIVE_MAINT') NE '') Open 'REACTOR' to hReactor then ReadV CacheProveInActive from hReactor, ReactNo, REACTOR_PROVE_IN_ACTIVE$ then If CacheProveInActive NE ProveInActive then Lock hReactor, ReactNo then WriteV ProveInActive on hReactor, ReactNo, REACTOR_PROVE_IN_ACTIVE$ else Null Unlock hReactor, ReactNo else Null end end end ReadV CacheHgCVChecklistActive from hReactor, ReactNo, REACTOR_HGCV_CHECKLIST_ACTIVE$ then If CacheHgCVChecklistActive NE HgCVChecklistActive then Lock hReactor, ReactNo then WriteV HgCVChecklistActive on hReactor, ReactNo, REACTOR_HGCV_CHECKLIST_ACTIVE$ else Null Unlock hReactor, ReactNo else Null end end end ReadV CacheIntrMaintChecklistActive from hReactor, ReactNo, REACTOR_INTRUSIVE_MAINT_CHECKLIST_ACTIVE$ then If CacheIntrMaintChecklistActive NE IntrMaintChecklistActive then Lock hReactor, ReactNo then WriteV IntrMaintChecklistActive on hReactor, ReactNo, REACTOR_INTRUSIVE_MAINT_CHECKLIST_ACTIVE$ else Null Unlock hReactor, ReactNo else Null end end end end CurrModeKey = Xlate('REACTOR_CHILD_KEY_IDS_NG', ReactNo, 'REACT_MODE_KEY_IDS', 'X') CurrModeKey = CurrModeKey[-1, 'B':@VM] CurrRLKey = Xlate('REACT_MODE_NG', CurrModeKey, 'START_RL_ID', 'X') RLChecklistActive = Reactor_Log_Services('GetRlChecklistActive', CurrRlKey) Open 'REACTOR_LOG' to hReactorLog then ReadV CacheRlChecklistActive from hReactorLog, CurrRlKey, REACTOR_LOG_CHECKLIST_ACTIVE$ then If CacheRlChecklistActive NE RLChecklistActive then Lock hReactorLog, CurrRlKey then WriteV RlChecklistActive on hReactorLog, CurrRlKey, REACTOR_LOG_CHECKLIST_ACTIVE$ else Null Unlock hReactorLog, CurrRlKey else Null end end end end Next ReactNo end end end service Service GetActiveOrders(EntityType=ENTITY_TYPES, EntityId, OrderTypes=ORDER_TYPES) Response = Nica_Orders_Services('GetOrderIds', EntityType, EntityID, OrderTypes, '#cancelled', False$:@VM:'') end service Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES, OrderFlows) ErrorMsg = '' EntityTypes = 'REACTOR,REACTOR_LOG' OrderTypes = 'INTRUSIVE_MAINT,CHANGEOVER,INITIATE_IDLE,IDLE,ASM_HTR_TUBE_CHANGE,ASM_HTR_ANNUAL_PM,' OrderTypes := 'ASM_HTR_SEMIANNUAL_PM,ASM_HTR_FIVE_AND_TEN_YEAR_PM,IQS_HGCV_ALARM' Machine = Environment_Services('GetServer') Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log' ColumnWidths = 20 : @FM : 15 : @FM : 300 LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\NicaOrders' makeDirSuccess = Utility("MAKEDIR", LogPath) LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : '_CreateNicaOrder.csv' objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$) Prod = Environment_Services('IsProd') IgnoreCertErrors = Not(Prod) If ( (EntityType NE '') and (EntityID NE '') and (OrderType NE '') ) then Begin Case Case Not(InList(EntityTypes, EntityType, ',')) ErrorMsg = 'Error in ':Service:' service. Unsupported entity type' Case Not(InList(OrderTypes, OrderType, ',')) ErrorMsg = 'Error in ':Service:' service. Unsupported order type' End Case If ErrorMsg EQ '' then LogData = '' LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM LogData<2> = Machine LogData<3> = 'Attempting to create NICA order for entity ':EntityType:' ' :EntityID:' of type ':OrderType Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) CurrActiveOrders = Nica_Orders_Services('GetActiveOrders', EntityType, EntityID, OrderType) OrderTypeAlreadyActive = (CurrActiveOrders NE '') If ( (OrderTypeAlreadyActive EQ False$) or (OrderType EQ 'INTRUSIVE_MAINT') ) then Begin Case Case EntityType EQ 'REACTOR' ReactNo = EntityID Case EntityType EQ 'REACTOR_LOG' ReactNo = Xlate(EntityType, EntityID, REACTOR_LOG_REACTOR$, 'X') End Case // Build request Body = '' NewSortedChecklistIds = '' If OrderType NE 'INTRUSIVE_MAINT' then // Original API endpoint just uses query params, no body. NicaURL = Environment_Services("GetProveInApiUrl"):'/checklists?' NicaURL := 'checklistType=':OrderType NicaURL := '&reactorNumber=':ReactNo end else // New API endpoint uses JSON body instead of query params. NicaURL = Environment_Services("GetProveInApiUrl"):'/order' If OrderFlows NE '' then ReactorType = Xlate('REACTOR', ReactNo, REACTOR_REACT_TYPE$, 'X') NewChecklistIds = Nica_Orders_Services('GetFlowChecklistIds', OrderFlows, OrderType, ReactorType) // Get incomplete checklists and add them to the new order If CurrActiveOrders NE '' then IncompleteChecklistIds = '' Open 'DICT.NICA_ORDERS_CHECKLISTS' to hDict then For each ActiveNicaOrdersId in CurrActiveOrders using @VM IncompleteOrderChecklistIds = '' Flag = '' Query = 'NICA_ORDERS_ID':@VM:ActiveNicaOrdersId:@FM Query := 'IS_COMPLETE':@VM:False$:@FM Btree.Extract(Query, 'NICA_ORDERS_CHECKLISTS', hDict, IncompleteOrderChecklistIds, 'E', Flag) If Flag EQ 0 then IncompleteOrderChecklistIdsRot = SRP_Array('Rotate', IncompleteOrderChecklistIds, @VM, '*') PrevChecklistIds = IncompleteOrderChecklistIdsRot<0, 2> Swap '*' with @VM in PrevChecklistIds IncompleteChecklistIds<0, -1> = PrevChecklistIds end Next ActiveNicaOrdersId end NewChecklistIds<0, -1> = IncompleteChecklistIds end NewChecklistIds = SRP_Array('Clean', NewChecklistIds, 'TrimAndMakeUnique', @VM) NewChecklistPriorities = Xlate('NICA_CHECKLISTS', NewChecklistIds, 'PRIORITY', 'X') ChecklistArray = NewChecklistIds:@FM:NewChecklistPriorities ChecklistArray = SRP_Array('SortRows', ChecklistArray, 'AR2', 'ARRAY', @FM, @VM) NewSortedChecklistIds = ChecklistArray<1> JsonRequest = '' objJson = '' If SRP_JSON(objJson, 'New', 'Object') then SRP_JSON(objJson, 'SetValue', 'orderType', OrderType) SRP_JSON(objJson, 'SetValue', 'reactorNumber', ReactNo) NewChecklistInstIds = Xlate('NICA_CHECKLISTS', NewSortedChecklistIds, 'NICA_BASE_INSTRUCTION_ID', 'X') SRP_JSON(objJson, 'SetValueArray', 'baseInstructionIds', NewChecklistInstIds, @VM) Body = SRP_JSON(objJson, 'Stringify', 'Styled') Convert @FM to '' in Body SRP_JSON(objJson, 'Release') end else ErrorMsg = 'Error in ':Service:' service. Failed to initialize JSON object for request body.' end end else ErrorMsg = 'Error in ':Service:' service. Null Orderflows variable passed in.' end end // Send the request IsSuccessful = False$ If ErrorMsg EQ '' then Retries = 3 BackoffSeconds = 1 OrderId = '' Loop while (IsSuccessful EQ False$ and Retries GT 0) WaitSeconds = (3 - retries) * BackoffSeconds Delay(WaitSeconds) Retries = Retries - 1 If Body NE '' then Headers = 'Content-Type':@VM:'application/json':@FM:'Accept':@VM:'*/*' end else Headers = 'Accept':@VM:'*/*' end HttpResponseJson = Httpclient_Services('SendHTTPRequest', 'POST', NicaURL, Headers, Body, '', '', False$, False$, '', IgnoreCertErrors) If HttpResponseJson NE '' then ObjResponseJson = '' If SRP_JSON(ObjResponseJson, 'Parse', HttpResponseJson) EQ '' then OrderId = SRP_JSON(ObjResponseJson, 'GetValue', 'id') If OrderId NE '' then Convert @Lower.Case to @Upper.Case in OrderId NicaOrderRec = '' NicaOrderRec = OrderType NicaOrderRec = SRP_JSON(ObjResponseJson, 'GetValue', 'state') NicaOrderRec = EntityType NicaOrderRec = EntityID NicaOrderRec = SRP_JSON(ObjResponseJson, 'GetValue', 'isComplete') If NicaOrderRec EQ False$ then NicaOrderRec = SRP_JSON(ObjResponseJson, 'GetValue', 'progressPercentage') end else NicaOrderRec = 100 end LogNicaOrderRec = NicaOrderRec Swap @FM with ',' in LogNicaOrderRec LogData = '' LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM LogData<2> = Machine LogData<3> = 'Nica order record to write: ':LogNicaOrderRec Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) Database_Services('WriteDataRow', 'NICA_ORDERS', OrderId, NicaOrderRec, True$, False$, False$) If Error_Services('NoError') then If ( (OrderType _EQC 'INITIATE_IDLE') and (EntityType _EQC 'REACTOR') ) then Open 'REACTOR' to hReactor then WriteV True$ to hReactor, ReactNo, REACTOR_IDLE_STARTUP_REQUIRED$ else ErrorMsg = 'Error in ':Service:' service. Error setting IDLE_STARTUP_REQUIRED flag in REACTOR record.' end end end If OrderType _EQC 'INTRUSIVE_MAINT' then // Create NICA_ORDERS_CHECKLISTS child records for each checklist If NewSortedChecklistIds NE '' then For each ChecklistId in NewSortedChecklistIds using @VM Key = OrderId:'*':ChecklistId NicaOrdersChecklistsRec = '' NicaOrdersChecklistsRec = False$ Database_Services('WriteDataRow', 'NICA_ORDERS_CHECKLISTS', Key, NicaOrdersChecklistsRec, True$, False$, True$) If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage') Until (ErrorMsg NE '') Next ChecklistId end else ErrorMsg = 'Error in ':Service:' service. failed to create NICA_ORDERS_CHECKLIST records due to empty checklist array.' end end If ErrorMsg EQ '' then For each OrderId in CurrActiveOrders using @VM Nica_Orders_Services('CancelOrder', Orderid) Next OrderId IsSuccessful = True$ Response = OrderId end end else ErrorMsg = Error_Services('GetMessage') end end else ErrorMsg = 'Error in ':Service:' service. Null OrderId returned from MesaProveInAPI.' end SRP_JSON(ObjResponseJson, 'Release') end else ErrorMsg = 'Error in ':Service:' service. Error parsing JSON response from MesaProveInAPI.' end end else ErrorMsg = 'Error in ':Service:' service. Null JSON response returned from MesaProveInAPI.' end Repeat end // Send MonA status MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_NICAINTEGRATIONSERVICE' StatusName = 'CreateNicaOrder' If IsSuccessful then LogData = '' LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM LogData<2> = Machine LogData<3> = 'Successfully created Nica order for entity ':EntityType:' ':EntityID:' of type ':OrderType Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) Mona_Services('SendBufferedStatus', MonAResource, StatusName, 'Ok') end else ErrorMsg = 'Error encountered when attempting to create Nica in order for reactor ':ReactNo:' of type ':OrderType Mona_Services('SendBufferedStatus', MonAResource, StatusName, 'Critical') end end else ErrorMsg = 'Error encountered when attempting to create Nica order for entity ':EntityType:' ' :EntityID:' of type ':OrderType:'. Active order already exists.' end end end else ErrorMsg = 'Error in ':Service:' service. Null EntityType, EntityID, or OrderType passed in.' end If ErrorMsg NE '' then LogData = '' LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM LogData<2> = Machine LogData<3> = ErrorMsg Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) Error_Services('Add', ErrorMsg) Response = 'error' end end service Service CancelOrder(OrderId) ErrorMsg = '' Machine = Environment_Services('GetServer') Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log' ColumnWidths = 20 : @FM : 15 : @FM : 300 LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\NicaOrders' makeDirSuccess = Utility("MAKEDIR", LogPath) LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : '_CancelNicaOrder.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 Nica order ' : OrderId :'.' Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) Prod = Environment_Services('IsProd') IgnoreCertErrors = Not(Prod) If OrderId NE '' then LockRetries = 3 LockBackoffSeconds = 1 HaveLock = False$ Loop While (HaveLock EQ False$ and LockRetries GT 0) WaitSeconds = (3 - LockRetries) * LockBackoffSeconds Delay(WaitSeconds) LockRetries = LockRetries - 1 HaveLock = Database_Services('GetKeyIDLock', 'NICA_ORDERS', OrderId, True$) Repeat If HaveLock then NicaOrderRec = Database_Services('ReadDataRow', 'NICA_ORDERS', OrderId) If Error_Services('NoError') then EntityType = NicaOrderRec EntityId = NicaOrderRec Begin Case Case EntityType EQ 'REACTOR' ReactNo = EntityId Case EntityType EQ 'REACTOR_LOG' ReactNo = Xlate(EntityType, EntityId, REACTOR_LOG_REACTOR$, 'X') Case Otherwise$ ErrorMsg = 'Error in ':Service:' service. Unsupported entity type.' End Case If ErrorMsg EQ '' then LogData = '' LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM LogData<2> = Machine LogData<3> = 'Sending cancel request for Nica order ' : OrderId : ' for reactor ' : ReactNo Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) Response = False$ BaseProveInUrl = Environment_Services("GetProveInApiUrl"):'/checklists?' UrlOrderId = OrderId Convert @Upper.Case to @Lower.Case in UrlOrderId ProveInUrl = BaseProveInUrl:'checklistOrderId=':UrlOrderId ProveInUrl = ProveInUrl:'&checklistState=cancelled' Retries = 3 BackoffSeconds = 1 IsSuccessful = False$ Loop while (IsSuccessful EQ False$ and Retries GT 0) WaitSeconds = (3 - Retries) * BackoffSeconds Delay(WaitSeconds) Retries = Retries - 1 HttpResponseJson = Httpclient_Services('SendHTTPRequest', 'PUT', ProveInUrl, 'Accept':@VM:'*/*', '', '', '', False$, False$, '', IgnoreCertErrors) If HttpResponseJson NE '' then ObjResponseJson = '' If SRP_JSON(ObjResponseJson, 'Parse', HttpResponseJson) EQ '' then IsComplete = SRP_JSON(ObjResponseJson, 'GetValue', 'pendingUpdate') NicaOrderRec = SRP_JSON(ObjResponseJson, 'GetValue', 'state') NicaOrderRec = SRP_JSON(ObjResponseJson, 'GetValue', 'isComplete') If IsComplete EQ False$ then NicaOrderRec = SRP_JSON(ObjResponseJson, 'GetValue', 'progressPercentage') end else NicaOrderRec = 100 end Database_Services('WriteDataRow', 'NICA_ORDERS', OrderId, NicaOrderRec, True$, False$, False$) If Error_Services('NoError') then OrderType = NicaOrderRec If ( (OrderType _EQC 'IDLE') and (EntityType EQ 'REACTOR') ) then Open 'REACTOR' to hReactor then WriteV False$ on hReactor, ReactNo, REACTOR_IDLE_STARTUP_REQUIRED$ else ErrorMsg = 'Error in ':Service:' service. Error setting IDLE_STARTUP_REQUIRED flag in REACTOR record.' end end end If ( (Response EQ True$) or (Response EQ False$) ) then IsSuccessful = True$ end else ErrorMsg = Error_Services('GetMessage') end If IsComplete EQ True$ then Response = True$ end else Response = False$ end end end SRP_JSON(ObjResponseJson, 'Release') Repeat MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_NICAINTEGRATIONSERVICE' StatusName = 'CancelNicaOrder' If ( (IsSuccessful EQ True$) and (Response NE 'error') and (ErrorMsg EQ '') ) then LogData = '' LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM LogData<2> = Machine LogData<3> = 'Successfully cancelled Nica order ' : OrderId : ' for reactor ' : ReactNo Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) Mona_Services('SendBufferedStatus', MonAResource, StatusName, 'Ok') end else ErrorMsg = 'Error encountered cancelling Nica order ' : OrderId : ' for reactor ' : ReactNo Mona_Services('SendBufferedStatus', MonAResource, StatusName, 'Critical') end end else ErrorMsg = Error_Services('GetMessage') Database_Services('ReleaseKeyIDLock', 'NICA_ORDERS', OrderId) end end else ErrorMsg = 'Error in ':Service:' service. Failed to lock NICA_ORDERS ':OrderId:' for cancellation.' end end else ErrorMsg = 'Error in ':Service:' service. Null OrderID passed in.' end end else ErrorMsg = Error_Services('GetMessage') end If ErrorMsg NE '' then LogData = '' LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM LogData<2> = Machine LogData<3> = ErrorMsg Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) Error_Services('Add', ErrorMsg) Response = 'error' end end service Service GetOrderStatus(OrderId) If OrderId NE '' then If RowExists('NICA_ORDERS', OrderId) then Response = Xlate('NICA_ORDERS', OrderId, 'ORDER_STATUS', 'X') end else Error_Services('Add', 'Error in ':Service:' service. Nica order ':OrderId:' does not exist.') end end else Error_Services('Add', 'Error in ':Service:' service. Null OrderId passed in.') end end service Service GetOrderStatusUpdate(OrderId) ErrorMsg = '' Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log' ColumnWidths = 20 : @FM : 15 : @FM : 300 LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\NicaOrders' makeDirSuccess = Utility("MAKEDIR", LogPath) LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : '_GetOrderStatusUpdate.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 update Nica order ' : OrderId :'.' Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) Prod = Environment_Services('IsProd') IgnoreCertErrors = Not(Prod) If OrderId NE '' then HaveLock = Database_Services('GetKeyIDLock', 'NICA_ORDERS', OrderId, True$) If HaveLock then NicaOrderRec = Database_Services('ReadDataRow', 'NICA_ORDERS', OrderId) If Error_Services('NoError') then EntityType = NicaOrderRec EntityId = NicaOrderRec Begin Case Case EntityType EQ 'REACTOR' ReactNo = EntityId Case EntityType EQ 'REACTOR_LOG' ReactNo = Xlate(EntityType, EntityId, REACTOR_LOG_REACTOR$, 'X') Case Otherwise$ ErrorMsg = 'Error in ':Service:' service. Unsupported entity type.' End Case If ErrorMsg EQ '' then LogData = '' LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM LogData<2> = Machine LogData<3> = 'Attempting to fetch Nica order ':OrderId:' for reactor ':ReactNo Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) Response = True$ IsSuccessful = True$ BaseProveInUrl = Environment_Services("GetProveInApiUrl"):'/checklists?' UrlOrderId = OrderId Convert @Upper.Case to @Lower.Case in UrlOrderId ProveInUrl = BaseProveInUrl:'checklistOrderId=':UrlOrderId Retries = 3 BackoffSeconds = 1 IsSuccessful = False$ Loop while (IsSuccessful EQ False$ and Retries GT 0) WaitSeconds = (3 - Retries) * BackoffSeconds Delay(WaitSeconds) Retries = Retries - 1 HttpResponseJson = Httpclient_Services('SendHTTPRequest', 'GET', ProveInUrl, 'Accept':@VM:'*/*', '', '', '', False$, False$, '', IgnoreCertErrors) If HttpResponseJson NE '' then ObjResponseJson = '' If SRP_JSON(ObjResponseJson, 'Parse', HttpResponseJson) EQ '' then IsComplete = SRP_JSON(ObjResponseJson, 'GetValue', 'isComplete') NicaOrderRec = SRP_JSON(ObjResponseJson, 'GetValue', 'state') NicaOrderRec = IsComplete If IsComplete EQ False$ then NicaOrderRec = SRP_JSON(ObjResponseJson, 'GetValue', 'progressPercentage') end else NicaOrderRec = 100 end Database_Services('WriteDataRow', 'NICA_ORDERS', OrderId, NicaOrderRec, True$, False$, False$) If Error_Services('NoError') then OrderType = NicaOrderRec If (OrderType _EQC 'INTRUSIVE_MAINT') then // Update NICA_ORDERS_CHECKLISTS records (documents) Open 'NICA_ORDERS_CHECKLISTS' to hNicaOrdersChecklists then // Parse documents array for their isComplete flag ObjDocumentArray = SRP_JSON(ObjResponseJson, 'get', 'progresses') If ObjDocumentArray NE 0 then NumDocs = SRP_JSON(objDocumentArray, 'GetCount') For DocIndex = 1 to NumDocs DocumentId = SRP_JSON(ObjDocumentArray, 'GetValue', '[':DocIndex:'].baseInstructionId', '') If DocumentId NE '' then State = SRP_JSON(ObjDocumentArray, 'GetValue', '[':DocIndex:'].state', False$) IsComplete = (State _EQC 'done') ChecklistId = '' Extract_SI_Keys('NICA_CHECKLISTS', 'NICA_BASE_INSTRUCTION_ID', DocumentId, ChecklistId) ErrorCode = '' If Not(Get_Status(ErrorCode)) then If ChecklistId NE '' then NicaOrdersChecklistsKey = OrderId:'*':ChecklistId HaveOrderChecklistLock = Database_Services('GetKeyIDLock', 'NICA_ORDERS_CHECKLISTS', NicaOrdersChecklistsKey) If HaveOrderChecklistLock then NicaOrdersChecklistsRec = Database_Services('ReadDataRow', 'NICA_ORDERS_CHECKLISTS', NicaOrdersChecklistsKey) If Error_Services('NoError') then NicaOrdersChecklistsRec = IsComplete NicaOrdersChecklistsRec = State Database_Services('WriteDataRow', 'NICA_ORDERS_CHECKLISTS', NicaOrdersChecklistsKey, NicaOrdersChecklistsRec, True$, False$, False$) If Error_Services('HasError') then Database_Services('ReleaseKeyIDLock', 'NICA_ORDERS_CHECKLISTS', NicaOrdersChecklistsKey) end end end end else ErrorMsg = 'Error in ':Service:' service. No NICA_CHECKLISTS record found for documentId ':DocumentId:'.' end end else ErrorMsg = 'Error in ':Service:' service. Error calling Extract_SI_Keys on NICA_CHECKLISTS table. Error code: ':ErrorCode:'.' end end else ErrorMsg = 'Error in ':Service:' service. Null documentId return from Json response.' end Next DocIndex SRP_JSON(ObjDocumentArray, 'Release') end else ErrorMsg = 'Error in ':Service:' service. Error retrieving documents array from Json response.' end end else ErrorMsg = 'Error in ':Service:' service. Error opening NICA_ORDERS_CHECKLISTS table.' end end If IsComplete EQ True$ then If ( (OrderType _EQC 'IDLE') and (EntityType _EQC 'REACTOR') ) then Open 'REACTOR' to hReactor then WriteV False$ on hReactor, ReactNo, REACTOR_IDLE_STARTUP_REQUIRED$ else ErrorMsg = 'Error in ':Service:' service. Error setting IDLE_STARTUP_REQUIRED flag in REACTOR record.' end end end If ErrorMsg EQ '' then Response = True$ end else Response = False$ end If ( (Response EQ True$) or (Response EQ False$) ) then IsSuccessful = True$ end else ErrorMsg = Error_Services('GetMessage') end end SRP_JSON(ObjResponseJson, 'Release') end Repeat MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_NICAINTEGRATIONSERVICE' StatusName = 'GetNicaOrderUpdate' If IsSuccessful and Response NE 'error' then LogData = '' LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM LogData<2> = Machine LogData<3> = 'Successfully updated Nica order ':OrderId:' for reactor ':ReactNo:'.' Mona_Services('SendBufferedStatus', MonAResource, StatusName, 'Ok') Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) end else Database_Services('ReleaseKeyIDLock', 'NICA_ORDERS', OrderId) ErrorMsg = 'Error encountered updating Nica order ':OrderId:' for reactor ':ReactNo:'.' Mona_Services('SendBufferedStatus', MonAResource, StatusName, 'Critical') end end end else ErrorMsg = Error_Services('GetMessage') end end else ErrorMsg = 'Error in ':Service:' service. Failed to lock NICA_ORDERS ':OrderId:'.' end end else ErrorMsg = 'Error in ':Service:' service. Null OrderId passed in.' end If ErrorMsg NE '' then LogData = '' LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM LogData<2> = Machine LogData<3> = ErrorMsg Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) Error_Services('Add', ErrorMsg) Response = 'error' end end service Service GetFlowChecklistIds(NicaOrderFlowIds, NicaOrderFlowType=ORDER_TYPES, ReactorTypes=REACTOR_TYPES) ErrorMsg = '' FlowChecklistIds = '' If ( (NicaOrderFlowIds NE '') and (NicaOrderFlowType NE '') and (ReactorTypes NE '') ) then Query = 'SELECT NICA_CHECKLISTS ' For each NicaOrderFlowId in NicaOrderFlowIds using @VM setting vPos If vPos GT 1 then Query := 'OR ' Query := 'WITH NICA_ORDER_FLOW_IDS EQ ':Quote(NicaOrderFlowId):' ' Next NicaOrderFlowId Query := 'AND WITH NICA_ORDER_FLOW_TYPE EQ ':Quote(NicaOrderFlowType):' ' For each ReactorType in ReactorTypes using @VM setting vPos If vPos EQ 1 then Query := 'AND ' end else Query := 'OR ' end Query := 'WITH REACTOR_TYPES EQ ':Quote(ReactorType):' ' Next ReactorType Query := 'BY PRIORITY' RList(Query, TARGET_ACTIVELIST$, '', '', '') ErrCode = '' If Not(Get_Status(ErrCode)) then EOF = False$ Loop Readnext KeyId else EOF = True$ Until EOF FlowChecklistIds<0, -1> = KeyId Repeat end else ErrorMsg = 'Error in ':Service:' service. Error calling RList. Error code: ':ErrCode:'.' end end else ErrorMsg = 'Error in ':Service:' service. Null NicaOrderFlowIds, NicaOrderFlowType, or ReactorTypes Passed in.' end If ErrorMsg NE '' then Error_Services('Add', ErrorMsg) end else Response = FlowChecklistIds end end service //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Internal GoSubs ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////