diff --git a/LSL2/STPROC/RDS_SERVICES.txt b/LSL2/STPROC/RDS_SERVICES.txt index d29b3b2..80f4a5f 100644 --- a/LSL2/STPROC/RDS_SERVICES.txt +++ b/LSL2/STPROC/RDS_SERVICES.txt @@ -84,6 +84,7 @@ $Insert NOTIFICATION_EQUATES $Insert DICT_EQUATES $Insert COMPANY_EQUATES $Insert RETURN_TO_FAB_LOTS_EQUATES +$Insert TEST_RUN_EQUATES EQU COL$LSID TO 1 EQU COL$RECIPE TO 2 @@ -848,6 +849,27 @@ Service IsTWLoggingReqd(RDSNo) Response = IsTWReqd 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 + //---------------------------------------------------------------------------------------------------------------------- // VerifyEPPMetrology // @@ -1805,3 +1827,4 @@ return + diff --git a/LSL2/STPROC/RDS_UNLOAD_EVENTS.txt b/LSL2/STPROC/RDS_UNLOAD_EVENTS.txt index 1070029..7a2abb4 100644 --- a/LSL2/STPROC/RDS_UNLOAD_EVENTS.txt +++ b/LSL2/STPROC/RDS_UNLOAD_EVENTS.txt @@ -277,6 +277,7 @@ Event PUB_SIGN.CLICK() end If (Valid EQ True$) then ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X') + ErrMsg = '' If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then WoMatKey = WONo:'*':CassNo IsLastCassetteInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey) @@ -298,26 +299,44 @@ Event PUB_SIGN.CLICK() WoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey) WoMatRecord = True$ - Message = '' - If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then - Message = 'No material scheduled. Test wafer required.' - end else if NextEventHasSamePsn EQ False$ then - Message = 'Next work order is a NEW PSN number. Test wafer required.' + TestWaferRanSinceLoad = WoMatRecord + + If TestWaferRanSinceLoad NE True$ then + TestWaferRanSinceLoad = Rds_Services('TestWaferRanAfterLoad', RDSNo) + WoMatRecord = 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 = TWLogResult + + If TWLogResult NE True$ then + ErrMsg = 'Unload blocked! You must run a test wafer before signing the unload' + end + end end - - MesageAcked = Message_Box(@Window, Message, "Test Wafer Required", MSG_BTN_OK$ + MSG_ICON_EXCLAM$) - - WoMatRecord = True$ - Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$) - - ConfirmNote = 'Test wafer requirement acknowledged. [RDS:' : RDSNo : '], [WO:' : WONo : '], [Cassette:' : CassNo : ']' - Reactor_Log_Services('AddComment', Reactor, ConfirmNote, @User4) end + Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$) end end end - QA_Services('SignUnloadStage', RDSNo, @User4) + If ErrMsg NE '' then + Error_Services('Add', ErrMsg) + end + + If Error_Services('NoError') then + QA_Services('SignUnloadStage', RDSNo, @User4) + end end end If Error_Services('HasError') then @@ -446,3 +465,4 @@ return + diff --git a/LSL2/STPROC/SCAN_SERVICES.txt b/LSL2/STPROC/SCAN_SERVICES.txt index 48c31b5..f45fac6 100644 --- a/LSL2/STPROC/SCAN_SERVICES.txt +++ b/LSL2/STPROC/SCAN_SERVICES.txt @@ -667,6 +667,7 @@ Service ProcessScanData(ScanID, ScanJSON) If (CassetteIDs NE '') then TestWaferLotData = ScansRow Abort = False$ + TestWaferLotIsValid = False$ If TestWaferLotData NE '' then ThisTestRunType = ScansRow If ThisTestRunType NE '' then @@ -682,6 +683,8 @@ Service ProcessScanData(ScanID, ScanJSON) If Not(TWLotCurrOpen) then Abort = True$ Scan_Services('AddNotAcceptableReason', 'Lot ':TWLot:' is closed and cannot be used at this time.') + end else + TestWaferLotIsValid = True$ end end else Abort = True$ @@ -1105,6 +1108,60 @@ Service ProcessScanData(ScanID, ScanJSON) Case Otherwise$ // Keep error on Error_Services stack and return 400 level error. End Case + end else + ReactorNo = Xlate('RDS', RDSNo, RDS_REACTOR$, 'X') + ReactorType = Xlate('REACTOR', ReactorNo, REACTOR_REACT_TYPE$, 'X') + If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then + WO = Xlate('RDS', RDSNo, RDS_WO$, 'X') + CassNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X') + WoMatKey = WO:'*':CassNo + WoMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey) + LastCassInWoTestWaferAckReq = WoMatRec + 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 + TestWaferRanSinceLoad = WoMatRec 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 = TestWaferRanSinceLoad + + Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRec, True$, False$, False$) + end + end + end + end end end else ScanMsg = 'The POST stage engineering instructions must be acknowledged before the load operation can be signed.' @@ -1418,6 +1475,7 @@ Service AcceptScan(ScanID, ScanJSON) LogData<3> = Username LogData<4> = CurrStage LogData<5> = ScanID + Begin Case Case CurrStage _EQC 'VER' Action = 'LOAD' @@ -1508,14 +1566,32 @@ Service AcceptScan(ScanID, ScanJSON) Case CurrStage _EQC 'UNLOAD' Action = 'UNLOAD' - // Check if UNLOAD stage is ready to sign - UnloadStageSigned = QA_Services('SignUnloadStage', RDSNo, Username, 1) - If UnloadStageSigned EQ True$ then - Result = '(':CassetteID:') Unload stage signed.' + Continue = True$ + If TestWaferLots NE '' then + ToolID = ScansRow + Reactor = ToolID[-1, 'BR'] + Username = ScansRow + TestWaferLotQtys = ScansRow + TestRunType = ScansRow + PSNo = Xlate('RDS', RDSNo, RDS_PROD_SPEC_ID$, True$, 'X') + NewTestRunId = Test_Run_Services('CreateTestRunRecord', TestRunType, 'R', Reactor, PSNo, RDSNo,Username , TestWaferLots, TestWaferLotQtys) + If Error_Services('HasError') then + ErrorMessage = Error_Services('GetMessage') + Error_Services('Set', ErrorMessage) + Continue = False$ + end + end + + If Continue EQ True$ then + // Check if UNLOAD stage is ready to sign + UnloadStageSigned = QA_Services('SignUnloadStage', RDSNo, Username, 1) + If UnloadStageSigned EQ True$ then + Result = '(':CassetteID:') Unload stage signed.' + end + LogData<6> = Action + LogData<7> = Result + Logging_Services('AppendLog', objLog, LogData, @RM, @FM) end - LogData<6> = Action - LogData<7> = Result - Logging_Services('AppendLog', objLog, LogData, @RM, @FM) Case CurrStage _EQC 'COMP' Action = 'COMP' Error_Services('Set', '(':CassetteID:") Cassette has already been FQA'd.") @@ -1803,52 +1879,6 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL) end else SupplUnloadInstAckReq = False$ end - - ReactorNo = Xlate('RDS', RDSNo, RDS_REACTOR$, 'X') - ReactorType = Xlate('REACTOR', ReactorNo, REACTOR_REACT_TYPE$, 'X') - If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then - WO = Xlate('RDS', RDSNo, RDS_WO$, 'X') - CassNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X') - WoMatKey = WO:'*':CassNo - WoMatRec = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey) - LastCassInWoTestWaferAckReq = WoMatRec - 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 @@ -2372,5 +2402,3 @@ return - - diff --git a/LSL2/STPROCINS/WO_MAT_EQUATES.txt b/LSL2/STPROCINS/WO_MAT_EQUATES.txt index a307bfe..5b0603b 100644 --- a/LSL2/STPROCINS/WO_MAT_EQUATES.txt +++ b/LSL2/STPROCINS/WO_MAT_EQUATES.txt @@ -156,4 +156,5 @@ Equ WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$ To 147 Equ WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$ To 148 Equ WO_MAT_HOLD_STAGE$ To 149 Equ WO_MAT_HOLD_INTERRUPTED$ To 150 +Equ WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$ To 151