remind operator to run test wafer on last cassete in WO

This commit is contained in:
Chase Tucker 2024-12-12 08:38:41 -07:00 committed by Tucker Chase (CSC FI SPS MESLEO)
parent a41136e30e
commit f8c83dd7f4
6 changed files with 341 additions and 8 deletions

View File

@ -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<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.'
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
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<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACK_REQ$> = False$
WoMatRecord<WO_MAT_LAST_CASSETTE_TEST_WAFER_ACKED$> = 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

View File

@ -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<SCANS.TEST_RUN_TYPE_ID$> = TestRunTypeId
//ScansRow<SCANS.TEST_RUN_TYPE_NAME$> = 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<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:' : 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<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

View File

@ -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<SCHED_DET_NG.BLOCK_OUT$>
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<SCHED_DET_NG.WO_NO$>
CurrentEventWoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', CurrentEventWoNo:'*1')
CurrentEventRdsNo = CurrentEventWoMatRecord<WO_MAT_RDS_NO$>
CurrentEventRdsRecord = Database_Services('ReadDataRow', 'RDS', CurrentEventRdsNo)
CurrentEventPsn = CurrentEventRdsRecord<RDS_PROD_SPEC_ID$>
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<SCHED_DET_NG.WO_NO$>
NextEventWoMatRecord = Database_Services('ReadDataRow', 'WO_MAT', NextEventWoNo:'*1')
NextEventRdsNo = NextEventWoMatRecord<WO_MAT_RDS_NO$>
NextEventRdsRecord = Database_Services('ReadDataRow', 'RDS', NextEventRdsNo)
NextEventPsn = NextEventRdsRecord<RDS_PROD_SPEC_ID$>
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<SCHED_DET_NG.BLOCK_OUT$>
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

View File

@ -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

View File

@ -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

View File

@ -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