|  | @@ -4667,6 +4667,7 @@ namespace FurnaceRT.Equipments.Jobs
 | 
												
													
														
															|  |              return slots;
 |  |              return slots;
 | 
												
													
														
															|  |          }
 |  |          }
 | 
												
													
														
															|  |          #region charge rule
 |  |          #region charge rule
 | 
												
													
														
															|  | 
 |  | +      
 | 
												
													
														
															|  |          private bool CheckChargeRule(ProcessJobInfo pj, out bool waferShort, bool needCheckPWafer, bool needCheckMWafer, out string reason)
 |  |          private bool CheckChargeRule(ProcessJobInfo pj, out bool waferShort, bool needCheckPWafer, bool needCheckMWafer, out string reason)
 | 
												
													
														
															|  |          {
 |  |          {
 | 
												
													
														
															|  |              waferShort = false;
 |  |              waferShort = false;
 | 
												
											
												
													
														
															|  | @@ -4700,7 +4701,7 @@ namespace FurnaceRT.Equipments.Jobs
 | 
												
													
														
															|  |              var monitor2Slots = GetWaferSlots(layoutRecipeDataExpert, WaferType.M2);
 |  |              var monitor2Slots = GetWaferSlots(layoutRecipeDataExpert, WaferType.M2);
 | 
												
													
														
															|  |              var sideDummySlots = GetWaferSlots(layoutRecipeDataExpert, WaferType.SD);
 |  |              var sideDummySlots = GetWaferSlots(layoutRecipeDataExpert, WaferType.SD);
 | 
												
													
														
															|  |              var extraDummySlots = GetWaferSlots(layoutRecipeDataExpert, WaferType.ED);
 |  |              var extraDummySlots = GetWaferSlots(layoutRecipeDataExpert, WaferType.ED);
 | 
												
													
														
															|  | -
 |  | 
 | 
												
													
														
															|  | 
 |  | +            bool isFileDumy = false;
 | 
												
													
														
															|  |              if (layoutRecipeDataConfig.FillDummyTransfer.ToLower() == "exist" && layoutRecipeDataConfig.ProductZeroNotFill.ToLower() == "exist" && layoutRecipeDataConfig.ProductTransferPosition.ToLower() == "none")
 |  |              if (layoutRecipeDataConfig.FillDummyTransfer.ToLower() == "exist" && layoutRecipeDataConfig.ProductZeroNotFill.ToLower() == "exist" && layoutRecipeDataConfig.ProductTransferPosition.ToLower() == "none")
 | 
												
													
														
															|  |              {
 |  |              {
 | 
												
													
														
															|  |                  var pjPWaferCount = GetCurrentWaferNum(pj, WaferType.P, out bool pSlotSelectA);
 |  |                  var pjPWaferCount = GetCurrentWaferNum(pj, WaferType.P, out bool pSlotSelectA);
 | 
												
											
												
													
														
															|  | @@ -4718,10 +4719,19 @@ namespace FurnaceRT.Equipments.Jobs
 | 
												
													
														
															|  |                  if (needPAndCurrect > 0)
 |  |                  if (needPAndCurrect > 0)
 | 
												
													
														
															|  |                  {
 |  |                  {
 | 
												
													
														
															|  |                      //判断dumy是否够补充p类型
 |  |                      //判断dumy是否够补充p类型
 | 
												
													
														
															|  | -                    var edAndSdComparePWafer = (currentSDWaferNum + currentEDWaferNum) >= needPAndCurrect;
 |  | 
 | 
												
													
														
															|  | -                    if (edAndSdComparePWafer)
 |  | 
 | 
												
													
														
															|  | 
 |  | +                    var surplusDumyCount = (currentSDWaferNum + currentEDWaferNum) - needPAndCurrect;
 | 
												
													
														
															|  | 
 |  | +                    if (surplusDumyCount >= 0)
 | 
												
													
														
															|  |                      {
 |  |                      {
 | 
												
													
														
															|  | 
 |  | +                        //判断剩余dumy是否足够Layout配置
 | 
												
													
														
															|  | 
 |  | +                        if (surplusDumyCount < (extraDummySlots.Count + sideDummySlots.Count))
 | 
												
													
														
															|  | 
 |  | +                        {
 | 
												
													
														
															|  | 
 |  | +                            reason = $"layout recipe P waferNumber={productSlots.Count},  " +
 | 
												
													
														
															|  | 
 |  | +                                $"select P waferNumber={pjPWaferCount},current SD waferNumber={currentSDWaferNum},current ED Wafer {currentEDWaferNum}," +
 | 
												
													
														
															|  | 
 |  | +                                $"supplement P wafer {needPAndCurrect}, surplusDumyCount={surplusDumyCount},Not enough dummy ";
 | 
												
													
														
															|  | 
 |  | +                            return false;
 | 
												
													
														
															|  | 
 |  | +                        }
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  | 
 |  | +                        isFileDumy = true;
 | 
												
													
														
															|  |                          for (int i = 0; i < layoutRecipeDataExpert.Items.Count; i++)
 |  |                          for (int i = 0; i < layoutRecipeDataExpert.Items.Count; i++)
 | 
												
													
														
															|  |                          {
 |  |                          {
 | 
												
													
														
															|  |                              if (layoutRecipeDataExpert.Items[i].ToLower() == WaferType.P.ToDescription())
 |  |                              if (layoutRecipeDataExpert.Items[i].ToLower() == WaferType.P.ToDescription())
 | 
												
											
												
													
														
															|  | @@ -4861,14 +4871,14 @@ namespace FurnaceRT.Equipments.Jobs
 | 
												
													
														
															|  |              if (!needCheckPWafer)
 |  |              if (!needCheckPWafer)
 | 
												
													
														
															|  |                  return true;
 |  |                  return true;
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  | -            if (iNeedPWaferNum > iCurrentPWaferNum)
 |  | 
 | 
												
													
														
															|  | 
 |  | +            if (!isFileDumy && iNeedPWaferNum > iCurrentPWaferNum)
 | 
												
													
														
															|  |              {
 |  |              {
 | 
												
													
														
															|  |                  reason = "layout recipe production wafer number greater than current production wafer number";
 |  |                  reason = "layout recipe production wafer number greater than current production wafer number";
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  |                  return false;
 |  |                  return false;
 | 
												
													
														
															|  |              }
 |  |              }
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  | -            if (pSlotSelect && iNeedPWaferNum != iCurrentPWaferNum)
 |  | 
 | 
												
													
														
															|  | 
 |  | +            if (!isFileDumy && pSlotSelect && iNeedPWaferNum != iCurrentPWaferNum)
 | 
												
													
														
															|  |              {
 |  |              {
 | 
												
													
														
															|  |                  reason = $"layout recipe production wafer number={iNeedPWaferNum},  current production wafer number={iCurrentPWaferNum}, not match";
 |  |                  reason = $"layout recipe production wafer number={iNeedPWaferNum},  current production wafer number={iCurrentPWaferNum}, not match";
 | 
												
													
														
															|  |  
 |  |  
 | 
												
											
												
													
														
															|  | @@ -6644,8 +6654,12 @@ namespace FurnaceRT.Equipments.Jobs
 | 
												
													
														
															|  |                              isProcessed = true;
 |  |                              isProcessed = true;
 | 
												
													
														
															|  |                      }
 |  |                      }
 | 
												
													
														
															|  |                  }
 |  |                  }
 | 
												
													
														
															|  | 
 |  | +                var asd = CheckChargeFinished(pj, pm.Module);
 | 
												
													
														
															|  | 
 |  | +                if (asd)
 | 
												
													
														
															|  | 
 |  | +                {
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  | -                if (isNeedProcess && CheckChargeFinished(pj, pm.Module) && pj.ProcessingState != EnumProcessingState.Processing &&
 |  | 
 | 
												
													
														
															|  | 
 |  | +                }
 | 
												
													
														
															|  | 
 |  | +                if (isNeedProcess && asd && pj.ProcessingState != EnumProcessingState.Processing &&
 | 
												
													
														
															|  |                      pmModule.CheckStandbyCondition() && pm.IsAvailable)
 |  |                      pmModule.CheckStandbyCondition() && pm.IsAvailable)
 | 
												
													
														
															|  |                  {
 |  |                  {
 | 
												
													
														
															|  |                      if (SC.GetValue<bool>("System.IsEnableBoatChargeMapping") && !pj.IsMapAfterCharge)
 |  |                      if (SC.GetValue<bool>("System.IsEnableBoatChargeMapping") && !pj.IsMapAfterCharge)
 |