From f8c83dd7f457402c91a10d3694084333858ba422 Mon Sep 17 00:00:00 2001 From: Chase Tucker Date: Thu, 12 Dec 2024 08:38:41 -0700 Subject: [PATCH] remind operator to run test wafer on last cassete in WO --- LSL2/STPROC/RDS_UNLOAD_EVENTS.txt | 55 +++++++++++- LSL2/STPROC/SCAN_SERVICES.txt | 69 ++++++++++++++- LSL2/STPROC/SCHEDULE_SERVICES.txt | 127 +++++++++++++++++++++++++++ LSL2/STPROC/TEST_WO_MAT_SERVICES.txt | 42 +++++++++ LSL2/STPROC/WO_MAT_SERVICES.txt | 54 +++++++++++- LSL2/STPROCINS/WO_MAT_EQUATES.txt | 2 + 6 files changed, 341 insertions(+), 8 deletions(-) create mode 100644 LSL2/STPROC/TEST_WO_MAT_SERVICES.txt diff --git a/LSL2/STPROC/RDS_UNLOAD_EVENTS.txt b/LSL2/STPROC/RDS_UNLOAD_EVENTS.txt index 5972ab0..1070029 100644 --- a/LSL2/STPROC/RDS_UNLOAD_EVENTS.txt +++ b/LSL2/STPROC/RDS_UNLOAD_EVENTS.txt @@ -53,6 +53,7 @@ $insert CLEAN_INSP_EQUATES $insert REACT_STATE_EQUATES $insert REACT_RUN_EQUATES $insert REACT_ITEM_EQUATES +$Insert MESSAGE_BOX_EQUATES Equ COL$LOG_FILE to 1 Equ COL$LOG_DTM to 2 @@ -92,11 +93,11 @@ Equ ACTION$SPEC_SURFSCAN_RECIPE TO 8 Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services Declare subroutine Dialog_Box, Msg, MemberOf, obj_WO_Mat, Get_Property, obj_React_Status, Get_Status, Override_Services Declare subroutine record_lock, obj_React_Status, Post_Event, obj_React_State, obj_Post_Log, Qa_Services, Reactor_Services -Declare Subroutine Rds_Services +Declare Subroutine Rds_Services, WO_MAT_Services, Message_Box, Reactor_Log_Services, Schedule_Services Declare function dialog_box, msg, Get_Status, obj_WO_Mat, Get_Status, obj_Clean_Insp, obj_Reactor, Get_Property Declare function QA_Services, Database_Services, Set_Property, Rds_Services, Qa_Services, Memberof, Reactor_Services -Declare function Supplement_Services +Declare function Supplement_Services, WO_MAT_Services, Message_Box, Reactor_Log_Services, Schedule_Services SubclassInfo = Form_Services('FindSubclassControl') Subclass = SubclassInfo<1> @@ -275,6 +276,47 @@ Event PUB_SIGN.CLICK() Valid = True$ end If (Valid EQ True$) then + ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X') + If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then + WoMatKey = WONo:'*':CassNo + IsLastCassetteInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey) + If Error_Services('NoError') then + If IsLastCassetteInWo then + NextEventScheduled = False$ + NextEventHasSamePsn = True$ + NextEventIsBlock = False$ + + NextScheduledEvent = Schedule_Services('GetNextEvent', Reactor) + If Error_Services('NoError') then + NextEventScheduled = True$ + + NextEventHasSamePsn = Schedule_Services('NextEventIsSamePsn', Reactor) + NextEventIsBlock = Schedule_Services('NextEventIsBlock', Reactor) + end + + If NextEventScheduled EQ False$ or NextEventHasSamePsn EQ False$ or NextEventIsBlock EQ True$ then + WoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey) + WoMatRecord = True$ + + Message = '' + If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then + Message = 'No material scheduled. Test wafer required.' + end else if NextEventHasSamePsn EQ False$ then + Message = 'Next work order is a NEW PSN number. Test wafer required.' + end + + MesageAcked = Message_Box(@Window, Message, "Test Wafer Required", MSG_BTN_OK$ + MSG_ICON_EXCLAM$) + + WoMatRecord = 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 + end + end + QA_Services('SignUnloadStage', RDSNo, @User4) end end @@ -377,6 +419,14 @@ Event PUB_SIGN.CLICK() end Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$) + WoMatKey = WONo:'*':CassNo + WoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey) + + WoMatRecord = False$ + WoMatRecord = False$ + + Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$) + Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign') end else Return 0 @@ -395,3 +445,4 @@ return + diff --git a/LSL2/STPROC/SCAN_SERVICES.txt b/LSL2/STPROC/SCAN_SERVICES.txt index b0115b3..2c7b335 100644 --- a/LSL2/STPROC/SCAN_SERVICES.txt +++ b/LSL2/STPROC/SCAN_SERVICES.txt @@ -46,10 +46,10 @@ Common /ScanServices/ NotAcceptableReasons@, Unused2@, Unused3@, Unused4@, Unuse Declare Function Scan_Services, Memory_Services, Database_Services, SRP_JSON, RTI_CreateGUID, Rds_Services, Datetime Declare Function QA_Services, Error_Services, Security_Services, SRP_Array, obj_WO_Mat, Memberof, Override_Log_Services Declare Function Keyboard_Sim_Services, Environment_Services, Logging_Services, Reactor_Services, Supplement_Services -Declare function Test_Run_Services, Lot_Services +Declare function Test_Run_Services, Lot_Services, WO_MAT_Services, Reactor_Log_Services, Schedule_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 Test_Run_Services +Declare Subroutine Test_Run_Services, WO_MAT_Services, Reactor_Log_Services, Schedule_Services Equ CRLF$ to \0D0A\ @@ -537,6 +537,23 @@ Service ProcessScanData(ScanID, ScanJSON) ScansRow = TestRunTypeId //ScansRow = TestRunTypeName + Case Len(ScanData) GE 22 and ScanData[1, 22] EQ 'LAST_CASSETTE_TEST_ACK' + RDSNo = {CASSETTE_IDS} + Reactor = {TOOL_ID}[2,999] + + WO = Xlate('RDS', RDSNo, RDS_WO$, 'X') + CassNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X') + WoMatKey = WO:'*':CassNo + WoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey) + + WoMatRecord = True$ + + Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$) + + ConfirmNote = 'Test wafer requirement acknowledged. [RDS:' : RDSNo : '], [WO:' : WO : '], [Cassette:' : CassNo : ']' + Reactor_Log_Services('AddComment', Reactor, ConfirmNote, {EMPLOYEE_ID}) + + Result = 'Test wafer requirement acknowledged' Case ScanData EQ '' // Most likely receiving RDS data, so nothing to do here. Null @@ -722,7 +739,7 @@ Service ProcessScanData(ScanID, ScanJSON) SupplUnloadInstAckReq = True$ end else SupplUnloadInstAckReq = False$ - end + end end else SupplUnloadInstAckReq = False$ end @@ -1737,6 +1754,52 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL) end else SupplUnloadInstAckReq = False$ end + + ReactorNo = Xlate('RDS', RDSNo, RDS_REACTOR$, 'X') + ReactorType = Xlate('REACTOR', ReactorNo, REACTOR_REACT_TYPE$, 'X') + If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then + WO = Xlate('RDS', RDSNo, RDS_WO$, 'X') + CassNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X') + WoMatKey = WO:'*':CassNo + WoMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey) + LastCassInWoTestWaferAckReq = WoMatRec + LastCassInWoTestWaferAcked = WoMatRec + 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 = LastCassInWoTestWaferAckReq + WoMatRec = LastCassInWoTestWaferAcked + Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRec, True$, False$, False$) + + LastCassInWoTestWaferReqMsg = '' + If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then + LastCassInWoTestWaferReqMsg = 'No material scheduled. Test wafer required.' + end else If NextEventHasSamePsn EQ False$ then + LastCassInWoTestWaferReqMsg = 'Next work order is a NEW PSN number. Test wafer required.' + end + end + end + end + SRP_JSON(objRDS, 'SetValue', 'lastCassInWoTestWaferAckReq', LastCassInWoTestWaferAckReq, 'Boolean') + SRP_JSON(objRDS, 'SetValue', 'lastCassInWoTestWaferAcked', LastCassInWoTestWaferAcked, 'Boolean') + SRP_JSON(objRDS, 'SetValue', 'lastCassInWoTestWaferAckReqMsg', LastCassInWoTestWaferReqMsg, 'String') + end end else SupplUnloadInstAckReq = False$ end diff --git a/LSL2/STPROC/SCHEDULE_SERVICES.txt b/LSL2/STPROC/SCHEDULE_SERVICES.txt index 8cfbd11..4954aa1 100644 --- a/LSL2/STPROC/SCHEDULE_SERVICES.txt +++ b/LSL2/STPROC/SCHEDULE_SERVICES.txt @@ -36,6 +36,7 @@ $insert RLIST_EQUATES $insert REACTOR_EQUATES $insert SCHED_DET_NG_EQUATES $insert WO_LOG_EQUATES +$Insert WO_MAT_EQUATES $insert WO_SCHEDULE_NG_EQUATES $insert COMPANY_EQUATES $insert PROD_VER_EQUATES @@ -44,6 +45,7 @@ $insert SCHEDULE_EVENT_SUMMMARY_EQUATES $insert EPI_PART_EQUATES $insert PROD_SPEC_EQUATES $insert SCHED_HIST_EQUATES +$Insert RDS_EQUATES Equ new_exist$ To 0 ; * Reduce Mode 0 Equ next_cur$ To 1 @@ -814,6 +816,61 @@ Service GetCurrentEvent(ReactNo) end service +Service CurrentEventIsBlock(ReactNo) + If ReactNo NE '' then + CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo) + + If Error_Services('NoError') then + CurrentSchedDetRecord = Database_Services('ReadDataRow', 'SCHED_DET_NG', CurrentSchedDetKey) + + CurrentEventIsABlock = CurrentSchedDetRecord + If CurrentEventIsABlock EQ '' then + CurrentEventIsABlock = False$ + end + + Response = CurrentEventIsABlock + end else + Error = Error_Services('GetMessage') + ErrorMsg = 'Error in service ':Service:' module. ':Error + Error_Services('Add', ErrorMsg) + end + end else + ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.' + Error_Services('Add', ErrorMsg) + end +end service + +Service GetNextEvent(ReactNo) + SchedDetKey = '' + If ReactNo NE '' then + CurrDTM = Datetime() + Query = 'SELECT SCHED_DET_NG WITH REACT_NO EQ "':ReactNo:'" AND WITH EVENT_COMP NE 1 BY START_DTM' + Set_Status(0) + GoSub ClearCursors + Rlist(Query, TARGET_ACTIVELIST$, '', '', '') + errCode = '' + If Not(Get_Status(errCode)) then + EOF = False$ + ReadNext SchedDetKey else EOF = True$ + If EOF EQ True$ then + ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule' + Error_Services('Add', ErrorMsg) + end else + ReadNext SchedDetKey else EOF = True$ + If EOF EQ True$ then + ErrorMsg = 'Error in service ':Service:' module. No incomplete events in schedule after current event' + Error_Services('Add', ErrorMsg) + end else + Response = SchedDetKey + end + end + end else + ErrorMsg = 'Error in service ':Service:' module. Error code ':errCode + Error_Services('Add', ErrorMsg) + end + GoSub ClearCursors + end +end service Service GetEngagedEvent(ReactNo) @@ -861,6 +918,75 @@ Service GetLastEngagedEvent(ReactNo) end service +Service NextEventIsSamePsn(ReactNo) + Response = False$ + If ReactNo NE '' then + CurrentSchedDetKey = Schedule_Services('GetCurrentEvent', ReactNo) + + If Error_Services('NoError') then + CurrentEventIsABlock = Schedule_Services('CurrentEventIsBlock', ReactNo) + If CurrentEventIsABlock EQ False$ then + CurrentSchedDetRecord = Database_Services('ReadDataRow', 'SCHED_DET_NG', CurrentSchedDetKey) + + CurrentEventWoNo = CurrentSchedDetRecord + CurrentEventWoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', CurrentEventWoNo:'*1') + + CurrentEventRdsNo = CurrentEventWoMatRecord + CurrentEventRdsRecord = Database_Services('ReadDataRow', 'RDS', CurrentEventRdsNo) + + CurrentEventPsn = CurrentEventRdsRecord + + NextSchedDetKey = Schedule_Services('GetNextEvent', ReactNo) + + If Error_Services('NoError') then + NextEventIsABlock = Schedule_Services('NextEventIsBlock', ReactNo) + If NextEventIsABlock EQ False$ then + NextSchedDetRecord = Database_Services('ReadDataRow', 'SCHED_DET_NG', NextSchedDetKey) + + NextEventWoNo = NextSchedDetRecord + NextEventWoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', NextEventWoNo:'*1') + + NextEventRdsNo = NextEventWoMatRecord + NextEventRdsRecord = Database_Services('ReadDataRow', 'RDS', NextEventRdsNo) + + NextEventPsn = NextEventRdsRecord + + PsnsMatch = CurrentEventPsn EQ NextEventPsn + + Response = PsnsMatch + end + end + end + end + end else + ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.' + Error_Services('Add', ErrorMsg) + end +end service + +Service NextEventIsBlock(ReactNo) + If ReactNo NE '' then + NextSchedDetKey = Schedule_Services('GetNextEvent', ReactNo) + + If Error_Services('NoError') then + NextSchedDetRecord = Database_Services('ReadDataRow', 'SCHED_DET_NG', NextSchedDetKey) + + NextEventIsABlock = NextSchedDetRecord + If NextEventIsABlock EQ '' then + NextEventIsABlock = False$ + end + + Response = NextEventIsABlock + end else + Error = Error_Services('GetMessage') + ErrorMsg = 'Error in service ':Service:' module. ':Error + Error_Services('Add', ErrorMsg) + end + end else + ErrorMsg = 'Error in service ':Service:' module. Invalid reactor number.' + Error_Services('Add', ErrorMsg) + end +end service //---------------------------------------------------------------------------------------------------------------------- // AdjustScheduleEvents @@ -3434,3 +3560,4 @@ CreateScheduleChangeNotification: return + diff --git a/LSL2/STPROC/TEST_WO_MAT_SERVICES.txt b/LSL2/STPROC/TEST_WO_MAT_SERVICES.txt new file mode 100644 index 0000000..c86d028 --- /dev/null +++ b/LSL2/STPROC/TEST_WO_MAT_SERVICES.txt @@ -0,0 +1,42 @@ +Compile function Test_WO_MAT_SERVICES(@Test) +#pragma precomp SRP_PreCompiler + +$Insert LOGICAL + +Declare function WO_MAT_Services, Error_Services +Declare subroutine WO_MAT_Services, Error_Services + +GotoTest + +Error_Services('Clear') + +Return TestResult or 1 + +//----------------------------------------------------------------------------- +// TESTS +//----------------------------------------------------------------------------- + +Test CassetteIsLastInWoWithEmptyWoMatKeyShouldThrowError + WO_MAT_Services('CassetteIsLastInWo', '') + + ErrorWasThrown = Error_Services('HasError') + + Assert ErrorWasThrown equals True$ +End Test + +Test CassetteIsLastInWoWithFirstCassetteShouldReturnFalse + IsLastCassette = WO_MAT_Services('CassetteIsLastInWo', '173137*1') + + Assert Error_Services('NoError') + + Assert IsLastCassette EQ False$ +end test + +Test CassetteIsLastInWoWithLastCassetteShouldReturnTrue + IsLastCassette = WO_MAT_Services('CassetteIsLastInWo', '173137*66') + + Assert Error_Services('NoError') + + Assert IsLastCassette EQ True$ +end test + diff --git a/LSL2/STPROC/WO_MAT_SERVICES.txt b/LSL2/STPROC/WO_MAT_SERVICES.txt index f256822..241ce5a 100644 --- a/LSL2/STPROC/WO_MAT_SERVICES.txt +++ b/LSL2/STPROC/WO_MAT_SERVICES.txt @@ -7,6 +7,7 @@ Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_ $insert LOGICAL $Insert APP_INSERTS $insert WO_MAT_EQUATES +$Insert WO_LOG_EQUATES $Insert SERVICE_SETUP LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_Mat\InvActionsSyncUp' @@ -17,7 +18,9 @@ Headers = 'Logging DTM' : @FM : 'WOMatKey' : @FM : 'Missing Signature' : @FM : objSyncLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$) LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM -GoToService +GoToService else + Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.') +end Return Response or "" @@ -373,6 +376,51 @@ Service SyncWOMatInvActionsAndSigProfile(WOMatKey) end end service - - +Service CassetteIsLastInWo(WoMatKey) + IsLastInWo = False$ + + If Unassigned(WoMatKey) or WoMatKey EQ '' or RowExists('WO_MAT', WoMatKey) NE True$ then + Error_Services('Add', 'invalid WO_MAT key') + end + + WO = Field(WoMatKey, '*', 1) + If WO EQ '' then + Error_Services('Add', 'WO# not found in WO_MAT record') + end + If Error_Services('NoError') and Num(WO) EQ False$ then + Error_Services('Add', 'WO# is not numeric') + end + + CassNo = Field(WoMatKey, '*', 2) + If Error_Services('NoError') and CassNo EQ '' then + Error_Services('Add', 'Cassette# not found in WO_MAT record') + end + If Error_Services('NoError') and Num(CassNo) EQ False$ then + Error_Services('Add', 'Cassette# is not numeric') + end + + If Error_Services('NoError') then + WoMatKeys = Xlate('WO_LOG', WO, WO_LOG_WO_MAT_KEY$, 'X') + If Error_Services('NoError') and WoMatKeys NE '' then + TotalCassettes = DCount(WoMatKeys, @VM) + IsLastInWo = TotalCassettes EQ CassNo + end + end + + If Error_Services('HasError') then + ErrMsg = Error_Services('GetMessage') + + LogData = '' + LogData<1> = LoggingDtm + LogData<2> = WOMatKey + LogData<3> = '' + LogData<4> = '' + LogData<5> = 'Error in ' : Service:': ' : ErrMsg + Logging_Services('AppendLog', objSyncLog, LogData, @RM, @FM) + + Error_Services('Add', ErrMsg) + end + + Response = IsLastInWo +end service diff --git a/LSL2/STPROCINS/WO_MAT_EQUATES.txt b/LSL2/STPROCINS/WO_MAT_EQUATES.txt index 6940ea8..af56083 100644 --- a/LSL2/STPROCINS/WO_MAT_EQUATES.txt +++ b/LSL2/STPROCINS/WO_MAT_EQUATES.txt @@ -152,4 +152,6 @@ Equ WO_MAT_CURR_STATUS_STATIC$ To 143 Equ WO_MAT_FAILED_WAFERS$ To 144 Equ WO_MAT_LOCKED_BY$ To 145 Equ WO_MAT_CONVERTED_MATERIAL$ To 146 +Equ WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$ To 147 +Equ WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$ To 148