RecipeService.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ServiceModel;
  4. using Aitex.Core.RT.Event;
  5. using Aitex.Core.RT.Key;
  6. using Aitex.Core.RT.OperationCenter;
  7. using Aitex.Core.RT.RecipeCenter;
  8. using MECF.Framework.Common.Equipment;
  9. using Aitex.Core.RT.Log;
  10. using System.Collections.ObjectModel;
  11. using System.Reflection;
  12. using Newtonsoft.Json;
  13. using Aitex.Common.Util;
  14. using System.IO;
  15. namespace MECF.Framework.Common.RecipeCenter
  16. {
  17. public class RecipeService : IRecipeService
  18. {
  19. /// <summary>
  20. /// Load a recipe from server to client for editing.
  21. /// </summary>
  22. /// <param name="chamId"></param>
  23. /// <param name="recipeName"></param>
  24. /// <returns></returns>
  25. public string LoadRecipe(ModuleName chamId, string recipeName)
  26. {
  27. LOG.Write(eEvent.EV_SEQUENCE, ModuleName.System, string.Format("Read {0} Recipe: {1}", chamId, recipeName));
  28. return RecipeFileManager.Instance.LoadRecipe(chamId.ToString(), recipeName, false);
  29. }
  30. /// <summary>
  31. /// Delete a recipe by recipe name
  32. /// </summary>
  33. /// <param name="chamId"></param>
  34. /// <param name="recipeName"></param>
  35. /// <returns></returns>
  36. public bool DeleteRecipe(ModuleName chamId, string recipeName)
  37. {
  38. if (CheckSoftwareExpired())
  39. return false;
  40. //if (!ChamberOperationService.IsSuperEnter()) return false;
  41. LOG.Write(eEvent.EV_SEQUENCE, ModuleName.System, string.Format("Delete {0} Recipe: {1}", chamId, recipeName));
  42. return RecipeFileManager.Instance.DeleteRecipe(chamId.ToString(), recipeName);
  43. }
  44. /// <summary>
  45. /// Get recipe list in xml format
  46. /// </summary>
  47. /// <param name="chamId"></param>
  48. /// <param name="includingUsedRecipe"></param>
  49. /// <returns></returns>
  50. public string GetXmlRecipeList(ModuleName chamId, bool includingUsedRecipe)
  51. {
  52. return RecipeFileManager.Instance.GetXmlRecipeList(chamId.ToString(), includingUsedRecipe);
  53. }
  54. /// <summary>
  55. /// Get recipe data by recipe name
  56. /// </summary>
  57. /// <param name="chamId"></param>
  58. /// <param name="includingUsedRecipe"></param>
  59. /// <returns></returns>
  60. public IEnumerable<string> GetRecipes(ModuleName chamId, bool includingUsedRecipe)
  61. {
  62. return RecipeFileManager.Instance.GetRecipes(chamId.ToString(), includingUsedRecipe);
  63. }
  64. public ObservableCollection<RecipeNode> GetRecipesByType(string recipeType)
  65. {
  66. return RecipeFileManager.Instance.GetRecipesByType(recipeType);
  67. }
  68. /// <summary>
  69. /// 加载工程指定类型的Recipe
  70. /// </summary>
  71. /// <param name="recipeType"></param>
  72. /// <returns></returns>
  73. public ObservableCollection<RecipeNode> GetEngineeringRecipesByType(string recipeType)
  74. {
  75. return RecipeFileManager.Instance.GetEngineeringRecipesByType(recipeType);
  76. }
  77. /// <summary>
  78. /// 获取目录集合Recipe节点
  79. /// </summary>
  80. /// <param name="directories"></param>
  81. /// <returns></returns>
  82. public ObservableCollection<RecipeNode> GetRecipeByDirectoryList(List<string> directories)
  83. {
  84. return RecipeFileManager.Instance.GetRecipeByDirectoryList(directories);
  85. }
  86. /// <summary>
  87. /// 通过绝对路径删除recipe
  88. /// </summary>
  89. /// <param name="fullPath"></param>
  90. /// <returns></returns>
  91. public bool DeleteRecipeByFullPath(string fullPath)
  92. {
  93. return RecipeFileManager.Instance.DeleteRecipeByFullPath(fullPath);
  94. }
  95. /// <summary>
  96. /// promote recipe
  97. /// </summary>
  98. /// <param name="FilePaths"></param>
  99. /// <returns></returns>
  100. public bool PromoteRecipe(List<string> FilePaths)
  101. {
  102. return RecipeFileManager.Instance.PromoteRecipe(FilePaths);
  103. }
  104. /// <summary>
  105. /// 加载 Recipe
  106. /// </summary>
  107. /// <param name="recipeFullName"></param>
  108. /// <returns></returns>
  109. public string LoadGenericityRecipe(string type, string recipeFullName)
  110. {
  111. Type dataType=Type.GetType(type);
  112. Type t = typeof(RecipeFileManager);
  113. MethodInfo loadGenaricityRecipeMethod = t.GetMethod("LoadGenericityRecipe");
  114. if(loadGenaricityRecipeMethod!=null)
  115. {
  116. MethodInfo methodInfo =loadGenaricityRecipeMethod.MakeGenericMethod(dataType);
  117. var obj= methodInfo.Invoke(RecipeFileManager.Instance, new object[] { recipeFullName });
  118. string str= JsonConvert.SerializeObject(obj,dataType,new JsonSerializerSettings() { NullValueHandling=NullValueHandling.Ignore});
  119. return str;
  120. }
  121. return null;
  122. }
  123. /// <summary>
  124. /// 保存Hvd Recipe
  125. /// </summary>
  126. /// <param name="recipeFullName"></param>
  127. /// <returns></returns>
  128. public void SaveRecipeTypeRecipe(string root, string recipeName,string recipeType,string recipe,string dataType)
  129. {
  130. Type type = Type.GetType(dataType);
  131. object obj = JsonConvert.DeserializeObject(recipe,type,new JsonSerializerSettings());
  132. Type t = typeof(RecipeFileManager);
  133. MethodInfo saveGenaricityRecipeMethod = t.GetMethod("SaveGenericityRecipe");
  134. if (saveGenaricityRecipeMethod != null)
  135. {
  136. saveGenaricityRecipeMethod.Invoke(RecipeFileManager.Instance, new object[] { root,recipeName,recipeType,obj });
  137. }
  138. }
  139. /// <summary>
  140. /// Get recipe data by recipe name
  141. /// </summary>
  142. /// <param name="chamId"></param>
  143. /// <param name="includingUsedRecipe"></param>
  144. /// <returns></returns>
  145. public IEnumerable<string> GetAllRecipes(string chamId)
  146. {
  147. return RecipeFileManager.Instance.GetRecipes(chamId, true);
  148. }
  149. /// <summary>
  150. /// Rename recipe
  151. /// </summary>
  152. /// <param name="chamId"></param>
  153. /// <param name="oldName"></param>
  154. /// <param name="newName"></param>
  155. /// <returns></returns>
  156. public bool RenameRecipe(ModuleName chamId, string oldName, string newName)
  157. {
  158. if (CheckSoftwareExpired())
  159. return false;
  160. LOG.Write(eEvent.EV_SEQUENCE, ModuleName.System, string.Format("Rename {0} Recipe {1}为{2}", chamId, oldName, newName));
  161. //if (!ChamberOperationService.IsSuperEnter()) return false;
  162. return RecipeFileManager.Instance.RenameRecipe(chamId.ToString(), oldName, newName);
  163. }
  164. /// <summary>
  165. /// delete a recipe folder
  166. /// </summary>
  167. /// <param name="chamId"></param>
  168. /// <param name="folderName"></param>
  169. /// <returns></returns>
  170. public bool DeleteFolder(ModuleName chamId, string folderName)
  171. {
  172. if (CheckSoftwareExpired())
  173. return false;
  174. //if (!ChamberOperationService.IsSuperEnter()) return false;
  175. LOG.Write(eEvent.EV_SEQUENCE, ModuleName.System, string.Format("Delete {0} Recipe Folder: {1}", chamId, folderName));
  176. return RecipeFileManager.Instance.DeleteFolder(chamId.ToString(), folderName);
  177. }
  178. /// <summary>
  179. /// save recipe content
  180. /// </summary>
  181. /// <param name="chamId"></param>
  182. /// <param name="recipeName"></param>
  183. /// <param name="recipeContent"></param>
  184. /// <returns></returns>
  185. public bool SaveRecipe(ModuleName chamId, string recipeName, string recipeContent)
  186. {
  187. if (CheckSoftwareExpired())
  188. return false;
  189. LOG.Write(eEvent.EV_SEQUENCE, ModuleName.System, string.Format("Modify and save {0} Recipe: {1}", chamId, recipeName));
  190. return RecipeFileManager.Instance.SaveRecipe(chamId.ToString(), recipeName, recipeContent, false, false);
  191. }
  192. /// <summary>
  193. /// move recipe content
  194. /// </summary>
  195. /// <param name="chamId"></param>
  196. /// <param name="recipeName"></param>
  197. /// <returns></returns>
  198. public bool MoveRecipeFile(ModuleName chamId, string recipeName, string tragetFolderName)
  199. {
  200. if (CheckSoftwareExpired())
  201. return false;
  202. LOG.Write(eEvent.EV_SEQUENCE, ModuleName.System, string.Format("Move {0} recipe :{1}", chamId, recipeName));
  203. return RecipeFileManager.Instance.MoveRecipeFile(chamId.ToString(), recipeName, tragetFolderName, false, false);
  204. }
  205. /// <summary>
  206. /// save recipe content
  207. /// </summary>
  208. /// <param name="chamId"></param>
  209. /// <param name="recipeName"></param>
  210. /// <param name="recipeContent"></param>
  211. /// <returns></returns>
  212. public bool SaveAsRecipe(ModuleName chamId, string recipeName, string recipeContent)
  213. {
  214. if (CheckSoftwareExpired())
  215. return false;
  216. LOG.Write(eEvent.EV_SEQUENCE, ModuleName.System, string.Format("Modify and save as {0} recipe {1}", chamId, recipeName));
  217. return RecipeFileManager.Instance.SaveAsRecipe(chamId.ToString(), recipeName, recipeContent);
  218. }
  219. /// <summary>
  220. /// save recipe content
  221. /// </summary>
  222. /// <param name="chamId"></param>
  223. /// <param name="recipeName"></param>
  224. /// <param name="recipeContent"></param>
  225. /// <returns></returns>
  226. public bool SaveAsRecipe2(ModuleName chamId,string type, string recipeName, string recipeContent)
  227. {
  228. if (CheckSoftwareExpired())
  229. return false;
  230. LOG.Write(eEvent.EV_SEQUENCE, ModuleName.System, string.Format("Modify and save as {0} recipe {1}", chamId, recipeName));
  231. return RecipeFileManager.Instance.SaveAsRecipe2(chamId.ToString(),type, recipeName, recipeContent);
  232. }
  233. /// <summary>
  234. /// create a new recipe folder
  235. /// </summary>
  236. /// <param name="chamId"></param>
  237. /// <param name="folderName"></param>
  238. /// <returns></returns>
  239. public bool CreateFolder(ModuleName chamId, string folderName)
  240. {
  241. if (CheckSoftwareExpired())
  242. return false;
  243. LOG.Write(eEvent.EV_SEQUENCE, ModuleName.System, string.Format("Create {0} recipe foler {1}", chamId, folderName));
  244. return RecipeFileManager.Instance.CreateFolder(chamId.ToString(), folderName);
  245. }
  246. /// <summary>
  247. /// Rename recipe folder name
  248. /// </summary>
  249. /// <param name="chamId"></param>
  250. /// <param name="oldName"></param>
  251. /// <param name="newName"></param>
  252. /// <returns></returns>
  253. public bool RenameFolder(ModuleName chamId, string oldName, string newName)
  254. {
  255. if (CheckSoftwareExpired())
  256. return false;
  257. LOG.Write(eEvent.EV_SEQUENCE, ModuleName.System, string.Format("Rename {0} recipe folder {1} to {2}", chamId, oldName, newName));
  258. return RecipeFileManager.Instance.RenameFolder(chamId.ToString(), oldName, newName);
  259. }
  260. private bool CheckSoftwareExpired()
  261. {
  262. bool isExpired = KeyManager.Instance.IsExpired;
  263. if (isExpired)
  264. LOG.Write(eEvent.WARN_SEQUENCE,ModuleName.System, "Software is expired. Can not do the operation");
  265. return isExpired;
  266. }
  267. /// <summary>
  268. /// get reactor's recipe format define file
  269. /// </summary>
  270. /// <param name="chamId"></param>
  271. /// <returns></returns>
  272. public string GetRecipeFormatXml(ModuleName chamId)
  273. {
  274. return RecipeFileManager.Instance.GetRecipeFormatXml(chamId.ToString());
  275. }
  276. /// <summary>
  277. /// get reactor's template recipe file
  278. /// </summary>
  279. /// <param name="chamId"></param>
  280. /// <returns></returns>
  281. public string GetRecipeTemplate(ModuleName chamId)
  282. {
  283. return RecipeFileManager.Instance.GetRecipeTemplate(chamId.ToString());
  284. }
  285. /// <summary>
  286. /// 获取当前反应腔正在运行的Recipe信息
  287. /// </summary>
  288. /// <param name="chamId"></param>
  289. /// <returns>recipeName + recipeContent</returns>
  290. public Tuple<string, string> LoadRunTimeRecipeInfo(ModuleName chamId)
  291. {
  292. return null;
  293. //var pm = PmManager.GetReactor(chamId);
  294. //if (pm != null) return pm.LoadRunTimeRecipeInfo();
  295. //return Singleton<PMEntity>.Instance.GetRecipeInfo();
  296. }
  297. public string GetRecipeByBarcode(ModuleName chamId, string barcode)
  298. {
  299. return "";
  300. //return RecipeFileManager.Instance.GetRecipeByBarcode(chamId.ToString(), barcode);
  301. }
  302. public string GetXmlSequenceList(ModuleName chamId )
  303. {
  304. return RecipeFileManager.Instance.GetXmlSequenceList(chamId.ToString() );
  305. }
  306. public string GetSequence(string sequenceName)
  307. {
  308. return RecipeFileManager.Instance.GetSequence(sequenceName, true);
  309. }
  310. public List<string> GetSequenceNameList()
  311. {
  312. return RecipeFileManager.Instance.GetSequenceNameList();
  313. }
  314. public bool DeleteSequence(string sequenceName)
  315. {
  316. return RecipeFileManager.Instance.DeleteSequence(sequenceName);
  317. }
  318. public bool SaveSequence(string sequenceName, string sequenceContent)
  319. {
  320. return RecipeFileManager.Instance.SaveSequence(sequenceName, sequenceContent, false);
  321. }
  322. public bool SaveAsSequence(string sequenceName, string sequenceContent)
  323. {
  324. return RecipeFileManager.Instance.SaveAsSequence(sequenceName, sequenceContent);
  325. }
  326. public bool RenameSequence(string oldName, string newName)
  327. {
  328. return RecipeFileManager.Instance.RenameSequence(oldName, newName);
  329. }
  330. public string GetSequenceFormatXml()
  331. {
  332. return RecipeFileManager.Instance.GetSequenceFormatXml();
  333. }
  334. public bool RenameSequenceFolder(string oldName, string newName)
  335. {
  336. return RecipeFileManager.Instance.RenameSequenceFolder(oldName, newName);
  337. }
  338. public bool CreateSequenceFolder(string folderName)
  339. {
  340. return RecipeFileManager.Instance.CreateSequenceFolder(folderName);
  341. }
  342. public bool DeleteSequenceFolder(string folderName)
  343. {
  344. return RecipeFileManager.Instance.DeleteSequenceFolder(folderName);
  345. }
  346. #region extended recipe interface
  347. public string LoadRecipeByPath(string path)
  348. {
  349. return RecipeFileManager.Instance.LoadRecipeByPath(path);
  350. }
  351. public bool DeleteRecipeByPath(string pathName, string recipeName)
  352. {
  353. return RecipeFileManager.Instance.DeleteRecipe(pathName, recipeName);
  354. }
  355. public string GetXmlRecipeListByPath(string pathName, bool includingUsedRecipe)
  356. {
  357. return RecipeFileManager.Instance.GetXmlRecipeList(pathName, includingUsedRecipe);
  358. }
  359. public IEnumerable<string> GetRecipesByPath(string pathName, bool includingUsedRecipe)
  360. {
  361. return RecipeFileManager.Instance.GetRecipes(pathName, includingUsedRecipe);
  362. }
  363. public bool RenameRecipeByPath(string pathName, string oldName, string newName)
  364. {
  365. return RecipeFileManager.Instance.RenameRecipe(pathName, oldName, newName);
  366. }
  367. public bool DeleteFolderByPath(string pathName, string folderName)
  368. {
  369. return RecipeFileManager.Instance.DeleteFolder(pathName, folderName);
  370. }
  371. public bool SaveRecipeByPath(string pathName, string recipeName, string recipeContent)
  372. {
  373. return RecipeFileManager.Instance.SaveRecipe(pathName, recipeName, recipeContent, false, false);
  374. }
  375. public bool SaveAsRecipeByPath(string pathName, string recipeName, string recipeContent)
  376. {
  377. return RecipeFileManager.Instance.SaveAsRecipe(pathName, recipeName, recipeContent);
  378. }
  379. public bool CreateFolderByPath(string pathName, string folderName)
  380. {
  381. return RecipeFileManager.Instance.CreateFolder(pathName, folderName);
  382. }
  383. public bool RenameFolderByPath(string pathName, string oldName, string newName)
  384. {
  385. return RecipeFileManager.Instance.RenameFolder(pathName, oldName, newName);
  386. }
  387. public string GetRecipeFormatXmlByPath(string pathName)
  388. {
  389. return RecipeFileManager.Instance.GetRecipeFormatXml(pathName);
  390. }
  391. public string GetRecipeTemplateByPath(string pathName)
  392. {
  393. return RecipeFileManager.Instance.GetRecipeTemplate(pathName);
  394. }
  395. public Tuple<string, string> LoadRunTimeRecipeInfoByPath(string pathName)
  396. {
  397. return null;
  398. }
  399. public string GetRecipeByBarcodeByPath(string pathName, string barcode)
  400. {
  401. return "";
  402. }
  403. public void SaveRecipe(string root, string recipeName, string recipeType, object recipe)
  404. {
  405. throw new NotImplementedException();
  406. }
  407. public List<string> GetSequenceList(string recipeType, string sequenceType)
  408. {
  409. return RecipeFileManager.Instance.GetSequenceList(recipeType, sequenceType);
  410. }
  411. #endregion
  412. }
  413. }