Require TW logging at HTR last cassette unload
This commit is contained in:
parent
4fc7eb189b
commit
6aad8036e5
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -277,6 +277,7 @@ Event PUB_SIGN.CLICK()
|
||||
end
|
||||
If (Valid EQ True$) then
|
||||
ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X')
|
||||
ErrMsg = ''
|
||||
If Len(ReactorType) GE 3 and ReactorType[1, 3] _EQC 'HTR' then
|
||||
WoMatKey = WONo:'*':CassNo
|
||||
IsLastCassetteInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey)
|
||||
@ -298,26 +299,44 @@ Event PUB_SIGN.CLICK()
|
||||
WoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', WoMatKey)
|
||||
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = True$
|
||||
|
||||
Message = ''
|
||||
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
|
||||
Message = 'No material scheduled. Test wafer required.'
|
||||
end else if NextEventHasSamePsn EQ False$ then
|
||||
Message = 'Next work order is a NEW PSN number. Test wafer required.'
|
||||
TestWaferRanSinceLoad = WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$>
|
||||
|
||||
If TestWaferRanSinceLoad NE True$ then
|
||||
TestWaferRanSinceLoad = Rds_Services('TestWaferRanAfterLoad', RDSNo)
|
||||
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
|
||||
|
||||
If TestWaferRanSinceLoad NE True$ then
|
||||
Message = ''
|
||||
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
|
||||
Message = 'No material scheduled. Test wafer required.'
|
||||
end else if NextEventHasSamePsn EQ False$ then
|
||||
Message = 'Next work order is a NEW PSN number. Test wafer required.'
|
||||
end
|
||||
|
||||
Message_Box(@Window, Message, "Test Wafer Required", MSG_BTN_OK$ + MSG_ICON_EXCLAM$)
|
||||
|
||||
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : '' : @VM : 'REACTOR' : @VM : Reactor)
|
||||
|
||||
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TWLogResult
|
||||
|
||||
If TWLogResult NE True$ then
|
||||
ErrMsg = 'Unload blocked! You must run a test wafer before signing the unload'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
MesageAcked = Message_Box(@Window, Message, "Test Wafer Required", MSG_BTN_OK$ + MSG_ICON_EXCLAM$)
|
||||
|
||||
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$> = True$
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
|
||||
|
||||
ConfirmNote = 'Test wafer requirement acknowledged. [RDS:' : RDSNo : '], [WO:' : WONo : '], [Cassette:' : CassNo : ']'
|
||||
Reactor_Log_Services('AddComment', Reactor, ConfirmNote, @User4)
|
||||
end
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRecord, True$, False$, False$)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
QA_Services('SignUnloadStage', RDSNo, @User4)
|
||||
If ErrMsg NE '' then
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
|
||||
If Error_Services('NoError') then
|
||||
QA_Services('SignUnloadStage', RDSNo, @User4)
|
||||
end
|
||||
end
|
||||
end
|
||||
If Error_Services('HasError') then
|
||||
@ -446,3 +465,4 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -667,6 +667,7 @@ Service ProcessScanData(ScanID, ScanJSON)
|
||||
If (CassetteIDs NE '') then
|
||||
TestWaferLotData = ScansRow<SCANS.TW_LOT_ID$>
|
||||
Abort = False$
|
||||
TestWaferLotIsValid = False$
|
||||
If TestWaferLotData NE '' then
|
||||
ThisTestRunType = ScansRow<SCANS.TEST_RUN_TYPE_ID$>
|
||||
If ThisTestRunType NE '' then
|
||||
@ -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<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$>
|
||||
LastCassInWoTestWaferAcked = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$>
|
||||
LastCassInWoTestWaferReqMsg = ''
|
||||
If LastCassInWoTestWaferAcked EQ False$ or LastCassInWoTestWaferAcked EQ '' then
|
||||
LastCassInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey)
|
||||
|
||||
If LastCassInWo then
|
||||
NextEventScheduled = False$
|
||||
NextEventHasSamePsn = True$
|
||||
NextEventIsBlock = False$
|
||||
|
||||
NextScheduledEvent = Schedule_Services('GetNextEvent', ReactorNo)
|
||||
If Error_Services('NoError') then
|
||||
NextEventScheduled = True$
|
||||
|
||||
NextEventHasSamePsn = Schedule_Services('NextEventIsSamePsn', ReactorNo)
|
||||
NextEventIsBlock = Schedule_Services('NextEventIsBlock', ReactorNo)
|
||||
end
|
||||
|
||||
If NextEventScheduled EQ False$ or NextEventHasSamePsn EQ False$ or NextEventIsBlock EQ True$ then
|
||||
LastCassInWoTestWaferAckReq = True$
|
||||
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = LastCassInWoTestWaferAckReq
|
||||
TestWaferRanSinceLoad = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> or TestWaferLotIsValid EQ True$
|
||||
|
||||
If TestWaferLotIsValid NE True$ and TestWaferRanSinceLoad NE True$ then
|
||||
TestWaferRanSinceLoad = Rds_Services('TestWaferRanAfterLoad', RDSNo)
|
||||
|
||||
If TestWaferRanSinceLoad NE True$ then
|
||||
LastCassInWoTestWaferReqMsg = ''
|
||||
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
|
||||
LastCassInWoTestWaferReqMsg = 'No material scheduled. Test wafer required.'
|
||||
end else If NextEventHasSamePsn EQ False$ then
|
||||
LastCassInWoTestWaferReqMsg = 'Next work order is a NEW PSN number. Test wafer required.'
|
||||
end
|
||||
|
||||
Scan_Services('AddNotAcceptableReason', LastCassInWoTestWaferReqMsg)
|
||||
end
|
||||
end
|
||||
|
||||
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_RAN$> = TestWaferRanSinceLoad
|
||||
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRec, True$, False$, False$)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end else
|
||||
ScanMsg = 'The POST stage engineering instructions must be acknowledged before the load operation can be signed.'
|
||||
@ -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<SCANS.TOOL_ID$>
|
||||
Reactor = ToolID[-1, 'BR']
|
||||
Username = ScansRow<SCANS.EMPLOYEE_ID$>
|
||||
TestWaferLotQtys = ScansRow<SCANS.TW_LOT_QTY$>
|
||||
TestRunType = ScansRow<SCANS.TEST_RUN_TYPE_ID$>
|
||||
PSNo = Xlate('RDS', RDSNo, RDS_PROD_SPEC_ID$, True$, 'X')
|
||||
NewTestRunId = Test_Run_Services('CreateTestRunRecord', TestRunType, 'R', Reactor, PSNo, RDSNo,Username , TestWaferLots, TestWaferLotQtys)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
Error_Services('Set', ErrorMessage)
|
||||
Continue = False$
|
||||
end
|
||||
end
|
||||
|
||||
If Continue EQ True$ then
|
||||
// Check if UNLOAD stage is ready to sign
|
||||
UnloadStageSigned = QA_Services('SignUnloadStage', RDSNo, Username, 1)
|
||||
If UnloadStageSigned EQ True$ then
|
||||
Result = '(':CassetteID:') Unload stage signed.'
|
||||
end
|
||||
LogData<6> = Action
|
||||
LogData<7> = Result
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
end
|
||||
LogData<6> = Action
|
||||
LogData<7> = Result
|
||||
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
|
||||
Case CurrStage _EQC 'COMP'
|
||||
Action = 'COMP'
|
||||
Error_Services('Set', '(':CassetteID:") Cassette has already been FQA'd.")
|
||||
@ -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<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$>
|
||||
LastCassInWoTestWaferAcked = WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$>
|
||||
LastCassInWoTestWaferReqMsg = ''
|
||||
If LastCassInWoTestWaferAcked EQ False$ or LastCassInWoTestWaferAcked EQ '' then
|
||||
LastCassInWo = WO_MAT_Services('CassetteIsLastInWo', WoMatKey)
|
||||
|
||||
If LastCassInWo then
|
||||
NextEventScheduled = False$
|
||||
NextEventHasSamePsn = True$
|
||||
NextEventIsBlock = False$
|
||||
|
||||
NextScheduledEvent = Schedule_Services('GetNextEvent', ReactorNo)
|
||||
If Error_Services('NoError') then
|
||||
NextEventScheduled = True$
|
||||
|
||||
NextEventHasSamePsn = Schedule_Services('NextEventIsSamePsn', ReactorNo)
|
||||
NextEventIsBlock = Schedule_Services('NextEventIsBlock', ReactorNo)
|
||||
end
|
||||
|
||||
If NextEventScheduled EQ False$ or NextEventHasSamePsn EQ False$ or NextEventIsBlock EQ True$ then
|
||||
LastCassInWoTestWaferAckReq = True$
|
||||
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = LastCassInWoTestWaferAckReq
|
||||
WoMatRec<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$> = LastCassInWoTestWaferAcked
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WoMatKey, WoMatRec, True$, False$, False$)
|
||||
|
||||
LastCassInWoTestWaferReqMsg = ''
|
||||
If NextEventScheduled EQ False$ or NextEventIsBlock EQ True$ then
|
||||
LastCassInWoTestWaferReqMsg = 'No material scheduled. Test wafer required.'
|
||||
end else If NextEventHasSamePsn EQ False$ then
|
||||
LastCassInWoTestWaferReqMsg = 'Next work order is a NEW PSN number. Test wafer required.'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
SRP_JSON(objRDS, 'SetValue', 'lastCassInWoTestWaferAckReq', LastCassInWoTestWaferAckReq, 'Boolean')
|
||||
SRP_JSON(objRDS, 'SetValue', 'lastCassInWoTestWaferAcked', LastCassInWoTestWaferAcked, 'Boolean')
|
||||
SRP_JSON(objRDS, 'SetValue', 'lastCassInWoTestWaferAckReqMsg', LastCassInWoTestWaferReqMsg, 'String')
|
||||
end
|
||||
end else
|
||||
SupplUnloadInstAckReq = False$
|
||||
end
|
||||
@ -2372,5 +2402,3 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user