diff --git a/LSL2/STPROC/LOT_SERVICES.txt b/LSL2/STPROC/LOT_SERVICES.txt index de62b82..944d172 100644 --- a/LSL2/STPROC/LOT_SERVICES.txt +++ b/LSL2/STPROC/LOT_SERVICES.txt @@ -2,15 +2,32 @@ Compile function Lot_Services(@Service, @Params) #pragma precomp SRP_PreCompiler Declare function TEST_WAFER_PROD_SERVICES, SRP_Datetime, Datetime, Database_Services, Lot_Services, Error_Services, RTI_CREATEGUID -Declare function SRP_Array, SRP_Json -Declare subroutine Database_Services, Btree.Extract, Lot_Services, Error_Services, Labeling_Services, SRP_Json -$insert LOGICAL +Declare function SRP_Array, SRP_Json, Environment_Services, Logging_Services +Declare subroutine Database_Services, Btree.Extract, Lot_Services, Error_Services, Labeling_Services, SRP_Json, Logging_Services +$insert APP_INSERTS $Insert LOT_EQUATES $Insert TEST_WAFER_PROD_EQUATES $Insert Lot_Operation_Equates $Insert PRODUCT_OPERATION_EQUATES $Insert LOT_EVENT_EQUATES +LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot' +LogDate = Oconv(Date(), 'D4/') +LogTime = Oconv(Time(), 'MTS') +LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM + +LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' TestWaferLotCreation.csv' +Headers = 'Logging DTM' : @FM : 'Product Name' : @FM : 'Username' : @FM : 'Message' +objTWCreationLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$) + +LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' LotMove.csv' +Headers = 'Logging DTM' : @FM : 'Lot Id' : @FM : 'Username' : @FM : 'Message' +objLotMoveLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$) + +LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' LotEvent.csv' +Headers = 'Logging DTM' : @FM : 'Lot Id' : @FM : 'Event Type' : @FM : 'Operator' : @FM : 'Begin Wafer Qty' : @FM : 'End Wafer Qty' : @FM : 'Bonus Wafer Qty' : @FM : 'Reduce Wafer Qty' : @FM : 'Message' +objLotEventLog = 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' Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN' @@ -96,35 +113,56 @@ Service CreateNewTestWaferLot(LotType, ProdName, LotQty, VendorPartNo, VendorLot ThisLotCurrOpId = Lot_Services('GetLotCurrOperation', CreatedLotNumber) If ThisLotCurrOpId NE '' then Lot_Services('MoveInLot', NewLotId, LotQty, Username) - If PrinterID NE 'WEB' then - Labeling_Services('PrintTestWaferLotLabel', CreatedLotNumber, Username, PrinterID) + if Error_Services('NoError') then + //Set lot to open + Lot_Services('OpenLot', CreatedLotNumber) + if Error_Services('NoError') then + If PrinterID NE 'WEB' then + //If PrinterID is set to WEB this means the request comes from OI_Wizard and the client is going to handle printing. + Labeling_Services('PrintTestWaferLotLabel', CreatedLotNumber, Username, PrinterID) + If Error_Services('HasError') then + ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : CreatedLotNumber : ' , ' : Error_Services('GetMessage') + end + end + Lot_Services('MoveOutLot', NewLotId, LotQty, Username) + If Error_Services('NoError') then + Lot_Services('MoveInLot', NewLotId, LotQty, Username) + If Error_Services('HasError') then + ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') end - Lot_Services('MoveOutLot', NewLotId, LotQty, Username) - Lot_Services('MoveInLot', NewLotId, LotQty, Username) end else - //Error: Error getting current operation + ErrorMessage = 'Error in Create New Test Wafer Lot Process, error getting current operation for lot: ' : NewLotId end end else - //Error: Failed to initialize lot operations + ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage') end end end else - //Lot attributes didn't write correctly. + ErrorMessage = 'Error in Create New Test Wafer Lot Process, Lot attributes did not write correctly for lot: ' : NewLotId end end else - //Error: Lot already had data + ErrorMessage = 'Error in Create New Test Wafer Lot Process, Lot already had data, lot: ' : NewLotId end end else - //Error creating new lot ID + ErrorMessage = 'Error in Create New Test Wafer Lot Process, Created lot: ' : NewLotId : ' not found in LOT table.' end end else - //Error getting new Lot ID + ErrorMessage = 'Error in Create New Test Wafer Lot Process, no lot id returned.' end end else - //Ambiguous Product name, multiple results. + ErrorMessage = 'Error in Create New Test Wafer Lot Process, ambiguous product passed to routine OR no matching products found.' end end else - //No Matching part no found + ErrorMessage = 'Error in Create New Test Wafer Lot Process, product(':ProdName:') passed to routine not found.' end end else ErrorMessage = 'Null value passed in for ProdID' @@ -132,11 +170,27 @@ Service CreateNewTestWaferLot(LotType, ProdName, LotQty, VendorPartNo, VendorLot end else ErrorMessage = 'Lot type was not test wafer' end + If ErrorMessage EQ '' then + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = ProdName + LogData<3> = Username + LogData<4> = 'Successfully created lot id ' : CreatedLotNumber : ' of product type ' : ProdName '.' + Logging_Services('AppendLog', objTWCreationLog, LogData, @RM, @FM, False$) + end else + Error_Services('Add', ErrorMessage) + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = ProdName + LogData<3> = Username + LogData<4> = ErrorMessage + Logging_Services('AppendLog', objTWCreationLog, LogData, @RM, @FM, False$) + end Response = CreatedLotNumber - End Service Service GenerateInitialLotOperationRecords(LotId) + ErrorMessage = '' If LotID NE '' then if RowExists('LOT', LotId) then LotRec = Database_Services('ReadDataRow', 'LOT', LotId) @@ -151,19 +205,22 @@ Service GenerateInitialLotOperationRecords(LotId) //NewOperationRecID = Next operation end else - //Error: No Operations returned + ErrorMessage = 'No Operations found for ' : ProdId end end else - //Error: Prod ID for lot is null + ErrorMessage = 'Prod ID not specified' end //ID will be LotNum + OperationID //Get product operations end else - //error: lot does not exist + ErrorMessage = 'Lot ID does not exist.' end end else - //error: null lot id + ErrorMessage = 'Lot ID was null' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) end end service @@ -184,35 +241,43 @@ Service GetPrescribedOperationsByProdId(ProdId, ProdType) end service Service CreateInitialLotOperationRecords(LotId) + ErrorMessage = '' If LotId NE '' then LotRec = Database_Services('ReadDataRow', 'LOT', LotId) LotType = LotRec ProdId = LotRec ThisInitialProdOperations = Lot_Services('GetPrescribedOperationsByProdId', ProdId, LotType) - For each ProdOperation in ThisInitialProdOperations using @VM + If Error_Services('NoError') AND ThisInitialProdOperations NE '' then + For each ProdOperation in ThisInitialProdOperations using @VM - ProdOperationRec = Database_Services('ReadDataRow', 'PRODUCT_OPERATION', ProdOperation) - OperationID = ProdOperationRec - OperationSequence = ProdOperationRec - - LotOperationRecID = LotId : '*' : OperationID - If Not(RowExists('LOT_OPERATION', LotOperationRecID)) then - LotOperationRec = '' - LotOperationRec = LotId - LotOperationRec = OperationID - LotOperationRec = OperationSequence - LotOperationRec = False$ - Database_Services('WriteDataRow', 'LOT_OPERATION', LotOperationRecId, LotOperationRec) - TestRec = Database_Services('ReadDataRow', 'LOT', LotId) - end else - //Error: Lot Operation already existed, cannot overwrite - end - - Next Operation + ProdOperationRec = Database_Services('ReadDataRow', 'PRODUCT_OPERATION', ProdOperation) + OperationID = ProdOperationRec + OperationSequence = ProdOperationRec + + LotOperationRecID = LotId : '*' : OperationID + If Not(RowExists('LOT_OPERATION', LotOperationRecID)) then + LotOperationRec = '' + LotOperationRec = LotId + LotOperationRec = OperationID + LotOperationRec = OperationSequence + LotOperationRec = False$ + Database_Services('WriteDataRow', 'LOT_OPERATION', LotOperationRecId, LotOperationRec) + TestRec = Database_Services('ReadDataRow', 'LOT', LotId) + end else + ErrorMessage = 'Lot Operation already existed, cannot overwrite' + end + + Next Operation + end else + ErrorMessage = 'Error getting prescribed operations for lot# ' : LotId + end + end else - //Error: Lot ID was null + ErrorMessage = 'Lot ID was null' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) end - TestRec = Database_Services('ReadDataRow', 'LOT', LotId) end service //Returns a @FM delimited list of operations in sequence @@ -323,6 +388,8 @@ Service AddLotOperationIntoSequence(LotId, NewOperationId, NewSequence, Rework) end service Service MoveInLot(LotID, WaferQty, Operator) + ErrorMessage = '' + ThisLotCurrOperationID = '' If LotId NE '' then If WaferQty NE '' then If RowExists('LOT', LotId) then @@ -340,26 +407,41 @@ Service MoveInLot(LotID, WaferQty, Operator) LotType = XLATE('LOT', LotId, LOT_TYPE$, 'X') CurrOperation = XLATE('LOT_OPERATION', ThisLotCurrOperationID, LOT_OPERATION_OPERATION_ID$, 'X') Lot_Services('CreateLotEvent', LotId, LotType, Datetime(), 'MOVE_IN', '', '', 0, 0, CurrOperation, Operator) + If Error_Services('HasError') then + ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. ' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. Error writing to lot operation record. ' : Error_Services('GetMessage') end + end else + ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. Error getting lots current operation.' end - - //Log to Lot Event Table end else - //Error: Error reading record + ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. ' : Error_Services('GetMessage') end - end else - //Error Invalid Lot id entered + ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. Lot ID not found in LOT table.' end end else - //Error: Wafer Qty was null + ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. Lot Qty was not passed to routine.' end end else - //Error: Lot Id was null + ErrorMessage = 'Error in Move In process. Lot id was not passed to routine.' + end + If ErrorMessage NE '' then + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = LotID + LogData<3> = Operator + LogData<4> = 'Successfully Moved Lot into operation ' : ThisLotCurrOperationID : '.' + Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) end end service Service MoveOutLot(LotID, WaferQty, Operator) + ErrorMessage = '' + ThisLotCurrOperationID = '' If LotId NE '' then If WaferQty NE '' then If RowExists('LOT', LotId) then @@ -376,7 +458,6 @@ Service MoveOutLot(LotID, WaferQty, Operator) ReduceQty = CurrLotQty - WaferQty End Case end - //Possibly Add locking here If Error_Services('NoError') then ThisLotCurrOperationID = Lot_Services('GetLotCurrOperation', LotId) If ThisLotCurrOperationID NE '' then @@ -387,28 +468,52 @@ Service MoveOutLot(LotID, WaferQty, Operator) Database_Services('WriteDataRow', 'LOT_OPERATION', ThisLotCurrOperationID, ThisLotCurrOperationRec) If Error_Services('NoError') then LotType = XLATE('LOT', LotId, LOT_TYPE$, 'X') - CurrOperation = XLATE('LOT_OPERATION', ThisLotCurrOperationID, LOT_OPERATION_OPERATION_ID$, 'X') Lot_Services('CreateLotEvent', LotId, LotType, Datetime(), 'MOVE_OUT', '', '', ReduceQty, BonusQty, CurrOperation, Operator) + If Error_Services('HasError') then + ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. ' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error in Move Out process for Lot id ' : LotId : '. Error writing to lot operation record. ' : Error_Services('GetMessage') end + end else + ErrorMessage = 'Error in Move Out process for Lot id ' : LotId : '. Error getting lots current operation.' end - //Log to lot event table. end else - //Error: Error reading record + ErrorMessage = 'Error in Move Out process for Lot id ' : LotId : '. ' : Error_Services('GetMessage') end - end else - //Error Invalid Lot id entered + ErrorMessage = 'Error in Move Out process for Lot id ' : LotId : '. Lot ID not found in LOT table.' end end else - //Error: Wafer Qty was null + ErrorMessage = 'Error in Move Out process for Lot id ' : LotId : '. Lot Qty was not passed to routine.' end end else - //Error: Lot Id was null + ErrorMessage = 'Error in Move Out process. Lot id was not passed to routine.' + end + If ErrorMessage NE '' then + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = LotID + LogData<3> = Operator + LogData<4> = 'Successfully Moved Lot out of operation ' : ThisLotCurrOperationID : '.' + Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) + end else + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = LotID + LogData<3> = Operator + LogData<4> = 'Error in Move Out process for Lot id ' : LotId : '. ' : ErrorMessage + Logging_Services('AppendLog', objLotMoveLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) end end service Service CreateLotEvent(LotId, LotType=LOT_TYPES, EventDatetime, EventType=EVENT_TYPES, EventNote, EventEquipmentId, ReduceWaferQty, BonusWaferQty, OperationId, OperatorId) + ErrorMessage = '' + BeginWaferQty = '' + EndWaferQty = '' If LotId NE '' then Begin Case Case LotType EQ 'TW' @@ -428,49 +533,83 @@ Service CreateLotEvent(LotId, LotType=LOT_TYPES, EventDatetime, EventType=EVENT_ OperationID = Lot_Services('GetLotCurrOperation', LotId) OperationID = XLATE('LOT_OPERATION', OperationID, LOT_OPERATION_OPERATION_ID$, 'X') end - If ReduceWaferQty NE '' then - If Num(ReduceWaferQty) then - EndWaferQty = BeginWaferQty - ReduceWaferQty + //OperationId should be set by now, if not, it is an error. Raise the error and cancel any processing. + If OperationID NE '' then + If ReduceWaferQty NE '' then + If Num(ReduceWaferQty) then + EndWaferQty = BeginWaferQty - ReduceWaferQty + end end - end - If BonusWaferQty NE '' then - If Num(BonusWaferQty) then - EndWaferQty = BeginWaferQty + BonusWaferQty + If BonusWaferQty NE '' then + If Num(BonusWaferQty) then + EndWaferQty = BeginWaferQty + BonusWaferQty + end end - end - NewEventRec = '' - NewEventRec = LotId - NewEventRec = EventType - NewEventRec = EventDatetime - NewEventRec = EventNote - NewEventRec = EventEquipmentId - NewEventRec = ReduceWaferQty - NewEventRec = BonusWaferQty - NewEventRec = BeginWaferQty - NewEventRec = EndWaferQty - NewEventRec = OperationId - NewEventRec = OperatorId + NewEventRec = '' + NewEventRec = LotId + NewEventRec = EventType + NewEventRec = EventDatetime + NewEventRec = EventNote + NewEventRec = EventEquipmentId + NewEventRec = ReduceWaferQty + NewEventRec = BonusWaferQty + NewEventRec = BeginWaferQty + NewEventRec = EndWaferQty + NewEventRec = OperationId + NewEventRec = OperatorId - NewEventSequence = Lot_Services('GetLotEventNextSequence', LotId) - NewEventRec = NewEventSequence - Database_Services('WriteDataRow', 'LOT_EVENT', NewEventId, NewEventRec) + NewEventSequence = Lot_Services('GetLotEventNextSequence', LotId) + NewEventRec = NewEventSequence + Database_Services('WriteDataRow', 'LOT_EVENT', NewEventId, NewEventRec) + if Error_Services('HasError') then + ErrorMessage = 'Error in Create Lot Event routine, Error writing Lot Event record, ' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Error in Create Lot Event routine, Current Operation for lot id ' : LotId : ' could not be determined.' + end end else - //Error: Nonexistent Lot Id passed to routine + ErrorMessage = 'Error in Create Lot Event routine, Lot Id passed to routine was not found in LOT table.' end end else - //Error Missing Parameter + ErrorMessage = 'Error in Create Lot Event routine, Missing event type or Operator ID.' end Case LotType EQ 'RDS' - null + ErrorMessage = 'Error in Create Lot Event routine, Lot type RDS was passed to routine and this is currently not supported.' Case LotType EQ 'WM_OUT' - null + ErrorMessage = 'Error in Create Lot Event routine, Lot type WM_OUT was passed to routine and this is currently not supported.' Case LotType EQ 'WM_IN' - null + ErrorMessage = 'Error in Create Lot Event routine, Lot type WM_IN was passed to routine and this is currently not supported.' Case Otherwise$ - //Error: Invalid LotType Passed to routine + ErrorMessage = 'Error in Create Lot Event routine, An invalid lot type was passed to routine.' End Case end else - //Error: Lot ID was null + ErrorMessage = 'Error in Create Lot Event routine, A null value for Lot Id was passed to routine.' + end + If ErrorMessage EQ '' then + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = LotId + LogData<3> = EventType + LogData<4> = OperatorId + LogData<5> = BeginWaferQty + LogData<6> = EndWaferQty + LogData<7> = BonusWaferQty + LogData<8> = ReduceWaferQty + LogData<9> = 'Successfully logged event.' + Logging_Services('AppendLog', objLotEventLog, LogData, @RM, @FM, False$) + end else + LogData = '' + LogData<1> = LoggingDTM + LogData<2> = LotId + LogData<3> = EventType + LogData<4> = OperatorId + LogData<5> = BeginWaferQty + LogData<6> = EndWaferQty + LogData<7> = BonusWaferQty + LogData<8> = ReduceWaferQty + LogData<9> = ErrorMessage + Logging_Services('AppendLog', objLotEventLog, LogData, @RM, @FM, False$) + Error_Services('Add', ErrorMessage) end end service @@ -525,6 +664,10 @@ Service ConvertLotRecordToJson(LotId, ItemURL, CurrUser, FullObject=BOOLEAN) SRP_JSON(objLot, 'SetValue', 'WaferQty', LotRec) SRP_JSON(objLot, 'SetValue', 'VendorPartNo', LotRec) SRP_JSON(objLot, 'SetValue', 'VendorLotNo', LotRec) + SRP_JSON(objLot, 'SetValue', 'Vendor', LotRec) + CurrOperation = Lot_Services('GetLotCurrOperation', LotId) + CurrOperation = Field(CurrOperation, '*', 2) + SRP_JSON(objLot, 'SetValue', 'CurrOperation', CurrOperation) If FullObject then //Events Array EventsArrayJson = '' @@ -612,4 +755,47 @@ Service ConvertLotRecordToJson(LotId, ItemURL, CurrUser, FullObject=BOOLEAN) Response = JsonString end service +Service OpenLot(LotId) + ErrorMessage = '' + If RowExists('LOT', LotId) then + LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) + LotRec = True$ + Database_Services('WriteDataRow', 'LOT', LotId, LotRec, True$, False$, False$) + If Error_Services('HasError') then + ErrorMessage = 'Error setting lot ' : LotId : ' to open.' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Unable to Open Lot ' : LotId : '. Lot ID was not found in LOT table.' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end +end service + +Service CloseLot(LotId) + ErrorMessage = '' + If RowExists('LOT', LotId) then + LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$) + LotRec = False$ + Database_Services('WriteDataRow', 'LOT', LotId, LotRec, True$, False$, False$) + If Error_Services('HasError') then + ErrorMessage = 'Error setting lot ' : LotId : ' to closed.' : Error_Services('GetMessage') + end + end else + ErrorMessage = 'Unable to Close Lot ' : LotId : '. Lot ID was not found in LOT table.' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end +end service + +Service HoldLot(LotId) + +end service + +Service UnholdLot(LotId) + +end service + + diff --git a/LSL2/STPROC/OPERATION_TW_CREATE.txt b/LSL2/STPROC/OPERATION_TW_CREATE.txt new file mode 100644 index 0000000..a1c72d9 --- /dev/null +++ b/LSL2/STPROC/OPERATION_TW_CREATE.txt @@ -0,0 +1,107 @@ +Compile function OPERATION_TW_CREATE(LotId, Action, Operator) +//Action: IN, OUT, PROCESS +Declare function Lot_Services, Error_Services, Datetime, Database_Services +Declare subroutine Database_Services, Lot_Services + +#pragma precomp SRP_PreCompiler +$insert LOGICAL +$Insert APP_INSERTS +$Insert Lot_Operation_Equates +$Insert LOT_EQUATES + +Success = False$ +debug +If RowExists('LOT', LotId) then + If Operator NE '' and RowExists('LSL_USERS', Operator) then + Begin Case + Case Action = 'IN' + GoSub MoveIn + Case Action = 'OUT' + GoSub MoveOut + Case Action = 'PROCESS' + GoSub Process + Case Otherwise$ + null + End Case + end else + Error_Services('Add', 'Operator ID was null') + end +end else + Error_Services('Add', 'Invalid lot passed to Operation routine.') + Success = False$ +end + +Return Success + + +MoveIn: + debug + //Get TW Create Operation ID + ThisOperationID = Lot_Services('GetLotCurrOperation', LotId) + If Field(ThisOperationId, '*', 1) EQ 'TW_CREATE' then + ThisLotCurrOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', ThisOperationID) + ThisLotCurrOperationRec = Datetime() + ThisLotCurrOperationRec = Xlate('LOT', LotId, LOT_WAFER_QTY$, 'X') + ThisLotCurrOperationRec = Operator + Database_Services('WriteDataRow', 'LOT_OPERATION', ThisLotCurrOperationID, ThisOperationID) + If Error_Services('NoError') then + LotType = XLATE('LOT', LotId, LOT_TYPE$, 'X') + CurrOperation = XLATE('LOT_OPERATION', ThisLotCurrOperationID, LOT_OPERATION_OPERATION_ID$, 'X') + Lot_Services('CreateLotEvent', LotId, LotType, Datetime(), 'MOVE_IN', '', '', 0, 0, CurrOperation, Operator) + end + end else + Error_Services('Add', 'Failed to move in lot. Lot is not currently at TW_CREATE. Detected Operation is ' : Field(ThisOperationId, '*', 1)) + end + +return + +MoveOut: + ThisOperationID = Lot_Services('GetLotCurrOperation', LotId) + If Field(ThisOperationId, '*', 1) EQ 'TW_CREATE' then + ThisLotCurrOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', ThisLotCurrOperationID) + LotMovedIn = ThisLotCurrOperationRec + If LotMovedIn then + ThisOperationSteps = ThisLotCurrOperationRec + AllStepsCompleted = False$ + for each OperationStepId in ThisOperationSteps using @VM + ThisStepComplete = Xlate('LOT_OPERATION_STEP', OperationStepId, LOT_OPERATION_STEP_STEP_COMPLETED$, 'X') + If ThisStepComplete then + AllStepsComplete = True$ + end else + AllStepsComplete = False$ + end + until AllStepsCompleted = False$ + Next OperationStep + If AllStepsCompleted then + ThisLotCurrOperationRec = Datetime() + ThisLotCurrOperationRec = Xlate('LOT', LotId, LOT_WAFER_QTY$, 'X') + ThisLotCurrOperationRec = Operator + Database_Services('WriteDataRow', 'LOT_OPERATION', ThisLotCurrOperationID, ThisLotCurrOperationRec) + If Error_Services('NoError') then + LotType = XLATE('LOT', LotId, LOT_TYPE$, 'X') + CurrOperation = XLATE('LOT_OPERATION', ThisLotCurrOperationID, LOT_OPERATION_OPERATION_ID$, 'X') + Lot_Services('CreateLotEvent', LotId, LotType, Datetime(), 'MOVE_OUT', '', '', ReduceQty, BonusQty, CurrOperation, Operator) + end + end else + Error_Services('Add', 'Failed to move out lot. Not all steps completed.') + end + end else + Error_Services('Add', 'Failed to move out lot. Lot was not moved in.') + end + end +return + +Process: + //Get Current Step and proceed from that step onward +return + +OpenLot: + +return + +PrintLabel: + +return + + + diff --git a/LSL2/STPROC/REPORTS_API.txt b/LSL2/STPROC/REPORTS_API.txt index 7d49c8a..abdf44c 100644 --- a/LSL2/STPROC/REPORTS_API.txt +++ b/LSL2/STPROC/REPORTS_API.txt @@ -42,7 +42,7 @@ $insert APP_INSERTS $insert API_SETUP $insert HTTP_INSERTS -Declare Function Report_Services, Oi_Wizard_Services, Logging_Services, Environment_Services +Declare Function Report_Services, Oi_Wizard_Services, Logging_Services, Environment_Services, Test_Run_Services Declare subroutine Report_Services, Logging_Services LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Reports' @@ -133,6 +133,8 @@ CreateHALItem: ReportStartDtm = Http_Services('GetQueryField', 'StartDate') ReportEndDtm = Http_Services('GetQueryField', 'EndDate') RepJSON = Report_Services('GetDailyReactorUptimeDataJSON', ReportStartDtm, ReportEndDtm) + Case ReportID = 'TestWaferWIPReport' + RepJSON = Report_Services('GetOpenTestWaferLotWIPReportJson') Case Otherwise$ Error_Services('Add', 'Unsupported report') End Case @@ -223,5 +225,3 @@ API reports.GET HTTP_Resource_Services('LoremIpsum') end api - - diff --git a/LSL2/STPROC/REPORT_SERVICES.txt b/LSL2/STPROC/REPORT_SERVICES.txt index 4fae46c..fc8d283 100644 --- a/LSL2/STPROC/REPORT_SERVICES.txt +++ b/LSL2/STPROC/REPORT_SERVICES.txt @@ -81,6 +81,7 @@ Declare function Set_Printer, Get_Printer, Msg, Get_Status, Printer_Select, ob Declare function Schedule_Services, Error_Services, Location_Services, SRP_Array, Signature_Services, obj_RDS_Test Declare function Epi_Part_Services, SRP_Math, Database_Services, SRP_JSON, Reactor_Services, SRP_Datetime Declare function SRP_Array, Environment_Services, Logging_Services, Datetime, Select_Into, Wafer_Counter_Services +Declare function Lot_Services, Test_Run_Services Equ TAB TO \09\ @@ -1545,6 +1546,46 @@ Service CalcInProcessDailyPerformanceData() end service +Service GetOpenTestWaferLotWIPReportJson() + ErrorMessage = '' + JSONCollection = '' + TestWaferLots = Test_Run_Services('GetTestWaferLots', True$) + hJSONCollection = '' + If SRP_JSON(hJSONCollection, 'New', 'Object') then + hTWLotArray = '' + If SRP_JSON(hTWLotArray, 'New', 'Array') then + Abort = False$ + for each TestWaferLotId in TestWaferLots using @VM + ThisLotJson = Lot_Services('ConvertLotRecordToJson', TestWaferLotId, '', '', False$) + If Error_Services('NoError') then + hTWLot = '' + If (SRP_JSON(hTWLot, 'Parse', ThisLotJson) EQ '') then + SRP_JSON(hTWLotArray, 'Add', hTWLot) + SRP_JSON(hTWLot, 'Release') + end + end else + Abort = True$ + end + Until Abort + Next TestWaferLotId + If Abort EQ False$ then + SRP_JSON(hJSONCollection, 'Set', 'Lots', hTWLotArray) + end + SRP_JSON(hTWLotArray, 'Release') + end else + ErrorMessage = 'Error creating test wafer Json array.' + end + JSONCollection = SRP_JSON(hJSONCollection, 'Stringify', 'Styled') + SRP_JSON(hJSONCollection, 'Release') + end else + ErrorMessage = 'Error creating test wafer Json Collection' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end + Response = JSONCollection +end service + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Internal GoSubs @@ -1845,3 +1886,4 @@ ClearCursors: return + diff --git a/LSL2/STPROC/TEST_RUN_SERVICES.txt b/LSL2/STPROC/TEST_RUN_SERVICES.txt index f6395e2..7c69131 100644 --- a/LSL2/STPROC/TEST_RUN_SERVICES.txt +++ b/LSL2/STPROC/TEST_RUN_SERVICES.txt @@ -8,9 +8,9 @@ $Insert TEST_RUN_EQUATES $Insert TEST_RUN_WAFER_EQUATES $Insert TEST_RUN_OBJ_EQUATES -Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable -Declare function SRP_Datetime, Database_Services, Test_Run_Services, File_Services, Status, delete, Insert -Declare subroutine Database_Services, Btree.Extract, Error_Services, Logging_Services, Rlist, Test_Run_Services, +Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable, Lot_Services +Declare function SRP_Datetime, Database_Services, Test_Run_Services, File_Services, Status, delete, Insert, Datetime, SRP_Json +Declare subroutine Database_Services, Btree.Extract, Error_Services, Logging_Services, Rlist, Test_Run_Services, Lot_Services, SRP_Json LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\TEST_RUN_SERVICES\TestWaferProduct' LogDate = Oconv(Date(), 'D4/') @@ -297,6 +297,24 @@ Service GetAllTestRunTypes() Response = rtList end service +Service GetTestWaferLots(ShowOnlyOpenLots) + ErrorMessage = '' + TestWaferLotKeys = '' + SearchString = 'TYPE':@VM:'TW':@FM + If ShowOnlyOpenLots then + SearchString := 'OPEN':@VM:True$:@FM + end + Open 'DICT.LOT' to @DICT then + Btree.Extract(SearchString, 'LOT', @DICT, TestWaferLotKeys, '', '') + end else + ErrorMessage = 'Error opening LOT dictionary.' + end + If ErrorMessage NE '' then + Error_Services('Add', ErrorMessage) + end + Response = TestWaferLotKeys +end service + Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID) Response = '' ErrorMessage = '' @@ -326,7 +344,7 @@ Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID) If RunTypeID EQ '' then ErrorMessage := 'Run Type ID Missing. ' end - If EqpTypeID EQ '' then + If EqpType EQ '' then ErrorMessage := 'Equipment Type ID Missing. ' end If EqpID EQ '' then @@ -346,7 +364,7 @@ Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID) end end service -Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotID) +Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotID, Username) ErrorMessage = '' If TestRunID NE '' AND TWPartID NE '' then If RowExists('TEST_RUN', TestRunID) then @@ -366,6 +384,9 @@ Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotID Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM) //Increment Usage in TEST_WAFER_PROD Record Test_Run_Services('IncrementTWProdUsage', TWPartID) + If SourceLotID NE '' then + Test_Run_Services('UseTWFromLot', SourceLotId, 1, Username) + end Response = TRWaferKey end else ErrorMessage := 'Error writing TEST_RUN_WAFER record with key of ' : TRWaferKey '. ' @@ -389,6 +410,19 @@ Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotID Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM) end end service +Service UseTWFromLot(LotId, UsageQty, Username) + ErrorMessage = '' + If RowExists('LOT', LotId) then + Lot_Services('CreateLotEvent', LotId, 'TW', Datetime(), 'REDUCE_WAFER_QTY', 'Consumed test wafer.', '', UsageQty, 0, '', Username) + end else + ErrorMessage = 'Error logging wafer consumption from Lot # ' : LotId : '. Lot does not exist in LOT table.' + end + If ErrorMessage EQ '' then + + end else + //Log Error + end +end service Service GetTestRunById(TestRunID) If TestRunID NE '' then @@ -603,3 +637,4 @@ end service + diff --git a/LSL2/STPROCINS/LOT_EQUATES.txt b/LSL2/STPROCINS/LOT_EQUATES.txt index 3de532d..c582e35 100644 --- a/LSL2/STPROCINS/LOT_EQUATES.txt +++ b/LSL2/STPROCINS/LOT_EQUATES.txt @@ -1,20 +1,24 @@ compile insert LOT_EQUATES /*---------------------------------------- Author : Table Create Insert Routine - Written : 11/10/2024 + Written : 28/10/2024 Description : Insert for Table LOT ----------------------------------------*/ #ifndef __LOT_EQUATES__ #define __LOT_EQUATES__ - equ LOT_TYPE$ to 1 - equ LOT_PROD_ID$ to 2 - equ LOT_ORIG_WAFER_QTY$ to 3 - equ LOT_WAFER_QTY$ to 4 - equ LOT_VENDOR_PART_NO$ to 5 - equ LOT_VENDOR_LOT_NO$ to 6 - equ LOT_VENDOR_CODE$ to 7 - equ LOT_LOT_EVENTS$ to 8 - equ LOT_LOT_OPERATIONS$ to 9 + equ LOT_TYPE$ to 1 + equ LOT_PROD_ID$ to 2 + equ LOT_ORIG_WAFER_QTY$ to 3 + equ LOT_WAFER_QTY$ to 4 + equ LOT_VENDOR_PART_NO$ to 5 + equ LOT_VENDOR_LOT_NO$ to 6 + equ LOT_VENDOR_CODE$ to 7 + equ LOT_LOT_EVENTS$ to 8 + equ LOT_LOT_OPERATIONS$ to 9 + equ LOT_TEST_RUN_WAFER_IDS$ to 10 + equ LOT_OPEN$ to 11 + equ LOT_HOLD$ to 12 + equ LOT_HOT$ to 13 #endif