Compare commits

..

31 Commits

Author SHA1 Message Date
2d3f534a71 Common ResourceID and IsViewerFile
Enable process-data-standard-format for HgCV and Tencor

Re-enable write for .txt files
2025-06-16 10:12:55 -07:00
f6ba173f47 removed value mark from key to prevent locks piling up 2025-06-13 11:28:27 -07:00
98e02f8c40 Added count metric endpoint 2025-06-11 09:45:26 -07:00
de6296b1d3 Merged PR 18416: Added in additional fields to response. Expected wafer map and a check for to...
Added in additional fields to response. Expected wafer map and a check for tool being down, as well as logging to API Endpoints

Related work items: #137427
2025-06-10 18:55:24 +02:00
ebd8b36d13 smart scanner metrics 2025-06-10 08:57:13 -07:00
803f946c7e removed dead code 2025-06-09 16:44:03 -07:00
16c7bc6926 fixed query to not look for an asterisk to match new data 2025-06-09 16:08:06 -07:00
216df9b4ef corrected TencorRunData path 2025-06-10 00:45:02 +02:00
5eec9386c2 Updated solution to support merging of ABORT_ALARM and INTRUSIVE_MAINT
orders
2025-06-09 12:26:36 -07:00
f3ad7adfa8 Move MonIn calls to background 2025-06-09 18:58:02 +02:00
c4fbf7c1d9 modified proc queue system to retry up to three times before moving the request to the PROC_QUEUE_FAILED table and notifying OI admins
added service to clean PROC_QUEUE_FAILED table
2025-06-09 18:23:24 +02:00
2a28c4b743 Added a condition that Wafer type for metrology reading is not null to determine if a test wafer is required. 2025-06-07 22:04:48 -07:00
e5f0e9b7f1 modified passdown commuter module to clear form on successful entry post 2025-06-05 13:07:21 -07:00
869787e0f3 Added logging to proc queue processing. Refactored code to delete request on failures. Restored MCP call in Service_Manager_Events to avoid issues calling certain procedures. 2025-06-04 17:05:06 -07:00
38fc89dac6 Updated service manager debugger intercept to also send notes (emails). Refactored Service_Manager_Events so that the call stack is not hidden behind MCP.
updated debugger intercept distribution group
2025-06-04 11:21:30 -07:00
614da8ad3b Merged PR 18112: Changed faulty call to LotEventServices -> CreateLotEvent to correct call
Changed faulty call to LotEventServices -> CreateLotEvent to correct call
2025-06-04 18:22:08 +02:00
dcb61e220c added production supervisors to MET DEPT popup so that calibration reminders are sent to them 2025-06-03 13:03:40 -07:00
117e5c8b4b Merged PR 18016: Added a new notification group and added group to get notifications on return...
Added a new notification group and added group to get notifications on return to fab
2025-06-02 21:00:34 +02:00
25c608c9a6 added a check for status of VOID within WO_MAT_ACTIONS to prevent creating MAKEUP_WAFERS record if lot is voided 2025-06-02 09:35:26 -07:00
31632e28aa fixed typo preventing location of calibration from being inserted into reminder email 2025-05-28 12:04:08 -07:00
03b0c8f606 re-enabling code temporarily turned off to populate REACT_ITEM<CURR_STATUS_STATIC> 2025-05-28 10:37:06 -07:00
6cfb6e521e Added new metric to track for reactor maintenance. Fixed a bug in DecrementWfrMetrics service.
added in equate changes
2025-05-28 01:29:32 +02:00
481f083804 added JFUENTE1 to MET DEPT so that MET type calibration notifications are also sent to her 2025-05-27 16:18:10 -07:00
18919090d8 updated wo_daily_sched_comm2 to pull the run order number from RUN_ORDER_NUM column in the RDS table 2025-05-27 11:30:13 -07:00
550f376a0b ready for deployment 2025-05-27 18:38:30 +02:00
6aad8036e5 Require TW logging at HTR last cassette unload 2025-05-27 08:54:38 -07:00
4fc7eb189b Add isAuthorizedToOverrideROTR flag 2025-05-27 17:30:21 +02:00
5e917e65ac added prod spec special instruction message for WMO makeup additions if flag set in PSN
added checkbox on prod spec form to set or unset show special instruction on backfill operation
2025-05-23 16:55:33 -07:00
97f3c3fce2 Merged PR 17496: updated CancelNicaOrder service to adapt to an update in the NICAIntegrationS...
updated CancelNicaOrder service to adapt to an update in the NICAIntegrationService
2025-05-23 20:36:18 +02:00
27d55d83a1 Merged PR 17495: fixed WM_OUT form Special Instruction source
fixed WM_OUT form Special Instruction source
2025-05-23 19:41:15 +02:00
4e213ff253 Merged PR 17284: Added call to CreateLotEvent routine on successful
Added call to CreateLotEvent routine on successful
completion of a lot qty adjustment to mark it as
as manual adjustment.
2025-05-21 23:53:18 +02:00
68 changed files with 16467 additions and 11734 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,675 @@
{
"header": {
"version": 1,
"type": "record"
},
"body": {
"record1": {
"<1>": "1010",
"<2>": "3",
"<3>": ""
},
"record2": {
"<1>": {
"<1,1>": "NDW_ACKNOWLEDGE_MESSAGE",
"<1,2>": "",
"<1,3>": "WINDOW",
"<1,4>": "",
"<1,5>": "137",
"<1,6>": "173",
"<1,7>": "-765",
"<1,8>": "-539",
"<1,9>": "Process Message",
"<1,10>": {
"<1,10,1>": "0x84C80000",
"<1,10,2>": "0x101"
},
"<1,11>": {
"<1,11,1>": "0x8000",
"<1,11,2>": "0x80000000"
},
"<1,12>": "",
"<1,13>": {
"<1,13,1>": "-2",
"<1,13,2>": "-2",
"<1,13,3>": "0"
},
"<1,14>": "",
"<1,15>": "",
"<1,16>": "",
"<1,17>": "",
"<1,18>": {
"<1,18,1>": {
"<1,18,1,1>": "X",
"<1,18,1,2>": "EXECUTE",
"<1,18,1,3>": "@WINDOW_EVENTS",
"<1,18,1,4>": {
"<1,18,1,4,1>": "@SELF",
"<1,18,1,4,2>": "@EVENT",
"<1,18,1,4,3>": "@PARAM1",
"<1,18,1,4,4>": "@PARAM2",
"<1,18,1,4,5>": "@PARAM3",
"<1,18,1,4,6>": "@PARAM4",
"<1,18,1,4,7>": "@PARAM5",
"<1,18,1,4,8>": "@PARAM6"
},
"<1,18,1,5>": "",
"<1,18,1,6>": "",
"<1,18,1,7>": "",
"<1,18,1,8>": "",
"<1,18,1,9>": "",
"<1,18,1,10>": "",
"<1,18,1,11>": "",
"<1,18,1,12>": "",
"<1,18,1,13>": "",
"<1,18,1,14>": "",
"<1,18,1,15>": "COMMEVT",
"<1,18,1,16>": "0"
}
},
"<1,19>": "CREATE",
"<1,20>": "",
"<1,21>": "",
"<1,22>": "",
"<1,23>": "",
"<1,24>": {
"<1,24,1>": "",
"<1,24,2>": "0",
"<1,24,3>": "0",
"<1,24,4>": "0",
"<1,24,5>": "",
"<1,24,6>": "0",
"<1,24,7>": "",
"<1,24,8>": "",
"<1,24,9>": "",
"<1,24,10>": "0",
"<1,24,11>": "0",
"<1,24,12>": "0",
"<1,24,13>": "0",
"<1,24,14>": "0",
"<1,24,15>": "0",
"<1,24,16>": "0",
"<1,24,17>": "0"
},
"<1,25>": "",
"<1,26>": "",
"<1,27>": "",
"<1,28>": "",
"<1,29>": "",
"<1,30>": "",
"<1,31>": "",
"<1,32>": "",
"<1,33>": "",
"<1,34>": "LSL2*IMAGE*ICO*INFINEON",
"<1,35>": "",
"<1,36>": "",
"<1,37>": {
"<1,37,1>": "0X10001",
"<1,37,2>": "0X10001"
},
"<1,38>": "",
"<1,39>": "",
"<1,40>": "",
"<1,41>": "",
"<1,42>": "",
"<1,43>": "",
"<1,44>": "",
"<1,45>": "",
"<1,46>": "",
"<1,47>": "",
"<1,48>": "",
"<1,49>": "",
"<1,50>": "",
"<1,51>": "",
"<1,52>": "",
"<1,53>": "",
"<1,54>": "",
"<1,55>": "",
"<1,56>": "",
"<1,57>": "",
"<1,58>": "",
"<1,59>": "",
"<1,60>": "",
"<1,61>": "",
"<1,62>": {
"<1,62,1>": "0",
"<1,62,2>": "",
"<1,62,3>": "",
"<1,62,4>": "2",
"<1,62,5>": "0",
"<1,62,6>": "0",
"<1,62,7>": "",
"<1,62,8>": "0.50",
"<1,62,9>": "5.00",
"<1,62,10>": "0.00"
},
"<1,63>": "",
"<1,64>": "",
"<1,65>": "",
"<1,66>": "",
"<1,67>": "",
"<1,68>": "",
"<1,69>": "",
"<1,70>": "",
"<1,71>": "",
"<1,72>": "",
"<1,73>": "",
"<1,74>": "",
"<1,75>": "",
"<1,76>": "",
"<1,77>": "",
"<1,78>": "",
"<1,79>": "",
"<1,80>": "",
"<1,81>": "",
"<1,82>": "",
"<1,83>": "",
"<1,84>": "",
"<1,85>": "",
"<1,86>": "",
"<1,87>": "",
"<1,88>": "",
"<1,89>": "",
"<1,90>": "",
"<1,91>": "",
"<1,92>": "",
"<1,93>": "",
"<1,94>": "",
"<1,95>": "",
"<1,96>": "",
"<1,97>": "",
"<1,98>": "",
"<1,99>": "",
"<1,100>": "",
"<1,101>": "",
"<1,102>": "",
"<1,103>": "",
"<1,104>": "",
"<1,105>": "",
"<1,106>": "0",
"<1,107>": "",
"<1,108>": ""
}
},
"record3": {
"<1>": {
"<1,1>": "EDB_DATA",
"<1,2>": "",
"<1,3>": "EDITBOX",
"<1,4>": "NDW_ACKNOWLEDGE_MESSAGE",
"<1,5>": "16",
"<1,6>": "12",
"<1,7>": "-17",
"<1,8>": "-48",
"<1,9>": "",
"<1,10>": {
"<1,10,1>": "0x56200840",
"<1,10,2>": "0x200"
},
"<1,11>": {
"<1,11,1>": "0xC400",
"<1,11,2>": "0x80000000"
},
"<1,12>": "3",
"<1,13>": {
"<1,13,1>": "-2",
"<1,13,2>": "-2",
"<1,13,3>": ""
},
"<1,14>": "-2",
"<1,15>": {
"<1,15,1>": {
"<1,15,1,1>": "Segoe UI",
"<1,15,1,2>": "-15",
"<1,15,1,3>": "400",
"<1,15,1,4>": "0",
"<1,15,1,5>": "0",
"<1,15,1,6>": "0",
"<1,15,1,7>": "0",
"<1,15,1,8>": "34",
"<1,15,1,9>": "0",
"<1,15,1,10>": "3",
"<1,15,1,11>": "2",
"<1,15,1,12>": "1"
}
},
"<1,16>": "",
"<1,17>": "",
"<1,18>": "",
"<1,19>": "",
"<1,20>": "",
"<1,21>": "",
"<1,22>": "",
"<1,23>": "",
"<1,24>": "",
"<1,25>": "",
"<1,26>": "",
"<1,27>": "",
"<1,28>": "<<None>>",
"<1,29>": "<<None>>",
"<1,30>": "",
"<1,31>": "0",
"<1,32>": "",
"<1,33>": "",
"<1,34>": "",
"<1,35>": "",
"<1,36>": "",
"<1,37>": "",
"<1,38>": "",
"<1,39>": "",
"<1,40>": "",
"<1,41>": "",
"<1,42>": "",
"<1,43>": "",
"<1,44>": "",
"<1,45>": "",
"<1,46>": "",
"<1,47>": "",
"<1,48>": "",
"<1,49>": "",
"<1,50>": "",
"<1,51>": "",
"<1,52>": "",
"<1,53>": "",
"<1,54>": "",
"<1,55>": "",
"<1,56>": "",
"<1,57>": "",
"<1,58>": "",
"<1,59>": "",
"<1,60>": "",
"<1,61>": "",
"<1,62>": "0",
"<1,63>": "",
"<1,64>": "",
"<1,65>": "",
"<1,66>": "",
"<1,67>": "",
"<1,68>": "",
"<1,69>": "",
"<1,70>": "",
"<1,71>": "",
"<1,72>": "",
"<1,73>": "",
"<1,74>": "",
"<1,75>": "",
"<1,76>": "",
"<1,77>": "",
"<1,78>": "",
"<1,79>": "",
"<1,80>": "",
"<1,81>": "",
"<1,82>": "",
"<1,83>": "",
"<1,84>": "",
"<1,85>": "",
"<1,86>": "",
"<1,87>": "",
"<1,88>": "",
"<1,89>": "",
"<1,90>": "",
"<1,91>": "",
"<1,92>": "",
"<1,93>": "",
"<1,94>": "",
"<1,95>": "",
"<1,96>": "",
"<1,97>": "",
"<1,98>": "",
"<1,99>": "",
"<1,100>": "",
"<1,101>": "",
"<1,102>": "",
"<1,103>": "",
"<1,104>": "",
"<1,105>": "",
"<1,106>": "",
"<1,107>": "",
"<1,108>": ""
},
"<2>": {
"<2,1>": "PUB_OK",
"<2,2>": "",
"<2,3>": "PUSHBUTTON",
"<2,4>": "NDW_ACKNOWLEDGE_MESSAGE",
"<2,5>": "-184",
"<2,6>": "-37",
"<2,7>": "80",
"<2,8>": "24",
"<2,9>": "&OK",
"<2,10>": {
"<2,10,1>": "0x56000300",
"<2,10,2>": "0x0"
},
"<2,11>": {
"<2,11,1>": "0x3005",
"<2,11,2>": "0x80000000"
},
"<2,12>": "1",
"<2,13>": {
"<2,13,1>": "-2",
"<2,13,2>": "-2",
"<2,13,3>": "0"
},
"<2,14>": "-2",
"<2,15>": {
"<2,15,1>": {
"<2,15,1,1>": "Segoe UI",
"<2,15,1,2>": "-12",
"<2,15,1,3>": "400",
"<2,15,1,4>": "0",
"<2,15,1,5>": "0",
"<2,15,1,6>": "0",
"<2,15,1,7>": "1",
"<2,15,1,8>": "0",
"<2,15,1,9>": "0",
"<2,15,1,10>": "0",
"<2,15,1,11>": "0",
"<2,15,1,12>": "0"
}
},
"<2,16>": "",
"<2,17>": "",
"<2,18>": {
"<2,18,1>": {
"<2,18,1,1>": "X",
"<2,18,1,2>": "EXECUTE",
"<2,18,1,3>": "@WINDOW_EVENTS",
"<2,18,1,4>": {
"<2,18,1,4,1>": "@SELF",
"<2,18,1,4,2>": "@EVENT",
"<2,18,1,4,3>": "@PARAM1",
"<2,18,1,4,4>": "@PARAM2",
"<2,18,1,4,5>": "@PARAM3",
"<2,18,1,4,6>": "@PARAM4",
"<2,18,1,4,7>": "@PARAM5",
"<2,18,1,4,8>": "@PARAM6"
},
"<2,18,1,5>": "",
"<2,18,1,6>": "",
"<2,18,1,7>": "",
"<2,18,1,8>": "",
"<2,18,1,9>": "",
"<2,18,1,10>": "",
"<2,18,1,11>": "",
"<2,18,1,12>": "",
"<2,18,1,13>": "",
"<2,18,1,14>": "",
"<2,18,1,15>": "COMMEVT",
"<2,18,1,16>": "0"
}
},
"<2,19>": "CLICK",
"<2,20>": "",
"<2,21>": "",
"<2,22>": "",
"<2,23>": "",
"<2,24>": "",
"<2,25>": "",
"<2,26>": "",
"<2,27>": "",
"<2,28>": "",
"<2,29>": "",
"<2,30>": "",
"<2,31>": "",
"<2,32>": "",
"<2,33>": "",
"<2,34>": "",
"<2,35>": "",
"<2,36>": "",
"<2,37>": "",
"<2,38>": "",
"<2,39>": "",
"<2,40>": "-1",
"<2,41>": {
"<2,41,1>": "",
"<2,41,2>": "-1"
},
"<2,42>": "",
"<2,43>": "",
"<2,44>": "",
"<2,45>": "",
"<2,46>": "",
"<2,47>": "",
"<2,48>": "",
"<2,49>": "",
"<2,50>": "",
"<2,51>": "",
"<2,52>": "",
"<2,53>": "",
"<2,54>": "",
"<2,55>": "",
"<2,56>": "",
"<2,57>": "",
"<2,58>": "",
"<2,59>": "",
"<2,60>": "",
"<2,61>": "",
"<2,62>": "0",
"<2,63>": "",
"<2,64>": {
"<2,64,1>": "-2",
"<2,64,2>": "-2",
"<2,64,3>": "0"
},
"<2,65>": "-2",
"<2,66>": "",
"<2,67>": "",
"<2,68>": "",
"<2,69>": "",
"<2,70>": "",
"<2,71>": "",
"<2,72>": "",
"<2,73>": "",
"<2,74>": "",
"<2,75>": "",
"<2,76>": "",
"<2,77>": "",
"<2,78>": "",
"<2,79>": "",
"<2,80>": "",
"<2,81>": "",
"<2,82>": "",
"<2,83>": "",
"<2,84>": "",
"<2,85>": "",
"<2,86>": "",
"<2,87>": "",
"<2,88>": "",
"<2,89>": "",
"<2,90>": "0",
"<2,91>": "0",
"<2,92>": "",
"<2,93>": "",
"<2,94>": "",
"<2,95>": "",
"<2,96>": "",
"<2,97>": "",
"<2,98>": "",
"<2,99>": "",
"<2,100>": "",
"<2,101>": "",
"<2,102>": "",
"<2,103>": "",
"<2,104>": "",
"<2,105>": "",
"<2,106>": "",
"<2,107>": "",
"<2,108>": ""
},
"<3>": {
"<3,1>": "PUB_CANCEL",
"<3,2>": "",
"<3,3>": "PUSHBUTTON",
"<3,4>": "NDW_ACKNOWLEDGE_MESSAGE",
"<3,5>": "-97",
"<3,6>": "-37",
"<3,7>": "80",
"<3,8>": "24",
"<3,9>": "&Cancel",
"<3,10>": {
"<3,10,1>": "0x56000300",
"<3,10,2>": "0x0"
},
"<3,11>": {
"<3,11,1>": "0x3002",
"<3,11,2>": "0x80000000"
},
"<3,12>": "2",
"<3,13>": {
"<3,13,1>": "-2",
"<3,13,2>": "-2",
"<3,13,3>": "0"
},
"<3,14>": "-2",
"<3,15>": {
"<3,15,1>": {
"<3,15,1,1>": "Segoe UI",
"<3,15,1,2>": "-12",
"<3,15,1,3>": "400",
"<3,15,1,4>": "0",
"<3,15,1,5>": "0",
"<3,15,1,6>": "0",
"<3,15,1,7>": "1",
"<3,15,1,8>": "0",
"<3,15,1,9>": "0",
"<3,15,1,10>": "0",
"<3,15,1,11>": "0",
"<3,15,1,12>": "0"
}
},
"<3,16>": "",
"<3,17>": "",
"<3,18>": {
"<3,18,1>": {
"<3,18,1,1>": "X",
"<3,18,1,2>": "EXECUTE",
"<3,18,1,3>": "@WINDOW_EVENTS",
"<3,18,1,4>": {
"<3,18,1,4,1>": "@SELF",
"<3,18,1,4,2>": "@EVENT",
"<3,18,1,4,3>": "@PARAM1",
"<3,18,1,4,4>": "@PARAM2",
"<3,18,1,4,5>": "@PARAM3",
"<3,18,1,4,6>": "@PARAM4",
"<3,18,1,4,7>": "@PARAM5",
"<3,18,1,4,8>": "@PARAM6"
},
"<3,18,1,5>": "",
"<3,18,1,6>": "",
"<3,18,1,7>": "",
"<3,18,1,8>": "",
"<3,18,1,9>": "",
"<3,18,1,10>": "",
"<3,18,1,11>": "",
"<3,18,1,12>": "",
"<3,18,1,13>": "",
"<3,18,1,14>": "",
"<3,18,1,15>": "COMMEVT",
"<3,18,1,16>": "0"
}
},
"<3,19>": "CLICK",
"<3,20>": "",
"<3,21>": "",
"<3,22>": "",
"<3,23>": "",
"<3,24>": "",
"<3,25>": "",
"<3,26>": "",
"<3,27>": "",
"<3,28>": "",
"<3,29>": "",
"<3,30>": "",
"<3,31>": "",
"<3,32>": "",
"<3,33>": "",
"<3,34>": "",
"<3,35>": "",
"<3,36>": "",
"<3,37>": "",
"<3,38>": "",
"<3,39>": "",
"<3,40>": "-1",
"<3,41>": {
"<3,41,1>": "",
"<3,41,2>": "-1"
},
"<3,42>": "",
"<3,43>": "",
"<3,44>": "",
"<3,45>": "",
"<3,46>": "",
"<3,47>": "",
"<3,48>": "",
"<3,49>": "",
"<3,50>": "",
"<3,51>": "",
"<3,52>": "",
"<3,53>": "",
"<3,54>": "",
"<3,55>": "",
"<3,56>": "",
"<3,57>": "",
"<3,58>": "",
"<3,59>": "",
"<3,60>": "",
"<3,61>": "",
"<3,62>": "0",
"<3,63>": "",
"<3,64>": {
"<3,64,1>": "-2",
"<3,64,2>": "-2",
"<3,64,3>": "0"
},
"<3,65>": "-2",
"<3,66>": "",
"<3,67>": "",
"<3,68>": "",
"<3,69>": "",
"<3,70>": "",
"<3,71>": "",
"<3,72>": "",
"<3,73>": "",
"<3,74>": "",
"<3,75>": "",
"<3,76>": "",
"<3,77>": "",
"<3,78>": "",
"<3,79>": "",
"<3,80>": "",
"<3,81>": "",
"<3,82>": "",
"<3,83>": "",
"<3,84>": "",
"<3,85>": "",
"<3,86>": "",
"<3,87>": "",
"<3,88>": "",
"<3,89>": "",
"<3,90>": "0",
"<3,91>": "0",
"<3,92>": "",
"<3,93>": "",
"<3,94>": "",
"<3,95>": "",
"<3,96>": "",
"<3,97>": "",
"<3,98>": "",
"<3,99>": "",
"<3,100>": "",
"<3,101>": "",
"<3,102>": "",
"<3,103>": "",
"<3,104>": "",
"<3,105>": "",
"<3,106>": "",
"<3,107>": "",
"<3,108>": ""
}
},
"record4": {
"<1>": ""
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -423,7 +423,7 @@
"<1,31>": "",
"<1,32>": "",
"<1,33>": "",
"<1,34>": "",
"<1,34>": "LSL2*IMAGE*ICO*INFINEON",
"<1,35>": "",
"<1,36>": "",
"<1,37>": {

View File

@ -6655,13 +6655,6 @@
"<41,35,3,3>": "",
"<41,35,3,4>": "",
"<41,35,3,5>": ""
},
"<41,35,4>": {
"<41,35,4,1>": "",
"<41,35,4,2>": "",
"<41,35,4,3>": "",
"<41,35,4,4>": "",
"<41,35,4,5>": ""
}
},
"<41,36>": "",
@ -7886,7 +7879,7 @@
"<45,10,2>": "0x200"
},
"<45,11>": {
"<45,11,1>": "0x0",
"<45,11,1>": "0x80000",
"<45,11,2>": "0x80000000"
},
"<45,12>": "45",
@ -7922,7 +7915,7 @@
"<45,21>": "",
"<45,22>": "",
"<45,23>": "WM_OUT",
"<45,24>": "SPECIAL_INST",
"<45,24>": "SPEC_INST",
"<45,25>": "",
"<45,26>": "",
"<45,27>": "",

View File

@ -40,7 +40,7 @@
"<8,2>": {
"<8,2,1>": "MET",
"<8,2,2>": "Metrology",
"<8,2,3>": "TODD_C, JEANNE_M"
"<8,2,3>": "TODD_C, JEANNE_M, JFUENTE1, JUSTIN_H, JONATHON_S, MARROQUINBRA, TIFFANY_M"
},
"<8,3>": {
"<8,3,1>": "MTC",

View File

@ -9,7 +9,7 @@
"<2>": "-1",
"<3>": "-1",
"<4>": "-1",
"<5>": "16777215",
"<5>": "-2",
"<6>": {
"<6,1>": {
"<6,1,1>": "Tahoma",
@ -31,7 +31,7 @@
}
},
"<7>": "REACT_ITEM",
"<8>": "BY @ID",
"<8>": "BY-DSND ENTER_DTM",
"<9>": {
"<9,1>": {
"<9,1,1>": "RI_NO",
@ -120,6 +120,22 @@
"<9,11,4>": "C",
"<9,11,5>": "D4/",
"<9,11,6>": "Retire Dt"
},
"<9,12>": {
"<9,12,1>": "ENTER_DTM",
"<9,12,2>": "14",
"<9,12,3>": "L",
"<9,12,4>": "C",
"<9,12,5>": "DT2/^H",
"<9,12,6>": "Enter Dtm"
},
"<9,13>": {
"<9,13,1>": "CURR_STATUS",
"<9,13,2>": "5",
"<9,13,3>": "L",
"<9,13,4>": "C",
"<9,13,5>": "[CONV_ITEM_CURR_STATUS]",
"<9,13,6>": "Curr Status"
}
},
"<10>": "T",
@ -147,7 +163,17 @@
"<32>": "0",
"<33>": "1",
"<34>": "16777215",
"<35>": "16777215"
"<35>": "16766894",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -9,7 +9,7 @@
"<2>": "-1",
"<3>": "-1",
"<4>": "-1",
"<5>": "16777215",
"<5>": "-2",
"<6>": {
"<6,1>": {
"<6,1,1>": "MS Sans Serif",
@ -91,7 +91,17 @@
"<32>": "0",
"<33>": "1",
"<34>": "16777215",
"<35>": "16777215"
"<35>": "16777215",
"<36>": "",
"<37>": "",
"<38>": "",
"<39>": "",
"<40>": "-2",
"<41>": "1000",
"<42>": "",
"<43>": "",
"<44>": "",
"<45>": ""
}
}
}

View File

@ -235,7 +235,7 @@ Service SendReminders()
IF CLType = 'E' THEN
Desc = CLRec<CALIB_LIST_EQ_DESC$>
SN = CLRec<CALIB_LIST_EQ_SN$>
Loc = CLRec<CALIB_LIST_EQ_LOC$
Loc = CLRec<CALIB_LIST_EQ_LOC$>
NewLine = Desc:' (S/N: ':SN:') located in the ':Loc:' is due for calibration on ':NextCalDt:CRLF$
END
IF CLType = 'S' THEN

View File

@ -51,11 +51,11 @@ RETURN Result
Create:
* * * * * * *
obj_AppWindow('Create')
obj_AppWindow('Create')
Set_Property(@WINDOW,'STATUSLINE',@WINDOW:'.STATUSLINE_FIX')
Set_Property(@WINDOW,'STATUSLINE',@WINDOW:'.STATUSLINE_FIX')
GOSUB Refresh
GOSUB Refresh
RETURN
@ -77,82 +77,85 @@ ReactNoGF:
LUReactor:
* * * * * * *
IF NOT(ASSIGNED(Parm1)) THEN FocusControl = '' ELSE FocusControl = Parm1
IF NOT(ASSIGNED(Parm2)) THEN FocusPos = '' ELSE FocusPos = Parm2
IF NOT(ASSIGNED(Parm1)) THEN FocusControl = '' ELSE FocusControl = Parm1
IF NOT(ASSIGNED(Parm2)) THEN FocusPos = '' ELSE FocusPos = Parm2
Set_Status(0)
Set_Status(0)
TypeOver = ''
TypeOver<PSELECT$> = '2' ;* Multiple Select
TypeOver<PTYPE$> = 'E' ;* Return entire row
TypeOver = ''
TypeOver<PSELECT$> = '2' ;* Multiple Select
TypeOver<PTYPE$> = 'E' ;* Return entire row
ReactData = Popup(@WINDOW,TypeOver,'REACTORS')
ReactData = Popup(@WINDOW,TypeOver,'REACTORS')
IF ReactData = '' THEN RETURN
IF ReactData = '' THEN RETURN
Set_Property(@WINDOW:'.REACT_NO','LIST',ReactData)
Set_Property(@WINDOW:'.REACT_NO','LIST',ReactData)
LineCnt = COUNT(ReactData,@FM) + (ReactData NE '')
ColCnt = 7
LineCnt = COUNT(ReactData,@FM) + (ReactData NE '')
ColCnt = 7
FOR Line = 1 TO LineCnt
FOR Column = 2 TO ColCnt
stat = Send_Message(@WINDOW:'.REACT_NO','COLOR_BY_POS',Column,Line,GREEN$)
NEXT Column
NEXT Line
FOR Line = 1 TO LineCnt
FOR Column = 2 TO ColCnt
stat = Send_Message(@WINDOW:'.REACT_NO','COLOR_BY_POS',Column,Line,GREEN$)
NEXT Column
NEXT Line
RETURN
* * * * * * *
Cancel:
* * * * * * *
End_Dialog(@WINDOW,'')
End_Dialog(@WINDOW,'')
RETURN
* * * * * * *
PostEntries:
* * * * * * *
ReactNos = Get_Property(@WINDOW:'.REACT_NO','ARRAY')<COL$REACT_NO>
Comment = Get_Property(@WINDOW:'.COMMENT','DEFPROP')
ReactNos = Get_Property(@WINDOW:'.REACT_NO','ARRAY')<COL$REACT_NO>
Comment = Get_Property(@WINDOW:'.COMMENT','DEFPROP')
LOOP
TestChar = ReactNos[-1,1]
UNTIL TestChar NE @VM OR ReactNos = ''
ReactNos[-1,1] = ''
REPEAT
LOOP
TestChar = ReactNos[-1,1]
UNTIL TestChar NE @VM OR ReactNos = ''
ReactNos[-1,1] = ''
REPEAT
EventKeys = '' ;* Keys to return to the REACT_EVENT window for a browse of the newly created records
EventKeys = '' ;* Keys to return to the REACT_EVENT window for a browse of the newly created records
IF ReactNos NE '' AND Comment NE '' THEN
IF ReactNos NE '' AND Comment NE '' THEN
EventDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') ;* Same DTM for all new records
EventType = 'PD' ;* Passdown
LoggedBy = @USER4
EventDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') ;* Same DTM for all new records
EventType = 'PD' ;* Passdown
LoggedBy = @USER4
ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '')
ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '')
FOR I = 1 TO ReactCnt
ReactNo = ReactNos<1,I>
CurrMode = XLATE('REACTOR',ReactNo,'CURR_MODE','X')
FOR I = 1 TO ReactCnt
ReactNo = ReactNos<1,I>
CurrMode = XLATE('REACTOR',ReactNo,'CURR_MODE','X')
obj_React_Event('Create',ReactNo:@RM:EventDTM:@RM:EventType:@RM:LoggedBy:@RM:Comment:@RM:@RM:CurrMode)
EventKeys<I> = ReactNo:'*':ICONV(EventDTM,'DT')
NEXT I
obj_React_Event('Create',ReactNo:@RM:EventDTM:@RM:EventType:@RM:LoggedBy:@RM:Comment:@RM:@RM:CurrMode)
END
ErrCode = ''
If Get_Status(ErrCode) then
Msg(@Window, '', 'OK', '', 'Process Error':@FM:'Error posting entries. ':ErrCode)
end else
Set_Property(@Window:'.REACT_NO', 'LIST', '')
Set_Property(@Window:'.COMMENT', 'TEXT', '')
end
End_Dialog(@WINDOW,EventKeys)
EventKeys<I> = ReactNo:'*':ICONV(EventDTM,'DT')
NEXT I
END else
Msg(@Window, '', 'OK', '', 'Process Error':@FM:'React No(s) and Comment must not be null!')
end
RETURN

View File

@ -582,170 +582,130 @@ Refresh:
If @WINDOW EQ 'RDS_UNLOAD' then
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
CtrlName = @WINDOW:'.EDT_QA_MET'
Set_Property(@Window : '.MET_TEST', 'VISIBLE', False$)
Set_Property(CtrlName, 'VISIBLE', True$)
MetList = Get_Property(CtrlName,'LIST')
ThickOutOfSpec = False$
CresOutOfSpec = False$
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
FOR Line = 1 TO MLCnt
IF MetList<Line,COL$UL_MET_TEST> NE '' THEN
MetResult = MetList<Line,COL$UL_MET_RESULT>
MetMin = MetList<Line,COL$UL_MET_MIN>
MetMax = MetList<Line,COL$UL_MET_MAX>
PhaseMin = MetList<Line,COL$UL_MET_PHASE_MIN>
PhaseResult = MetList<Line,COL$UL_MET_PHASE_RESULT>
ScanRecipe = MetList<Line,COL$UL_MET_RECIPE>
PSN = Get_Property(@Window : '.PSN', 'TEXT')
PRSStageKey = PSN:'*UNLOAD'
MetTest = MetList<Line,COL$UL_MET_TEST>
PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey)
SpecTests = PRSStageRec<PRS_STAGE_MET_TEST$>
SpecRecipe = ''
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
QAMetKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', QAMetKey)
DataPoints = WOMatQARec<WO_MAT_QA_DATA_POINTS$, Line>
Begin Case
Case MetTest EQ 'THICK_ONLY'
// Check each point to see if any are out of spec
For each DataPoint in DataPoints using @SVM setting ThickIndex
Until DataPoint EQ ''
Begin Case
Case ThickIndex GT 10
Null
Case (DataPoint EQ '')
ThickOutOfSpec = True$
Case (DataPoint GT MetMax) OR (DataPoint LT MetMin)
ThickOutOfSpec = True$
End Case
Next DataPoint
If (DevelopmentFlag EQ True$) then
Case MetTest EQ 'CRES'
// Check critical points to see if any are out of spec (both HgCV and Phase)
CriticalPoints = '1,2,5,6,9'
For each DataPoint in DataPoints using @SVM setting CresIndex
Until DataPoint EQ ''
HgCVDataPoint = DataPoint[1, 'F':@TM]
PhaseDataPoint = DataPoint[-1, 'B':@TM]
CriticalPoint = Index(CriticalPoints, CresIndex, 1)
Begin Case
Case (HgCVDataPoint EQ '') and CriticalPoint
CresOutOfSpec = True$
Case (PhaseDataPoint EQ '') and CriticalPoint
CresOutOfSpec = True$
Case (HgCVDataPoint GT MetMax) OR (HgCVDataPoint LT MetMin) and CriticalPoint
CresOutOfSpec = True$
Case (PhaseDataPoint LT PhaseMin) and CriticalPoint
CresOutOfSpec = True$
End Case
Next DataPoint
End Case
QAMetOutofSpec = (ThickOutOfSpec or CresOutOfSpec)
Locate MetTest in SpecTests using @VM setting vPos then
SpecRecipe = PRSStageRec<PRS_STAGE_MET_RECIPE$, vPos>
end
NoError = True$
CtrlName = @WINDOW:'.EDT_QA_MET'
Set_Property(@Window : '.MET_TEST', 'VISIBLE', False$)
Set_Property(CtrlName, 'VISIBLE', True$)
MetList = Get_Property(CtrlName,'LIST')
ThickOutOfSpec = False$
CresOutOfSpec = False$
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
FOR Line = 1 TO MLCnt
IF MetList<Line,COL$UL_MET_TEST> NE '' THEN
MetResult = MetList<Line,COL$UL_MET_RESULT>
MetMin = MetList<Line,COL$UL_MET_MIN>
MetMax = MetList<Line,COL$UL_MET_MAX>
PhaseMin = MetList<Line,COL$UL_MET_PHASE_MIN>
PhaseResult = MetList<Line,COL$UL_MET_PHASE_RESULT>
ScanRecipe = MetList<Line,COL$UL_MET_RECIPE>
PSN = Get_Property(@Window : '.PSN', 'TEXT')
PRSStageKey = PSN:'*UNLOAD'
MetTest = MetList<Line,COL$UL_MET_TEST>
PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey)
SpecTests = PRSStageRec<PRS_STAGE_MET_TEST$>
SpecRecipe = ''
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
QAMetKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', QAMetKey)
DataPoints = WOMatQARec<WO_MAT_QA_DATA_POINTS$, Line>
Begin Case
Case MetTest EQ 'THICK_ONLY'
// Check each point to see if any are out of spec
For each DataPoint in DataPoints using @SVM setting ThickIndex
Until DataPoint EQ ''
Begin Case
Case ThickIndex GT 10
Null
Case (DataPoint EQ '')
ThickOutOfSpec = True$
Case (DataPoint GT MetMax) OR (DataPoint LT MetMin)
ThickOutOfSpec = True$
End Case
Next DataPoint
If (MetList<Line,COL$UL_MET_RESULT> EQ '') then
Color = YELLOW$
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
Case MetTest EQ 'CRES'
// Check critical points to see if any are out of spec (both HgCV and Phase)
CriticalPoints = '1,2,5,6,9'
For each DataPoint in DataPoints using @SVM setting CresIndex
Until DataPoint EQ ''
HgCVDataPoint = DataPoint[1, 'F':@TM]
PhaseDataPoint = DataPoint[-1, 'B':@TM]
CriticalPoint = Index(CriticalPoints, CresIndex, 1)
Begin Case
Case (HgCVDataPoint EQ '') and CriticalPoint
CresOutOfSpec = True$
Case (PhaseDataPoint EQ '') and CriticalPoint
CresOutOfSpec = True$
Case (HgCVDataPoint GT MetMax) OR (HgCVDataPoint LT MetMin) and CriticalPoint
CresOutOfSpec = True$
Case (PhaseDataPoint LT PhaseMin) and CriticalPoint
CresOutOfSpec = True$
End Case
Next DataPoint
End Case
QAMetOutofSpec = (ThickOutOfSpec or CresOutOfSpec)
Locate MetTest in SpecTests using @VM setting vPos then
SpecRecipe = PRSStageRec<PRS_STAGE_MET_RECIPE$, vPos>
end
NoError = True$
If QAMetOutofSpec EQ True$ then
Color = BYELLOW$:@FM:BLACK$:@FM:BYELLOW$:@FM:BLACK$
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If (MetList<Line,COL$UL_MET_RESULT> EQ '') then
Color = YELLOW$
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If (MetResult LT MetMin) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If QAMetOutofSpec EQ True$ then
Color = BYELLOW$:@FM:BLACK$:@FM:BYELLOW$:@FM:BLACK$
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If (MetResult GT MetMax) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If (MetResult LT MetMin) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If (PhaseResult LT PhaseMin) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_PHASE_RESULT, Line, Color)
NoError = False$
end
If (MetResult GT MetMax) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
QAFailReason = WOMatQARec<WO_MAT_QA_FAIL_REASON$, Line>
DetectedFail = Index(QAFailReason, 'Number of data points is less than the required amount', 1)
If (ScanRecipe NE SpecRecipe) OR (DetectedFail) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RECIPE, Line, Color)
NoError = False$
end
If (PhaseResult LT PhaseMin) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_PHASE_RESULT, Line, Color)
NoError = False$
end
If (NoError EQ True$) then
Color = GREEN$
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
end
QAFailReason = WOMatQARec<WO_MAT_QA_FAIL_REASON$, Line>
DetectedFail = Index(QAFailReason, 'Number of data points is less than the required amount', 1)
If (ScanRecipe NE SpecRecipe) OR (DetectedFail) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RECIPE, Line, Color)
NoError = False$
end
END ELSE
Color = GREEN$
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
END
If (NoError EQ True$) then
Color = GREEN$
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
end
NEXT Line
END ELSE
Color = GREEN$
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
END
Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton)
NEXT Line
Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton)
IF MemberOf(@USER4, 'OI_ADMIN') THEN
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1)
END ELSE
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0)
END
end else
CtrlName = @WINDOW:'.MET_TEST'
Set_Property(@Window : '.EDT_QA_MET', 'VISIBLE', False$)
Set_Property(CtrlName, 'VISIBLE', True$)
MetList = Get_Property(CtrlName,'LIST')
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
FOR Line = 1 TO MLCnt
IF MetList<Line,COL$MET_TEST> NE '' THEN
BEGIN CASE
CASE MetList<Line,COL$MET_RESULT> = ''
Color = YELLOW$
CASE MetList<Line,COL$MET_RESULT> < MetList<Line,COL$MET_MIN> OR MetList<Line,COL$MET_RESULT> > MetList<Line,COL$MET_MAX>
Color = RED$
CASE 1
Color = GREEN$
END CASE
END ELSE
Color = GREEN$
END;* End of check for Met Test on the current line
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
NEXT Line
Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton)
IF MemberOf(@USER4, 'OI_ADMIN') THEN
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1)
END ELSE
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0)
END
end
end
IF MemberOf(@USER4, 'OI_ADMIN') THEN
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1)
END ELSE
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0)
END
end
* End of check for Unload OR Post_Epi windows
****************************************************************************************************************************************
@ -2669,9 +2629,8 @@ MetTestDC:
Lines = Get_Property(@WINDOW:'.MET_TEST', 'LIST')
TestLine = Lines<CurrRow>
LWRHOTest = Indexc(TestLine, 'LW_RHO', 1)
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
If (DevelopmentFlag EQ True$) and (@Window EQ 'RDS_UNLOAD') and (LWRHOTest EQ False$) then
If (@Window EQ 'RDS_UNLOAD') and (LWRHOTest EQ False$) then
Ctrls := @WINDOW:'.EDT_QA_MET':@RM ; Props := 'SELPOS':@RM
Ctrls := @WINDOW:'.EDT_QA_MET' ; Props := 'LIST'
end else
@ -2708,8 +2667,7 @@ MetTestDC:
BEGIN CASE
CASE MetTest EQ ''
Null
CASE (@WINDOW = 'RDS_UNLOAD') and (DevelopmentFlag EQ True$) and (LWRHOTest EQ False$)
CASE (@WINDOW = 'RDS_UNLOAD') and (LWRHOTest EQ False$)
ReturnVal = Dialog_Box('NDW_QA_MET_RESULT', @WINDOW, CassID)
Send_Event(@Window, "READ")
CASE Otherwise$
@ -2863,57 +2821,47 @@ return
RefreshWaferCounterData:
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
If WCCheckEnabled then
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
QtyBackColor = GREEN$
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
If RDSNo NE '' then
FqaWcRec = Wafer_Counter_Services('GetLastScan', RDSNo, 'QA')
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
QtyBackColor = GREEN$
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
If RDSNo NE '' then
FqaWcRec = Wafer_Counter_Services('GetLastScan', RDSNo, 'QA')
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
*****************************************
* WaferCounter - Wafers Quantity Section *
*****************************************
If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$
end else
QtyBackColor = ORANGE$
end
*****************************************
* WaferCounter - Wafers Quantity Section *
*****************************************
If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$
end else
QtyBackColor = ORANGE$
end
WaferSize = Xlate('RDS', RDSNo, 'WAFER_SIZE', 'X')
WaferSize = Field(WaferSize, ' ', 3, 1)
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
If Error_Services('NoError') then
WCCurrMode = ''
If RowExists('TOOL', WCToolID) then
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
end else
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
end
WaferSize = Xlate('RDS', RDSNo, 'WAFER_SIZE', 'X')
WaferSize = Field(WaferSize, ' ', 3, 1)
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
If Error_Services('NoError') then
WCCurrMode = ''
If RowExists('TOOL', WCToolID) then
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
end else
ErrMsg(Error_Services('GetMessage'))
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
end
end else
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for RDS "':RDSNo:'".')
ErrMsg(Error_Services('GetMessage'))
end
end else
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for RDS "':RDSNo:'".')
end
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
end else
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
end
end
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
return

View File

@ -20,7 +20,7 @@ Declare Function Get_Property, Get_Status, Dialog_Box, Utility, Popup, Collect.I
Declare Function Send_Message, Msg, Security_Check, obj_React_Item, Select_Into, MemberOf, Create_Dialog, obj_Calendar
Declare Function GetAsyncKeyState, obj_Tables, MemberOf, Environment_Services, Database_Services, Rds_Services
Declare Function Reactor_Services, Error_Services, React_Servs_Services, Reactor_Log_Services, Send_Event, SRP_List
Declare Function Nica_Orders_Services
Declare Function Nica_Orders_Services, SRP_Date, React_Item_Services, SRP_Datetime, Datetime
$Insert MSG_EQUATES
$Insert APPCOLORS
@ -1229,64 +1229,51 @@ SvcsOptions:
If ItemType NE '' then
RetVal = ''
ItemType = ICONV(ItemType,'[CONV_CODE_DESC,REACT_ITEM_TYPE]')
OPEN 'DICT.REACT_ITEM' to DictReactItem else
ErrMsg('Unable to open DICT.REACT_ITEM')
return
end
RIKeys = React_Item_Services('GetReactItems', ItemType, 'N,U')
SearchString = 'RI_TYPE':@VM:ItemType:@FM
SearchString := 'CURR_STATUS':@VM:'N':@VM:'U':@FM
If Error_Services('NoError') then
RIKeys = ''
Option = ''
Flag = ''
TypeOver = ''
TypeOVer<PMODE$> = 'K'
TypeOver<PDISPLAY$> = RIKeys
RetVal = Popup(@Window,TypeOver,'REACT_ITEM')
Btree.Extract(SearchString,'REACT_ITEM',DictReactItem,RIKeys,Option,Flag)
If Get_Status(errCode) then
ErrMsg(errCode)
return
end
If RetVal NE '' then
obj_AppWindow('LUValReturn',RetVal:@RM:@Window:'.SERV_INFO':@RM:SelPos)
TypeOver = ''
TypeOVer<PMODE$> = 'K'
TypeOver<PDISPLAY$> = RIKeys
RetVal = Popup(@Window,TypeOver,'REACT_ITEM')
RIRec = XLATE('REACT_ITEM',RetVal,'','X')
If RetVal NE '' then
obj_AppWindow('LUValReturn',RetVal:@RM:@Window:'.SERV_INFO':@RM:SelPos)
If RIRec<REACT_ITEM_RI_TYPE$> = 'T' then
CardWindow = 'REACT_ITEM'
CardKey = RetVal
DefaultRec = ''
NewCardCtrl = ''
RecalcCtrl = @Window:'.SERV_INFO'
RecalcPos = SelPos
RetCtrl = @Window:'.SERV_INFO'
RetPos = SelPos
RIRec = XLATE('REACT_ITEM',RetVal,'','X')
oAParms = CardWindow:@RM:CardKey:@RM:DefaultRec:@RM:NewCardCtrl:@RM:RecalcCtrl:@RM:RecalcPos:@RM:RetCtrl:@RM:RetPos
If RIRec<REACT_ITEM_RI_TYPE$> = 'T' then
CardWindow = 'REACT_ITEM'
CardKey = RetVal
DefaultRec = ''
NewCardCtrl = ''
RecalcCtrl = @Window:'.SERV_INFO'
RecalcPos = SelPos
RetCtrl = @Window:'.SERV_INFO'
RetPos = SelPos
obj_AppWindow('ViewNewCard',oAParms)
oAParms = CardWindow:@RM:CardKey:@RM:DefaultRec:@RM:NewCardCtrl:@RM:RecalcCtrl:@RM:RecalcPos:@RM:RetCtrl:@RM:RetPos
Set_Property('REACT_ITEM.TUBE_GRADE','FOCUS',1)
obj_AppWindow('ViewNewCard',oAParms)
If Get_Status(errCode) then
ErrMsg(errCode)
end
end
Set_Property('REACT_ITEM.TUBE_GRADE','FOCUS',1)
If Get_Status(errCode) then
ErrMsg(errCode)
end
end
GoSub Refresh
GoSub Refresh
end
end else
Error_Services('DisplayError')
end
end ;* End of check for null SNReq
End Case
GoSub Refresh
@ -1877,4 +1864,3 @@ ColorRemRiTable:
return

View File

@ -1099,7 +1099,7 @@ SignSupVer:
************************************************************************
WMOKey = Get_Property(@WINDOW,'ID')
PSNo = Get_Property(@WINDOW:'.PS_NO)','TEXT')
VerInst = XLATE('PRS_STAGE',PSNo:'*QA',PRS_STAGE_INST$,'X')
VerInst = XLATE('PRS_STAGE',PSNo:'*MO_QA',PRS_STAGE_INST$,'X')
IF (VerInst NE '') THEN
Yes = Dialog_Box( 'RDS_VER', @WINDOW, VerInst )
IF NOT(Yes) THEN
@ -1107,29 +1107,25 @@ SignSupVer:
END
END
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
If WCCheckEnabled then
****************************************
* Verify the Wafer Counter information *
****************************************
****************************************
* Verify the Wafer Counter information *
****************************************
WafersOut = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
WafersOut = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
************************************
* Wafer Counter - Quantity Section *
************************************
If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersOut) then
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Filled quantities do not match.')
RETURN 0
end
end else
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
RETURN 0
end
end
************************************
* Wafer Counter - Quantity Section *
************************************
If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersOut) then
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Filled quantities do not match.')
RETURN 0
end
end else
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
RETURN 0
end
**************************
* Verify user's password *
@ -1711,129 +1707,142 @@ AddMakeup:
END
NEXT I
Response = Dialog_Box('NDW_MAKEUP_WAFERS', @Window, WOMatKey)
Continue = True$
ShowSpecInst = Xlate('PROD_SPEC', PSNo, PROD_SPEC_SHOW_SPEC_INST_ON_MU_ADD$, 'X')
If ShowSpecInst then
SpecInst = Xlate('PROD_SPEC', PSNo, PROD_SPEC_SPEC_INST$, 'X')
If SpecInst NE '' then
Continue = Dialog_Box('NDW_ACKNOWLEDGE_MESSAGE', @Window, SpecInst)
If Not(Continue) then
Msg(@Window, '', 'OK', '', 'Process Error':@FM:'This PSN requires you to acknowledge special instructions to add makeup wafers.')
end
end
end
Begin Case
Case Response EQ True$
// User requested to convert the current cassette into a makeup box.
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
If Error_Services('NoError') then
SAPBatchNo = WOMatRec<WO_MAT_SAP_BATCH_NO$>
SAPTXDtm = WOMatRec<WO_MAT_SAP_TX_DTM$>
AwaitingBatchNo = ( (SAPTXDtm NE '') and (SAPBatchNo EQ '') )
HasBatchNo = (SAPBatchNo NE '')
FullBoxReject = (SAPBatchNo[-1, 1] = 'R')
Begin Case
Case AwaitingBatchNo
InvalidRequest = True$
ErrMsg('WARNING: Cassette ineligible to be converted as it is awaiting a batch number from SAP.')
Return
Case FullBoxReject
InvalidRequest = True$
ErrMsg('WARNING: Cassette is ineligible to be converted as it is a full box reject.')
Return
Case HasBatchNo
// Operation limited to LEAD and SUPERVISOR groups
OverrideMsg = "Cassette has a batch number. SUPERVISOR or LEAD must override."
Response = Msg(@Window, '', 'OVERRIDE', '', OverrideMsg)
Begin Case
Case Response EQ 1
Response = True$ ; // User Clicked Override
Case Response EQ 2
Response = False$ ; // User Clicked Cancel
Case Response EQ char(27)
Response = False$ ; // User Pressed Escape Key
End Case
If Response EQ True$ then
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:'LEAD':@VM:'SUPERVISOR')
Authorized = Response<1>
end else
Authorized = False$
end
If Not(Authorized) then Return
Case Otherwise$
Null
End Case
AvailMU_WMOKeys = ''
UserResp = Response
MakeupBox = ''
If Continue then
Response = Dialog_Box('NDW_MAKEUP_WAFERS', @Window, WOMatKey)
Begin Case
Case Response EQ True$
// User requested to convert the current cassette into a makeup box.
// Verify the quantity before proceeding.
If WMOutKey NE '' then
Parms = ''
Parms<1> = WMOutKey ; // Cassette to verify wafer count of.
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed NE True$ then Return
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
If Error_Services('NoError') then
SAPBatchNo = WOMatRec<WO_MAT_SAP_BATCH_NO$>
SAPTXDtm = WOMatRec<WO_MAT_SAP_TX_DTM$>
AwaitingBatchNo = ( (SAPTXDtm NE '') and (SAPBatchNo EQ '') )
HasBatchNo = (SAPBatchNo NE '')
FullBoxReject = (SAPBatchNo[-1, 1] = 'R')
Begin Case
Case AwaitingBatchNo
InvalidRequest = True$
ErrMsg('WARNING: Cassette ineligible to be converted as it is awaiting a batch number from SAP.')
Return
Case FullBoxReject
InvalidRequest = True$
ErrMsg('WARNING: Cassette is ineligible to be converted as it is a full box reject.')
Return
Case HasBatchNo
// Operation limited to LEAD and SUPERVISOR groups
OverrideMsg = "Cassette has a batch number. SUPERVISOR or LEAD must override."
Response = Msg(@Window, '', 'OVERRIDE', '', OverrideMsg)
Begin Case
Case Response EQ 1
Response = True$ ; // User Clicked Override
Case Response EQ 2
Response = False$ ; // User Clicked Cancel
Case Response EQ char(27)
Response = False$ ; // User Pressed Escape Key
End Case
If Response EQ True$ then
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:'LEAD':@VM:'SUPERVISOR')
Authorized = Response<1>
end else
Authorized = False$
end
If Not(Authorized) then Return
Case Otherwise$
Null
End Case
AvailMU_WMOKeys = ''
UserResp = Response
MakeupBox = ''
// User requested to convert the current cassette into a makeup box.
// Verify the quantity before proceeding.
If WMOutKey NE '' then
Parms = ''
Parms<1> = WMOutKey ; // Cassette to verify wafer count of.
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box.
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed NE True$ then Return
end else
ErrMsg('Error starting wafer counter check. WM_OUT key is missing.')
end
CheckValue = 1
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) ;* Set WMO_MAKEUP flag on WM_OUT
IF Get_Status(errCode) THEN ErrMsg(errCode)
Set_Property(@WINDOW:'.MAKEUP_BOX','DEFPROP',CheckValue) ;* Make this the makeup box
Send_Event(@WINDOW,'WRITE') ;* Write the record
WMOKey = WONo:'*':ProcStepNo:'*':CassNo
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:WMOKey) ;* Reread the updated record
Return
end else
ErrMsg('Error starting wafer counter check. WM_OUT key is missing.')
ErrMsg('WARNING: Error reading WO_MAT record.')
Return
end
Case Response EQ ''
// User has cancelled this process.
Return
Case Otherwise$
// User has selected a makeup box to use and backfill.
AvailMU_WMOKeys = Response
MakeupBox = Response
MuWfrsNeeded = SelCnt
If AvailMU_WMOKeys NE '' then
// Wafer counter check - Account for the possibility of selecting more than one makeup box.
For each MuWmoKey in AvailMU_WMOKeys using @FM
MuWoMatKey = Field(MuWmoKey, '*', 1):'*':Field(MuWmoKey, '*', 3)
QtyAdj = MuWfrsNeeded
CurrMuWfrCnt = obj_WO_Mat('CurrWaferCnt', MuWoMatKey)
If MuWfrsNeeded GT CurrMuWfrCnt then
QtyAdj = CurrMuWfrCnt
MuWfrsNeeded -= CurrMuWfrCnt
end
Parms = ''
Parms<1> = MuWmoKey ; // Cassette to verify wafer count of.
Parms<2> = QtyAdj ; // Wafer count adjustment - 0 because converting box.
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed NE True$ then Return
Next MuWmoKey
end
CheckValue = 1
* Signature block added 10/6/2010 JCH *
Valid = Dialog_Box('NDW_VERIFY_USER', @Window, @User4)
FieldNo = WO_MAT_EPO_MAKEUP_BOX$
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) ;* Set WMO_MAKEUP flag on WM_OUT
IF Get_Status(errCode) THEN ErrMsg(errCode)
IF NOT(Valid) THEN RETURN ;* User is not worthy or can't type
Set_Property(@WINDOW:'.MAKEUP_BOX','DEFPROP',CheckValue) ;* Make this the makeup box
Send_Event(@WINDOW,'WRITE') ;* Write the record
Send_Event(@WINDOW,'WRITE')
WMOKey = WONo:'*':ProcStepNo:'*':CassNo
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:WMOKey) ;* Reread the updated record
Return
end else
ErrMsg('WARNING: Error reading WO_MAT record.')
Return
end
Case Response EQ ''
// User has cancelled this process.
Return
Case Otherwise$
// User has selected a makeup box to use and backfill.
AvailMU_WMOKeys = Response
MakeupBox = Response
MuWfrsNeeded = SelCnt
If AvailMU_WMOKeys NE '' then
// Wafer counter check - Account for the possibility of selecting more than one makeup box.
For each MuWmoKey in AvailMU_WMOKeys using @FM
MuWoMatKey = Field(MuWmoKey, '*', 1):'*':Field(MuWmoKey, '*', 3)
QtyAdj = MuWfrsNeeded
CurrMuWfrCnt = obj_WO_Mat('CurrWaferCnt', MuWoMatKey)
If MuWfrsNeeded GT CurrMuWfrCnt then
QtyAdj = CurrMuWfrCnt
MuWfrsNeeded -= CurrMuWfrCnt
end
Parms = ''
Parms<1> = MuWmoKey ; // Cassette to verify wafer count of.
Parms<2> = QtyAdj ; // Wafer count adjustment - 0 because converting box.
Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed NE True$ then Return
Next MuWmoKey
end
* Signature block added 10/6/2010 JCH *
Valid = Dialog_Box('NDW_VERIFY_USER', @Window, @User4)
IF NOT(Valid) THEN RETURN ;* User is not worthy or can't type
Send_Event(@WINDOW,'WRITE')
obj_WM_Out('AddMakeupWafers',WMOutKey:@RM:EmptySlots:@RM:MakeupBox)
//Remove the signatures for the WO_MAT_QA record because they are changing its results.
WOMatQaKey = Field(WMOutKey, '*', 1) : '*' : Field(WMOutKey, '*', 3)
Wo_Mat_Qa_Services('ClearSignatureByStage', WOMatQaKey, 'MO_QA')
obj_Appwindow('LoadFormKeys',@WINDOW:@RM:WMOutKey)
RETURN
End Case
obj_WM_Out('AddMakeupWafers',WMOutKey:@RM:EmptySlots:@RM:MakeupBox)
//Remove the signatures for the WO_MAT_QA record because they are changing its results.
WOMatQaKey = Field(WMOutKey, '*', 1) : '*' : Field(WMOutKey, '*', 3)
Wo_Mat_Qa_Services('ClearSignatureByStage', WOMatQaKey, 'MO_QA')
obj_Appwindow('LoadFormKeys',@WINDOW:@RM:WMOutKey)
RETURN
End Case
end
end else
// Cassette is on hold so makeup wafers cannot be added.
ErrorMessage = 'Add MU Wafer Denied!. The cassette must be taken off hold before adding makeup wafers.'
@ -2281,57 +2290,49 @@ return
RefreshWaferCounterData:
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
If WCCheckEnabled then
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
QtyBackColor = GREEN$
WONo = Get_Property(@Window : '.WO_NO', 'TEXT')
Cassette = Get_Property(@Window : '.OUT_CASS_NO', 'TEXT')
WMOKey = WONo:'*1*':Cassette
If WMOKey NE '*1*' then
FqaWcRec = Wafer_Counter_Services('GetLastScan', WMOKey, 'QA')
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
WafersFilled = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
QtyBackColor = GREEN$
WONo = Get_Property(@Window : '.WO_NO', 'TEXT')
Cassette = Get_Property(@Window : '.OUT_CASS_NO', 'TEXT')
WMOKey = WONo:'*1*':Cassette
If WMOKey NE '*1*' then
FqaWcRec = Wafer_Counter_Services('GetLastScan', WMOKey, 'QA')
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
WafersFilled = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
************************************
* Wafer Counter - Quantity Section *
************************************
If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersFilled) then QtyBackColor = RED$
end else
QtyBackColor = ORANGE$
end
WaferSize = Xlate('WM_OUT', WMOKey, 'WAFER_SIZE', 'X')
WaferSize = Field(WaferSize, ' ', 3, 1)
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
If Error_Services('NoError') then
WCCurrMode = ''
If RowExists('TOOL', WCToolID) then
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
end else
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
end
************************************
* Wafer Counter - Quantity Section *
************************************
If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersFilled) then QtyBackColor = RED$
end else
QtyBackColor = ORANGE$
end
WaferSize = Xlate('WM_OUT', WMOKey, 'WAFER_SIZE', 'X')
WaferSize = Field(WaferSize, ' ', 3, 1)
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
If Error_Services('NoError') then
WCCurrMode = ''
If RowExists('TOOL', WCToolID) then
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
end else
ErrMsg(Error_Services('GetMessage'))
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
end
end else
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for WMO "':WMOKey:'".')
ErrMsg(Error_Services('GetMessage'))
end
end
end else
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for WMO "':WMOKey:'".')
end
end
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
end else
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
end
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
return

View File

@ -881,24 +881,19 @@ Event SIGN_BUTTON.CLICK()
******************************************
* Verify Unload Stage QA Metrology Tests *
******************************************
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
If (DevelopmentFlag EQ True$) then
WOMatQAKey = WONo : '*' : CassNo
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
OutOfSpec = Sum(OutOfSpec)
If OutOfSpec GT 0 then
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
ErrorMsg = 'Process Error':@SVM
For each FailReason in FailReasons using @VM
ErrorMsg := FailReason:CRLF$
Next FailReason
ErrMsg(ErrorMsg)
Return
end
end
WOMatQAKey = WONo : '*' : CassNo
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
OutOfSpec = Sum(OutOfSpec)
If OutOfSpec GT 0 then
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
ErrorMsg = 'Process Error':@SVM
For each FailReason in FailReasons using @VM
ErrorMsg := FailReason:CRLF$
Next FailReason
ErrMsg(ErrorMsg)
Return
end
*******************************************
* Verify if all steps have been completed *
@ -1965,7 +1960,3 @@ ClearForm:
return

View File

@ -440,7 +440,7 @@ END
IF CurrStatus NE '' THEN
SWAP @VM WITH '" "' IN CurrStatus
IF SelectSent NE '' THEN SelectSent := ' AND'
SelectSent := ' WITH CURR_STATUS ':QUOTE(CurrStatus)
SelectSent := ' WITH CURR_STATUS_STATIC ':QUOTE(CurrStatus)
END
IF PartTypes NE '' THEN
@ -471,7 +471,7 @@ SelectSent = 'SELECT REACT_ITEM ':SelectSent
Def = ""
Def<MTEXT$> = "Selecting Reactor Events..."
Def<MTEXT$> = "Selecting Reactor Items..."
Def<MTYPE$> = "U"
* display the processing message and do the processing
@ -502,6 +502,3 @@ End_Dialog(@WINDOW,RINos)
RETURN

View File

@ -259,7 +259,7 @@ end service
//----------------------------------------------------------------------------------------------------------------------
Service GetWaferMapProductionPath()
ProductionPath = '\\mesfs.infineon.com\EC_Metrology_Si\MetrologyAttachments\TencorRunData'
ProductionPath = '\\mesfs.infineon.com\EC_Metrology_Si\MetrologyAttachments\TencorRunData_'
Response = ProductionPath
end service

View File

@ -2,9 +2,9 @@ Compile function Lot_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
Declare function TEST_WAFER_PROD_SERVICES, SRP_Datetime, Datetime, Database_Services, Lot_Services, Error_Services, RTI_CREATEGUID
Declare function SRP_Array, SRP_Json, Environment_Services, Logging_Services, MemberOf, Lot_Event_Services
Declare function SRP_Array, SRP_Json, Environment_Services, Logging_Services, MemberOf, Lot_Event_Services, GetTickCount
Declare subroutine Database_Services, Btree.Extract, Lot_Services, Error_Services, Labeling_Services, SRP_Json, Logging_Services
Declare subroutine SRP_Run_Command, Service_Services, obj_notes, Lot_Event_Services
Declare subroutine SRP_Run_Command, Service_Services, obj_notes, Lot_Event_Services, Mona_Services
$insert APP_INSERTS
$Insert LOT_EQUATES
$Insert TEST_WAFER_PROD_EQUATES
@ -38,6 +38,13 @@ objLotClosureLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',',
Options EVENT_TYPES = 'MOVE_IN', 'MOVE_OUT', 'HOLD_ON', 'HOLD_OFF', 'REDUCE_WAFER_QTY', 'BONUS_WAFER_QTY', 'COMMENT', 'LOCATION', 'LOAD', 'UNSIGN_LOAD', 'TW_USE', 'CLOSE'
Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN', 'WO_MAT', 'LOT'
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_LOTSERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_LOTSERVICES'
end
GoToService
Return Response or ""
@ -113,6 +120,9 @@ Service GenerateNewLotId(LotType)
end service
Service GetLotIdByLegacyLotIdAndType(LegacyLotId, LegacyLotType)
StartTick = GetTickCount()
MetricName = 'GetLotIdByLegacyLotIdAndType'
Open 'DICT.LOT' to DictLot then
SearchString = ''
@ -130,10 +140,16 @@ Service GetLotIdByLegacyLotIdAndType(LegacyLotId, LegacyLotType)
end else
ErrorMsg = 'Error in ':Service:' service. Error opening LOT dictionary.'
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, VendorCode, Username, PrinterID, LotId)
StartTick = GetTickCount()
MetricName = 'CreateNewLot'
CreatedLotNumber = ''
ErrorMessage = ''
Begin Case
@ -279,6 +295,8 @@ Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, Vendo
end
Response = CreatedLotNumber
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
End Service
@ -484,6 +502,9 @@ end service
//Returns a @FM delimited list of operations in sequence
Service GetLotOperationSequence(LotId)
StartTick = GetTickCount()
MetricName = 'GetLotOperationSequence'
LotOperationsInSequence = ''
If LotID NE '' then
//Get Operations
@ -496,9 +517,15 @@ Service GetLotOperationSequence(LotId)
//error: lot id was null
end
Response = LotOperationsInSequence
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service GetLotCurrOperationId(LotId)
StartTick = GetTickCount()
MetricName = 'GetLotCurrOperationId'
CurrOperation = ''
If LotID NE '' then
//Get them in sequence first
@ -515,9 +542,15 @@ Service GetLotCurrOperationId(LotId)
//error: lot id was null
end
Response = CurrOperation
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service GetLotCurrOperationName(LotId)
StartTick = GetTickCount()
MetricName = 'GetLotCurrOperationName'
CurrOperationId = ''
CurrOperationName = ''
If LotID NE '' then
@ -536,6 +569,9 @@ Service GetLotCurrOperationName(LotId)
//error: lot id was null
end
Response = CurrOperationName
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service AddLotOperationIntoSequence(LotId, NewOperationId, NewSequence, Rework)
@ -591,6 +627,9 @@ Service AddLotOperationIntoSequence(LotId, NewOperationId, NewSequence, Rework)
end service
Service IsLotMovedIn(LotId)
StartTick = GetTickCount()
MetricName = 'IsLotMovedIn'
Response = ''
If RowExists('LOT', LotId) then
CurrOperId = Lot_Services('GetLotCurrOperationId', LotId)
@ -601,6 +640,9 @@ Service IsLotMovedIn(LotId)
Response = False$
end
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service IsOperationCompleted(LotOperationId)
@ -619,6 +661,8 @@ Service IsOperationCompleted(LotOperationId)
end service
Service MoveInLot(LotID, Operator)
StartTick = GetTickCount()
MetricName = 'MoveInLot'
ErrorMessage = ''
ThisLotCurrOperationID = ''
@ -667,9 +711,15 @@ Service MoveInLot(LotID, Operator)
Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage)
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service MoveOutLot(LotID, Operator)
StartTick = GetTickCount()
MetricName = 'MoveOutLot'
ErrorMessage = ''
ThisLotCurrOperationID = ''
If LotId NE '' then
@ -729,6 +779,9 @@ Service MoveOutLot(LotID, Operator)
Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage)
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service ConvertLotRecordToJson(LotId, ItemURL, CurrUser, FullObject=BOOLEAN)
@ -855,6 +908,9 @@ Service ConvertLotRecordToJson(LotId, ItemURL, CurrUser, FullObject=BOOLEAN)
end service
Service OpenLot(LotId)
StartTick = GetTickCount()
MetricName = 'OpenLot'
ErrorMessage = ''
If RowExists('LOT', LotId) then
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
@ -871,9 +927,15 @@ Service OpenLot(LotId)
If ErrorMessage NE '' then
Error_Services('Add', ErrorMessage)
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service CloseLot(LotId)
StartTick = GetTickCount()
MetricName = 'CloseLot'
ErrorMessage = ''
If RowExists('LOT', LotId) then
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
@ -890,6 +952,9 @@ Service CloseLot(LotId)
If ErrorMessage NE '' then
Error_Services('Add', ErrorMessage)
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service AutoCloseTestWaferLot(LotId, CloseUserId)
@ -989,15 +1054,26 @@ Service AutoCloseTestWaferLot(LotId, CloseUserId)
end service
Service HoldLot(LotId, OperatorId)
StartTick = GetTickCount()
MetricName = 'HoldLot'
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service UnholdLot(LotId, OperatorId)
StartTick = GetTickCount()
MetricName = 'UnholdLot'
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service ReduceLotWaferCount(LotId, ReductionQty, OperatorId)
StartTick = GetTickCount()
MetricName = 'ReduceLotWaferCount'
ErrorMessage = ''
If RowExists('LOT', LotId) then
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
@ -1043,9 +1119,15 @@ Service ReduceLotWaferCount(LotId, ReductionQty, OperatorId)
if ErrorMessage NE '' then
Error_Services('Add', ErrorMessage)
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service IncreaseLotWaferCount(LotId, IncreaseQty, OperatorId)
StartTick = GetTickCount()
MetricName = 'IncreaseLotWaferCount'
ErrorMessage = ''
If RowExists('LOT', LotId) then
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
@ -1087,6 +1169,8 @@ Service IncreaseLotWaferCount(LotId, IncreaseQty, OperatorId)
Error_Services('Add', ErrorMessage)
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service OpenOIWizardCreateTWLotInBrowser()
@ -1095,6 +1179,9 @@ Service OpenOIWizardCreateTWLotInBrowser()
end service
Service CreateNewVoidedLotRecord(LotId, LegacyLotId, LotType=LOT_TYPES, Username)
StartTick = GetTickCount()
MetricName = 'CreateNewVoidedLotRecord'
ErrorMessage = ''
If RowExists('LSL_USERS', Username) then
If LotType NE '' then
@ -1165,15 +1252,8 @@ Service CreateNewVoidedLotRecord(LotId, LegacyLotId, LotType=LOT_TYPES, Username
If ErrorMessage NE '' then
//Todo Log Error Message
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service

File diff suppressed because it is too large Load Diff

View File

@ -18,7 +18,7 @@ Parm3:
-For Metric updates this represents the numeric data that you wish to send.
***************************************************************/
Declare Subroutine Errmsg, Error_Services, Delay, Mona_Services
Declare Subroutine Errmsg, Error_Services, Delay, Mona_Services, Service_Services
Declare function Get_Status, SRP_Datetime, Environment_Services, Httpclient_Services
#pragma precomp SRP_PreCompiler
@ -44,17 +44,31 @@ Options STATES = 'OK', 'WARNING', 'CRITICAL'
Service SendStatus(MonitorName=MONITORS, StatusName, CurrentState=STATES)
Mona_Services("SendBufferedStatus", MonitorName, StatusName, CurrentState)
Mona_Services("PostStatus", MonitorName, StatusName, CurrentState)
end service
Service PostStatus(MonitorName, StatusName, CurrentState=STATES)
Service_Services('PostProcedure', 'MONA_SERVICES', 'SendBufferedStatus':@VM:MonitorName:@VM:StatusName:@VM:CurrentState)
end service
Service SendMetric(MonitorName=MONITORS, MetricName, Number)
Mona_Services("SendBufferedAverageMetric", MonitorName, MetricName, Number)
Mona_Services("PostAverageMetric", MonitorName, MetricName, Number)
end Service
Service PostAverageMetric(MonitorName, MetricName, Number)
Service_Services('PostProcedure', 'MONA_SERVICES', 'SendBufferedAverageMetric':@VM:MonitorName:@VM:MetricName:@VM:Number)
end service
Service SendCountMetric(MonitorName=MONITORS, MetricName, Number)
Mona_Services("PostCountMetric", MonitorName, MetricName, Number)
end Service
Service PostCountMetric(MonitorName, MetricName, Number)
Service_Services('PostProcedure', 'MONA_SERVICES', 'SendBufferedCountMetric':@VM:MonitorName:@VM:MetricName:@VM:Number)
end service
Service SendBufferedStatus(MonaResource, StatusName, StatusValue)
@ -172,6 +186,67 @@ Service SendBufferedAverageMetric(MonaResource, MetricName, MetricValue)
end service
Service SendBufferedCountMetric(MonaResource, MetricName, MetricValue)
If MonaResource EQ '' then
MonaResource = Environment_Services("GetMonaResource")
end
DateTime = SRP_DateTime('Now')
Year = SRP_Datetime("Year", DateTime)
Month = SRP_Datetime("Month", DateTime)
If Len(Month) EQ 1 then
Month = '0':Month
end
Day = SRP_Datetime("Day", DateTime)
If Len(Day) EQ 1 then
Day = '0':Day
end
Hour = SRP_Datetime("Hour", DateTime)
If Len(Hour) EQ 1 then
Hour = '0':Hour
end
Minute = SRP_Datetime("Minute", DateTime)
If Len(Minute) EQ 1 then
Minute = '0':Minute
end
Second = SRP_Datetime("Second", DateTime)
If Len(Second) EQ 1 then
Second = '0':Second
end
RequestBodyJson = '{ "resource": "':MonaResource:'"'
RequestBodyJson = RequestBodyJson:', "dateTime": "':Year:'-':Month:'-':Day:'T':Hour:':':Minute:':':Second:'Z"'
RequestBodyJson = RequestBodyJson:', "metricName": "':MetricName:'"'
RequestBodyJson = RequestBodyJson:', "metricValue": "':MetricValue:'" }'
ApiUrl = Environment_Services("GetMonInBufferedWorkerApiUrl"):'/count'
retries = 3
backoffSeconds = 1
isSuccessful = False$
Loop
while (isSuccessful EQ False$ and retries GT 0)
waitSeconds = (3 - retries) * backoffSeconds
Delay(waitSeconds)
retries = retries - 1
response = Httpclient_Services('SendHTTPRequest', 'POST', ApiUrl, 'Content-Type':@VM:'application/json':@FM:'Accept':@VM:'*/*', RequestBodyJson, '', '', False$, False$, '')
If response EQ '"Request queued for processing"' then
isSuccessful = True$
end
Repeat
end service
Service QueueLatencyAndCountMetrics(MonaResource, MetricName, StartTick, EndTick)
Diff = EndTick - StartTick
Mona_Services('SendMetric', MonaResource, MetricName:'_LATENCY', Diff)
Mona_Services('SendCountMetric', MonaResource, MetricName:'_COUNT', 1)
end service
SwapResourceNames:
@ -195,3 +270,4 @@ SwapResourceNames:
return

View File

@ -0,0 +1,99 @@
Compile function NDW_ACKNOWLEDGE_MESSAGE_EVENTS(CtrlEntId, Event, @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.
Name : NDW_ACKNOWLEDGE_MESSAGE_EVENTS
Description : This function acts as a commuter module for all events related to this window.
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
execute Basic+ logic without having use the Form Designer to make the association, although this is
limited to the events which are currently promoted.
If the form needs to call the commuter module directly then the QuickEvent parameters should be
formatted like this:
'@SELF','@EVENT',['@PARAM1','@PARAMx']
Parameters :
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
Param1-15 [in] -- Additional event parameter holders
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
EVENT_SETUP insert
History : (Date, Initials, Notes)
05/23/25 djs Created initial commuter module.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
#window NDW_ACKNOWLEDGE_MESSAGE
$Insert APP_INSERTS
$Insert EVENT_SETUP
Declare subroutine PlaceDialog
SubclassInfo = Form_Services('FindSubclassControl')
Subclass = SubclassInfo<1>
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
If Event EQ 'OLE' then
Transfer Event to OIEvent
Transfer Param1 to Event
Transfer Param2 to Param1
Transfer Param3 to Param2
Transfer Param4 to Param3
Transfer Param5 to Param4
Transfer Param6 to Param5
Transfer Param7 to Param6
Transfer Param8 to Param7
end
GoToEvent Event for CtrlEntId else
// Event not implemented
end
Return EventFlow or 1
//-----------------------------------------------------------------------------
// EVENT HANDLERS
//-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam)
TextToAcknowledge = CreateParam
If TextToAcknowledge NE '' then
Swap @TM with CRLF$ in TextToAcknowledge
Set_Property(@Window:'.EDB_DATA', 'TEXT', TextToAcknowledge)
PlaceDialog(-2, -2)
end else
Post_Event(@Window, 'CLOSE')
end
End Event
Event WINDOW.CLOSE(CancelFlag, CloseFlags)
End_Dialog(@Window, False$)
end event
Event PUB_OK.CLICK()
End_Dialog(@Window, True$)
end event
Event PUB_CANCEL.CLICK()
End_Dialog(@Window, False$)
end event

View File

@ -3,7 +3,7 @@ Compile function NDW_ADJUST_LOT_QTY_EVENTS(CtrlEntId, Event, @PARAMS)
#window NDW_ADJUST_LOT_QTY
Declare function MemberOf, Database_Services, Error_Services, Datetime
Declare subroutine PlaceDialog, Database_Services, Lot_Services
Declare subroutine PlaceDialog, Database_Services, Lot_Services, Lot_Event_Services
$Insert App_Inserts
$Insert Lot_Equates
@ -126,9 +126,15 @@ Event PUB_SUBMIT.CLICK()
Case NewWfrQty LT CurrWfrQty
AmountToDecrease = CurrWfrQty - NewWfrQty
Lot_Services('ReduceLotWaferCount', LotId, AmountToDecrease, @User4)
If Error_Services('NoError') then
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'COMMENT', 'Manual Lot Qty decrease performed.', '', @User4, '' , '')
end
Case NewWfrQty GT CurrWfrQty
AmountToIncrease = NewWfrQty - CurrWfrQty
Lot_Services('IncreaseLotWaferCount', LotId, AmountToIncrease, @User4)
If Error_Services('NoError') then
Lot_Event_Services('CreateLotEvent', LotId, Datetime(), 'COMMENT', 'Manual Lot Qty increase performed.', '', @User4, '' , '')
end
End Case
If Error_Services('NoError') then
msg(@Window, 'Wafer quantity adjusted successfully!')
@ -176,3 +182,4 @@ return

View File

@ -3,25 +3,27 @@ Compile function NDW_WAFER_COUNTS_EVENTS(CtrlEntId, Event, @PARAMS)
#window NDW_WAFER_COUNTS
Declare function Reactor_Services, Database_Services, Get_Property, Error_Services, Environment_Services
Declare function SRP_Array, Logging_Services
Declare subroutine Set_Property, Logging_Services
Declare subroutine Set_Property, Logging_Services, PlaceDialog
$Insert EVENT_SETUP
$Insert APP_INSERTS
$Insert REACTOR_EQUATES
EQU DATA_ASM_REACT_ID$ to 1
EQU DATA_ASM_SUSC_CNT$ to 2
EQU DATA_ASM_SUSC_THK$ to 3
EQU DATA_ASM_TUBE_CNT$ to 4
EQU DATA_ASM_TUBE_THK$ to 5
EQU DATA_ASM_ARM_CNT$ to 6
EQU DATA_ASM_REACT_ID$ to 1
EQU DATA_ASM_SUSC_CNT$ to 2
EQU DATA_ASM_SUSC_THK$ to 3
EQU DATA_ASM_TUBE_CNT$ to 4
EQU DATA_ASM_TUBE_THK$ to 5
EQU DATA_ASM_ARM_CNT$ to 6
EQU DATA_ASM_EXHAUST_THK$ to 7
EQU DATA_HTR_REACT_ID$ to 1
EQU DATA_HTR_SUSC_CNT$ TO 2
EQU DATA_HTR_SUSC_THK$ TO 3
EQU DATA_HTR_TUBE_CNT$ TO 4
EQU DATA_HTR_TUBE_THK$ TO 5
EQU DATA_HTR_ARM_CNT$ TO 6
EQU DATA_HTR_REACT_ID$ to 1
EQU DATA_HTR_SUSC_CNT$ TO 2
EQU DATA_HTR_SUSC_THK$ TO 3
EQU DATA_HTR_TUBE_CNT$ TO 4
EQU DATA_HTR_TUBE_THK$ TO 5
EQU DATA_HTR_ARM_CNT$ TO 6
EQU DATA_HTR_EXHAUST_THK$ TO 7
EQU DATA_EPP_REACT_ID$ to 1
EQU DATA_EPP_SUSC_CNT$ TO 2
@ -30,6 +32,7 @@ EQU DATA_EPP_BELL_JAR_CNT$ TO 4
EQU DATA_EPP_BELL_JAR_THK$ TO 5
EQU DATA_EPP_LOWER_QUARTZ_CNT$ TO 6
EQU DATA_EPP_LOWER_QUARTZ_THK$ TO 7
EQU DATA_EPP_EXHAUST_THK$ TO 8
ASMDataTable = @Window : '.OLE_DATA_ASM'
HTRDataTable = @Window : '.OLE_DATA_HTR'
@ -49,11 +52,11 @@ If Event EQ 'OLE' then
Transfer Param1 to Event
Transfer Param2 to Param1
Transfer Param3 to Param2
* Transfer Param4 to Param3
* Transfer Param5 to Param4
* Transfer Param6 to Param5
* Transfer Param7 to Param6
* Transfer Param8 to Param7
Transfer Param4 to Param3
Transfer Param5 to Param4
Transfer Param6 to Param5
Transfer Param7 to Param6
Transfer Param8 to Param7
end
GoToEvent Event for CtrlEntId else
@ -67,17 +70,25 @@ Return EventFlow or 1
//-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam)
GoSub SetupOLEControls
GoSub GetReactorMetrics
End Event
Event TABCONTROL_1.CLICK()
Page = Get_Property(@Window : '.TABCONTROL_1', 'VALUE')
Set_Property(@WINDOW,'VPOSITION', Page)
end event
Event PUB_REFRESH_DATA.CLICK()
GoSub GetReactorMetrics
end event
//-----------------------------------------------------------------------------
@ -85,6 +96,7 @@ end event
//-----------------------------------------------------------------------------
GetReactorMetrics:
ReactorRec = ''
ASMData = ''
HTRData = ''
@ -105,12 +117,13 @@ GetReactorMetrics:
for each Reactor in ASMList using @FM setting rPos
MetricData = Reactor_Services('GetWaferCntMetricsByReactorID', Reactor)
if Error_Services('NoError') then
ASMData<rPos, DATA_ASM_REACT_ID$> = MetricData<1, DATA_ASM_REACT_ID$>
ASMData<rPos, DATA_ASM_SUSC_CNT$> = MetricData<1, DATA_ASM_SUSC_CNT$>
ASMData<rPos, DATA_ASM_SUSC_THK$> = MetricData<1, DATA_ASM_SUSC_THK$>
ASMData<rPos, DATA_ASM_TUBE_CNT$> = MetricData<1, DATA_ASM_TUBE_CNT$>
ASMData<rPos, DATA_ASM_TUBE_THK$> = MetricData<1, DATA_ASM_TUBE_THK$>
ASMData<rPos, DATA_ASM_ARM_CNT$> = MetricData<1, DATA_ASM_ARM_CNT$>
ASMData<rPos, DATA_ASM_REACT_ID$> = MetricData<1, DATA_ASM_REACT_ID$>
ASMData<rPos, DATA_ASM_SUSC_CNT$> = MetricData<1, DATA_ASM_SUSC_CNT$>
ASMData<rPos, DATA_ASM_SUSC_THK$> = MetricData<1, DATA_ASM_SUSC_THK$>
ASMData<rPos, DATA_ASM_TUBE_CNT$> = MetricData<1, DATA_ASM_TUBE_CNT$>
ASMData<rPos, DATA_ASM_TUBE_THK$> = MetricData<1, DATA_ASM_TUBE_THK$>
ASMData<rPos, DATA_ASM_ARM_CNT$> = MetricData<1, DATA_ASM_ARM_CNT$>
ASMData<rPos, DATA_ASM_EXHAUST_THK$> = MetricData<1, DATA_ASM_EXHAUST_THK$>
end else
ErrorMessage = Error_Services('GetMessage')
LogData = LoggingDTM : @FM : ErrorMessage
@ -123,12 +136,13 @@ GetReactorMetrics:
for each Reactor in HTRList using @FM setting rPos
MetricData = Reactor_Services('GetWaferCntMetricsByReactorID', Reactor)
if Error_Services('NoError') then
HTRData<rPos, DATA_HTR_REACT_ID$> = MetricData <1, DATA_HTR_REACT_ID$>
HTRData<rPos, DATA_HTR_SUSC_CNT$> = MetricData<1, DATA_HTR_SUSC_CNT$>
HTRData<rPos, DATA_HTR_SUSC_THK$> = MetricData<1, DATA_HTR_SUSC_THK$>
HTRData<rPos, DATA_HTR_TUBE_CNT$> = MetricData<1, DATA_HTR_TUBE_CNT$>
HTRData<rPos, DATA_HTR_TUBE_THK$> = MetricData<1, DATA_HTR_TUBE_THK$>
HTRData<rPos, DATA_HTR_ARM_CNT$> = MetricData<1, DATA_HTR_ARM_CNT$>
HTRData<rPos, DATA_HTR_REACT_ID$> = MetricData <1, DATA_HTR_REACT_ID$>
HTRData<rPos, DATA_HTR_SUSC_CNT$> = MetricData<1, DATA_HTR_SUSC_CNT$>
HTRData<rPos, DATA_HTR_SUSC_THK$> = MetricData<1, DATA_HTR_SUSC_THK$>
HTRData<rPos, DATA_HTR_TUBE_CNT$> = MetricData<1, DATA_HTR_TUBE_CNT$>
HTRData<rPos, DATA_HTR_TUBE_THK$> = MetricData<1, DATA_HTR_TUBE_THK$>
HTRData<rPos, DATA_HTR_ARM_CNT$> = MetricData<1, DATA_HTR_ARM_CNT$>
HTRData<rPos, DATA_HTR_EXHAUST_THK$> = MetricData<1, DATA_HTR_EXHAUST_THK$>
end else
ErrorMessage = Error_Services('GetMessage')
LogData = LoggingDTM : @FM : ErrorMessage
@ -149,6 +163,7 @@ GetReactorMetrics:
EPPData<rPos, DATA_EPP_BELL_JAR_THK$> = MetricData<1, DATA_EPP_BELL_JAR_THK$>
EPPData<rPos, DATA_EPP_LOWER_QUARTZ_CNT$> = MetricData<1, DATA_EPP_LOWER_QUARTZ_CNT$>
EPPData<rPos, DATA_EPP_LOWER_QUARTZ_THK$> = MetricData<1, DATA_EPP_LOWER_QUARTZ_THK$>
EPPData<rPos, DATA_EPP_EXHAUST_THK$> = MetricData<1, DATA_EPP_EXHAUST_THK$>
end else
ErrorMessage = Error_Services('GetMessage')
LogData = LoggingDTM : @FM : ErrorMessage
@ -159,36 +174,55 @@ GetReactorMetrics:
return
SetupOLEControls:
//Set Row Headers to invisible
// Set Row Headers to invisible
Set_Property(ASMDataTable, "OLE.HeaderColumn[1]", '':@FM:False$)
Set_Property(HTRDataTable, "OLE.HeaderColumn[1]", '':@FM:False$)
Set_Property(EPPDataTable, "OLE.HeaderColumn[1]", '':@FM:False$)
//Set Number of columns for each table
Set_Property(ASMDataTable, "OLE.Dimension", 6);*6 columns for ASM Data Table
Set_Property(HTRDataTable, "OLE.Dimension", 6);*6 columns for HTR Data Table
Set_Property(EPPDataTable, "OLE.Dimension", 7);*7 columns for EPP Data Table
// Set Number of columns for each table
Set_Property(ASMDataTable, "OLE.Dimension", 7);*6 columns for ASM Data Table
Set_Property(HTRDataTable, "OLE.Dimension", 7);*6 columns for HTR Data Table
Set_Property(EPPDataTable, "OLE.Dimension", 8);*7 columns for EPP Data Table
//Set size of columns
// Set size of all columns
ColSizeArray = ''
ColSizeArray<1> = 100
ColSizeArray<1> = 115
Set_Property(ASMDataTable, "OLE.DataColumn[All]", ColSizeArray)
Set_Property(HTRDataTable, "OLE.DataColumn[All]", ColSizeArray)
Set_Property(EPPDataTable, "OLE.DataColumn[All]", ColSizeArray)
// Shrink size of column 1
ColSizeArray<1> = 60
Set_Property(ASMDataTable, "OLE.DataColumn[1]", ColSizeArray)
Set_Property(HTRDataTable, "OLE.DataColumn[1]", ColSizeArray)
Set_Property(EPPDataTable, "OLE.DataColumn[1]", ColSizeArray)
// Set size of all columns
ColSizeArray = ''
ColSizeArray<1> = 125
Set_Property(EPPDataTable, "OLE.DataColumn[6]", ColSizeArray)
// Set autosize last column to true to fill out table width
ColSizeArray<1> = 125
ColSizeArray<4> = True$
Set_Property(ASMDataTable, "OLE.DataColumn[7]", ColSizeArray)
Set_Property(HTRDataTable, "OLE.DataColumn[7]", ColSizeArray)
Set_Property(EPPDataTable, "OLE.DataColumn[8]", ColSizeArray)
//Set ASM Table Col. Headers
HeaderTitles = 'Reactor#':@VM:'Susc. Wfr. Cnt.':@VM:'Susc. Thk':@VM:'Tube Wfr. Cnt.':@VM:'Tube Wfr. Thk':@VM:'Arm Wfr. Cnt.'
HeaderTitles = 'Reactor#':@VM:'Susc. Wfr. Cnt.':@VM:'Susc. Thk':@VM:'Tube Wfr. Cnt.':@VM:'Tube Wfr. Thk':@VM:'Arm Wfr. Cnt.':@VM:'Exhaust Chamber Thk.'
Set_Property(ASMDataTable, "OLE.TitleList", HeaderTitles)
//Set HTR Table Col. Headers
HeaderTitles = 'Reactor#':@VM:'Susc. Run Cnt.':@VM:'Susc. Thk':@VM:'Tube Run Cnt.':@VM:'Tube Thk':@VM:'Arm Wfr. Cnt.'
HeaderTitles = 'Reactor#':@VM:'Susc. Run Cnt.':@VM:'Susc. Thk':@VM:'Tube Run Cnt.':@VM:'Tube Thk':@VM:'Arm Wfr. Cnt.':@VM:'Exhaust Chamber Thk.'
Set_Property(HTRDataTable, "OLE.TitleList", HeaderTitles)
//Set EPP Table Col. Headers
HeaderTitles = 'Reactor#':@VM:'Susc. Run Cnt.':@VM:'Susc. Thk':@VM:'Bell Jar Run Cnt.':@VM:'Bell Jar Thk':@VM:'Lower Quartz Run Cnt.':@VM:'Lower Quartz thk.'
HeaderTitles = 'Reactor#':@VM:'Susc. Run Cnt.':@VM:'Susc. Thk':@VM:'Bell Jar Run Cnt.':@VM:'Bell Jar Thk':@VM:'Lower Quartz Run Cnt.':@VM:'Lower Quartz thk.':@VM:'Exhaust Chamber Thk.'
Set_Property(EPPDataTable, "OLE.TitleList", HeaderTitles)
return

View File

@ -50,11 +50,13 @@ 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'
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','in-edit','creating','not-started','in-progress','cancelled','done'
Options REACTOR_TYPES = 'ASM','ASM+','HTR','EPP'
Options ORDER_CHECKLIST_STATUSES = 'not-started','in-progress','paused','done'
Options NICA_CHECKLISTS = 'PROCESS_INTERRUPTION_FLOW_C_PRE','PROCESS_INTERRUPTION_FLOW_A_PRE','PROCESS_INTERRUPTION_FLOW_B_PRE','PROCESS_INTERRUPTION_LAST_KNOWN_PRODUCT_THICKNESS_SHEETRHO','PROCESS_INTERRUPTION_LAST_KNOWN_PRODUCT_VISUAL_INSPECTION','PROCESS_INTERRUPTION_TEST_WAFER','PROCESS_INTERRUPTION_ASM_PARTICLE_QUAL_VISUAL_INSPECTION','PROCESS_INTERRUPTION_HTR_PARTICLE_QUAL_VISUAL_INSPECTION','SUSCEPTOR_PREP','1_PCRC','2_PCRC','BD','INTRINSIC','SPV-FE','CLEANUP','TEST_WAFER_VERIFICATION','PARTICLE_QUAL_ASM','PARTICLE_QUAL_HTR','FIRST_PRODUCT_RUN_HGCV','FIRST_PRODUCT_RUN_THICK','PROCESS_INTERRUPTION_FLOW_B_POST'
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SERVICES
@ -85,6 +87,7 @@ Service GetOrderIds(EntityType=ENTITY_TYPES, EntityID, OrderTypes=ORDER_TYPES, O
For each Val in IsComplete using @VM
Query := @VM : Val
Next Val
Query := @FM
end
Btree.Extract(Query, Table, hDict, OrderKeys, Option, Flag)
If Flag NE 0 then
@ -106,6 +109,64 @@ Service GetOrderIds(EntityType=ENTITY_TYPES, EntityID, OrderTypes=ORDER_TYPES, O
End Service
Service GetOrderChecklistIds(NicaOrdersIds, NicaChecklistIds=NICA_CHECKLISTS, IsComplete=BOOLEAN, ChecklistOrderStates=ORDER_CHECKLIST_STATUSES)
OrderChecklistIds = ''
ErrorMsg = ''
If ( (NicaOrdersIds NE '') or (IsComplete NE '') or (ChecklistOrderStates NE '') ) then
Open 'DICT.NICA_ORDERS_CHECKLISTS' to hDict then
Query = ''
Table = 'NICA_ORDERS_CHECKLISTS'
Option = 'E'
Flag = ''
If (NicaOrdersIds NE '') then
Query := 'NICA_ORDERS_ID'
For each NicaOrderId in NicaOrdersIds using @VM
Query := @VM : NicaOrderId
Next NicaOrderId
Query := @FM
end
If (NicaChecklistIds NE '') then
Query := 'NICA_CHECKLISTS_ID'
For each NicaChecklistId in NicaChecklistIds using @VM
Query := @VM : NicaChecklistId
Next NicaChecklistId
Query := @FM
end
If (IsComplete NE '') then
Query := 'IS_COMPLETE'
For each Val in IsComplete using @VM
Query := @VM : Val
Next Val
Query := @FM
end
If (ChecklistOrderStates NE '') then
Query := 'STATE'
For each ChecklistOrderState in ChecklistOrderStates using @VM
Query := @VM : ChecklistOrderState
Next ChecklistOrderState
Query := @FM
end
Btree.Extract(Query, Table, hDict, OrderChecklistIds, 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_CHECKLISTS.'
end
end else
ErrorMsg = 'Error in ':Service:' service. At least one search parameter must be provided.'
end
If ErrorMsg EQ '' then
Response = OrderChecklistIds
end else
Error_Services('Add', ErrorMsg)
end
end service
Service GetOrderUpdates()
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
@ -194,7 +255,9 @@ Service GetActiveOrders(EntityType=ENTITY_TYPES, EntityId, OrderTypes=ORDER_TYPE
end service
Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES, OrderFlows, OrderResponseLevel, ChecklistIds)
Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES, OrderFlows, OrderResponseLevel, ChecklistIds, Intrusive=BOOLEAN)
If Intrusive NE True$ then Intrusive = False$
ErrorMsg = ''
EntityTypes = 'REACTOR,REACTOR_LOG'
@ -229,7 +292,39 @@ Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES,
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)
Begin Case
Case OrderType _EQC 'ABORT_ALARM'
OrderTypes = OrderType:@VM:'INTRUSIVE_MAINT'
CurrActiveOrders = Nica_Orders_Services('GetActiveOrders', EntityType, EntityID, OrderTypes)
If CurrActiveOrders NE '' then
// If any active ABORT_ALARM orders are marked as intrusive (i.e., they were merged
// with an INTRUSIVE_MAINT order then mark the new order as intrusive).
ActiveOrdersIntrusive = Sum(Xlate('NICA_ORDERS', CurrActiveOrders, 'INTRUSIVE', 'X'))
If ActiveOrdersIntrusive then Intrusive = True$
end
Case OrderType _EQC 'INTRUSIVE_MAINT'
Intrusive = True$
CurrActiveOrders = Nica_Orders_Services('GetActiveOrders', EntityType, EntityID, OrderType)
CurrActiveAbortAlarmOrders = Nica_Orders_Services('GetActiveOrders', EntityType, EntityID, 'ABORT_ALARM')
If CurrActiveAbortAlarmOrders NE '' then
CurrActiveOrders<-1> = CurrActiveAbortAlarmOrders
// Merge INTRUSIVE_MAINT and ABORT_ALARM orders into one ABORT_ALARM order.
// Preserve ABORT_ALARM order flow ids for Reactor mode change logic that relies on these
// to determine whether or not to trigger a new ABORT/ALARM order when changing ABORT/ALARM sub modes.
OrderType = 'ABORT_ALARM'
OrderFlows = Xlate('NICA_ORDERS', CurrActiveAbortAlarmOrders, 'ORDER_FLOW_IDS', 'X')
OrderFlows = SRP_Array('Clean', OrderFlows, 'TrimAndMakeUnique', @VM)
end
Case Otherwise$
CurrActiveOrders = Nica_Orders_Services('GetActiveOrders', EntityType, EntityID, OrderType)
End Case
OrderTypeAlreadyActive = (CurrActiveOrders NE '')
If ( (OrderTypeAlreadyActive EQ False$) or (OrderType EQ 'INTRUSIVE_MAINT') or (OrderType EQ 'ABORT_ALARM') ) then
@ -300,6 +395,17 @@ Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES,
end
NewChecklistIds = SRP_Array('Clean', NewChecklistIds, 'TrimAndMakeUnique', @VM)
If Intrusive then
// Remove checklist ids with REMOVE_IF_INRUSIVE flag set to True$
ChecklistIdsToRemove = Nica_Orders_Services('GetChecklistIds', '', '', '', '', '', '', True$)
If ChecklistIdsToRemove NE '' then
For each ChecklistIdToRemove in ChecklistIdsToRemove using @VM
Locate ChecklistIdToRemove in NewChecklistIds using @VM setting vPos then
NewChecklistIds = Delete(NewChecklistIds, 0, vPos, 0)
end
Next ChecklistIdToRemove
end
end
NewChecklistPriorities = Xlate('NICA_CHECKLISTS', NewChecklistIds, 'PRIORITY', 'X')
ChecklistArray = NewChecklistIds:@FM:NewChecklistPriorities
ChecklistArray = SRP_Array('SortRows', ChecklistArray, 'AR2', 'ARRAY', @FM, @VM)
@ -369,6 +475,7 @@ Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES,
end
NicaOrderRec<NICA_ORDERS.ORDER_FLOW_IDS$> = OrderFlows
NicaOrderRec<NICA_ORDERS.ORDER_RESPONSE_LEVEL$> = OrderResponseLevel
NicaOrderRec<NICA_ORDERS.INTRUSIVE$> = Intrusive
LogNicaOrderRec = NicaOrderRec
Swap @FM with ',' in LogNicaOrderRec
LogData = ''
@ -535,9 +642,9 @@ Service CancelOrder(OrderId)
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')
IsComplete = SRP_JSON(ObjResponseJson, 'GetValue', 'isComplete')
NicaOrderRec<NICA_ORDERS.ORDER_STATUS$> = 'cancelled'
NicaOrderRec<NICA_ORDERS.IS_COMPLETE$> = IsComplete
CloseDtm = Datetime()
NicaOrderRec<NICA_ORDERS.CLOSED_DTM$> = CloseDtm
If IsComplete EQ False$ then
@ -900,8 +1007,120 @@ Service GetAvailableFlowIds(NicaOrderType=ORDER_TYPES)
end service
Service AbortAlarmFromIntrusiveMaintRequired(ReactNo)
ErrorMsg = ''
AbortAlarmFromIntrusiveMaintRequired = ''
If ReactNo NE '' then
If RowExists('REACTOR', ReactNo) then
ActiveIntrusiveMaintOrderIds = Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactNo, 'INTRUSIVE_MAINT')
IntrusiveMaintOrderActive = (ActiveIntrusiveMaintOrderIds NE '')
If IntrusiveMaintOrderActive then
// If any FIRST_PRODUCT_RUN_THICK or FIRST_PRODUCT_RUN_HGCV associated with active INTRUSIVE_MAINT
// orders have been started or completed, then an ABORT/ALARM order should be triggerd.
ChecklistIdsToSearch = 'FIRST_PRODUCT_RUN_THICK':@VM:'FIRST_PRODUCT_RUN_HGCV'
InProcessOrCompleteOrderChecklistIds = Nica_Orders_Services('GetOrderChecklistIds', ActiveIntrusiveMaintOrderIds, ChecklistIdsToSearch, '', '#not-started')
AbortAlarmFromIntrusiveMaintRequired = (InProcessOrCompleteOrderChecklistIds NE '')
end else
AbortAlarmFromIntrusiveMaintRequired = False$
end
end else
ErrorMsg = 'Error in ':Service:' service. REACTOR ':ReactNo:' does not exist.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null ReactNo passed into service.'
end
If ErrorMsg EQ '' then
Response = AbortAlarmFromIntrusiveMaintRequired
end else
Error_Services('Add', ErrorMsg)
end
end service
Service GetChecklistIds(Priorities, NicaBaseInstructionIds, NicaOrderFlowIds, NicaOrderFlowTypes, ReactorTypes, RemoveIfComplete=BOOLEAN, RemoveIfIntrusive=BOOLEAN)
ChecklistIds = ''
ErrorMsg = ''
If ( (Priorities NE '') or (NicaBaseInstructionIds NE '') or (NicaOrderFlowIds NE '') or (NicaOrderFlowTypes NE '') |
or (ReactorTypes NE '') or (RemoveIfComplete NE '') or (RemoveIfIntrusive NE '') ) then
Open 'DICT.NICA_CHECKLISTS' to hDict then
Query = ''
Table = 'NICA_CHECKLISTS'
Option = 'E'
Flag = ''
If (Priorities NE '') then
Query := 'PRIORITY'
For each Priority in Priorities using @VM
Query := @VM : Priority
Next Priority
Query := @FM
end
If (NicaBaseInstructionIds NE '') then
Query := 'NICA_BASE_INSTRUCTION_ID'
For each NicaBaseInstructionId in NicaBaseInstructionIds using @VM
Query := @VM : NicaBaseInstructionId
Next NicaBaseInstructionId
Query := @FM
end
If (NicaOrderFlowIds NE '') then
Query := 'NICA_ORDER_FLOW_IDS'
For each NicaOrderFlowId in NicaOrderFlowIds using @VM
Query := @VM : NicaOrderFlowId
Next NicaOrderFlowId
Query := @FM
end
If (NicaOrderFlowTypes NE '') then
Query := 'NICA_ORDER_FLOW_TYPE'
For each NicaOrderFlowType in NicaOrderFlowTypes using @VM
Query := @VM : NicaOrderFlowType
Next NicaOrderFlowTypes
Query := @FM
end
If (ReactorTypes NE '') then
Query := 'REACTOR_TYPES'
For each NicaOrderFlowType in NicaOrderFlowTypes using @VM
Query := @VM : NicaOrderFlowType
Next NicaOrderFlowTypes
Query := @FM
end
If (RemoveIfComplete NE '') then
Query := 'REMOVE_IF_COMPLETE'
For each Val in RemoveIfComplete using @VM
Query := @VM : Val
Next RemoveIfComplete
Query := @FM
end
If (RemoveIfIntrusive NE '') then
Query := 'REMOVE_IF_INTRUSIVE'
For each Val in RemoveIfIntrusive using @VM
Query := @VM : Val
Next Val
Query := @FM
end
Btree.Extract(Query, Table, hDict, ChecklistIds, 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_CHECKLISTS.'
end
end else
ErrorMsg = 'Error in ':Service:' service. At least one search parameter must be provided.'
end
If ErrorMsg EQ '' then
Response = ChecklistIds
end else
Error_Services('Add', ErrorMsg)
end
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -20,7 +20,7 @@ COMPILE FUNCTION obj_Post_Log(Method,Parms)
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Get_Property, obj_RDS, Database_Services, Environment_Services
DECLARE FUNCTION Logging_Services, Datetime, SRP_DateTime
DECLARE FUNCTION Logging_Services, Datetime, SRP_DateTime, GetTickCount
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Send_Dyn, RList, obj_WO_Log, Send_Event, obj_RDS
DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, ErrMsg, Logging_Services, Mona_Services
@ -42,6 +42,13 @@ Headers = 'Logging DTM' : @FM : 'WOMatKey' : @FM : ' SAPBatchNo' : @FM : 'Fa
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJPOSTLOG'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJPOSTLOG'
end
ErrTitle = 'Error in Stored Procedure "obj_Post_Log"'
ErrorMsg = ''
@ -116,6 +123,9 @@ RETURN
Post:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'Post'
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
ServiceKeyID = 'Obj_Post_Log*Post'
Lock hSysLists, ServiceKeyID then
@ -229,5 +239,9 @@ Post:
Unlock hSysLists, ServiceKeyID else Null
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN

View File

@ -18,8 +18,8 @@ COMPILE FUNCTION obj_Reactor(Method,Parms)
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Mona_Services
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Environment_Services, GetTickCount
$INSERT REACTOR_EQUATES
@ -28,6 +28,14 @@ $INSERT REACT_STATE_EQUATES
$INSERT REACT_ITEM_EQUATES
$INSERT MSG_EQUATES
$insert REACTOR_CHILD_KEY_IDS_EQUATES
$Insert LOGICAL
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJREACTOR'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJREACTOR'
end
ErrTitle = 'Error in Stored Procedure "obj_Reactor"'
ErrorMsg = ''
@ -66,6 +74,9 @@ RETURN Result
CurrItem:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'CurrItem'
ReactNo = Parms[1,@RM]
ItemType = Parms[COL2()+1,@RM]
ReactRec = Parms[COL2()+1,@RM]
@ -96,6 +107,9 @@ LOCATE ItemType IN CurrInstTypes USING @VM SETTING Pos THEN
Result = FIELD(CurrInstItems<1,Pos>,'*',2)
END
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN
@ -103,6 +117,9 @@ RETURN
CurrGraphite:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'CurrGraphite'
ReactNo = Parms[1,@RM]
ReactRec = Parms[COL2()+1,@RM]
@ -135,6 +152,9 @@ FOR I = 1 TO ciCnt
END
NEXT I
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN

View File

@ -18,7 +18,7 @@ COMPILE FUNCTION obj_Reactor_Log(Method,Parms)
*/
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Btree.Extract, obj_React_Item_Hist, Update_Index, obj_Post_Log
Declare subroutine Error_Services, Database_Services
Declare subroutine Error_Services, Database_Services, React_Item_Services
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, obj_React_Item, obj_Calendar, Database_Services
@ -195,18 +195,16 @@ PostReactItems:
ReactorLogRec<REACTOR_LOG_RI_POST_DTM$> = PostDTM
otParms = FIELDSTORE(otParms,@RM,4,0,ReactorLogRec)
//obj_Tables('WriteRec',otParms)
Database_Services('WriteDataRow', 'REACTOR_LOG', RLNo, ReactorLogRec, 1, 0, 1)
Update_Index('REACT_ITEM_HIST', 'INST_RL_ID', False$, True$) ;* Don't wait for indexer - flush pending indexes now
Update_Index('REACT_ITEM_HIST', 'REM_RL_ID', False$, True$)
end else
Error_Services('Add', ValidationFailureReason)
end
RETURN
@ -386,10 +384,3 @@ RemHistKeys:
RETURN

View File

@ -18,11 +18,12 @@ COMPILE FUNCTION obj_React_Item_Hist(Method,Parms)
*/
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Send_Dyn, obj_Popup
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn
DECLARE SUBROUTINE ErrMsg, Btree.Extract
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Send_Dyn, obj_Popup
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Btree.Extract, React_Item_Services
$Insert LOGICAL
$INSERT REACT_ITEM_HIST_EQUATES
$INSERT RLIST_EQUATES
EQU CRLF$ TO \0D0A\
EQU TAB$ TO CHAR(9)
@ -62,26 +63,26 @@ RETURN Result
Install:
* * * * * * *
RIHKey = Parms[1,@RM]
RL_Id = Parms[COL2()+1,@RM]
ReactWfrCnt = Parms[COL2()+1,@RM]
ReactHrs = Parms[COL2()+1,@RM]
RIHKey = Parms[1,@RM]
RL_Id = Parms[COL2()+1,@RM]
ReactWfrCnt = Parms[COL2()+1,@RM]
ReactHrs = Parms[COL2()+1,@RM]
IF RIHKey = '' THEN ErrorMsg = 'Null Parameter "RIHKey" passed to routine. (':Method:')'
IF RL_Id = '' THEN ErrorMsg = 'Null Parameter "RL_Id" passed to routine. (':Method:')'
*IF ReactWfrCnt = '' THEN ErrorMsg = 'Null Parameter "ReactWfrCnt" passed to routine. (':Method:')' ;* Optional
*IF ReactHrs = '' THEN ErrorMsg = 'Null Parameter "ReactHrs" passed to routine. (':Method:')' ;* Optional
IF RIHKey = '' THEN ErrorMsg = 'Null Parameter "RIHKey" passed to routine. (':Method:')'
IF RL_Id = '' THEN ErrorMsg = 'Null Parameter "RL_Id" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF ErrorMsg NE '' THEN RETURN
RIHRec = ''
RIHRec<REACT_ITEM_HIST_INST_RL_ID$> = RL_ID
RIHRec<REACT_ITEM_HIST_INST_REACT_WFR_CNT$> = ReactWfrCnt
RIHRec<REACT_ITEM_HIST_INST_REACT_HRS$> = ReactHrs
RIHRec = ''
RIHRec<REACT_ITEM_HIST_INST_RL_ID$> = RL_ID
RIHRec<REACT_ITEM_HIST_INST_REACT_WFR_CNT$> = ReactWfrCnt
RIHRec<REACT_ITEM_HIST_INST_REACT_HRS$> = ReactHrs
otParms = 'REACT_ITEM_HIST':@RM:RIHKey:@RM:@RM:RIHRec
otParms = 'REACT_ITEM_HIST':@RM:RIHKey:@RM:@RM:RIHRec
obj_Tables('WriteRec',otParms)
obj_Tables('WriteRec',otParms)
RINo = Field(RIHKey, '*', 2, 1)
React_Item_Services('UpdateReactItemStatus', RINo)
RETURN
@ -90,38 +91,36 @@ RETURN
Remove:
* * * * * * *
RIHKey = Parms[1,@RM]
RemoveDTM = Parms[COL2()+1,@RM] ;* Internal format *
RL_Id = Parms[COL2()+1,@RM]
ReactWfrCnt = Parms[COL2()+1,@RM]
ReactHrs = Parms[COL2()+1,@RM]
RIHKey = Parms[1,@RM]
RemoveDTM = Parms[COL2()+1,@RM] ;* Internal format *
RL_Id = Parms[COL2()+1,@RM]
ReactWfrCnt = Parms[COL2()+1,@RM]
ReactHrs = Parms[COL2()+1,@RM]
IF RIHKey = '' THEN ErrorMsg = 'Null Parameter "RIHKey" passed to routine. (':Method:')'
IF RemoveDTM = '' THEN ErrorMsg = 'Null Parameter "RemoveDTM" passed to routine. (':Method:')'
IF RL_Id = '' THEN ErrorMsg = 'Null Parameter "RL_Id" passed to routine. (':Method:')'
*IF ReactWfrCnt = '' THEN ErrorMsg = 'Null Parameter "ReactWfrCnt" passed to routine. (':Method:')' ;* Optional
*IF ReactHrs = '' THEN ErrorMsg = 'Null Parameter "ReactHrs" passed to routine. (':Method:')' ;* Optional
IF RIHKey = '' THEN ErrorMsg = 'Null Parameter "RIHKey" passed to routine. (':Method:')'
IF RemoveDTM = '' THEN ErrorMsg = 'Null Parameter "RemoveDTM" passed to routine. (':Method:')'
IF RL_Id = '' THEN ErrorMsg = 'Null Parameter "RL_Id" passed to routine. (':Method:')'
IF ErrorMsg NE '' THEN RETURN
IF ErrorMsg NE '' THEN RETURN
* Read and update record *
otParms = 'REACT_ITEM_HIST':@RM:RIHKey
otParms = 'REACT_ITEM_HIST':@RM:RIHKey
RIHRec = obj_Tables('ReadRec',otParms)
RIHRec = obj_Tables('ReadRec',otParms)
IF Get_Status(errCode) THEN
Set_Status(0)
RIHRec = ''
END
IF Get_Status(errCode) THEN
Set_Status(0)
RIHRec = ''
END
RIHRec<REACT_ITEM_HIST_REM_DTM$> = RemoveDTM
RIHRec<REACT_ITEM_HIST_REM_RL_ID$> = RL_Id
RIHRec<REACT_ITEM_HIST_REM_REACT_WFR_CNT$> = ReactWfrCnt
RIHRec<REACT_ITEM_HIST_REM_REACT_HRS$> = ReactHrs
RIHRec<REACT_ITEM_HIST_REM_DTM$> = RemoveDTM
RIHRec<REACT_ITEM_HIST_REM_RL_ID$> = RL_Id
RIHRec<REACT_ITEM_HIST_REM_REACT_WFR_CNT$> = ReactWfrCnt
RIHRec<REACT_ITEM_HIST_REM_REACT_HRS$> = ReactHrs
otParms = FIELDSTORE(otParms,@RM,4,0,RIHRec)
obj_Tables('WriteRec',otParms)
otParms = FIELDSTORE(otParms,@RM,4,0,RIHRec)
obj_Tables('WriteRec',otParms)
RINo = Field(RIHKey, '*', 2, 1)
React_Item_Services('UpdateReactItemStatus', RINo)
RETURN
@ -130,24 +129,21 @@ RETURN
ClearRemove:
* * * * * * *
RIHKey = Parms[1,@RM]
RIHKey = Parms[1,@RM]
IF RIHKey = '' THEN RETURN
IF RIHKey = '' THEN RETURN
otParms = 'REACT_ITEM_HIST':@RM:RIHKey
* Read and update record *
RIHRec = obj_Tables('ReadRec',otParms)
otParms = 'REACT_ITEM_HIST':@RM:RIHKey
RIHRec<REACT_ITEM_HIST_REM_DTM$> = ''
RIHRec<REACT_ITEM_HIST_REM_RL_ID$> = ''
RIHRec<REACT_ITEM_HIST_REM_REACT_WFR_CNT$> = ''
RIHRec<REACT_ITEM_HIST_REM_REACT_HRS$> = ''
RIHRec = obj_Tables('ReadRec',otParms)
RIHRec<REACT_ITEM_HIST_REM_DTM$> = ''
RIHRec<REACT_ITEM_HIST_REM_RL_ID$> = ''
RIHRec<REACT_ITEM_HIST_REM_REACT_WFR_CNT$> = ''
RIHRec<REACT_ITEM_HIST_REM_REACT_HRS$> = ''
otParms = FIELDSTORE(otParms,@RM,4,0,RIHRec)
obj_Tables('WriteRec',otParms)
otParms = FIELDSTORE(otParms,@RM,4,0,RIHRec)
obj_Tables('WriteRec',otParms)
RETURN
@ -156,49 +152,50 @@ RETURN
GetHistory:
* * * * * * *
ReactNo = Parms[1,@RM]
RINo = Parms[COL2()+1,@RM]
RIType = Parms[COL2()+1,@RM]
ReactNo = Parms[1,@RM]
RINo = Parms[COL2()+1,@RM]
RIType = Parms[COL2()+1,@RM]
IF ReactNo = '' AND RINo = '' AND RIType = '' THEN RETURN
IF ReactNo = '' AND RINo = '' AND RIType = '' THEN RETURN
OPEN 'DICT.REACT_ITEM_HIST' TO DictVar ELSE
ErrorMsg = 'Unable to open DICT.REACT_ITEM_HIST for index lookup'
RETURN
END
OPEN 'DICT.REACT_ITEM_HIST' TO DictVar ELSE
ErrorMsg = 'Unable to open DICT.REACT_ITEM_HIST for index lookup'
RETURN
END
Search = ''
Search = ''
IF ReactNo NE '' THEN Search := 'REACT_NO':@VM:ReactNo:@FM
IF RINo NE '' THEN Search := 'RI_NO':@VM:RINo:@FM
IF RIType NE '' THEN Search := 'RI_TYPE':@VM:RIType:@FM
IF ReactNo NE '' THEN Search := 'REACT_NO':@VM:ReactNo:@FM
IF RINo NE '' THEN Search := 'RI_NO':@VM:RINo:@FM
IF RIType NE '' THEN Search := 'RI_TYPE':@VM:RIType:@FM
Option = ''
Flag = ''
Option = ''
Flag = ''
Btree.Extract(Search, 'REACT_ITEM_HIST', DictVar, RIKeys, Option, Flag) ;* Get unsorted keys based on Search parameters
Btree.Extract(Search, 'REACT_ITEM_HIST', DictVar, RIKeys, Option, Flag) ;* Get unsorted keys based on Search parameters
* Put sort data in first column (Install DTM)
// Put sort data in first column (Install DTM)
WorkList = ''
riCnt = COUNT(RIKeys,@VM) + (RIKeys NE '')
FOR I = 1 TO riCnt
RIKey = RIKeys<1,I>
WorkList<I> = FIELD(RIKey,'*',3):@VM:RIKey
NEXT I
WorkList = ''
riCnt = COUNT(RIKeys,@VM) + (RIKeys NE '')
FOR I = 1 TO riCnt
RIKey = RIKeys<1,I>
WorkList<I> = FIELD(RIKey,'*',3):@VM:RIKey
NEXT I
WorkList := @RM
WorkList := @RM
CONVERT @FM:@VM TO @RM:@FM IN WorkList ;* push delimiters higher for V119
CONVERT @FM:@VM TO @RM:@FM IN WorkList ;* push delimiters higher for V119
CALL V119('S','','D','L',WorkList,'') ;* Descending Left justified sort
CALL V119('S','','D','L',WorkList,'') ;* Descending Left justified sort
CONVERT @FM:@RM TO @VM:@FM IN WorkList ;* pull delimiters lower
CONVERT @FM:@RM TO @VM:@FM IN WorkList ;* pull delimiters lower
WorkList[-1,1] = '' ;* Trim trailing delimiter
WorkList[-1,1] = '' ;* Trim trailing delimiter
FOR I = 1 TO riCnt
Result<1,I> = WorkList<I,2> ;* Strip Sort column(s)
NEXT I
FOR I = 1 TO riCnt
Result<1,I> = WorkList<I,2> ;* Strip Sort column(s)
NEXT I
RETURN

View File

@ -15,10 +15,10 @@ COMPILE FUNCTION obj_React_State(Method,Parms)
*/
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Database_Services
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Database_Services, Mona_Services
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, Send_Dyn, Database_Services, Error_Services
Declare function Environment_Services, GetTickCount
$INSERT REACT_STATE_EQUATES
$INSERT PROD_SPEC_EQUATES
@ -28,6 +28,12 @@ $INSERT LOGICAL
EQU CRLF$ TO \0D0A\
EQU TAB$ TO \09\
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJREACTSTATE'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJREACTSTATE'
end
ErrTitle = 'Error in Stored Procedure "obj_React_State"'
ErrorMsg = ''
@ -62,6 +68,9 @@ RETURN Result
ReactRunUnload:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'ReactRunUnload'
* Upadate all parameters set at Reactor Unload signature *
ReactNo = Parms[1,@RM]
@ -115,6 +124,9 @@ end
* otParms = FieldStore(otParms,@RM,4,0,RSRec)
* obj_Tables('WriteRec',otParms)
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN

View File

@ -20,9 +20,9 @@ COMPILE FUNCTION obj_React_Status(Method,Parms)
#pragma precomp SRP_PreCompiler
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, Get_Property, Database_Services
DECLARE FUNCTION Error_Services, Environment_Services, Logging_Services, Override_Log_Services
DECLARE FUNCTION Error_Services, Environment_Services, Logging_Services, Override_Log_Services, GetTickCount
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Database_Services, Rlist
DECLARE SUBROUTINE Logging_Services
DECLARE SUBROUTINE Logging_Services, Mona_Services
$INSERT LOGICAL
$INSERT MSG_EQUATES
@ -43,6 +43,13 @@ LogFilename = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] :
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'CassNo' : @FM : 'RDSNo' : @FM : 'Load DTM' : @FM : 'Service' : @FM : 'Notes'
objReactStatusLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJREACTSTATUS'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJREACTSTATUS'
end
ErrTitle = 'Error in Stored Procedure "obj_React_Status"'
ErrorMsg = ''
@ -125,6 +132,9 @@ RETURN
CassLoad:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'CassLoad'
ReactNo = Parms[1,@RM]
WONo = Parms[COL2()+1,@RM]
CassNo = Parms[COL2()+1,@RM]
@ -203,12 +213,17 @@ CassLoad:
Result = IdleTime
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN
* * * * * * *
CassUnload:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'CassUnload'
ReactNo = Parms[1,@RM]
WONo = Parms[COL2()+1,@RM]
@ -271,12 +286,17 @@ CassUnload:
ErrorMsg = Error_Services('GetMessage')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN
* * * * * * *
ReactorLoad:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'ReactorLoad'
* EpiPro Reactor Load
@ -362,11 +382,16 @@ ReactorLoad:
ErrorMsg = 'Unable to read REACT_STATUS record ':ReactNo:' for update (':Method:').'
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN
* * * * * * *
ReactorUnload:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'ReactorUnload'
* EpiPro Reactor Unload
@ -432,6 +457,9 @@ ReactorUnload:
ErrorMsg = Error_Services('GetMessage')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN

View File

@ -28,11 +28,12 @@ Compile Function obj_WO_Mat(Method,Parms)
Declare Function Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, Get_Property, obj_RDS, RetStack
Declare Function Database_Services, GaN_Services, Logging_Services, Environment_Services, Signature_Services
Declare Function obj_WO_Mat, obj_WM_In, obj_WM_Out, obj_Prod_Spec, obj_Clean_Insp, obj_Calendar, obj_Popup
Declare Function Error_Services, Memberof, Datetime
Declare Function Error_Services, Memberof, Datetime, GetTickCount
Declare Subroutine Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_WO_Log, Send_Event
Declare Subroutine obj_RDS, Extract_SI_Keys, obj_Pend_Ship_Labels, obj_WO_Mat_QA, Work_Order_Services, Service_Services
Declare Subroutine obj_notes, obj_Clean_Insp, obj_Post_Log, Send_Info, obj_WO_Mat_Log, obj_SAP, obj_WO_Mat, obj_WO_Wfr
Declare Subroutine Logging_Services, Set_Property, Delete, Database_Services, SRP_Stopwatch, Material_Services
Declare subroutine Mona_Services
$Insert MSG_EQUATES
$Insert WO_MAT_EQUATES
@ -120,6 +121,13 @@ SAPFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' SetS
SAPHeaders = 'Logging DTM' : @FM : 'WOMatKey' : @FM : 'SAPBatchNo'
objSAPLog = Logging_Services('NewLog', SAPLogPath, SAPFileName, CRLF$, Comma$, SAPHeaders, '', False$, False$)
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJWOMAT'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJWOMAT'
end
IF NOT(ASSIGNED(Method)) THEN ErrorMsg = 'Unassigned parameter "Method" passed to subroutine'
IF NOT(ASSIGNED(Parms)) THEN Parms = ''
@ -634,6 +642,9 @@ RETURN
CurrStatus:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'CurrStatus'
IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM]
IF NOT(ASSIGNED(WOMatRec)) THEN WOMatRec = Parms[COL2()+1,@RM]
@ -894,6 +905,9 @@ CurrStatus:
IF Result = 'RTS' AND WOMatRec<WO_MAT_SHIP_HOLD$> = 1 THEN Result = 'SHOLD'
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN
@ -5566,3 +5580,4 @@ ExpCOA:
RETURN

View File

@ -17,9 +17,9 @@ COMPILE FUNCTION obj_WO_Mat_Log(Method,Parms)
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box, NextKey, Popup, Get_Property, obj_RDS, Database_Services
Declare function Logging_Services, Environment_Services, RTI_CreateGUID, Error_Services, Datetime
Declare function Logging_Services, Environment_Services, RTI_CreateGUID, Error_Services, Datetime, GetTickCount
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, Send_Dyn, RList, obj_WO_Log, Send_Event, obj_RDS
DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, Logging_Services, Database_Services, Lot_Event_Services
DECLARE SUBROUTINE obj_WO_Mat, Send_Info, obj_Notes, Logging_Services, Database_Services, Lot_Event_Services, Mona_Services
$INSERT MSG_EQUATES
$INSERT WO_MAT_LOG_EQUATES
@ -49,6 +49,13 @@ Headers = 'Logging DTM'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJWOMATLOG'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJWOMATLOG'
end
ErrTitle = 'Error in Stored Procedure "obj_WO_Mat_Log"'
ErrorMsg = ''
@ -77,6 +84,8 @@ RETURN Result
* * * * * * *
Create:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'Create'
LogFile = Parms[1,@RM]
TransDTM = Parms[COL2()+1,@RM]
@ -233,6 +242,8 @@ Create:
ErrorMsg = Error_Services('GetMessage')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN
@ -364,3 +375,4 @@ Post:
RETURN

View File

@ -15,8 +15,9 @@ COMPILE FUNCTION obj_WO_React(Method,Parms)
*/
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, obj_WO_Mat_QA
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, RList, ErrMsg, Btree.Extract, obj_WO_Mat_QA
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, obj_WO_Mat_QA, GetTickCount
Declare function Environment_Services
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, RList, ErrMsg, Btree.Extract, obj_WO_Mat_QA, Mona_Services
$INSERT MSG_EQUATES
$INSERT WO_REACT_EQUATES
@ -24,6 +25,7 @@ $INSERT PRS_STAGE_EQUATES
$INSERT WO_MAT_EQUATES
$INSERT RDS_EQUATES
$INSERT QA_MET_EQUATES ;* Used in GetQAMet data structure return variable
$Insert LOGICAL
ErrTitle = 'Error in Stored Procedure "obj_PRS_Prop"'
@ -40,6 +42,13 @@ END
Result = ''
Log = ''
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_OBJWOREACT'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_OBJWOREACT'
end
BEGIN CASE
CASE Method = 'AddRdsNo' ; GOSUB AddRdsNo
CASE Method = 'RemRdsNo' ; GOSUB RemRdsNo
@ -61,6 +70,9 @@ RETURN Result
AddRdsNo:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'AddRdsNo'
WONo = Parms[1,@RM]
StepNo = Parms[COL2()+1,@RM]
ReactNo = Parms[COL2()+1,@RM]
@ -135,6 +147,9 @@ obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REA
Result = Log
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN
@ -143,6 +158,9 @@ RETURN
RemRDSNo:
* * * * * * *
StartTick = GetTickCount()
MetricName = 'RemRDSNo'
WONo = Parms[1,@RM]
StepNo = Parms[COL2()+1,@RM]
ReactNo = Parms[COL2()+1,@RM]
@ -218,6 +236,9 @@ obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REA
Result = Log
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN

View File

@ -1,7 +1,8 @@
Compile function Override_Log_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
$insert LOGICAL
$Insert SERVICE_SETUP
$insert APP_INSERTS
$Insert OVERRIDE_LOG_EQUATES
Declare function Datetime, NextKey, Error_Services, SRP_Datetime
@ -22,9 +23,10 @@ Options OVERRIDE_TYPES = 'ROTR_BLOCK,UNSIGN,CLEAN_INSP,REACTOR_PROVE_IN,REAC
Service Create(Table, Key, OverrideUser, OverrideComment, OverrideType=OVERRIDE_TYPES, OverrideCause='')
RecKey = ''
ErrorMsg = ''
RecKey = ''
for each TableName in Table using @VM setting TablePos
RecKey<1,-1> = Nextkey('OVERRIDE_LOG')
RecKey = Nextkey('OVERRIDE_LOG')
orRec = ''
orRec<OVERRIDE_LOG_TABLE$> = Table<1, TablePos>
orRec<OVERRIDE_LOG_KEY$> = Key<1, TablePos>
@ -45,6 +47,7 @@ Service Create(Table, Key, OverrideUser, OverrideComment, OverrideType=OVERRIDE_
End Service
Service GetOverrideLogKeys(EntityId, Table, Type, User, DateTimeFrom, DateTimeTo)
If DateTimeFrom EQ '' OR Not(Num(DateTimeFrom)) Or DateTimeFrom GT DateTimeTo then
@ -77,7 +80,6 @@ Service GetOverrideLogKeys(EntityId, Table, Type, User, DateTimeFrom, DateTimeTo
Error_Services('Add', 'Error in ' : service : ' unable to open OVERRIDE_LOG dictionary.')
end
Response = keylist
end service

View File

@ -143,7 +143,7 @@ Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_
Declare subroutine Set_Status, Sleepery, Winyield, Yield, SRP_COM, QA_Services, Logging_Services, Obj_RDS
Declare subroutine Validate, obj_WO_Mat, obj_WO_Mat_Log, obj_React_Status, Record_Lock, obj_React_State, obj_Post_Log
Declare subroutine RDS_Services, obj_WO_React, RDS_React_Run, Signature_Services, SQL_Services, SRP_Stopwatch
Declare subroutine Override_Services, Reactor_Services, Lot_Services
Declare subroutine Override_Services, Reactor_Services, Lot_Services, Mona_Services
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
Declare function Min, Max, SRPSendMail, Btree.Extract, GetTickCount, HTTPClient_Services, Obj_RDS, SQL_Services
@ -177,6 +177,13 @@ LogFilename = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] :
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'CassNo' : @FM : 'RDSNo' : @FM : 'Load DTM' : @FM : 'Service' : @FM : 'Notes'
objReactStatusLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_QASERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_QASERVICES'
end
GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end
@ -229,12 +236,6 @@ Service CalculateHgCVData(Datapoints)
Min = Min(Min, DataPoint)
Max = Max(Max, DataPoint)
// Edge Mean Delta
* If Index GE 6 AND Index LE 9 then
* Delta1 = Delta1 + DataPoint
* end
* If Index GE 2 AND Index LE 5 then
* Delta2 = Delta2 + DataPoint
* end
end
// Range %
Locate Index in RangePoints using ',' setting unusedIndex then
@ -256,25 +257,15 @@ Service CalculateHgCVData(Datapoints)
EdgeMean4mm = Edge4mmSum / 4
EdgeMean10mm = Edge10mmSum / 4
If EdgeMean10mm GT 0 then
* Delta1Avg = Delta1/4
* Delta2Avg = Delta2/4
EdgeMeanDelta = ( (Edge4mmSum - Edge10mmSum) / Edge10mmSum) * 100 ; // Changed divisor to Delta2Avg to match SPC - DJS
// Range %
Range = RangeMax - RangeMin
NumRangePoints = DCount(RangePoints, ',')
RangeAvg = RangeAvg / NumRangePoints
RangePct = (Range / RangeAvg) * 100
* EdgeMeanDelta = OConv(IConv(EdgeMeanDelta, 'MD3L'), 'MD3L')
* RangePct = OConv(IConv(RangePct, 'MD3L'), 'MD3L')
end
// Average
Average = Sum / NumDataPoints
* Average = OConv(IConv(Average, 'MD3L'), 'MD3L')
* Min = OConv(IConv(Min, 'MD3L'), 'MD3L')
* Max = OConv(IConv(Max, 'MD3L'), 'MD3L')
Average = Sum / NumDataPoints
FullAvg = ''
TotalDataPoints = DCount(DataPoints, @VM)
If TotalDataPoints GT 0 then FullAvg = Sum(DataPoints)/DCount(DataPoints, @VM)
@ -361,25 +352,18 @@ Service PostROTRRequest(RDSNo)
If Flag EQ 0 then
If RequestKeyID EQ '' then
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
FinalSigComp = False$
* FinalSigComp = Signature_Services('FinalSigComp', WOMatKey)
If FinalSigComp NE True$ then
// This is a new request
RequestDate = Date()
RequestTime = Time()
RequestKeyID = RDSNo:'*':RequestDate :'*':RequestTime
RequestRow = ''
Database_Services('WriteDataRow', 'ROTR_REQUESTS', RequestKeyID, RequestRow, True$, False$, True$)
If Error_Services('NoError') then
// Log success
LogData<3> = 'Successfully posted ROTR request for ':RDSNo:'.'
Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'FQA signed for RDS ':RDSNo:' ignoring ROTR request.'
end
RequestDate = Date()
RequestTime = Time()
RequestKeyID = RDSNo:'*':RequestDate :'*':RequestTime
RequestRow = ''
Database_Services('WriteDataRow', 'ROTR_REQUESTS', RequestKeyID, RequestRow, True$, False$, True$)
If Error_Services('NoError') then
// Log success
LogData<3> = 'Successfully posted ROTR request for ':RDSNo:'.'
Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'Duplicate request found for RDS ':RDSNo:'. Request ignored.'
end
@ -510,13 +494,6 @@ Service ProcessROTRRequest(RDSNo)
Swap @FM with ',' in ResponseCopy
LogData<3> = 'ROTR Status response: ':Response
Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
* ROTRRec = ''
* ROTRRec<ROTR.REACTOR_STATUS$> = Response<1>
* ROTRRec<ROTR.REACTOR_STATUS_REASON$> = Response<2>
* ROTRRec<ROTR.REACTOR_NCR_COUNT$> = Response<3>
* ROTRRec<ROTR.REACTOR_ZERO_NCR_RUN_COUNT$> = Response<4>
* ROTRRec<ROTR.REACTOR_UCL_EXCEEDED_RUN_COUNT$> = Response<5>
* Database_Services('WriteDataRow', 'ROTR', LWICINo, ROTRRec, True$, False$, True$)
CIRec<CLEAN_INSP_ROTR_REACTOR_STATUS$> = Response<1>
CIRec<CLEAN_INSP_ROTR_REACTOR_STATUS_REASON$> = Response<2>
CIRec<CLEAN_INSP_ROTR_REACTOR_NCR_COUNT$> = Response<3>
@ -524,7 +501,6 @@ Service ProcessROTRRequest(RDSNo)
CIRec<CLEAN_INSP_ROTR_REACTOR_UCL_EXCEEDED_RUN_COUNT$> = Response<5>
// Set ROTR Update Flag to trigger CLEAN_INSP_ACTIONS routine (via BASE_MFS).
// That routine will recalculate the final ROTR status.
* CIRec<CLEAN_INSP_ROTR_UPDATE_FLAG$> = True$
Database_Services('WriteDataRow', 'CLEAN_INSP', LWICINo, CIRec, True$, False$, True$)
end else
ErrorMessage = 'Error in service ':Service:'. Failed to retrieve ROTR status. Error message: ':Error_Services('GetMessage')
@ -569,6 +545,7 @@ end service
//
//----------------------------------------------------------------------------------------------------------------------
Service GetROTRStatus(RDSKey)
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
WONo = RDSRec<RDS_WO$>
RDSCassNo = RDSRec<RDS_CASS_NO$>
@ -1218,12 +1195,7 @@ Service ProcessWaferImageRequests()
Reactor = Xlate('RDS', RDSNo, 'REACTOR', 'X')
PSN = Xlate('RDS', RDSNo, 'PROD_SPEC_ID', 'X')
// Format Wafer Number for SQL Query
WaferNo = TrimF(WaferNo)
If WaferNo < 10 then
WaferNo = '*0' : WaferNo
end else
WaferNo = '*' : WaferNo
end
WaferNo = Fmt(TrimF(WaferNo), 'R(0)#2')
Query = "DECLARE @RDS varchar(10) " |
: "DECLARE @RECIPE varchar(30) " |
: "DECLARE @WFRID varchar(10) " |
@ -1245,7 +1217,7 @@ Service ProcessWaferImageRequests()
InsertDate = InsertDTM[1, 'F ']
Year = Field(InsertDate, '/', 3, 1)
WorkWeek = 'WW':Date_Services('GetWeekNum', InsertDate)
PDFPath = WaferMapRoot:'_\':Year:'\':WorkWeek:'\':AttachmentID:'\image.pdf'
PDFPath = WaferMapRoot:'\':Year:'\':WorkWeek:'\':AttachmentID:'\image.pdf'
Set_Status(0)
PDFFile = ''
OSRead PDFFile from PDFPath then
@ -1292,100 +1264,6 @@ Service ProcessWaferImageRequests()
end service
//----------------------------------------------------------------------------------------------------------------------
// ProcessWaferImageRequests
//
// Service that attempts to process all wafer map image requests. These requests are queued in the
// WAFER_IMAGE_REQUESTS table.
//----------------------------------------------------------------------------------------------------------------------
Service ProcessWaferImageRequestsOld()
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, ServiceKeyID then
hWaferImageRequests = Database_Services('GetTableHandle', 'WAFER_IMAGE_REQUESTS')
If Error_Services('NoError') then
Sentence = 'SELECT WAFER_IMAGE_REQUESTS WITH RESPONSE_DATE EQ "" BY REQUEST_DATE BY REQUEST_TIME'
Set_Status(0)
RList(Sentence, TARGET_ACTIVELIST$, '', '', '')
EOF = False$
Loop
ReadNext RequestKeyID else EOF = True$
Until EOF
RequestDate = Field(RequestKeyID, '*', 1)
RequestTime = Field(RequestKeyID, '*', 2)
RequestTime = RequestTime / 86400
RequestTime = RequestTime[3, 5]
RequestDTM = RequestDate:'.':RequestTime
CurrDTM = Datetime()
TimeInQueue = CurrDTM - RequestDTM
If TimeInQueue LT 1 then
Lock hWaferImageRequests, RequestKeyID then
EncodedPDF = ''
ResponseBody = ''
RequestRow = Database_Services('ReadDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID)
RDSNo = RequestRow<WAFER_IMAGE_REQUESTS.RDS_NO$>
WaferNo = RequestRow<WAFER_IMAGE_REQUESTS.WAFER_NO$>
TencorRecipe = RequestRow<WAFER_IMAGE_REQUESTS.TENCOR_RECIPE$>
ReturnPDF = RequestRow<WAFER_IMAGE_REQUESTS.RETURN_PDF$>
Reactor = Xlate('RDS', RDSNo, 'REACTOR', 'X')
PSN = Xlate('RDS', RDSNo, 'PROD_SPEC_ID', 'X')
// Format Wafer Number for SQL Query
WaferNo = TrimF(WaferNo)
If WaferNo < 10 then
WaferNo = '*0' : WaferNo
end else
WaferNo = '*' : WaferNo
end
Query = "DECLARE @RDS varchar(10) " |
: "DECLARE @RECIPE varchar(30) " |
: "DECLARE @WFRID varchar(10) " |
: "SET @RDS = '":RDSNo:"' " |
: "SET @RECIPE = '":TencorRecipe:"' " |
: "SET @WFRID = '":WaferNo:"' " |
: "SELECT child.AttachmentID " |
: "FROM Metrology.dbo.TencorRunHeader header " |
: "INNER JOIN Metrology.dbo.TencorRunData child on header.id = child.headerid " |
: "WHERE header.rds = @RDS and header.recipe like @RECIPE + '%' and child.slot = @WFRID " |
: "ORDER BY header.insertDate DESC, child.slot ASC"
WaferMapDB = Environment_Services('GetMetrologyProductionPath')
AttachmentID = SQL_Services('GetDataRows', 'SPC', Query)
AttachmentID = SRP_Trim(AttachmentID, 'FB', '{}')
WaferMapRoot = Environment_Services('GetWaferMapProductionPath')
PDFPath = WaferMapRoot:'\':AttachmentID:'\image.pdf'
Set_Status(0)
PDFFile = ''
OSRead PDFFile from PDFPath then
// "Cache" PDF on app server
QA_Services('PostToWaferImageQueue', RDSNo, WaferNo, TencorRecipe, PDFFile)
If ReturnPDF EQ True$ then
ResponseBody = SRP_Encode(PDFFile)
RequestRow<WAFER_IMAGE_REQUESTS.RESPONSE_BODY$> = ResponseBody
RequestRow<WAFER_IMAGE_REQUESTS.RESPONSE_DATE$> = Date()
RequestRow<WAFER_IMAGE_REQUESTS.RESPONSE_TIME$> = Time()
Database_Services('WriteDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID, RequestRow, True$)
end else
Database_Services('DeleteDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID, True$)
end
end else
ErrorCode = Status()
Error_Services('Add', 'Error retrieving wafer map image for AttachmentID ':AttachmentID)
end
Unlock hWaferImageRequests, RequestKeyID else Null
end
end else
// Delete request because wafer image may never become available.
Database_Services('DeleteDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID, True$)
end
Repeat
end
Unlock hSysLists, ServiceKeyID else Null
end
end service
//----------------------------------------------------------------------------------------------------------------------
// PostToWaferImageQueue
//
@ -1753,9 +1631,7 @@ Service ROTRImpactReport()
column = OleGetProperty( xlSht, 'Range' , 'K:K' )
OlePutProperty( column , 'ColumnWidth' , '15' )
OlePutProperty( column , 'NumberFormat' , '0.0%' )
end
end
end service
@ -1802,6 +1678,8 @@ end service
// False$ otherwise.
//----------------------------------------------------------------------------------------------------------------------
Service PreEpiSignatureReady(RDSNo, Username, WaferQty, Reactor)
StartTick = GetTickCount()
MetricName = 'PreEpiSignatureReady'
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') or (Reactor EQ '') then
ErrorMessage = 'RDSNo, Username, WaferQty, or Reactor not supplied in the ':Service:' service.'
@ -1900,6 +1778,8 @@ Service PreEpiSignatureReady(RDSNo, Username, WaferQty, Reactor)
Response = False$
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -1916,6 +1796,8 @@ end service
// Reponse - True$ if PRE stage was successfully signed, False$ otherwise.
//----------------------------------------------------------------------------------------------------------------------
Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
StartTick = GetTickCount()
MetricName = 'SignPreEpiStage'
Error_Services('Clear')
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') or (Reactor EQ '') then
@ -1967,71 +1849,66 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
PreEpiSig = RDSRec<RDS_PRE_EPI_SIG$>
ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X')
// Removing OI_SUPERUSER wrappers to alleviate signature issues. 11/18/19 djs
* IF MemberOf(Username, 'OI_SUPERUSER') THEN
IF ReactorType NE 'EPP' THEN
IF ReactorType NE 'EPP' THEN
WOMatKey = WONo:'*':CassNo
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
WOMatSigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
SigAction = WOStep:'VER'
WOMatKey = WONo:'*':CassNo
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
WOMatSigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
SigAction = WOStep:'VER'
LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN
WOMatSig = WOMatRec<WO_MAT_SIGNATURE$,Pos>
CurrDTM = OCONV(WOMatRec<WO_MAT_SIG_DTM$,Pos>,'DT/4^HS')
END ELSE
WOMatSig = ''
END
LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN
WOMatSig = WOMatRec<WO_MAT_SIGNATURE$,Pos>
CurrDTM = OCONV(WOMatRec<WO_MAT_SIG_DTM$,Pos>,'DT/4^HS')
END ELSE
WOMatSig = ''
END
RDSSig = PreEpiSig
RDSSig = PreEpiSig
BEGIN CASE
CASE (WOMatSig EQ '') AND (RDSSig NE '')
BEGIN CASE
CASE (WOMatSig EQ '') AND (RDSSig NE '')
* Signature missing on WO_MAT
SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$>
SigTime = RDSRec<RDS_PRE_EPI_SIG_TIME$>
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:RDSSig:@RM:SigDate:' ':SigTime
* Sets VER signature
* obj_WO_Mat('SetSignature',owmParms)
errCode = ''
IF Get_Status(errCode) THEN
ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode
Error_Services('Set', ErrorMsg)
Response = False$
END else
Response = True$
end
return
* Signature missing on WO_MAT
SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$>
SigTime = RDSRec<RDS_PRE_EPI_SIG_TIME$>
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:RDSSig:@RM:SigDate:' ':SigTime
* Sets VER signature
errCode = ''
IF Get_Status(errCode) THEN
ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode
Error_Services('Set', ErrorMsg)
Response = False$
END else
Response = True$
end
return
CASE (RDSSig = '') AND (WOMatSig NE '')
CASE (RDSSig = '') AND (WOMatSig NE '')
* Signature missing on RDS
CurrDate = CurrDTM[1,' ']
CurrTime = CurrDTM[COL2()+1,' ']
RDSRec<RDS_PRE_EPI_SIG$> = WOMatSig
RDSRec<RDS_PRE_EPI_SIG_DATE$> = IConv(CurrDate, 'D')
RDSRec<RDS_PRE_EPI_SIG_TIME$> = IConv(CurrTime, 'MT')
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
Response = True$
return
* Signature missing on RDS
CurrDate = CurrDTM[1,' ']
CurrTime = CurrDTM[COL2()+1,' ']
RDSRec<RDS_PRE_EPI_SIG$> = WOMatSig
RDSRec<RDS_PRE_EPI_SIG_DATE$> = IConv(CurrDate, 'D')
RDSRec<RDS_PRE_EPI_SIG_TIME$> = IConv(CurrTime, 'MT')
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
Response = True$
return
CASE RDSSig NE '' AND WOMatSig NE ''
CASE RDSSig NE '' AND WOMatSig NE ''
ErrorMessage = 'Process Error: Pre Epi stage has already been signed.'
Error_Services('Set', ErrorMessage)
Response = False$
return
ErrorMessage = 'Process Error: Pre Epi stage has already been signed.'
Error_Services('Set', ErrorMessage)
Response = False$
return
CASE Otherwise$
Null
CASE Otherwise$
Null
END CASE
END CASE
END ;* End of check for Reactor Type
* END
END ;* End of check for Reactor Type
SigDate = OCONV( Date(), 'D2/' )
SigTime = OCONV( Time(), 'MTS' )
@ -2045,7 +1922,6 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:Username:@RM:SigDate:' ':SigTime ;* Sets VER signature
* obj_WO_Mat('SetSignature',owmParms)
IF Get_Status(errCode) THEN
ErrorMessage = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode
Error_Services('Set', ErrorMessage)
@ -2099,6 +1975,8 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
Response = False$
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -2118,6 +1996,8 @@ end service
// False$ otherwise.
//----------------------------------------------------------------------------------------------------------------------
Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOpt)
StartTick = GetTickCount()
MetricName = 'LoadSignatureReady'
Error_Services('Clear')
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then
@ -2210,16 +2090,8 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
return
end
//Added 8/18/2021 JRO - checks to make sure recipe limits aren't oos
* IF ParamOutOfSpec then
* IF Supplement NE True$ then
* ErrorMsg = 'Process Error: Recipe parameters are out of spec and no supplement has been set.'
* Error_Services('Set', ErrorMsg)
* Response = False$
* return
* end
* end
Locate True$ in ParamOutOfSpec using @VM setting oPos then
IF Supplement NE True$ then
ErrorMsg = 'Process Error: Recipe parameters are out of spec and no supplement has been set.'
Error_Services('Set', ErrorMsg)
@ -2234,13 +2106,6 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
return
end
* IF (ReactorType = 'ASM+' OR ReactorType = 'HTR') AND (LoadLockVal EQ '') THEN
* ErrorMsg = 'Process Error: Load Lock Side must be set to either Left or Right before signing.'
* Error_Services('Set', ErrorMsg)
* Response = False$
* return
* END
//Added JRO 3/16/2021
//Load Lock Required Check
LoadLockReq = Xlate('REACTOR', Reactor, REACTOR_PICK_PLACE$, 'X');
@ -2314,49 +2179,26 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
Return
END
* IF ReactorType NE 'EPP' THEN
If PreFlag EQ True$ then
// PRE and LOAD stages are being signed together. This is usually because the operator is loading a reactor
// using the barcode scanner, which attempts to sign both stages at once to save time.
Stage = 'VER'
end else
Stage = 'LOAD'
end
If PreFlag EQ True$ then
// PRE and LOAD stages are being signed together. This is usually because the operator is loading a reactor
// using the barcode scanner, which attempts to sign both stages at once to save time.
Stage = 'VER'
end else
Stage = 'LOAD'
end
If ReactorType EQ 'EPP' then
WOMatKey = ''
end else
WOMatKey = WONo:'*':CassNo
end
If ReactorType EQ 'EPP' then
WOMatKey = ''
end else
WOMatKey = WONo:'*':CassNo
end
Signature_Services('CheckSigOrder', WOMatKey, Stage, False$, RDSNo)
Signature_Services('CheckSigOrder', WOMatKey, Stage, False$, RDSNo)
If Error_Services('HasError') then
Response = False$
Return
end
! Deprecated 11/20/2019
* Set_Status(0)
* obj_WO_Mat('CheckSigOrder',WONo:'*':CassNo:@RM:WOStep:'LOAD')
* IF Get_Status(errCode) THEN
* ErrorMsg = 'Process Error: Error calling obj_WO_Mat("CheckSigOrder"). Error code: ':errCode
* Error_Services('Set', ErrorMsg)
* Response = False$
* RETURN
* END
* END ;* End of check for Epi Pro
// Deprecated in favor of stage specific supplements
* SupplAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ', 'X')
* IF (SupplAckReq EQ True$) then
* ErrorMsg = 'The RDS Supplement must be acknowledged before the load operation can be signed.'
* Error_Services('Set', ErrorMsg)
* Response = False$
* Return
* END
If Error_Services('HasError') then
Response = False$
Return
end
SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$>
SigTime = RDSrec<RDS_PRE_EPI_SIG_TIME$>
@ -2402,9 +2244,13 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
Response = False$
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service LoadExtra1stReady(RDSNo)
Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2416,9 +2262,12 @@ Service LoadExtra1stReady(RDSNo)
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$
end
end service
Service UnsignLoadExtra1stReady(RDSNo)
Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2435,7 +2284,9 @@ Service UnsignLoadExtra1stReady(RDSNo)
end service
Service LoadExtra2ndReady(RDSNo)
Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2447,9 +2298,12 @@ Service LoadExtra2ndReady(RDSNo)
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$
end
end service
Service UnsignLoadExtra2ndReady(RDSNo)
Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2463,8 +2317,10 @@ Service UnsignLoadExtra2ndReady(RDSNo)
Response = True$
end
end
end service
//----------------------------------------------------------------------------------------------------------------------
// SignLoadStage
//
@ -2478,6 +2334,8 @@ end service
// False$ otherwise.
//----------------------------------------------------------------------------------------------------------------------
Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
StartTick = GetTickCount()
MetricName = 'SignLoadStage'
Error_Services('Clear')
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then
@ -2685,6 +2543,8 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
Response = False$
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -2700,6 +2560,8 @@ end service
// False$ otherwise.
//----------------------------------------------------------------------------------------------------------------------
Service UnloadSignatureReady(RDSNo, Username, Reactor)
StartTick = GetTickCount()
MetricName = 'UnloadSignatureReady'
If (RDSNo EQ '') or (Username EQ '') or (Reactor EQ '') then
ErrorMsg = 'RDSNo or Username or Reactor not supplied in the ':Service:' service.'
@ -2749,39 +2611,17 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
end
ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X')
If ReactorType EQ 'EPP' then
WOMatKey = ''
end else
WOMatKey = WONo:'*':CassNo
end
* IF ReactorType NE 'EPP' THEN
If ReactorType EQ 'EPP' then
WOMatKey = ''
end else
WOMatKey = WONo:'*':CassNo
end
Signature_Services('CheckSigOrder', WOMatKey, 'UNLOAD', RDSNo)
If Error_Services('HasError') then
Response = False$
return
end
* END ELSE
*
* ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
* LOCATE 'LWI' IN ReactRunRec<REACT_RUN_CI_STAGE$> USING @VM SETTING Pos THEN
* CINo = ReactRunRec<REACT_RUN_CI_NO$>
* Actions = obj_Clean_Insp('GetActions',CINo)
* LOCATE 'Inspection' IN Actions<ACTION$ACTIONS> USING @FM SETTING Pos THEN
* IF Actions<ACTION$SIGS,1> = '' THEN
* ErrorMsg = 'Process Error: A Wafer Inspection is required and has not been completed.'
* Error_Services('Set', ErrorMsg)
* Response = False$
* return
* END
* END
* END
*
* END ;* End of check for EpiPRO (EPP) reactor type
Signature_Services('CheckSigOrder', WOMatKey, 'UNLOAD', RDSNo)
If Error_Services('HasError') then
Response = False$
return
end
LWIInstAckReq = Xlate('RDS', RDSNo, 'LWI_INST_ACK_REQ', 'X')
If LWIInstAckReq EQ True$ then
@ -2799,7 +2639,6 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
return
end
! Todo: We will have to define special logic for the barcode application to handle extra loads and unloads.
* Check for extra unloads without corresponding extra load
IF RDSRec<RDS_OP_OUT_EX1_DATE$> <> '' THEN
IF RDSRec<RDS_OP_IN_EX2_DATE$> = '' THEN
@ -2869,9 +2708,13 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
Response = False$
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service UnloadExtra1stReady(RDSNo)
Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2883,9 +2726,12 @@ Service UnloadExtra1stReady(RDSNo)
If StandardLoadSignature NE '' AND UnloadExtra1Signature EQ '' AND LoadExtra1Signature EQ '' AND UnloadExtra2Signature EQ '' And LoadExtra2Signature eq '' and StandardUnloadSignature EQ '' then
Response = True$
end
end service
Service UnloadExtra2ndReady(RDSNo)
Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2897,9 +2743,12 @@ Service UnloadExtra2ndReady(RDSNo)
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$
end
end service
Service UnsignUnloadExtra1stReady(RDSNo)
Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2916,7 +2765,9 @@ Service UnsignUnloadExtra1stReady(RDSNo)
end service
Service UnsignUnloadExtra2ndReady(RDSNo)
Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2930,6 +2781,7 @@ Service UnsignUnloadExtra2ndReady(RDSNo)
Response = True$
end
end
end service
@ -2944,6 +2796,9 @@ end service
// Response - True$ if UNLOAD stage was successfully signed , False$ otherwise.
//----------------------------------------------------------------------------------------------------------------------
Service SignUnloadStage(RDSNo, Username, ScanEntry)
StartTick = GetTickCount()
MetricName = 'SignUnloadStage'
If (RDSNo EQ '') or (Username EQ '') then
ErrorMsg = 'RDSNo or Username not supplied in the ':Service:' service.'
Error_Services('Add', ErrorMsg)
@ -3016,7 +2871,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
* 4/30/2013 JCH added parms for merging of two methods
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'UNLOAD':@RM:Username:@RM:SigDt:' ':SigTm:@RM:ReactID:@RM:ReactWH:@RM:ReactLoc:@RM:Tag
* obj_WO_Mat('SetSignature',owmParms)
IF Get_Status(errCode) THEN
ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within the ':Service:' service'
@ -3050,9 +2904,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
obj_React_Status('CassUnload',Reactor:@RM:WONo:@RM:CassNo:@RM:UnloadDTM:@RM:RDSNo)
IF Get_Status(errCode) THEN
* ErrorMsg = 'Process Error: Error calling Obj_React_Status("CassUnload") within the ':Service:' service'
* Error_Services('Add', ErrorMsg)
* Response = False$
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @User4
@ -3068,7 +2919,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
InCassettes = RDSRec<RDS_IN_CASS_NO$>
InCassettes = SRP_Array('Clean', InCassettes, 'TrimAndMakeUnique', @VM)
obj_React_Status('ReactorUnload',Reactor:@RM:WONo:@RM:InCassettes:@RM:UnloadDTM:@RM:RDSNo)
//Reactor_Services('IncrementWfrMetrics', RDSNo)
end
RDSRec<RDS_OPERATOR_OUT$> = SigBy
@ -3141,6 +2991,8 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
Response = False$
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -3475,97 +3327,9 @@ Service SignFQAStage(RDSNo, Username)
NEXT Index
END
**********************************************
* Verify the FlatFinder information *
**********************************************
EpiPartNo = {EPI_PART_NO}
WaferSize = Xlate('EPI_PART', EpiPartNo, 'SUB_WAFER_SIZE', 'X')
WaferSizeInch = Field(WaferSize, ' ', 3, 1)
CustNo = {CUST_NO}
CompanyRow = Xlate('COMPANY', CustNo, '', 'X')
WafersOut = {WFRS_OUT}
Begin Case
Case WaferSizeInch = '6'
WaferFlatSizeInches = CompanyRow<COMPANY_WAFER_FLAT_WAFER_SIZE_INCH$>
WaferFlatLengthMins = Oconv(CompanyRow<COMPANY_WAFER_FLAT_LENGTH_MIN$>, 'MD1')
WaferFlatLengthMaxes = Oconv(CompanyRow<COMPANY_WAFER_FLAT_LENGTH_MAX$>, 'MD1')
Locate WaferSizeInch in WaferFlatSizeInches using @VM setting vPos then
WaferFlatLengthMin = WaferFlatLengthMins<0, vPos>
WaferFlatLengthMax = WaferFlatLengthMaxes<0, vPos>
end else
WaferFlatLengthMin = ''
WaferFlatLengthMax = ''
end
// Get FlatFinder Read Value
* FlatFinderWafersQty = {FLATFINDER_WAFER_CNT}
FlatFinderWaferLength = {FLATFINDER_FLAT_LENGTH}
***************************************
* FlatFinder - Wafers Quatity Section *
***************************************
* If (FlatFinderWafersQty NE '') then
* If (FlatFinderWafersQty NE WafersOut) then
* ErrorMsg = 'Unable to sign FQA because Flat Finder and Wafers Out quantities do not match.'
* Error_Services('Add', ErrorMsg)
* return
* end
* end else
* ErrorMsg = 'Unable to sign FQA because the Flat Finder quantity is missing.'
* Error_Services('Add', ErrorMsg)
* return
* end
************************************
* FlatFinder - Flat Length Section *
************************************
If (WaferFlatLengthMin NE '') AND (WaferFlatLengthMax NE '') then
If (FlatFinderWaferLength NE '') then
If (FlatFinderWaferLength GE WaferFlatLengthMin) AND (FlatFinderWaferLength LE WaferFlatLengthMax) then
end else
ErrorMsg = 'Unable to sign FQA because Flat Finder wafer lengths are out of bounds.'
Error_Services('Add', ErrorMsg)
return
end
end else
ErrorMsg = 'Unable to sign FQA because the Flat Finder wafer length is missing.'
Error_Services('Add', ErrorMsg)
return
end
end
Case WaferSizeInch = '8'
// Get NotchFinder Read Value
* NotchFinderWafersQty = {FLATFINDER_WAFER_CNT}
*
* ***************************************
* * NotchFinder - Wafers Quatity Section *
* ***************************************
* If (NotchFinderWafersQty NE '') then
* If (NotchFinderWafersQty NE WafersOut) then
* ErrorMsg = 'Unable to sign FQA because Notch Finder and Wafers Out quantities do not match.'
* Error_Services('Add', ErrorMsg)
* return
* end
* end else
* ErrorMsg = 'Unable to sign FQA because the Notch Finder quantity is missing.'
* Error_Services('Add', ErrorMsg)
* return
* end
Case 1
End Case
*************************
* Verify Wafer Quantity *
*************************
! The barcode application will need to inform the user that an override is required. We will return an error for
! now. Once the user is informed, a LEAD or SUPERVISOR can scan their badge to override and complete the scan.
CassSchedWafers = {CASS_SHIP_QTY}
WafersOut = {WFRS_OUT}
@ -3585,23 +3349,18 @@ Service SignFQAStage(RDSNo, Username)
end
*********************************
* Verify NCR total >= USL Fails *
*********************************
! The barcode application will need to inform the user that an override is required. We will return an error for
! now. Once the user is informed, a LEAD or SUPERVISOR can scan their badge to override and complete the scan.
If Username EQ 'FRANCOIS_R' then
NCRStatus = QA_Services('GetNCRStatus', RDSNo)
If NCRStatus EQ False$ then
If NOT( MemberOf(Username, 'LEAD') OR MemberOf(Username, 'SUPERVISOR') ) then
ErrorMsg = 'Unable to sign FQA because the total quantity of NCR wafers is less than the '|
: 'number of wafers above the USL threshold. A lead or supervisor must override.'
Error_Services('Add', ErrorMsg)
return
end
end
end
NCRStatus = QA_Services('GetNCRStatus', RDSNo)
If NCRStatus EQ False$ then
If NOT( MemberOf(Username, 'LEAD') OR MemberOf(Username, 'SUPERVISOR') ) then
ErrorMsg = 'Unable to sign FQA because the total quantity of NCR wafers is less than the '|
: 'number of wafers above the USL threshold. A lead or supervisor must override.'
Error_Services('Add', ErrorMsg)
return
end
end
*************************
* Verify if Shift exist *
@ -3663,21 +3422,19 @@ Service SignFQAStage(RDSNo, Username)
Next Test
******************************************
* Verify Unload Stage QA Metrology Tests * On hold until approved for release to production
* Verify Unload Stage QA Metrology Tests *
******************************************
If Username EQ 'FRANCOIS_R' then
WONo = {WO}
CassNo = {CASS_NO}
WOMatQAKey = WONo : '*' : CassNo
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
OutOfSpec = Sum(OutOfSpec)
If OutOfSpec GT 0 then
ErrorMsg = 'Process Error: One or more Unload QA Metrology results are out of specification.'
Error_Services('Add', ErrorMsg)
return
end
end
WONo = {WO}
CassNo = {CASS_NO}
WOMatQAKey = WONo : '*' : CassNo
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
OutOfSpec = Sum(OutOfSpec)
If OutOfSpec GT 0 then
ErrorMsg = 'Process Error: One or more Unload QA Metrology results are out of specification.'
Error_Services('Add', ErrorMsg)
return
end
*******************************************
* Verify if all steps have been completed *
@ -3750,8 +3507,6 @@ Service SignFQAStage(RDSNo, Username)
;* 4/30/2013 JCH added parms for merging of two methods
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'QA':@RM:Username:@RM:SigDt:' ':SigTm:@RM:ToolID:@RM:WHCd:@RM:LocCd:@RM:Tag
* obj_WO_Mat('SetSignature',owmParms) ; * * * * * S I G N A T U R E * * * * * *
IF Get_Status(errCode) THEN
ErrorMsg = 'Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode
Error_Services('Add', ErrorMsg)
@ -3888,3 +3643,4 @@ ClearCursors:
return

View File

@ -254,26 +254,23 @@ Event SIGN_BUTTON.CLICK()
end
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
If WCCheckEnabled then
****************************************
* Verify the Wafer Counter information *
****************************************
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
****************************************
* Verify the Wafer Counter information *
****************************************
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
*************************************
* Wafer Counter - Quantity Section *
*************************************
If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersOut) then
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Out quantities do not match.')
RETURN 0
end
end else
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
*************************************
* Wafer Counter - Quantity Section *
*************************************
If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersOut) then
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Out quantities do not match.')
RETURN 0
end
end else
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
RETURN 0
end
***********************************
@ -446,26 +443,21 @@ Event SIGN_BUTTON.CLICK()
******************************************
* Verify Unload Stage QA Metrology Tests *
******************************************
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
If (DevelopmentFlag EQ True$) then
WONo = Get_Property(@WINDOW:'.WO','DEFPROP')
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
WOMatQAKey = WONo : '*' : CassNo
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
OutOfSpec = Sum(OutOfSpec)
If OutOfSpec GT 0 then
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
ErrorMsg = 'Process Error':@SVM
For each FailReason in FailReasons using @VM
ErrorMsg := FailReason:CRLF$
Next FailReason
ErrMsg(ErrorMsg)
Return
end
end
WONo = Get_Property(@WINDOW:'.WO','DEFPROP')
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
WOMatQAKey = WONo : '*' : CassNo
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
OutOfSpec = Sum(OutOfSpec)
If OutOfSpec GT 0 then
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
ErrorMsg = 'Process Error':@SVM
For each FailReason in FailReasons using @VM
ErrorMsg := FailReason:CRLF$
Next FailReason
ErrMsg(ErrorMsg)
Return
end
*******************************************
* Verify if all steps have been completed *

View File

@ -84,6 +84,7 @@ $Insert NOTIFICATION_EQUATES
$Insert DICT_EQUATES
$Insert COMPANY_EQUATES
$Insert RETURN_TO_FAB_LOTS_EQUATES
$Insert TEST_RUN_EQUATES
EQU COL$LSID TO 1
EQU COL$RECIPE TO 2
@ -114,7 +115,7 @@ AutoDisplayErrors = FALSE$ ; // Set this to True$ when debugging so all erro
Declare subroutine SRP_Stopwatch, Error_Services, obj_Tables, Metrology_Services, obj_RDS_Test, SRP_JSON, Logging_Services
Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_SI_Keys, Obj_WO_Mat, Obj_WO_Mat_Log
Declare subroutine Dialog_Box, Obj_Notes, RList, Set_Status, Errmsg, Obj_React_Status , Reactor_Services
Declare subroutine Rds_Services, Obj_Post_Log
Declare subroutine Rds_Services, Obj_Post_Log, Mona_Services
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
Declare function Memberof, Obj_WO_Mat, Obj_WO_Mat_Log, SRP_Array, DateTime, Dialog_Box, obj_Prod_Spec
@ -130,6 +131,13 @@ Headers = 'Logging DTM':@FM:'Ctrl':@FM:'Load/Calculate Time'
objCtrlLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, COMMA$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_RDSSERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_RDSSERVICES'
end
GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end
@ -225,6 +233,8 @@ End Service
// to an RDS record.
//----------------------------------------------------------------------------------------------------------------------
Service AddComment(RDSNo, Comment, UsernameOpt)
StartTick = GetTickCount()
MetricName = 'AddComment'
RDSRow = Database_Services('ReadDataRow', 'RDS', RDSNo)
Username = @USER4
@ -247,6 +257,8 @@ Service AddComment(RDSNo, Comment, UsernameOpt)
oblParms := "TOP" :@VM: "TOP" :@VM: "TOP"
obj_Post_Log('Create',oblParms)
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
End Service
@ -749,6 +761,9 @@ Service IsValidSubLot(RDSNo, RDSType, SupplierLot)
end service
Service GetRDSRunHistoryByReactorAndWO(ReactorNo, WO)
StartTick = GetTickCount()
MetricName = 'GetRDSRunHistoryByReactorAndWO'
table = "RDS"
ErrorMessage = ''
RDSRecords = ''
@ -782,10 +797,16 @@ Service GetRDSRunHistoryByReactorAndWO(ReactorNo, WO)
end
Next RDS
Response = FinalRDSSortedByAssignmentDTM<1>
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service IsTWLoggingReqd(RDSNo)
StartTick = GetTickCount()
MetricName = 'IsTWLoggingReqd'
IsTWReqd = False$
ExistingTWRuns = Test_Run_Services('GetTestRunKeysByRDS', RDSNo)
If ExistingTWRuns EQ '' then
@ -808,7 +829,7 @@ Service IsTWLoggingReqd(RDSNo)
Layer = Field(PRSPropKey, '*', 2)
MeasureFreq = PRSPropRec<PRS_PROP_FREQ$>
Start = PRSPropRec<PRS_PROP_MET_START$>
If WaferType NE 'Product' AND WaferType NE 'Prod' then
If WaferType NE 'Product' AND WaferType NE 'Prod' AND WaferType NE '' then
BEGIN CASE
CASE MeasureFreq = 'F' AND ThisReactorRunOrder = 1 ; IsTWReqd = 1
CASE ThisReactorRunOrder = Start ; IsTWReqd = 1
@ -846,6 +867,30 @@ Service IsTWLoggingReqd(RDSNo)
IsTWReqd = False$
end
Response = IsTWReqd
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service TestWaferRanAfterLoad(RDSNo)
TestWaferRanAfterLoad = False$
TestWaferKeys = Test_Run_Services('GetTestRunKeysByRDS', RDSNo)
for each Key in TestWaferKeys using @VM
TestWaferDtm = Xlate('TEST_RUN', Key, TEST_RUN_RUN_DTM$, 'X')
TestWaferDate = SRP_DateTime('Date', TestWaferDtm)
TestWaferTime = SRP_DateTime('Time', TestWaferDtm)
RdsDateIn = Xlate('RDS', RDSNo, RDS_DATE_IN$, 'X')
RdsTimeIn = Xlate('RDS', RDSNo, RDS_TIME_IN$, 'X')
TestWaferRanAfterLoad = TestWaferDate > RdsDateIn
If TestWaferRanAfterLoad EQ False$ then
TestWaferRanAfterLoad = (TestWaferDate EQ RdsDateIn) and TestWaferTime GT RdsTimeIn
end
Until TestWaferRanAfterLoad EQ True$
Next Key
Response = TestWaferRanAfterLoad
end service
//----------------------------------------------------------------------------------------------------------------------
@ -1077,6 +1122,8 @@ end service
Service CopyRDSLayerParameters(RDSNo)
StartTick = GetTickCount()
MetricName = 'CopyRDSLayerParameters'
If (RDSNo NE '') then
RunOrderNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X')
@ -1129,6 +1176,8 @@ Service CopyRDSLayerParameters(RDSNo)
Error_Services('Add', 'RDSNo not supplied in ':Service:' service.')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -1805,3 +1854,6 @@ return

View File

@ -277,6 +277,7 @@ Event PUB_SIGN.CLICK()
end
If (Valid EQ True$) then
ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X')
ErrMsg = ''
If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then
WoMatKey = WONo:'*':CassNo
IsLastCassetteInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey)
@ -298,26 +299,44 @@ Event PUB_SIGN.CLICK()
WoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey)
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = True$
Message = ''
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
Message = 'No material scheduled. Test wafer required.'
end else if NextEventHasSamePsn EQ False$ then
Message = 'Next work order is a NEW PSN number. Test wafer required.'
TestWaferRanSinceLoad = WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$>
If TestWaferRanSinceLoad NE True$ then
TestWaferRanSinceLoad = Rds_Services('TestWaferRanAfterLoad', RDSNo)
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
If TestWaferRanSinceLoad NE True$ then
Message = ''
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
Message = 'No material scheduled. Test wafer required.'
end else if NextEventHasSamePsn EQ False$ then
Message = 'Next work order is a NEW PSN number. Test wafer required.'
end
Message_Box(@Window, Message, "Test Wafer Required", MSG_BTN_OK$ + MSG_ICON_EXCLAM$)
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : '' : @VM : 'REACTOR' : @VM : Reactor)
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TWLogResult
If TWLogResult NE True$ then
ErrMsg = 'Unload blocked! You must run a test wafer before signing the unload'
end
end
end
MesageAcked = Message_Box(@Window, Message, "Test Wafer Required", MSG_BTN_OK$ + MSG_ICON_EXCLAM$)
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$> = True$
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
ConfirmNote = 'Test wafer requirement acknowledged. [RDS:' : RDSNo : '], [WO:' : WONo : '], [Cassette:' : CassNo : ']'
Reactor_Log_Services('AddComment', Reactor, ConfirmNote, @User4)
end
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
end
end
end
QA_Services('SignUnloadStage', RDSNo, @User4)
If ErrMsg NE '' then
Error_Services('Add', ErrMsg)
end
If Error_Services('NoError') then
QA_Services('SignUnloadStage', RDSNo, @User4)
end
end
end
If Error_Services('HasError') then
@ -446,3 +465,4 @@ return

View File

@ -62,24 +62,80 @@ API reactItems.HEAD
API reactItems.GET
QueryFields = HTTP_Services('GetHTTPGetString')
If Index(QueryFields, 'riType', 1) then
RIType = HTTP_Services('GetQueryField', 'riType')
If IndexC(QueryFields, 'includeNullRetireDt', 1) then
IncludeNullRetireDt = HTTP_Services('GetQueryField', 'includeNullRetireDt')
Begin Case
Case ( (IncludeNullRetireDt EQ 1) or (IncludeNullRetireDt EQ 0) )
Null
Case ( (IncludeNullRetireDt _EQC 'true') or (IncludeNullRetireDt _EQC 'yes') )
IncludeNullRetireDt = True$
Case ( (IncludeNullRetireDt _EQC 'false') or (IncludeNullRetireDt _EQC 'no') )
IncludeNullRetireDt = False$
Case Otherwise$
Error_Services('Add', 'Error in ':CurrentAPI:' API. Invalid value "':IncludeNullRetireDt:'" passed in for includeNullRetireDt.')
End Case
end else
RIType = ''
IncludeNullRetireDt = ''
end
If Error_Services('NoError') then
If IndexC(QueryFields, 'showAllDetails', 1) then
ShowAllDetails = HTTP_Services('GetQueryField', 'showAllDetails')
Begin Case
Case ( (ShowAllDetails EQ 1) or (ShowAllDetails EQ 0) )
Null
Case ( (ShowAllDetails _EQC 'true') or (ShowAllDetails _EQC 'yes') )
ShowAllDetails = True$
Case ( (ShowAllDetails _EQC 'false') or (ShowAllDetails _EQC 'no') )
ShowAllDetails = False$
Case Otherwise$
Error_Services('Add', 'Error in ':CurrentAPI:' API. Invalid value "':ShowAllDetails:'" passed in for showAllDetails.')
End Case
end else
ShowAllDetails = False$
end
If Error_Services('NoError') then
If IndexC(QueryFields, 'currStatus', 1) then
CurrStatus = HTTP_Services('GetQueryField', 'currStatus')
end else
CurrStatus = ''
end
If IndexC(QueryFields, 'riType', 1) then
RIType = HTTP_Services('GetQueryField', 'riType')
end else
RIType = ''
end
If IndexC(QueryFields, 'entryDtStart', 1) then
EntryDtStart = HTTP_Services('GetQueryField', 'entryDtStart')
end else
EntryDtStart = ''
end
If IndexC(QueryFields, 'entryDtEnd', 1) then
EntryDtEnd = HTTP_Services('GetQueryField', 'entryDtEnd')
end else
EntryDtEnd = ''
end
If IndexC(QueryFields, 'retireDtStart', 1) then
RetireDtStart = HTTP_Services('GetQueryField', 'retireDtStart')
end else
RetireDtStart = ''
end
If IndexC(QueryFields, 'retireDtEnd', 1) then
RetireDtEnd = HTTP_Services('GetQueryField', 'retireDtEnd')
end else
RetireDtEnd = ''
end
StatusCode = 200
GoSub CreateHALCollection
end else
HTTP_Services('SetResponseStatus', 400, Error_Services("GetMessage"))
end
end else
HTTP_Services('SetResponseStatus', 400, Error_Services("GetMessage"))
end
If Index(QueryFields, 'currStatus', 1 ) then
CurrStatus = Http_Services('GetQueryField', 'currStatus')
end else
CurrStatus = ''
end
If Index(QueryFields, 'showAllDetails', 1 ) then
ShowAllDetails = Http_Services('GetQueryField', 'showAllDetails')
end else
ShowAllDetails = False$
end
StatusCode = 200
GoSub CreateHALCollection
end api
@ -254,11 +310,7 @@ CreateHALCollection:
JSONCollection = ''
Abort = False$
If RIType NE '' OR CurrStatus NE '' then
ReactItems = React_Item_Services('GetReactItems', RIType, CurrStatus)
end else
ReactItems = React_Item_Services('GetAllReactItemKeys')
end
ReactItems = React_Item_Services('GetReactItems', RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStart, RetireDtEnd, IncludeNullRetireDt)
If ReactItems NE '' then
If SRP_JSON(hJSONCollection, 'New', 'Object') then
@ -304,3 +356,4 @@ CreateHALCollection:
end
return

File diff suppressed because it is too large Load Diff

View File

@ -78,7 +78,7 @@ Declare function SRP_Math, SRP_Hash, SRP_JSON, Epi_Part_Services, Schedule_Se
Declare function Logging_Services, GetCommandLine, NextKey, Reactor_Log_Services, SRP_DateTime, ole_getwebpage
Declare function Datetime, Reactor_Modes_Services, Work_Order_Services, React_Mode_NG_Services, Lsl_Users_Services
Declare function SRP_Time, Rds_Services, SRP_Fastarray, Httpclient_Services, SRP_List, Utility, Memberof, Error_Services
Declare function Nica_Orders_Services, Max, RTI_CreateGUID
Declare function Nica_Orders_Services, Max, RTI_CreateGUID, GetTickCount
// Report paths for various performance report services.
TemplatesFolder = Environment_Services('GetApplicationRootPath') : '\Reports\Scheduler\Templates\'
@ -91,6 +91,13 @@ LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_REACTORSERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_REACTORSERVICES'
end
GoToService else
end
@ -101,7 +108,7 @@ Return Response else ''
// Service Parameter Options
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options BOOLEAN = True$, False$
Options REACTORMETRIC = 'TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK', 'SUSC_WFR_CNT', 'LOWER_QUARTZ_THK', 'LOWER_QUARTZ_WFR', 'ARMS_WFR_CNT'
Options REACTORMETRIC = 'TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK', 'SUSC_WFR_CNT', 'LOWER_QUARTZ_THK', 'LOWER_QUARTZ_WFR', 'ARMS_WFR_CNT', 'EXHAUST_CHAMBER_THK'
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Services
@ -116,6 +123,8 @@ Options REACTORMETRIC = 'TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK'
//
//----------------------------------------------------------------------------------------------------------------------
Service IncrementWfrMetrics(RDSNo)
StartTick = GetTickCount()
MetricName = 'IncrementWfrMetrics'
// Get Reactor and run count details
RDSRec = Xlate('RDS', RDSNo, '', 'X', '')
@ -136,6 +145,7 @@ Service IncrementWfrMetrics(RDSNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP
If ReactorType NE 'EPP' then
@ -150,6 +160,7 @@ Service IncrementWfrMetrics(RDSNo)
If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0
If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0
If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0
If CurrExhaustThk = '' then CurrExhaustThk = 0
Begin Case
@ -161,6 +172,7 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt + 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + TargetThickness
Case ReactorType = 'HTR'
@ -176,6 +188,7 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
Case SusceptorSize = 8
// Round up
@ -192,6 +205,7 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case
@ -206,11 +220,14 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec, 1, 0, 0)
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -229,6 +246,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<1, 4> = ReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$>
ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$>
ResponseData<1, 6> = ReactorRec<REACTOR_ARMS_WFR_CNT$>
ResponseData<1, 7> = ReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
//These are the column titles to help us with API Responses
ResponseData<2, 1> = 'ReactorID'
ResponseData<2, 2> = 'SusceptorWaferCount'
@ -236,6 +254,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<2, 4> = 'TubeWaferCount'
ResponseData<2, 5> = 'TubeThickness'
ResponseData<2, 6> = 'ArmsWaferCount'
ResponseData<2, 7> = 'ExhuastChamberThickness'
Case ReactorType EQ 'HTR'
ResponseData<1, 1> = ReactorID
ResponseData<1, 2> = ReactorRec<REACTOR_SUSC_WFR_CNT$>
@ -243,6 +262,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<1, 4> = ReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$>
ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$>
ResponseData<1, 6> = ReactorRec<REACTOR_ARMS_WFR_CNT$>
ResponseData<1, 7> = ReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
//These are the column titles to help us with API Responses
ResponseData<2, 1> = 'ReactorID'
ResponseData<2, 2> = 'SusceptorWaferCount'
@ -250,6 +270,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<2, 4> = 'TubeWaferCount'
ResponseData<2, 5> = 'TubeThickness'
ResponseData<2, 6> = 'ArmsWaferCount'
ResponseData<2, 7> = 'ExhuastChamberThickness'
Case ReactorType EQ 'EPP'
ResponseData<1, 1> = ReactorID
ResponseData<1, 2> = ReactorRec<REACTOR_SUSC_WFR_CNT$>
@ -258,6 +279,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$>
ResponseData<1, 6> = ReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
ResponseData<1, 7> = ReactorRec<REACTOR_LOWER_QUARTZ_THK$>
ResponseData<1, 8> = ReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
//These are the column titles to help us with API Responses
ResponseData<2, 1> = 'ReactorID'
ResponseData<2, 2> = 'SusceptorWaferCount'
@ -266,6 +288,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<2, 5> = 'BellJarThickness'
ResponseData<2, 6> = 'LowerQuartzWaferCount'
ResponseData<2, 7> = 'LowerQuartzThickness'
ResponseData<2, 8> = 'ExhuastChamberThickness'
End Case
Response = ResponseData
end else
@ -307,6 +330,7 @@ Service DecrementWfrMetrics(RDSNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP
If ReactorType NE 'EPP' then
@ -321,6 +345,7 @@ Service DecrementWfrMetrics(RDSNo)
If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0
If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0
If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0
If CurrExhaustThk = '' then CurrExhaustThk = 0
Begin Case
@ -332,6 +357,7 @@ Service DecrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - TargetThickness
Case ReactorType = 'HTR'
@ -342,11 +368,12 @@ Service DecrementWfrMetrics(RDSNo)
ThkAddition = (WaferCount / 5) * TargetThickness
NewReactorRec<REACTOR_TUBE_BELL_JAR_THK$> = CurrTubeBellJarThk - ThkAddition
NewReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> = CurrTubeBellJarCnt - CntAddition
NewReactorRec<REACTOR_SUSC_THK$> = CurrSuscThk + ThkAddition
NewReactorRec<REACTOR_SUSC_THK$> = CurrSuscThk - ThkAddition
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - CntAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
Case SusceptorSize = 8
// Round up
@ -363,6 +390,7 @@ Service DecrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case
@ -377,6 +405,7 @@ Service DecrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case
@ -410,6 +439,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP
If ReactorType NE 'EPP' then
@ -435,6 +465,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt + 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + TargetThickness
Case ReactorType = 'HTR'
@ -450,6 +481,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
Case SusceptorSize = 8
// Round up
@ -466,6 +498,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case
@ -480,6 +513,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case
@ -513,6 +547,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP
If ReactorType NE 'EPP' then
@ -527,6 +562,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0
If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0
If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0
If CurrExhaustThk = '' then CurrExhaustThk = 0
Begin Case
@ -538,6 +574,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - TargetThickness
Case ReactorType = 'HTR'
@ -548,11 +585,12 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
ThkAddition = (WaferCount / 5) * TargetThickness
NewReactorRec<REACTOR_TUBE_BELL_JAR_THK$> = CurrTubeBellJarThk - ThkAddition
NewReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> = CurrTubeBellJarCnt - CntAddition
NewReactorRec<REACTOR_SUSC_THK$> = CurrSuscThk + ThkAddition
NewReactorRec<REACTOR_SUSC_THK$> = CurrSuscThk - ThkAddition
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - CntAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
Case SusceptorSize = 8
// Round up
@ -569,6 +607,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case
@ -583,6 +622,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case
@ -596,7 +636,7 @@ end service
// ResetWfrMetric
//
// RDSNo. - [Required]
// MetricType - [Required]('TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK', 'SUSC_WFR_CNT', 'LOWER_QUARTZ_THK', 'LOWER_QUARTZ_WFR', 'ARMS_WFR_CNT')
// MetricType - [Required]('TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK', 'SUSC_WFR_CNT', 'LOWER_QUARTZ_THK', 'LOWER_QUARTZ_WFR', 'ARMS_WFR_CNT', EXHAUST_CHAMBER_THK)
//
// Reset a specified REACTOR metric to 0.
//
@ -628,6 +668,9 @@ Service ResetWfrMetric(ReactorNo, MetricType = REACTORMETRIC)
Case MetricType = 'ARMS_WFR_CNT'
ReactorRec<REACTOR_ARMS_WFR_CNT$> = 0
Case MetricType = 'EXHAUST_CHAMBER_THK'
ReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = 0
End Case
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactorRec, 1, 0, 0)
@ -1999,16 +2042,35 @@ Service CreateReactModeChange(UserID, ReactNo, Mode, ModeSubCat, ModeText, Force
If ErrorMsg EQ '' then
AbortAlarmFeatureFlag = Xlate('FEATURE_FLAGS', 'NICA_ABORT_ALARM', FEATURE_FLAGS.ENABLED$, 'X')
If AbortAlarmFeatureFlag EQ True$ then
If IntrMaintFeatureFlag EQ True$ then
AbortAlarmFromIntrusiveMaintRequired = Nica_Orders_Services('AbortAlarmFromIntrusiveMaintRequired', ReactNo)
ActiveIntrusiveMaintChecklists = Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactNo, 'INTRUSIVE_MAINT')
IntrusiveMaintChecklistActive = (ActiveIntrusiveMaintChecklists NE '')
end else
AbortAlarmFromIntrusiveMaintRequired = False$
IntrusiveMaintChecklistActive = False$
end
ModeSubCatFlowId = Xlate('REACT_PROB_CAT', ModeSubCatId, REACT_PROB_CAT_ABORT_ALARM_FLOW_ID$, 'X')
ModeSubCatRespLvl = Xlate('REACT_PROB_CAT', ModeSubCatId, REACT_PROB_CAT_ABORT_ALARM_RESPONSE_LEVEL$, 'X')
AbortAlarmComp = Xlate('REACTOR', ReactNo, REACTOR_ABORT_ALARM_COMPLETE$, 'X')
ActiveAbortAlarmOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactNo, 'ABORT_ALARM')
AbortAlarmOrderActive = (ActiveAbortAlarmOrders NE '')
ReactorType = Xlate('REACTOR', ReactNo, REACTOR_REACT_TYPE$, 'X')
ChecklistIds = Nica_Orders_Services('GetFlowChecklistIds', ModeSubCatFlowId, 'ABORT_ALARM', ReactorType)
CreateAbortAlarmOrder = False$
Intrusive = False$
Begin Case
Case ( AbortAlarmOrderActive and (SelE10State _EQC 'Productive') )
ErrorMsg = "An ABORT/ALARM Checklist is active for this reactor and must be completed or overridden in order to change to a productive state."
Case ( AbortAlarmOrderActive and IndexC(ModeSubCat, 'ABORT/ALARM', 1) and (ModeSubCatFlowId NE '') )
Case ( AbortAlarmFromIntrusiveMaintRequired and IndexC(ModeSubCat, 'ABORT/ALARM', 1) and (ModeSubCatFlowId NE '') and (ChecklistIds NE '') )
// INTRUSIVE_MAINT FIRST_PRODUCT_RUN_THICK or FIRST_PRODUCT_RUN_HGCV checklist started and
// ABORT/ALARM mode entered, so create an ABORT/ALARM order to contain product in reactor.
CreateAbortAlarmOrder = True$
Intrusive = True$
Case ( Not(IntrusiveMaintChecklistActive) and AbortAlarmOrderActive and IndexC(ModeSubCat, 'ABORT/ALARM', 1) and (ModeSubCatFlowId NE '') )
// If there is an active ABORT/ALARM NICA order, then we need to check if the new sub mode is different than the sub mode entered when the ABORT/ALARM
// NICA order was created and is of a higher response level or the new mode is WAITING_FOR_OPERATOR and the sub mode has changed. This means the maintenance
// team deemed the true ABORT/ALARM root cause was different than the cause the operators selected.
@ -2020,26 +2082,26 @@ Service CreateReactModeChange(UserID, ReactNo, Mode, ModeSubCat, ModeText, Force
Next ActiveAbortAlarmRespLvl
If ( (Mode _EQC 'WAITING_FOR_OPERATOR') and (ModeSubCatFlowId NE ActiveAbortAlarmFlowIds) ) |
or ( (ModeSubCatFlowId NE ActiveAbortAlarmFlowIds) and (ModeSubCatRespLvl GT MaxActiveRespLvl) ) then
ReactorType = Xlate('REACTOR', ReactNo, REACTOR_REACT_TYPE$, 'X')
ChecklistIds = Nica_Orders_Services('GetFlowChecklistIds', ModeSubCatFlowId, 'ABORT_ALARM', ReactorType)
If ChecklistIds NE '' then
Nica_Orders_Services('CreateNewOrder', 'REACTOR', ReactNo, 'ABORT_ALARM', ModeSubCatFlowId, ModeSubCatRespLvl, ChecklistIds)
RlComment = 'ABORT/ALARM initiated for flow ':ModeSubCatFlowId:'.'
CreateAbortAlarmOrder = True$
end
end
Case ( Not(AbortAlarmComp) and Not(AbortAlarmOrderActive) and IndexC(ModeSubCat, 'ABORT/ALARM', 1) and (ModeSubCatFlowId NE '') )
ReactorType = Xlate('REACTOR', ReactNo, REACTOR_REACT_TYPE$, 'X')
ChecklistIds = Nica_Orders_Services('GetFlowChecklistIds', ModeSubCatFlowId, 'ABORT_ALARM', ReactorType)
If ChecklistIds NE '' then
Nica_Orders_Services('CreateNewOrder', 'REACTOR', ReactNo, 'ABORT_ALARM', ModeSubCatFlowId, ModeSubCatRespLvl, ChecklistIds)
RlComment = 'ABORT/ALARM initiated for flow ':ModeSubCatFlowId:'.'
end
Case ( Not(IntrusiveMaintChecklistActive) and Not(AbortAlarmComp) and Not(AbortAlarmOrderActive) and IndexC(ModeSubCat, 'ABORT/ALARM', 1) and (ModeSubCatFlowId NE '') and (ChecklistIds NE '') )
// Typical ABORT/ALARM case
CreateAbortAlarmOrder = True$
Case Otherwise$
// Don't create an ABORT/ALARM NICA order
Null
End Case
If CreateAbortAlarmOrder then
Nica_Orders_Services('CreateNewOrder', 'REACTOR', ReactNo, 'ABORT_ALARM', ModeSubCatFlowId, ModeSubCatRespLvl, ChecklistIds, Intrusive)
RlComment = 'ABORT/ALARM initiated for flow ':ModeSubCatFlowId:'.'
end
end
end
@ -3552,6 +3614,8 @@ end service
Service GetReactorAvailChamberCount(ReactNo)
StartTick = GetTickCount()
MetricName = 'GetReactorAvailChamberCount'
ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: '
AvailableChamberCount = 0
@ -3571,6 +3635,8 @@ Service GetReactorAvailChamberCount(ReactNo)
end
Response = AvailableChamberCount
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -4289,3 +4355,4 @@ ClearCursors:
return

View File

@ -1,10 +1,10 @@
Function REACT_ITEM_Actions(Action, CalcColName, FSList, Handle, Name, FMC, Record, Status, OrigRecord, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)
Function REACT_ITEM_ACTIONS(Action, CalcColName, FSList, Handle, Name, FMC, Record, Status, OrigRecord, Param1, Param2, Param3, Param4, Param5, Param6, Param7, Param8, Param9, Param10)
/***********************************************************************************************************************
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.
Name : RDS_Actions
Name : React_Item_Actions
Description : Handles calculated columns and MFS calls for the current table.
@ -36,39 +36,19 @@ Function REACT_ITEM_Actions(Action, CalcColName, FSList, Handle, Name, FMC, Reco
method.
History : (Date, Initials, Notes)
04/10/18 dmb Original programmer.
10/04/18 djs Added a trigger within the WRITE_RECORD event, which fires when the reactor number has
changed. When this occurs the related RDS_LAYER records for this RDS record are populated
with the most recent associated TOOL_PARMS record. (related by PSN and Reactor)
05/12/25 djs Updated WRITE_PRE action to update the CURR_STATUS_STATIC field if the retire date changes.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert FILE.SYSTEM.EQUATES
$Insert ACTION_SETUP
$Insert RDS_EQUATES
$Insert CLEAN_INSP_EQUATES
$Insert COMPANY_EQUATES
$Insert RDS_LAYER_EQUATES
$Insert TOOL_PARMS_EQUATES
$Insert RLIST_EQUATES
$Insert APP_INSERTS
$Insert QA_MET_EQUATES
$Insert PRS_STAGE_EQUATES
$Insert WO_MAT_EQUATES
$Insert WO_MAT_QA_EQUATES
Equ COMMA$ to ','
Declare function Error_Services, Database_Services, obj_RDS_Test, Logging_Services, Environment_Services, SRP_Math
Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services, obj_WO_Mat
Declare subroutine Error_Services, Database_Services, Logging_Services, Set_Status, Schedule_Services_Dev
Declare subroutine Work_Order_Services, Material_Services, Set_FSError
$Insert FILE.SYSTEM.EQUATES
$Insert REACT_ITEM_EQUATES
Declare function obj_React_Item
Declare subroutine Error_Services
If KeyID then GoSub Initialize_System_Variables
@ -109,12 +89,8 @@ CalculateColumn:
// Make sure the ActionFlow return variable is cleared in case nothing is calculated.
ActionFlow = ''
return
// ----- MFS calls -----------------------------------------------------------------------------------------------------
READ_RECORD_PRE:
@ -124,10 +100,9 @@ READ_RECORD_PRE:
// Status = 0
// Record = ''
// ActionFlow = ACTION_STOP$
return
READ_RECORD:
// In order to stop a record from being read in this action these lines of code must be used:
@ -138,6 +113,7 @@ READ_RECORD:
return
READONLY_RECORD_PRE:
// In order to stop a record from being read in this action these lines of code must be used:
//
@ -147,6 +123,7 @@ READONLY_RECORD_PRE:
// ActionFlow = ACTION_STOP$
return
READONLY_RECORD:
// In order to stop a record from being read in this action these lines of code must be used:
//
@ -155,51 +132,56 @@ READONLY_RECORD:
// Record = ''
return
WRITE_RECORD_PRE:
ErrMsg = ''
ErrMsg = ''
//Req'd parameter checks
ItemType = {RI_TYPE}
// Req'd parameter checks
ItemType = {RI_TYPE}
If ItemType EQ '' then
ErrMsg := 'Item Type was not specified. '
end
If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
If ErrMsg NE '' then
Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
OrigFileError = 104:': Error Saving Reactor Item: ' : ErrMsg
Status = 0
Record = ''
ActionFlow = ACTION_STOP$
end
If ErrMsg NE '' then
Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
OrigFileError = 104:': Error Saving Reactor Item: ' : ErrMsg
Status = 0
Record = ''
ActionFlow = ACTION_STOP$
end else
OrigRetireDt = OrigRecord<REACT_ITEM_RETIRE_DT$>
NewRetireDt = Record<REACT_ITEM_RETIRE_DT$>
OrigNotes = OrigRecord<REACT_ITEM_NOTES$>
NewNotes = Record<REACT_ITEM_NOTES$>
If ( (OrigRetireDt NE NewRetireDt) or (OrigNotes NE NewNotes) ) then
CurrStatus = obj_React_Item('CurrStatus', Name:@RM:Record)
Record<REACT_ITEM_CURR_STATUS_STATIC$> = CurrStatus
SaveRecord = Record
end
end
return
WRITE_RECORD:
return
DELETE_RECORD_PRE:
return
DELETE_RECORD:
return
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ClearCursors:
For counter = 0 to 8
ClearSelect counter
Next counter
return
@ -251,4 +233,3 @@ Restore_System_Variables:
return

View File

@ -20,62 +20,110 @@ Compile function React_Item_Services(@Service, @Params)
08/02/22 djs Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$Insert LOGICAL
$Insert APP_INSERTS
$Insert SERVICE_SETUP
$Insert RLIST_EQUATES
$Insert REACT_ITEM_EQUATES
Declare function Database_Services, Error_Services, SRP_JSON, NextKey
Declare subroutine SRP_JSON, Error_Services, Btree.Extract, Database_Services
GoToService
Declare function Database_Services, Error_Services, SRP_JSON, NextKey, SRP_Date, obj_React_Item, SRP_Array
Declare subroutine SRP_JSON, Error_Services, Btree.Extract, Database_Services, Update_Index
Return Response or ""
GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
Return Response else ''
Service GetAllReactItemKeys()
AllKeys = ''
RList('SELECT REACT_ITEM', TARGET_ACTIVELIST$, '', '', '')
Done = False$
Reactors = ''
Loop
Readnext keyId else Done = True$
Until Done
AllKeys<1,-1> = keyId
Repeat
Response = AllKeys
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Service Parameter Options
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options BOOLEAN = True$, False$
Service GetReactItems(RIType, CurrStatus)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Services
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStart, RetireDtEnd, IncludeNullRetireDt=BOOLEAN)
ErrorMsg = ''
Response = ''
Swap ',' with @VM in RIType
Swap ',' with @VM in CurrStatus
Open 'DICT.REACT_ITEM' to DictReactItem then
SearchString = ''
If RIType NE '' then SearchString := 'RI_TYPE':@VM:RIType:@FM
If CurrStatus NE '' then SearchString := 'CURR_STATUS':@VM:CurrStatus:@FM
RIKeys = ''
Btree.Extract(SearchString, 'REACT_ITEM', DictReactItem, RIKeys, '', '')
ErrCode = ''
IF Get_Status(ErrCode) then
ErrorMsg = 'Error in ':Service:' service. Error calling Btree.Extract. Error code ':ErrCode:'.'
If ( (RIType NE '') or (CurrStatus NE '') or (EntryDtStart NE '') or (EntryDtEnd NE '') or (RetireDtStart NE '') or (RetireDtEnd NE '') or (IncludeNullRetireDt NE '') ) then
If EntryDtStart NE '' and Not(Num(EntryDtStart)) then EntryDtStart = IConv(EntryDtStart, 'D')
If EntryDtEnd NE '' and Not(Num(EntryDtEnd)) then EntryDtEnd = IConv(EntryDtEnd, 'D')
If RetireDtStart NE '' and Not(Num(RetireDtStart)) then RetireDtStart = IConv(RetireDtStart, 'D')
If RetireDtEnd NE '' and Not(Num(RetireDtEnd)) then RetireDtEnd = IConv(RetireDtEnd, 'D')
Open 'DICT.REACT_ITEM' to DictReactItem then
SearchString = ''
If RIType NE '' then
Swap ',' with @VM in RIType
SearchString := 'RI_TYPE':@VM:RIType:@FM
end
Begin Case
Case ( (EntryDtStart NE '') and (EntryDtEnd NE '') )
EntryDtStart = OConv(EntryDtStart - 1, 'D4/')
EntryDtEnd = OConv(EntryDtEnd + 1, 'D4/')
SearchString := 'ENTER_DT':@VM:EntryDtStart:'~':EntryDtEnd:@FM
Case (EntryDtStart NE '')
EntryDtStart = OConv(EntryDtStart, 'D4/')
SearchString := 'ENTER_DT':@VM:'>=':EntryDtStart:@FM
Case (EntryDtEnd NE '')
SearchString := 'ENTER_DT':@VM:'<=':EntryDtEnd:@FM
Case Otherwise$
Null
End Case
Begin Case
Case ( (RetireDtStart NE '') and (RetireDtEnd NE '') )
RetireDtStart = OConv(RetireDtStart - 1, 'D4/')
RetireDtEnd = OConv(RetireDtEnd + 1, 'D4/')
SearchString := 'RETIRE_DT':@VM:RetireDtStart:'~':RetireDtEnd
If IncludeNullRetireDt then SearchString := @VM:''
SearchString := @FM
Case (RetireDtStart NE '')
RetireDtStart = OConv(RetireDtStart, 'D4/')
SearchString := 'RETIRE_DT':@VM:'>=':RetireDtStart
If IncludeNullRetireDt then SearchString := @VM:''
SearchString := @FM
Case (RetireDtEnd NE '')
SearchString := 'RETIRE_DT':@VM:'<=':RetireDtEnd
If IncludeNullRetireDt then SearchString := @VM:''
SearchString := @FM
Case IncludeNullRetireDt
SearchString := 'RETIRE_DT':@VM:'':@FM
Case Otherwise$
Null
End Case
If CurrStatus NE '' then
Swap ',' with @VM in CurrStatus
SearchString := 'CURR_STATUS_STATIC':@VM:CurrStatus:@FM
end
Flag = ''
RIKeys = ''
Btree.Extract(SearchString, 'REACT_ITEM', DictReactItem, RIKeys, 'E', Flag)
If Flag EQ 0 then
EnterDtms = Xlate('REACT_ITEM', RIKeys, 'ENTER_DTM', 'X')
Array = RIKeys:@FM:EnterDtms
Array = SRP_Array('SortRows', Array, 'DN2', 'ARRAY', @FM, @VM)
Response = Array<1>
end else
ErrorMsg = 'Error in ':Service:' service. Error calling Btree.Extract.'
end
end else
Response = RIKeys
ErrorMsg = 'Error in ':Service:' service. Error opening REACT_ITEM dictionary.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Error opening REACT_ITEM dictionary.'
AllKeys = ''
RList('SELECT REACT_ITEM', TARGET_ACTIVELIST$, '', '', '')
Done = False$
Loop
Readnext KeyId else Done = True$
Until Done
AllKeys<1, -1> = KeyId
Repeat
Response = AllKeys
end
If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg)
end
@ -155,7 +203,6 @@ Service ConvertRecordToJSON(KeyID, Record, ItemURL)
Response = jsonRecord
end service
@ -326,11 +373,11 @@ Service GetReactItemTemplateJSON()
Response = jsonRecord
end service
Service CreateReactItem(Record)
ErrMsg = ''
KeyID = ''
If Record NE '' then
@ -355,6 +402,7 @@ Service CreateReactItem(Record)
end service
Service ConvertRecordToJSONQuick(KeyID, Record, ItemURL)
jsonRecord = ''
@ -407,6 +455,32 @@ Service ConvertRecordToJSONQuick(KeyID, Record, ItemURL)
Response = jsonRecord
end service
Service UpdateReactItemStatus(RINo)
If RINo NE '' then
If RowExists('REACT_ITEM', RINo) then
RIRec = Database_Services('ReadDataRow', 'REACT_ITEM', RINo)
If Error_Services('NoError') then
Update_Index('REACT_ITEM_HIST', 'RI_NO', False$, True$)
ReactItemCurrStatus = obj_React_Item('CurrStatus', RINo:@RM:RIRec)
ReactItemCurrStatusStatic = RIRec<REACT_ITEM_CURR_STATUS_STATIC$>
If ReactItemCurrStatus NE ReactItemCurrStatusStatic then
Open 'REACT_ITEM' to hTable then
WriteV ReactItemCurrStatus on hTable, RINo, REACT_ITEM_CURR_STATUS_STATIC$ else
Error_Services('Add', 'Error in ':Service:' service. Error writing CURR_STATUS_STATIC, ':ReactItemCurrStatus:', for REACT_ITEM ':RINo:'.')
end
end else
Error_Services('Add', 'Error in ':Service:' service. Error opening REACT_ITEM table for status update.')
end
end
end
end
end
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -419,6 +493,3 @@ ClearCursors:
return

View File

@ -79,6 +79,7 @@ Service CreateReturnToFabRecord(CassId, UserId)
Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_GENERAL',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = UserId
SentFrom = 'OI_ADMIN'
Subject = 'Return To Fab Form Created'
@ -475,6 +476,7 @@ Service SetBinToBin(RTFId, MHUserId)
Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_GENERAL',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = RTFOrigUser
SentFrom = 'OI_ADMIN'
Subject = 'Return To Fab Form Updated'
@ -549,6 +551,7 @@ Service SetRTFCompleted(RTFId, CompleteUserId)
Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_GENERAL',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = RTFRecord<RETURN_TO_FAB_LOTS_REQUESTOR_USER_ID$>
SentFrom = 'OI_ADMIN'
Subject = 'Return To Fab Form Completed'
@ -623,6 +626,7 @@ Service SetEvalInfo(RTFId, EvalUserId, ResultId)
Recipients = XLATE('NOTIFICATION','SHIPPING',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_ENG',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_MANUF',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = XLATE('NOTIFICATION','RETURN_TO_FAB_GENERAL',NOTIFICATION_USER_ID$,'X')
Recipients<1, -1> = RTFRecord<RETURN_TO_FAB_LOTS_REQUESTOR_USER_ID$>
SentFrom = 'OI_ADMIN'
Subject = 'Return To Fab Form Updated'
@ -822,3 +826,4 @@ end service

View File

@ -45,9 +45,9 @@ $insert RDS_EQUATES
$insert SCAN_SETUP
Declare Function Scan_Services, Database_Services, QA_Services, Datetime, RDS_Services, SRP_Array, SRP_Stopwatch
Declare function Logging_Services, Environment_Services
Declare function Logging_Services, Environment_Services, GetTickCount
Declare Subroutine Scan_Services, Database_Services, QA_Services, obj_WO_Mat_Log, SRP_Stopwatch
Declare Subroutine Logging_Services
Declare Subroutine Logging_Services, Mona_Services
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ScanAPI\APIResponseTime'; //Define the directory where the log will be saved to. This happens the first time of the day that the log is written to.
LogDate = Oconv(Date(), 'D4/')
@ -58,6 +58,13 @@ LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : '
Headers = 'Logging DTM' : @FM : 'API' : @FM : 'ResponseTime' : @FM : 'ScanID' : @FM : 'ScanData' : @VM : 'StatusCode' ; //Define the column names in the log file, delimited by a Field Mark.
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$); //Actually creates the log.
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_SCANAPI'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_SCANAPI'
end
GoToAPI else
// The specific resource endpoint doesn't have a API handler yet.
HTTP_Services('SetResponseStatus', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
@ -72,16 +79,25 @@ Return Response OR ''
API scan.POST
StartTick = GetTickCount()
MetricName = 'SCAN_POST'
SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_POST_RESPONSE_TIME')
ScanID = Scan_Services('CreateScansRow')
If Error_Services('NoError') then
StatusCode = 201
GoSub CreateHALItem
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else
Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_POST_RESPONSE_TIME')
TotalPostResponseTime = SRP_Stopwatch('GetData', 'SCAN_POST_RESPONSE_TIME')
LogData = ''
@ -100,6 +116,9 @@ end api
API scan.ID.POST
StartTick = GetTickCount()
MetricName = 'SCAN_ID_POST'
SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_ID_POST_RESPONSE_TIME')
ScanID = EndpointSegment
@ -112,13 +131,20 @@ API scan.ID.POST
If Error_Services('NoError') then
StatusCode = 200
GoSub CreateHALItem
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else
Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 400, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end
end else
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.')
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_ID_POST_RESPONSE_TIME')
TotalPostResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_POST_RESPONSE_TIME')
LogData = ''
@ -143,11 +169,19 @@ end api
API scan.ID.HEAD
API scan.ID.GET
StartTick = GetTickCount()
MetricName = 'SCAN_ID_GET'
SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_ID_GET_RESPONSE_TIME')
ScanID = EndpointSegment
StatusCode = 200
GoSub CreateHALItem
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_ID_POST_RESPONSE_TIME')
TotalGetResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_GET_RESPONSE_TIME')
LogData = ''
@ -166,6 +200,9 @@ end api
API scan.ID.DELETE
StartTick = GetTickCount()
MetricName = 'SCAN_ID_DELETE'
SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_ID_DELETE_RESPONSE_TIME')
ScanID = EndpointSegment
@ -176,17 +213,25 @@ API scan.ID.DELETE
Database_Services('DeleteDataRow', 'SCANS', ScanID, True$, False$)
If Error_Services('NoError') then
HTTP_Services('SetResponseStatus', 200)
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else
Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end
end else
HTTP_Services('SetResponseStatus', 403, 'This scan is already accepted and cannot be deleted.')
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end
end else
Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 404, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_ID_DELETE_RESPONSE_TIME')
TotalDeleteResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_DELETE_RESPONSE_TIME')
LogData = ''
@ -205,6 +250,8 @@ end api
API scan.ID.PATCH
StartTick = GetTickCount()
MetricName = 'SCAN_ID_PATCH'
// This is where scans are ultimately accepted for final processing. We will need to determine which type
// of scan this is (i.e. Location, Pre-Epi + Load, or Unload). This will be determined by the data coming in and the
@ -232,14 +279,17 @@ API scan.ID.PATCH
If Error_Services('NoError') then
StatusCode = 200
GoSub CreateHALItem
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else
Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end
SRP_JSON(hBody, 'Release')
end else
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.')
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end
end else
ScanNotAcceptableReason = SRP_JSON(objResource, 'GetValue', 'scan.notAcceptableReason')
@ -249,11 +299,17 @@ API scan.ID.PATCH
end else
Message = 'Unable to parse the JSON scan resource.'
HTTP_Services('SetResponseStatus', 400, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end
end else
Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 404, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_ID_PATCH_RESPONSE_TIME')
TotalPatchResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_PATCH_RESPONSE_TIME')
LogData = ''
@ -272,6 +328,8 @@ end api
API scan.ID.PUT
StartTick = GetTickCount()
MetricName = 'SCAN_ID_PUT'
SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_ID_PUT_RESPONSE_TIME')
@ -314,17 +372,25 @@ API scan.ID.PUT
Database_Services('WriteDataRow', 'SCANS', ScanID, ScanRow, True$, False$, True$)
If Error_Services('NoError') then
GoSub CreateHALItem
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else
Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end
SRP_JSON(hBody, 'Release')
end else
HTTP_Services('SetResponseStatus', 400, 'Unable to parse the scanData JSON.')
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end
end else
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.')
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_ID_PUT_RESPONSE_TIME')
TotalPutResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_PUT_RESPONSE_TIME')
LogData = ''
@ -339,7 +405,6 @@ API scan.ID.PUT
end
LogData<6> = ResponseStatusCode
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
end api
@ -378,3 +443,4 @@ CreateHALItem:
end
return

View File

@ -47,9 +47,10 @@ Declare Function Scan_Services, Memory_Services, Database_Services, SRP_JSON,
Declare Function QA_Services, Error_Services, Security_Services, SRP_Array, obj_WO_Mat, Memberof, Override_Log_Services
Declare Function Keyboard_Sim_Services, Environment_Services, Logging_Services, Reactor_Services, Supplement_Services
Declare function Test_Run_Services, Lot_Services, WO_MAT_Services, Reactor_Log_Services, Schedule_Services
Declare function GetTickCount
Declare Subroutine Scan_Services, Memory_Services, Database_Services, SRP_JSON, QA_Services, Error_Services
Declare Subroutine obj_WO_Mat_Log, Tool_Parms_Services, RDS_Services, Logging_Services, Supplement_Services
Declare Subroutine Test_Run_Services, WO_MAT_Services, Reactor_Log_Services, Schedule_Services
Declare Subroutine Test_Run_Services, WO_MAT_Services, Reactor_Log_Services, Schedule_Services, Mona_Services
Equ CRLF$ to \0D0A\
@ -61,6 +62,13 @@ Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'User' : @FM : 'CurrSta
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_SCANSERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_SCANSERVICES'
end
GoToService else
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.')
end
@ -200,6 +208,8 @@ end service
// Returns the database row from the SCANS table for the indicated Scan ID. The default format is MultiValue.
//----------------------------------------------------------------------------------------------------------------------
Service GetScansRow(ScanID, ReturnJSON)
StartTick = GetTickCount()
MetricName = 'GetScansRow'
ScansRow = ''
@ -214,6 +224,8 @@ Service GetScansRow(ScanID, ReturnJSON)
Response = ScansRow
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -223,6 +235,8 @@ end service
// Returns the database row from the SCANS table for the indicated Scan ID. The default format is MultiValue.
//----------------------------------------------------------------------------------------------------------------------
Service SetScansRow(ScanID, ScansRow)
StartTick = GetTickCount()
MetricName = 'SetScansRow'
If (ScanID NE '') AND (ScansRow NE '') then
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow)
@ -230,6 +244,8 @@ Service SetScansRow(ScanID, ScansRow)
Error_Services('Add', 'ScanID or ScansRow argument was missing in the ' : Service : ' service.')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -242,6 +258,8 @@ end service
// evaluated on a case by case basis.
//----------------------------------------------------------------------------------------------------------------------
Service ProcessScanData(ScanID, ScanJSON)
StartTick = GetTickCount()
MetricName = 'ProcessScanData'
If ( (ScanID NE '') AND (ScanJSON NE '') ) then
hScanJSON = ''
@ -335,6 +353,18 @@ Service ProcessScanData(ScanID, ScanJSON)
Error_Services('Add', 'Inactive employee.')
Case Otherwise$
ScansRow<SCANS.EMPLOYEE_ID$> = {EMPLOYEE_ID}
Username = {EMPLOYEE_ID}
Member = False$
Groups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH':@VM:'ROTR_OVERRIDE'
For each Group in Groups using @VM
Member = MemberOf(Username, Group)
Until Member EQ True$
Next Group
ScansRow<SCANS.IS_AUTHORIZED_TO_OVERRIDE_ROTR$> = Member
End Case
Case ScanData[1, 3] EQ '10S'
@ -520,6 +550,9 @@ Service ProcessScanData(ScanID, ScanJSON)
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
ScansRow<SCANS.OVERRIDE_REQD$> = 0
ScansRow<SCANS.OVERRIDE_TYPE$> = ''
ScansRow<SCANS.OVERRIDE_REASON$> = ''
ScansRow<SCANS.EMPLOYEE_ID$>= ''
Result = 'Override Performed successfully'
end
@ -652,6 +685,7 @@ Service ProcessScanData(ScanID, ScanJSON)
If (CassetteIDs NE '') then
TestWaferLotData = ScansRow<SCANS.TW_LOT_ID$>
Abort = False$
TestWaferLotIsValid = False$
If TestWaferLotData NE '' then
ThisTestRunType = ScansRow<SCANS.TEST_RUN_TYPE_ID$>
If ThisTestRunType NE '' then
@ -667,6 +701,8 @@ Service ProcessScanData(ScanID, ScanJSON)
If Not(TWLotCurrOpen) then
Abort = True$
Scan_Services('AddNotAcceptableReason', 'Lot ':TWLot:' is closed and cannot be used at this time.')
end else
TestWaferLotIsValid = True$
end
end else
Abort = True$
@ -1090,6 +1126,60 @@ Service ProcessScanData(ScanID, ScanJSON)
Case Otherwise$
// Keep error on Error_Services stack and return 400 level error.
End Case
end else
ReactorNo = Xlate('RDS', RDSNo, RDS_REACTOR$, 'X')
ReactorType = Xlate('REACTOR', ReactorNo, REACTOR_REACT_TYPE$, 'X')
If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then
WO = Xlate('RDS', RDSNo, RDS_WO$, 'X')
CassNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X')
WoMatKey = WO:'*':CassNo
WoMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey)
LastCassInWoTestWaferAckReq = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$>
LastCassInWoTestWaferAcked = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$>
LastCassInWoTestWaferReqMsg = ''
If LastCassInWoTestWaferAcked EQ False$ or LastCassInWoTestWaferAcked EQ '' then
LastCassInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey)
If LastCassInWo then
NextEventScheduled = False$
NextEventHasSamePsn = True$
NextEventIsBlock = False$
NextScheduledEvent = Schedule_Services('GetNextEvent', ReactorNo)
If Error_Services('NoError') then
NextEventScheduled = True$
NextEventHasSamePsn = Schedule_Services('NextEventIsSamePsn', ReactorNo)
NextEventIsBlock = Schedule_Services('NextEventIsBlock', ReactorNo)
end
If NextEventScheduled EQ False$ or NextEventHasSamePsn EQ False$ or NextEventIsBlock EQ True$ then
LastCassInWoTestWaferAckReq = True$
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = LastCassInWoTestWaferAckReq
TestWaferRanSinceLoad = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> or TestWaferLotIsValid EQ True$
If TestWaferLotIsValid NE True$ and TestWaferRanSinceLoad NE True$ then
TestWaferRanSinceLoad = Rds_Services('TestWaferRanAfterLoad', RDSNo)
If TestWaferRanSinceLoad NE True$ then
LastCassInWoTestWaferReqMsg = ''
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
LastCassInWoTestWaferReqMsg = 'No material scheduled. Test wafer required.'
end else If NextEventHasSamePsn EQ False$ then
LastCassInWoTestWaferReqMsg = 'Next work order is a NEW PSN number. Test wafer required.'
end
Scan_Services('AddNotAcceptableReason', LastCassInWoTestWaferReqMsg)
end
end
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRec, True$, False$, False$)
end
end
end
end
end
end else
ScanMsg = 'The POST stage engineering instructions must be acknowledged before the load operation can be signed.'
@ -1215,6 +1305,8 @@ Service ProcessScanData(ScanID, ScanJSON)
Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -1223,6 +1315,9 @@ end service
//
//----------------------------------------------------------------------------------------------------------------------
Service AcceptScan(ScanID, ScanJSON)
StartTick = GetTickCount()
MetricName = 'AcceptScan'
If ( (ScanID NE '') and (ScanJSON NE '') ) then
hBody = ''
ParseResponse = SRP_JSON(hBody, 'PARSE', ScanJSON)
@ -1403,6 +1498,7 @@ Service AcceptScan(ScanID, ScanJSON)
LogData<3> = Username
LogData<4> = CurrStage
LogData<5> = ScanID
Begin Case
Case CurrStage _EQC 'VER'
Action = 'LOAD'
@ -1493,14 +1589,32 @@ Service AcceptScan(ScanID, ScanJSON)
Case CurrStage _EQC 'UNLOAD'
Action = 'UNLOAD'
// Check if UNLOAD stage is ready to sign
UnloadStageSigned = QA_Services('SignUnloadStage', RDSNo, Username, 1)
If UnloadStageSigned EQ True$ then
Result = '(':CassetteID:') Unload stage signed.'
Continue = True$
If TestWaferLots NE '' then
ToolID = ScansRow<SCANS.TOOL_ID$>
Reactor = ToolID[-1, 'BR']
Username = ScansRow<SCANS.EMPLOYEE_ID$>
TestWaferLotQtys = ScansRow<SCANS.TW_LOT_QTY$>
TestRunType = ScansRow<SCANS.TEST_RUN_TYPE_ID$>
PSNo = Xlate('RDS', RDSNo, RDS_PROD_SPEC_ID$, True$, 'X')
NewTestRunId = Test_Run_Services('CreateTestRunRecord', TestRunType, 'R', Reactor, PSNo, RDSNo,Username , TestWaferLots, TestWaferLotQtys)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
Error_Services('Set', ErrorMessage)
Continue = False$
end
end
If Continue EQ True$ then
// Check if UNLOAD stage is ready to sign
UnloadStageSigned = QA_Services('SignUnloadStage', RDSNo, Username, 1)
If UnloadStageSigned EQ True$ then
Result = '(':CassetteID:') Unload stage signed.'
end
LogData<6> = Action
LogData<7> = Result
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
end
LogData<6> = Action
LogData<7> = Result
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Case CurrStage _EQC 'COMP'
Action = 'COMP'
Error_Services('Set', '(':CassetteID:") Cassette has already been FQA'd.")
@ -1558,6 +1672,8 @@ Service AcceptScan(ScanID, ScanJSON)
Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
//----------------------------------------------------------------------------------------------------------------------
@ -1568,6 +1684,8 @@ end service
// HAL+JSON properties will be added to the JSON object.
//----------------------------------------------------------------------------------------------------------------------
Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
StartTick = GetTickCount()
MetricName = 'ConvertMVScanToJSON'
jsonScan = ''
@ -1674,6 +1792,7 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
SRP_JSON(objEmployee, 'SetValue', 'authorized', {EMPLOYEE_AUTHORIZED}, 'Boolean')
SRP_JSON(objEmployee, 'SetValue', 'notAuthorizedReason', {EMPLOYEE_NOT_AUTHORIZED_REASON}, 'String')
SRP_JSON(objEmployee, 'SetValue', 'authenticated' , @Record<SCANS.AUTHENTICATED$> , 'Boolean');//JRO Change
SRP_JSON(objEmployee, 'SetValue', 'isAuthorizedToOverrideROTR', @Record<SCANS.IS_AUTHORIZED_TO_OVERRIDE_ROTR$>, 'Boolean')
SRP_JSON(objJSONScan, 'Set', 'employee', objEmployee)
SRP_JSON(objEmployee, 'Release')
@ -1787,52 +1906,6 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
end else
SupplUnloadInstAckReq = False$
end
ReactorNo = Xlate('RDS', RDSNo, RDS_REACTOR$, 'X')
ReactorType = Xlate('REACTOR', ReactorNo, REACTOR_REACT_TYPE$, 'X')
If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then
WO = Xlate('RDS', RDSNo, RDS_WO$, 'X')
CassNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X')
WoMatKey = WO:'*':CassNo
WoMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey)
LastCassInWoTestWaferAckReq = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$>
LastCassInWoTestWaferAcked = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$>
LastCassInWoTestWaferReqMsg = ''
If LastCassInWoTestWaferAcked EQ False$ or LastCassInWoTestWaferAcked EQ '' then
LastCassInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey)
If LastCassInWo then
NextEventScheduled = False$
NextEventHasSamePsn = True$
NextEventIsBlock = False$
NextScheduledEvent = Schedule_Services('GetNextEvent', ReactorNo)
If Error_Services('NoError') then
NextEventScheduled = True$
NextEventHasSamePsn = Schedule_Services('NextEventIsSamePsn', ReactorNo)
NextEventIsBlock = Schedule_Services('NextEventIsBlock', ReactorNo)
end
If NextEventScheduled EQ False$ or NextEventHasSamePsn EQ False$ or NextEventIsBlock EQ True$ then
LastCassInWoTestWaferAckReq = True$
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = LastCassInWoTestWaferAckReq
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$> = LastCassInWoTestWaferAcked
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRec, True$, False$, False$)
LastCassInWoTestWaferReqMsg = ''
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
LastCassInWoTestWaferReqMsg = 'No material scheduled. Test wafer required.'
end else If NextEventHasSamePsn EQ False$ then
LastCassInWoTestWaferReqMsg = 'Next work order is a NEW PSN number. Test wafer required.'
end
end
end
end
SRP_JSON(objRDS, 'SetValue', 'lastCassInWoTestWaferAckReq', LastCassInWoTestWaferAckReq, 'Boolean')
SRP_JSON(objRDS, 'SetValue', 'lastCassInWoTestWaferAcked', LastCassInWoTestWaferAcked, 'Boolean')
SRP_JSON(objRDS, 'SetValue', 'lastCassInWoTestWaferAckReqMsg', LastCassInWoTestWaferReqMsg, 'String')
end
end else
SupplUnloadInstAckReq = False$
end
@ -2114,6 +2187,8 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
Response = jsonScan
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
//----------------------------------------------------------------------------------------------------------------------
@ -2350,8 +2425,3 @@ ClearCursors:
return

View File

@ -55,16 +55,24 @@ EQU NOTIFICATION_PERIOD$ TO 12
Declare subroutine Error_Services, Schedule_Services, Memory_Services, RList, Database_Services, Logging_Services
Declare subroutine Btree.Extract, Set_Status, Reduce, FSMsg, Messaging_Services, obj_Notes, Make.List
Declare subroutine Mona_Services
Declare function SRP_Array, Schedule_Services, Memory_Services, Database_Services, SRP_Sort_Array, Datetime
Declare function Epi_Part_Services, SRP_Math, SRP_Hash, obj_Prod_Spec, Logging_Services, Environment_Services
Declare function Work_Order_Services, RTI_CreateGUID, Reactor_Services, Schedule_Services, NextKey, SRP_Datetime
Declare function SRP_Time, Lsl_Users_Services
Declare function SRP_Time, Lsl_Users_Services, GetTickCount
Date = Oconv(Date(), 'D4/')
LogFileName = Date[7, 4] : '-' : Date[1, 2] : '-' : Date[4, 2] : ' Scheduler Log.csv'
Headers = 'Logging DTM' : @FM : 'Service Step' : @FM : 'Service Notes'
ColumnWidths = 20 : @FM : 30 : @FM : 150
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_SCHEDULESERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_SCHEDULESERVICES'
end
GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end
@ -795,6 +803,8 @@ end service
Service GetCurrentEvent(ReactNo)
StartTick = GetTickCount()
MetricName = 'GetCurrentEvent'
SchedDetKey = ''
If ReactNo NE '' then
@ -814,9 +824,14 @@ Service GetCurrentEvent(ReactNo)
GoSub ClearCursors
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service CurrentEventIsBlock(ReactNo)
StartTick = GetTickCount()
MetricName = 'CurrentEventIsBlock'
If ReactNo NE '' then
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
@ -838,9 +853,15 @@ Service CurrentEventIsBlock(ReactNo)
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg)
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service GetNextEvent(ReactNo)
StartTick = GetTickCount()
MetricName = 'GetNextEvent'
SchedDetKey = ''
If ReactNo NE '' then
CurrDTM = Datetime()
@ -870,6 +891,9 @@ Service GetNextEvent(ReactNo)
end
GoSub ClearCursors
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service GetEngagedEvent(ReactNo)
@ -919,6 +943,9 @@ Service GetLastEngagedEvent(ReactNo)
end service
Service NextEventIsSamePsn(ReactNo)
StartTick = GetTickCount()
MetricName = 'NextEventIsSamePsn'
Response = False$
If ReactNo NE '' then
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
@ -962,9 +989,15 @@ Service NextEventIsSamePsn(ReactNo)
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg)
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service NextEventIsBlock(ReactNo)
StartTick = GetTickCount()
MetricName = 'NextEventIsBlock'
If ReactNo NE '' then
NextSchedDetKey = Schedule_Services('GetNextEvent', ReactNo)
@ -986,6 +1019,9 @@ Service NextEventIsBlock(ReactNo)
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg)
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
//----------------------------------------------------------------------------------------------------------------------
@ -3561,3 +3597,4 @@ CreateScheduleChangeNotification:
return

View File

@ -17,6 +17,7 @@ Subroutine Service_Manager_Debugger_Intercept(Void)
History : (Date, Initials, Notes)
07/25/23 djs Original programmer.
06/04/25 djs Added LSL note creation (and email forwarding) to notify OI_ADMIN users when invoked.
***********************************************************************************************************************/
@ -24,24 +25,58 @@ Subroutine Service_Manager_Debugger_Intercept(Void)
$insert APP_INSERTS
$insert RTI_DEBUG_COMMON
$insert ENVIRON_CONSTANTS
Declare function Environment_Services, Logging_Services
Declare subroutine Logging_Services
Declare function Environment_Services, Logging_Services, Environment_Services, GetCommandLine, Datetime
Declare subroutine Logging_Services, obj_Notes, Set_Env
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ServiceManager'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' OEngine Log.csv'
Headers = 'Stored Proc Status' : @FM : 'Stored Proc Status Code' : @FM : 'Current Program' : @FM : 'Call Depth' : @FM : 'Line No' : @FM : 'Call Stack'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
LogData = ''
LogData<1> = SPStatus@
LogData<2> = SPStatCode@
LogData<3> = Curr_Program@
LogData<4> = CallDepth@
LogData<5> = LineNo@
LogData<6> = CallStack@
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '')
Main:
// Log event in .\LogFiles\ServiceManager\<Date> OEngine Log.csv
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ServiceManager'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' OEngine Log.csv'
Headers = 'Stored Proc Status' : @FM : 'Stored Proc Status Code' : @FM : 'Current Program' : @FM
Headers := 'Call Depth' : @FM : 'Line No' : @FM : 'Call Stack'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
LogData = ''
LogData<1> = spStatus@
LogData<2> = spStatCode@
LogData<3> = curr_Program@
LogData<4> = callDepth@
LogData<5> = lineNo@
LogData<6> = callStack@
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '')
// Send an LSL message to FI admins to alert them. This is forward to their email address if configured in
// their LSL_USERS record.
CmdLine = GetCommandLine()
EngIndex = Index(CmdLine, '/S=', 1)
EngNo = CmdLine[EngIndex + 3, 'F ']
Server = Environment_Services('GetServer')
Recipients = ''
SentFrom = 'SYSTEM'
Subject = 'Service Manager Debugger Intercept Invoked'
Message = OConv(Datetime(), 'DT2/^H')
Message<2> = 'RevEngineHost (OEngine) ':EngNo:' encountered a runtime error on server ':Server
Message<3> = 'Stored Procedure Status: ':spStatus@
StatCodes = spStatCode@
Swap Char(0) with ',' in StatCodes
Swap Char(23) with '' in StatCodes
Message<4> = 'Stored Procedure Status Code: ':StatCodes
Message<5> = 'Current Program: ':curr_Program@
Message<6> = 'Call Depth: ':callDepth@
Message<7> = 'Line No: ':lineNo@
Message<8> = 'Call Stack: ':\0D0A\:callStack@
Swap @FM with \0D0A\ in Message
Swap @VM with ',' in Message
AttachWindow = ''
AttachKey = ''
SendToGroup = 'OI_SYSADMIN'
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
Return

View File

@ -27,19 +27,30 @@ Function Service_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
$insert LOGICAL
$insert SERVICE_SETUP
$insert SERVICES_EQUATES
$insert RLIST_EQUATES
$insert SQL_REQUESTS_EQUATES
$Insert APP_INSERTS
$Insert SERVICE_SETUP
$Insert SERVICES_EQUATES
$Insert RLIST_EQUATES
$Insert SQL_REQUESTS_EQUATES
$Insert PROC_QUEUE_EQUATES
$Insert PROC_QUEUE_FAILED_EQUATES
Equ Comma$ to ','
Common /ServiceServices/ Unused1@, Unused2@, Unused3@, Unused4@, Unused5@, Unused6@, Unused7@, Unused8@, Unused9@, Unused10@
Declare function Service_Services, Memory_Services, SRP_List, SRP_FastArray, SRP_Array, Database_Services, Datetime
Declare Function GetTickCount, SRP_Decode, RTI_CREATEGUID
Declare function GetTickCount, SRP_Decode, RTI_CreateGuid, UCase, Environment_services, Logging_Services
Declare subroutine Service_Services, Memory_Services, SRP_List, SRP_FastArray, RList, Set_Status, Database_Services
Declare Subroutine Yield, WinYield, Sleepery, Btree.Extract
Declare Subroutine Yield, WinYield, Sleepery, Btree.Extract, Logging_Services, obj_Notes
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ProcQueue'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Procedure Queue Log.csv'
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'RequestKeyId' : @FM : 'Procedure' : @FM : 'Params' : @FM : 'Result' : @FM : 'Error Message'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
GoToService else
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
@ -165,18 +176,22 @@ Service ProcessProcedureQueue()
ReadNext RequestKeyID else EOF = True$
Until EOF or Done
Lock hProcQueue, RequestKeyID then
Done = True$
DeleteRequest = True$
Server = Environment_Services('GetServer')
Done = True$
Database_Services('GetKeyIDLock', 'PROC_QUEUE', RequestKeyId)
RequestRow = Database_Services('ReadDataRow', 'PROC_QUEUE', RequestKeyID)
RequestRow = Database_Services('ReadDataRow', 'PROC_QUEUE', RequestKeyID)
If RequestRow NE '' then
Procedure = RequestRow<PROC_QUEUE.PROC_NAME$>
Procedure = UCase(Procedure)
Params = RequestRow<PROC_QUEUE.PARAMS$>
If Procedure NE '' then
Dim ProcParams(11)
Dim ProcParams(12)
For each Param in Params using @VM setting pPos
ProcParams(pPos) = Param
Next Param
NumArguments = DCount(Params, @VM)
Begin Case
Case NumArguments EQ 0 ; Call @Procedure()
Case NumArguments EQ 1 ; Call @Procedure(ProcParams(1))
@ -194,17 +209,58 @@ Service ProcessProcedureQueue()
Error_Services('Add', 'Error in ':Service:' service. More than 11 arguments are not currently supported.')
End Case
end
If Error_Services('NoError') then
Database_Services('DeleteDataRow', 'PROC_QUEUE', RequestKeyId, True$, False$) ; // This call will release the lock
Swap @VM with ',' in Params
LogData = LoggingDTM
LogData<2> = Server
LogData<3> = RequestKeyId
LogData<4> = Procedure
LogData<5> = Params
ErrCode = ''
If ( Get_Status(ErrCode) or Error_Services('HasError') ) then
NumAttempts = RequestRow<PROC_QUEUE.NUM_ATTEMPTS$> + 1
ErrorMessage = Error_Services('GetMessage')
If NumAttempts LT 3 then
DeleteRequest = False$
RequestRow<PROC_QUEUE.NUM_ATTEMPTS$> = NumAttempts
RequestRow<PROC_QUEUE.LAST_ATTEMPT_DTM$> = Datetime()
RequestRow<PROC_QUEUE.ERROR$> = 'Error_Services error message: ':ErrorMessage:' Get_Status error code: ':ErrCode
Database_Services('WriteDataRow', 'PROC_QUEUE', RequestKeyId, RequestRow, True$, False$, False$)
end else
// Notify OI_SYSADMIN group
Recipients = ''
SentFrom = 'SYSTEM'
Subject = 'Background Procedure Queue Error'
Message = OConv(Datetime(), 'DT2/^H')
Message<2> = 'Error on server ':Server
Message<3> = 'Stored Procedure: ':Procedure
StatCodes = 'Parameters: ':Params
Message<4> = 'Error_Services error message: ':ErrorMessage
Message<5> = 'Get_Status error code: ':ErrCode
Swap @FM with \0D0A\ in Message
AttachWindow = ''
AttachKey = ''
SendToGroup = 'OI_SYSADMIN'
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
// Move request to PROC_QUEUE_FAILED
RequestRow<PROC_QUEUE.NUM_ATTEMPTS$> = NumAttempts
RequestRow<PROC_QUEUE.LAST_ATTEMPT_DTM$> = Datetime()
RequestRow<PROC_QUEUE.ERROR$> = 'Error_Services error message: ':ErrorMessage:'Get_Status error code: ':ErrCode
Database_Services('WriteDataRow', 'PROC_QUEUE_FAILED', RequestKeyId, RequestRow, True$, False$, False$)
end
LogData<6> = 'Failed'
LogData<7> = 'Error_Services error message: ':ErrorMessage:' Get_Status error code: ':ErrCode
end else
RequestRow<PROC_QUEUE.LAST_ATTEMPT_DTM$> = DateTime()
RequestRow<PROC_QUEUE.ERROR$> = Error_Services('GetMessage')
Database_Services('WriteDataRow', 'PROC_QUEUE', RequestKeyID, RequestRow, True$, False$, False$) ; // This call will release the lock
LogData<6> = 'Success'
end
end else
// Empty request, so delete it from the queue
Database_Services('DeleteDataRow', 'PROC_QUEUE', RequestKeyId, True$, False$) ; // This call will release the lock
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
end
If DeleteRequest then
Database_Services('DeleteDataRow', 'PROC_QUEUE', RequestKeyId, True$, False$)
end
Unlock hProcQueue, RequestKeyID else Null
end
Repeat
end
@ -217,36 +273,32 @@ Service PostProcedure(ProcedureName, Params, Critical=BOOLEAN)
If Critical EQ '' then Critical = True$
PostToQueue = True$
If (ProcedureName NE '') then
If (Params NE '') then
If Not(Critical) then
// Check if there is already a matching request in the queue before posting another one.
Query = 'PROC_NAME':@VM:ProcedureName:@FM
Query := 'PARAMS':@VM:Params:@FM
Open 'DICT.PROC_QUEUE' to hDict then
Keys = ''
Option = 'E'
Flag = ''
Btree.Extract(Query, 'PROC_QUEUE', hDict, Keys, Option, Flag)
If Flag EQ 0 then
If Keys NE '' then PostToQueue = False$
end else
Error_Services('Add', 'Error in ':Service:' service. Error calling Btree.Extract.')
end
If Not(Critical) then
// Check if there is already a matching request in the queue before posting another one.
Query = 'PROC_NAME':@VM:ProcedureName:@FM
Query := 'PARAMS':@VM:Params:@FM
Open 'DICT.PROC_QUEUE' to hDict then
Keys = ''
Option = 'E'
Flag = ''
Btree.Extract(Query, 'PROC_QUEUE', hDict, Keys, Option, Flag)
If Flag EQ 0 then
If Keys NE '' then PostToQueue = False$
end else
Error_Services('Add', 'Error in ':Service:' service. Error opening DICT.PROC_QUEUE.')
Error_Services('Add', 'Error in ':Service:' service. Error calling Btree.Extract.')
end
end else
Error_Services('Add', 'Error in ':Service:' service. Error opening DICT.PROC_QUEUE.')
end
If PostToQueue then
RequestKeyID = RTI_CreateGUID()
RequestRow = ''
RequestRow<PROC_QUEUE.PROC_NAME$> = ProcedureName
RequestRow<PROC_QUEUE.PARAMS$> = Params
RequestRow<PROC_QUEUE.ENTRY_DTM$> = Datetime()
Database_Services('WriteDataRow', 'PROC_QUEUE', RequestKeyID, RequestRow, True$, False$, False$)
end
end else
Error_Services('Add', 'Error in ':Service:' service. Null Params passed in.')
end
end
If PostToQueue then
RequestKeyID = RTI_CreateGUID()
RequestRow = ''
RequestRow<PROC_QUEUE.PROC_NAME$> = ProcedureName
RequestRow<PROC_QUEUE.PARAMS$> = Params
RequestRow<PROC_QUEUE.ENTRY_DTM$> = Datetime()
Database_Services('WriteDataRow', 'PROC_QUEUE', RequestKeyID, RequestRow, True$, False$, False$)
end
end else
Error_Services('Add', 'Error in ':Service:' service. Null ProcedureName passed in.')
end
@ -254,8 +306,98 @@ Service PostProcedure(ProcedureName, Params, Critical=BOOLEAN)
return
Service CleanFailedProcQueue(DaysToRetain)
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, ServiceKeyID then
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ProcQueue'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' CleanFailedProcQueue Log.csv'
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'RequestKeyId' : @FM : 'Procedure' : @FM : 'Params'
Headers := @FM : 'Result' : @FM : 'Error Message'
objFailedProcQueueLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
Server = Environment_Services('GetServer')
LogData = ''
LogData<1> = LoggingDtm
LogData<2> = Server
LogData<6> = 'Begin CleanFailedProcQueue'
Logging_Services('AppendLog', objFailedProcQueueLog, LogData, @RM, @FM)
ErrorMsg = ''
If (DaysToRetain NE '') then
If Num(DaysToRetain) then
Open 'PROC_QUEUE_FAILED' to hTable then
Cutoff = Datetime() - DaysToRetain
Select hTable
EOF = False$
Loop
Readnext Key else EOF = True$
Until EOF
Read Rec from hTable, Key then
EntryDtm = Rec<PROC_QUEUE_FAILED.ENTRY_DTM$>
If (EntryDtm LT Cutoff) then
Delete hTable, Key then
LogData<1> = LoggingDtm
LogData<2> = Server
LogData<3> = Key
LogData<4> = Rec<PROC_QUEUE_FAILED.PROC_NAME$>
ProcFailedParams = Rec<PROC_QUEUE_FAILED.PARAMS$>
Convert @VM to '|' in ProcFailedParams
LogData<5> = ProcFailedParams
LogData<6> = 'Removed PROC_QUEUE_FAILED record.'
LogData<7> = Rec<PROC_QUEUE_FAILED.ERROR$>
Logging_Services('AppendLog', objFailedProcQueueLog, LogData, @RM, @FM)
end else
ErrorMsg = 'Error in ':Service:' service. Error deleting PROC_QUEUE_FAILED record ':Key:'.'
end
end else
LogData<1> = LoggingDtm
LogData<2> = Server
LogData<3> = Key
LogData<4> = Rec<PROC_QUEUE_FAILED.PROC_NAME$>
ProcFailedParams = Rec<PROC_QUEUE_FAILED.PARAMS$>
Convert @VM to '|' in ProcFailedParams
LogData<5> = ProcFailedParams
LogData<6> = 'Retaining PROC_QUEUE_FAILED record.'
LogData<7> = Rec<PROC_QUEUE_FAILED.ERROR$>
Logging_Services('AppendLog', objFailedProcQueueLog, LogData, @RM, @FM)
end
end else
ErrorMsg = 'Error in ':Service:' service. Error reading PROC_QUEUE_FAILED record ':Key:'.'
end
Repeat
end else
ErrorMsg = 'Error in ':Service:' service. Error opening PROC_QUEUE_FAILED table.'
end
end else
ErrorMsg = 'Error in ':Service:' service. DaysToRetain must be a number.'
end
end else
ErrorMsg = 'Error in ':Service:' service. Null DaysToRetain value passed in.'
end
If ErrorMsg NE '' then
LogData<1> = LoggingDtm
LogData<2> = Server
LogData<6> = ErrorMsg
Logging_Services('AppendLog', objFailedProcQueueLog, LogData, @RM, @FM)
end
LogData<1> = LoggingDtm
LogData<2> = Server
LogData<6> = 'End CleanFailedProcQueue'
Logging_Services('AppendLog', objFailedProcQueueLog, LogData, @RM, @FM)
Unlock hSysLists, ServiceKeyID else Null
end
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -63,12 +63,20 @@ Equ COL$TOOL_ID to 10
Declare function obj_Prod_Spec, RDS_Services, Error_Services, Signature_Services, Memory_Services, obj_RDS_Test
Declare function Database_Services, obj_WO_Mat, Dialog_Box, MemberOf, Msg, QA_Services, Datetime, Supplement_Services
Declare function Environment_Services, GetTickCount
Declare subroutine Error_Services, Popup, Memory_Services, SRP_Stopwatch, Set_Status, Database_Services, obj_WO_Mat
Declare subroutine Obj_Notes, Signature_Services, Obj_WO_Mat_Log, ErrMsg
Declare subroutine Obj_Notes, Signature_Services, Obj_WO_Mat_Log, ErrMsg, Mona_Services
PSNKey = ServiceKeyID
ReactorKey = ServiceKeyID
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_SIGNATURESERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_SIGNATURESERVICES'
end
GoToService
Return Response or ""
@ -135,6 +143,8 @@ end service
Service GetSigProfile(WOMatKey, UseCaching, RDSNo)
StartTick = GetTickCount()
MetricName = 'GetSigProfile'
If UseCaching EQ '' then UseCaching = True$
@ -175,6 +185,8 @@ Service GetSigProfile(WOMatKey, UseCaching, RDSNo)
SigDTMs = OCONV(SigDTMs,'DT4/^S')
Response = SigProfile:@FM:Signatures:@FM:SigDTMs
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -211,6 +223,9 @@ end service
Service CheckSigOrder(WOMatKey, CurrStage, UseCaching, RDSNo)
StartTick = GetTickCount()
MetricName = 'CheckSigOrder'
If UseCaching EQ '' then UseCachine = True$
Response = False$
If RDSNo NE '' then
@ -264,6 +279,8 @@ Service CheckSigOrder(WOMatKey, CurrStage, UseCaching, RDSNo)
Response = True$
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
End Service
@ -2010,20 +2027,17 @@ Service QASigReady(RDSNo)
* Verify Unload Stage QA Metrology Tests *
******************************************
If ErrorMessage EQ '' then
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
If (DevelopmentFlag EQ True$) then
WOMatQAKey = WOMatKey
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
OutOfSpec = Sum(OutOfSpec)
If OutOfSpec GT 0 then
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
ErrorMessage = 'Error in ':Service:' service. '
For each FailReason in FailReasons using @VM
ErrorMessage := FailReason:' '
Next FailReason
end
end
WOMatQAKey = WOMatKey
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
OutOfSpec = Sum(OutOfSpec)
If OutOfSpec GT 0 then
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
ErrorMessage = 'Error in ':Service:' service. '
For each FailReason in FailReasons using @VM
ErrorMessage := FailReason:' '
Next FailReason
end
end
************************************************************************
@ -2844,4 +2858,3 @@ GetMostRecentSig:
return

View File

@ -56,9 +56,16 @@ $Insert NOTIFICATION_EQUATES
Equ COMMA$ to ','
Declare function Database_Services, Supplement_Services, Rti_Createguid, SRP_Array, Datetime, Signature_Services
Declare function Environment_Services, Logging_Services, Select_Into
Declare function Environment_Services, Logging_Services, Select_Into, GetTickCount
Declare subroutine Database_Services, Rds_Services, Supplement_Services, Logging_Services, Set_Status, SRP_Stopwatch
Declare subroutine Btree.Extract, obj_Notes
Declare subroutine Btree.Extract, obj_Notes, Mona_Services
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_SUPPLEMENTSERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_SUPPLEMENTSERVICES'
end
GoToService else
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.')
@ -408,6 +415,8 @@ end service
//
//----------------------------------------------------------------------------------------------------------------------
Service AcknowledgeSupplement(SupplID, EntryUser)
StartTick = GetTickCount()
MetricName = 'AcknowledgeSupplement'
If ( (SupplID NE '') and (EntryUser NE '') ) then
OldRec = Xlate('SUPPLEMENTS', SupplID, '', 'X', '')
@ -433,6 +442,8 @@ Service AcknowledgeSupplement(SupplID, EntryUser)
Error_Services('Add', 'SupplID or EntryUser was missing in the ' : Service : ' service.')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -447,6 +458,8 @@ end service
//
//----------------------------------------------------------------------------------------------------------------------
Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES)
StartTick = GetTickCount()
MetricName = 'UnacknowledgedSupplementCheck'
UnackList = ''
Response = False$
@ -482,6 +495,8 @@ Service UnacknowledgedSupplementCheck(LotType=LOTTYPES, LotID, Stage=STAGES)
If UnackList NE '' then Response = UnackList
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -496,6 +511,8 @@ end service
//
//----------------------------------------------------------------------------------------------------------------------
Service LogSupplementChange(SupplementRec, EditEvent, EntryUser)
StartTick = GetTickCount()
MetricName = 'LogSupplementChange'
If ( (SupplementRec NE '') and (EditEvent NE '') and (EntryUser NE '') ) then
SupplementText = SupplementRec<SUPPLEMENTS_SUPPL_TEXT$>
@ -513,6 +530,8 @@ Service LogSupplementChange(SupplementRec, EditEvent, EntryUser)
Error_Services('Add', 'LotType, LotID, or Stage was missing in the ' : Service : ' service.')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
@ -613,3 +632,4 @@ Service SendNotifications(RDSList, EditEvent, Instructions, EntryUser)
end service

View File

@ -10,9 +10,10 @@ $Insert TEST_RUN_OBJ_EQUATES
$Insert LOT_EQUATES
$Insert LOT_OPERATION_EQUATES
Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable, Lot_Services
Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable, Lot_Services, GetTickCount
Declare function SRP_Datetime, Database_Services, Test_Run_Services, File_Services, Status, delete, Insert, Datetime, SRP_Json, MemberOf
Declare subroutine Database_Services, Btree.Extract, Error_Services, Logging_Services, Rlist, Test_Run_Services, Lot_Services, SRP_Json
Declare subroutine Mona_Services
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\TEST_RUN_SERVICES\TestWaferProduct'
LogDate = Oconv(Date(), 'D4/')
@ -30,6 +31,13 @@ objLogTR = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, He
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_TESTRUNSERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_TESTRUNSERVICES'
end
GoToService
Return Response or ""
@ -280,6 +288,9 @@ Service UpdateTWProdSortOrder(TWProdKey, NewOrder)
end service
Service GetAllTestRunTypes()
StartTick = GetTickCount()
MetricName = 'GetAllTestRunTypes'
keylist = ''
rtList = ''
RList('SELECT TEST_RUN_TYPE BY RUN_TYPE', 5, '', '', '')
@ -297,6 +308,9 @@ Service GetAllTestRunTypes()
end
Next ProdKey
Response = rtList
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service GetTestWaferLots(ShowOnlyOpenLots)
@ -318,6 +332,9 @@ Service GetTestWaferLots(ShowOnlyOpenLots)
end service
Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLotIds, TWLotQtys)
StartTick = GetTickCount()
MetricName = 'CreateTestRunRecord'
TWRunKey = ''
Response = ''
ErrorMessage = ''
@ -490,9 +507,15 @@ Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLo
Error_Services('Add', ErrorMessage)
Response = ''
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotId, Username)
StartTick = GetTickCount()
MetricName = 'CreateTestRunWaferRecord'
ErrorMessage = ''
If TestRunID NE '' AND TWPartID NE '' then
If RowExists('TEST_RUN', TestRunID) then
@ -537,6 +560,9 @@ Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotId
Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM)
Error_Services('Add', 'Error creating new test run record: ' : ErrorMessage)
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service UseTWFromLot(LotId, UsageQty, Username)
@ -706,6 +732,9 @@ Service GetTestRunKeysByPSN(PSNo)
end service
Service GetTestRunKeysByRDS(RDSNo)
StartTick = GetTickCount()
MetricName = 'GetTestRunKeysByRDS'
table = "TEST_RUN"
Open "DICT ":table To @DICT Else
Error_Services('Add', 'Error opening TEST_RUN dictionary')
@ -718,6 +747,9 @@ Service GetTestRunKeysByRDS(RDSNo)
Btree.Extract(srch_strng, table, @DICT, keylist, option, flag)
Response = keylist
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service GetTestRunWaferByID(TRWaferID)
@ -799,3 +831,4 @@ end service

View File

@ -0,0 +1,309 @@
Function Wafercounter_API(@API)
/***********************************************************************************************************************
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 : Wafercounter_API
Description : API logic for the Wafercounter resource.
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
FullEndpointURL - The URL submitted by the client, including query params.
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
EndpointSegment - The URL endpoint segment.
ParentURL - The URL path preceeding the current endpoint.
CurrentAPI - The name of this stored procedure.
Parameters :
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
- APIPattern must follow this structure Wafercounter[.ID.[<Property>]]
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
Examples:
- Wafercounter.POST
- Wafercounter.ID.PUT
- Wafercounter.ID.firstName.GET
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
services do not rely upon anything being returned in the response. This is what the
various services like SetResponseBody and SetResponseStatus services are for. A response
value is only helpful if the developers want to use it for debug purposes.
History : (Date, Initials, Notes)
06/04/25 xxx Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
Declare function OI_Wizard_Services, Wafer_Counter_Services, Database_Services, Datetime, Wo_Mat_Services
Declare function Logging_Services, Environment_Services
Declare subroutine Logging_Services
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
$insert WAFER_COUNTER_EQUATES
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\WaferCounter';
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' WaferCounter.csv'
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'OI Wizard ID' : @FM : 'Message'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
GoToAPI else
// The specific resource endpoint doesn't have a API handler yet.
LogData = ''
LogData<1> = LoggingDTM;//Defined at entry of subroutine
LogData<2> = ''
LogData<3> = ''
LogData<4> = 'Web API not found.'
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
end
Return Response OR ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Endpoint Handlers
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
API wafercounter.startnewwafercount.POST
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
Body = ''
OIWizardID = ''
UserId = ''
CassId = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
CassBarcodeData = ''
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
Body = HTTP_Services('GetHTTPPostString', True$)
DecodedJSON = HTTP_Services('DecodePercentString', Body)
//Log Entry into API -
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = UserId
LogData<3> = OIWizardId
LogData<4> = 'New wafer counter transaction started.'
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
CassBarcodeData = SRP_JSON(objBody, 'GetValue', 'CassBarcodeData')
If CassBarcodeData NE '' then
CassData = Wafer_Counter_Services('ProcessCass2DBarcode', CassBarcodeData)
CassId = CassData<1,1>
ExpectedWfrQty = CassData<1,2>
CassType = CassData<1,3>
WoMatKey = ''
Begin Case
Case CassType EQ 'RDS'
WONo = XLATE('RDS', CassId, 'WO', 'X')
CassNo = XLATE('RDS', CassId, 'CASS_NO', 'X')
WoMatKey = WONo : '*' : CassNo
Case CassType EQ 'WM_OUT' OR CassType EQ 'WM_IN'
swap '.' with '*' in CassId
WONo = Field(CassId, '*', 1)
CassNo = Field(CassId, '*', 3)
WoMatKey = WONo : '*' : CassNo
End Case
ExpectedWfrMap = Wo_Mat_Services('GetWaferMap', WoMatKey)
ExpectedCassetteArray = ''
for i = 25 to 1 step -1
Slot = i
WaferPresent = ExpectedWfrMap<1, i>
ExpectedCassetteArray<-1, 1> = Slot : @VM : WaferPresent
Next i
If Error_Services('NoError') then
SRP_Json(objBody, 'SetValue', 'CassId', CassId, 'String')
SRP_Json(objBody, 'SetValue', 'CassType', CassType, 'String')
SRP_Json(objBody, 'SetValue', 'ExpectedQty', ExpectedWfrQty, 'Number')
SRP_Json(objBody, 'SetValue', 'ScanDtm', OConv(Datetime(), 'DT4/'), 'String')
objExpCassArray = ''
IF SRP_Json(objExpCassArray, 'New', 'Array') then
for each SlotData in ExpectedCassetteArray using @FM setting sPos
Slot = SlotData<1, 1>
WaferPresent = SlotData<1, 2>
objSlot = ''
If SRP_Json(objSlot, 'New', 'Object') then
SRP_Json(objSlot, 'SetValue', 'SlotNo', Slot, 'Number')
SRP_Json(objSlot, 'SetValue', 'WaferPresent', WaferPresent, 'Boolean')
SRP_Json(objExpCassArray, 'Add', objSlot)
SRP_Json(objSlot, 'Release')
end
Next SlotData
SRP_Json(objBody, 'Set', 'ExpectedWaferArray', objExpCassArray)
SRP_Json(objExpCassArray, 'Release')
end
ResponseJson = SRP_Json(objBody, 'Stringify', 'Styled')
HTTP_Services('SetResponseBody', ResponseJson)
ResponseCode = 200
end else
ErrorMessage = Error_Services('GetMessage')
ResponseCode = 500
end
end else
ErrorMessage = 'Cassette ID Barcode data not detected.'
ResponseCode = 500
end
SRP_Json(objBody, 'Release')
end
If ErrorMessage EQ '' then
//Log Success
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = UserId
LogData<3> = OIWizardId
LogData<4> = 'New wafer counter transaction started successfully. Barcode Data: ' : CassBarcodeData : '. Cass Id: ' : CassId
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
end else
//Log Failure
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = UserId
LogData<3> = OIWizardId
LogData<4> = 'New wafer counter transaction finished with errors. Response Code: ' : ResponseCode : '. Error Message: ' : ErrorMessage : '. Barcode Data: ' : CassBarcodeData : '. Cass Id: ' : CassId
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api
API wafercounter.completewafercount.POST
ErrorMessage = ''
ResponseCode = ''
ResponseMessage = ''
WaferCounterId = ''
CassId = ''
Body = ''
OIWizardID = ''
UserId = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
CassBarcodeData = ''
UserId = Xlate('OI_WIZARD', OIWizardID, OI_WIZARD.EMPLOYEE_ID$, 'X')
StatusCode = ''
Body = HTTP_Services('GetHTTPPostString', True$)
DecodedJSON = HTTP_Services('DecodePercentString', Body)
//Log Entry into API -
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = UserId
LogData<3> = OIWizardId
LogData<4> = 'Complete wafer counter transaction started.'
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
If SRP_JSON(objBody, 'Parse', Body) EQ '' then
CassId = SRP_JSON(objBody, 'GetValue', 'CassId')
CassType = SRP_Json(objBody, 'GetValue', 'CassType')
ToolBarcodeData = SRP_JSON(objBody, 'GetValue', 'ToolBarcodeData')
ExpectedQty = SRP_JSON(objBody, 'GetValue', 'ExpectedQty')
If CassId NE '' then
WaferCounterId = Wafer_Counter_Services('ProcessTool2DBarcode', ToolBarcodeData, CassId, CassType, UserId)
If Error_Services('NoError') then
WaferCounterRec = Database_Services('ReadDataRow', 'WAFER_COUNTER', WaferCounterId, True$, 0, False$)
ScanDtm = OConv(WaferCounterRec<WAFER_COUNTER.SCAN_DTM$>, 'DT4/')
ToolId = WaferCounterRec<WAFER_COUNTER.SCAN_TOOL$>
WaferCount = WaferCounterRec<WAFER_COUNTER.SCAN_QTY$>
MatchingWfrCount = ExpectedQty EQ WaferCount
WaferCountData = WaferCounterRec<WAFER_COUNTER.SCAN_WAFER_MAP$>
swap 1 with 1:@FM in WaferCountData
swap 0 with 0:@FM in WaferCountData
WaferCountData[-1, -1] = ''
CassetteArray = ''
for i = 25 to 1 step -1
Slot = i
WaferPresent = WaferCountData<i>
CassetteArray<-1, 1> = Slot : @VM : WaferPresent
Next i
WaferCountArray = ''
SRP_Json(objBody, 'SetValue', 'WaferCounterId', WaferCounterId, 'String')
SRP_Json(objBody, 'SetValue', 'ScanDtm', ScanDtm, 'String')
SRP_Json(objBody, 'SetValue', 'WaferCount', WaferCount, 'Number')
SRP_Json(objBody, 'SetValue', 'ToolId', ToolId, 'String')
SRP_Json(objBody, 'SetValue', 'MatchingWaferCount', MatchingWfrCount, 'Boolean')
SRP_Json(objBody, 'SetValue', 'WaferCounterId', WaferCounterId, 'String')
objCassArray = ''
IF SRP_Json(objCassArray, 'New', 'Array') then
for each SlotData in CassetteArray using @FM setting sPos
Slot = SlotData<1, 1>
WaferPresent = SlotData<1, 2>
objSlot = ''
If SRP_Json(objSlot, 'New', 'Object') then
SRP_Json(objSlot, 'SetValue', 'SlotNo', Slot, 'Number')
SRP_Json(objSlot, 'SetValue', 'WaferPresent', WaferPresent, 'Boolean')
SRP_Json(objCassArray, 'Add', objSlot)
SRP_Json(objSlot, 'Release')
end
Next SlotData
SRP_Json(objBody, 'Set', 'WaferArray', objCassArray)
SRP_Json(objCassArray, 'Release')
end
ResponseJson = SRP_Json(objBody, 'Stringify', 'Styled')
HTTP_Services('SetResponseBody', ResponseJson)
ResponseCode = 200
end else
ErrorMessage = Error_Services('GetMessage')
ResponseCode = 500
end
end else
ErrorMessage = 'Cassette ID Barcode data not detected.'
ResponseCode = 500
end
SRP_Json(objBody, 'Release')
end
If ErrorMessage EQ '' then
//Log Success
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = UserId
LogData<3> = OIWizardId
LogData<4> = 'Completed wafer counter transaction finished successfully. Barcode Data: ' : CassBarcodeData : '. WAFER_COUNTER Id: ' : WaferCounterId : '. Cass Id: ' : CassId
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
end else
//Log Failure
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = UserId
LogData<3> = OIWizardId
LogData<4> = 'New wafer counter transaction finished with errors. Response Code: ' : ResponseCode : '. Error Message: ' : ErrorMessage : '. Barcode Data: ' : CassBarcodeData : '. Wafer Counter Id: ' : WaferCounterId : '. Cass Id: ' : CassId
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
end
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseStatus', ResponseCode, ErrorMessage)
end api

View File

@ -32,6 +32,8 @@ $Insert WO_LOG_EQUATES
$Insert WM_OUT_EQUATES
$Insert RLIST_EQUATES
$Insert WAFER_COUNTER_EQUATES
$Insert TOOL_EQUATES
$Insert TOOL_LOG_EQUATES
Equ Tab$ to \09\
Equ CRLF$ to \0D0A\
@ -43,8 +45,9 @@ Equ next_cur$ To 1
Equ add_exist$ to 2
Declare subroutine Error_Services, Database_Services, Logging_Services, Httpclient_Services, Reduce, SRP_JSON
Declare function Database_Services, Environment_Services, Logging_Services, Httpclient_Services
Declare function RTI_CreateGuid, SRP_JSON
Declare subroutine Wafer_Counter_Services, Lot_Event_Services
Declare function Database_Services, Environment_Services, Logging_Services, Httpclient_Services, OConv
Declare function RTI_CreateGuid, SRP_JSON, WO_Mat_Services, WM_Out_Services, Wafer_Counter_Services, Datetime
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WaferCounter'
LogDate = Oconv(Date(), 'D4/')
@ -263,6 +266,8 @@ Service AddScan(LotID, ScanQty, ScanDtm, ScanTool, ScanUser, ScanLocation, Wafer
Record<WAFER_COUNTER.SCAN_WAFER_MAP$> = WaferMap
Database_Services('WriteDataRow', 'WAFER_COUNTER', KeyID, Record)
Response = KeyId
end service
@ -393,6 +398,161 @@ Service GetWaferCounterToolID(WaferSize=WAFER_SIZES, Location=LOCATIONS)
end service
//----------------------------------------------------------------------------------------------------------------------
// ProcessCass2DBarcode
//
// Takes in the raw barcode data for a 2D Cassette label. Returns a single field array with 3 field delimited by @VM
// CassId, Expected Qty, and Cass Type
//----------------------------------------------------------------------------------------------------------------------
Service ProcessCass2DBarcode(BarcodeText)
ErrorMessage = ''
ExpectedSlotWaferMap = ''
ExpectedQty = ''
CassId = ''
CassType = ''
If BarcodeText NE '' then
DelimCnt = DCount(BarcodeText, '|')
If DelimCnt EQ 8 then
CassId = Field(BarcodeText, '|', 3)
If CassId NE '' then
If CassId[1, 2] EQ '1T' then
CassId[1, 2] = ''
Begin Case
Case CassId[1, 1] EQ 'O'
CassId[1, 1] = ''
CassType = 'WM_OUT'
Case (CassId[1, 1] EQ 'I')
CassId[1, 1] = ''
CassType = 'WM_IN'
Case Otherwise$
CassType = 'RDS'
End Case
Convert '.' to '*' in CassId
Begin Case
Case RowExists('RDS', CassId)
ExpectedQty = Xlate('RDS', CassId, 'WFRS_OUT', 'X')
Case RowExists('WM_OUT', CassId)
ExpectedQty = Xlate('WM_OUT', CassId, 'WAFER_CNT', 'X')
End Case
end
end else
ErrorMessage = 'Invalid Lot Label Scan. Unable to determine Cass Id'
end
end else
ErrorMessage = 'Invalid Lot Label Scan.'
end
end else
ErrorMessage = 'Scan data was null.'
end
If ErrorMessage EQ '' then
Response = CassId : @VM: ExpectedQty : @VM : CassType
end else
Error_Services('Add', ErrorMessage)
end
end service
//----------------------------------------------------------------------------------------------------------------------
// ProcessTool2DBarcode
//
// Takes in the raw barcode data for a wafer counter label, Cassette Id, Cassette Type, and UserId(Optional)
// Returns a key ID for a completed WAFER_COUNTER record.
//----------------------------------------------------------------------------------------------------------------------
Service ProcessTool2DBarcode(BarcodeText, CassId, CassType, UserId)
ErrorMessage = ''
If BarcodeText NE '' then
DelimCnt = DCount(BarcodeText, '|')
If DelimCnt EQ 2 then
WaferSize = Field(BarcodeText, '|', 1)
Area = Field(BarcodeText, '|', 2)
If Environment_Services('IsProd') then
WcJson = Wafer_Counter_Services('GetWaferCounterJSON', WaferSize, Area, CassID)
end else
WcJson = Wafer_Counter_Services('GetWaferCounterJSONTestData', WaferSize, Area, CassID)
end
If Error_Services('NoError') then
objJSON = ''
If SRP_JSON(objJSON, 'Parse', WcJson) EQ '' then
ScanDtm = SRP_JSON(objJSON, 'GetValue', 'dateTimeFormatted')
ToolID = SRP_JSON(objJSON, 'GetValue', 'equipmentId')
WaferCount = SRP_JSON(objJSON, 'GetValue', 'total')
SlotMap = SRP_JSON(objJSON, 'GetValue', 'slotMap')
SRP_JSON(objJSON, 'Release')
ToolCurrModeKey = Database_Services('ReadDataColumn', 'TOOL', ToolId, TOOL_CURR_MODE_KEY$, True$, 0, False$)
ToolCurrMode = Database_Services('ReadDataColumn', 'TOOL_LOG', ToolCurrModeKey, TOOL_LOG_TOOL_MODE$, True$, 0, False$)
If ToolCurrMode EQ 'PROD' OR ToolCurrMode EQ 'LIM' then
WaferCounterId = Wafer_Counter_Services('AddScan', CassID, WaferCount, ScanDtm, ToolID, UserId, Area, SlotMap)
If Error_Services('NoError') then
Lot_Event_Services('CreateLotEvent', CassId, ScanDtm, 'WAFER_COUNTER', 'Wafer counter data received for lot. ' : WaferCount : ' wafers found.', ToolId, UserId, True$, CassType)
end
end else
ErrorMessage = 'Wafer counter is currently down and cannot be used to log wafer counts.'
end
end else
ErrorMessage = 'Error parsing response from wafer counter.'
end
end else
ErrorMessage = Error_Services('GetMessage')
end
end else
ErrorMessage = 'Invalid tool scan.'
end
end else
ErrorMessage = 'Scan data was null.'
end
If ErrorMessage EQ '' then
Response = WaferCounterId
end else
Error_Services('Add', ErrorMessage)
end
end service
//----------------------------------------------------------------------------------------------------------------------
// GetWaferCounterJSONTestData
//
// Emulates GetWaferCounterJson service.
//----------------------------------------------------------------------------------------------------------------------
Service GetWaferCounterJSONTestData(WaferSize, ToolLocation, CassID)
If ( (WaferSize NE '') and (ToolLocation NE '') and (CassID NE '') ) then
Response = ''
objJson = ''
If SRP_JSON(objJson, 'New', 'Object') then
SRP_JSON(objJson, 'SetValue', 'dateTimeFormatted', Datetime(), 'String')
SRP_JSON(objJson, 'SetValue', 'equipmentId', 'WC8INCH1', 'String')
SRP_JSON(objJson, 'SetValue', 'total', 24, 'Number')
SRP_JSON(objJson, 'SetValue', 'slotMap', '1111111110111111111111111', 'String')
Response = SRP_Json(objJson, 'Stringify', 'Styled')
SRP_JSON(objJSON, 'Release')
end
If Error_Services('NoError') then
StatusCode = 200
If StatusCode NE 200 then
Begin Case
Case Response EQ ''
ErrorMsg = 'Unexpected server error.'
Case Response EQ 'No files!'
ErrorMsg = 'No data. Please re-seat cassette and try again.'
Case Otherwise$
// Use message in response body to populate error services
ErrorMsg = Response
End Case
Error_Services('Add', ErrorMsg)
end
end
end
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -405,3 +565,4 @@ ClearCursors:
return

View File

@ -1231,19 +1231,23 @@ Service SignVoidNonEpp(WOMatKey, Username)
Service_Services('PostProcedure', 'RDS_SERVICES', 'DetachRDSFromWO':@vm:RDSNo)
If Error_Services('NoError') then
LotEventParams = ''
LotEventParams<1,1> = 'CreateLotEvent'
LotEventParams<1,4> = DateTime()
LotEventParams<1,5> = 'VOID'
LotEventParams<1,6> = 'Lot voided by ' : Username
LotEventParams<1,11> = Username
LotEventParams<1,1> = 'CreateLotEvent' ; //Service Module
LotEventParams<1,2> = ''; //Legacy Lot Id, set below
LotEventParams<1,3> = DateTime(); //Datetime
LotEventParams<1,4> = 'VOID'; //Event Type
LotEventParams<1,5> = 'Lot voided by ' : Username; //Event Note
LotEventParams<1,6> = ''; //Equipment id
LotEventParams<1,7> = Username ;//User Id
LotEventParams<1,8> = True$; //IsLegacyLotId
LotEventParams<1,9> = ''; //Legacy Lot Type, set below
If RDSNo NE '' then
LotEventParams<1,2> = RDSNo
LotEventParams<1,3> = 'RDS'
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams)
LotEventParams<1,9> = 'RDS'; //Legacy Lot Type
Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
end else
LotEventParams<1,2> = WoMatKey
LotEventParams<1,3> = 'WO_MAT'
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams)
LotEventParams<1,9> = 'WO_MAT'
Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
end
If Error_Services('NoError') then
//Add inventory transaction
@ -1311,13 +1315,15 @@ Service SignVoidWMI(WMInKey, Username)
If Error_Services('NoError') then
LotEventParams = ''
LotEventParams<1,1> = 'CreateLotEvent'
LotEventParams<1,4> = DateTime()
LotEventParams<1,5> = 'VOID'
LotEventParams<1,6> = 'Lot voided by ' : Username
LotEventParams<1,11> = Username
LotEventParams<1,2> = WMInKey
LotEventParams<1,3> = 'WM_IN'
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams)
LotEventParams<1,3> = DateTime()
LotEventParams<1,4> = 'VOID'
LotEventParams<1,5> = 'Lot voided by ' : Username
LotEventParams<1,6> = ''
LotEventParams<1,7> = Username
LotEventParams<1,8> = True$
LotEventParams<1,9> = 'WM_IN'
Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
If Error_Services('NoError') then
//Check if WMO is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record
WMOKey = WMInKey; //the paired WMO key is the same as the WMIKey
@ -1386,13 +1392,15 @@ Service SignVoidWMO(WMOutKey, Username)
If Error_Services('NoError') then
LotEventParams = ''
LotEventParams<1,1> = 'CreateLotEvent'
LotEventParams<1,4> = DateTime()
LotEventParams<1,5> = 'VOID'
LotEventParams<1,6> = 'Lot voided by ' : Username
LotEventParams<1,11> = Username
LotEventParams<1,2> = WMOutKey
LotEventParams<1,3> = 'WM_OUT'
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams)
LotEventParams<1,3> = DateTime()
LotEventParams<1,4> = 'VOID'
LotEventParams<1,5> = 'Lot voided by ' : Username
LotEventParams<1,6> = ''
LotEventParams<1,7> = Username
LotEventParams<1,8> = True$
LotEventParams<1,9> = 'WM_OUT'
Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
If Error_Services('NoError') then
//Check if WMI is also voided. If it is, remove it from the WO_MAT_KEY field in WO_LOG, and void the WO_MAT record
WMIKey = WMOutKey; //the paired WMO key is the same as the WMIKey
@ -1558,3 +1566,4 @@ ClearCursors:
return

View File

@ -181,14 +181,7 @@ DoRead:
Reactor = get_property( @window, '@Reactor' )
LoadedRDS = Xlate('REACT_STATUS', Reactor, 'LOAD_RDS', 'X')
LoadedRuns = ''
If LoadedRDS NE '' then
For each RDS in LoadedRDS using @VM setting vPos
Locate RDS in AllRDS using @VM setting rPos then
LoadedRuns<0, -1> = rPos
end
Next RDS
end
LoadedRuns = Xlate('RDS', LoadedRDS, 'RUN_ORDER_NUM', 'X')
LoadedData = ''
For each RDSNo in LoadedRDS using @VM setting vPos
@ -507,5 +500,3 @@ REACT_MODE:
END
RETURN

View File

@ -574,14 +574,15 @@ return
WRITE_RECORD:
WONo = Field(Name, '*', 1)
CassNo = Field(Name, '*', 2)
WOMatKeyID = Name
WONo = Field(Name, '*', 1)
CassNo = Field(Name, '*', 2)
WOMatKeyID = Name
If {REACTOR_TYPE} NE 'EPP' then
If {MAKEUP_BOX} then
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID)
If CurrWaferCount GT 0 then
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID)
CurrStatus = {CURR_STATUS}
If ( (CurrWaferCount GT 0) and (CurrStatus NE 'VOID') ) then
// Populate MAKEUP_WAFERS table
// Add/update cassette data to the MAKEUP_WAFERS table
If RowExists('MAKEUP_WAFERS', WOMatKeyID) then
@ -600,7 +601,7 @@ WRITE_RECORD:
MUWfrRec<MAKEUP_WAFERS.PROD_VER_NO$> = {PROD_VER_NO}
MUWfrRec<MAKEUP_WAFERS.CUST_PART_NO$> = {CUST_PART_NO}
MUWfrRec<MAKEUP_WAFERS.REACT_TYPE$> = {REACTOR_TYPE}
MUWfrRec<MAKEUP_WAFERS.CURR_STATUS_STATIC$> = {CURR_STATUS}
MUWfrRec<MAKEUP_WAFERS.CURR_STATUS_STATIC$> = CurrStatus
MUWfrRec<MAKEUP_WAFERS.WFR_QTY$> = CurrWaferCount
DateOut = Xlate('RDS', {RDS_NO}, 'DATE_OUT', 'X')
TimeOut = Xlate('RDS', {RDS_NO}, 'TIME_OUT', 'X') / 86400

View File

@ -2,9 +2,9 @@ Compile function WO_MAT_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services
Declare function Datetime
Declare function Datetime, GetTickCount
Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_Services, Logging_Services
Declare subroutine obj_wo_mat_log, Set_Status
Declare subroutine obj_wo_mat_log, Set_Status, Mona_Services
$insert LOGICAL
$Insert APP_INSERTS
@ -20,6 +20,13 @@ Headers = 'Logging DTM' : @FM : 'WOMatKey' : @FM : 'Missing Signature' : @FM :
objSyncLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
IsProd = Environment_Services('IsProd')
If IsProd EQ True$ then
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_WOMATSERVICES'
end else
MonaResource = 'GRP_OPENINSIGHT_MES_OP_FE_DEV_WOMATSERVICES'
end
GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end
@ -379,6 +386,9 @@ Service SyncWOMatInvActionsAndSigProfile(WOMatKey)
end service
Service CassetteIsLastInWo(WoMatKey)
StartTick = GetTickCount()
MetricName = 'CassetteIsLastInWo'
IsLastInWo = False$
If Unassigned(WoMatKey) or WoMatKey EQ '' or RowExists('WO_MAT', WoMatKey) NE True$ then
@ -424,6 +434,9 @@ Service CassetteIsLastInWo(WoMatKey)
end
Response = IsLastInWo
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service
Service SetWoMatVoidFlag(WoMatKey, Username)
@ -473,3 +486,4 @@ Service SetWoMatVoidFlag(WoMatKey, Username)
end service

View File

@ -1,7 +1,7 @@
compile insert NICA_CHECKLISTS_EQUATES
/*----------------------------------------
Author : Table Create Insert Routine
Written : 05/03/2025
Written : 03/06/2025
Description : Insert for Table NICA_CHECKLISTS
----------------------------------------*/
#ifndef __NICA_CHECKLISTS_EQUATES__
@ -13,6 +13,6 @@ compile insert NICA_CHECKLISTS_EQUATES
equ NICA_CHECKLISTS.NICA_ORDER_FLOW_TYPE$ to 4
equ NICA_CHECKLISTS.REACTOR_TYPES$ to 5
equ NICA_CHECKLISTS.REMOVE_IF_COMPLETE$ to 6
equ NICA_CHECKLISTS.REMOVE_IF_INTRUSIVE$ to 7
#endif

View File

@ -1,7 +1,7 @@
compile insert NICA_ORDERS_EQUATES
/*----------------------------------------
Author : Table Create Insert Routine
Written : 05/12/2024
Written : 28/05/2025
Description : Insert for Table NICA_ORDERS
----------------------------------------*/
#ifndef __NICA_ORDERS_EQUATES__
@ -16,9 +16,8 @@ compile insert NICA_ORDERS_EQUATES
equ NICA_ORDERS.ORDER_CHECKLIST_IDS$ to 7
equ NICA_ORDERS.ORDER_FLOW_IDS$ to 8
equ NICA_ORDERS.ORDER_RESPONSE_LEVEL$ to 9
equ NICA_ORDERS.CREATED_DTM$ to 10
equ NICA_ORDERS.CLOSED_DTM$ to 11
equ NICA_ORDERS.CREATED_DTM$ to 10
equ NICA_ORDERS.CLOSED_DTM$ to 11
equ NICA_ORDERS.INTRUSIVE$ to 12
#endif

View File

@ -12,6 +12,8 @@ compile insert PROC_QUEUE_EQUATES
equ PROC_QUEUE.LAST_ATTEMPT_DTM$ to 3
equ PROC_QUEUE.ERROR$ to 4
equ PROC_QUEUE.ENTRY_DTM$ to 5
equ PROC_QUEUE.NUM_ATTEMPTS$ to 6
#endif

View File

@ -0,0 +1,17 @@
compile insert PROC_QUEUE_FAILED_EQUATES
/*----------------------------------------
Author : Table Create Insert Routine
Written : 06/06/2025
Description : Insert for Table PROC_QUEUE_FAILED
----------------------------------------*/
#ifndef __PROC_QUEUE_FAILED_EQUATES__
#define __PROC_QUEUE_FAILED_EQUATES__
equ PROC_QUEUE_FAILED.PROC_NAME$ to 1
equ PROC_QUEUE_FAILED.PARAMS$ to 2
equ PROC_QUEUE_FAILED.COMP_DTM$ to 3
equ PROC_QUEUE_FAILED.ERROR$ to 4
equ PROC_QUEUE_FAILED.ENTRY_DTM$ to 5
equ PROC_QUEUE_FAILED.NUM_ATTEMPTS$ to 6
#endif

View File

@ -179,3 +179,4 @@ Equ PROD_SPEC_ANKO_MET_POCKETS$ To 166
Equ PROD_SPEC_ANKO_FULL_CHAR_POCKET$ To 167
Equ PROD_SPEC_ANKO_WAFER_SELECTION$ To 168
Equ PROD_SPEC_LOCKED_BY$ To 169
Equ PROD_SPEC_SHOW_SPEC_INST_ON_MU_ADD$ To 170

View File

@ -83,4 +83,5 @@ Equ REACTOR_HGCV_CHECKLIST_ACTIVE$ To 71
Equ REACTOR_INTRUSIVE_MAINT_CHECKLIST_ACTIVE$ To 72
Equ REACTOR_ABORT_ALARM_CHECKLIST_ACTIVE$ To 73
Equ REACTOR_ABORT_ALARM_COMPLETE$ To 74
Equ REACTOR_EXHAUST_CHAMBER_THK$ To 75

View File

@ -6,25 +6,27 @@ compile insert REACT_ITEM_EQUATES
----------------------------------------*/
Equ REACT_ITEM_RI_NO$ To 0
Equ REACT_ITEM_DESC$ To 1
Equ REACT_ITEM_ENTER_BY$ To 2
Equ REACT_ITEM_ENTER_DTM$ To 3
Equ REACT_ITEM_RETIRE_BY$ To 4
Equ REACT_ITEM_RETIRE_DT$ To 5
Equ REACT_ITEM_PART_TYPE$ To 6
Equ REACT_ITEM_MFR_CD$ To 7
Equ REACT_ITEM_MFR_PART_NO$ To 8
Equ REACT_ITEM_MFR_PART_NO_REV$ To 9
Equ REACT_ITEM_SERIAL_NO$ To 10
Equ REACT_ITEM_RI_TYPE$ To 11
Equ REACT_ITEM_SUSC_SIZE$ To 12
Equ REACT_ITEM_PKT_QTY$ To 13
Equ REACT_ITEM_PKT_SIZE$ To 14
Equ REACT_ITEM_NOTES$ To 15
Equ REACT_ITEM_PPLUS_RDS_NO$ To 16
Equ REACT_ITEM_SERIAL$ To 17
Equ REACT_ITEM_TUBE_GRADE$ To 18
Equ REACT_ITEM_TUBE_PRESS$ To 19
Equ REACT_ITEM_TUBE_STYLE$ To 20
Equ REACT_ITEM_NEW_OR_REFURB$ To 21
Equ REACT_ITEM_RI_NO$ To 0
Equ REACT_ITEM_DESC$ To 1
Equ REACT_ITEM_ENTER_BY$ To 2
Equ REACT_ITEM_ENTER_DTM$ To 3
Equ REACT_ITEM_RETIRE_BY$ To 4
Equ REACT_ITEM_RETIRE_DT$ To 5
Equ REACT_ITEM_PART_TYPE$ To 6
Equ REACT_ITEM_MFR_CD$ To 7
Equ REACT_ITEM_MFR_PART_NO$ To 8
Equ REACT_ITEM_MFR_PART_NO_REV$ To 9
Equ REACT_ITEM_SERIAL_NO$ To 10
Equ REACT_ITEM_RI_TYPE$ To 11
Equ REACT_ITEM_SUSC_SIZE$ To 12
Equ REACT_ITEM_PKT_QTY$ To 13
Equ REACT_ITEM_PKT_SIZE$ To 14
Equ REACT_ITEM_NOTES$ To 15
Equ REACT_ITEM_PPLUS_RDS_NO$ To 16
Equ REACT_ITEM_SERIAL$ To 17
Equ REACT_ITEM_TUBE_GRADE$ To 18
Equ REACT_ITEM_TUBE_PRESS$ To 19
Equ REACT_ITEM_TUBE_STYLE$ To 20
Equ REACT_ITEM_NEW_OR_REFURB$ To 21
Equ REACT_ITEM_CURR_STATUS_STATIC$ To 22

View File

@ -40,6 +40,9 @@ compile insert SCANS_EQUATES
equ SCANS.TW_LOT_QTY$ to 31
equ SCANS.TEST_RUN_TYPE_ID$ to 32
equ SCANS.TEST_RUN_TYPE_NAME$ to 33
equ SCANS.IS_AUTHORIZED_TO_OVERRIDE_ROTR$ to 34
#endif

View File

@ -156,4 +156,5 @@ Equ WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$ To 147
Equ WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$ To 148
Equ WO_MAT_HOLD_STAGE$ To 149
Equ WO_MAT_HOLD_INTERRUPTED$ To 150
Equ WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$ To 151