12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms.VisualStyles;
- using System.Xml.Schema;
- using System.Xml;
- using System.IO;
- using Aitex.Core.RT.Log;
- using System.Text.RegularExpressions;
- using Aitex.Common.Util;
- using Aitex.Core.RT.Event;
- using Aitex.Core.Util;
- using Aitex.Core.Utilities;
- using Aitex.Core.WCF;
- using MECF.Framework.Common.OperationCenter;
- using MECF.Framework.Common.Properties;
- using MECF.Framework.Common.RecipeCenter;
- using System.Collections.ObjectModel;
- using Aitex.Core.RT.SCCore;
- using MECF.Framework.Common.DataCenter;
- using MECF.Framework.Common.ParameterCenter;
- using System.Linq;
- using MECF.Framework.Common.CommonData;
- namespace Aitex.Core.RT.ParameterCenter
- {
- public class ParameterFileManager : Singleton<ParameterFileManager>
- {
- //Recipe文件 统一放在 Recipes 文件夹下面
- public const string SourceModule = "Parameter";
- string _chamberId;
- private bool _recipeIsValid;
- private List<string> _validationErrors = new List<string>();
- private List<string> _validationWarnings = new List<string>();
- private Dictionary<int, Dictionary<string, string>> _parameterItems;
- IParameterFileContext _rcpContext;
- public ParameterFileManager()
- {
- _chamberId = SC.GetStringValue("System.EditParameter.EditChamberType");
- if (_chamberId == null)
- _chamberId = "Parameter";
- }
- public void Initialize(IParameterFileContext context)
- {
- Initialize(context, true);
- }
- public void Initialize(IParameterFileContext rcpContext, bool enableService)
- {
- _rcpContext = rcpContext == null ? new DefaultParameterFileContext() : rcpContext;
- CultureSupported.UpdateCoreCultureResource(CultureSupported.English);
- if (enableService)
- {
- Singleton<WcfServiceManager>.Instance.Initialize(new Type[]
- {
- typeof(ParameterService)
- });
- }
- var dir = string.Format("{0}{1}\\", PathManager.GetParameterDir(), "");
- DirectoryInfo di = new DirectoryInfo(dir);
- if (!di.Exists)
- {
- di.Create();
- }
- }
- private void ValidationEventHandler(object sender, ValidationEventArgs e)
- {
- switch (e.Severity)
- {
- case XmlSeverityType.Error:
- _validationErrors.Add(e.Message);
- _recipeIsValid = false;
- break;
- case XmlSeverityType.Warning:
- _validationWarnings.Add(e.Message);
- break;
- }
- }
- /// <summary>
- /// XML schema checking
- /// </summary>
- /// <param name="chamId"></param>
- /// <param name="parameterName"></param>
- /// <param name="parameterContent"></param>
- /// <param name="reason"></param>
- /// <returns></returns>
- public bool ValidateParameter(string chamberId, string parameterName, string parameterContent, out List<string> reason)
- {
- try
- {
- XmlDocument document = new XmlDocument();
- document.LoadXml(parameterContent);
- MemoryStream schemaStream = new MemoryStream(ASCIIEncoding.ASCII.GetBytes(GetParameterSchema(chamberId)));
- XmlReader xmlSchemaReader = XmlReader.Create(schemaStream);
- XmlSchema schema1 = XmlSchema.Read(xmlSchemaReader, ValidationEventHandler);
- document.Schemas.Add(schema1);
- document.LoadXml(parameterContent);
- ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
- _recipeIsValid = true;
- _validationErrors = new List<string>();
- _validationWarnings = new List<string>();
- // Validates recipe.
- document.Validate(eventHandler);
- }
- catch (Exception ex)
- {
- LOG.Write(ex.Message);
- _recipeIsValid = false;
- }
- if (!_recipeIsValid && _validationErrors.Count == 0)
- {
- _validationErrors.Add(Resources.RecipeFileManager_ValidateRecipe_XMLSchemaValidateFailed);
- }
- reason = _validationErrors;
- return _recipeIsValid;
- }
- public bool GetParameterChecked(string chamberId, string parameterName)
- {
- string chamberType = chamberId.Split('\\')[0];
- string processType = chamberId.Split('\\')[1];
- string parameterContent = LoadParameter(chamberId, parameterName, false);
- var xmlParameter = new XmlDocument();
- try
- {
- if (string.IsNullOrEmpty(parameterContent))
- throw new Exception("invalid Parameter file.");
- xmlParameter.LoadXml(parameterContent);
- XmlNodeList nodeSteps = xmlParameter.SelectNodes($"Aitex/TableParameterData/Module[@Name='{processType}']/Step");
- XmlNode nodeConfig = xmlParameter.SelectNodes($"Aitex/TableParameterData/Config")[0];
- foreach (var item in nodeSteps)
- {
- XmlElement step = item as XmlElement;
- string strModuleName = step.Attributes["ModuleName"]?.Value;
- if (string.IsNullOrEmpty(strModuleName)) continue;
- if (!string.IsNullOrEmpty(strModuleName))
- {
- string[] temp = strModuleName.Split(',')[0].Split(' ');
- if (temp.Length > 1)
- strModuleName = temp[1];
- }
- else
- continue;
- if (ovenModuleName.Contains(strModuleName))
- strModuleName = "Oven";
- string linkParameterName = step.Attributes["ParameterName"]?.Value;
- if (string.IsNullOrEmpty(linkParameterName)) continue;
- string[] subParameterNames = linkParameterName.Split(',');
- foreach (var subItem in subParameterNames)
- {
- string subParameterName = string.Empty;
- string[] subParameterNameStrings = subItem.Split(':');
- if (subParameterNameStrings.Length > 1)
- {
- subParameterName = subParameterNameStrings[1];
- }
- else
- {
- subParameterName = subParameterNameStrings[0];
- }
- if (!GetParameterChecked($"{_chamberId}\\{strModuleName}", subParameterName))
- {
- return false;
- }
- }
- }
- //check system Parameter
- string strSystemParameterName = nodeConfig.Attributes["SystemParameter"]?.Value;
- if (!string.IsNullOrEmpty(strSystemParameterName))
- {
- if (!GetParameterChecked($"{_chamberId}\\System", strSystemParameterName))
- {
- return false;
- }
- }
- XmlElement nodeData = xmlParameter.SelectSingleNode($"Aitex/TableParameterData") as XmlElement;
- string checkResult = nodeData.Attributes["CheckResult"].Value;
- if (string.IsNullOrEmpty(checkResult))
- return false;
- else
- return true;
- }
- catch (Exception ex)
- {
- LOG.Write(ex);
- return false;
- }
- }
- /// <summary>
- /// Check recipe content
- /// </summary>
- /// <param name="chamId"></param>
- /// <param name="parameterContent"></param>
- /// <param name="reasons"></param>
- /// <returns></returns>
- public bool CheckParameter(string chamberId, string parameterName, out List<string> reasons)
- {
- reasons = new List<string>();
- string chamberType = chamberId.Split('\\')[0];
- string processType = chamberId.Split('\\')[1];
- string parameterContent = LoadParameter(chamberId, parameterName, false);
- var xmlParameter = new XmlDocument();
- try
- {
- if (string.IsNullOrEmpty(parameterContent))
- throw new Exception("invalid Parameter file.");
- xmlParameter.LoadXml(parameterContent);
- XmlNodeList nodeSteps = xmlParameter.SelectNodes($"Aitex/TableParameterData/Module[@Name='{processType}']/Step");
- XmlNode nodeConfig = xmlParameter.SelectNodes($"Aitex/TableParameterData/Config")[0];
- }
- catch (Exception ex)
- {
- reasons.Add(ex.Message);
- LOG.Write(ex);
- return false;
- }
- XmlElement nodeData = xmlParameter.SelectSingleNode($"Aitex/TableParameterData") as XmlElement;
- bool bResult = reasons.Count == 0;
- if (bResult)
- {
- nodeData.SetAttribute("CheckResult", "Correct");
- }
- else
- {
- nodeData.SetAttribute("CheckResult", "Error");
- }
- SaveParameter(chamberId, parameterName, xmlParameter.OuterXml, false, false);
- return bResult;
- }
- /// <summary>
- /// Check recipe content
- /// </summary>
- /// <param name="chamId"></param>
- /// <param name="recipeContent"></param>
- /// <param name="reasons"></param>
- /// <returns></returns>
- public bool CheckRestoreParameter(string chamberId, string parameterName, out List<string> reasons)
- {
- reasons = new List<string>();
- string chamberType = chamberId.Split('\\')[0];
- string processType = chamberId.Split('\\')[1];
- string recipeContent = LoadRestoreParameter(chamberId, parameterName, false);
- var xmlRecipe = new XmlDocument();
- try
- {
- if (string.IsNullOrEmpty(recipeContent))
- throw new Exception("invalid recipe file.");
- xmlRecipe.LoadXml(recipeContent);
- XmlNodeList nodeSteps = xmlRecipe.SelectNodes($"Aitex/TableParameterData/Module[@Name='{processType}']/Step");
- XmlNode nodeConfig = xmlRecipe.SelectNodes($"Aitex/TableParameterData/Config")[0];
- }
- catch (Exception ex)
- {
- reasons.Add(ex.Message);
- LOG.Write(ex);
- return false;
- }
- XmlElement nodeData = xmlRecipe.SelectSingleNode($"Aitex/TableParameterData") as XmlElement;
- bool bResult = reasons.Count == 0;
- if (bResult)
- {
- nodeData.SetAttribute("CheckResult", "Correct");
- }
- else
- {
- nodeData.SetAttribute("CheckResult", "Error");
- }
- SaveRestoreParameter(chamberId, parameterName, xmlRecipe.OuterXml, false, false);
- return bResult;
- }
- /// <summary>
- /// This method will be invoked by two places:
- /// (1) Load a recipe from server to GUI for editing (do not need validation when loading, do validation when saving);
- /// (2) Load a recipe from recipe engine to run process(always do a validation before run recipe);
- /// </summary>
- /// <param name="parameterName"></param>
- /// <param name="needValidation">indicate whether a recipe format validation is needed or not</param>
- /// <returns></returns>
- public string LoadParameter(string chamberId, string parameterName, bool needValidation)
- {
- string rcp = string.Empty;
- try
- {
- using (StreamReader fs = new StreamReader(GenerateParameterFilePath(chamberId, parameterName)))
- {
- rcp = fs.ReadToEnd();
- fs.Close();
- }
- //if (needValidation)
- //{
- // List<string> reason;
- // if (!ValidateRecipe(chamberId, recipeName, rcp, out reason))
- // {
- // rcp = string.Empty;
- // LOG.Write("校验recipe file 出错, " + string.Join(",", reason.ToArray()));
- // }
- //}
- }
- catch (Exception ex)
- {
- LOG.Write(ex, $"load recipe file failed, {parameterName}");
- rcp = string.Empty;
- }
- return rcp;
- }
- /// <summary>
- /// Get recipe list
- /// </summary>
- /// <param name="chamId"></param>
- /// <param name="includingUsedRecipe"></param>
- /// <returns></returns>
- public IEnumerable<string> GetParameters(string chamberId, bool includingUsedRecipe)
- {
- return _rcpContext.GetParameters(chamberId, includingUsedRecipe);
- }
- /// <summary>
- /// Get recipe list in xml format
- /// </summary>
- /// <param name="chamId"></param>
- /// <param name="includingUsedParameter"></param>
- /// <returns></returns>
- public string GetXmlParameterList(string chamberId, bool includingUsedParameter)
- {
- XmlDocument doc = new XmlDocument();
- var baseFolderPath = getParameterDirPath(chamberId);
- DirectoryInfo curFolderInfo = new DirectoryInfo(baseFolderPath);
- doc.AppendChild(GenerateParameterList(chamberId, curFolderInfo, doc, includingUsedParameter));
- return doc.OuterXml;
- }
- public void SaveParameterHistory(string chamberId, string parameterName, string parameterContent, bool needSaveAs = true)
- {
- try
- {
- if (!string.IsNullOrEmpty(parameterName) && needSaveAs)
- {
- string newRecipeName = string.Format("HistoryParameter\\{0}\\{1}", DateTime.Now.ToString("yyyyMM"), parameterName);
- SaveParameter(chamberId, newRecipeName, parameterContent, true, false);
- LOG.Write(string.Format("{0}通知TM保存工艺程序{1}", chamberId, parameterName));
- }
- }
- catch (Exception ex)
- {
- LOG.Write(ex, string.Format("保存{0}工艺程序{1}发生错误", chamberId, parameterName));
- }
- }
- /// <summary>
- /// generate recipe list information in current directory
- /// </summary>
- /// <param name="chamId"></param>
- /// <param name="currentDir"></param>
- /// <param name="doc"></param>
- /// <returns></returns>
- XmlElement GenerateParameterList(string chamberId, DirectoryInfo currentDir, XmlDocument doc, bool includingUsedParameter)
- {
- int trimLength = getParameterDirPath(chamberId).Length;
- XmlElement folderEle = doc.CreateElement("Folder");
- folderEle.SetAttribute("Name", currentDir.FullName.Substring(trimLength));
- DirectoryInfo[] dirInfos = currentDir.GetDirectories();
- foreach (DirectoryInfo dirInfo in dirInfos)
- {
- if (!includingUsedParameter && dirInfo.Name == "HistoryParameter")
- continue;
- folderEle.AppendChild(GenerateParameterList(chamberId, dirInfo, doc, includingUsedParameter));
- }
- FileInfo[] fileInfos = currentDir.GetFiles("*.rcp");
- foreach (FileInfo fileInfo in fileInfos)
- {
- XmlElement fileNd = doc.CreateElement("File");
- string fileStr = fileInfo.FullName.Substring(trimLength).TrimStart(new char[] { '\\' }); ;
- fileStr = fileStr.Substring(0, fileStr.LastIndexOf("."));
- fileNd.SetAttribute("Name", fileStr);
- folderEle.AppendChild(fileNd);
- }
- return folderEle;
- }
- XmlElement GeneratelRestoreParameterList(string chamberId, DirectoryInfo currentDir, XmlDocument doc, bool includingUsedRecipe)
- {
- int trimLength = getParameterBackupDirPath(chamberId).Length;
- XmlElement folderEle = doc.CreateElement("Folder");
- var name = currentDir.FullName.Substring(trimLength);
- folderEle.SetAttribute("Name", name);
- DirectoryInfo[] dirInfos = currentDir.GetDirectories();
- foreach (DirectoryInfo dirInfo in dirInfos)
- {
- if (!includingUsedRecipe && dirInfo.Name == "HistoryParameter")
- continue;
- folderEle.AppendChild(GeneratelRestoreParameterList(chamberId, dirInfo, doc, includingUsedRecipe));
- }
- FileInfo[] fileInfos = currentDir.GetFiles("*.rcp");
- foreach (FileInfo fileInfo in fileInfos)
- {
- XmlElement fileNd = doc.CreateElement("File");
- string fileStr = fileInfo.FullName.Substring(trimLength).TrimStart(new char[] { '\\' }); ;
- fileStr = fileStr.Substring(0, fileStr.LastIndexOf("."));
- fileNd.SetAttribute("Name", fileStr);
- folderEle.AppendChild(fileNd);
- }
- return folderEle;
- }
- /// <summary>
- /// Delete a recipe by recipe name
- /// </summary>
- /// <param name="chamId"></param>
- /// <param name="parameterName"></param>
- /// <returns></returns>
- public bool DeleteParameter(string chamberId, string parameterName)
- {
- try
- {
- File.Delete(GenerateParameterFilePath(chamberId, parameterName));
- EventInfo(string.Format(Resources.RecipeFileManager_DeleteRecipe_RecipeFile0DeleteSucceeded, parameterName));
- }
- catch (Exception ex)
- {
- LOG.Write(ex, "删除recipe file 出错");
- EventWarning(string.Format(Resources.RecipeFileManager_DeleteRecipe_RecipeFile0DeleteFailed, parameterName));
- return false;
- }
- return true;
- }
- /// <summary>
- /// Rename recipe
- /// </summary>
- /// <param name="chamId"></param>
- /// <param name="oldName"></param>
- /// <param name="newName"></param>
- /// <returns></returns>
- public bool RenameParameter(string chamId, string oldName, string newName)
- {
- try
- {
- if (File.Exists(GenerateParameterFilePath(chamId, newName)))
- {
- EventWarning(string.Format(Resources.RecipeFileManager_RenameRecipe_RecipeFile0FileExisted, oldName));
- return false;
- }
- else
- {
- File.Move(GenerateParameterFilePath(chamId, oldName), GenerateParameterFilePath(chamId, newName));
- EventInfo(string.Format(Resources.RecipeFileManager_RenameRecipe_RecipeFile0Renamed, oldName, newName));
- }
- }
- catch (Exception ex)
- {
- LOG.Write(ex, "重命名recipe file 出错");
- EventWarning(string.Format(Resources.RecipeFileManager_RenameRecipe_RecipeFile0RenameFailed, oldName, newName));
- return false;
- }
- return true;
- }
- private static string ovenModuleName = "CPL,HHP,LHP,CHP,TCP";
- private string[] ovenModuleNames = ovenModuleName.Split(',');
- private void UpdateCheckResult(string parameterName)
- {
- var xmlRecipe = new XmlDocument();
- using (StreamReader fs = new StreamReader(parameterName))
- {
- string parameterContent = fs.ReadToEnd();
- fs.Close();
- xmlRecipe.LoadXml(parameterContent);
- }
- XmlNode nodeConfig = xmlRecipe.SelectNodes($"Aitex/TableParameterData")[0];
- nodeConfig.Attributes["CheckResult"].Value = string.Empty;
- XmlTextWriter writer = new XmlTextWriter(parameterName, Encoding.UTF8);
- writer.Formatting = Formatting.Indented;
- xmlRecipe.Save(writer);
- writer.Close();
- }
- public bool BackupParameter(string fileOriginalPath, string fileDestinationPath, bool isSaveLinkParameter, List<string> parameterNames)
- {
- try
- {
- }
- catch (Exception ex)
- {
- LOG.Write(ex, "Backup Recipe file error");
- }
- return true;
- }
- public bool CheckBackParameterIsLinkParameter(string fileOriginalPath, List<string> parameterNames)
- {
- string chamberType = fileOriginalPath.Split('\\')[0];
- string processType = fileOriginalPath.Split('\\')[1];
- foreach (var item in parameterNames)
- {
- string parameterContent = LoadParameter(fileOriginalPath, item, false);
- var xmlParameter = new XmlDocument();
- try
- {
- if (string.IsNullOrEmpty(parameterContent))
- continue;
- xmlParameter.LoadXml(parameterContent);
- XmlNodeList nodeSteps = xmlParameter.SelectNodes($"Aitex/TableParameterData/Module[@Name='{processType}']/Step");
- XmlNode nodeConfig = xmlParameter.SelectNodes($"Aitex/TableParameterData/Config")[0];
- switch (processType)
- {
- case "WaferFlow":
- foreach (var step in nodeSteps)
- {
- XmlElement nodestep = step as XmlElement;
- string strModuleName = nodestep.Attributes["ModuleName"]?.Value;
- if (string.IsNullOrEmpty(strModuleName))
- { continue; }
- var linkRecipeName = nodestep.Attributes["RecipeName"].Value;
- if (string.IsNullOrEmpty(linkRecipeName))
- { continue; }
- else
- {
- return true;
- }
- }
- string strSystemReicpeName = nodeConfig.Attributes["SystemRecipe"]?.Value;
- if (!string.IsNullOrEmpty(strSystemReicpeName))
- {
- return true;
- }
- break;
- case "COT":
- case "DEV":
- string pumpRecipeName = nodeConfig.Attributes["COTPumpRecipe"]?.Value;
- if (!string.IsNullOrEmpty(pumpRecipeName))
- {
- return true;
- }
- break;
- case "Dummy":
- foreach (var step in nodeSteps)
- {
- XmlElement nodestep = step as XmlElement;
- string regularSequence = nodestep.Attributes["RegularSequence"]?.Value;
- string preSequence = nodestep.Attributes["PreSequence"]?.Value;
- if (!string.IsNullOrEmpty(regularSequence))
- {
- string[] regularSequences = regularSequence.Split(';');
- foreach (var subItem in regularSequences)
- {
- if (string.IsNullOrEmpty(subItem)) continue;
- var pumpRecipe = GetKeyValue(subItem, "PumpRecipe");
- if (!string.IsNullOrEmpty(pumpRecipe)) return true;
- }
- }
- if (!string.IsNullOrEmpty(preSequence))
- {
- string[] preSequences = preSequence.Split(';');
- foreach (var subItem in preSequences)
- {
- if (string.IsNullOrEmpty(subItem)) continue;
- var pumpRecipe = GetKeyValue(subItem, "PumpRecipe");
- if (!string.IsNullOrEmpty(pumpRecipe)) return true;
- }
- }
- }
- break;
- case "Wash":
- foreach (var step in nodeSteps)
- {
- XmlElement nodestep = step as XmlElement;
- string sequence = nodestep.Attributes["Sequence"]?.Value;
- if (string.IsNullOrEmpty(sequence))
- { continue; }
- var subSequences = sequence.Split(';');
- foreach (var subSeq in subSequences)
- {
- if (string.IsNullOrEmpty(subSeq))
- {
- continue;
- }
- var pumpRecipe = GetKeyValue(subSeq, "PumpRecipe");
- if (!string.IsNullOrEmpty(subSeq))
- {
- return true;
- }
- }
- }
- break;
- case "ADH":
- case "Oven":
- break;
- }
- }
- catch (Exception ex)
- {
- LOG.Write(ex);
- return false;
- }
- }
- return false;
- }
- private static string GetKeyValue(string args, string name)
- {
- string indexString = $"{name}=";
- string subString = args.Substring(args.IndexOf(indexString) + indexString.Length);
- int endIndex = subString.IndexOf(',');
- if (endIndex > 0)
- return subString.Substring(0, endIndex);
- else
- return subString;
- }
- public string GetXmlRestoreParameterList(string chamberId, bool includingUsedParameter)
- {
- XmlDocument doc = new XmlDocument();
- var baseFolderPath = getParameterBackupDirPath(chamberId);
- DirectoryInfo curFolderInfo = new DirectoryInfo(baseFolderPath);
- doc.AppendChild(GeneratelRestoreParameterList(chamberId, curFolderInfo, doc, includingUsedParameter));
- return doc.OuterXml;
- }
- public List<string> RestoreParameterFolderList()
- {
- List<string> folderList = new List<string>();
- var parameterBackupPath = PathManager.GetParameterBackupDir();
- DirectoryInfo directoryInfo = new DirectoryInfo(parameterBackupPath);
- DirectoryInfo[] directoryInfos = directoryInfo.GetDirectories();
- foreach (var item in directoryInfos)
- {
- folderList.Add(item.Name);
- }
- return folderList;
- }
- public string LoadRestoreParameter(string chamberId, string parameterName, bool needValidation)
- {
- string rcp = string.Empty;
- try
- {
- using (StreamReader fs = new StreamReader(GenerateBackupParameterFilePath(chamberId, parameterName)))
- {
- rcp = fs.ReadToEnd();
- fs.Close();
- }
- }
- catch (Exception ex)
- {
- LOG.Write(ex, $"load recipe file failed, {parameterName}");
- rcp = string.Empty;
- }
- return rcp;
- }
- public bool SigRestoreParameter(string chamId, List<string> parameterNames)
- {
- try
- {
- string filePath = getParameterBackupDirPath(chamId);
- foreach (var item in parameterNames)
- {
- string strdest = chamId;
- string destFilePath = GenerateParameterFilePath(strdest, item);
- string sourceFilePath = GenerateBackupParameterFilePath(chamId, item);
- if (item.Contains("\\"))
- {
- DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(destFilePath));
- if (!di.Exists) di.Create();
- }
- File.Copy(sourceFilePath, destFilePath, true);
- }
- }
- catch (Exception ex)
- {
- LOG.Write(ex, "Backup Recipe file error");
- }
- return true;
- }
- private static Dictionary<string, List<string>> CreateRestoreDirectory = new Dictionary<string, List<string>>();
- private string RestoreDestFileCheck(string chamId, string parameterName)
- {
- string newParameterName = parameterName;
- //有文件夹的处理方式
- if (parameterName.Contains("\\"))
- {
- int index = 1;
- while (true)
- {
- int firstIndex = parameterName.IndexOf("\\");
- string firstStr = parameterName.Substring(0, firstIndex);
- string tempRecipeDirectory = "";
- string lastStr = parameterName.Substring(firstIndex + 1, parameterName.Length - firstStr.Length - 1);
- if (firstStr.Contains("(") && firstStr.Contains(")") && (firstStr.IndexOf("(") < firstStr.IndexOf(")")) && (firstStr.IndexOf(")") == firstStr.Length - 1))
- {
- var tempFirstStr = firstStr.Remove(firstStr.IndexOf("("), firstStr.IndexOf(")"));
- newParameterName = $"{tempFirstStr}({index}){lastStr}";
- tempRecipeDirectory = $"{tempFirstStr}({index})";
- }
- else
- {
- newParameterName = $"{firstStr}({index})\\{lastStr}";
- tempRecipeDirectory = $"{firstStr}({index})";
- }
- var fileName = getParameterDirPath(chamId) + newParameterName + ".rcp";
- DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(fileName));
- if (CreateRestoreDirectory.ContainsKey(chamId) && CreateRestoreDirectory[chamId].Contains(tempRecipeDirectory))
- {
- break;
- }
- else if (di.Exists)
- {
- index++;
- }
- else
- {
- if (!CreateRestoreDirectory.ContainsKey(chamId))
- {
- List<string> recipeDicectory = new List<string>();
- recipeDicectory.Add(tempRecipeDirectory);
- CreateRestoreDirectory.Add(chamId, recipeDicectory);
- }
- else
- {
- CreateRestoreDirectory[chamId].Add(tempRecipeDirectory);
- }
- di.Create();
- break;
- }
- }
- }
- //直接文件的处理方式
- else
- {
- int index = 1;
- while (true)
- {
- if (parameterName.Contains("(") && parameterName.Contains(")") && (parameterName.IndexOf("(") < parameterName.IndexOf(")")) && (parameterName.IndexOf(")") == parameterName.Length - 1))
- {
- var tempFirstStr = parameterName.Remove(parameterName.IndexOf("("), parameterName.IndexOf(")"));
- newParameterName = $"{tempFirstStr}({index})";
- }
- else
- {
- newParameterName = $"{parameterName}({index})";
- break;
- }
- }
- }
- return getParameterDirPath(chamId) + newParameterName + ".rcp";
- }
- public bool RestoreParameter(string chamId, bool isSaveLink, List<string> parameterNames)
- {
- try
- {
- string filePath = getParameterBackupDirPath(chamId);
- CreateRestoreDirectory.Clear();
- foreach (var item in parameterNames)
- {
- string strdest = chamId.Remove(5, 14);
- //string destFilePath = GenerateRecipeFilePath(strdest, item);
- string destFilePath = RestoreDestFileCheck(strdest, item);
- string sourceFilePath = GenerateBackupParameterFilePath(chamId, item);
- if (File.Exists(sourceFilePath))
- {
- DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(destFilePath));
- if (!di.Exists) di.Create();
- File.Copy(sourceFilePath, destFilePath, true);
- }
- if (isSaveLink)
- {
- string recipeContent = LoadRestoreParameter(chamId, item, false);
- var xmlRecipe = new XmlDocument();
- try
- {
- string chamberType = chamId.Split('\\')[0];
- string processType = chamId.Split('\\')[1];
- if (string.IsNullOrEmpty(recipeContent))
- continue;
- xmlRecipe.LoadXml(recipeContent);
- XmlNodeList nodeSteps = xmlRecipe.SelectNodes($"Aitex/TableRecipeData/Module[@Name='{processType}']/Step");
- XmlNode nodeConfig = xmlRecipe.SelectNodes($"Aitex/TableRecipeData/Config")[0];
- switch (processType)
- {
- case "WaferFlow":
- string strSystemReicpeName = nodeConfig.Attributes["SystemRecipe"]?.Value;
- if (!string.IsNullOrEmpty(strSystemReicpeName))
- {
- string subSourceFilePath = GenerateBackupParameterFilePath($"{chamId.Split('\\')[0]}\\System", strSystemReicpeName);
- string subDestFilePath = RestoreDestFileCheck($"{_chamberId}\\System", strSystemReicpeName);
- if (File.Exists(subSourceFilePath))
- {
- DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(subDestFilePath));
- if (!di.Exists) di.Create();
- File.Copy(subSourceFilePath, subDestFilePath, true);
- }
- }
- foreach (var step in nodeSteps)
- {
- XmlElement nodestep = step as XmlElement;
- string strModuleName = nodestep.Attributes["ModuleName"]?.Value;
- if (string.IsNullOrEmpty(strModuleName))
- { continue; }
- else
- {
- string[] temp = strModuleName.Split(',')[0].Split(' ');
- if (temp.Length > 1)
- strModuleName = temp[1];
- }
- var linkRecipeName = nodestep.Attributes["RecipeName"].Value;
- if (string.IsNullOrEmpty(linkRecipeName))
- { continue; }
- string[] subRecipeNames = linkRecipeName.Split(',');
- foreach (var subitem in subRecipeNames)
- {
- string subRecipeName = string.Empty;
- string[] subRecipeNameStrings = subitem.Split(':');
- if (subRecipeNameStrings.Length > 1)
- {
- subRecipeName = subRecipeNameStrings[1];
- }
- else
- {
- subRecipeName = subRecipeNameStrings[0];
- }
- if (ovenModuleName.Contains(strModuleName))
- {
- strModuleName = "Oven";
- }
- string subSourceFilePath = GenerateBackupParameterFilePath($"{chamId.Split('\\')[0]}\\{strModuleName}", subRecipeName);
- string subDestFilePath = RestoreDestFileCheck($"{_chamberId}\\{strModuleName}", subRecipeName);
- if (File.Exists(subSourceFilePath))
- {
- DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(subDestFilePath));
- if (!di.Exists) di.Create();
- File.Copy(subSourceFilePath, subDestFilePath, true);
- }
- if (strModuleName == "COT")
- {
- string subCotPath = GenerateBackupParameterFilePath($"{ _chamberId}\\{strModuleName}", subRecipeName);
- var subXmlRecipe = new XmlDocument();
- string subRecipeContent = LoadParameter($"{ _chamberId}\\{strModuleName}", subRecipeName, false);
- if (string.IsNullOrEmpty(subRecipeContent))
- continue;
- subXmlRecipe.LoadXml(subRecipeContent);
- XmlNode subNodeConfig = subXmlRecipe.SelectNodes($"Aitex/TableRecipeData/Config")[0];
- string subPumpRecipeName = subNodeConfig.Attributes["COTPumpRecipe"]?.Value;
- if (!string.IsNullOrEmpty(subPumpRecipeName))
- {
- string subPumpSourceFilePath = GenerateBackupParameterFilePath($"{chamId.Split('\\')[0]}\\Pump", subPumpRecipeName);
- string subPumpDestFilePath = RestoreDestFileCheck($"{_chamberId}\\Pump", subPumpRecipeName);
- if (File.Exists(subPumpSourceFilePath))
- {
- DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(subPumpDestFilePath));
- if (!di.Exists) di.Create();
- File.Copy(subPumpSourceFilePath, subPumpDestFilePath, true);
- }
- }
- }
- }
- }
- break;
- case "COT":
- case "DEV":
- string pumpRecipeName = nodeConfig.Attributes["COTPumpRecipe"]?.Value;
- if (!string.IsNullOrEmpty(pumpRecipeName))
- {
- string subSourceFilePath = GenerateBackupParameterFilePath($"{chamId.Split('\\')[0]}\\Pump", pumpRecipeName);
- string subDestFilePath = RestoreDestFileCheck($"{_chamberId}\\Pump", pumpRecipeName);
- if (File.Exists(subSourceFilePath))
- {
- DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(subDestFilePath));
- if (!di.Exists) di.Create();
- File.Copy(subSourceFilePath, subDestFilePath, true);
- }
- }
- break;
- case "Dummy":
- foreach (var step in nodeSteps)
- {
- XmlElement nodestep = step as XmlElement;
- string regularSequence = nodestep.Attributes["RegularSequence"]?.Value;
- string preSequence = nodestep.Attributes["PreSequence"]?.Value;
- if (!string.IsNullOrEmpty(regularSequence))
- {
- string[] regularSequences = regularSequence.Split(';');
- foreach (var subItem in regularSequences)
- {
- if (string.IsNullOrEmpty(subItem)) continue;
- var pumpRecipe = GetKeyValue(subItem, "PumpRecipe");
- if (!string.IsNullOrEmpty(pumpRecipe))
- {
- string subSourceFilePath = GenerateBackupParameterFilePath($"{chamId.Split('\\')[0]}\\Pump", pumpRecipe);
- string subDestFilePath = RestoreDestFileCheck($"{_chamberId}\\Pump", pumpRecipe);
- if (File.Exists(subSourceFilePath))
- {
- DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(subDestFilePath));
- if (!di.Exists) di.Create();
- File.Copy(subSourceFilePath, subDestFilePath, true);
- }
- }
- }
- }
- if (!string.IsNullOrEmpty(preSequence))
- {
- string[] preSequences = preSequence.Split(';');
- foreach (var subItem in preSequences)
- {
- if (string.IsNullOrEmpty(subItem)) continue;
- var pumpRecipe = GetKeyValue(item, "PumpRecipe");
- if (!string.IsNullOrEmpty(pumpRecipe))
- {
- string subSourceFilePath = GenerateBackupParameterFilePath($"{chamId.Split('\\')[0]}\\Pump", pumpRecipe);
- string subDestFilePath = RestoreDestFileCheck($"{_chamberId}\\Pump", pumpRecipe);
- if (File.Exists(subSourceFilePath))
- {
- DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(subDestFilePath));
- if (!di.Exists) di.Create();
- File.Copy(subSourceFilePath, subDestFilePath, true);
- }
- }
- }
- }
- }
- break;
- case "Wash":
- foreach (var step in nodeSteps)
- {
- XmlElement nodestep = step as XmlElement;
- string sequence = nodestep.Attributes["Sequence"]?.Value;
- if (string.IsNullOrEmpty(sequence))
- { continue; }
- var subSequences = sequence.Split(';');
- foreach (var subSeq in subSequences)
- {
- if (string.IsNullOrEmpty(subSeq))
- {
- continue;
- }
- var pumpRecipe = GetKeyValue(subSeq, "PumpRecipe");
- if (!string.IsNullOrEmpty(pumpRecipe))
- {
- string subSourceFilePath = GenerateBackupParameterFilePath($"{chamId.Split('\\')[0]}\\Pump", pumpRecipe);
- string subDestFilePath = RestoreDestFileCheck($"{_chamberId}\\Pump", pumpRecipe);
- if (File.Exists(subSourceFilePath))
- {
- DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(subDestFilePath));
- if (!di.Exists) di.Create();
- File.Copy(subSourceFilePath, subDestFilePath, true);
- }
- }
- }
- }
- break;
- case "ADH":
- case "Oven":
- break;
- }
- }
- catch (Exception ex)
- {
- LOG.Write(ex);
- continue;
- }
- }
- }
- }
- catch (Exception ex)
- {
- LOG.Write(ex, "Backup Parameter file error");
- }
- return true;
- }
- private void EventInfo(string message)
- {
- _rcpContext.PostInfoEvent(message);
- }
- private void EventWarning(string message)
- {
- _rcpContext.PostWarningEvent(message);
- }
- private void EventAlarm(string message)
- {
- _rcpContext.PostAlarmEvent(message);
- }
- private void InfoDialog(string message)
- {
- _rcpContext.PostInfoDialogMessage(message);
- }
- private void WarningDialog(string message)
- {
- _rcpContext.PostWarningDialogMessage(message);
- }
- //private void AlarmDialog(string message)
- //{
- // _rcpContext.PostAlarmDialogMessage(message);
- //}
- private void EventDialog(string message, List<string> reason)
- {
- string msg = message;
- foreach (var r in reason)
- {
- msg += "\r\n" + r;
- }
- _rcpContext.PostDialogEvent(msg);
- }
- /// <summary>
- /// get recipe's file path
- /// </summary>
- /// <param name="parameterName"></param>
- /// <returns></returns>
- public string GenerateParameterFilePath(string chamId, string parameterName)
- {
- return getParameterDirPath(chamId) + parameterName + ".rcp";
- }
- private string GenerateBackupParameterFilePath(string chamId, string parameterName)
- {
- return getParameterBackupDirPath(chamId) + parameterName + ".rcp";
- }
- /// <summary>
- /// get recipe's dir path
- /// </summary>
- /// <param name="recipeName"></param>
- /// <returns></returns>
- private string getParameterDirPath(string chamId)
- {
- var dir = string.Format("{0}{1}\\", PathManager.GetParameterDir(), chamId);
- DirectoryInfo di = new DirectoryInfo(dir);
- if (!di.Exists) di.Create();
- return dir;
- }
- /// <summary>
- /// get parameter's dir path
- /// </summary>
- /// <param name="ParameterName"></param>
- /// <returns></returns>
- private string getParameterBackupDirPath(string chamId)
- {
- var dir = string.Format("{0}{1}\\", PathManager.GetParameterBackupDir(), chamId);
- DirectoryInfo di = new DirectoryInfo(dir);
- if (!di.Exists) di.Create();
- return dir;
- }
- /// <summary>
- /// delete a recipe folder
- /// </summary>
- /// <param name="chamId"></param>
- /// <param name="folderName"></param>
- /// <returns></returns>
- public bool DeleteFolder(string chamId, string folderName)
- {
- try
- {
- Directory.Delete(getParameterDirPath(chamId) + folderName, true);
- EventInfo(string.Format(Resources.RecipeFileManager_DeleteFolder_RecipeFolder0DeleteSucceeded, folderName));
- }
- catch (Exception ex)
- {
- LOG.Write(ex, "删除recipe folder 出错");
- EventAlarm(string.Format("recipe folder {0} delete failed", folderName));
- return false;
- }
- return true;
- }
- /// <summary>
- /// save as recipe content
- /// </summary>
- /// <param name="chamId"></param>
- /// <param name="recipeName"></param>
- /// <param name="recipeContent"></param>
- /// <returns></returns>
- public bool SaveAsParameter(string chamId, string recipeName, string recipeContent)
- {
- var path = GenerateParameterFilePath(chamId, recipeName);
- if (File.Exists(path))
- {
- EventAlarm(string.Format(Resources.RecipeFileManager_SaveAsRecipe_RecipeFile0savefailed, recipeName));
- return false;
- }
- return SaveParameter(chamId, recipeName, recipeContent, true, true);
- }
- /// <summary>
- /// save recipe content
- /// </summary>
- /// <param name="chamId"></param>
- /// <param name="parameterName"></param>
- /// <param name="parameterContent"></param>
- /// <returns></returns>
- public bool SaveParameter(string chamId, string parameterName, string parameterContent, bool clearBarcode, bool notifyUI)
- {
- //validate recipe format when saving a recipe file
- //var reasons1 = new List<string>();
- //var reasons2 = new List<string>();
- //ValidateRecipe(chamId, recipeName, recipeContent, out reasons1);
- //CheckRecipe(chamId, recipeContent, out reasons2);
- //reasons1.AddRange(reasons2);
- //if (reasons1.Count > 0)
- //{
- // EventDialog(string.Format( Resources.RecipeFileManager_SaveRecipe_SaveRecipeContentError, recipeName), reasons1);
- //}
- bool ret = true;
- try
- {
- var path = GenerateParameterFilePath(chamId, parameterName);
- FileInfo fi = new FileInfo(path);
- if (!fi.Directory.Exists)
- fi.Directory.Create();
- XmlDocument xml = new XmlDocument();
- xml.LoadXml(parameterContent);
- XmlTextWriter writer = new XmlTextWriter(path, Encoding.UTF8);
- writer.Formatting = Formatting.Indented;
- xml.Save(writer);
- writer.Close();
- if (notifyUI)
- {
- InfoDialog(string.Format(Resources.RecipeFileManager_SaveRecipe_RecipeFile0SaveCompleted, parameterName));
- }
- else
- {
- EV.PostMessage("System", EventEnum.GeneralInfo, string.Format(Resources.RecipeFileManager_SaveRecipe_RecipeFile0SaveCompleted, parameterName));
- }
- }
- catch (Exception ex)
- {
- LOG.Write(ex, "保存recipe file 出错");
- if (notifyUI)
- {
- WarningDialog(string.Format(Resources.RecipeFileManager_SaveRecipe_RecipeFile0SaveFailed, parameterName));
- }
- ret = false;
- }
- return ret;
- }
- /// <summary>
- /// save recipe content
- /// </summary>
- /// <param name="chamId"></param>
- /// <param name="parameterName"></param>
- /// <param name="parameterContent"></param>
- /// <returns></returns>
- public bool SaveRestoreParameter(string chamId, string parameterName, string parameterContent, bool clearBarcode, bool notifyUI)
- {
- //validate recipe format when saving a recipe file
- //var reasons1 = new List<string>();
- //var reasons2 = new List<string>();
- //ValidateRecipe(chamId, recipeName, recipeContent, out reasons1);
- //CheckRecipe(chamId, recipeContent, out reasons2);
- //reasons1.AddRange(reasons2);
- //if (reasons1.Count > 0)
- //{
- // EventDialog(string.Format( Resources.RecipeFileManager_SaveRecipe_SaveRecipeContentError, recipeName), reasons1);
- //}
- bool ret = true;
- try
- {
- var path = GenerateBackupParameterFilePath(chamId, parameterName);
- FileInfo fi = new FileInfo(path);
- if (!fi.Directory.Exists)
- fi.Directory.Create();
- XmlDocument xml = new XmlDocument();
- xml.LoadXml(parameterContent);
- XmlTextWriter writer = new XmlTextWriter(path, Encoding.UTF8);
- writer.Formatting = Formatting.Indented;
- xml.Save(writer);
- writer.Close();
- if (notifyUI)
- {
- InfoDialog(string.Format(Resources.RecipeFileManager_SaveRecipe_RecipeFile0SaveCompleted, parameterName));
- }
- else
- {
- EV.PostMessage("System", EventEnum.GeneralInfo, string.Format(Resources.RecipeFileManager_SaveRecipe_RecipeFile0SaveCompleted, parameterName));
- }
- }
- catch (Exception ex)
- {
- LOG.Write(ex, "保存recipe file 出错");
- if (notifyUI)
- {
- WarningDialog(string.Format(Resources.RecipeFileManager_SaveRecipe_RecipeFile0SaveFailed, parameterName));
- }
- ret = false;
- }
- return ret;
- }
- /// <summary>
- /// create a new recipe folder
- /// </summary>
- /// <param name="chamId"></param>
- /// <param name="folderName"></param>
- /// <returns></returns>
- public bool CreateFolder(string chamId, string folderName)
- {
- try
- {
- Directory.CreateDirectory(getParameterDirPath(chamId) + folderName);
- EventInfo(string.Format(Resources.RecipeFileManager_CreateFolder_RecipeFolder0Created, folderName));
- }
- catch (Exception ex)
- {
- LOG.Write(ex, "create recipe folder failed");
- EventAlarm(string.Format(Resources.RecipeFileManager_CreateFolder_RecipeFolder0CreateFailed, folderName));
- return false;
- }
- return true;
- }
- /// <summary>
- /// Rename recipe folder name
- /// </summary>
- /// <param name="chamId"></param>
- /// <param name="oldName"></param>
- /// <param name="newName"></param>
- /// <returns></returns>
- public bool RenameFolder(string chamId, string oldName, string newName)
- {
- try
- {
- string oldPath = getParameterDirPath(chamId) + oldName;
- string newPath = getParameterDirPath(chamId) + newName;
- Directory.Move(oldPath, newPath);
- EventInfo(string.Format(Resources.RecipeFileManager_RenameFolder_RecipeFolder0renamed, oldName, newName));
- }
- catch (Exception ex)
- {
- LOG.Write(ex, "Rename recipe folder failed");
- EventAlarm(string.Format(Resources.RecipeFileManager_RenameFolder_RecipeFolder0RenameFailed, oldName, newName));
- return false;
- }
- return true;
- }
- public XmlDocument ParameterDom = new XmlDocument();
- private string GetParameterBody(string chamberId, string nodePath)
- {
- if (_rcpContext == null)
- return string.Empty;
- string schema = _rcpContext.GetParameterDefiniton(chamberId);
- ParameterDom = new XmlDocument();
- ParameterDom.LoadXml(schema);
- XmlNode node = ParameterDom.SelectSingleNode(nodePath);
- return node.OuterXml;
- }
- public string ChamberType
- {
- get;
- set;
- }
- public string Version
- {
- get;
- set;
- }
- public int TableNumber
- {
- get;
- set;
- }
- public Dictionary<string, ObservableCollection<ParameterTemplateColumnBase>> GetGroupParameterTemplate()
- {
- try
- {
- XmlNode nodeRoot = ParameterDom.SelectSingleNode("Aitex/TableParameterFormat");
- ChamberType = nodeRoot.Attributes["ChamberType"].Value;
- Version = nodeRoot.Attributes["Version"].Value;
- TableNumber = nodeRoot.Attributes["TableNumber"] != null ? Convert.ToInt32(nodeRoot.Attributes["TableNumber"].Value) : 0;
- }
- catch (Exception ex)
- {
- LOG.Write(ex);
- return null;
- }
- var columns = new Dictionary<string, ObservableCollection<ParameterTemplateColumnBase>>();
- ParameterTemplateColumnBase col = null;
- XmlNodeList nodes = ParameterDom.SelectNodes("Aitex/TableParameterFormat/Catalog/Group");
- foreach (XmlNode node in nodes)
- {
- XmlNodeList childNodes = node.SelectNodes("Step");
- int tableNum = 1;
- string nameList = null;
- if (node.Attributes["TableNumber"] != null)
- {
- tableNum = Convert.ToInt32(node.Attributes["TableNumber"].Value);
- }
- if (node.Attributes["NameList"] != null)
- {
- nameList = node.Attributes["NameList"].Value.Replace("\t\t\t\t ", "").Replace("\n", "").Replace("\r", "");
- }
- if (nameList != null && nameList.Contains(","))
- {
- tableNum = tableNum > nameList.Split(',').Length ? tableNum : nameList.Split(',').Length;
- }
- string[] namelist = new string[tableNum];
- for (int i = 0; i < namelist.Length; i++)
- {
- namelist[i] = "";
- }
- if (!string.IsNullOrEmpty(nameList))
- {
- var list = nameList.Split(',');
- for (int i = 0; i < list.Length; i++)
- {
- namelist[i] = list[i];
- }
- }
- for (int i = 1; i <= tableNum; i++)
- {
- var sigcolumns = new ObservableCollection<ParameterTemplateColumnBase>();
- foreach (XmlNode step in childNodes)
- {
- //step number
- if (step.Attributes["ControlName"].Value == "TableNo")
- {
- col = new ParameterTemplateColumnBase()
- {
- DisplayName = "Table",
- ControlName = "TableNo",
- };
- sigcolumns.Add(col);
- continue;
- }
- switch (step.Attributes["InputType"].Value)
- {
- case "TextInput":
- col = new ParameterTemplateColumnBase()
- {
- ValueType = "TextInput",
- ModuleName = step.Attributes["ModuleName"].Value,
- ControlName = step.Attributes["ControlName"].Value,
- DisplayName = step.Attributes["DisplayName"].Value,
- IsEnable = !bool.Parse(step.Attributes["ReadOnly"] != null ? step.Attributes["ReadOnly"].Value : "false"),
- EnableConfig = step.Attributes["EnableConfig"] != null && Convert.ToBoolean(step.Attributes["EnableConfig"].Value),
- Default = step.Attributes["DefaultValue"] != null ? step.Attributes["DefaultValue"].Value : "",
- EnableTolerance = step.Attributes["EnableTolerance"] != null && Convert.ToBoolean(step.Attributes["EnableTolerance"].Value),
- };
- sigcolumns.Add(col);
- break;
- case "NumInput":
- col = new ParameterTemplateColumnBase()
- {
- ValueType = "NumInput",
- ModuleName = step.Attributes["ModuleName"].Value,
- ControlName = step.Attributes["ControlName"].Value,
- DisplayName = step.Attributes["DisplayName"].Value,
- InputMode = step.Attributes["InputMode"].Value,
- Minimun = double.Parse(step.Attributes["Min"].Value),
- Maximun = double.Parse(step.Attributes["Max"].Value),
- Value = step.Attributes["DefaultValue"] != null ? Convert.ToInt32(step.Attributes["DefaultValue"].Value) : 0,
- IsEnable = !bool.Parse(step.Attributes["ReadOnly"] != null ? step.Attributes["ReadOnly"].Value : "false"),
- EnableConfig = step.Attributes["EnableConfig"] != null && Convert.ToBoolean(step.Attributes["EnableConfig"].Value),
- EnableTolerance = step.Attributes["EnableTolerance"] != null && Convert.ToBoolean(step.Attributes["EnableTolerance"].Value),
- };
- sigcolumns.Add(col);
- break;
- case "DoubleInput":
- col = new ParameterTemplateColumnBase()
- {
- ValueType = "DoubleInput",
- ModuleName = step.Attributes["ModuleName"].Value,
- ControlName = step.Attributes["ControlName"].Value,
- DisplayName = step.Attributes["DisplayName"].Value,
- InputMode = step.Attributes["InputMode"].Value,
- Minimun = double.Parse(step.Attributes["Min"].Value),
- Maximun = double.Parse(step.Attributes["Max"].Value),
- Value = step.Attributes["DefaultValue"] != null ? Convert.ToDouble(step.Attributes["DefaultValue"].Value) : 0.0f,
- IsEnable = !bool.Parse(step.Attributes["ReadOnly"] != null ? step.Attributes["ReadOnly"].Value : "false"),
- EnableConfig = step.Attributes["EnableConfig"] != null && Convert.ToBoolean(step.Attributes["EnableConfig"].Value),
- EnableTolerance = step.Attributes["EnableTolerance"] != null && Convert.ToBoolean(step.Attributes["EnableTolerance"].Value),
- };
- sigcolumns.Add(col);
- break;
- case "EditableSelection":
- col = new ParameterTemplateColumnBase()
- {
- ValueType = "EditableSelection",
- ModuleName = step.Attributes["ModuleName"].Value,
- Default = step.Attributes["Default"] != null ? step.Attributes["Default"].Value : "",
- ControlName = step.Attributes["ControlName"].Value,
- DisplayName = step.Attributes["DisplayName"].Value,
- IsEnable = !bool.Parse(step.Attributes["ReadOnly"] != null ? step.Attributes["ReadOnly"].Value : "false"),
- EnableConfig = step.Attributes["EnableConfig"] != null && Convert.ToBoolean(step.Attributes["EnableConfig"].Value),
- EnableTolerance = step.Attributes["EnableTolerance"] != null && Convert.ToBoolean(step.Attributes["EnableTolerance"].Value),
- };
- XmlNodeList items = step.SelectNodes("Item");
- foreach (XmlNode item in items)
- {
- Option opt = new Option();
- opt.ControlName = item.Attributes["ControlName"].Value;
- opt.DisplayName = item.Attributes["DisplayName"].Value;
- ((ParameterTemplateColumnBase)col).Options.Add(opt);
- }
- sigcolumns.Add(col);
- break;
- case "ReadOnlySelection":
- case "LoopSelection":
- col = new ParameterTemplateColumnBase()
- {
- ValueType = "LoopSelection",
- IsReadOnly = bool.Parse(step.Attributes["ReadOnly"] != null ? step.Attributes["ReadOnly"].Value : "false"),
- ModuleName = step.Attributes["ModuleName"].Value,
- ControlName = step.Attributes["ControlName"].Value,
- DisplayName = step.Attributes["DisplayName"].Value,
- EnableConfig = step.Attributes["EnableConfig"] != null && Convert.ToBoolean(step.Attributes["EnableConfig"].Value),
- EnableTolerance = step.Attributes["EnableTolerance"] != null && Convert.ToBoolean(step.Attributes["EnableTolerance"].Value),
- };
- XmlNodeList options = step.SelectNodes("Item");
- foreach (XmlNode item in options)
- {
- Option opt = new Option();
- opt.ControlName = item.Attributes["ControlName"].Value;
- opt.DisplayName = item.Attributes["DisplayName"].Value;
- ((ParameterTemplateColumnBase)col).Options.Add(opt);
- }
- sigcolumns.Add(col);
- break;
- case "PopSetting":
- col = new ParameterTemplateColumnBase()
- {
- ValueType = "LoopSelection",
- ModuleName = step.Attributes["ModuleName"].Value,
- ControlName = step.Attributes["ControlName"].Value,
- DisplayName = step.Attributes["DisplayName"].Value,
- EnableConfig = step.Attributes["EnableConfig"] != null && Convert.ToBoolean(step.Attributes["EnableConfig"].Value),
- EnableTolerance = step.Attributes["EnableTolerance"] != null && Convert.ToBoolean(step.Attributes["EnableTolerance"].Value),
- };
- sigcolumns.Add(col);
- break;
- }
- }
- if (tableNum == 1 && string.IsNullOrEmpty(nameList))
- {
- columns.Add(node.Attributes["DisplayName"].Value, sigcolumns);
- }
- else if (tableNum == 1 && !string.IsNullOrEmpty(nameList))
- {
- columns.Add($"{node.Attributes["DisplayName"].Value}\t1\t{namelist[0]}", sigcolumns);
- }
- else
- {
- columns.Add($"{node.Attributes["DisplayName"].Value}\t{i}\t{namelist[i - 1]}", sigcolumns);
- }
- }
- }
- return columns;
- }
- /// <summary>
- /// get reactor's recipe format define file
- /// </summary>
- /// <param name="chamId"></param>
- /// <returns></returns>
- public string GetParameterFormatXml(string chamberId)
- {
- var rtn = GetParameterBody(chamberId, "/Aitex/TableParameterFormat");
- return rtn;
- }
- /// <summary>
- /// get reactor's template recipe file
- /// </summary>
- /// <param name="chamId"></param>
- /// <returns></returns>
- public string GetParameterTemplate(string chamberId)
- {
- if (_rcpContext != null)
- return _rcpContext.GetParameterTemplate(chamberId);
- return GetParameterBody(chamberId, "/Aitex/TableParameterData");
- }
- /// <summary>
- /// get reactor's template recipe file
- /// </summary>
- /// <param name="chamId"></param>
- /// <returns></returns>
- public string GetParameterSchema(string chamberId)
- {
- if (_rcpContext == null)
- return string.Empty;
- string schema = _rcpContext.GetParameterDefiniton(chamberId);
- XmlDocument dom = new XmlDocument();
- dom.LoadXml(schema);
- XmlNode node = dom.SelectSingleNode("/Aitex/TableParameterSchema");
- return node.InnerXml;
- }
- public string GetParameterByBarcode(string chamberId, string barcode)
- {
- try
- {
- string parameterPath = PathManager.GetRecipeDir() + chamberId + "\\";
- var di = new DirectoryInfo(parameterPath);
- var fis = di.GetFiles("*.rcp", SearchOption.AllDirectories);
- XmlDocument xml = new XmlDocument();
- foreach (var fi in fis)
- {
- string str = fi.FullName.Substring(parameterPath.Length);
- if (!str.Contains("HistoryParameter\\"))
- {
- xml.Load(fi.FullName);
- if (xml.SelectSingleNode(string.Format("/TableParameterData[@Barcode='{0}']", barcode)) != null)
- {
- return str.Substring(0, str.LastIndexOf('.'));
- }
- }
- }
- return string.Empty;
- }
- catch (Exception ex)
- {
- LOG.Write(ex);
- return string.Empty;
- }
- }
- public List<FileNodeItem> GetFileNodeParameterListByPath(string chamberId)
- {
- List<FileNodeItem> files = new List<FileNodeItem>();
- var baseFolderPath = getParameterDirPath(chamberId);
- DirectoryInfo curFolderInfo = new DirectoryInfo(baseFolderPath);
- FileNodeItem nodeItem = new FileNodeItem();
- nodeItem.IsFile = false;
- GenerateFileNodeParameterList(chamberId, curFolderInfo, nodeItem);
- files.Add(nodeItem);
- return files;
- }
- FileNodeItem GenerateFileNodeParameterList(string chamberId, DirectoryInfo currentDir, FileNodeItem nodeItem)
- {
- int trimLength = getParameterDirPath(chamberId).Length;
- DirectoryInfo[] dirInfos = currentDir.GetDirectories();
- foreach (DirectoryInfo dirInfo in dirInfos)
- {
- GenerateFileNodeParameterList(chamberId, dirInfo, nodeItem);
- }
- FileInfo[] fileInfos = currentDir.GetFiles("*.rcp");
- foreach (FileInfo fileInfo in fileInfos)
- {
- string fileStr = fileInfo.FullName.Substring(trimLength).TrimStart(new char[] { '\\' }); ;
- FileNodeItem subNodeItem = new FileNodeItem();
- subNodeItem.Name = fileInfo.Name.Replace(".rcp", "");
- subNodeItem.FullPath = subNodeItem.Name;
- subNodeItem.PrefixPath = chamberId;
- subNodeItem.IsFile = true;
- ReadFileSetFileNode(chamberId, subNodeItem.Name, subNodeItem);
- nodeItem.Files.Add(subNodeItem);
- }
- return nodeItem;
- }
- private void ReadFileSetFileNode(string chamberId,string fileName, FileNodeItem fileNodeItem)
- {
- string content = LoadParameter(chamberId, fileName, false);
- XmlDocument _doc = new XmlDocument();
- _doc.LoadXml(content);
- XmlElement nodeData = _doc.SelectSingleNode($"Aitex/TableParameterData") as XmlElement;
- fileNodeItem.Creator = nodeData.GetAttribute("CreatedBy");
- fileNodeItem.Description = nodeData.GetAttribute("Description");
- fileNodeItem.CreatTime = nodeData.GetAttribute("CreationTime");
- fileNodeItem.ReviseTime = nodeData.GetAttribute("LastRevisionTime");
- fileNodeItem.Revisor = nodeData.GetAttribute("LastRevisedBy");
- fileNodeItem.Permission = nodeData.GetAttribute("Permission");
- fileNodeItem.Level = nodeData.GetAttribute("Level");
- fileNodeItem.IsChecked = nodeData.GetAttribute("CheckResult") == "Correct";
- }
- }
- }
|