open-insight/LSL2/STPROC/NICA_ORDERS_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

886 lines
39 KiB
Plaintext

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_CHECKLISTS_EQUATES
$Insert NICA_ORDERS_CHECKLISTS_EQUATES
$Insert RLIST_EQUATES
Equ SECONDS_IN_DAY$ to 86400
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, Datetime
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','ABORT_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 '')
AbortAlarmChecklistActive = (Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactNo, 'ABORT_ALARM') 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
ReadV CacheAbortAlarmChecklistActive from hReactor, ReactNo, REACTOR_ABORT_ALARM_CHECKLIST_ACTIVE$ then
If CacheAbortAlarmChecklistActive NE AbortAlarmChecklistActive then
Lock hReactor, ReactNo then
WriteV AbortAlarmChecklistActive on hReactor, ReactNo, REACTOR_ABORT_ALARM_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, OrderResponseLevel, ChecklistIds)
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,ABORT_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') or (OrderType EQ 'ABORT_ALARM') ) 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') and (OrderType NE 'ABORT_ALARM') ) 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
If ChecklistIds NE '' then
NewChecklistIds = ChecklistIds
If CurrActiveOrders NE '' then
IncompleteChecklistIds = ''
CompleteChecklistIds = ''
Open 'DICT.NICA_ORDERS_CHECKLISTS' to hDict then
For each ActiveNicaOrdersId in CurrActiveOrders using @VM
// Get incomplete checklists so we can add them to the new order
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
// Build a list of completed checklists which should not be prescribed again in the replacement NICA order
CompleteOrderChecklistIds = ''
Flag = ''
Query = 'NICA_ORDERS_ID':@VM:ActiveNicaOrdersId:@FM
Query := 'IS_COMPLETE':@VM:True$:@FM
Btree.Extract(Query, 'NICA_ORDERS_CHECKLISTS', hDict, CompleteOrderChecklistIds, 'E', Flag)
If Flag EQ 0 then
CompleteOrderChecklistIdsRot = SRP_Array('Rotate', CompleteOrderChecklistIds, @VM, '*')
CompChecklistIds = CompleteOrderChecklistIdsRot<0, 2>
Swap '*' with @VM in CompChecklistIds
end
For each CompChecklistId in CompChecklistIds using @VM
RemoveIfComp = Xlate('NICA_CHECKLISTS', CompChecklistId, NICA_CHECKLISTS.REMOVE_IF_COMPLETE$, 'X')
If RemoveIfComp then
Locate CompChecklistId in NewChecklistIds using @VM setting vPos then
NewChecklistIds = Delete(NewChecklistIds, 0, vPos, 0)
end
end
Next CompChecklistId
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 ChecklistIds variable passed in.'
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
ReqDtm = SRP_JSON(ObjResponseJson, 'GetValue', 'requestedDate')
ReqDate = IConv(ReqDtm[1, 'FT'], 'DJ')
ReqTime = IConv(ReqDtm[Col2() + 1, 'F.'], 'MT')
CreatedDtm = ReqDate + (ReqTime/SECONDS_IN_DAY$)
NicaOrderRec = ''
NicaOrderRec<NICA_ORDERS.ORDER_TYPE$> = OrderType
NicaOrderRec<NICA_ORDERS.ORDER_STATUS$> = SRP_JSON(ObjResponseJson, 'GetValue', 'state')
NicaOrderRec<NICA_ORDERS.ENTITY_TYPE$> = EntityType
NicaOrderRec<NICA_ORDERS.ENTITY_ID$> = EntityID
NicaOrderRec<NICA_ORDERS.IS_COMPLETE$> = SRP_JSON(ObjResponseJson, 'GetValue', 'isComplete')
NicaOrderRec<NICA_ORDERS.CREATED_DTM$> = CreatedDtm
If NicaOrderRec<NICA_ORDERS.IS_COMPLETE$> EQ False$ then
NicaOrderRec<NICA_ORDERS.PROGRESS_PERCENTAGE$> = SRP_JSON(ObjResponseJson, 'GetValue', 'progressPercentage')
end else
NicaOrderRec<NICA_ORDERS.PROGRESS_PERCENTAGE$> = 100
end
NicaOrderRec<NICA_ORDERS.ORDER_FLOW_IDS$> = OrderFlows
NicaOrderRec<NICA_ORDERS.ORDER_RESPONSE_LEVEL$> = OrderResponseLevel
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') or (OrderType _EQC 'ABORT_ALARM') ) 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<NICA_ORDERS_CHECKLISTS.IS_COMPLETE$> = 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
end else
ErrorMsg = 'Error encountered when attempting to create Nica order for entity ':EntityType:' ' :EntityID:' of type ':OrderType:'. Active order already exists.'
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<NICA_ORDERS.ENTITY_TYPE$>
EntityId = NicaOrderRec<NICA_ORDERS.ENTITY_ID$>
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<NICA_ORDERS.ORDER_STATUS$> = SRP_JSON(ObjResponseJson, 'GetValue', 'state')
NicaOrderRec<NICA_ORDERS.IS_COMPLETE$> = SRP_JSON(ObjResponseJson, 'GetValue', 'isComplete')
CloseDtm = Datetime()
NicaOrderRec<NICA_ORDERS.CLOSED_DTM$> = CloseDtm
If IsComplete EQ False$ then
NicaOrderRec<NICA_ORDERS.PROGRESS_PERCENTAGE$> = SRP_JSON(ObjResponseJson, 'GetValue', 'progressPercentage')
end else
NicaOrderRec<NICA_ORDERS.PROGRESS_PERCENTAGE$> = 100
end
Database_Services('WriteDataRow', 'NICA_ORDERS', OrderId, NicaOrderRec, True$, False$, False$)
If Error_Services('NoError') then
OrderType = NicaOrderRec<NICA_ORDERS.ORDER_TYPE$>
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 (OrderType EQ 'ABORT_ALARM') then
ActiveAbortAlarmOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactNo, 'ABORT_ALARM')
AbortAlarmOrderActive = (ActiveAbortAlarmOrders NE '')
If (AbortAlarmOrderActive EQ False$) then
Open 'REACTOR' to hReactor then
WriteV True$ on hReactor, ReactNo, REACTOR_ABORT_ALARM_COMPLETE$ else
ErrorMsg = 'Error in ':Service:' service. Error setting ABORT_ALARM_COMPLETE flag in REACTOR record.'
end
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<NICA_ORDERS.ENTITY_TYPE$>
EntityId = NicaOrderRec<NICA_ORDERS.ENTITY_ID$>
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')
State = SRP_JSON(ObjResponseJson, 'GetValue', 'state')
NicaOrderRec<NICA_ORDERS.ORDER_STATUS$> = State
NicaOrderRec<NICA_ORDERS.IS_COMPLETE$> = IsComplete
CloseDtm = NicaOrderRec<NICA_ORDERS.CLOSED_DTM$>
If ( (CloseDtm EQ '' ) and ( (State _EQC 'done') or (State _EQC 'cancelled') ) ) then
CloseDtm = Datetime()
NicaOrderRec<NICA_ORDERS.CLOSED_DTM$> = CloseDtm
end
If IsComplete EQ False$ then
NicaOrderRec<NICA_ORDERS.PROGRESS_PERCENTAGE$> = SRP_JSON(ObjResponseJson, 'GetValue', 'progressPercentage')
end else
NicaOrderRec<NICA_ORDERS.PROGRESS_PERCENTAGE$> = 100
end
Database_Services('WriteDataRow', 'NICA_ORDERS', OrderId, NicaOrderRec, True$, False$, False$)
If Error_Services('NoError') then
OrderType = NicaOrderRec<NICA_ORDERS.ORDER_TYPE$>
If ( (OrderType _EQC 'INTRUSIVE_MAINT') or (OrderType _EQC 'ABORT_ALARM') ) 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<NICA_ORDERS_CHECKLISTS.IS_COMPLETE$> = IsComplete
NicaOrdersChecklistsRec<NICA_ORDERS_CHECKLISTS.STATE$> = 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 ( (OrderType _EQC 'ABORT_ALARM') and ( (State _EQC 'done') or (State _EQC 'cancelled') ) ) then
ActiveAbortAlarmOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactNo, 'ABORT_ALARM')
AbortAlarmOrderActive = (ActiveAbortAlarmOrders NE '')
If (AbortAlarmOrderActive EQ False$) then
Open 'REACTOR' to hReactor then
WriteV True$ on hReactor, ReactNo, REACTOR_ABORT_ALARM_COMPLETE$ else
ErrorMsg = 'Error in ':Service:' service. Error setting ABORT_ALARM_COMPLETE flag in REACTOR record.'
end
end
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
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////