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,31>": "",
"<1,32>": "", "<1,32>": "",
"<1,33>": "", "<1,33>": "",
"<1,34>": "", "<1,34>": "LSL2*IMAGE*ICO*INFINEON",
"<1,35>": "", "<1,35>": "",
"<1,36>": "", "<1,36>": "",
"<1,37>": { "<1,37>": {

View File

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

View File

@ -40,7 +40,7 @@
"<8,2>": { "<8,2>": {
"<8,2,1>": "MET", "<8,2,1>": "MET",
"<8,2,2>": "Metrology", "<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>": {
"<8,3,1>": "MTC", "<8,3,1>": "MTC",

View File

@ -9,7 +9,7 @@
"<2>": "-1", "<2>": "-1",
"<3>": "-1", "<3>": "-1",
"<4>": "-1", "<4>": "-1",
"<5>": "16777215", "<5>": "-2",
"<6>": { "<6>": {
"<6,1>": { "<6,1>": {
"<6,1,1>": "Tahoma", "<6,1,1>": "Tahoma",
@ -31,7 +31,7 @@
} }
}, },
"<7>": "REACT_ITEM", "<7>": "REACT_ITEM",
"<8>": "BY @ID", "<8>": "BY-DSND ENTER_DTM",
"<9>": { "<9>": {
"<9,1>": { "<9,1>": {
"<9,1,1>": "RI_NO", "<9,1,1>": "RI_NO",
@ -120,6 +120,22 @@
"<9,11,4>": "C", "<9,11,4>": "C",
"<9,11,5>": "D4/", "<9,11,5>": "D4/",
"<9,11,6>": "Retire Dt" "<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", "<10>": "T",
@ -147,7 +163,17 @@
"<32>": "0", "<32>": "0",
"<33>": "1", "<33>": "1",
"<34>": "16777215", "<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", "<2>": "-1",
"<3>": "-1", "<3>": "-1",
"<4>": "-1", "<4>": "-1",
"<5>": "16777215", "<5>": "-2",
"<6>": { "<6>": {
"<6,1>": { "<6,1>": {
"<6,1,1>": "MS Sans Serif", "<6,1,1>": "MS Sans Serif",
@ -91,7 +91,17 @@
"<32>": "0", "<32>": "0",
"<33>": "1", "<33>": "1",
"<34>": "16777215", "<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 IF CLType = 'E' THEN
Desc = CLRec<CALIB_LIST_EQ_DESC$> Desc = CLRec<CALIB_LIST_EQ_DESC$>
SN = CLRec<CALIB_LIST_EQ_SN$> 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$ NewLine = Desc:' (S/N: ':SN:') located in the ':Loc:' is due for calibration on ':NextCalDt:CRLF$
END END
IF CLType = 'S' THEN IF CLType = 'S' THEN

View File

@ -50,109 +50,112 @@ RETURN Result
* * * * * * * * * * * * * *
Create: 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 RETURN
* * * * * * * * * * * * * *
Refresh: Refresh:
* * * * * * * * * * * * * *
RETURN RETURN
* * * * * * * * * * * * * *
ReactNoGF: ReactNoGF:
* * * * * * * * * * * * * *
* Don't add a return here * Don't add a return here
* * * * * * * * * * * * * *
LUReactor: LUReactor:
* * * * * * * * * * * * * *
IF NOT(ASSIGNED(Parm1)) THEN FocusControl = '' ELSE FocusControl = Parm1 IF NOT(ASSIGNED(Parm1)) THEN FocusControl = '' ELSE FocusControl = Parm1
IF NOT(ASSIGNED(Parm2)) THEN FocusPos = '' ELSE FocusPos = Parm2 IF NOT(ASSIGNED(Parm2)) THEN FocusPos = '' ELSE FocusPos = Parm2
Set_Status(0) Set_Status(0)
TypeOver = '' TypeOver = ''
TypeOver<PSELECT$> = '2' ;* Multiple Select TypeOver<PSELECT$> = '2' ;* Multiple Select
TypeOver<PTYPE$> = 'E' ;* Return entire row 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 '') LineCnt = COUNT(ReactData,@FM) + (ReactData NE '')
ColCnt = 7 ColCnt = 7
FOR Line = 1 TO LineCnt FOR Line = 1 TO LineCnt
FOR Column = 2 TO ColCnt FOR Column = 2 TO ColCnt
stat = Send_Message(@WINDOW:'.REACT_NO','COLOR_BY_POS',Column,Line,GREEN$) stat = Send_Message(@WINDOW:'.REACT_NO','COLOR_BY_POS',Column,Line,GREEN$)
NEXT Column NEXT Column
NEXT Line NEXT Line
RETURN RETURN
* * * * * * * * * * * * * *
Cancel: Cancel:
* * * * * * * * * * * * * *
End_Dialog(@WINDOW,'') End_Dialog(@WINDOW,'')
RETURN RETURN
* * * * * * * * * * * * * *
PostEntries: PostEntries:
* * * * * * * * * * * * * *
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
EventKeys = '' ;* Keys to return to the REACT_EVENT window for a browse of the newly created records
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
ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '') ReactNos = Get_Property(@WINDOW:'.REACT_NO','ARRAY')<COL$REACT_NO>
Comment = Get_Property(@WINDOW:'.COMMENT','DEFPROP')
FOR I = 1 TO ReactCnt LOOP
ReactNo = ReactNos<1,I> TestChar = ReactNos[-1,1]
CurrMode = XLATE('REACTOR',ReactNo,'CURR_MODE','X') 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
IF ReactNos NE '' AND Comment NE '' THEN
obj_React_Event('Create',ReactNo:@RM:EventDTM:@RM:EventType:@RM:LoggedBy:@RM:Comment:@RM:@RM:CurrMode) EventDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') ;* Same DTM for all new records
EventKeys<I> = ReactNo:'*':ICONV(EventDTM,'DT') EventType = 'PD' ;* Passdown
NEXT I LoggedBy = @USER4
END ReactCnt = COUNT(ReactNos,@VM) + (ReactNos NE '')
End_Dialog(@WINDOW,EventKeys) 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)
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
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 RETURN

View File

@ -581,171 +581,131 @@ Refresh:
// RDS_UNLOAD // RDS_UNLOAD
If @WINDOW EQ 'RDS_UNLOAD' then 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
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 (DevelopmentFlag EQ True$) then If (MetList<Line,COL$UL_MET_RESULT> EQ '') then
Color = YELLOW$
CtrlName = @WINDOW:'.EDT_QA_MET' stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
Set_Property(@Window : '.MET_TEST', 'VISIBLE', False$) NoError = False$
Set_Property(CtrlName, 'VISIBLE', True$) end
MetList = Get_Property(CtrlName,'LIST')
ThickOutOfSpec = False$ If QAMetOutofSpec EQ True$ then
CresOutOfSpec = False$ Color = BYELLOW$:@FM:BLACK$:@FM:BYELLOW$:@FM:BLACK$
MLCnt = COUNT(MetList,@FM) + (MetList NE '') stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
FOR Line = 1 TO MLCnt NoError = False$
IF MetList<Line,COL$UL_MET_TEST> NE '' THEN end
MetResult = MetList<Line,COL$UL_MET_RESULT>
MetMin = MetList<Line,COL$UL_MET_MIN> If (MetResult LT MetMin) then
MetMax = MetList<Line,COL$UL_MET_MAX> Color = RED$:@FM:'':@FM:BRED$:@FM:''
PhaseMin = MetList<Line,COL$UL_MET_PHASE_MIN> stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
PhaseResult = MetList<Line,COL$UL_MET_PHASE_RESULT> NoError = False$
ScanRecipe = MetList<Line,COL$UL_MET_RECIPE> end
PSN = Get_Property(@Window : '.PSN', 'TEXT')
PRSStageKey = PSN:'*UNLOAD' If (MetResult GT MetMax) then
MetTest = MetList<Line,COL$UL_MET_TEST> Color = RED$:@FM:'':@FM:BRED$:@FM:''
PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey) stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
SpecTests = PRSStageRec<PRS_STAGE_MET_TEST$> NoError = False$
SpecRecipe = '' end
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
QAMetKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X') If (PhaseResult LT PhaseMin) then
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', QAMetKey) Color = RED$:@FM:'':@FM:BRED$:@FM:''
DataPoints = WOMatQARec<WO_MAT_QA_DATA_POINTS$, Line> stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_PHASE_RESULT, Line, Color)
Begin Case NoError = False$
Case MetTest EQ 'THICK_ONLY' end
// Check each point to see if any are out of spec
For each DataPoint in DataPoints using @SVM setting ThickIndex QAFailReason = WOMatQARec<WO_MAT_QA_FAIL_REASON$, Line>
Until DataPoint EQ '' DetectedFail = Index(QAFailReason, 'Number of data points is less than the required amount', 1)
Begin Case If (ScanRecipe NE SpecRecipe) OR (DetectedFail) then
Case ThickIndex GT 10 Color = RED$:@FM:'':@FM:BRED$:@FM:''
Null stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RECIPE, Line, Color)
Case (DataPoint EQ '') NoError = False$
ThickOutOfSpec = True$ end
Case (DataPoint GT MetMax) OR (DataPoint LT MetMin)
ThickOutOfSpec = True$ If (NoError EQ True$) then
End Case Color = GREEN$
Next DataPoint stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
end
Case MetTest EQ 'CRES'
// Check critical points to see if any are out of spec (both HgCV and Phase) END ELSE
CriticalPoints = '1,2,5,6,9' Color = GREEN$
For each DataPoint in DataPoints using @SVM setting CresIndex stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
Until DataPoint EQ '' END
HgCVDataPoint = DataPoint[1, 'F':@TM]
PhaseDataPoint = DataPoint[-1, 'B':@TM] NEXT Line
CriticalPoint = Index(CriticalPoints, CresIndex, 1)
Begin Case Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton)
Case (HgCVDataPoint EQ '') and CriticalPoint
CresOutOfSpec = True$ IF MemberOf(@USER4, 'OI_ADMIN') THEN
Case (PhaseDataPoint EQ '') and CriticalPoint Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1)
CresOutOfSpec = True$ END ELSE
Case (HgCVDataPoint GT MetMax) OR (HgCVDataPoint LT MetMin) and CriticalPoint Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0)
CresOutOfSpec = True$ END
Case (PhaseDataPoint LT PhaseMin) and CriticalPoint end
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 (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 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 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 (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 (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
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 (NoError EQ True$) then
Color = GREEN$
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
end
END ELSE
Color = GREEN$
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
END
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
* End of check for Unload OR Post_Epi windows * End of check for Unload OR Post_Epi windows
**************************************************************************************************************************************** ****************************************************************************************************************************************
@ -2669,9 +2629,8 @@ MetTestDC:
Lines = Get_Property(@WINDOW:'.MET_TEST', 'LIST') Lines = Get_Property(@WINDOW:'.MET_TEST', 'LIST')
TestLine = Lines<CurrRow> TestLine = Lines<CurrRow>
LWRHOTest = Indexc(TestLine, 'LW_RHO', 1) 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':@RM ; Props := 'SELPOS':@RM
Ctrls := @WINDOW:'.EDT_QA_MET' ; Props := 'LIST' Ctrls := @WINDOW:'.EDT_QA_MET' ; Props := 'LIST'
end else end else
@ -2708,8 +2667,7 @@ MetTestDC:
BEGIN CASE BEGIN CASE
CASE MetTest EQ '' CASE MetTest EQ ''
Null Null
CASE (@WINDOW = 'RDS_UNLOAD') and (LWRHOTest EQ False$)
CASE (@WINDOW = 'RDS_UNLOAD') and (DevelopmentFlag EQ True$) and (LWRHOTest EQ False$)
ReturnVal = Dialog_Box('NDW_QA_MET_RESULT', @WINDOW, CassID) ReturnVal = Dialog_Box('NDW_QA_MET_RESULT', @WINDOW, CassID)
Send_Event(@Window, "READ") Send_Event(@Window, "READ")
CASE Otherwise$ CASE Otherwise$
@ -2863,57 +2821,47 @@ return
RefreshWaferCounterData: RefreshWaferCounterData:
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X') Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
If WCCheckEnabled then Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
QtyBackColor = GREEN$
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$) RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$) If RDSNo NE '' then
QtyBackColor = GREEN$ FqaWcRec = Wafer_Counter_Services('GetLastScan', RDSNo, 'QA')
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP') WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
If RDSNo NE '' then Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
FqaWcRec = Wafer_Counter_Services('GetLastScan', RDSNo, 'QA') WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$> Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
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 * * WaferCounter - Wafers Quantity Section *
***************************************** *****************************************
If (WaferCounterQty NE '') then If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$ If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$
end else end else
QtyBackColor = ORANGE$ QtyBackColor = ORANGE$
end end
WaferSize = Xlate('RDS', RDSNo, 'WAFER_SIZE', 'X') WaferSize = Xlate('RDS', RDSNo, 'WAFER_SIZE', 'X')
WaferSize = Field(WaferSize, ' ', 3, 1) WaferSize = Field(WaferSize, ' ', 3, 1)
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA') WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
If Error_Services('NoError') then If Error_Services('NoError') then
WCCurrMode = '' WCCurrMode = ''
If RowExists('TOOL', WCToolID) then If RowExists('TOOL', WCToolID) then
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X') WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X') WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD')) 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
end else end else
ErrMsg(Error_Services('GetMessage')) ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
end end
end else end else
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for RDS "':RDSNo:'".') ErrMsg(Error_Services('GetMessage'))
end end
end end else
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor) ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for RDS "':RDSNo:'".')
end
end else end
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', False$) Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
end
return 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 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 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 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 MSG_EQUATES
$Insert APPCOLORS $Insert APPCOLORS
@ -1229,64 +1229,51 @@ SvcsOptions:
If ItemType NE '' then If ItemType NE '' then
RetVal = '' RetVal = ''
ItemType = ICONV(ItemType,'[CONV_CODE_DESC,REACT_ITEM_TYPE]')
ItemType = ICONV(ItemType,'[CONV_CODE_DESC,REACT_ITEM_TYPE]') RIKeys = React_Item_Services('GetReactItems', ItemType, 'N,U')
OPEN 'DICT.REACT_ITEM' to DictReactItem else If Error_Services('NoError') then
ErrMsg('Unable to open DICT.REACT_ITEM')
return TypeOver = ''
end TypeOVer<PMODE$> = 'K'
TypeOver<PDISPLAY$> = RIKeys
SearchString = 'RI_TYPE':@VM:ItemType:@FM RetVal = Popup(@Window,TypeOver,'REACT_ITEM')
SearchString := 'CURR_STATUS':@VM:'N':@VM:'U':@FM
If RetVal NE '' then
RIKeys = '' obj_AppWindow('LUValReturn',RetVal:@RM:@Window:'.SERV_INFO':@RM:SelPos)
Option = ''
Flag = '' RIRec = XLATE('REACT_ITEM',RetVal,'','X')
Btree.Extract(SearchString,'REACT_ITEM',DictReactItem,RIKeys,Option,Flag) If RIRec<REACT_ITEM_RI_TYPE$> = 'T' then
If Get_Status(errCode) then CardWindow = 'REACT_ITEM'
ErrMsg(errCode) CardKey = RetVal
return DefaultRec = ''
end NewCardCtrl = ''
RecalcCtrl = @Window:'.SERV_INFO'
TypeOver = '' RecalcPos = SelPos
TypeOVer<PMODE$> = 'K' RetCtrl = @Window:'.SERV_INFO'
TypeOver<PDISPLAY$> = RIKeys RetPos = SelPos
RetVal = Popup(@Window,TypeOver,'REACT_ITEM')
oAParms = CardWindow:@RM:CardKey:@RM:DefaultRec:@RM:NewCardCtrl:@RM:RecalcCtrl:@RM:RecalcPos:@RM:RetCtrl:@RM:RetPos
If RetVal NE '' then
obj_AppWindow('LUValReturn',RetVal:@RM:@Window:'.SERV_INFO':@RM:SelPos) obj_AppWindow('ViewNewCard',oAParms)
RIRec = XLATE('REACT_ITEM',RetVal,'','X') Set_Property('REACT_ITEM.TUBE_GRADE','FOCUS',1)
If RIRec<REACT_ITEM_RI_TYPE$> = 'T' then If Get_Status(errCode) then
CardWindow = 'REACT_ITEM' ErrMsg(errCode)
CardKey = RetVal end
DefaultRec = '' end
NewCardCtrl = ''
RecalcCtrl = @Window:'.SERV_INFO' GoSub Refresh
RecalcPos = SelPos end
RetCtrl = @Window:'.SERV_INFO' end else
RetPos = SelPos Error_Services('DisplayError')
oAParms = CardWindow:@RM:CardKey:@RM:DefaultRec:@RM:NewCardCtrl:@RM:RecalcCtrl:@RM:RecalcPos:@RM:RetCtrl:@RM:RetPos
obj_AppWindow('ViewNewCard',oAParms)
Set_Property('REACT_ITEM.TUBE_GRADE','FOCUS',1)
If Get_Status(errCode) then
ErrMsg(errCode)
end
end
GoSub Refresh
end end
end ;* End of check for null SNReq end ;* End of check for null SNReq
End Case End Case
GoSub Refresh GoSub Refresh
@ -1877,4 +1864,3 @@ ColorRemRiTable:
return return

View File

@ -1099,7 +1099,7 @@ SignSupVer:
************************************************************************ ************************************************************************
WMOKey = Get_Property(@WINDOW,'ID') WMOKey = Get_Property(@WINDOW,'ID')
PSNo = Get_Property(@WINDOW:'.PS_NO)','TEXT') 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 IF (VerInst NE '') THEN
Yes = Dialog_Box( 'RDS_VER', @WINDOW, VerInst ) Yes = Dialog_Box( 'RDS_VER', @WINDOW, VerInst )
IF NOT(Yes) THEN IF NOT(Yes) THEN
@ -1107,29 +1107,25 @@ SignSupVer:
END END
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') WafersOut = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP') WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
************************************ ************************************
* Wafer Counter - Quantity Section * * Wafer Counter - Quantity Section *
************************************ ************************************
If (WaferCounterQty NE '') then If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersOut) then If (WaferCounterQty NE WafersOut) then
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Filled quantities do not match.') ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Filled quantities do not match.')
RETURN 0 RETURN 0
end end
end else end else
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.') ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
RETURN 0 RETURN 0
end end
end
************************** **************************
* Verify user's password * * Verify user's password *
@ -1711,129 +1707,142 @@ AddMakeup:
END END
NEXT I 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 If Continue then
Case Response EQ True$ Response = Dialog_Box('NDW_MAKEUP_WAFERS', @Window, WOMatKey)
// User requested to convert the current cassette into a makeup box.
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey) Begin Case
If Error_Services('NoError') then Case Response EQ True$
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. // User requested to convert the current cassette into a makeup box.
// Verify the quantity before proceeding. WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
If WMOutKey NE '' then If Error_Services('NoError') then
Parms = '' SAPBatchNo = WOMatRec<WO_MAT_SAP_BATCH_NO$>
Parms<1> = WMOutKey ; // Cassette to verify wafer count of. SAPTXDtm = WOMatRec<WO_MAT_SAP_TX_DTM$>
Parms<2> = 0 ; // Wafer count adjustment - 0 because converting box. AwaitingBatchNo = ( (SAPTXDtm NE '') and (SAPBatchNo EQ '') )
Parms<3> = 'MU' ; // Wafer counter tool location HasBatchNo = (SAPBatchNo NE '')
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms) FullBoxReject = (SAPBatchNo[-1, 1] = 'R')
If Proceed NE True$ then Return 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 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 end
CheckValue = 1 * Signature block added 10/6/2010 JCH *
Valid = Dialog_Box('NDW_VERIFY_USER', @Window, @User4)
FieldNo = WO_MAT_EPO_MAKEUP_BOX$ IF NOT(Valid) THEN RETURN ;* User is not worthy or can't type
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')
Send_Event(@WINDOW,'WRITE') ;* Write the record
WMOKey = WONo:'*':ProcStepNo:'*':CassNo obj_WM_Out('AddMakeupWafers',WMOutKey:@RM:EmptySlots:@RM:MakeupBox)
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:WMOKey) ;* Reread the updated record //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 RETURN
end else End Case
ErrMsg('WARNING: Error reading WO_MAT record.') end
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
end else end else
// Cassette is on hold so makeup wafers cannot be added. // 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.' ErrorMessage = 'Add MU Wafer Denied!. The cassette must be taken off hold before adding makeup wafers.'
@ -2280,58 +2289,50 @@ return
RefreshWaferCounterData: RefreshWaferCounterData:
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
If WCCheckEnabled then
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$) Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$) Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
QtyBackColor = GREEN$ QtyBackColor = GREEN$
WONo = Get_Property(@Window : '.WO_NO', 'TEXT') WONo = Get_Property(@Window : '.WO_NO', 'TEXT')
Cassette = Get_Property(@Window : '.OUT_CASS_NO', 'TEXT') Cassette = Get_Property(@Window : '.OUT_CASS_NO', 'TEXT')
WMOKey = WONo:'*1*':Cassette WMOKey = WONo:'*1*':Cassette
If WMOKey NE '*1*' then If WMOKey NE '*1*' then
FqaWcRec = Wafer_Counter_Services('GetLastScan', WMOKey, 'QA') FqaWcRec = Wafer_Counter_Services('GetLastScan', WMOKey, 'QA')
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$> WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty) Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
WafersFilled = Get_Property(@WINDOW:'.WAFER_CNT','TEXT') WafersFilled = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty) Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
************************************ ************************************
* Wafer Counter - Quantity Section * * Wafer Counter - Quantity Section *
************************************ ************************************
If (WaferCounterQty NE '') then If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersFilled) then QtyBackColor = RED$ If (WaferCounterQty NE WafersFilled) then QtyBackColor = RED$
end else end else
QtyBackColor = ORANGE$ QtyBackColor = ORANGE$
end end
WaferSize = Xlate('WM_OUT', WMOKey, 'WAFER_SIZE', 'X') WaferSize = Xlate('WM_OUT', WMOKey, 'WAFER_SIZE', 'X')
WaferSize = Field(WaferSize, ' ', 3, 1) WaferSize = Field(WaferSize, ' ', 3, 1)
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA') WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
If Error_Services('NoError') then If Error_Services('NoError') then
WCCurrMode = '' WCCurrMode = ''
If RowExists('TOOL', WCToolID) then If RowExists('TOOL', WCToolID) then
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X') WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X') WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD')) 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
end else end else
ErrMsg(Error_Services('GetMessage')) ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
end end
end else end else
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for WMO "':WMOKey:'".') ErrMsg(Error_Services('GetMessage'))
end 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)
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
return return

View File

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

View File

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

View File

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

View File

@ -2,9 +2,9 @@ Compile function Lot_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
Declare function TEST_WAFER_PROD_SERVICES, SRP_Datetime, Datetime, Database_Services, Lot_Services, Error_Services, RTI_CREATEGUID 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 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 APP_INSERTS
$Insert LOT_EQUATES $Insert LOT_EQUATES
$Insert TEST_WAFER_PROD_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 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' 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 GoToService
Return Response or "" Return Response or ""
@ -113,6 +120,9 @@ Service GenerateNewLotId(LotType)
end service end service
Service GetLotIdByLegacyLotIdAndType(LegacyLotId, LegacyLotType) Service GetLotIdByLegacyLotIdAndType(LegacyLotId, LegacyLotType)
StartTick = GetTickCount()
MetricName = 'GetLotIdByLegacyLotIdAndType'
Open 'DICT.LOT' to DictLot then Open 'DICT.LOT' to DictLot then
SearchString = '' SearchString = ''
@ -130,10 +140,16 @@ Service GetLotIdByLegacyLotIdAndType(LegacyLotId, LegacyLotType)
end else end else
ErrorMsg = 'Error in ':Service:' service. Error opening LOT dictionary.' ErrorMsg = 'Error in ':Service:' service. Error opening LOT dictionary.'
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, VendorCode, Username, PrinterID, LotId) Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, VendorCode, Username, PrinterID, LotId)
StartTick = GetTickCount()
MetricName = 'CreateNewLot'
CreatedLotNumber = '' CreatedLotNumber = ''
ErrorMessage = '' ErrorMessage = ''
Begin Case Begin Case
@ -279,6 +295,8 @@ Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, Vendo
end end
Response = CreatedLotNumber Response = CreatedLotNumber
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
End Service End Service
@ -484,6 +502,9 @@ end service
//Returns a @FM delimited list of operations in sequence //Returns a @FM delimited list of operations in sequence
Service GetLotOperationSequence(LotId) Service GetLotOperationSequence(LotId)
StartTick = GetTickCount()
MetricName = 'GetLotOperationSequence'
LotOperationsInSequence = '' LotOperationsInSequence = ''
If LotID NE '' then If LotID NE '' then
//Get Operations //Get Operations
@ -496,9 +517,15 @@ Service GetLotOperationSequence(LotId)
//error: lot id was null //error: lot id was null
end end
Response = LotOperationsInSequence Response = LotOperationsInSequence
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service GetLotCurrOperationId(LotId) Service GetLotCurrOperationId(LotId)
StartTick = GetTickCount()
MetricName = 'GetLotCurrOperationId'
CurrOperation = '' CurrOperation = ''
If LotID NE '' then If LotID NE '' then
//Get them in sequence first //Get them in sequence first
@ -515,9 +542,15 @@ Service GetLotCurrOperationId(LotId)
//error: lot id was null //error: lot id was null
end end
Response = CurrOperation Response = CurrOperation
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service GetLotCurrOperationName(LotId) Service GetLotCurrOperationName(LotId)
StartTick = GetTickCount()
MetricName = 'GetLotCurrOperationName'
CurrOperationId = '' CurrOperationId = ''
CurrOperationName = '' CurrOperationName = ''
If LotID NE '' then If LotID NE '' then
@ -536,6 +569,9 @@ Service GetLotCurrOperationName(LotId)
//error: lot id was null //error: lot id was null
end end
Response = CurrOperationName Response = CurrOperationName
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service AddLotOperationIntoSequence(LotId, NewOperationId, NewSequence, Rework) Service AddLotOperationIntoSequence(LotId, NewOperationId, NewSequence, Rework)
@ -591,6 +627,9 @@ Service AddLotOperationIntoSequence(LotId, NewOperationId, NewSequence, Rework)
end service end service
Service IsLotMovedIn(LotId) Service IsLotMovedIn(LotId)
StartTick = GetTickCount()
MetricName = 'IsLotMovedIn'
Response = '' Response = ''
If RowExists('LOT', LotId) then If RowExists('LOT', LotId) then
CurrOperId = Lot_Services('GetLotCurrOperationId', LotId) CurrOperId = Lot_Services('GetLotCurrOperationId', LotId)
@ -601,6 +640,9 @@ Service IsLotMovedIn(LotId)
Response = False$ Response = False$
end end
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service IsOperationCompleted(LotOperationId) Service IsOperationCompleted(LotOperationId)
@ -619,6 +661,8 @@ Service IsOperationCompleted(LotOperationId)
end service end service
Service MoveInLot(LotID, Operator) Service MoveInLot(LotID, Operator)
StartTick = GetTickCount()
MetricName = 'MoveInLot'
ErrorMessage = '' ErrorMessage = ''
ThisLotCurrOperationID = '' ThisLotCurrOperationID = ''
@ -667,9 +711,15 @@ Service MoveInLot(LotID, Operator)
Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$) Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service MoveOutLot(LotID, Operator) Service MoveOutLot(LotID, Operator)
StartTick = GetTickCount()
MetricName = 'MoveOutLot'
ErrorMessage = '' ErrorMessage = ''
ThisLotCurrOperationID = '' ThisLotCurrOperationID = ''
If LotId NE '' then If LotId NE '' then
@ -729,6 +779,9 @@ Service MoveOutLot(LotID, Operator)
Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$) Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$)
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service ConvertLotRecordToJson(LotId, ItemURL, CurrUser, FullObject=BOOLEAN) Service ConvertLotRecordToJson(LotId, ItemURL, CurrUser, FullObject=BOOLEAN)
@ -855,6 +908,9 @@ Service ConvertLotRecordToJson(LotId, ItemURL, CurrUser, FullObject=BOOLEAN)
end service end service
Service OpenLot(LotId) Service OpenLot(LotId)
StartTick = GetTickCount()
MetricName = 'OpenLot'
ErrorMessage = '' ErrorMessage = ''
If RowExists('LOT', LotId) then If RowExists('LOT', LotId) then
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
@ -871,9 +927,15 @@ Service OpenLot(LotId)
If ErrorMessage NE '' then If ErrorMessage NE '' then
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service CloseLot(LotId) Service CloseLot(LotId)
StartTick = GetTickCount()
MetricName = 'CloseLot'
ErrorMessage = '' ErrorMessage = ''
If RowExists('LOT', LotId) then If RowExists('LOT', LotId) then
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
@ -890,6 +952,9 @@ Service CloseLot(LotId)
If ErrorMessage NE '' then If ErrorMessage NE '' then
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service AutoCloseTestWaferLot(LotId, CloseUserId) Service AutoCloseTestWaferLot(LotId, CloseUserId)
@ -989,15 +1054,26 @@ Service AutoCloseTestWaferLot(LotId, CloseUserId)
end service end service
Service HoldLot(LotId, OperatorId) Service HoldLot(LotId, OperatorId)
StartTick = GetTickCount()
MetricName = 'HoldLot'
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service UnholdLot(LotId, OperatorId) Service UnholdLot(LotId, OperatorId)
StartTick = GetTickCount()
MetricName = 'UnholdLot'
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service ReduceLotWaferCount(LotId, ReductionQty, OperatorId) Service ReduceLotWaferCount(LotId, ReductionQty, OperatorId)
StartTick = GetTickCount()
MetricName = 'ReduceLotWaferCount'
ErrorMessage = '' ErrorMessage = ''
If RowExists('LOT', LotId) then If RowExists('LOT', LotId) then
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
@ -1043,9 +1119,15 @@ Service ReduceLotWaferCount(LotId, ReductionQty, OperatorId)
if ErrorMessage NE '' then if ErrorMessage NE '' then
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service IncreaseLotWaferCount(LotId, IncreaseQty, OperatorId) Service IncreaseLotWaferCount(LotId, IncreaseQty, OperatorId)
StartTick = GetTickCount()
MetricName = 'IncreaseLotWaferCount'
ErrorMessage = '' ErrorMessage = ''
If RowExists('LOT', LotId) then If RowExists('LOT', LotId) then
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
@ -1087,6 +1169,8 @@ Service IncreaseLotWaferCount(LotId, IncreaseQty, OperatorId)
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service OpenOIWizardCreateTWLotInBrowser() Service OpenOIWizardCreateTWLotInBrowser()
@ -1095,6 +1179,9 @@ Service OpenOIWizardCreateTWLotInBrowser()
end service end service
Service CreateNewVoidedLotRecord(LotId, LegacyLotId, LotType=LOT_TYPES, Username) Service CreateNewVoidedLotRecord(LotId, LegacyLotId, LotType=LOT_TYPES, Username)
StartTick = GetTickCount()
MetricName = 'CreateNewVoidedLotRecord'
ErrorMessage = '' ErrorMessage = ''
If RowExists('LSL_USERS', Username) then If RowExists('LSL_USERS', Username) then
If LotType NE '' then If LotType NE '' then
@ -1165,15 +1252,8 @@ Service CreateNewVoidedLotRecord(LotId, LegacyLotId, LotType=LOT_TYPES, Username
If ErrorMessage NE '' then If ErrorMessage NE '' then
//Todo Log Error Message //Todo Log Error Message
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service 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. -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 Declare function Get_Status, SRP_Datetime, Environment_Services, Httpclient_Services
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
@ -44,17 +44,31 @@ Options STATES = 'OK', 'WARNING', 'CRITICAL'
Service SendStatus(MonitorName=MONITORS, StatusName, CurrentState=STATES) Service SendStatus(MonitorName=MONITORS, StatusName, CurrentState=STATES)
Mona_Services("SendBufferedStatus", MonitorName, StatusName, CurrentState) Mona_Services("PostStatus", MonitorName, StatusName, CurrentState)
end service 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) Service SendMetric(MonitorName=MONITORS, MetricName, Number)
Mona_Services("SendBufferedAverageMetric", MonitorName, MetricName, Number) Mona_Services("PostAverageMetric", MonitorName, MetricName, Number)
end Service 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) Service SendBufferedStatus(MonaResource, StatusName, StatusValue)
@ -172,6 +186,67 @@ Service SendBufferedAverageMetric(MonaResource, MetricName, MetricValue)
end service 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: SwapResourceNames:
@ -195,3 +270,4 @@ SwapResourceNames:
return 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 #window NDW_ADJUST_LOT_QTY
Declare function MemberOf, Database_Services, Error_Services, Datetime 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 App_Inserts
$Insert Lot_Equates $Insert Lot_Equates
@ -125,10 +125,16 @@ Event PUB_SUBMIT.CLICK()
Begin Case Begin Case
Case NewWfrQty LT CurrWfrQty Case NewWfrQty LT CurrWfrQty
AmountToDecrease = CurrWfrQty - NewWfrQty AmountToDecrease = CurrWfrQty - NewWfrQty
Lot_Services('ReduceLotWaferCount', LotId, AmountToDecrease, @User4) 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 Case NewWfrQty GT CurrWfrQty
AmountToIncrease = NewWfrQty - CurrWfrQty AmountToIncrease = NewWfrQty - CurrWfrQty
Lot_Services('IncreaseLotWaferCount', LotId, AmountToIncrease, @User4) 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 End Case
If Error_Services('NoError') then If Error_Services('NoError') then
msg(@Window, 'Wafer quantity adjusted successfully!') 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 #window NDW_WAFER_COUNTS
Declare function Reactor_Services, Database_Services, Get_Property, Error_Services, Environment_Services Declare function Reactor_Services, Database_Services, Get_Property, Error_Services, Environment_Services
Declare function SRP_Array, Logging_Services Declare function SRP_Array, Logging_Services
Declare subroutine Set_Property, Logging_Services Declare subroutine Set_Property, Logging_Services, PlaceDialog
$Insert EVENT_SETUP $Insert EVENT_SETUP
$Insert APP_INSERTS $Insert APP_INSERTS
$Insert REACTOR_EQUATES $Insert REACTOR_EQUATES
EQU DATA_ASM_REACT_ID$ to 1 EQU DATA_ASM_REACT_ID$ to 1
EQU DATA_ASM_SUSC_CNT$ to 2 EQU DATA_ASM_SUSC_CNT$ to 2
EQU DATA_ASM_SUSC_THK$ to 3 EQU DATA_ASM_SUSC_THK$ to 3
EQU DATA_ASM_TUBE_CNT$ to 4 EQU DATA_ASM_TUBE_CNT$ to 4
EQU DATA_ASM_TUBE_THK$ to 5 EQU DATA_ASM_TUBE_THK$ to 5
EQU DATA_ASM_ARM_CNT$ to 6 EQU DATA_ASM_ARM_CNT$ to 6
EQU DATA_ASM_EXHAUST_THK$ to 7
EQU DATA_HTR_REACT_ID$ to 1 EQU DATA_HTR_REACT_ID$ to 1
EQU DATA_HTR_SUSC_CNT$ TO 2 EQU DATA_HTR_SUSC_CNT$ TO 2
EQU DATA_HTR_SUSC_THK$ TO 3 EQU DATA_HTR_SUSC_THK$ TO 3
EQU DATA_HTR_TUBE_CNT$ TO 4 EQU DATA_HTR_TUBE_CNT$ TO 4
EQU DATA_HTR_TUBE_THK$ TO 5 EQU DATA_HTR_TUBE_THK$ TO 5
EQU DATA_HTR_ARM_CNT$ TO 6 EQU DATA_HTR_ARM_CNT$ TO 6
EQU DATA_HTR_EXHAUST_THK$ TO 7
EQU DATA_EPP_REACT_ID$ to 1 EQU DATA_EPP_REACT_ID$ to 1
EQU DATA_EPP_SUSC_CNT$ TO 2 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_BELL_JAR_THK$ TO 5
EQU DATA_EPP_LOWER_QUARTZ_CNT$ TO 6 EQU DATA_EPP_LOWER_QUARTZ_CNT$ TO 6
EQU DATA_EPP_LOWER_QUARTZ_THK$ TO 7 EQU DATA_EPP_LOWER_QUARTZ_THK$ TO 7
EQU DATA_EPP_EXHAUST_THK$ TO 8
ASMDataTable = @Window : '.OLE_DATA_ASM' ASMDataTable = @Window : '.OLE_DATA_ASM'
HTRDataTable = @Window : '.OLE_DATA_HTR' HTRDataTable = @Window : '.OLE_DATA_HTR'
@ -49,11 +52,11 @@ If Event EQ 'OLE' then
Transfer Param1 to Event Transfer Param1 to Event
Transfer Param2 to Param1 Transfer Param2 to Param1
Transfer Param3 to Param2 Transfer Param3 to Param2
* Transfer Param4 to Param3 Transfer Param4 to Param3
* Transfer Param5 to Param4 Transfer Param5 to Param4
* Transfer Param6 to Param5 Transfer Param6 to Param5
* Transfer Param7 to Param6 Transfer Param7 to Param6
* Transfer Param8 to Param7 Transfer Param8 to Param7
end end
GoToEvent Event for CtrlEntId else GoToEvent Event for CtrlEntId else
@ -67,17 +70,25 @@ Return EventFlow or 1
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam) Event WINDOW.CREATE(CreateParam)
GoSub SetupOLEControls GoSub SetupOLEControls
GoSub GetReactorMetrics GoSub GetReactorMetrics
End Event End Event
Event TABCONTROL_1.CLICK() Event TABCONTROL_1.CLICK()
Page = Get_Property(@Window : '.TABCONTROL_1', 'VALUE') Page = Get_Property(@Window : '.TABCONTROL_1', 'VALUE')
Set_Property(@WINDOW,'VPOSITION', Page) Set_Property(@WINDOW,'VPOSITION', Page)
end event end event
Event PUB_REFRESH_DATA.CLICK() Event PUB_REFRESH_DATA.CLICK()
GoSub GetReactorMetrics GoSub GetReactorMetrics
end event end event
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -85,6 +96,7 @@ end event
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
GetReactorMetrics: GetReactorMetrics:
ReactorRec = '' ReactorRec = ''
ASMData = '' ASMData = ''
HTRData = '' HTRData = ''
@ -105,12 +117,13 @@ GetReactorMetrics:
for each Reactor in ASMList using @FM setting rPos for each Reactor in ASMList using @FM setting rPos
MetricData = Reactor_Services('GetWaferCntMetricsByReactorID', Reactor) MetricData = Reactor_Services('GetWaferCntMetricsByReactorID', Reactor)
if Error_Services('NoError') then if Error_Services('NoError') then
ASMData<rPos, DATA_ASM_REACT_ID$> = MetricData<1, DATA_ASM_REACT_ID$> 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_CNT$> = MetricData<1, DATA_ASM_SUSC_CNT$>
ASMData<rPos, DATA_ASM_SUSC_THK$> = MetricData<1, DATA_ASM_SUSC_THK$> 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_CNT$> = MetricData<1, DATA_ASM_TUBE_CNT$>
ASMData<rPos, DATA_ASM_TUBE_THK$> = MetricData<1, DATA_ASM_TUBE_THK$> 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_ARM_CNT$> = MetricData<1, DATA_ASM_ARM_CNT$>
ASMData<rPos, DATA_ASM_EXHAUST_THK$> = MetricData<1, DATA_ASM_EXHAUST_THK$>
end else end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
LogData = LoggingDTM : @FM : ErrorMessage LogData = LoggingDTM : @FM : ErrorMessage
@ -123,12 +136,13 @@ GetReactorMetrics:
for each Reactor in HTRList using @FM setting rPos for each Reactor in HTRList using @FM setting rPos
MetricData = Reactor_Services('GetWaferCntMetricsByReactorID', Reactor) MetricData = Reactor_Services('GetWaferCntMetricsByReactorID', Reactor)
if Error_Services('NoError') then if Error_Services('NoError') then
HTRData<rPos, DATA_HTR_REACT_ID$> = MetricData <1, DATA_HTR_REACT_ID$> 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_CNT$> = MetricData<1, DATA_HTR_SUSC_CNT$>
HTRData<rPos, DATA_HTR_SUSC_THK$> = MetricData<1, DATA_HTR_SUSC_THK$> 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_CNT$> = MetricData<1, DATA_HTR_TUBE_CNT$>
HTRData<rPos, DATA_HTR_TUBE_THK$> = MetricData<1, DATA_HTR_TUBE_THK$> 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_ARM_CNT$> = MetricData<1, DATA_HTR_ARM_CNT$>
HTRData<rPos, DATA_HTR_EXHAUST_THK$> = MetricData<1, DATA_HTR_EXHAUST_THK$>
end else end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
LogData = LoggingDTM : @FM : ErrorMessage 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_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_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_LOWER_QUARTZ_THK$> = MetricData<1, DATA_EPP_LOWER_QUARTZ_THK$>
EPPData<rPos, DATA_EPP_EXHAUST_THK$> = MetricData<1, DATA_EPP_EXHAUST_THK$>
end else end else
ErrorMessage = Error_Services('GetMessage') ErrorMessage = Error_Services('GetMessage')
LogData = LoggingDTM : @FM : ErrorMessage LogData = LoggingDTM : @FM : ErrorMessage
@ -159,36 +174,55 @@ GetReactorMetrics:
return return
SetupOLEControls: SetupOLEControls:
//Set Row Headers to invisible // Set Row Headers to invisible
Set_Property(ASMDataTable, "OLE.HeaderColumn[1]", '':@FM:False$) Set_Property(ASMDataTable, "OLE.HeaderColumn[1]", '':@FM:False$)
Set_Property(HTRDataTable, "OLE.HeaderColumn[1]", '':@FM:False$) Set_Property(HTRDataTable, "OLE.HeaderColumn[1]", '':@FM:False$)
Set_Property(EPPDataTable, "OLE.HeaderColumn[1]", '':@FM:False$) Set_Property(EPPDataTable, "OLE.HeaderColumn[1]", '':@FM:False$)
//Set Number of columns for each table // Set Number of columns for each table
Set_Property(ASMDataTable, "OLE.Dimension", 6);*6 columns for ASM Data Table Set_Property(ASMDataTable, "OLE.Dimension", 7);*6 columns for ASM Data Table
Set_Property(HTRDataTable, "OLE.Dimension", 6);*6 columns for HTR Data Table Set_Property(HTRDataTable, "OLE.Dimension", 7);*6 columns for HTR Data Table
Set_Property(EPPDataTable, "OLE.Dimension", 7);*7 columns for EPP 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 = ''
ColSizeArray<1> = 100 ColSizeArray<1> = 115
Set_Property(ASMDataTable, "OLE.DataColumn[All]", ColSizeArray) Set_Property(ASMDataTable, "OLE.DataColumn[All]", ColSizeArray)
Set_Property(HTRDataTable, "OLE.DataColumn[All]", ColSizeArray) Set_Property(HTRDataTable, "OLE.DataColumn[All]", ColSizeArray)
Set_Property(EPPDataTable, "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 //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_Property(ASMDataTable, "OLE.TitleList", HeaderTitles)
//Set HTR Table Col. Headers //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_Property(HTRDataTable, "OLE.TitleList", HeaderTitles)
//Set EPP Table Col. Headers //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) Set_Property(EPPDataTable, "OLE.TitleList", HeaderTitles)
return return

View File

@ -50,11 +50,13 @@ Return Response or ""
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Service Parameter Options // Service Parameter Options
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options BOOLEAN = True$, False$ Options BOOLEAN = True$, False$
Options ENTITY_TYPES = 'REACTOR','REACTOR_LOG' 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_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 ORDER_STATUSES = 'new','in-edit','creating','not-started','in-progress','cancelled','done'
Options REACTOR_TYPES = 'ASM','ASM+','HTR','EPP' 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 // SERVICES
@ -85,6 +87,7 @@ Service GetOrderIds(EntityType=ENTITY_TYPES, EntityID, OrderTypes=ORDER_TYPES, O
For each Val in IsComplete using @VM For each Val in IsComplete using @VM
Query := @VM : Val Query := @VM : Val
Next Val Next Val
Query := @FM
end end
Btree.Extract(Query, Table, hDict, OrderKeys, Option, Flag) Btree.Extract(Query, Table, hDict, OrderKeys, Option, Flag)
If Flag NE 0 then If Flag NE 0 then
@ -106,6 +109,64 @@ Service GetOrderIds(EntityType=ENTITY_TYPES, EntityID, OrderTypes=ORDER_TYPES, O
End Service 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() Service GetOrderUpdates()
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
@ -188,13 +249,15 @@ end service
Service GetActiveOrders(EntityType=ENTITY_TYPES, EntityId, OrderTypes=ORDER_TYPES) Service GetActiveOrders(EntityType=ENTITY_TYPES, EntityId, OrderTypes=ORDER_TYPES)
Response = Nica_Orders_Services('GetOrderIds', EntityType, EntityID, OrderTypes, '#cancelled', False$:@VM:'') Response = Nica_Orders_Services('GetOrderIds', EntityType, EntityID, OrderTypes, '#cancelled', False$:@VM:'')
end service 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 = '' ErrorMsg = ''
EntityTypes = 'REACTOR,REACTOR_LOG' 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 LogData<3> = 'Attempting to create NICA order for entity ':EntityType:' ' :EntityID:' of type ':OrderType
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) 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 '') OrderTypeAlreadyActive = (CurrActiveOrders NE '')
If ( (OrderTypeAlreadyActive EQ False$) or (OrderType EQ 'INTRUSIVE_MAINT') or (OrderType EQ 'ABORT_ALARM') ) then 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 end
NewChecklistIds = SRP_Array('Clean', NewChecklistIds, 'TrimAndMakeUnique', @VM) 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') NewChecklistPriorities = Xlate('NICA_CHECKLISTS', NewChecklistIds, 'PRIORITY', 'X')
ChecklistArray = NewChecklistIds:@FM:NewChecklistPriorities ChecklistArray = NewChecklistIds:@FM:NewChecklistPriorities
ChecklistArray = SRP_Array('SortRows', ChecklistArray, 'AR2', 'ARRAY', @FM, @VM) ChecklistArray = SRP_Array('SortRows', ChecklistArray, 'AR2', 'ARRAY', @FM, @VM)
@ -369,6 +475,7 @@ Service CreateNewOrder(EntityType=ENTITY_TYPES, EntityID, OrderType=ORDER_TYPES,
end end
NicaOrderRec<NICA_ORDERS.ORDER_FLOW_IDS$> = OrderFlows NicaOrderRec<NICA_ORDERS.ORDER_FLOW_IDS$> = OrderFlows
NicaOrderRec<NICA_ORDERS.ORDER_RESPONSE_LEVEL$> = OrderResponseLevel NicaOrderRec<NICA_ORDERS.ORDER_RESPONSE_LEVEL$> = OrderResponseLevel
NicaOrderRec<NICA_ORDERS.INTRUSIVE$> = Intrusive
LogNicaOrderRec = NicaOrderRec LogNicaOrderRec = NicaOrderRec
Swap @FM with ',' in LogNicaOrderRec Swap @FM with ',' in LogNicaOrderRec
LogData = '' LogData = ''
@ -535,9 +642,9 @@ Service CancelOrder(OrderId)
If HttpResponseJson NE '' then If HttpResponseJson NE '' then
ObjResponseJson = '' ObjResponseJson = ''
If SRP_JSON(ObjResponseJson, 'Parse', HttpResponseJson) EQ '' then If SRP_JSON(ObjResponseJson, 'Parse', HttpResponseJson) EQ '' then
IsComplete = SRP_JSON(ObjResponseJson, 'GetValue', 'pendingUpdate') IsComplete = SRP_JSON(ObjResponseJson, 'GetValue', 'isComplete')
NicaOrderRec<NICA_ORDERS.ORDER_STATUS$> = SRP_JSON(ObjResponseJson, 'GetValue', 'state') NicaOrderRec<NICA_ORDERS.ORDER_STATUS$> = 'cancelled'
NicaOrderRec<NICA_ORDERS.IS_COMPLETE$> = SRP_JSON(ObjResponseJson, 'GetValue', 'isComplete') NicaOrderRec<NICA_ORDERS.IS_COMPLETE$> = IsComplete
CloseDtm = Datetime() CloseDtm = Datetime()
NicaOrderRec<NICA_ORDERS.CLOSED_DTM$> = CloseDtm NicaOrderRec<NICA_ORDERS.CLOSED_DTM$> = CloseDtm
If IsComplete EQ False$ then If IsComplete EQ False$ then
@ -900,8 +1007,120 @@ Service GetAvailableFlowIds(NicaOrderType=ORDER_TYPES)
end service 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 // 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 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 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 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$) objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM 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"' ErrTitle = 'Error in Stored Procedure "obj_Post_Log"'
ErrorMsg = '' ErrorMsg = ''
@ -115,7 +122,10 @@ RETURN
* * * * * * * * * * * * * *
Post: Post:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'Post'
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
ServiceKeyID = 'Obj_Post_Log*Post' ServiceKeyID = 'Obj_Post_Log*Post'
Lock hSysLists, ServiceKeyID then Lock hSysLists, ServiceKeyID then
@ -228,6 +238,10 @@ Post:
Unlock hSysLists, ServiceKeyID else Null Unlock hSysLists, ServiceKeyID else Null
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN

View File

@ -18,8 +18,8 @@ COMPILE FUNCTION obj_Reactor(Method,Parms)
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Mona_Services
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Environment_Services, GetTickCount
$INSERT REACTOR_EQUATES $INSERT REACTOR_EQUATES
@ -28,6 +28,14 @@ $INSERT REACT_STATE_EQUATES
$INSERT REACT_ITEM_EQUATES $INSERT REACT_ITEM_EQUATES
$INSERT MSG_EQUATES $INSERT MSG_EQUATES
$insert REACTOR_CHILD_KEY_IDS_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"' ErrTitle = 'Error in Stored Procedure "obj_Reactor"'
ErrorMsg = '' ErrorMsg = ''
@ -66,6 +74,9 @@ RETURN Result
CurrItem: CurrItem:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'CurrItem'
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
ItemType = Parms[COL2()+1,@RM] ItemType = Parms[COL2()+1,@RM]
ReactRec = 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) Result = FIELD(CurrInstItems<1,Pos>,'*',2)
END END
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN
@ -103,6 +117,9 @@ RETURN
CurrGraphite: CurrGraphite:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'CurrGraphite'
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
ReactRec = Parms[COL2()+1,@RM] ReactRec = Parms[COL2()+1,@RM]
@ -135,6 +152,9 @@ FOR I = 1 TO ciCnt
END END
NEXT I NEXT I
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN 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 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 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 ReactorLogRec<REACTOR_LOG_RI_POST_DTM$> = PostDTM
otParms = FIELDSTORE(otParms,@RM,4,0,ReactorLogRec) otParms = FIELDSTORE(otParms,@RM,4,0,ReactorLogRec)
//obj_Tables('WriteRec',otParms)
Database_Services('WriteDataRow', 'REACTOR_LOG', RLNo, ReactorLogRec, 1, 0, 1) 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', 'INST_RL_ID', False$, True$) ;* Don't wait for indexer - flush pending indexes now
Update_Index('REACT_ITEM_HIST', 'REM_RL_ID', False$, True$) Update_Index('REACT_ITEM_HIST', 'REM_RL_ID', False$, True$)
end else end else
Error_Services('Add', ValidationFailureReason) Error_Services('Add', ValidationFailureReason)
end end
RETURN RETURN
@ -386,10 +384,3 @@ RemHistKeys:
RETURN 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 FUNCTION Get_Status, Msg, Utility, obj_Tables, Send_Dyn, obj_Popup
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, Btree.Extract, React_Item_Services
DECLARE SUBROUTINE ErrMsg, Btree.Extract
$Insert LOGICAL
$INSERT REACT_ITEM_HIST_EQUATES $INSERT REACT_ITEM_HIST_EQUATES
$INSERT RLIST_EQUATES
EQU CRLF$ TO \0D0A\ EQU CRLF$ TO \0D0A\
EQU TAB$ TO CHAR(9) EQU TAB$ TO CHAR(9)
@ -62,26 +63,26 @@ RETURN Result
Install: Install:
* * * * * * * * * * * * * *
RIHKey = Parms[1,@RM] RIHKey = Parms[1,@RM]
RL_Id = Parms[COL2()+1,@RM] RL_Id = Parms[COL2()+1,@RM]
ReactWfrCnt = Parms[COL2()+1,@RM] ReactWfrCnt = Parms[COL2()+1,@RM]
ReactHrs = Parms[COL2()+1,@RM] ReactHrs = Parms[COL2()+1,@RM]
IF RIHKey = '' THEN ErrorMsg = 'Null Parameter "RIHKey" passed to routine. (':Method:')' 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 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 ErrorMsg NE '' THEN RETURN IF ErrorMsg NE '' THEN RETURN
RIHRec = '' RIHRec = ''
RIHRec<REACT_ITEM_HIST_INST_RL_ID$> = RL_ID RIHRec<REACT_ITEM_HIST_INST_RL_ID$> = RL_ID
RIHRec<REACT_ITEM_HIST_INST_REACT_WFR_CNT$> = ReactWfrCnt RIHRec<REACT_ITEM_HIST_INST_REACT_WFR_CNT$> = ReactWfrCnt
RIHRec<REACT_ITEM_HIST_INST_REACT_HRS$> = ReactHrs 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 RETURN
@ -90,38 +91,36 @@ RETURN
Remove: Remove:
* * * * * * * * * * * * * *
RIHKey = Parms[1,@RM] RIHKey = Parms[1,@RM]
RemoveDTM = Parms[COL2()+1,@RM] ;* Internal format * RemoveDTM = Parms[COL2()+1,@RM] ;* Internal format *
RL_Id = Parms[COL2()+1,@RM] RL_Id = Parms[COL2()+1,@RM]
ReactWfrCnt = Parms[COL2()+1,@RM] ReactWfrCnt = Parms[COL2()+1,@RM]
ReactHrs = Parms[COL2()+1,@RM] ReactHrs = Parms[COL2()+1,@RM]
IF RIHKey = '' THEN ErrorMsg = 'Null Parameter "RIHKey" passed to routine. (':Method:')' IF RIHKey = '' THEN ErrorMsg = 'Null Parameter "RIHKey" passed to routine. (':Method:')'
IF RemoveDTM = '' THEN ErrorMsg = 'Null Parameter "RemoveDTM" 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 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 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 RIHRec<REACT_ITEM_HIST_REM_DTM$> = RemoveDTM
Set_Status(0) RIHRec<REACT_ITEM_HIST_REM_RL_ID$> = RL_Id
RIHRec = '' RIHRec<REACT_ITEM_HIST_REM_REACT_WFR_CNT$> = ReactWfrCnt
END RIHRec<REACT_ITEM_HIST_REM_REACT_HRS$> = ReactHrs
RIHRec<REACT_ITEM_HIST_REM_DTM$> = RemoveDTM otParms = FIELDSTORE(otParms,@RM,4,0,RIHRec)
RIHRec<REACT_ITEM_HIST_REM_RL_ID$> = RL_Id obj_Tables('WriteRec',otParms)
RIHRec<REACT_ITEM_HIST_REM_REACT_WFR_CNT$> = ReactWfrCnt RINo = Field(RIHKey, '*', 2, 1)
RIHRec<REACT_ITEM_HIST_REM_REACT_HRS$> = ReactHrs React_Item_Services('UpdateReactItemStatus', RINo)
otParms = FIELDSTORE(otParms,@RM,4,0,RIHRec)
obj_Tables('WriteRec',otParms)
RETURN RETURN
@ -130,24 +129,21 @@ RETURN
ClearRemove: 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) otParms = FIELDSTORE(otParms,@RM,4,0,RIHRec)
obj_Tables('WriteRec',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)
RETURN RETURN
@ -156,49 +152,50 @@ RETURN
GetHistory: GetHistory:
* * * * * * * * * * * * * *
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
RINo = Parms[COL2()+1,@RM] RINo = Parms[COL2()+1,@RM]
RIType = 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 OPEN 'DICT.REACT_ITEM_HIST' TO DictVar ELSE
ErrorMsg = 'Unable to open DICT.REACT_ITEM_HIST for index lookup' ErrorMsg = 'Unable to open DICT.REACT_ITEM_HIST for index lookup'
RETURN RETURN
END END
Search = '' Search = ''
IF ReactNo NE '' THEN Search := 'REACT_NO':@VM:ReactNo:@FM IF ReactNo NE '' THEN Search := 'REACT_NO':@VM:ReactNo:@FM
IF RINo NE '' THEN Search := 'RI_NO':@VM:RINo:@FM IF RINo NE '' THEN Search := 'RI_NO':@VM:RINo:@FM
IF RIType NE '' THEN Search := 'RI_TYPE':@VM:RIType:@FM IF RIType NE '' THEN Search := 'RI_TYPE':@VM:RIType:@FM
Option = '' Option = ''
Flag = '' 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 = '' WorkList = ''
riCnt = COUNT(RIKeys,@VM) + (RIKeys NE '') riCnt = COUNT(RIKeys,@VM) + (RIKeys NE '')
FOR I = 1 TO riCnt FOR I = 1 TO riCnt
RIKey = RIKeys<1,I> RIKey = RIKeys<1,I>
WorkList<I> = FIELD(RIKey,'*',3):@VM:RIKey WorkList<I> = FIELD(RIKey,'*',3):@VM:RIKey
NEXT I 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 FOR I = 1 TO riCnt
Result<1,I> = WorkList<I,2> ;* Strip Sort column(s) Result<1,I> = WorkList<I,2> ;* Strip Sort column(s)
NEXT I NEXT I
RETURN 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 Get_Status, Msg, Utility, obj_Tables, NextKey, Send_Dyn, Database_Services, Error_Services
Declare function Environment_Services, GetTickCount
$INSERT REACT_STATE_EQUATES $INSERT REACT_STATE_EQUATES
$INSERT PROD_SPEC_EQUATES $INSERT PROD_SPEC_EQUATES
@ -28,6 +28,12 @@ $INSERT LOGICAL
EQU CRLF$ TO \0D0A\ EQU CRLF$ TO \0D0A\
EQU TAB$ TO \09\ 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"' ErrTitle = 'Error in Stored Procedure "obj_React_State"'
ErrorMsg = '' ErrorMsg = ''
@ -62,6 +68,9 @@ RETURN Result
ReactRunUnload: ReactRunUnload:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'ReactRunUnload'
* Upadate all parameters set at Reactor Unload signature * * Upadate all parameters set at Reactor Unload signature *
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
@ -115,6 +124,9 @@ end
* otParms = FieldStore(otParms,@RM,4,0,RSRec) * otParms = FieldStore(otParms,@RM,4,0,RSRec)
* obj_Tables('WriteRec',otParms) * obj_Tables('WriteRec',otParms)
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN

View File

@ -20,9 +20,9 @@ COMPILE FUNCTION obj_React_Status(Method,Parms)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box,NextKey, Popup, Get_Property, Database_Services 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 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 LOGICAL
$INSERT MSG_EQUATES $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' 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$) 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"' ErrTitle = 'Error in Stored Procedure "obj_React_Status"'
ErrorMsg = '' ErrorMsg = ''
@ -125,6 +132,9 @@ RETURN
CassLoad: CassLoad:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'CassLoad'
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
WONo = Parms[COL2()+1,@RM] WONo = Parms[COL2()+1,@RM]
CassNo = Parms[COL2()+1,@RM] CassNo = Parms[COL2()+1,@RM]
@ -202,6 +212,9 @@ CassLoad:
IdleTime = OCONV(ICONV(IdleTime*24,'MD2'),'MD2,') IdleTime = OCONV(ICONV(IdleTime*24,'MD2'),'MD2,')
Result = IdleTime Result = IdleTime
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN
@ -209,7 +222,9 @@ RETURN
* * * * * * * * * * * * * *
CassUnload: CassUnload:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'CassUnload'
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
WONo = Parms[COL2()+1,@RM] WONo = Parms[COL2()+1,@RM]
CassNo = Parms[COL2()+1,@RM] CassNo = Parms[COL2()+1,@RM]
@ -270,6 +285,9 @@ CassUnload:
If Error_Services('HasError') then If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage') ErrorMsg = Error_Services('GetMessage')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN
@ -277,7 +295,9 @@ RETURN
* * * * * * * * * * * * * *
ReactorLoad: ReactorLoad:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'ReactorLoad'
* EpiPro Reactor Load * EpiPro Reactor Load
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
@ -361,13 +381,18 @@ ReactorLoad:
end else end else
ErrorMsg = 'Unable to read REACT_STATUS record ':ReactNo:' for update (':Method:').' ErrorMsg = 'Unable to read REACT_STATUS record ':ReactNo:' for update (':Method:').'
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN
* * * * * * * * * * * * * *
ReactorUnload: ReactorUnload:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'ReactorUnload'
* EpiPro Reactor Unload * EpiPro Reactor Unload
ReactNo = Parms[1,@RM] ReactNo = Parms[1,@RM]
@ -431,6 +456,9 @@ ReactorUnload:
end else end else
ErrorMsg = Error_Services('GetMessage') ErrorMsg = Error_Services('GetMessage')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN 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 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 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 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 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_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 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 Logging_Services, Set_Property, Delete, Database_Services, SRP_Stopwatch, Material_Services
Declare subroutine Mona_Services
$Insert MSG_EQUATES $Insert MSG_EQUATES
$Insert WO_MAT_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' SAPHeaders = 'Logging DTM' : @FM : 'WOMatKey' : @FM : 'SAPBatchNo'
objSAPLog = Logging_Services('NewLog', SAPLogPath, SAPFileName, CRLF$, Comma$, SAPHeaders, '', False$, False$) 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(Method)) THEN ErrorMsg = 'Unassigned parameter "Method" passed to subroutine'
IF NOT(ASSIGNED(Parms)) THEN Parms = '' IF NOT(ASSIGNED(Parms)) THEN Parms = ''
@ -633,6 +641,9 @@ RETURN
* * * * * * * * * * * * * *
CurrStatus: CurrStatus:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'CurrStatus'
IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM] IF NOT(ASSIGNED(WOMatKey)) THEN WOMatKey = Parms[1,@RM]
IF NOT(ASSIGNED(WOMatRec)) THEN WOMatRec = Parms[COL2()+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' IF Result = 'RTS' AND WOMatRec<WO_MAT_SHIP_HOLD$> = 1 THEN Result = 'SHOLD'
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN
@ -5566,3 +5580,4 @@ ExpCOA:
RETURN 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 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 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 MSG_EQUATES
$INSERT WO_MAT_LOG_EQUATES $INSERT WO_MAT_LOG_EQUATES
@ -49,6 +49,13 @@ Headers = 'Logging DTM'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$) objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM 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"' ErrTitle = 'Error in Stored Procedure "obj_WO_Mat_Log"'
ErrorMsg = '' ErrorMsg = ''
@ -77,7 +84,9 @@ RETURN Result
* * * * * * * * * * * * * *
Create: Create:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'Create'
LogFile = Parms[1,@RM] LogFile = Parms[1,@RM]
TransDTM = Parms[COL2()+1,@RM] TransDTM = Parms[COL2()+1,@RM]
Action = Parms[COL2()+1,@RM] Action = Parms[COL2()+1,@RM]
@ -233,6 +242,8 @@ Create:
ErrorMsg = Error_Services('GetMessage') ErrorMsg = Error_Services('GetMessage')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN
@ -364,3 +375,4 @@ Post:
RETURN 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 FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, obj_WO_Mat_QA, GetTickCount
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, RList, ErrMsg, Btree.Extract, obj_WO_Mat_QA 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 MSG_EQUATES
$INSERT WO_REACT_EQUATES $INSERT WO_REACT_EQUATES
@ -24,6 +25,7 @@ $INSERT PRS_STAGE_EQUATES
$INSERT WO_MAT_EQUATES $INSERT WO_MAT_EQUATES
$INSERT RDS_EQUATES $INSERT RDS_EQUATES
$INSERT QA_MET_EQUATES ;* Used in GetQAMet data structure return variable $INSERT QA_MET_EQUATES ;* Used in GetQAMet data structure return variable
$Insert LOGICAL
ErrTitle = 'Error in Stored Procedure "obj_PRS_Prop"' ErrTitle = 'Error in Stored Procedure "obj_PRS_Prop"'
@ -40,6 +42,13 @@ END
Result = '' Result = ''
Log = '' 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 BEGIN CASE
CASE Method = 'AddRdsNo' ; GOSUB AddRdsNo CASE Method = 'AddRdsNo' ; GOSUB AddRdsNo
CASE Method = 'RemRdsNo' ; GOSUB RemRdsNo CASE Method = 'RemRdsNo' ; GOSUB RemRdsNo
@ -59,7 +68,10 @@ RETURN Result
* * * * * * * * * * * * * *
AddRdsNo: AddRdsNo:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'AddRdsNo'
WONo = Parms[1,@RM] WONo = Parms[1,@RM]
StepNo = Parms[COL2()+1,@RM] StepNo = Parms[COL2()+1,@RM]
@ -135,13 +147,19 @@ obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REA
Result = Log Result = Log
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN
* * * * * * * * * * * * * *
RemRDSNo: RemRDSNo:
* * * * * * * * * * * * * *
StartTick = GetTickCount()
MetricName = 'RemRDSNo'
WONo = Parms[1,@RM] WONo = Parms[1,@RM]
StepNo = Parms[COL2()+1,@RM] StepNo = Parms[COL2()+1,@RM]
@ -218,6 +236,9 @@ obj_Tables('WriteOnlyRec',otParms) ;* Done with updates to the WO_REA
Result = Log Result = Log
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
RETURN RETURN

View File

@ -1,7 +1,8 @@
Compile function Override_Log_Services(@Service, @Params) Compile function Override_Log_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
$insert LOGICAL $Insert SERVICE_SETUP
$insert APP_INSERTS
$Insert OVERRIDE_LOG_EQUATES $Insert OVERRIDE_LOG_EQUATES
Declare function Datetime, NextKey, Error_Services, SRP_Datetime 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='') Service Create(Table, Key, OverrideUser, OverrideComment, OverrideType=OVERRIDE_TYPES, OverrideCause='')
RecKey = '' ErrorMsg = ''
RecKey = ''
for each TableName in Table using @VM setting TablePos for each TableName in Table using @VM setting TablePos
RecKey<1,-1> = Nextkey('OVERRIDE_LOG') RecKey = Nextkey('OVERRIDE_LOG')
orRec = '' orRec = ''
orRec<OVERRIDE_LOG_TABLE$> = Table<1, TablePos> orRec<OVERRIDE_LOG_TABLE$> = Table<1, TablePos>
orRec<OVERRIDE_LOG_KEY$> = Key<1, TablePos> orRec<OVERRIDE_LOG_KEY$> = Key<1, TablePos>
@ -45,6 +47,7 @@ Service Create(Table, Key, OverrideUser, OverrideComment, OverrideType=OVERRIDE_
End Service End Service
Service GetOverrideLogKeys(EntityId, Table, Type, User, DateTimeFrom, DateTimeTo) Service GetOverrideLogKeys(EntityId, Table, Type, User, DateTimeFrom, DateTimeTo)
If DateTimeFrom EQ '' OR Not(Num(DateTimeFrom)) Or DateTimeFrom GT DateTimeTo then 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.') Error_Services('Add', 'Error in ' : service : ' unable to open OVERRIDE_LOG dictionary.')
end end
Response = keylist Response = keylist
end service 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 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 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 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 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 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 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' 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$) 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 GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.') Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end end
@ -229,12 +236,6 @@ Service CalculateHgCVData(Datapoints)
Min = Min(Min, DataPoint) Min = Min(Min, DataPoint)
Max = Max(Max, DataPoint) Max = Max(Max, DataPoint)
// Edge Mean Delta // 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 end
// Range % // Range %
Locate Index in RangePoints using ',' setting unusedIndex then Locate Index in RangePoints using ',' setting unusedIndex then
@ -256,25 +257,15 @@ Service CalculateHgCVData(Datapoints)
EdgeMean4mm = Edge4mmSum / 4 EdgeMean4mm = Edge4mmSum / 4
EdgeMean10mm = Edge10mmSum / 4 EdgeMean10mm = Edge10mmSum / 4
If EdgeMean10mm GT 0 then If EdgeMean10mm GT 0 then
* Delta1Avg = Delta1/4
* Delta2Avg = Delta2/4
EdgeMeanDelta = ( (Edge4mmSum - Edge10mmSum) / Edge10mmSum) * 100 ; // Changed divisor to Delta2Avg to match SPC - DJS EdgeMeanDelta = ( (Edge4mmSum - Edge10mmSum) / Edge10mmSum) * 100 ; // Changed divisor to Delta2Avg to match SPC - DJS
// Range % // Range %
Range = RangeMax - RangeMin Range = RangeMax - RangeMin
NumRangePoints = DCount(RangePoints, ',') NumRangePoints = DCount(RangePoints, ',')
RangeAvg = RangeAvg / NumRangePoints RangeAvg = RangeAvg / NumRangePoints
RangePct = (Range / RangeAvg) * 100 RangePct = (Range / RangeAvg) * 100
* EdgeMeanDelta = OConv(IConv(EdgeMeanDelta, 'MD3L'), 'MD3L')
* RangePct = OConv(IConv(RangePct, 'MD3L'), 'MD3L')
end end
// Average
Average = Sum / NumDataPoints Average = Sum / NumDataPoints
* Average = OConv(IConv(Average, 'MD3L'), 'MD3L')
* Min = OConv(IConv(Min, 'MD3L'), 'MD3L')
* Max = OConv(IConv(Max, 'MD3L'), 'MD3L')
FullAvg = '' FullAvg = ''
TotalDataPoints = DCount(DataPoints, @VM) TotalDataPoints = DCount(DataPoints, @VM)
If TotalDataPoints GT 0 then FullAvg = Sum(DataPoints)/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 Flag EQ 0 then
If RequestKeyID EQ '' then If RequestKeyID EQ '' then
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X') WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
FinalSigComp = False$ RequestDate = Date()
* FinalSigComp = Signature_Services('FinalSigComp', WOMatKey) RequestTime = Time()
If FinalSigComp NE True$ then RequestKeyID = RDSNo:'*':RequestDate :'*':RequestTime
// This is a new request RequestRow = ''
RequestDate = Date() Database_Services('WriteDataRow', 'ROTR_REQUESTS', RequestKeyID, RequestRow, True$, False$, True$)
RequestTime = Time() If Error_Services('NoError') then
RequestKeyID = RDSNo:'*':RequestDate :'*':RequestTime // Log success
RequestRow = '' LogData<3> = 'Successfully posted ROTR request for ':RDSNo:'.'
Database_Services('WriteDataRow', 'ROTR_REQUESTS', RequestKeyID, RequestRow, True$, False$, True$) Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
If Error_Services('NoError') then end else
// Log success ErrorMessage = Error_Services('GetMessage')
LogData<3> = 'Successfully posted ROTR request for ':RDSNo:'.' end
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
end else end else
ErrorMessage = 'Duplicate request found for RDS ':RDSNo:'. Request ignored.' ErrorMessage = 'Duplicate request found for RDS ':RDSNo:'. Request ignored.'
end end
@ -509,14 +493,7 @@ Service ProcessROTRRequest(RDSNo)
ResponseCopy = Response ResponseCopy = Response
Swap @FM with ',' in ResponseCopy Swap @FM with ',' in ResponseCopy
LogData<3> = 'ROTR Status response: ':Response LogData<3> = 'ROTR Status response: ':Response
Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM) 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$> = Response<1>
CIRec<CLEAN_INSP_ROTR_REACTOR_STATUS_REASON$> = Response<2> CIRec<CLEAN_INSP_ROTR_REACTOR_STATUS_REASON$> = Response<2>
CIRec<CLEAN_INSP_ROTR_REACTOR_NCR_COUNT$> = Response<3> 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> CIRec<CLEAN_INSP_ROTR_REACTOR_UCL_EXCEEDED_RUN_COUNT$> = Response<5>
// Set ROTR Update Flag to trigger CLEAN_INSP_ACTIONS routine (via BASE_MFS). // Set ROTR Update Flag to trigger CLEAN_INSP_ACTIONS routine (via BASE_MFS).
// That routine will recalculate the final ROTR status. // 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$) Database_Services('WriteDataRow', 'CLEAN_INSP', LWICINo, CIRec, True$, False$, True$)
end else end else
ErrorMessage = 'Error in service ':Service:'. Failed to retrieve ROTR status. Error message: ':Error_Services('GetMessage') ErrorMessage = 'Error in service ':Service:'. Failed to retrieve ROTR status. Error message: ':Error_Services('GetMessage')
@ -569,6 +545,7 @@ end service
// //
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service GetROTRStatus(RDSKey) Service GetROTRStatus(RDSKey)
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
WONo = RDSRec<RDS_WO$> WONo = RDSRec<RDS_WO$>
RDSCassNo = RDSRec<RDS_CASS_NO$> RDSCassNo = RDSRec<RDS_CASS_NO$>
@ -1187,7 +1164,7 @@ return
Service ProcessWaferImageRequests() Service ProcessWaferImageRequests()
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
Lock hSysLists, ServiceKeyID then Lock hSysLists, ServiceKeyID then
hWaferImageRequests = Database_Services('GetTableHandle', 'WAFER_IMAGE_REQUESTS') hWaferImageRequests = Database_Services('GetTableHandle', 'WAFER_IMAGE_REQUESTS')
@ -1218,12 +1195,7 @@ Service ProcessWaferImageRequests()
Reactor = Xlate('RDS', RDSNo, 'REACTOR', 'X') Reactor = Xlate('RDS', RDSNo, 'REACTOR', 'X')
PSN = Xlate('RDS', RDSNo, 'PROD_SPEC_ID', 'X') PSN = Xlate('RDS', RDSNo, 'PROD_SPEC_ID', 'X')
// Format Wafer Number for SQL Query // Format Wafer Number for SQL Query
WaferNo = TrimF(WaferNo) WaferNo = Fmt(TrimF(WaferNo), 'R(0)#2')
If WaferNo < 10 then
WaferNo = '*0' : WaferNo
end else
WaferNo = '*' : WaferNo
end
Query = "DECLARE @RDS varchar(10) " | Query = "DECLARE @RDS varchar(10) " |
: "DECLARE @RECIPE varchar(30) " | : "DECLARE @RECIPE varchar(30) " |
: "DECLARE @WFRID varchar(10) " | : "DECLARE @WFRID varchar(10) " |
@ -1245,7 +1217,7 @@ Service ProcessWaferImageRequests()
InsertDate = InsertDTM[1, 'F '] InsertDate = InsertDTM[1, 'F ']
Year = Field(InsertDate, '/', 3, 1) Year = Field(InsertDate, '/', 3, 1)
WorkWeek = 'WW':Date_Services('GetWeekNum', InsertDate) WorkWeek = 'WW':Date_Services('GetWeekNum', InsertDate)
PDFPath = WaferMapRoot:'_\':Year:'\':WorkWeek:'\':AttachmentID:'\image.pdf' PDFPath = WaferMapRoot:'\':Year:'\':WorkWeek:'\':AttachmentID:'\image.pdf'
Set_Status(0) Set_Status(0)
PDFFile = '' PDFFile = ''
OSRead PDFFile from PDFPath then OSRead PDFFile from PDFPath then
@ -1292,100 +1264,6 @@ Service ProcessWaferImageRequests()
end service 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 // PostToWaferImageQueue
// //
@ -1753,9 +1631,7 @@ Service ROTRImpactReport()
column = OleGetProperty( xlSht, 'Range' , 'K:K' ) column = OleGetProperty( xlSht, 'Range' , 'K:K' )
OlePutProperty( column , 'ColumnWidth' , '15' ) OlePutProperty( column , 'ColumnWidth' , '15' )
OlePutProperty( column , 'NumberFormat' , '0.0%' ) OlePutProperty( column , 'NumberFormat' , '0.0%' )
end end
end end
end service end service
@ -1802,6 +1678,8 @@ end service
// False$ otherwise. // False$ otherwise.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service PreEpiSignatureReady(RDSNo, Username, WaferQty, Reactor) Service PreEpiSignatureReady(RDSNo, Username, WaferQty, Reactor)
StartTick = GetTickCount()
MetricName = 'PreEpiSignatureReady'
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') or (Reactor EQ '') then 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.' ErrorMessage = 'RDSNo, Username, WaferQty, or Reactor not supplied in the ':Service:' service.'
@ -1900,6 +1778,8 @@ Service PreEpiSignatureReady(RDSNo, Username, WaferQty, Reactor)
Response = False$ Response = False$
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -1916,6 +1796,8 @@ end service
// Reponse - True$ if PRE stage was successfully signed, False$ otherwise. // Reponse - True$ if PRE stage was successfully signed, False$ otherwise.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry) Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
StartTick = GetTickCount()
MetricName = 'SignPreEpiStage'
Error_Services('Clear') Error_Services('Clear')
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') or (Reactor EQ '') then 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$> PreEpiSig = RDSRec<RDS_PRE_EPI_SIG$>
ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X') 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 WOMatKey = WONo:'*':CassNo
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey) WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
WOMatSigProfile = WOMatRec<WO_MAT_SIG_PROFILE$> WOMatSigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
SigAction = WOStep:'VER' SigAction = WOStep:'VER'
LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN
WOMatSig = WOMatRec<WO_MAT_SIGNATURE$,Pos> WOMatSig = WOMatRec<WO_MAT_SIGNATURE$,Pos>
CurrDTM = OCONV(WOMatRec<WO_MAT_SIG_DTM$,Pos>,'DT/4^HS') CurrDTM = OCONV(WOMatRec<WO_MAT_SIG_DTM$,Pos>,'DT/4^HS')
END ELSE END ELSE
WOMatSig = '' WOMatSig = ''
END END
RDSSig = PreEpiSig RDSSig = PreEpiSig
BEGIN CASE BEGIN CASE
CASE (WOMatSig EQ '') AND (RDSSig NE '') CASE (WOMatSig EQ '') AND (RDSSig NE '')
* Signature missing on WO_MAT * Signature missing on WO_MAT
SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$> SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$>
SigTime = RDSRec<RDS_PRE_EPI_SIG_TIME$> SigTime = RDSRec<RDS_PRE_EPI_SIG_TIME$>
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:RDSSig:@RM:SigDate:' ':SigTime owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:RDSSig:@RM:SigDate:' ':SigTime
* Sets VER signature * Sets VER signature
* obj_WO_Mat('SetSignature',owmParms) errCode = ''
errCode = '' IF Get_Status(errCode) THEN
IF Get_Status(errCode) THEN ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode
ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode Error_Services('Set', ErrorMsg)
Error_Services('Set', ErrorMsg) Response = False$
Response = False$ END else
END else Response = True$
Response = True$ end
end return
return
CASE (RDSSig = '') AND (WOMatSig NE '')
CASE (RDSSig = '') AND (WOMatSig NE '')
* Signature missing on RDS
* Signature missing on RDS CurrDate = CurrDTM[1,' ']
CurrDate = CurrDTM[1,' '] CurrTime = CurrDTM[COL2()+1,' ']
CurrTime = CurrDTM[COL2()+1,' '] RDSRec<RDS_PRE_EPI_SIG$> = WOMatSig
RDSRec<RDS_PRE_EPI_SIG$> = WOMatSig RDSRec<RDS_PRE_EPI_SIG_DATE$> = IConv(CurrDate, 'D')
RDSRec<RDS_PRE_EPI_SIG_DATE$> = IConv(CurrDate, 'D') RDSRec<RDS_PRE_EPI_SIG_TIME$> = IConv(CurrTime, 'MT')
RDSRec<RDS_PRE_EPI_SIG_TIME$> = IConv(CurrTime, 'MT') Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$) Response = True$
Response = True$ return
return
CASE RDSSig NE '' AND WOMatSig NE ''
CASE RDSSig NE '' AND WOMatSig NE ''
ErrorMessage = 'Process Error: Pre Epi stage has already been signed.'
ErrorMessage = 'Process Error: Pre Epi stage has already been signed.' Error_Services('Set', ErrorMessage)
Error_Services('Set', ErrorMessage) Response = False$
Response = False$ return
return
CASE Otherwise$
CASE Otherwise$ Null
Null
END CASE
END CASE
END ;* End of check for Reactor Type
END ;* End of check for Reactor Type
* END
SigDate = OCONV( Date(), 'D2/' ) SigDate = OCONV( Date(), 'D2/' )
SigTime = OCONV( Time(), 'MTS' ) 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 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 IF Get_Status(errCode) THEN
ErrorMessage = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode ErrorMessage = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode
Error_Services('Set', ErrorMessage) Error_Services('Set', ErrorMessage)
@ -2099,6 +1975,8 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
Response = False$ Response = False$
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -2118,6 +1996,8 @@ end service
// False$ otherwise. // False$ otherwise.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOpt) Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOpt)
StartTick = GetTickCount()
MetricName = 'LoadSignatureReady'
Error_Services('Clear') Error_Services('Clear')
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then
@ -2188,7 +2068,7 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
return return
end end
end end
// Ensure recipe parameters (RDS Layer parameters) have been manually entered or automatically applied. // Ensure recipe parameters (RDS Layer parameters) have been manually entered or automatically applied.
LSParmsComp = Xlate('RDS', RDSNo, 'LS_PARMS_COMP', 'X') LSParmsComp = Xlate('RDS', RDSNo, 'LS_PARMS_COMP', 'X')
Buf1 = DCount(LSParmsComp, @VM) Buf1 = DCount(LSParmsComp, @VM)
@ -2210,16 +2090,8 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
return return
end 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 Locate True$ in ParamOutOfSpec using @VM setting oPos then
IF Supplement NE True$ then IF Supplement NE True$ then
ErrorMsg = 'Process Error: Recipe parameters are out of spec and no supplement has been set.' ErrorMsg = 'Process Error: Recipe parameters are out of spec and no supplement has been set.'
Error_Services('Set', ErrorMsg) Error_Services('Set', ErrorMsg)
@ -2233,13 +2105,6 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
Response = False$ Response = False$
return return
end 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 //Added JRO 3/16/2021
//Load Lock Required Check //Load Lock Required Check
@ -2313,50 +2178,27 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
Response = False$ Response = False$
Return Return
END 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 NE 'EPP' THEN If ReactorType EQ 'EPP' then
WOMatKey = ''
If PreFlag EQ True$ then end else
// PRE and LOAD stages are being signed together. This is usually because the operator is loading a reactor WOMatKey = WONo:'*':CassNo
// using the barcode scanner, which attempts to sign both stages at once to save time. end
Stage = 'VER'
end else Signature_Services('CheckSigOrder', WOMatKey, Stage, False$, RDSNo)
Stage = 'LOAD'
end If Error_Services('HasError') then
Response = False$
If ReactorType EQ 'EPP' then Return
WOMatKey = '' end
end else
WOMatKey = WONo:'*':CassNo
end
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
SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$> SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$>
SigTime = RDSrec<RDS_PRE_EPI_SIG_TIME$> SigTime = RDSrec<RDS_PRE_EPI_SIG_TIME$>
@ -2402,9 +2244,13 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
Response = False$ Response = False$
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service LoadExtra1stReady(RDSNo) Service LoadExtra1stReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> 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 If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$ Response = True$
end end
end service end service
Service UnsignLoadExtra1stReady(RDSNo) Service UnsignLoadExtra1stReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2435,7 +2284,9 @@ Service UnsignLoadExtra1stReady(RDSNo)
end service end service
Service LoadExtra2ndReady(RDSNo) Service LoadExtra2ndReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> 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 If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$ Response = True$
end end
end service end service
Service UnsignLoadExtra2ndReady(RDSNo) Service UnsignLoadExtra2ndReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2463,8 +2317,10 @@ Service UnsignLoadExtra2ndReady(RDSNo)
Response = True$ Response = True$
end end
end end
end service end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
// SignLoadStage // SignLoadStage
// //
@ -2478,6 +2334,8 @@ end service
// False$ otherwise. // False$ otherwise.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry) Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
StartTick = GetTickCount()
MetricName = 'SignLoadStage'
Error_Services('Clear') Error_Services('Clear')
If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then If (RDSNo EQ '') or (Username EQ '') or (WaferQty EQ '') then
@ -2685,6 +2543,8 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
Response = False$ Response = False$
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -2700,6 +2560,8 @@ end service
// False$ otherwise. // False$ otherwise.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service UnloadSignatureReady(RDSNo, Username, Reactor) Service UnloadSignatureReady(RDSNo, Username, Reactor)
StartTick = GetTickCount()
MetricName = 'UnloadSignatureReady'
If (RDSNo EQ '') or (Username EQ '') or (Reactor EQ '') then If (RDSNo EQ '') or (Username EQ '') or (Reactor EQ '') then
ErrorMsg = 'RDSNo or Username or Reactor not supplied in the ':Service:' service.' ErrorMsg = 'RDSNo or Username or Reactor not supplied in the ':Service:' service.'
@ -2749,39 +2611,17 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
end end
ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X') ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X')
If ReactorType EQ 'EPP' then
* IF ReactorType NE 'EPP' THEN WOMatKey = ''
end else
WOMatKey = WONo:'*':CassNo
If ReactorType EQ 'EPP' then end
WOMatKey = ''
end else Signature_Services('CheckSigOrder', WOMatKey, 'UNLOAD', RDSNo)
WOMatKey = WONo:'*':CassNo If Error_Services('HasError') then
end Response = False$
return
Signature_Services('CheckSigOrder', WOMatKey, 'UNLOAD', RDSNo) end
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
LWIInstAckReq = Xlate('RDS', RDSNo, 'LWI_INST_ACK_REQ', 'X') LWIInstAckReq = Xlate('RDS', RDSNo, 'LWI_INST_ACK_REQ', 'X')
If LWIInstAckReq EQ True$ then If LWIInstAckReq EQ True$ then
@ -2799,7 +2639,6 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
return return
end 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 * Check for extra unloads without corresponding extra load
IF RDSRec<RDS_OP_OUT_EX1_DATE$> <> '' THEN IF RDSRec<RDS_OP_OUT_EX1_DATE$> <> '' THEN
IF RDSRec<RDS_OP_IN_EX2_DATE$> = '' THEN IF RDSRec<RDS_OP_IN_EX2_DATE$> = '' THEN
@ -2869,9 +2708,13 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
Response = False$ Response = False$
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service UnloadExtra1stReady(RDSNo) Service UnloadExtra1stReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> 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 If StandardLoadSignature NE '' AND UnloadExtra1Signature EQ '' AND LoadExtra1Signature EQ '' AND UnloadExtra2Signature EQ '' And LoadExtra2Signature eq '' and StandardUnloadSignature EQ '' then
Response = True$ Response = True$
end end
end service end service
Service UnloadExtra2ndReady(RDSNo) Service UnloadExtra2ndReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> 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 If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
Response = True$ Response = True$
end end
end service end service
Service UnsignUnloadExtra1stReady(RDSNo) Service UnsignUnloadExtra1stReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2916,7 +2765,9 @@ Service UnsignUnloadExtra1stReady(RDSNo)
end service end service
Service UnsignUnloadExtra2ndReady(RDSNo) Service UnsignUnloadExtra2ndReady(RDSNo)
Response = False$ Response = False$
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$> StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
@ -2930,6 +2781,7 @@ Service UnsignUnloadExtra2ndReady(RDSNo)
Response = True$ Response = True$
end end
end end
end service end service
@ -2944,6 +2796,9 @@ end service
// Response - True$ if UNLOAD stage was successfully signed , False$ otherwise. // Response - True$ if UNLOAD stage was successfully signed , False$ otherwise.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service SignUnloadStage(RDSNo, Username, ScanEntry) Service SignUnloadStage(RDSNo, Username, ScanEntry)
StartTick = GetTickCount()
MetricName = 'SignUnloadStage'
If (RDSNo EQ '') or (Username EQ '') then If (RDSNo EQ '') or (Username EQ '') then
ErrorMsg = 'RDSNo or Username not supplied in the ':Service:' service.' ErrorMsg = 'RDSNo or Username not supplied in the ':Service:' service.'
Error_Services('Add', ErrorMsg) Error_Services('Add', ErrorMsg)
@ -3016,7 +2871,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
* 4/30/2013 JCH added parms for merging of two methods * 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 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 IF Get_Status(errCode) THEN
ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within the ':Service:' service' 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) obj_React_Status('CassUnload',Reactor:@RM:WONo:@RM:CassNo:@RM:UnloadDTM:@RM:RDSNo)
IF Get_Status(errCode) THEN 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 = ''
LogData<1> = LoggingDTM LogData<1> = LoggingDTM
LogData<2> = @User4 LogData<2> = @User4
@ -3068,7 +2919,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
InCassettes = RDSRec<RDS_IN_CASS_NO$> InCassettes = RDSRec<RDS_IN_CASS_NO$>
InCassettes = SRP_Array('Clean', InCassettes, 'TrimAndMakeUnique', @VM) InCassettes = SRP_Array('Clean', InCassettes, 'TrimAndMakeUnique', @VM)
obj_React_Status('ReactorUnload',Reactor:@RM:WONo:@RM:InCassettes:@RM:UnloadDTM:@RM:RDSNo) obj_React_Status('ReactorUnload',Reactor:@RM:WONo:@RM:InCassettes:@RM:UnloadDTM:@RM:RDSNo)
//Reactor_Services('IncrementWfrMetrics', RDSNo)
end end
RDSRec<RDS_OPERATOR_OUT$> = SigBy RDSRec<RDS_OPERATOR_OUT$> = SigBy
@ -3141,6 +2991,8 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
Response = False$ Response = False$
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -3474,98 +3326,10 @@ Service SignFQAStage(RDSNo, Username)
END END
NEXT Index NEXT Index
END 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 * * 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} CassSchedWafers = {CASS_SHIP_QTY}
WafersOut = {WFRS_OUT} WafersOut = {WFRS_OUT}
@ -3585,23 +3349,18 @@ Service SignFQAStage(RDSNo, Username)
end end
********************************* *********************************
* Verify NCR total >= USL Fails * * 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 NCRStatus = QA_Services('GetNCRStatus', RDSNo)
! now. Once the user is informed, a LEAD or SUPERVISOR can scan their badge to override and complete the scan. If NCRStatus EQ False$ then
If Username EQ 'FRANCOIS_R' then If NOT( MemberOf(Username, 'LEAD') OR MemberOf(Username, 'SUPERVISOR') ) then
NCRStatus = QA_Services('GetNCRStatus', RDSNo) ErrorMsg = 'Unable to sign FQA because the total quantity of NCR wafers is less than the '|
If NCRStatus EQ False$ then : 'number of wafers above the USL threshold. A lead or supervisor must override.'
If NOT( MemberOf(Username, 'LEAD') OR MemberOf(Username, 'SUPERVISOR') ) then Error_Services('Add', ErrorMsg)
ErrorMsg = 'Unable to sign FQA because the total quantity of NCR wafers is less than the '| return
: 'number of wafers above the USL threshold. A lead or supervisor must override.' end
Error_Services('Add', ErrorMsg) end
return
end
end
end
************************* *************************
* Verify if Shift exist * * Verify if Shift exist *
@ -3663,21 +3422,19 @@ Service SignFQAStage(RDSNo, Username)
Next Test 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}
WONo = {WO} CassNo = {CASS_NO}
CassNo = {CASS_NO} WOMatQAKey = WONo : '*' : CassNo
WOMatQAKey = WONo : '*' : CassNo WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey) OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$> OutOfSpec = Sum(OutOfSpec)
OutOfSpec = Sum(OutOfSpec) If OutOfSpec GT 0 then
If OutOfSpec GT 0 then ErrorMsg = 'Process Error: One or more Unload QA Metrology results are out of specification.'
ErrorMsg = 'Process Error: One or more Unload QA Metrology results are out of specification.' Error_Services('Add', ErrorMsg)
Error_Services('Add', ErrorMsg) return
return end
end
end
******************************************* *******************************************
* Verify if all steps have been completed * * 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 ;* 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 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 IF Get_Status(errCode) THEN
ErrorMsg = 'Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode ErrorMsg = 'Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode
Error_Services('Add', ErrorMsg) Error_Services('Add', ErrorMsg)
@ -3888,3 +3643,4 @@ ClearCursors:
return return

View File

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

View File

@ -84,6 +84,7 @@ $Insert NOTIFICATION_EQUATES
$Insert DICT_EQUATES $Insert DICT_EQUATES
$Insert COMPANY_EQUATES $Insert COMPANY_EQUATES
$Insert RETURN_TO_FAB_LOTS_EQUATES $Insert RETURN_TO_FAB_LOTS_EQUATES
$Insert TEST_RUN_EQUATES
EQU COL$LSID TO 1 EQU COL$LSID TO 1
EQU COL$RECIPE TO 2 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 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 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 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 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 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 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$) objCtrlLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, COMMA$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM 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 GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.') Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end end
@ -225,6 +233,8 @@ End Service
// to an RDS record. // to an RDS record.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service AddComment(RDSNo, Comment, UsernameOpt) Service AddComment(RDSNo, Comment, UsernameOpt)
StartTick = GetTickCount()
MetricName = 'AddComment'
RDSRow = Database_Services('ReadDataRow', 'RDS', RDSNo) RDSRow = Database_Services('ReadDataRow', 'RDS', RDSNo)
Username = @USER4 Username = @USER4
@ -246,7 +256,9 @@ Service AddComment(RDSNo, Comment, UsernameOpt)
oblParms := Values:@RM oblParms := Values:@RM
oblParms := "TOP" :@VM: "TOP" :@VM: "TOP" oblParms := "TOP" :@VM: "TOP" :@VM: "TOP"
obj_Post_Log('Create',oblParms) obj_Post_Log('Create',oblParms)
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
End Service End Service
@ -749,6 +761,9 @@ Service IsValidSubLot(RDSNo, RDSType, SupplierLot)
end service end service
Service GetRDSRunHistoryByReactorAndWO(ReactorNo, WO) Service GetRDSRunHistoryByReactorAndWO(ReactorNo, WO)
StartTick = GetTickCount()
MetricName = 'GetRDSRunHistoryByReactorAndWO'
table = "RDS" table = "RDS"
ErrorMessage = '' ErrorMessage = ''
RDSRecords = '' RDSRecords = ''
@ -782,10 +797,16 @@ Service GetRDSRunHistoryByReactorAndWO(ReactorNo, WO)
end end
Next RDS Next RDS
Response = FinalRDSSortedByAssignmentDTM<1> Response = FinalRDSSortedByAssignmentDTM<1>
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service IsTWLoggingReqd(RDSNo) Service IsTWLoggingReqd(RDSNo)
StartTick = GetTickCount()
MetricName = 'IsTWLoggingReqd'
IsTWReqd = False$ IsTWReqd = False$
ExistingTWRuns = Test_Run_Services('GetTestRunKeysByRDS', RDSNo) ExistingTWRuns = Test_Run_Services('GetTestRunKeysByRDS', RDSNo)
If ExistingTWRuns EQ '' then If ExistingTWRuns EQ '' then
@ -808,7 +829,7 @@ Service IsTWLoggingReqd(RDSNo)
Layer = Field(PRSPropKey, '*', 2) Layer = Field(PRSPropKey, '*', 2)
MeasureFreq = PRSPropRec<PRS_PROP_FREQ$> MeasureFreq = PRSPropRec<PRS_PROP_FREQ$>
Start = PRSPropRec<PRS_PROP_MET_START$> 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 BEGIN CASE
CASE MeasureFreq = 'F' AND ThisReactorRunOrder = 1 ; IsTWReqd = 1 CASE MeasureFreq = 'F' AND ThisReactorRunOrder = 1 ; IsTWReqd = 1
CASE ThisReactorRunOrder = Start ; IsTWReqd = 1 CASE ThisReactorRunOrder = Start ; IsTWReqd = 1
@ -846,6 +867,30 @@ Service IsTWLoggingReqd(RDSNo)
IsTWReqd = False$ IsTWReqd = False$
end end
Response = IsTWReqd 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 end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
@ -1077,6 +1122,8 @@ end service
Service CopyRDSLayerParameters(RDSNo) Service CopyRDSLayerParameters(RDSNo)
StartTick = GetTickCount()
MetricName = 'CopyRDSLayerParameters'
If (RDSNo NE '') then If (RDSNo NE '') then
RunOrderNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X') RunOrderNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X')
@ -1129,6 +1176,8 @@ Service CopyRDSLayerParameters(RDSNo)
Error_Services('Add', 'RDSNo not supplied in ':Service:' service.') Error_Services('Add', 'RDSNo not supplied in ':Service:' service.')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -1805,3 +1854,6 @@ return

View File

@ -277,6 +277,7 @@ Event PUB_SIGN.CLICK()
end end
If (Valid EQ True$) then If (Valid EQ True$) then
ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X') ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X')
ErrMsg = ''
If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then
WoMatKey = WONo:'*':CassNo WoMatKey = WONo:'*':CassNo
IsLastCassetteInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey) IsLastCassetteInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey)
@ -298,26 +299,44 @@ Event PUB_SIGN.CLICK()
WoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey) WoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey)
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = True$ WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = True$
Message = '' TestWaferRanSinceLoad = WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$>
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
Message = 'No material scheduled. Test wafer required.' If TestWaferRanSinceLoad NE True$ then
end else if NextEventHasSamePsn EQ False$ then TestWaferRanSinceLoad = Rds_Services('TestWaferRanAfterLoad', RDSNo)
Message = 'Next work order is a NEW PSN number. Test wafer required.' 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 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 end
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
end end
end 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
end end
If Error_Services('HasError') then If Error_Services('HasError') then
@ -446,3 +465,4 @@ return

View File

@ -62,24 +62,80 @@ API reactItems.HEAD
API reactItems.GET API reactItems.GET
QueryFields = HTTP_Services('GetHTTPGetString') QueryFields = HTTP_Services('GetHTTPGetString')
If Index(QueryFields, 'riType', 1) then If IndexC(QueryFields, 'includeNullRetireDt', 1) then
RIType = HTTP_Services('GetQueryField', 'riType') 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 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 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 end api
@ -254,11 +310,7 @@ CreateHALCollection:
JSONCollection = '' JSONCollection = ''
Abort = False$ Abort = False$
If RIType NE '' OR CurrStatus NE '' then ReactItems = React_Item_Services('GetReactItems', RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStart, RetireDtEnd, IncludeNullRetireDt)
ReactItems = React_Item_Services('GetReactItems', RIType, CurrStatus)
end else
ReactItems = React_Item_Services('GetAllReactItemKeys')
end
If ReactItems NE '' then If ReactItems NE '' then
If SRP_JSON(hJSONCollection, 'New', 'Object') then If SRP_JSON(hJSONCollection, 'New', 'Object') then
@ -304,3 +356,4 @@ CreateHALCollection:
end end
return 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 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 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 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. // Report paths for various performance report services.
TemplatesFolder = Environment_Services('GetApplicationRootPath') : '\Reports\Scheduler\Templates\' TemplatesFolder = Environment_Services('GetApplicationRootPath') : '\Reports\Scheduler\Templates\'
@ -91,6 +91,13 @@ LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS') LogTime = Oconv(Time(), 'MTS')
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM 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 GoToService else
end end
@ -101,7 +108,7 @@ Return Response else ''
// Service Parameter Options // Service Parameter Options
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options BOOLEAN = True$, False$ Options BOOLEAN = True$, False$
Options REACTORMETRIC = 'TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK', 'SUSC_WFR_CNT', 'LOWER_QUARTZ_THK', 'LOWER_QUARTZ_WFR', 'ARMS_WFR_CNT' 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 // Services
@ -116,6 +123,8 @@ Options REACTORMETRIC = 'TUBE_BELL_JAR_THK', 'TUBE_BELL_JAR_WFR_CNT', 'SUSC_THK'
// //
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service IncrementWfrMetrics(RDSNo) Service IncrementWfrMetrics(RDSNo)
StartTick = GetTickCount()
MetricName = 'IncrementWfrMetrics'
// Get Reactor and run count details // Get Reactor and run count details
RDSRec = Xlate('RDS', RDSNo, '', 'X', '') RDSRec = Xlate('RDS', RDSNo, '', 'X', '')
@ -136,6 +145,7 @@ Service IncrementWfrMetrics(RDSNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$> CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$> CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$> CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP // Arms are not used for EPP
If ReactorType NE 'EPP' then If ReactorType NE 'EPP' then
@ -150,6 +160,7 @@ Service IncrementWfrMetrics(RDSNo)
If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0 If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0
If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0 If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0
If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0 If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0
If CurrExhaustThk = '' then CurrExhaustThk = 0
Begin Case Begin Case
@ -161,6 +172,7 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt + 1 NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt + 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + TargetThickness NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + 1 NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + TargetThickness
Case ReactorType = 'HTR' Case ReactorType = 'HTR'
@ -176,6 +188,7 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
Case SusceptorSize = 8 Case SusceptorSize = 8
// Round up // Round up
@ -192,6 +205,7 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case End Case
@ -206,11 +220,14 @@ Service IncrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + WaferCount NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case End Case
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec, 1, 0, 0) Database_Services('WriteDataRow', 'REACTOR', ReactorNo, NewReactorRec, 1, 0, 0)
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -229,6 +246,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<1, 4> = ReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> ResponseData<1, 4> = ReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$>
ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$> ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$>
ResponseData<1, 6> = ReactorRec<REACTOR_ARMS_WFR_CNT$> 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 //These are the column titles to help us with API Responses
ResponseData<2, 1> = 'ReactorID' ResponseData<2, 1> = 'ReactorID'
ResponseData<2, 2> = 'SusceptorWaferCount' ResponseData<2, 2> = 'SusceptorWaferCount'
@ -236,6 +254,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<2, 4> = 'TubeWaferCount' ResponseData<2, 4> = 'TubeWaferCount'
ResponseData<2, 5> = 'TubeThickness' ResponseData<2, 5> = 'TubeThickness'
ResponseData<2, 6> = 'ArmsWaferCount' ResponseData<2, 6> = 'ArmsWaferCount'
ResponseData<2, 7> = 'ExhuastChamberThickness'
Case ReactorType EQ 'HTR' Case ReactorType EQ 'HTR'
ResponseData<1, 1> = ReactorID ResponseData<1, 1> = ReactorID
ResponseData<1, 2> = ReactorRec<REACTOR_SUSC_WFR_CNT$> 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, 4> = ReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$>
ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$> ResponseData<1, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$>
ResponseData<1, 6> = ReactorRec<REACTOR_ARMS_WFR_CNT$> 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 //These are the column titles to help us with API Responses
ResponseData<2, 1> = 'ReactorID' ResponseData<2, 1> = 'ReactorID'
ResponseData<2, 2> = 'SusceptorWaferCount' ResponseData<2, 2> = 'SusceptorWaferCount'
@ -250,6 +270,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<2, 4> = 'TubeWaferCount' ResponseData<2, 4> = 'TubeWaferCount'
ResponseData<2, 5> = 'TubeThickness' ResponseData<2, 5> = 'TubeThickness'
ResponseData<2, 6> = 'ArmsWaferCount' ResponseData<2, 6> = 'ArmsWaferCount'
ResponseData<2, 7> = 'ExhuastChamberThickness'
Case ReactorType EQ 'EPP' Case ReactorType EQ 'EPP'
ResponseData<1, 1> = ReactorID ResponseData<1, 1> = ReactorID
ResponseData<1, 2> = ReactorRec<REACTOR_SUSC_WFR_CNT$> 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, 5> = ReactorRec<REACTOR_TUBE_BELL_JAR_THK$>
ResponseData<1, 6> = ReactorRec<REACTOR_LOWER_QUARTZ_WFR$> ResponseData<1, 6> = ReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
ResponseData<1, 7> = ReactorRec<REACTOR_LOWER_QUARTZ_THK$> 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 //These are the column titles to help us with API Responses
ResponseData<2, 1> = 'ReactorID' ResponseData<2, 1> = 'ReactorID'
ResponseData<2, 2> = 'SusceptorWaferCount' ResponseData<2, 2> = 'SusceptorWaferCount'
@ -266,6 +288,7 @@ Service GetWaferCntMetricsByReactorID(ReactorID)
ResponseData<2, 5> = 'BellJarThickness' ResponseData<2, 5> = 'BellJarThickness'
ResponseData<2, 6> = 'LowerQuartzWaferCount' ResponseData<2, 6> = 'LowerQuartzWaferCount'
ResponseData<2, 7> = 'LowerQuartzThickness' ResponseData<2, 7> = 'LowerQuartzThickness'
ResponseData<2, 8> = 'ExhuastChamberThickness'
End Case End Case
Response = ResponseData Response = ResponseData
end else end else
@ -307,6 +330,7 @@ Service DecrementWfrMetrics(RDSNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$> CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$> CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$> CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP // Arms are not used for EPP
If ReactorType NE 'EPP' then If ReactorType NE 'EPP' then
@ -321,6 +345,7 @@ Service DecrementWfrMetrics(RDSNo)
If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0 If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0
If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0 If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0
If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0 If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0
If CurrExhaustThk = '' then CurrExhaustThk = 0
Begin Case Begin Case
@ -332,6 +357,7 @@ Service DecrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - 1 NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - TargetThickness NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - 1 NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - TargetThickness
Case ReactorType = 'HTR' Case ReactorType = 'HTR'
@ -342,11 +368,12 @@ Service DecrementWfrMetrics(RDSNo)
ThkAddition = (WaferCount / 5) * TargetThickness ThkAddition = (WaferCount / 5) * TargetThickness
NewReactorRec<REACTOR_TUBE_BELL_JAR_THK$> = CurrTubeBellJarThk - ThkAddition NewReactorRec<REACTOR_TUBE_BELL_JAR_THK$> = CurrTubeBellJarThk - ThkAddition
NewReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> = CurrTubeBellJarCnt - CntAddition 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_SUSC_WFR_CNT$> = CurrSuscWfrCnt - CntAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
Case SusceptorSize = 8 Case SusceptorSize = 8
// Round up // Round up
@ -363,6 +390,7 @@ Service DecrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case End Case
@ -377,6 +405,7 @@ Service DecrementWfrMetrics(RDSNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - WaferCount NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case End Case
@ -410,6 +439,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$> CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$> CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$> CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP // Arms are not used for EPP
If ReactorType NE 'EPP' then If ReactorType NE 'EPP' then
@ -435,6 +465,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt + 1 NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt + 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + TargetThickness NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + 1 NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + TargetThickness
Case ReactorType = 'HTR' Case ReactorType = 'HTR'
@ -450,6 +481,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
Case SusceptorSize = 8 Case SusceptorSize = 8
// Round up // Round up
@ -466,6 +498,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case End Case
@ -480,6 +513,7 @@ Service IncrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk + ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + WaferCount NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr + WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt + WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk + ThkAddition
End Case End Case
@ -513,6 +547,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$> CurrSuscWfrCnt = OldReactorRec<REACTOR_SUSC_WFR_CNT$>
CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$> CurrLowerQuartzThk = OldReactorRec<REACTOR_LOWER_QUARTZ_THK$>
CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$> CurrLowerQuartzWfr = OldReactorRec<REACTOR_LOWER_QUARTZ_WFR$>
CurrExhaustThk = OldReactorRec<REACTOR_EXHAUST_CHAMBER_THK$>
// Arms are not used for EPP // Arms are not used for EPP
If ReactorType NE 'EPP' then If ReactorType NE 'EPP' then
@ -527,6 +562,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0 If CurrSuscWfrCnt = '' then CurrSuscWfrCnt = 0
If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0 If CurrLowerQuartzThk = '' then CurrLowerQuartzThk = 0
If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0 If CurrLowerQuartzWfr = '' then CurrLowerQuartzWfr = 0
If CurrExhaustThk = '' then CurrExhaustThk = 0
Begin Case Begin Case
@ -538,6 +574,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - 1 NewReactorRec<REACTOR_SUSC_WFR_CNT$> = CurrSuscWfrCnt - 1
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - TargetThickness NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - TargetThickness
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - 1 NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - 1
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - TargetThickness
Case ReactorType = 'HTR' Case ReactorType = 'HTR'
@ -548,11 +585,12 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
ThkAddition = (WaferCount / 5) * TargetThickness ThkAddition = (WaferCount / 5) * TargetThickness
NewReactorRec<REACTOR_TUBE_BELL_JAR_THK$> = CurrTubeBellJarThk - ThkAddition NewReactorRec<REACTOR_TUBE_BELL_JAR_THK$> = CurrTubeBellJarThk - ThkAddition
NewReactorRec<REACTOR_TUBE_BELL_JAR_WFR_CNT$> = CurrTubeBellJarCnt - CntAddition 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_SUSC_WFR_CNT$> = CurrSuscWfrCnt - CntAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
Case SusceptorSize = 8 Case SusceptorSize = 8
// Round up // Round up
@ -569,6 +607,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - CntAddition
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case End Case
@ -583,6 +622,7 @@ Service DecrementTestWfrMetrics(TargetThickness, WaferCount, ReactorNo)
NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition NewReactorRec<REACTOR_LOWER_QUARTZ_THK$> = CurrLowerQuartzThk - ThkAddition
NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - WaferCount NewReactorRec<REACTOR_LOWER_QUARTZ_WFR$> = CurrLowerQuartzWfr - WaferCount
NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount NewReactorRec<REACTOR_ARMS_WFR_CNT$> = CurrArmsWfrCnt - WaferCount
NewReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = CurrExhaustThk - ThkAddition
End Case End Case
@ -596,7 +636,7 @@ end service
// ResetWfrMetric // ResetWfrMetric
// //
// RDSNo. - [Required] // 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. // Reset a specified REACTOR metric to 0.
// //
@ -628,6 +668,9 @@ Service ResetWfrMetric(ReactorNo, MetricType = REACTORMETRIC)
Case MetricType = 'ARMS_WFR_CNT' Case MetricType = 'ARMS_WFR_CNT'
ReactorRec<REACTOR_ARMS_WFR_CNT$> = 0 ReactorRec<REACTOR_ARMS_WFR_CNT$> = 0
Case MetricType = 'EXHAUST_CHAMBER_THK'
ReactorRec<REACTOR_EXHAUST_CHAMBER_THK$> = 0
End Case End Case
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactorRec, 1, 0, 0) 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 If ErrorMsg EQ '' then
AbortAlarmFeatureFlag = Xlate('FEATURE_FLAGS', 'NICA_ABORT_ALARM', FEATURE_FLAGS.ENABLED$, 'X') AbortAlarmFeatureFlag = Xlate('FEATURE_FLAGS', 'NICA_ABORT_ALARM', FEATURE_FLAGS.ENABLED$, 'X')
If AbortAlarmFeatureFlag EQ True$ then 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') 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') ModeSubCatRespLvl = Xlate('REACT_PROB_CAT', ModeSubCatId, REACT_PROB_CAT_ABORT_ALARM_RESPONSE_LEVEL$, 'X')
AbortAlarmComp = Xlate('REACTOR', ReactNo, REACTOR_ABORT_ALARM_COMPLETE$, 'X') AbortAlarmComp = Xlate('REACTOR', ReactNo, REACTOR_ABORT_ALARM_COMPLETE$, 'X')
ActiveAbortAlarmOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactNo, 'ABORT_ALARM') ActiveAbortAlarmOrders = Nica_Orders_Services('GetActiveOrders', 'REACTOR', ReactNo, 'ABORT_ALARM')
AbortAlarmOrderActive = (ActiveAbortAlarmOrders NE '') 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 Begin Case
Case ( AbortAlarmOrderActive and (SelE10State _EQC 'Productive') ) 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." 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 // 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 // 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. // 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 Next ActiveAbortAlarmRespLvl
If ( (Mode _EQC 'WAITING_FOR_OPERATOR') and (ModeSubCatFlowId NE ActiveAbortAlarmFlowIds) ) | If ( (Mode _EQC 'WAITING_FOR_OPERATOR') and (ModeSubCatFlowId NE ActiveAbortAlarmFlowIds) ) |
or ( (ModeSubCatFlowId NE ActiveAbortAlarmFlowIds) and (ModeSubCatRespLvl GT MaxActiveRespLvl) ) then 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 If ChecklistIds NE '' then
Nica_Orders_Services('CreateNewOrder', 'REACTOR', ReactNo, 'ABORT_ALARM', ModeSubCatFlowId, ModeSubCatRespLvl, ChecklistIds) CreateAbortAlarmOrder = True$
RlComment = 'ABORT/ALARM initiated for flow ':ModeSubCatFlowId:'.'
end end
end end
Case ( Not(AbortAlarmComp) and Not(AbortAlarmOrderActive) and IndexC(ModeSubCat, 'ABORT/ALARM', 1) and (ModeSubCatFlowId NE '') ) Case ( Not(IntrusiveMaintChecklistActive) and Not(AbortAlarmComp) and Not(AbortAlarmOrderActive) and IndexC(ModeSubCat, 'ABORT/ALARM', 1) and (ModeSubCatFlowId NE '') and (ChecklistIds NE '') )
ReactorType = Xlate('REACTOR', ReactNo, REACTOR_REACT_TYPE$, 'X') // Typical ABORT/ALARM case
ChecklistIds = Nica_Orders_Services('GetFlowChecklistIds', ModeSubCatFlowId, 'ABORT_ALARM', ReactorType) CreateAbortAlarmOrder = True$
If ChecklistIds NE '' then
Nica_Orders_Services('CreateNewOrder', 'REACTOR', ReactNo, 'ABORT_ALARM', ModeSubCatFlowId, ModeSubCatRespLvl, ChecklistIds)
RlComment = 'ABORT/ALARM initiated for flow ':ModeSubCatFlowId:'.'
end
Case Otherwise$ Case Otherwise$
// Don't create an ABORT/ALARM NICA order // Don't create an ABORT/ALARM NICA order
Null Null
End Case 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
end end
@ -3552,6 +3614,8 @@ end service
Service GetReactorAvailChamberCount(ReactNo) Service GetReactorAvailChamberCount(ReactNo)
StartTick = GetTickCount()
MetricName = 'GetReactorAvailChamberCount'
ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: ' ErrMsg = 'Error in ReactorServices -> GetReactorAvailChamberCount: '
AvailableChamberCount = 0 AvailableChamberCount = 0
@ -3571,6 +3635,8 @@ Service GetReactorAvailChamberCount(ReactNo)
end end
Response = AvailableChamberCount Response = AvailableChamberCount
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -4289,3 +4355,4 @@ ClearCursors:
return return

View File

@ -1,254 +1,235 @@
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 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. permission from Infineon.
Name : RDS_Actions Name : React_Item_Actions
Description : Handles calculated columns and MFS calls for the current table. Description : Handles calculated columns and MFS calls for the current table.
Notes : This function uses @ID, @RECORD, and @DICT to make sure {ColumnName} references work correctly. Notes : This function uses @ID, @RECORD, and @DICT to make sure {ColumnName} references work correctly.
If called from outside of a calculated column these will need to be set and restored. If called from outside of a calculated column these will need to be set and restored.
Parameters : Parameters :
Action [in] -- Name of the action to be taken Action [in] -- Name of the action to be taken
CalcColName [in] -- Name of the calculated column that needs to be processed. Normally this should only be CalcColName [in] -- Name of the calculated column that needs to be processed. Normally this should only be
populated when the CalcField action is being used. populated when the CalcField action is being used.
FSList [in] -- The list of MFSs and the BFS name for the current file or volume. This is an @SVM FSList [in] -- The list of MFSs and the BFS name for the current file or volume. This is an @SVM
delimited array, with the current MFS name as the first value in the array, and the BFS delimited array, with the current MFS name as the first value in the array, and the BFS
name as the last value. Normally set by a calling MFS. name as the last value. Normally set by a calling MFS.
Handle [in] -- The file handle of the file or media map being accessed. Note, this does contain the Handle [in] -- The file handle of the file or media map being accessed. Note, this does contain the
entire handle structure that the Basic+ Open statement would provide. Normally set by a entire handle structure that the Basic+ Open statement would provide. Normally set by a
calling MFS. calling MFS.
Name [in] -- The name (key) of the record or file being accessed. Normally set by a calling MFS. Name [in] -- The name (key) of the record or file being accessed. Normally set by a calling MFS.
FMC [in] -- Various functions. Normally set by a calling MFS. FMC [in] -- Various functions. Normally set by a calling MFS.
Record [in] -- The entire record (for record-oriented functions) or a newly-created handle (for Record [in] -- The entire record (for record-oriented functions) or a newly-created handle (for
"get handle" functions). Normally set by a calling MFS. "get handle" functions). Normally set by a calling MFS.
Status [in/out] -- Indicator of the success or failure of an action. Normally set by the calling MFS but Status [in/out] -- Indicator of the success or failure of an action. Normally set by the calling MFS but
for some actions can be set by the action handler to indicate failure. for some actions can be set by the action handler to indicate failure.
OrigRecord [in] -- Original content of the record being processed by the current action. This is OrigRecord [in] -- Original content of the record being processed by the current action. This is
automatically being assigned by the WRITE_RECORD and DELETE_RECORD actions within automatically being assigned by the WRITE_RECORD and DELETE_RECORD actions within
BASE_MFS. BASE_MFS.
Param1-10 [in/out] -- Additional request parameter holders Param1-10 [in/out] -- Additional request parameter holders
ActionFlow [out] -- Used to control the action chain (see the ACTION_SETUP insert for more information.) ActionFlow [out] -- Used to control the action chain (see the ACTION_SETUP insert for more information.)
Can also be used to return a special value, such as the results of the CalcField Can also be used to return a special value, such as the results of the CalcField
method. method.
History : (Date, Initials, Notes) History : (Date, Initials, Notes)
04/10/18 dmb Original programmer. 05/12/25 djs Updated WRITE_PRE action to update the CURR_STATUS_STATIC field if the retire date changes.
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)
#pragma precomp SRP_PreCompiler
***********************************************************************************************************************/
$Insert ACTION_SETUP
#pragma precomp SRP_PreCompiler $Insert APP_INSERTS
$Insert FILE.SYSTEM.EQUATES
$Insert FILE.SYSTEM.EQUATES $Insert REACT_ITEM_EQUATES
$Insert ACTION_SETUP
$Insert RDS_EQUATES Declare function obj_React_Item
$Insert CLEAN_INSP_EQUATES Declare subroutine Error_Services
$Insert COMPANY_EQUATES
$Insert RDS_LAYER_EQUATES If KeyID then GoSub Initialize_System_Variables
$Insert TOOL_PARMS_EQUATES
$Insert RLIST_EQUATES Begin Case
$Insert APP_INSERTS
$Insert QA_MET_EQUATES Case Action _EQC 'CalculateColumn' ; GoSub CalculateColumn
$Insert PRS_STAGE_EQUATES Case Action _EQC 'READ_RECORD_PRE' ; GoSub READ_RECORD_PRE
$Insert WO_MAT_EQUATES Case Action _EQC 'READ_RECORD' ; GoSub READ_RECORD
$Insert WO_MAT_QA_EQUATES Case Action _EQC 'READONLY_RECORD_PRE' ; GoSub READONLY_RECORD_PRE
Case Action _EQC 'READONLY_RECORD' ; GoSub READONLY_RECORD
Equ COMMA$ to ',' Case Action _EQC 'WRITE_RECORD_PRE' ; GoSub WRITE_RECORD_PRE
Case Action _EQC 'WRITE_RECORD' ; GoSub WRITE_RECORD
Declare function Error_Services, Database_Services, obj_RDS_Test, Logging_Services, Environment_Services, SRP_Math Case Action _EQC 'DELETE_RECORD_PRE' ; GoSub DELETE_RECORD_PRE
Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services, obj_WO_Mat Case Action _EQC 'DELETE_RECORD' ; GoSub DELETE_RECORD
Declare subroutine Error_Services, Database_Services, Logging_Services, Set_Status, Schedule_Services_Dev Case Otherwise$ ; Status = 'Invalid Action'
Declare subroutine Work_Order_Services, Material_Services, Set_FSError
End Case
If KeyID then GoSub Restore_System_Variables
If Assigned(ActionFlow) else ActionFlow = ACTION_CONTINUE$
If KeyID then GoSub Initialize_System_Variables
Return ActionFlow
Begin Case
Case Action _EQC 'CalculateColumn' ; GoSub CalculateColumn ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Case Action _EQC 'READ_RECORD_PRE' ; GoSub READ_RECORD_PRE // Calculated Columns
Case Action _EQC 'READ_RECORD' ; GoSub READ_RECORD //
Case Action _EQC 'READONLY_RECORD_PRE' ; GoSub READONLY_RECORD_PRE // The typical structure of a calculated column will look like this:
Case Action _EQC 'READONLY_RECORD' ; GoSub READONLY_RECORD //
Case Action _EQC 'WRITE_RECORD_PRE' ; GoSub WRITE_RECORD_PRE // Declare function Database_Services
Case Action _EQC 'WRITE_RECORD' ; GoSub WRITE_RECORD //
Case Action _EQC 'DELETE_RECORD_PRE' ; GoSub DELETE_RECORD_PRE // @ANS = Database_Services('CalculateColumn')
Case Action _EQC 'DELETE_RECORD' ; GoSub DELETE_RECORD ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Case Otherwise$ ; Status = 'Invalid Action'
CalculateColumn:
End Case
// Make sure the ActionFlow return variable is cleared in case nothing is calculated.
If KeyID then GoSub Restore_System_Variables ActionFlow = ''
If Assigned(ActionFlow) else ActionFlow = ACTION_CONTINUE$ return
Return ActionFlow // ----- MFS calls -----------------------------------------------------------------------------------------------------
READ_RECORD_PRE:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // In order to stop a record from being read in this action these lines of code must be used:
// Calculated Columns //
// // OrigFileError = 100 : @FM : KeyID
// The typical structure of a calculated column will look like this: // Status = 0
// // Record = ''
// Declare function Database_Services // ActionFlow = ACTION_STOP$
// return
// @ANS = Database_Services('CalculateColumn')
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
READ_RECORD:
CalculateColumn:
// In order to stop a record from being read in this action these lines of code must be used:
// Make sure the ActionFlow return variable is cleared in case nothing is calculated. //
ActionFlow = '' // OrigFileError = 100 : @FM : KeyID
// Status = 0
// Record = ''
return return
READONLY_RECORD_PRE:
// ----- MFS calls ----------------------------------------------------------------------------------------------------- // In order to stop a record from being read in this action these lines of code must be used:
//
READ_RECORD_PRE: // OrigFileError = 100 : @FM : KeyID
// In order to stop a record from being read in this action these lines of code must be used: // Status = 0
// // Record = ''
// OrigFileError = 100 : @FM : KeyID // ActionFlow = ACTION_STOP$
// Status = 0 return
// Record = ''
// ActionFlow = ACTION_STOP$
READONLY_RECORD:
// In order to stop a record from being read in this action these lines of code must be used:
return //
// OrigFileError = 100 : @FM : KeyID
READ_RECORD: // Status = 0
// Record = ''
// In order to stop a record from being read in this action these lines of code must be used: return
//
// OrigFileError = 100 : @FM : KeyID
// Status = 0 WRITE_RECORD_PRE:
// Record = ''
ErrMsg = ''
return
// Req'd parameter checks
READONLY_RECORD_PRE: ItemType = {RI_TYPE}
// In order to stop a record from being read in this action these lines of code must be used:
// If ItemType EQ '' then ErrMsg := 'Item Type was not specified. '
// OrigFileError = 100 : @FM : KeyID
// Status = 0 If ErrMsg NE '' then
// Record = '' Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
// ActionFlow = ACTION_STOP$ OrigFileError = 104:': Error Saving Reactor Item: ' : ErrMsg
return Status = 0
Record = ''
READONLY_RECORD: ActionFlow = ACTION_STOP$
// In order to stop a record from being read in this action these lines of code must be used: end else
// OrigRetireDt = OrigRecord<REACT_ITEM_RETIRE_DT$>
// OrigFileError = 100 : @FM : KeyID NewRetireDt = Record<REACT_ITEM_RETIRE_DT$>
// Status = 0 OrigNotes = OrigRecord<REACT_ITEM_NOTES$>
// Record = '' NewNotes = Record<REACT_ITEM_NOTES$>
return If ( (OrigRetireDt NE NewRetireDt) or (OrigNotes NE NewNotes) ) then
CurrStatus = obj_React_Item('CurrStatus', Name:@RM:Record)
WRITE_RECORD_PRE: Record<REACT_ITEM_CURR_STATUS_STATIC$> = CurrStatus
SaveRecord = Record
ErrMsg = '' end
end
//Req'd parameter checks
ItemType = {RI_TYPE} return
If ItemType EQ '' then WRITE_RECORD:
ErrMsg := 'Item Type was not specified. ' return
end
DELETE_RECORD_PRE:
If ErrMsg NE '' then return
Error_Services('Add', 'Error Saving Reactor Item: ' : ErrMsg)
OrigFileError = 104:': Error Saving Reactor Item: ' : ErrMsg DELETE_RECORD:
Status = 0 return
Record = ''
ActionFlow = ACTION_STOP$
end ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
return ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
WRITE_RECORD: ClearCursors:
For counter = 0 to 8
ClearSelect counter
return Next counter
DELETE_RECORD_PRE: return
return Initialize_System_Variables:
DELETE_RECORD: // Save these for restoration later
return SaveDict = @DICT
SaveID = @ID
SaveRecord = @RECORD
OrigFileError = @FILE.ERROR
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs // Now make sure @DICT, ID, and @RECORD are populated
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// CurrentDictName = ''
If @DICT then
ClearCursors: DictHandle = @DICT<1, 2>
For counter = 0 to 8 Locate DictHandle in @TABLES(5) Using @FM Setting fPos then
ClearSelect counter CurrentDictName = Field(@TABLES(0), @FM, fPos, 1)
Next counter end
return end
If CurrentDictName NE DictName then
Initialize_System_Variables: Open DictName to @DICT else Status = 'Unable to initialize @DICT'
end
// Save these for restoration later
SaveDict = @DICT @ID = KeyID
SaveID = @ID If Record else
SaveRecord = @RECORD // Record might not have been passed in. Read the record from the database table just to make sure.
OrigFileError = @FILE.ERROR @FILE.ERROR = ''
Open TableName to hTable then
// Now make sure @DICT, ID, and @RECORD are populated FullFSList = hTable[1, 'F' : @VM]
CurrentDictName = '' BFS = FullFSList[-1, 'B' : @SVM]
If @DICT then LastHandle = hTable[-1, 'B' : \0D\]
DictHandle = @DICT<1, 2> FileHandle = \0D\ : LastHandle[1, @VM]
Locate DictHandle in @TABLES(5) Using @FM Setting fPos then
CurrentDictName = Field(@TABLES(0), @FM, fPos, 1) Call @BFS(READO.RECORD, BFS, FileHandle, KeyID, FMC, Record, ReadOStatus)
end end
end end
@RECORD = Record
If CurrentDictName NE DictName then
Open DictName to @DICT else Status = 'Unable to initialize @DICT' return
end
@ID = KeyID Restore_System_Variables:
If Record else
// Record might not have been passed in. Read the record from the database table just to make sure. Transfer SaveDict to @DICT
@FILE.ERROR = '' Transfer SaveID to @ID
Open TableName to hTable then Transfer SaveRecord to @RECORD
FullFSList = hTable[1, 'F' : @VM] @FILE.ERROR = OrigFileError
BFS = FullFSList[-1, 'B' : @SVM]
LastHandle = hTable[-1, 'B' : \0D\] return
FileHandle = \0D\ : LastHandle[1, @VM]
Call @BFS(READO.RECORD, BFS, FileHandle, KeyID, FMC, Record, ReadOStatus)
end
end
@RECORD = Record
return
Restore_System_Variables:
Transfer SaveDict to @DICT
Transfer SaveID to @ID
Transfer SaveRecord to @RECORD
@FILE.ERROR = OrigFileError
return

View File

@ -20,62 +20,110 @@ Compile function React_Item_Services(@Service, @Params)
08/02/22 djs Original programmer. 08/02/22 djs Original programmer.
***********************************************************************************************************************/ ***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
$Insert LOGICAL
$Insert APP_INSERTS $Insert APP_INSERTS
$Insert SERVICE_SETUP
$Insert RLIST_EQUATES $Insert RLIST_EQUATES
$Insert REACT_ITEM_EQUATES $Insert REACT_ITEM_EQUATES
Declare function Database_Services, Error_Services, SRP_JSON, NextKey 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 Declare subroutine SRP_JSON, Error_Services, Btree.Extract, Database_Services, Update_Index
GoToService
Return Response or "" GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end
//----------------------------------------------------------------------------- Return Response else ''
// SERVICES
//-----------------------------------------------------------------------------
Service GetAllReactItemKeys() ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
AllKeys = '' // Service Parameter Options
RList('SELECT REACT_ITEM', TARGET_ACTIVELIST$, '', '', '') ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Done = False$ Options BOOLEAN = True$, False$
Reactors = ''
Loop
Readnext keyId else Done = True$
Until Done
AllKeys<1,-1> = keyId
Repeat
Response = AllKeys
end service
Service GetReactItems(RIType, CurrStatus) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Services
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Service GetReactItems(RIType, CurrStatus, EntryDtStart, EntryDtEnd, RetireDtStart, RetireDtEnd, IncludeNullRetireDt=BOOLEAN)
ErrorMsg = '' ErrorMsg = ''
Response = '' Response = ''
Swap ',' with @VM in RIType If ( (RIType NE '') or (CurrStatus NE '') or (EntryDtStart NE '') or (EntryDtEnd NE '') or (RetireDtStart NE '') or (RetireDtEnd NE '') or (IncludeNullRetireDt NE '') ) then
Swap ',' with @VM in CurrStatus If EntryDtStart NE '' and Not(Num(EntryDtStart)) then EntryDtStart = IConv(EntryDtStart, 'D')
If EntryDtEnd NE '' and Not(Num(EntryDtEnd)) then EntryDtEnd = IConv(EntryDtEnd, 'D')
Open 'DICT.REACT_ITEM' to DictReactItem then If RetireDtStart NE '' and Not(Num(RetireDtStart)) then RetireDtStart = IConv(RetireDtStart, 'D')
If RetireDtEnd NE '' and Not(Num(RetireDtEnd)) then RetireDtEnd = IConv(RetireDtEnd, 'D')
SearchString = '' Open 'DICT.REACT_ITEM' to DictReactItem then
If RIType NE '' then SearchString := 'RI_TYPE':@VM:RIType:@FM SearchString = ''
If CurrStatus NE '' then SearchString := 'CURR_STATUS':@VM:CurrStatus:@FM If RIType NE '' then
RIKeys = '' Swap ',' with @VM in RIType
Btree.Extract(SearchString, 'REACT_ITEM', DictReactItem, RIKeys, '', '') SearchString := 'RI_TYPE':@VM:RIType:@FM
ErrCode = '' end
IF Get_Status(ErrCode) then Begin Case
ErrorMsg = 'Error in ':Service:' service. Error calling Btree.Extract. Error code ':ErrCode:'.' 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 end else
Response = RIKeys ErrorMsg = 'Error in ':Service:' service. Error opening REACT_ITEM dictionary.'
end end
end else 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 end
If ErrorMsg NE '' then If ErrorMsg NE '' then
Error_Services('Add', ErrorMsg) Error_Services('Add', ErrorMsg)
end end
@ -155,7 +203,6 @@ Service ConvertRecordToJSON(KeyID, Record, ItemURL)
Response = jsonRecord Response = jsonRecord
end service end service
@ -326,11 +373,11 @@ Service GetReactItemTemplateJSON()
Response = jsonRecord Response = jsonRecord
end service end service
Service CreateReactItem(Record) Service CreateReactItem(Record)
ErrMsg = '' ErrMsg = ''
KeyID = '' KeyID = ''
If Record NE '' then If Record NE '' then
@ -355,6 +402,7 @@ Service CreateReactItem(Record)
end service end service
Service ConvertRecordToJSONQuick(KeyID, Record, ItemURL) Service ConvertRecordToJSONQuick(KeyID, Record, ItemURL)
jsonRecord = '' jsonRecord = ''
@ -407,6 +455,32 @@ Service ConvertRecordToJSONQuick(KeyID, Record, ItemURL)
Response = jsonRecord Response = jsonRecord
end service 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 // Internal GoSubs
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -419,6 +493,3 @@ ClearCursors:
return return

View File

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

View File

@ -45,9 +45,9 @@ $insert RDS_EQUATES
$insert SCAN_SETUP $insert SCAN_SETUP
Declare Function Scan_Services, Database_Services, QA_Services, Datetime, RDS_Services, SRP_Array, SRP_Stopwatch 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 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. 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/') LogDate = Oconv(Date(), 'D4/')
@ -57,6 +57,13 @@ LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ScanAPIResponseTimes.csv'; //Define the file name that will get created. LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ScanAPIResponseTimes.csv'; //Define the file name that will get created.
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. 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. 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 GoToAPI else
// The specific resource endpoint doesn't have a API handler yet. // The specific resource endpoint doesn't have a API handler yet.
@ -72,16 +79,25 @@ Return Response OR ''
API scan.POST API scan.POST
StartTick = GetTickCount()
MetricName = 'SCAN_POST'
SRP_Stopwatch('Reset') SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_POST_RESPONSE_TIME') SRP_Stopwatch('Start', 'SCAN_POST_RESPONSE_TIME')
ScanID = Scan_Services('CreateScansRow') ScanID = Scan_Services('CreateScansRow')
If Error_Services('NoError') then If Error_Services('NoError') then
StatusCode = 201 StatusCode = 201
GoSub CreateHALItem GoSub CreateHALItem
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else end else
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, Message) HTTP_Services('SetResponseStatus', 500, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_POST_RESPONSE_TIME') SRP_Stopwatch('Stop', 'SCAN_POST_RESPONSE_TIME')
TotalPostResponseTime = SRP_Stopwatch('GetData', 'SCAN_POST_RESPONSE_TIME') TotalPostResponseTime = SRP_Stopwatch('GetData', 'SCAN_POST_RESPONSE_TIME')
LogData = '' LogData = ''
@ -100,6 +116,9 @@ end api
API scan.ID.POST API scan.ID.POST
StartTick = GetTickCount()
MetricName = 'SCAN_ID_POST'
SRP_Stopwatch('Reset') SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_ID_POST_RESPONSE_TIME') SRP_Stopwatch('Start', 'SCAN_ID_POST_RESPONSE_TIME')
ScanID = EndpointSegment ScanID = EndpointSegment
@ -112,13 +131,20 @@ API scan.ID.POST
If Error_Services('NoError') then If Error_Services('NoError') then
StatusCode = 200 StatusCode = 200
GoSub CreateHALItem GoSub CreateHALItem
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else end else
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 400, Message) HTTP_Services('SetResponseStatus', 400, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end end
end else end else
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.') HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.')
end Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_ID_POST_RESPONSE_TIME') SRP_Stopwatch('Stop', 'SCAN_ID_POST_RESPONSE_TIME')
TotalPostResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_POST_RESPONSE_TIME') TotalPostResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_POST_RESPONSE_TIME')
LogData = '' LogData = ''
@ -143,11 +169,19 @@ end api
API scan.ID.HEAD API scan.ID.HEAD
API scan.ID.GET API scan.ID.GET
StartTick = GetTickCount()
MetricName = 'SCAN_ID_GET'
SRP_Stopwatch('Reset') SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_ID_GET_RESPONSE_TIME') SRP_Stopwatch('Start', 'SCAN_ID_GET_RESPONSE_TIME')
ScanID = EndpointSegment ScanID = EndpointSegment
StatusCode = 200 StatusCode = 200
GoSub CreateHALItem 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') SRP_Stopwatch('Stop', 'SCAN_ID_POST_RESPONSE_TIME')
TotalGetResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_GET_RESPONSE_TIME') TotalGetResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_GET_RESPONSE_TIME')
LogData = '' LogData = ''
@ -166,6 +200,9 @@ end api
API scan.ID.DELETE API scan.ID.DELETE
StartTick = GetTickCount()
MetricName = 'SCAN_ID_DELETE'
SRP_Stopwatch('Reset') SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_ID_DELETE_RESPONSE_TIME') SRP_Stopwatch('Start', 'SCAN_ID_DELETE_RESPONSE_TIME')
ScanID = EndpointSegment ScanID = EndpointSegment
@ -176,17 +213,25 @@ API scan.ID.DELETE
Database_Services('DeleteDataRow', 'SCANS', ScanID, True$, False$) Database_Services('DeleteDataRow', 'SCANS', ScanID, True$, False$)
If Error_Services('NoError') then If Error_Services('NoError') then
HTTP_Services('SetResponseStatus', 200) HTTP_Services('SetResponseStatus', 200)
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else end else
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, Message) HTTP_Services('SetResponseStatus', 500, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end end
end else end else
HTTP_Services('SetResponseStatus', 403, 'This scan is already accepted and cannot be deleted.') HTTP_Services('SetResponseStatus', 403, 'This scan is already accepted and cannot be deleted.')
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end end
end else end else
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 404, Message) HTTP_Services('SetResponseStatus', 404, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_ID_DELETE_RESPONSE_TIME') SRP_Stopwatch('Stop', 'SCAN_ID_DELETE_RESPONSE_TIME')
TotalDeleteResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_DELETE_RESPONSE_TIME') TotalDeleteResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_DELETE_RESPONSE_TIME')
LogData = '' LogData = ''
@ -205,7 +250,9 @@ end api
API scan.ID.PATCH 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 // 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 // of scan this is (i.e. Location, Pre-Epi + Load, or Unload). This will be determined by the data coming in and the
// current status of the lot. For example a Location scan would only have an RDS, location code, and username. // current status of the lot. For example a Location scan would only have an RDS, location code, and username.
@ -232,14 +279,17 @@ API scan.ID.PATCH
If Error_Services('NoError') then If Error_Services('NoError') then
StatusCode = 200 StatusCode = 200
GoSub CreateHALItem GoSub CreateHALItem
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else end else
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, Message) HTTP_Services('SetResponseStatus', 500, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end end
SRP_JSON(hBody, 'Release') SRP_JSON(hBody, 'Release')
end else end else
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.') HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.')
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end end
end else end else
ScanNotAcceptableReason = SRP_JSON(objResource, 'GetValue', 'scan.notAcceptableReason') ScanNotAcceptableReason = SRP_JSON(objResource, 'GetValue', 'scan.notAcceptableReason')
@ -249,11 +299,17 @@ API scan.ID.PATCH
end else end else
Message = 'Unable to parse the JSON scan resource.' Message = 'Unable to parse the JSON scan resource.'
HTTP_Services('SetResponseStatus', 400, Message) HTTP_Services('SetResponseStatus', 400, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end end
end else end else
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 404, Message) HTTP_Services('SetResponseStatus', 404, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_ID_PATCH_RESPONSE_TIME') SRP_Stopwatch('Stop', 'SCAN_ID_PATCH_RESPONSE_TIME')
TotalPatchResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_PATCH_RESPONSE_TIME') TotalPatchResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_PATCH_RESPONSE_TIME')
LogData = '' LogData = ''
@ -272,6 +328,8 @@ end api
API scan.ID.PUT API scan.ID.PUT
StartTick = GetTickCount()
MetricName = 'SCAN_ID_PUT'
SRP_Stopwatch('Reset') SRP_Stopwatch('Reset')
SRP_Stopwatch('Start', 'SCAN_ID_PUT_RESPONSE_TIME') 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$) Database_Services('WriteDataRow', 'SCANS', ScanID, ScanRow, True$, False$, True$)
If Error_Services('NoError') then If Error_Services('NoError') then
GoSub CreateHALItem GoSub CreateHALItem
Mona_Services('SendStatus', MonaResource, MetricName, 'OK')
end else end else
Message = Error_Services('GetMessage') Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, Message) HTTP_Services('SetResponseStatus', 500, Message)
Mona_Services('SendStatus', MonaResource, MetricName, 'CRITICAL')
end end
SRP_JSON(hBody, 'Release') SRP_JSON(hBody, 'Release')
end else end else
HTTP_Services('SetResponseStatus', 400, 'Unable to parse the scanData JSON.') HTTP_Services('SetResponseStatus', 400, 'Unable to parse the scanData JSON.')
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end end
end else end else
HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.') HTTP_Services('SetResponseStatus', 400, 'JSON object is missing from the request.')
Mona_Services('SendStatus', MonaResource, MetricName, 'WARNING')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
SRP_Stopwatch('Stop', 'SCAN_ID_PUT_RESPONSE_TIME') SRP_Stopwatch('Stop', 'SCAN_ID_PUT_RESPONSE_TIME')
TotalPutResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_PUT_RESPONSE_TIME') TotalPutResponseTime = SRP_Stopwatch('GetData', 'SCAN_ID_PUT_RESPONSE_TIME')
LogData = '' LogData = ''
@ -339,7 +405,6 @@ API scan.ID.PUT
end end
LogData<6> = ResponseStatusCode LogData<6> = ResponseStatusCode
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$) Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
end api end api
@ -378,3 +443,4 @@ CreateHALItem:
end end
return 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 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 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 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 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 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\ 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$) objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM 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 GoToService else
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.') Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' module.')
end 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. // Returns the database row from the SCANS table for the indicated Scan ID. The default format is MultiValue.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service GetScansRow(ScanID, ReturnJSON) Service GetScansRow(ScanID, ReturnJSON)
StartTick = GetTickCount()
MetricName = 'GetScansRow'
ScansRow = '' ScansRow = ''
@ -214,6 +224,8 @@ Service GetScansRow(ScanID, ReturnJSON)
Response = ScansRow Response = ScansRow
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service 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. // Returns the database row from the SCANS table for the indicated Scan ID. The default format is MultiValue.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service SetScansRow(ScanID, ScansRow) Service SetScansRow(ScanID, ScansRow)
StartTick = GetTickCount()
MetricName = 'SetScansRow'
If (ScanID NE '') AND (ScansRow NE '') then If (ScanID NE '') AND (ScansRow NE '') then
Database_Services('WriteDataRow', 'SCANS', ScanID, ScansRow) 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.') Error_Services('Add', 'ScanID or ScansRow argument was missing in the ' : Service : ' service.')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -242,6 +258,8 @@ end service
// evaluated on a case by case basis. // evaluated on a case by case basis.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service ProcessScanData(ScanID, ScanJSON) Service ProcessScanData(ScanID, ScanJSON)
StartTick = GetTickCount()
MetricName = 'ProcessScanData'
If ( (ScanID NE '') AND (ScanJSON NE '') ) then If ( (ScanID NE '') AND (ScanJSON NE '') ) then
hScanJSON = '' hScanJSON = ''
@ -335,6 +353,18 @@ Service ProcessScanData(ScanID, ScanJSON)
Error_Services('Add', 'Inactive employee.') Error_Services('Add', 'Inactive employee.')
Case Otherwise$ Case Otherwise$
ScansRow<SCANS.EMPLOYEE_ID$> = {EMPLOYEE_ID} 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 End Case
Case ScanData[1, 3] EQ '10S' 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', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, 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$>= '' ScansRow<SCANS.EMPLOYEE_ID$>= ''
Result = 'Override Performed successfully' Result = 'Override Performed successfully'
end end
@ -652,6 +685,7 @@ Service ProcessScanData(ScanID, ScanJSON)
If (CassetteIDs NE '') then If (CassetteIDs NE '') then
TestWaferLotData = ScansRow<SCANS.TW_LOT_ID$> TestWaferLotData = ScansRow<SCANS.TW_LOT_ID$>
Abort = False$ Abort = False$
TestWaferLotIsValid = False$
If TestWaferLotData NE '' then If TestWaferLotData NE '' then
ThisTestRunType = ScansRow<SCANS.TEST_RUN_TYPE_ID$> ThisTestRunType = ScansRow<SCANS.TEST_RUN_TYPE_ID$>
If ThisTestRunType NE '' then If ThisTestRunType NE '' then
@ -667,6 +701,8 @@ Service ProcessScanData(ScanID, ScanJSON)
If Not(TWLotCurrOpen) then If Not(TWLotCurrOpen) then
Abort = True$ Abort = True$
Scan_Services('AddNotAcceptableReason', 'Lot ':TWLot:' is closed and cannot be used at this time.') Scan_Services('AddNotAcceptableReason', 'Lot ':TWLot:' is closed and cannot be used at this time.')
end else
TestWaferLotIsValid = True$
end end
end else end else
Abort = True$ Abort = True$
@ -1090,6 +1126,60 @@ Service ProcessScanData(ScanID, ScanJSON)
Case Otherwise$ Case Otherwise$
// Keep error on Error_Services stack and return 400 level error. // Keep error on Error_Services stack and return 400 level error.
End Case 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
end else end else
ScanMsg = 'The POST stage engineering instructions must be acknowledged before the load operation can be signed.' ScanMsg = 'The POST stage engineering instructions must be acknowledged before the load operation can be signed.'
@ -1213,8 +1303,10 @@ Service ProcessScanData(ScanID, ScanJSON)
SRP_JSON(hScanJSON, 'Release') SRP_JSON(hScanJSON, 'Release')
end else end else
Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.') Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -1223,6 +1315,9 @@ end service
// //
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service AcceptScan(ScanID, ScanJSON) Service AcceptScan(ScanID, ScanJSON)
StartTick = GetTickCount()
MetricName = 'AcceptScan'
If ( (ScanID NE '') and (ScanJSON NE '') ) then If ( (ScanID NE '') and (ScanJSON NE '') ) then
hBody = '' hBody = ''
ParseResponse = SRP_JSON(hBody, 'PARSE', ScanJSON) ParseResponse = SRP_JSON(hBody, 'PARSE', ScanJSON)
@ -1403,6 +1498,7 @@ Service AcceptScan(ScanID, ScanJSON)
LogData<3> = Username LogData<3> = Username
LogData<4> = CurrStage LogData<4> = CurrStage
LogData<5> = ScanID LogData<5> = ScanID
Begin Case Begin Case
Case CurrStage _EQC 'VER' Case CurrStage _EQC 'VER'
Action = 'LOAD' Action = 'LOAD'
@ -1493,14 +1589,32 @@ Service AcceptScan(ScanID, ScanJSON)
Case CurrStage _EQC 'UNLOAD' Case CurrStage _EQC 'UNLOAD'
Action = 'UNLOAD' Action = 'UNLOAD'
// Check if UNLOAD stage is ready to sign Continue = True$
UnloadStageSigned = QA_Services('SignUnloadStage', RDSNo, Username, 1) If TestWaferLots NE '' then
If UnloadStageSigned EQ True$ then ToolID = ScansRow<SCANS.TOOL_ID$>
Result = '(':CassetteID:') Unload stage signed.' 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 end
LogData<6> = Action
LogData<7> = Result
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Case CurrStage _EQC 'COMP' Case CurrStage _EQC 'COMP'
Action = 'COMP' Action = 'COMP'
Error_Services('Set', '(':CassetteID:") Cassette has already been FQA'd.") 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.') Error_Services('Add', 'ScanID or ScanJSON argument was missing in the ' : Service : ' service.')
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
@ -1568,6 +1684,8 @@ end service
// HAL+JSON properties will be added to the JSON object. // HAL+JSON properties will be added to the JSON object.
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
Service ConvertMVScanToJSON(ScanID, mvScan, itemURL) Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
StartTick = GetTickCount()
MetricName = 'ConvertMVScanToJSON'
jsonScan = '' jsonScan = ''
@ -1674,6 +1792,7 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
SRP_JSON(objEmployee, 'SetValue', 'authorized', {EMPLOYEE_AUTHORIZED}, 'Boolean') SRP_JSON(objEmployee, 'SetValue', 'authorized', {EMPLOYEE_AUTHORIZED}, 'Boolean')
SRP_JSON(objEmployee, 'SetValue', 'notAuthorizedReason', {EMPLOYEE_NOT_AUTHORIZED_REASON}, 'String') 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', '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(objJSONScan, 'Set', 'employee', objEmployee)
SRP_JSON(objEmployee, 'Release') SRP_JSON(objEmployee, 'Release')
@ -1787,52 +1906,6 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
end else end else
SupplUnloadInstAckReq = False$ SupplUnloadInstAckReq = False$
end 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 end else
SupplUnloadInstAckReq = False$ SupplUnloadInstAckReq = False$
end end
@ -2114,6 +2187,8 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
Response = jsonScan Response = jsonScan
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
@ -2350,8 +2425,3 @@ ClearCursors:
return return

View File

@ -55,15 +55,23 @@ EQU NOTIFICATION_PERIOD$ TO 12
Declare subroutine Error_Services, Schedule_Services, Memory_Services, RList, Database_Services, Logging_Services 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 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 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 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 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/') Date = Oconv(Date(), 'D4/')
LogFileName = Date[7, 4] : '-' : Date[1, 2] : '-' : Date[4, 2] : ' Scheduler Log.csv' LogFileName = Date[7, 4] : '-' : Date[1, 2] : '-' : Date[4, 2] : ' Scheduler Log.csv'
Headers = 'Logging DTM' : @FM : 'Service Step' : @FM : 'Service Notes' Headers = 'Logging DTM' : @FM : 'Service Step' : @FM : 'Service Notes'
ColumnWidths = 20 : @FM : 30 : @FM : 150 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 GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.') Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
@ -795,6 +803,8 @@ end service
Service GetCurrentEvent(ReactNo) Service GetCurrentEvent(ReactNo)
StartTick = GetTickCount()
MetricName = 'GetCurrentEvent'
SchedDetKey = '' SchedDetKey = ''
If ReactNo NE '' then If ReactNo NE '' then
@ -814,9 +824,14 @@ Service GetCurrentEvent(ReactNo)
GoSub ClearCursors GoSub ClearCursors
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service CurrentEventIsBlock(ReactNo) Service CurrentEventIsBlock(ReactNo)
StartTick = GetTickCount()
MetricName = 'CurrentEventIsBlock'
If ReactNo NE '' then If ReactNo NE '' then
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo) CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
@ -838,9 +853,15 @@ Service CurrentEventIsBlock(ReactNo)
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.' ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg) Error_Services('Add', ErrorMsg)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service GetNextEvent(ReactNo) Service GetNextEvent(ReactNo)
StartTick = GetTickCount()
MetricName = 'GetNextEvent'
SchedDetKey = '' SchedDetKey = ''
If ReactNo NE '' then If ReactNo NE '' then
CurrDTM = Datetime() CurrDTM = Datetime()
@ -870,6 +891,9 @@ Service GetNextEvent(ReactNo)
end end
GoSub ClearCursors GoSub ClearCursors
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service GetEngagedEvent(ReactNo) Service GetEngagedEvent(ReactNo)
@ -919,6 +943,9 @@ Service GetLastEngagedEvent(ReactNo)
end service end service
Service NextEventIsSamePsn(ReactNo) Service NextEventIsSamePsn(ReactNo)
StartTick = GetTickCount()
MetricName = 'NextEventIsSamePsn'
Response = False$ Response = False$
If ReactNo NE '' then If ReactNo NE '' then
CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo) CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo)
@ -962,9 +989,15 @@ Service NextEventIsSamePsn(ReactNo)
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.' ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg) Error_Services('Add', ErrorMsg)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service NextEventIsBlock(ReactNo) Service NextEventIsBlock(ReactNo)
StartTick = GetTickCount()
MetricName = 'NextEventIsBlock'
If ReactNo NE '' then If ReactNo NE '' then
NextSchedDetKey = Schedule_Services('GetNextEvent', ReactNo) NextSchedDetKey = Schedule_Services('GetNextEvent', ReactNo)
@ -986,6 +1019,9 @@ Service NextEventIsBlock(ReactNo)
ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.' ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.'
Error_Services('Add', ErrorMsg) Error_Services('Add', ErrorMsg)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
@ -3561,3 +3597,4 @@ CreateScheduleChangeNotification:
return return

View File

@ -16,7 +16,8 @@ Subroutine Service_Manager_Debugger_Intercept(Void)
Metadata : Metadata :
History : (Date, Initials, Notes) History : (Date, Initials, Notes)
07/25/23 djs Original programmer. 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 APP_INSERTS
$insert RTI_DEBUG_COMMON $insert RTI_DEBUG_COMMON
$insert ENVIRON_CONSTANTS
Declare function Environment_Services, Logging_Services Declare function Environment_Services, Logging_Services, Environment_Services, GetCommandLine, Datetime
Declare subroutine Logging_Services Declare subroutine Logging_Services, obj_Notes, Set_Env
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ServiceManager' Main:
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS') // Log event in .\LogFiles\ServiceManager\<Date> OEngine Log.csv
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' OEngine Log.csv' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\ServiceManager'
Headers = 'Stored Proc Status' : @FM : 'Stored Proc Status Code' : @FM : 'Current Program' : @FM : 'Call Depth' : @FM : 'Line No' : @FM : 'Call Stack' LogDate = Oconv(Date(), 'D4/')
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$) LogTime = Oconv(Time(), 'MTS')
LogData = '' LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' OEngine Log.csv'
LogData<1> = SPStatus@ Headers = 'Stored Proc Status' : @FM : 'Stored Proc Status Code' : @FM : 'Current Program' : @FM
LogData<2> = SPStatCode@ Headers := 'Call Depth' : @FM : 'Line No' : @FM : 'Call Stack'
LogData<3> = Curr_Program@ objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
LogData<4> = CallDepth@ LogData = ''
LogData<5> = LineNo@ LogData<1> = spStatus@
LogData<6> = CallStack@ LogData<2> = spStatCode@
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, '', '', '') 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 Return

View File

@ -27,19 +27,30 @@ Function Service_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
$insert LOGICAL $Insert APP_INSERTS
$insert SERVICE_SETUP $Insert SERVICE_SETUP
$insert SERVICES_EQUATES $Insert SERVICES_EQUATES
$insert RLIST_EQUATES $Insert RLIST_EQUATES
$insert SQL_REQUESTS_EQUATES $Insert SQL_REQUESTS_EQUATES
$Insert PROC_QUEUE_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@ 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 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 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 GoToService else
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.') 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$ ReadNext RequestKeyID else EOF = True$
Until EOF or Done Until EOF or Done
Lock hProcQueue, RequestKeyID then Lock hProcQueue, RequestKeyID then
Done = True$ DeleteRequest = True$
Server = Environment_Services('GetServer')
Done = True$
Database_Services('GetKeyIDLock', 'PROC_QUEUE', RequestKeyId) Database_Services('GetKeyIDLock', 'PROC_QUEUE', RequestKeyId)
RequestRow = Database_Services('ReadDataRow', 'PROC_QUEUE', RequestKeyID) RequestRow = Database_Services('ReadDataRow', 'PROC_QUEUE', RequestKeyID)
If RequestRow NE '' then If RequestRow NE '' then
Procedure = RequestRow<PROC_QUEUE.PROC_NAME$> Procedure = RequestRow<PROC_QUEUE.PROC_NAME$>
Procedure = UCase(Procedure)
Params = RequestRow<PROC_QUEUE.PARAMS$> Params = RequestRow<PROC_QUEUE.PARAMS$>
If Procedure NE '' then If Procedure NE '' then
Dim ProcParams(11) Dim ProcParams(12)
For each Param in Params using @VM setting pPos For each Param in Params using @VM setting pPos
ProcParams(pPos) = Param ProcParams(pPos) = Param
Next Param Next Param
NumArguments = DCount(Params, @VM) NumArguments = DCount(Params, @VM)
Begin Case Begin Case
Case NumArguments EQ 0 ; Call @Procedure() Case NumArguments EQ 0 ; Call @Procedure()
Case NumArguments EQ 1 ; Call @Procedure(ProcParams(1)) 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.') Error_Services('Add', 'Error in ':Service:' service. More than 11 arguments are not currently supported.')
End Case End Case
end 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 end else
RequestRow<PROC_QUEUE.LAST_ATTEMPT_DTM$> = DateTime() LogData<6> = 'Success'
RequestRow<PROC_QUEUE.ERROR$> = Error_Services('GetMessage')
Database_Services('WriteDataRow', 'PROC_QUEUE', RequestKeyID, RequestRow, True$, False$, False$) ; // This call will release the lock
end end
end else Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
// Empty request, so delete it from the queue
Database_Services('DeleteDataRow', 'PROC_QUEUE', RequestKeyId, True$, False$) ; // This call will release the lock
end end
If DeleteRequest then
Database_Services('DeleteDataRow', 'PROC_QUEUE', RequestKeyId, True$, False$)
end
Unlock hProcQueue, RequestKeyID else Null
end end
Repeat Repeat
end end
@ -217,36 +273,32 @@ Service PostProcedure(ProcedureName, Params, Critical=BOOLEAN)
If Critical EQ '' then Critical = True$ If Critical EQ '' then Critical = True$
PostToQueue = True$ PostToQueue = True$
If (ProcedureName NE '') then If (ProcedureName NE '') then
If (Params NE '') then If Not(Critical) then
If Not(Critical) then // Check if there is already a matching request in the queue before posting another one.
// Check if there is already a matching request in the queue before posting another one. Query = 'PROC_NAME':@VM:ProcedureName:@FM
Query = 'PROC_NAME':@VM:ProcedureName:@FM Query := 'PARAMS':@VM:Params:@FM
Query := 'PARAMS':@VM:Params:@FM Open 'DICT.PROC_QUEUE' to hDict then
Open 'DICT.PROC_QUEUE' to hDict then Keys = ''
Keys = '' Option = 'E'
Option = 'E' Flag = ''
Flag = '' Btree.Extract(Query, 'PROC_QUEUE', hDict, Keys, Option, Flag)
Btree.Extract(Query, 'PROC_QUEUE', hDict, Keys, Option, Flag) If Flag EQ 0 then
If Flag EQ 0 then If Keys NE '' then PostToQueue = False$
If Keys NE '' then PostToQueue = False$
end else
Error_Services('Add', 'Error in ':Service:' service. Error calling Btree.Extract.')
end
end else 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
end else
Error_Services('Add', 'Error in ':Service:' service. Error opening DICT.PROC_QUEUE.')
end end
If PostToQueue then end
RequestKeyID = RTI_CreateGUID() If PostToQueue then
RequestRow = '' RequestKeyID = RTI_CreateGUID()
RequestRow<PROC_QUEUE.PROC_NAME$> = ProcedureName RequestRow = ''
RequestRow<PROC_QUEUE.PARAMS$> = Params RequestRow<PROC_QUEUE.PROC_NAME$> = ProcedureName
RequestRow<PROC_QUEUE.ENTRY_DTM$> = Datetime() RequestRow<PROC_QUEUE.PARAMS$> = Params
Database_Services('WriteDataRow', 'PROC_QUEUE', RequestKeyID, RequestRow, True$, False$, False$) RequestRow<PROC_QUEUE.ENTRY_DTM$> = Datetime()
end Database_Services('WriteDataRow', 'PROC_QUEUE', RequestKeyID, RequestRow, True$, False$, False$)
end else end
Error_Services('Add', 'Error in ':Service:' service. Null Params passed in.')
end
end else end else
Error_Services('Add', 'Error in ':Service:' service. Null ProcedureName passed in.') Error_Services('Add', 'Error in ':Service:' service. Null ProcedureName passed in.')
end end
@ -254,8 +306,98 @@ Service PostProcedure(ProcedureName, Params, Critical=BOOLEAN)
return 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 /// 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 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 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 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 PSNKey = ServiceKeyID
ReactorKey = 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 GoToService
Return Response or "" Return Response or ""
@ -114,7 +122,7 @@ end service
Service CheckQALabelStatus(WOMatKey) Service CheckQALabelStatus(WOMatKey)
rec = Xlate('WO_MAT', WoMatKey,'', '') rec = Xlate('WO_MAT', WoMatKey,'', '')
locRec = rec<WO_MAT_INV_LOCATION$> locRec = rec<WO_MAT_INV_LOCATION$>
actionRec = rec<WO_MAT_INV_ACTION$> actionRec = rec<WO_MAT_INV_ACTION$>
@ -135,6 +143,8 @@ end service
Service GetSigProfile(WOMatKey, UseCaching, RDSNo) Service GetSigProfile(WOMatKey, UseCaching, RDSNo)
StartTick = GetTickCount()
MetricName = 'GetSigProfile'
If UseCaching EQ '' then UseCaching = True$ If UseCaching EQ '' then UseCaching = True$
@ -175,6 +185,8 @@ Service GetSigProfile(WOMatKey, UseCaching, RDSNo)
SigDTMs = OCONV(SigDTMs,'DT4/^S') SigDTMs = OCONV(SigDTMs,'DT4/^S')
Response = SigProfile:@FM:Signatures:@FM:SigDTMs Response = SigProfile:@FM:Signatures:@FM:SigDTMs
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
@ -211,6 +223,9 @@ end service
Service CheckSigOrder(WOMatKey, CurrStage, UseCaching, RDSNo) Service CheckSigOrder(WOMatKey, CurrStage, UseCaching, RDSNo)
StartTick = GetTickCount()
MetricName = 'CheckSigOrder'
If UseCaching EQ '' then UseCachine = True$ If UseCaching EQ '' then UseCachine = True$
Response = False$ Response = False$
If RDSNo NE '' then If RDSNo NE '' then
@ -264,6 +279,8 @@ Service CheckSigOrder(WOMatKey, CurrStage, UseCaching, RDSNo)
Response = True$ Response = True$
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
End Service End Service
@ -282,7 +299,7 @@ end service
Service GetSigInfo(WOMatKey, Stage, UseCaching, RDSNo) Service GetSigInfo(WOMatKey, Stage, UseCaching, RDSNo)
If UseCaching EQ '' then UseCaching = True$ If UseCaching EQ '' then UseCaching = True$
Signature = '' Signature = ''
SigDTM = '' SigDTM = ''
@ -2010,20 +2027,17 @@ Service QASigReady(RDSNo)
* Verify Unload Stage QA Metrology Tests * * Verify Unload Stage QA Metrology Tests *
****************************************** ******************************************
If ErrorMessage EQ '' then If ErrorMessage EQ '' then
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X') WOMatQAKey = WOMatKey
If (DevelopmentFlag EQ True$) then WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
WOMatQAKey = WOMatKey OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey) OutOfSpec = Sum(OutOfSpec)
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$> If OutOfSpec GT 0 then
OutOfSpec = Sum(OutOfSpec) FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
If OutOfSpec GT 0 then ErrorMessage = 'Error in ':Service:' service. '
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$> For each FailReason in FailReasons using @VM
ErrorMessage = 'Error in ':Service:' service. ' ErrorMessage := FailReason:' '
For each FailReason in FailReasons using @VM Next FailReason
ErrorMessage := FailReason:' ' end
Next FailReason
end
end
end end
************************************************************************ ************************************************************************
@ -2844,4 +2858,3 @@ GetMostRecentSig:
return return

View File

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

View File

@ -10,9 +10,10 @@ $Insert TEST_RUN_OBJ_EQUATES
$Insert LOT_EQUATES $Insert LOT_EQUATES
$Insert LOT_OPERATION_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 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 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' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\TEST_RUN_SERVICES\TestWaferProduct'
LogDate = Oconv(Date(), 'D4/') LogDate = Oconv(Date(), 'D4/')
@ -30,6 +31,13 @@ objLogTR = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, He
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM 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 GoToService
Return Response or "" Return Response or ""
@ -280,6 +288,9 @@ Service UpdateTWProdSortOrder(TWProdKey, NewOrder)
end service end service
Service GetAllTestRunTypes() Service GetAllTestRunTypes()
StartTick = GetTickCount()
MetricName = 'GetAllTestRunTypes'
keylist = '' keylist = ''
rtList = '' rtList = ''
RList('SELECT TEST_RUN_TYPE BY RUN_TYPE', 5, '', '', '') RList('SELECT TEST_RUN_TYPE BY RUN_TYPE', 5, '', '', '')
@ -297,6 +308,9 @@ Service GetAllTestRunTypes()
end end
Next ProdKey Next ProdKey
Response = rtList Response = rtList
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service GetTestWaferLots(ShowOnlyOpenLots) Service GetTestWaferLots(ShowOnlyOpenLots)
@ -318,6 +332,9 @@ Service GetTestWaferLots(ShowOnlyOpenLots)
end service end service
Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLotIds, TWLotQtys) Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLotIds, TWLotQtys)
StartTick = GetTickCount()
MetricName = 'CreateTestRunRecord'
TWRunKey = '' TWRunKey = ''
Response = '' Response = ''
ErrorMessage = '' ErrorMessage = ''
@ -490,9 +507,15 @@ Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLo
Error_Services('Add', ErrorMessage) Error_Services('Add', ErrorMessage)
Response = '' Response = ''
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotId, Username) Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotId, Username)
StartTick = GetTickCount()
MetricName = 'CreateTestRunWaferRecord'
ErrorMessage = '' ErrorMessage = ''
If TestRunID NE '' AND TWPartID NE '' then If TestRunID NE '' AND TWPartID NE '' then
If RowExists('TEST_RUN', TestRunID) then If RowExists('TEST_RUN', TestRunID) then
@ -537,6 +560,9 @@ Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotId
Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM) Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM)
Error_Services('Add', 'Error creating new test run record: ' : ErrorMessage) Error_Services('Add', 'Error creating new test run record: ' : ErrorMessage)
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service UseTWFromLot(LotId, UsageQty, Username) Service UseTWFromLot(LotId, UsageQty, Username)
@ -706,6 +732,9 @@ Service GetTestRunKeysByPSN(PSNo)
end service end service
Service GetTestRunKeysByRDS(RDSNo) Service GetTestRunKeysByRDS(RDSNo)
StartTick = GetTickCount()
MetricName = 'GetTestRunKeysByRDS'
table = "TEST_RUN" table = "TEST_RUN"
Open "DICT ":table To @DICT Else Open "DICT ":table To @DICT Else
Error_Services('Add', 'Error opening TEST_RUN dictionary') Error_Services('Add', 'Error opening TEST_RUN dictionary')
@ -718,6 +747,9 @@ Service GetTestRunKeysByRDS(RDSNo)
Btree.Extract(srch_strng, table, @DICT, keylist, option, flag) Btree.Extract(srch_strng, table, @DICT, keylist, option, flag)
Response = keylist Response = keylist
end end
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service GetTestRunWaferByID(TRWaferID) 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 WM_OUT_EQUATES
$Insert RLIST_EQUATES $Insert RLIST_EQUATES
$Insert WAFER_COUNTER_EQUATES $Insert WAFER_COUNTER_EQUATES
$Insert TOOL_EQUATES
$Insert TOOL_LOG_EQUATES
Equ Tab$ to \09\ Equ Tab$ to \09\
Equ CRLF$ to \0D0A\ Equ CRLF$ to \0D0A\
@ -43,8 +45,9 @@ Equ next_cur$ To 1
Equ add_exist$ to 2 Equ add_exist$ to 2
Declare subroutine Error_Services, Database_Services, Logging_Services, Httpclient_Services, Reduce, SRP_JSON Declare subroutine Error_Services, Database_Services, Logging_Services, Httpclient_Services, Reduce, SRP_JSON
Declare function Database_Services, Environment_Services, Logging_Services, Httpclient_Services Declare subroutine Wafer_Counter_Services, Lot_Event_Services
Declare function RTI_CreateGuid, SRP_JSON 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' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WaferCounter'
LogDate = Oconv(Date(), 'D4/') LogDate = Oconv(Date(), 'D4/')
@ -263,6 +266,8 @@ Service AddScan(LotID, ScanQty, ScanDtm, ScanTool, ScanUser, ScanLocation, Wafer
Record<WAFER_COUNTER.SCAN_WAFER_MAP$> = WaferMap Record<WAFER_COUNTER.SCAN_WAFER_MAP$> = WaferMap
Database_Services('WriteDataRow', 'WAFER_COUNTER', KeyID, Record) Database_Services('WriteDataRow', 'WAFER_COUNTER', KeyID, Record)
Response = KeyId
end service end service
@ -393,6 +398,161 @@ Service GetWaferCounterToolID(WaferSize=WAFER_SIZES, Location=LOCATIONS)
end service 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 // Internal GoSubs
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -405,3 +565,4 @@ ClearCursors:
return return

View File

@ -1231,19 +1231,23 @@ Service SignVoidNonEpp(WOMatKey, Username)
Service_Services('PostProcedure', 'RDS_SERVICES', 'DetachRDSFromWO':@vm:RDSNo) Service_Services('PostProcedure', 'RDS_SERVICES', 'DetachRDSFromWO':@vm:RDSNo)
If Error_Services('NoError') then If Error_Services('NoError') then
LotEventParams = '' LotEventParams = ''
LotEventParams<1,1> = 'CreateLotEvent' LotEventParams<1,1> = 'CreateLotEvent' ; //Service Module
LotEventParams<1,4> = DateTime() LotEventParams<1,2> = ''; //Legacy Lot Id, set below
LotEventParams<1,5> = 'VOID' LotEventParams<1,3> = DateTime(); //Datetime
LotEventParams<1,6> = 'Lot voided by ' : Username LotEventParams<1,4> = 'VOID'; //Event Type
LotEventParams<1,11> = Username 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 If RDSNo NE '' then
LotEventParams<1,2> = RDSNo LotEventParams<1,2> = RDSNo
LotEventParams<1,3> = 'RDS' LotEventParams<1,9> = 'RDS'; //Legacy Lot Type
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
end else end else
LotEventParams<1,2> = WoMatKey LotEventParams<1,2> = WoMatKey
LotEventParams<1,3> = 'WO_MAT' LotEventParams<1,9> = 'WO_MAT'
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) Service_Services('PostProcedure', 'LOT_EVENT_SERVICES', LotEventParams)
end end
If Error_Services('NoError') then If Error_Services('NoError') then
//Add inventory transaction //Add inventory transaction
@ -1311,13 +1315,15 @@ Service SignVoidWMI(WMInKey, Username)
If Error_Services('NoError') then If Error_Services('NoError') then
LotEventParams = '' LotEventParams = ''
LotEventParams<1,1> = 'CreateLotEvent' 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,2> = WMInKey
LotEventParams<1,3> = 'WM_IN' LotEventParams<1,3> = DateTime()
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) 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 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 //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 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 If Error_Services('NoError') then
LotEventParams = '' LotEventParams = ''
LotEventParams<1,1> = 'CreateLotEvent' 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,2> = WMOutKey
LotEventParams<1,3> = 'WM_OUT' LotEventParams<1,3> = DateTime()
Service_Services('PostProcedure', 'LOT_SERVICES', LotEventParams) 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 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 //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 WMIKey = WMOutKey; //the paired WMO key is the same as the WMIKey
@ -1558,3 +1566,4 @@ ClearCursors:
return return

View File

@ -181,14 +181,7 @@ DoRead:
Reactor = get_property( @window, '@Reactor' ) Reactor = get_property( @window, '@Reactor' )
LoadedRDS = Xlate('REACT_STATUS', Reactor, 'LOAD_RDS', 'X') LoadedRDS = Xlate('REACT_STATUS', Reactor, 'LOAD_RDS', 'X')
LoadedRuns = '' LoadedRuns = Xlate('RDS', LoadedRDS, 'RUN_ORDER_NUM', 'X')
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
LoadedData = '' LoadedData = ''
For each RDSNo in LoadedRDS using @VM setting vPos For each RDSNo in LoadedRDS using @VM setting vPos
@ -507,5 +500,3 @@ REACT_MODE:
END END
RETURN RETURN

View File

@ -573,15 +573,16 @@ return
WRITE_RECORD: WRITE_RECORD:
WONo = Field(Name, '*', 1) WONo = Field(Name, '*', 1)
CassNo = Field(Name, '*', 2) CassNo = Field(Name, '*', 2)
WOMatKeyID = Name WOMatKeyID = Name
If {REACTOR_TYPE} NE 'EPP' then If {REACTOR_TYPE} NE 'EPP' then
If {MAKEUP_BOX} then If {MAKEUP_BOX} then
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID) CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID)
If CurrWaferCount GT 0 then CurrStatus = {CURR_STATUS}
If ( (CurrWaferCount GT 0) and (CurrStatus NE 'VOID') ) then
// Populate MAKEUP_WAFERS table // Populate MAKEUP_WAFERS table
// Add/update cassette data to the MAKEUP_WAFERS table // Add/update cassette data to the MAKEUP_WAFERS table
If RowExists('MAKEUP_WAFERS', WOMatKeyID) then If RowExists('MAKEUP_WAFERS', WOMatKeyID) then
@ -600,7 +601,7 @@ WRITE_RECORD:
MUWfrRec<MAKEUP_WAFERS.PROD_VER_NO$> = {PROD_VER_NO} MUWfrRec<MAKEUP_WAFERS.PROD_VER_NO$> = {PROD_VER_NO}
MUWfrRec<MAKEUP_WAFERS.CUST_PART_NO$> = {CUST_PART_NO} MUWfrRec<MAKEUP_WAFERS.CUST_PART_NO$> = {CUST_PART_NO}
MUWfrRec<MAKEUP_WAFERS.REACT_TYPE$> = {REACTOR_TYPE} 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 MUWfrRec<MAKEUP_WAFERS.WFR_QTY$> = CurrWaferCount
DateOut = Xlate('RDS', {RDS_NO}, 'DATE_OUT', 'X') DateOut = Xlate('RDS', {RDS_NO}, 'DATE_OUT', 'X')
TimeOut = Xlate('RDS', {RDS_NO}, 'TIME_OUT', 'X') / 86400 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 #pragma precomp SRP_PreCompiler
Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services 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 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 LOGICAL
$Insert APP_INSERTS $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$) objSyncLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM 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 GoToService else
Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.') Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end end
@ -379,6 +386,9 @@ Service SyncWOMatInvActionsAndSigProfile(WOMatKey)
end service end service
Service CassetteIsLastInWo(WoMatKey) Service CassetteIsLastInWo(WoMatKey)
StartTick = GetTickCount()
MetricName = 'CassetteIsLastInWo'
IsLastInWo = False$ IsLastInWo = False$
If Unassigned(WoMatKey) or WoMatKey EQ '' or RowExists('WO_MAT', WoMatKey) NE True$ then If Unassigned(WoMatKey) or WoMatKey EQ '' or RowExists('WO_MAT', WoMatKey) NE True$ then
@ -424,6 +434,9 @@ Service CassetteIsLastInWo(WoMatKey)
end end
Response = IsLastInWo Response = IsLastInWo
EndTick = GetTickCount()
Mona_Services('QueueLatencyAndCountMetrics', MonaResource, MetricName, StartTick, EndTick)
end service end service
Service SetWoMatVoidFlag(WoMatKey, Username) Service SetWoMatVoidFlag(WoMatKey, Username)
@ -473,3 +486,4 @@ Service SetWoMatVoidFlag(WoMatKey, Username)
end service end service

View File

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

View File

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

View File

@ -12,6 +12,8 @@ compile insert PROC_QUEUE_EQUATES
equ PROC_QUEUE.LAST_ATTEMPT_DTM$ to 3 equ PROC_QUEUE.LAST_ATTEMPT_DTM$ to 3
equ PROC_QUEUE.ERROR$ to 4 equ PROC_QUEUE.ERROR$ to 4
equ PROC_QUEUE.ENTRY_DTM$ to 5 equ PROC_QUEUE.ENTRY_DTM$ to 5
equ PROC_QUEUE.NUM_ATTEMPTS$ to 6
#endif #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_FULL_CHAR_POCKET$ To 167
Equ PROD_SPEC_ANKO_WAFER_SELECTION$ To 168 Equ PROD_SPEC_ANKO_WAFER_SELECTION$ To 168
Equ PROD_SPEC_LOCKED_BY$ To 169 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_INTRUSIVE_MAINT_CHECKLIST_ACTIVE$ To 72
Equ REACTOR_ABORT_ALARM_CHECKLIST_ACTIVE$ To 73 Equ REACTOR_ABORT_ALARM_CHECKLIST_ACTIVE$ To 73
Equ REACTOR_ABORT_ALARM_COMPLETE$ To 74 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_RI_NO$ To 0
Equ REACT_ITEM_DESC$ To 1 Equ REACT_ITEM_DESC$ To 1
Equ REACT_ITEM_ENTER_BY$ To 2 Equ REACT_ITEM_ENTER_BY$ To 2
Equ REACT_ITEM_ENTER_DTM$ To 3 Equ REACT_ITEM_ENTER_DTM$ To 3
Equ REACT_ITEM_RETIRE_BY$ To 4 Equ REACT_ITEM_RETIRE_BY$ To 4
Equ REACT_ITEM_RETIRE_DT$ To 5 Equ REACT_ITEM_RETIRE_DT$ To 5
Equ REACT_ITEM_PART_TYPE$ To 6 Equ REACT_ITEM_PART_TYPE$ To 6
Equ REACT_ITEM_MFR_CD$ To 7 Equ REACT_ITEM_MFR_CD$ To 7
Equ REACT_ITEM_MFR_PART_NO$ To 8 Equ REACT_ITEM_MFR_PART_NO$ To 8
Equ REACT_ITEM_MFR_PART_NO_REV$ To 9 Equ REACT_ITEM_MFR_PART_NO_REV$ To 9
Equ REACT_ITEM_SERIAL_NO$ To 10 Equ REACT_ITEM_SERIAL_NO$ To 10
Equ REACT_ITEM_RI_TYPE$ To 11 Equ REACT_ITEM_RI_TYPE$ To 11
Equ REACT_ITEM_SUSC_SIZE$ To 12 Equ REACT_ITEM_SUSC_SIZE$ To 12
Equ REACT_ITEM_PKT_QTY$ To 13 Equ REACT_ITEM_PKT_QTY$ To 13
Equ REACT_ITEM_PKT_SIZE$ To 14 Equ REACT_ITEM_PKT_SIZE$ To 14
Equ REACT_ITEM_NOTES$ To 15 Equ REACT_ITEM_NOTES$ To 15
Equ REACT_ITEM_PPLUS_RDS_NO$ To 16 Equ REACT_ITEM_PPLUS_RDS_NO$ To 16
Equ REACT_ITEM_SERIAL$ To 17 Equ REACT_ITEM_SERIAL$ To 17
Equ REACT_ITEM_TUBE_GRADE$ To 18 Equ REACT_ITEM_TUBE_GRADE$ To 18
Equ REACT_ITEM_TUBE_PRESS$ To 19 Equ REACT_ITEM_TUBE_PRESS$ To 19
Equ REACT_ITEM_TUBE_STYLE$ To 20 Equ REACT_ITEM_TUBE_STYLE$ To 20
Equ REACT_ITEM_NEW_OR_REFURB$ To 21 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.TW_LOT_QTY$ to 31
equ SCANS.TEST_RUN_TYPE_ID$ to 32 equ SCANS.TEST_RUN_TYPE_ID$ to 32
equ SCANS.TEST_RUN_TYPE_NAME$ to 33 equ SCANS.TEST_RUN_TYPE_NAME$ to 33
equ SCANS.IS_AUTHORIZED_TO_OVERRIDE_ROTR$ to 34
#endif #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_LAST_CASSETTE_TEST_WAFER_ACKED$ To 148
Equ WO_MAT_HOLD_STAGE$ To 149 Equ WO_MAT_HOLD_STAGE$ To 149
Equ WO_MAT_HOLD_INTERRUPTED$ To 150 Equ WO_MAT_HOLD_INTERRUPTED$ To 150
Equ WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$ To 151