From 273b7f67a6eff905e0a5549ce234ff46bc8dd238 Mon Sep 17 00:00:00 2001 From: "Mitchem Dakota (CSC FI SPS MESLEO External)" Date: Wed, 18 Jun 2025 22:23:57 +0200 Subject: [PATCH] Merged PR 19143: Require 100 percent centerpoint on MU conversion. Initial commit. Create FQASignatureReady service in QA_SERVICES. Create SignFQA service in SIGNATURE_SERVICES. Commit remaining portion of project. Implement changes requested in review meeting. Fix typo. Add new MU logic to final entry point. Restrict logic to only apply to 'THICK' inspections. Bypass new logic if Biorad 4 and 5 are down. --- LSL2/STPROC/COMM_WO_MAT.txt | 25 +++-- LSL2/STPROC/COMM_WO_MAT_WFR.txt | 35 +++++-- LSL2/STPROC/LOT_EVENT_SERVICES.txt | 2 +- LSL2/STPROC/LOT_SERVICES.txt | 2 +- LSL2/STPROC/OBJ_WO_MAT.txt | 8 +- LSL2/STPROC/QA_SERVICES.txt | 5 +- LSL2/STPROC/RDS_POST_EPI_EVENTS.txt | 5 +- LSL2/STPROC/RDS_SERVICES.txt | 136 ++++++++++++++++------------ LSL2/STPROC/SIGNATURE_SERVICES.txt | 65 ++++++++++++- LSL2/STPROC/WO_MAT_ACTIONS.txt | 17 +++- LSL2/STPROC/WO_MAT_SERVICES.txt | 37 +++++++- 11 files changed, 254 insertions(+), 83 deletions(-) diff --git a/LSL2/STPROC/COMM_WO_MAT.txt b/LSL2/STPROC/COMM_WO_MAT.txt index 3db538d..a869d8d 100644 --- a/LSL2/STPROC/COMM_WO_MAT.txt +++ b/LSL2/STPROC/COMM_WO_MAT.txt @@ -7,7 +7,7 @@ COMPILE FUNCTION Comm_WO_Mat(Instruction, Parm1,Parm2) 10/18/2006 - John C. Henry, J.C. Henry & Co., Inc. */ -DECLARE SUBROUTINE Set_Property, Set_Status, ErrMsg, Set_Property, obj_AppWindow, Send_Message +DECLARE SUBROUTINE Set_Property, Set_Status, ErrMsg, Set_Property, obj_AppWindow, Send_Message, Wo_Mat_Services DECLARE SUBROUTINE Btree.Extract, Send_Event, Security_Err_Msg, Forward_Event, End_Window, Start_Window DECLARE SUBROUTINE EditCell, obj_NCR, obj_Notes, obj_WO_Mat, obj_Tables, SAP_Services, Hold_Services @@ -627,6 +627,7 @@ MakeUpClick: LotId = Xlate('WO_MAT', WOMatKey, 'WMO_KEY', 'X') end else LotId = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X') + RDSNo = LotID end If LotId NE '' then @@ -636,12 +637,22 @@ MakeUpClick: Parms<3> = 'MU' ; // Wafer counter tool location Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms) If Proceed EQ True$ then - Set_Property(@WINDOW,'SAVEWARN', False$) - Send_Event(@WINDOW,'CLEAR') - obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) - IF Get_Status(errCode) THEN - ErrMsg(errCode) - END + obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) + If EpiPro EQ False$ then + IF Get_Status(errCode) THEN + ErrMsg('Unable to set makeup flag until Unload stage is signed.') + InvalidRequest = True$ + END else + Set_Property(@WINDOW,'SAVEWARN', False$) + Send_Event(@WINDOW,'CLEAR') + If (CheckValue EQ True$) then + Wo_Mat_Services('MakeupFlagOn', RDSNo) + end + end + end else + Set_Property(@WINDOW,'SAVEWARN', False$) + Send_Event(@WINDOW,'CLEAR') + end end else InvalidRequest = True$ end diff --git a/LSL2/STPROC/COMM_WO_MAT_WFR.txt b/LSL2/STPROC/COMM_WO_MAT_WFR.txt index 074e668..f6915b4 100644 --- a/LSL2/STPROC/COMM_WO_MAT_WFR.txt +++ b/LSL2/STPROC/COMM_WO_MAT_WFR.txt @@ -17,11 +17,11 @@ DECLARE SUBROUTINE Set_Property, Set_Status, ErrMsg, Set_Property, obj_AppWindo DECLARE SUBROUTINE Btree.Extract, Send_Event, Security_Err_Msg, Forward_Event, End_Window, Start_Window DECLARE SUBROUTINE EditCell, obj_NCR, obj_Notes, Post_Event, obj_WO_Mat, obj_WO_Mat_Log, obj_WO_Wfr, obj_Tables DECLARE SUBROUTINE SRP_Stopwatch, Update_Index, Database_Services, obj_RDS, Create_Dialog, Dialog_Box -DECLARE SUBROUTINE Sleepery +DECLARE SUBROUTINE Sleepery, Wo_Mat_Services DECLARE FUNCTION Get_Property, Get_Status, Popup, Send_Message, Msg, Security_Check, Dialog_Box, RowExists DECLARE FUNCTION Dialog_Box, obj_WO_Log, obj_NCR, Check_Notes, obj_MUWafers, obj_WO_Mat, Signature_Services DECLARE FUNCTION MemberOf, obj_Tables, obj_RDS, Environment_Services, Logging_Services, Material_Services -DECLARE FUNCTION Database_Services, RetStack, Datetime, Error_Services +DECLARE FUNCTION Database_Services, RetStack, Datetime, Error_Services, Rds_Services $INSERT POPUP_EQUATES $INSERT LOGICAL @@ -830,8 +830,18 @@ AddMakeup: FieldNo = WO_MAT_MAKEUP_BOX$ CheckValue = 1 + EpiCheck = Rds_Services('IsEpiPro', RDSNo) obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) + + If EpiCheck EQ False$ then + IF Get_Status(errCode) THEN + ErrMsg('Unable to set makeup flag until Unload stage is signed.') + Return + END else + Wo_Mat_Services('MakeupFlagOn', RDSNo) + end + end SlotWaferIDs = Xlate('WO_MAT', WOMatKey, 'SLOT_WAFER_ID', 'X') Convert @VM to '' in SlotWaferIDs @@ -1057,6 +1067,7 @@ MakeUpLot: If Not(InvalidRequest) then RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT') + EpiCheck = Rds_Services('IsEpiPro', RDSNo) If RDSNo NE '' then Parms = '' Parms<1> = RDSNo ; // Cassette to verify wafer count of. @@ -1064,12 +1075,22 @@ MakeUpLot: Parms<3> = 'MU' ; // Wafer counter tool location Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms) If Proceed EQ True$ then - Set_Property(@WINDOW,'SAVEWARN', False$) - Send_Event(@WINDOW,'CLEAR') obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) - IF Get_Status(errCode) THEN - ErrMsg(errCode) - END + If EpiCheck EQ False$ then + IF Get_Status(errCode) THEN + ErrMsg('Unable to set makeup flag until Unload stage is signed.') + InvalidRequest = True$ + END else + Set_Property(@WINDOW,'SAVEWARN', False$) + Send_Event(@WINDOW,'CLEAR') + If (CheckValue EQ True$) then + Wo_Mat_Services('MakeupFlagOn', RDSNo) + end + end + end else + Set_Property(@WINDOW,'SAVEWARN', False$) + Send_Event(@WINDOW,'CLEAR') + end end else InvalidRequest = True$ end diff --git a/LSL2/STPROC/LOT_EVENT_SERVICES.txt b/LSL2/STPROC/LOT_EVENT_SERVICES.txt index 986406d..a6a9b72 100644 --- a/LSL2/STPROC/LOT_EVENT_SERVICES.txt +++ b/LSL2/STPROC/LOT_EVENT_SERVICES.txt @@ -11,7 +11,7 @@ $Insert LOT_EVENT_EQUATES $Insert LOT_EQUATES $Insert LOT_OPERATION_EQUATES -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', 'SIGN_FQA', 'UNSIGN_FQA' Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN', 'WO_MAT', 'LOT' Options LEGACY_LOT_TYPES = 'RDS', 'WM_OUT', 'WM_IN' Options BOOLEAN = 'True', 'False' diff --git a/LSL2/STPROC/LOT_SERVICES.txt b/LSL2/STPROC/LOT_SERVICES.txt index 1925035..ae2cfcf 100644 --- a/LSL2/STPROC/LOT_SERVICES.txt +++ b/LSL2/STPROC/LOT_SERVICES.txt @@ -35,7 +35,7 @@ LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' T Headers = 'Logging DTM' : @FM : 'Lot Id' : @FM : 'Operator' : @FM : 'Message' objLotClosureLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$) -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', 'SIGN_FQA', 'UNSIGN_FQA' Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN', 'WO_MAT', 'LOT' IsProd = Environment_Services('IsProd') diff --git a/LSL2/STPROC/OBJ_WO_MAT.txt b/LSL2/STPROC/OBJ_WO_MAT.txt index 96e238f..f4eac09 100644 --- a/LSL2/STPROC/OBJ_WO_MAT.txt +++ b/LSL2/STPROC/OBJ_WO_MAT.txt @@ -1834,11 +1834,13 @@ ChangeFlag: WMTableParms = FieldStore(WMTableParms,@RM,4,0,WOMatRec) ;* Put record in 4th field of OtParms obj_Tables('WriteRec',WMTableParms) - IF Get_Status(errCode) THEN - * Logging - + If FieldNo EQ WO_MAT_MAKEUP_BOX$ then + IF Get_Status(errCode) THEN + ErrorMsg = 'Makeup flag cannot be set until Unload is signed.' + END + end LogRec = 'obj_WO_Mat':TAB$:'Change Flag: Error':TAB$:WOMatKey:TAB$:FieldName:TAB$:Value:TAB$:'Unable to WRITE WO_MAT record. ':errCode LogRec := TAB$:@STATION:TAB$:@USER4:TAB$:OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') diff --git a/LSL2/STPROC/QA_SERVICES.txt b/LSL2/STPROC/QA_SERVICES.txt index eae6a25..6f68e0b 100644 --- a/LSL2/STPROC/QA_SERVICES.txt +++ b/LSL2/STPROC/QA_SERVICES.txt @@ -118,6 +118,7 @@ $insert EXCEL_EQU $insert ROTR_REQUESTS_EQUATES $insert ROTR_EQUATES $insert REACT_LL_EQUATES +$Insert WAFER_COUNTER_EQUATES * Clean Insp Actions EQU ACTION$ACTIONS TO 1 @@ -143,8 +144,8 @@ 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 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 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 subroutine Override_Services, Reactor_Services, Lot_Services, Obj_Notes, Mona_Services +Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services, Wafer_Counter_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 SRP_Encode, SRP_Decode, SRP_COM, QA_Services, RDS_Services, Obj_NCR, Logging_Services, Obj_Reactor diff --git a/LSL2/STPROC/RDS_POST_EPI_EVENTS.txt b/LSL2/STPROC/RDS_POST_EPI_EVENTS.txt index b9f5cf8..0d200ed 100644 --- a/LSL2/STPROC/RDS_POST_EPI_EVENTS.txt +++ b/LSL2/STPROC/RDS_POST_EPI_EVENTS.txt @@ -89,7 +89,7 @@ EQU APPRED$ TO 255 + (128*256) + (128*65536) EQU APPORANGE$ TO 255 + (176*256) + (0*65536) Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, RDS_Services, Signature_Services, obj_Notes -Declare subroutine Comm_RDS, WO_Mat_QA_Services, Wafer_Counter_Services, Dialog_Box +Declare subroutine Comm_RDS, WO_Mat_QA_Services, Wafer_Counter_Services, Dialog_Box, Lot_Event_Services Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, QA_Services, Signature_Services Declare function RDS_Services, Wafer_Counter_Services, Datetime, Supplement_Services @@ -603,6 +603,9 @@ Event SIGN_BUTTON.CLICK() Set_Property(@Window : '.POST_EPI_SUP_SIG_DATE', 'TEXT', SigDt) Set_Property(@Window : '.POST_EPI_SUP_SIG_TIME', 'TEXT', SigTmPlusOne) + ** Create LOT_EVENT ** + Lot_Event_Services('CreateLotEvent', RDSNo, Datetime(), 'SIGN_FQA', '', '', @USER4, True$, 'RDS') + /* Sync up the RDS record with WO_MAT */ IOOptions = Get_Property(@Window, 'IOOPTIONS') IOOptions<6> = True$ diff --git a/LSL2/STPROC/RDS_SERVICES.txt b/LSL2/STPROC/RDS_SERVICES.txt index 144c9e3..9c9a925 100644 --- a/LSL2/STPROC/RDS_SERVICES.txt +++ b/LSL2/STPROC/RDS_SERVICES.txt @@ -1722,6 +1722,84 @@ Service UnsignLoadExtra2(RDSNo, LSLUserName) end service +Service ApplyQA100PercentADE(RDSNo) + + Result = False$ + ErrorMsg = '' + If RDSNo NE '' then + // Change the QA metrology requirements to all wafers + WoNo = Xlate('RDS', RDSNo, RDS_WO$, 'X') + CassNo = Xlate('RDS', RDSNo, 'CASS_NO', 'X') + WoMatQaKey = WoNo : '*' : CassNo + WoMatQaRec = Xlate('WO_MAT_QA', WoMatQaKey, '', 'X') + EpiCheck = Rds_Services('IsEpiPro', RDSNo) + If EpiCheck EQ True$ then + WoWaferQty = Xlate('WO_MAT', WoMatQaKey, WO_MAT_WAFER_QTY$, 'X') + end else + WoWaferQty = Xlate('RDS', RDSNo, 'WFRS_OUT', 'X') + end + + WoMatQaStages = WoMatQaRec + WoMatQaProfiles = WoMatQaRec + WoMatQaSlots = WoMatQaRec + WoMatQaWfrQtys = WoMatQaRec + WoMatQaProps = WoMatQaRec + WoMatQaToolClasses = WoMatQaRec + WoMatQaRecipes = WoMatQaRec + WoMatQaRecipePatterns = WoMatQaRec + WoMatQaMin = WoMatQaRec + WoMatQaMax = WoMatQaRec + WoMatQaOOS = WoMatQaRec + StageCount = DCount(WoMatQaStages, @VM) + For stageIdx = 1 to StageCount + If (WoMatQaStages<0, stageIdx> _EQC 'QA') and (WoMatQaProfiles<0, stageIdx> _EQC '1ADE') then + Slot = WoMatQaSlots<0, stageIdx> + If (Slot _NEC 'L') then + WoMatQaSlots<0, stageIdx> = 'A' + WoMatQaWfrQtys<0, stageIdx> = WoWaferQty + end + If (Slot _EQC 'L') then + WoMatQaStages<0, stageIdx> = '' + WoMatQaProfiles<0, stageIdx> = '' + WoMatQaSlots<0, stageIdx> = '' + WoMatQaWfrQtys<0, stageIdx> = '' + WoMatQaProps<0, stageIdx> = '' + WoMatQaToolClasses<0, stageIdx> = '' + WoMatQaRecipes<0, stageIdx> = '' + WoMatQaRecipePatterns<0, stageIdx> = '' + WoMatQaMin<0, stageIdx> = '' + WoMatQaMax<0, stageIdx> = '' + WoMatQaOOS<0, stageIdx> = '' + end + end + Next stageIdx + WoMatQaRec = WoMatQaStages + WoMatQaRec = WoMatQaProfiles + WoMatQaRec = WoMatQaSlots + WoMatQaRec = WoMatQaWfrQtys + WoMatQaRec = WoMatQaProps + WoMatQaRec = WoMatQaToolClasses + WoMatQaRec = WoMatQaRecipes + WoMatQaRec = WoMatQaRecipePatterns + WoMatQaRec = WoMatQaMin + WoMatQaRec = WoMatQaMax + WoMatQaRec = WoMatQaOOS + WoMatQaRec = '' + WoMatQaRec = '' + WoMatQaRec = '' + Database_Services('WriteDataRow', 'WO_MAT_QA', WoMatQaKey, WoMatQaRec, True$, False$, False$) + If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage') + end else + ErrorMsg = 'Error in ':Service:' service. Null RdsKey passed into service!' + end + + If ErrorMsg NE '' then + Error_Services('Add', ErrorMsg) + end else + Result = True$ + end + +end service Service ApplyAbortMetrology(RdsKeys) @@ -1740,58 +1818,8 @@ Service ApplyAbortMetrology(RdsKeys) Database_Services('WriteDataRow', 'CLEAN_INSP', CleanInspKey, CIRec, True$, False$, False$) If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage') - If ErrorMsg EQ '' then - // Change the QA metrology requirements to all wafers - CassNo = Xlate('RDS', RdsKey, 'CASS_NO', 'X') - WoMatQaKey = WoNo : '*' : CassNo - WoMatQaRec = Xlate('WO_MAT_QA', WoMatQaKey, '', 'X') - WoWaferQty = Xlate('WO_MAT', WoMatQaKey, WO_MAT_WAFER_QTY$, 'X') - WoMatQaStages = WoMatQaRec - WoMatQaProfiles = WoMatQaRec - WoMatQaSlots = WoMatQaRec - WoMatQaWfrQtys = WoMatQaRec - WoMatQaProps = WoMatQaRec - WoMatQaToolClasses = WoMatQaRec - WoMatQaRecipes = WoMatQaRec - WoMatQaRecipePatterns = WoMatQaRec - WoMatQaMin = WoMatQaRec - WoMatQaMax = WoMatQaRec - WoMatQaOOS = WoMatQaRec - StageCount = DCount(WoMatQaStages, @VM) - For stageIdx = 1 to StageCount - If (WoMatQaStages<0, stageIdx> _EQC 'QA') and (WoMatQaProfiles<0, stageIdx> _EQC '1ADE') then - Slot = WoMatQaSlots<0, stageIdx> - If (Slot _NEC 'L') then - WoMatQaSlots<0, stageIdx> = 'A' - WoMatQaWfrQtys<0, stageIdx> = WoWaferQty - end - If (Slot _EQC 'L') then - WoMatQaStages<0, stageIdx> = '' - WoMatQaProfiles<0, stageIdx> = '' - WoMatQaSlots<0, stageIdx> = '' - WoMatQaWfrQtys<0, stageIdx> = '' - WoMatQaProps<0, stageIdx> = '' - WoMatQaToolClasses<0, stageIdx> = '' - WoMatQaRecipes<0, stageIdx> = '' - WoMatQaRecipePatterns<0, stageIdx> = '' - WoMatQaMin<0, stageIdx> = '' - WoMatQaMax<0, stageIdx> = '' - WoMatQaOOS<0, stageIdx> = '' - end - end - Next stageIdx - WoMatQaRec = WoMatQaStages - WoMatQaRec = WoMatQaProfiles - WoMatQaRec = WoMatQaSlots - WoMatQaRec = WoMatQaWfrQtys - WoMatQaRec = WoMatQaProps - WoMatQaRec = WoMatQaToolClasses - WoMatQaRec = WoMatQaRecipes - WoMatQaRec = WoMatQaRecipePatterns - WoMatQaRec = WoMatQaMin - WoMatQaRec = WoMatQaMax - WoMatQaRec = WoMatQaOOS - Database_Services('WriteDataRow', 'WO_MAT_QA', WoMatQaKey, WoMatQaRec, True$, False$, False$) + If ErrorMsg EQ '' then + Result = Rds_Services('ApplyQA100PercentADE', RDSKey) If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage') end @@ -1855,7 +1883,3 @@ return - - - - diff --git a/LSL2/STPROC/SIGNATURE_SERVICES.txt b/LSL2/STPROC/SIGNATURE_SERVICES.txt index 790fe7c..43d601a 100644 --- a/LSL2/STPROC/SIGNATURE_SERVICES.txt +++ b/LSL2/STPROC/SIGNATURE_SERVICES.txt @@ -62,10 +62,11 @@ Equ COL$TAGS to 9 Equ COL$TOOL_ID to 10 Declare function obj_Prod_Spec, RDS_Services, Error_Services, Signature_Services, Memory_Services, obj_RDS_Test +Declare function SRP_Array 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 Obj_Notes, Signature_Services, Obj_WO_Mat_Log, ErrMsg, Mona_Services +Declare subroutine Obj_Notes, Signature_Services, Obj_WO_Mat_Log, ErrMsg, Obj_Rds, Lot_Event_Services, Mona_Services PSNKey = ServiceKeyID ReactorKey = ServiceKeyID @@ -2841,6 +2842,64 @@ Service SignSupplement(RDSNo, User) end service +Service UnsignFQAStage(RDSNo) + + IsEPP = Rds_Services('IsEpiPro', RDSNo) + If IsEpp EQ False$ then + Database_Services('ActivateRecord', 'RDS', RDSNo) + If Error_Services('NoError') then + Valid = '' + CurRdsNo = RDSNo + WONo = {WO} + CassNo = {CASS_NO} + WOStep = {WO_STEP} + WOMatKey = WONo:'*':CassNo + WOMatRec = XLATE('WO_MAT',WOMatKey,'','X') + // Unsign WO_MAT + InvWH = WOMatRec + InvLoc = WOMatRec + InvAction = WOMatRec + InvDTM = WOMatRec + InvUser = WOMatRec + // Get List of keys to delete + InvCount = Dcount(InvWH, @VM) + DeleteList = '' + For I = 1 to InvCount + ThisLoc = InvAction<1,I> + If ThisLoc EQ '1QA' or ThisLoc EQ 'POST' then + DeleteList<-1> = I + end + Next I + // Reverse array to work backwards through deletions + DeleteList = SRP_Array('Reverse', DeleteList, @FM) + If DeleteList NE '' then + For Each Item in DeleteList Using @FM + WOMatRec = Delete(WOMatRec, WO_MAT_INV_WH$, Item, 0) + WOMatRec = Delete(WOMatRec, WO_MAT_INV_LOCATION$, Item, 0) + WOMatRec = Delete(WOMatRec, WO_MAT_INV_ACTION$, Item, 0) + WOMatRec = Delete(WOMatRec, WO_MAT_INV_DTM$, Item, 0) + WOMatRec = Delete(WOMatRec, WO_MAT_INV_USER$, Item, 0) + Next Item + Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, False$) + end + + // Unsign RDS + {SUP_VER_SIG} = '' + {SUP_VER_SIG_DATE} = '' + {SUP_VER_SIG_TIME} = '' + Database_Services('WriteDataRow', 'RDS', RDSNo, @Record, True$, False$, False$) + ** Create LOT_EVENT ** + Lot_Event_Services('CreateLotEvent', RDSNo, Datetime(), 'UNSIGN_FQA', '', '', @USER4, True$, 'RDS') + end else + Error_Services('Add', 'Error accessing RDS.') + end + end else + Error_Services('Add', 'This service is currently only available for non-EpiPro lots.') + end + +end service + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Internal GoSubs //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -2858,3 +2917,7 @@ GetMostRecentSig: return + + + + diff --git a/LSL2/STPROC/WO_MAT_ACTIONS.txt b/LSL2/STPROC/WO_MAT_ACTIONS.txt index 3a18e98..5a164dc 100644 --- a/LSL2/STPROC/WO_MAT_ACTIONS.txt +++ b/LSL2/STPROC/WO_MAT_ACTIONS.txt @@ -58,7 +58,7 @@ Equ Comma$ to ',' Declare function Error_Services, Database_Services, Environment_Services, Logging_Services, obj_WO_Mat, Max Declare function GaN_Services, Signature_Services, obj_WO_LOG, SRP_Array, MemberOf, Datetime Declare subroutine Error_Services, Database_Services, Environment_Services, Logging_Services, Obj_SAP, obj_Notes -Declare subroutine SAP_Services, Material_Services, RList, Work_Order_Services, Service_Services +Declare subroutine SAP_Services, Material_Services, RList, Work_Order_Services, Service_Services, Set_Status LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_Mat' LogDate = Oconv(Date(), 'D4/') @@ -406,6 +406,18 @@ WRITE_RECORD_PRE: Record = SlotNCRs SaveRecord = Record end + NewMUFlag = Record + OrigMUFlag = OrigRecord + UnloadCheck = Signature_Services('GetStageSummary', WOMatKeyID, 'UNLOAD')<2> + If (NewMUFlag EQ True$) AND (OrigMUFlag NE True$) then + If UnloadCheck NE True$ then + OrigFileError = 104:': Cassette ineligible to be converted to makeup wafer until unload is signed.' + Status = 0 + Record = '' + ActionFlow = ACTION_STOP$ + end + end + End Case TWChangeDetected = (OrigRecord NE Record) @@ -486,7 +498,8 @@ WRITE_RECORD_PRE: Record = RecordCopy Record = SlotMetNos SaveRecord = Record - end + end + End Case end diff --git a/LSL2/STPROC/WO_MAT_SERVICES.txt b/LSL2/STPROC/WO_MAT_SERVICES.txt index 6617f08..35fd64f 100644 --- a/LSL2/STPROC/WO_MAT_SERVICES.txt +++ b/LSL2/STPROC/WO_MAT_SERVICES.txt @@ -2,9 +2,9 @@ Compile function WO_MAT_Services(@Service, @Params) #pragma precomp SRP_PreCompiler Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services -Declare function Datetime, GetTickCount +Declare function Datetime, Rds_Services, GetTickCount Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_Services, Logging_Services -Declare subroutine obj_wo_mat_log, Set_Status, Mona_Services +Declare subroutine obj_wo_mat_log, Set_Status, Rds_Services, Signature_Services, Mona_Services $insert LOGICAL $Insert APP_INSERTS @@ -487,3 +487,36 @@ end service +Service MakeupFlagOn(RDSNo) + + EpiCheck = Rds_Services('IsEpiPro', RDSNo) + BioRadDown = False$ + Bio4Down = False$ + Bio5Down = False$ + Bio4LogKey = Xlate('TOOL', 'BIORAD4', 'CURR_MODE_KEY', 'X') + Bio5LogKey = Xlate('TOOL', 'BIORAD5', 'CURR_MODE_KEY', 'X') + Bio4Mode = Xlate('TOOL_LOG', Bio4LogKey, 'TOOL_MODE', 'X') + Bio5Mode = Xlate('TOOL_LOG', Bio5LogKey, 'TOOL_MODE', 'X') + + If (Bio4Mode NE 'PROD') AND (Bio4Mode NE 'LIM') then Bio4Down = True$ + If (Bio5Mode NE 'PROD') AND (Bio5Mode NE 'LIM') then Bio5Down = True$ + + If (Bio4Down) AND (Bio5Down) then BioRadDown = True$ + + If EpiCheck EQ False$ then + WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X') + WOMatQARec = XLATE('WO_MAT_QA',WOMatKey,'','X') + PropRow = WOMatQARec<3> + If (Count(PropRow, 'THICK') NE 0) AND (BioRadDown EQ False$) then + CurrentStage = Rds_Services('GetCurrentStage', RDSNo) + If CurrentStage EQ 'COMP' then + Signature_Services('UnsignFQAStage', RDSNo) + end + Rds_Services('ApplyQA100PercentADE', RDSNo) + end + end + +end service + + +