|  | @@ -988,12 +988,13 @@ namespace FurnaceRT.Equipments.Jobs
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      if (pj.State == EnumProcessJobState.Processing)
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  | -                        if (CheckAllWaferReturned(pj, true))
 | 
	
		
			
				|  |  | +                        var pmModule = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                        if (CheckAllWaferReturned(pj, true) && pmModule.CheckRecipeIsCompleted(pj))
 | 
	
		
			
				|  |  |                          {
 | 
	
		
			
				|  |  |                              pj.SetState(EnumProcessJobState.ProcessingComplete);
 | 
	
		
			
				|  |  |                              JobDataRecorder.EndPJ(pj.InnerId.ToString(), 0, 0);
 | 
	
		
			
				|  |  |                              _faCallback.EndDischarge(pj);
 | 
	
		
			
				|  |  | -                            var pmModule = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
 | 
	
		
			
				|  |  |                              pmModule?.SetN2PurgeLAO2CheckFirstEnable(false);
 | 
	
		
			
				|  |  |                              pmModule?.SetN2PurgeProcess(false);
 | 
	
		
			
				|  |  |                          }
 | 
	
	
		
			
				|  | @@ -4667,7 +4668,7 @@ namespace FurnaceRT.Equipments.Jobs
 | 
	
		
			
				|  |  |              return slots;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          #region charge rule
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          private bool CheckChargeRule(ProcessJobInfo pj, out bool waferShort, bool needCheckPWafer, bool needCheckMWafer, out string reason)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              waferShort = false;
 |