|  | @@ -48,6 +48,7 @@ using MECF.Framework.Common.Tolerance;
 | 
												
													
														
															|  |  using MECF.Framework.Common.CommonData.SorterDefines;
 |  |  using MECF.Framework.Common.CommonData.SorterDefines;
 | 
												
													
														
															|  |  using MECF.Framework.Common.Extens;
 |  |  using MECF.Framework.Common.Extens;
 | 
												
													
														
															|  |  using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.TDK;
 |  |  using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.TDK;
 | 
												
													
														
															|  | 
 |  | +using System.Windows.Ink;
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  |  namespace FurnaceRT.Equipments.Jobs
 |  |  namespace FurnaceRT.Equipments.Jobs
 | 
												
													
														
															|  |  {
 |  |  {
 | 
												
											
												
													
														
															|  | @@ -4666,7 +4667,27 @@ namespace FurnaceRT.Equipments.Jobs
 | 
												
													
														
															|  |              return slots;
 |  |              return slots;
 | 
												
													
														
															|  |          }
 |  |          }
 | 
												
													
														
															|  |          #region charge rule
 |  |          #region charge rule
 | 
												
													
														
															|  | 
 |  | +        public static int[] InsertIntoMiddleRight(int[] A, int B)
 | 
												
													
														
															|  | 
 |  | +        {
 | 
												
													
														
															|  | 
 |  | +            if (A == null)
 | 
												
													
														
															|  | 
 |  | +            {
 | 
												
													
														
															|  | 
 |  | +                return new int[] { B }; // 处理A为null的情况
 | 
												
													
														
															|  | 
 |  | +            }
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  | 
 |  | +            int lengthA = A.Length;
 | 
												
													
														
															|  | 
 |  | +            // 计算中间偏右位置:(长度 + 1) / 2(整数除法)
 | 
												
													
														
															|  | 
 |  | +            int middleRight = (lengthA + 1) / 2;
 | 
												
													
														
															|  | 
 |  | +            int[] newArray = new int[lengthA + 1]; // 新数组长度+1
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  | 
 |  | +            // 复制左侧元素(0到middleRight-1)
 | 
												
													
														
															|  | 
 |  | +            Array.Copy(A, 0, newArray, 0, middleRight);
 | 
												
													
														
															|  | 
 |  | +            // 插入B到中间偏右位置
 | 
												
													
														
															|  | 
 |  | +            newArray[middleRight] = B;
 | 
												
													
														
															|  | 
 |  | +            // 复制右侧元素(从A的middleRight位置开始,复制到新数组的middleRight+1位置)
 | 
												
													
														
															|  | 
 |  | +            Array.Copy(A, middleRight, newArray, middleRight + 1, lengthA - middleRight);
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  | 
 |  | +            return newArray;
 | 
												
													
														
															|  | 
 |  | +        }
 | 
												
													
														
															|  |          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;
 | 
												
											
												
													
														
															|  | @@ -4703,6 +4724,14 @@ namespace FurnaceRT.Equipments.Jobs
 | 
												
													
														
															|  |              bool isFileDumy = false;
 |  |              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 layoutSlotDic = new Dictionary<int, string>();
 | 
												
													
														
															|  | 
 |  | +                var layoutSlotList = new List<string>();
 | 
												
													
														
															|  | 
 |  | +                for (int i = 0; i < layoutRecipeDataExpert.Items.Count; i++)
 | 
												
													
														
															|  | 
 |  | +                {
 | 
												
													
														
															|  | 
 |  | +                    layoutSlotDic.Add(i, layoutRecipeDataExpert.Items[i]);
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  | 
 |  | +                }
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  |                  var pjPWaferCount = GetCurrentWaferNum(pj, WaferType.P, out bool pSlotSelectA);
 |  |                  var pjPWaferCount = GetCurrentWaferNum(pj, WaferType.P, out bool pSlotSelectA);
 | 
												
													
														
															|  |                  if (pjPWaferCount == 0)
 |  |                  if (pjPWaferCount == 0)
 | 
												
													
														
															|  |                  {
 |  |                  {
 | 
												
											
												
													
														
															|  | @@ -4729,29 +4758,119 @@ namespace FurnaceRT.Equipments.Jobs
 | 
												
													
														
															|  |                                  $"supplement P wafer {needPAndCurrect}, surplusDumyCount={surplusDumyCount},Not enough dummy ";
 |  |                                  $"supplement P wafer {needPAndCurrect}, surplusDumyCount={surplusDumyCount},Not enough dummy ";
 | 
												
													
														
															|  |                              return false;
 |  |                              return false;
 | 
												
													
														
															|  |                          }
 |  |                          }
 | 
												
													
														
															|  | -
 |  | 
 | 
												
													
														
															|  |                          isFileDumy = true;
 |  |                          isFileDumy = true;
 | 
												
													
														
															|  | -                        for (int i = 0; i < layoutRecipeDataExpert.Items.Count; i++)
 |  | 
 | 
												
													
														
															|  | 
 |  | +                        List<string> chargeRuleStr = new List<string>() { "Center", "Upper", "Lower" };
 | 
												
													
														
															|  | 
 |  | +                        if (string.IsNullOrEmpty(layoutRecipeDataConfig.WaferSupplement) || !chargeRuleStr.Contains(layoutRecipeDataConfig.WaferSupplement))
 | 
												
													
														
															|  |                          {
 |  |                          {
 | 
												
													
														
															|  | -                            if (layoutRecipeDataExpert.Items[i].ToLower() == WaferType.P.ToDescription())
 |  | 
 | 
												
													
														
															|  | 
 |  | +                            for (int i = 0; i < layoutRecipeDataExpert.Items.Count; i++)
 | 
												
													
														
															|  |                              {
 |  |                              {
 | 
												
													
														
															|  | -                                if (needPAndCurrect == 0)
 |  | 
 | 
												
													
														
															|  | -                                    continue;
 |  | 
 | 
												
													
														
															|  | 
 |  | +                                if (layoutRecipeDataExpert.Items[i].ToLower() == WaferType.P.ToDescription())
 | 
												
													
														
															|  | 
 |  | +                                {
 | 
												
													
														
															|  | 
 |  | +                                    if (needPAndCurrect == 0)
 | 
												
													
														
															|  | 
 |  | +                                        continue;
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  | 
 |  | +                                    if (currentEDWaferNum > 0)
 | 
												
													
														
															|  | 
 |  | +                                    {
 | 
												
													
														
															|  | 
 |  | +                                        layoutRecipeDataExpert.Items[i] = WaferType.ED.ToDescription().ToUpper();
 | 
												
													
														
															|  | 
 |  | +                                        currentEDWaferNum--;
 | 
												
													
														
															|  | 
 |  | +                                        needPAndCurrect--;
 | 
												
													
														
															|  | 
 |  | +                                    }
 | 
												
													
														
															|  | 
 |  | +                                    if (currentSDWaferNum > 0 && layoutRecipeDataExpert.Items[i].ToLower() == WaferType.P.ToDescription())
 | 
												
													
														
															|  | 
 |  | +                                    {
 | 
												
													
														
															|  | 
 |  | +                                        layoutRecipeDataExpert.Items[i] = WaferType.SD.ToString();
 | 
												
													
														
															|  | 
 |  | +                                        currentSDWaferNum--;
 | 
												
													
														
															|  | 
 |  | +                                        needPAndCurrect--;
 | 
												
													
														
															|  | 
 |  | +                                    }
 | 
												
													
														
															|  | 
 |  | +                                }
 | 
												
													
														
															|  | 
 |  | +                            }
 | 
												
													
														
															|  | 
 |  | +                        }
 | 
												
													
														
															|  | 
 |  | +                        else
 | 
												
													
														
															|  | 
 |  | +                        {
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  | 
 |  | +                            if (layoutRecipeDataConfig.WaferSupplement == "Center")
 | 
												
													
														
															|  | 
 |  | +                            {
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  | 
 |  | +                                var pdWaferSlot = layoutSlotDic.Where(a => a.Value.ToLower() == WaferType.P.ToDescription()).Select(a => a.Key).ToList();
 | 
												
													
														
															|  | 
 |  | +                                var startReplacePWafer = (pdWaferSlot.Count - pjPWaferCount) / 2;
 | 
												
													
														
															|  | 
 |  | +                                var noReplacePSlot = pdWaferSlot.GetRange(startReplacePWafer, pjPWaferCount);
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  | 
 |  | +                                for (int i = 0; i < layoutRecipeDataExpert.Items.Count; i++)
 | 
												
													
														
															|  | 
 |  | +                                {
 | 
												
													
														
															|  | 
 |  | +                                    if (layoutRecipeDataExpert.Items[i].ToLower() == WaferType.P.ToDescription())
 | 
												
													
														
															|  | 
 |  | +                                    {
 | 
												
													
														
															|  | 
 |  | +                                        if (needPAndCurrect == 0 || noReplacePSlot.Contains(i))
 | 
												
													
														
															|  | 
 |  | +                                            continue;
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  | -                                if (currentEDWaferNum > 0)
 |  | 
 | 
												
													
														
															|  | 
 |  | +                                        if (currentEDWaferNum > 0)
 | 
												
													
														
															|  | 
 |  | +                                        {
 | 
												
													
														
															|  | 
 |  | +                                            layoutRecipeDataExpert.Items[i] = WaferType.ED.ToDescription().ToUpper();
 | 
												
													
														
															|  | 
 |  | +                                            currentEDWaferNum--;
 | 
												
													
														
															|  | 
 |  | +                                            needPAndCurrect--;
 | 
												
													
														
															|  | 
 |  | +                                        }
 | 
												
													
														
															|  | 
 |  | +                                        if (currentSDWaferNum > 0 && layoutRecipeDataExpert.Items[i].ToLower() == WaferType.P.ToDescription())
 | 
												
													
														
															|  | 
 |  | +                                        {
 | 
												
													
														
															|  | 
 |  | +                                            layoutRecipeDataExpert.Items[i] = WaferType.SD.ToString();
 | 
												
													
														
															|  | 
 |  | +                                            currentSDWaferNum--;
 | 
												
													
														
															|  | 
 |  | +                                            needPAndCurrect--;
 | 
												
													
														
															|  | 
 |  | +                                        }
 | 
												
													
														
															|  | 
 |  | +                                    }
 | 
												
													
														
															|  | 
 |  | +                                }
 | 
												
													
														
															|  | 
 |  | +                            }
 | 
												
													
														
															|  | 
 |  | +                            else if (layoutRecipeDataConfig.WaferSupplement == "Upper")
 | 
												
													
														
															|  | 
 |  | +                            {
 | 
												
													
														
															|  | 
 |  | +                                layoutSlotDic = layoutSlotDic.Reverse().ToDictionary(a => a.Key, a => a.Value);
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  | 
 |  | +                                foreach (var item in layoutSlotDic)
 | 
												
													
														
															|  |                                  {
 |  |                                  {
 | 
												
													
														
															|  | -                                    layoutRecipeDataExpert.Items[i] = WaferType.ED.ToDescription().ToUpper();
 |  | 
 | 
												
													
														
															|  | -                                    currentEDWaferNum--;
 |  | 
 | 
												
													
														
															|  | -                                    needPAndCurrect--;
 |  | 
 | 
												
													
														
															|  | 
 |  | +                                    if (layoutRecipeDataExpert.Items[item.Key].ToLower() == WaferType.P.ToDescription())
 | 
												
													
														
															|  | 
 |  | +                                    {
 | 
												
													
														
															|  | 
 |  | +                                        if (needPAndCurrect == 0)
 | 
												
													
														
															|  | 
 |  | +                                            continue;
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  | 
 |  | +                                        if (currentEDWaferNum > 0)
 | 
												
													
														
															|  | 
 |  | +                                        {
 | 
												
													
														
															|  | 
 |  | +                                            layoutRecipeDataExpert.Items[item.Key] = WaferType.ED.ToDescription().ToUpper();
 | 
												
													
														
															|  | 
 |  | +                                            currentEDWaferNum--;
 | 
												
													
														
															|  | 
 |  | +                                            needPAndCurrect--;
 | 
												
													
														
															|  | 
 |  | +                                        }
 | 
												
													
														
															|  | 
 |  | +                                        if (currentSDWaferNum > 0 && layoutRecipeDataExpert.Items[item.Key].ToLower() == WaferType.P.ToDescription())
 | 
												
													
														
															|  | 
 |  | +                                        {
 | 
												
													
														
															|  | 
 |  | +                                            layoutRecipeDataExpert.Items[item.Key] = WaferType.SD.ToString();
 | 
												
													
														
															|  | 
 |  | +                                            currentSDWaferNum--;
 | 
												
													
														
															|  | 
 |  | +                                            needPAndCurrect--;
 | 
												
													
														
															|  | 
 |  | +                                        }
 | 
												
													
														
															|  | 
 |  | +                                    }
 | 
												
													
														
															|  |                                  }
 |  |                                  }
 | 
												
													
														
															|  | -                                if (currentSDWaferNum > 0 && layoutRecipeDataExpert.Items[i].ToLower() == WaferType.P.ToDescription())
 |  | 
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  | 
 |  | +                            }
 | 
												
													
														
															|  | 
 |  | +                            else if (layoutRecipeDataConfig.WaferSupplement == "Lower")
 | 
												
													
														
															|  | 
 |  | +                            {
 | 
												
													
														
															|  | 
 |  | +                                for (int i = 0; i < layoutRecipeDataExpert.Items.Count; i++)
 | 
												
													
														
															|  |                                  {
 |  |                                  {
 | 
												
													
														
															|  | -                                    layoutRecipeDataExpert.Items[i] = WaferType.SD.ToString();
 |  | 
 | 
												
													
														
															|  | -                                    currentSDWaferNum--;
 |  | 
 | 
												
													
														
															|  | -                                    needPAndCurrect--;
 |  | 
 | 
												
													
														
															|  | 
 |  | +                                    if (layoutRecipeDataExpert.Items[i].ToLower() == WaferType.P.ToDescription())
 | 
												
													
														
															|  | 
 |  | +                                    {
 | 
												
													
														
															|  | 
 |  | +                                        if (needPAndCurrect == 0)
 | 
												
													
														
															|  | 
 |  | +                                            continue;
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  | 
 |  | +                                        if (currentEDWaferNum > 0)
 | 
												
													
														
															|  | 
 |  | +                                        {
 | 
												
													
														
															|  | 
 |  | +                                            layoutRecipeDataExpert.Items[i] = WaferType.ED.ToDescription().ToUpper();
 | 
												
													
														
															|  | 
 |  | +                                            currentEDWaferNum--;
 | 
												
													
														
															|  | 
 |  | +                                            needPAndCurrect--;
 | 
												
													
														
															|  | 
 |  | +                                        }
 | 
												
													
														
															|  | 
 |  | +                                        if (currentSDWaferNum > 0 && layoutRecipeDataExpert.Items[i].ToLower() == WaferType.P.ToDescription())
 | 
												
													
														
															|  | 
 |  | +                                        {
 | 
												
													
														
															|  | 
 |  | +                                            layoutRecipeDataExpert.Items[i] = WaferType.SD.ToString();
 | 
												
													
														
															|  | 
 |  | +                                            currentSDWaferNum--;
 | 
												
													
														
															|  | 
 |  | +                                            needPAndCurrect--;
 | 
												
													
														
															|  | 
 |  | +                                        }
 | 
												
													
														
															|  | 
 |  | +                                    }
 | 
												
													
														
															|  |                                  }
 |  |                                  }
 | 
												
													
														
															|  |                              }
 |  |                              }
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  |                          }
 |  |                          }
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  | 
 |  | +
 | 
												
													
														
															|  |                      }
 |  |                      }
 | 
												
													
														
															|  |                      else
 |  |                      else
 | 
												
													
														
															|  |                      {
 |  |                      {
 | 
												
											
												
													
														
															|  | @@ -4769,7 +4888,6 @@ namespace FurnaceRT.Equipments.Jobs
 | 
												
													
														
															|  |                  sideDummySlots = GetWaferSlots(layoutRecipeDataExpert, WaferType.SD);
 |  |                  sideDummySlots = GetWaferSlots(layoutRecipeDataExpert, WaferType.SD);
 | 
												
													
														
															|  |                  extraDummySlots = GetWaferSlots(layoutRecipeDataExpert, WaferType.ED);
 |  |                  extraDummySlots = GetWaferSlots(layoutRecipeDataExpert, WaferType.ED);
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  | -
 |  | 
 | 
												
													
														
															|  |              }
 |  |              }
 | 
												
													
														
															|  |  
 |  |  
 | 
												
													
														
															|  |  
 |  |  
 |