F_PC_0203.cs 98 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169
  1. /*******************************************************************************
  2. * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential
  3. * 类的信息:
  4. * 1.程序名称:F_PC_0203.cs
  5. * 2.功能描述:生产线配置编辑界面
  6. * 编辑履历:
  7. * 作者 日期 版本 修改内容
  8. * 王鑫 2015/03/27 1.00 新建
  9. *******************************************************************************/
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Data;
  13. using System.Drawing;
  14. using System.Windows.Forms;
  15. using System.Linq;
  16. using Dongke.IBOSS.Basics.FlowSetting;
  17. using Dongke.IBOSS.PRD.Basics.BaseControls;
  18. using Dongke.IBOSS.PRD.Basics.BaseResources;
  19. using Dongke.IBOSS.PRD.Client.CommonModule;
  20. using Dongke.IBOSS.PRD.WCF.Proxys;
  21. using Dongke.IBOSS.PRD.WCF.Proxys.PCModuleService;
  22. using Dongke.IBOSS.PRD.WCF.DataModels;
  23. namespace Dongke.IBOSS.PRD.Client.PCModule
  24. {
  25. /// <summary>
  26. /// 生产线配置
  27. /// </summary>
  28. public partial class F_PC_0203 : FormBase
  29. {
  30. #region 成员变量
  31. private int _lineID = -1; //生产线ID
  32. private string _lineCode; //生产线编码
  33. private string _lineName; //生产线名称
  34. private string _remarks; //备注
  35. private int _valueflag; //启用、禁用标记
  36. private Constant.FormMode _editStatus; //窗体编辑状态
  37. private List<int> _IDList = new List<int>(); // ID集合
  38. private DataSet productionDataSet = null; //生产配置数据集
  39. private int _ValueFlagRow = 0; //工序标识禁用的行数
  40. private DateTime _optimestamp; // 时间戳
  41. private string _productionlinecode; //保存成功后回显的生产线编码
  42. private int? _nodeno; //节点唯一值
  43. FlowNode _currentnode = null; //当前弹出节点
  44. private bool _hasClose = false;
  45. #endregion
  46. #region 属性
  47. /// <summary>
  48. /// 生产配置数据
  49. /// </summary>
  50. public DataSet ProductionDataSet
  51. {
  52. get
  53. {
  54. return this.productionDataSet;
  55. }
  56. set
  57. {
  58. this.productionDataSet = value;
  59. }
  60. }
  61. /// <summary>
  62. /// ID集合
  63. /// </summary>
  64. public List<int> IDList
  65. {
  66. get { return _IDList; }
  67. set { _IDList = value; }
  68. }
  69. /// <summary>
  70. /// 时间戳
  71. /// </summary>
  72. public DateTime OPTimeStamp
  73. {
  74. get
  75. {
  76. return _optimestamp;
  77. }
  78. set
  79. {
  80. _optimestamp = value;
  81. }
  82. }
  83. /// <summary>
  84. /// 保存成功后回显的生产线编码
  85. /// </summary>
  86. public string ProductionlineCode
  87. {
  88. get
  89. {
  90. return _productionlinecode;
  91. }
  92. set
  93. {
  94. _productionlinecode = value;
  95. }
  96. }
  97. #endregion
  98. #region 构造函数
  99. public F_PC_0203(Constant.FormMode editStatus, int lineID, string lineCode, string lineName, string remarks, int valueflag)
  100. {
  101. InitializeComponent();
  102. this._lineID = lineID;
  103. this._lineCode = lineCode;
  104. this._lineName = lineName;
  105. this._remarks = remarks;
  106. this._valueflag = valueflag;
  107. this._editStatus = editStatus;
  108. }
  109. public F_PC_0203(Constant.FormMode editStatus, int lineID, string lineCode, string lineName, string remarks, int valueflag, int? nodeno)
  110. {
  111. InitializeComponent();
  112. this._lineID = lineID;
  113. this._lineCode = lineCode;
  114. this._lineName = lineName;
  115. this._remarks = remarks;
  116. this._valueflag = valueflag;
  117. this._editStatus = editStatus;
  118. this._nodeno = nodeno;
  119. }
  120. #endregion
  121. #region 事件
  122. /// <summary>
  123. /// 窗体加载事件
  124. /// </summary>
  125. /// <param name="sender"></param>
  126. /// <param name="e"></param>
  127. private void F_PC_0203_Load(object sender, System.EventArgs e)
  128. {
  129. this.txtLineCode.Focus();
  130. // 查询数据
  131. this.ProductionDataSet = PCModuleProxy.Service.GetProductionLineDetail(this._lineID);
  132. // tableName 要与 Dongke.IBOSS.PRD.Service.ConfigModuleLogic.ConfigModuleLogic的GetProductionLineDetail方法定义的名称对应
  133. // 加载生产线信息
  134. DataTable lineTable = this.ProductionDataSet.Tables["lineTable"];
  135. // 画图
  136. if (lineTable != null && lineTable.Rows.Count > 0)
  137. {
  138. this.flowBox.LoadFlow((byte[])(lineTable.Rows[0]["FlowXML"]));
  139. this.OPTimeStamp = Convert.ToDateTime(lineTable.Rows[0]["OPTimeStamp"]);
  140. }
  141. //加载画布大小给文本框
  142. this.txtFlowWidth.Text = this.flowBox.CanvasSize.Width.ToString();
  143. this.txtFlowHeigth.Text = this.flowBox.CanvasSize.Height.ToString();
  144. // 加载工序信息
  145. DataTable procedureTable = this.ProductionDataSet.Tables["procedureTable"];
  146. _ValueFlagRow = procedureTable.Select("ValueFlag=0").Length;
  147. DataView dv = procedureTable.DefaultView;
  148. dv.RowFilter = "ValueFlag=1";
  149. procedureTable = dv.ToTable();
  150. foreach (FlowNode node in this.flowBox.AllNodes)
  151. {
  152. DataRow[] dr1 = procedureTable.Select("NodeNo=" + node.ItemID);
  153. if (node.ItemID == this._nodeno)
  154. {
  155. this._nodeno = node.ItemID;
  156. this._currentnode = node;
  157. }
  158. if (dr1.Length > 0)
  159. {
  160. node.NodeImageType = Convert.ToInt32(dr1[0]["ProcedureModel"]);//工序模型为了给双击事件弹出对应的窗体
  161. }
  162. if (node.NodeImageType == 1)
  163. {
  164. if (Convert.ToInt32(dr1[0]["modeltype"]) == Constant.ProcedureModelType.IntoKiln.GetHashCode())
  165. {
  166. node.NodeImage = new Bitmap(this.GetType(), "images.入窑64-01.png");
  167. }
  168. else if (Convert.ToInt32(dr1[0]["modeltype"]) == Constant.ProcedureModelType.LoadCar.GetHashCode())
  169. {
  170. node.NodeImage = new Bitmap(this.GetType(), "images.装车64-01.png");
  171. }
  172. else if (Convert.ToInt32(dr1[0]["modeltype"]) == Constant.ProcedureModelType.UnloadCar.GetHashCode())
  173. {
  174. node.NodeImage = new Bitmap(this.GetType(), "images.卸车64-01.png");
  175. }
  176. else
  177. {
  178. node.NodeImage = new Bitmap(this.GetType(), "images.newflow.png");
  179. }
  180. }
  181. else
  182. {
  183. node.NodeImage = new Bitmap(this.GetType(), "images.newflowcheck.png");
  184. }
  185. if (Convert.ToInt32(dr1[0]["MustFlag"].ToString()) == 1)
  186. {
  187. node.CanSkip = false;
  188. }
  189. else
  190. {
  191. node.CanSkip = true;
  192. }
  193. node.Code = dr1[0]["ProcedureCode"].ToString();
  194. node.Name = dr1[0]["ProcedureName"].ToString();
  195. node.Remark = dr1[0]["Remarks"].ToString();
  196. ProcedureEntity procedureEntity = new ProcedureEntity();//工序
  197. procedureEntity.ProcedureID = Convert.ToInt32(dr1[0]["ProcedureID"].ToString());
  198. procedureEntity.ProcedureCode = dr1[0]["ProcedureCode"].ToString();
  199. procedureEntity.ProcedureName = dr1[0]["ProcedureName"].ToString();
  200. procedureEntity.ProcedureModel = Convert.ToInt32(dr1[0]["ProcedureModel"].ToString());
  201. procedureEntity.ModelType = Convert.ToInt32(dr1[0]["modeltype"].ToString());
  202. procedureEntity.NodeType = Convert.ToInt32(dr1[0]["nodetype"].ToString());
  203. procedureEntity.MustFlag = Convert.ToInt32(dr1[0]["MustFlag"].ToString());
  204. procedureEntity.CollectType = Convert.ToInt32(dr1[0]["CollectType"].ToString());
  205. procedureEntity.PieceType = Convert.ToInt32(dr1[0]["PieceType"].ToString());
  206. procedureEntity.IsSpecialRework = Convert.ToInt32(dr1[0]["isspecialrework"].ToString());
  207. //xuwei add 2019-10-17
  208. procedureEntity.IsSemireWork = Convert.ToInt32(dr1[0]["isSemireWork"].ToString());
  209. //xuwei add 2019-11-20
  210. procedureEntity.PrintType = Convert.ToInt32(dr1[0]["printType"].ToString());
  211. //xuwei add 2019-12-11
  212. procedureEntity.SemiGoodsLevel = dr1[0]["SemiGoodsLevel"].ToString();
  213. procedureEntity.OrganizationID = Convert.ToInt32(dr1[0]["OrganizationID"].ToString());
  214. procedureEntity.Remarks = dr1[0]["Remarks"].ToString();
  215. procedureEntity.NodeNo = Convert.ToInt32(dr1[0]["NodeNo"]);
  216. procedureEntity.MissPriority = Convert.ToInt32(dr1[0]["misspriority"]);
  217. procedureEntity.DisplayNo = Convert.ToInt32(dr1[0]["DisplayNo"]);
  218. procedureEntity.UnDo = Convert.ToInt32(dr1[0]["UNDOFLAG"]);
  219. procedureEntity.DeliverType = Convert.ToInt32(dr1[0]["DeliverType"]);
  220. procedureEntity.BarCodePrintCopies = Convert.ToInt32(dr1[0]["BarCodePrintCopies"]);
  221. procedureEntity.BarCodeFlag = Convert.ToInt32(dr1[0]["BarCodeFlag"]);
  222. //if (dr1[0]["LogoID"] != DBNull.Value)
  223. //{
  224. // procedureEntity.LogoID = Convert.ToInt32(dr1[0]["LogoID"]);
  225. //}
  226. // 对应产品信息
  227. DataRow[] goodsRows = this.ProductionDataSet.Tables["procedureGoodsTable"].Select("NodeNo =" + node.ItemID);
  228. if (goodsRows != null && goodsRows.Length > 0)
  229. {
  230. procedureEntity.ProcedureGoodsTable = goodsRows.CopyToDataTable();
  231. procedureEntity.ProcedureGoodsTable.TableName = "procedureGoodsTable";
  232. }
  233. else
  234. {
  235. procedureEntity.ProcedureGoodsTable = this.ProductionDataSet.Tables["procedureGoodsTable"].Clone();
  236. }
  237. // 工序对应工号表
  238. DataRow[] userRows = this.ProductionDataSet.Tables["procedureUserTable"].Select("NodeNo =" + node.ItemID);
  239. if (userRows != null && userRows.Length > 0)
  240. {
  241. procedureEntity.ProcedureUserTable = userRows.CopyToDataTable();
  242. procedureEntity.ProcedureUserTable.TableName = "procedureUserTable";
  243. }
  244. else
  245. {
  246. procedureEntity.ProcedureUserTable = this.ProductionDataSet.Tables["procedureUserTable"].Clone();
  247. }
  248. // 工序对应缺陷表(在检验工序中能检验出来的缺陷。)
  249. DataRow[] defectRows = this.ProductionDataSet.Tables["procedureDefectTable"].Select("NodeNo =" + node.ItemID);
  250. if (defectRows != null && defectRows.Length > 0)
  251. {
  252. procedureEntity.ProcedureDefectTable = defectRows.CopyToDataTable();
  253. procedureEntity.ProcedureDefectTable.TableName = "procedureDefectTable";
  254. }
  255. else
  256. {
  257. procedureEntity.ProcedureDefectTable = this.ProductionDataSet.Tables["procedureDefectTable"].Clone();
  258. }
  259. // 生产工序对应缺陷表
  260. DataRow[] defectProcedureJobsRows = this.ProductionDataSet.Tables["defectProcedureJobsTable"].Select("NodeNo =" + node.ItemID);
  261. if (defectProcedureJobsRows != null && defectProcedureJobsRows.Length > 0)
  262. {
  263. procedureEntity.DefectProcedureJobsTable = defectProcedureJobsRows.CopyToDataTable();
  264. procedureEntity.DefectProcedureJobsTable.TableName = "defectProcedureJobsTable";
  265. }
  266. else
  267. {
  268. procedureEntity.DefectProcedureJobsTable = this.ProductionDataSet.Tables["defectProcedureJobsTable"].Clone();
  269. }
  270. // 工序对应窑炉
  271. DataRow[] kilnRows = this.ProductionDataSet.Tables["procedureKilnTable"].Select("NodeNo =" + node.ItemID);
  272. if (kilnRows != null && kilnRows.Length > 0)
  273. {
  274. procedureEntity.ProcedureKilnTable = kilnRows.CopyToDataTable();
  275. procedureEntity.ProcedureKilnTable.TableName = "procedureKilnTable";
  276. }
  277. else
  278. {
  279. procedureEntity.ProcedureKilnTable = this.ProductionDataSet.Tables["procedureKilnTable"].Clone();
  280. }
  281. node.TagNonSerialized = procedureEntity;
  282. }
  283. //for (int i = 0; i < procedureTable.Rows.Count; i++)
  284. //{
  285. // #region 加载工序信息
  286. // FlowNode node = (FlowNode)this.flowBox.AllNodes[i];
  287. // //if (node.NodeImageType == int.Parse(procedureTable.Rows[i]["ProcedureModel"].ToString()))
  288. // //{
  289. // node.NodeImageType = int.Parse(procedureTable.Rows[i]["ProcedureModel"].ToString());//工序模型为了给双击事件弹出对应的窗体
  290. // //}
  291. // if (node.NodeImageType == 1)
  292. // {
  293. // if (int.Parse(procedureTable.Rows[i]["modeltype"].ToString()) == Constant.ProcedureModelType.IntoKiln.GetHashCode())
  294. // {
  295. // node.NodeImage = new Bitmap(this.GetType(), "images.入窑64-01.png");
  296. // }
  297. // else if (int.Parse(procedureTable.Rows[i]["modeltype"].ToString()) == Constant.ProcedureModelType.LoadCar.GetHashCode())
  298. // {
  299. // node.NodeImage = new Bitmap(this.GetType(), "images.装车64-01.png");
  300. // }
  301. // else if (int.Parse(procedureTable.Rows[i]["modeltype"].ToString()) == Constant.ProcedureModelType.UnloadCar.GetHashCode())
  302. // {
  303. // node.NodeImage = new Bitmap(this.GetType(), "images.卸车64-01.png");
  304. // }
  305. // else
  306. // {
  307. // node.NodeImage = new Bitmap(this.GetType(), "images.newflow.png");
  308. // }
  309. // }
  310. // else
  311. // {
  312. // node.NodeImage = new Bitmap(this.GetType(), "images.newflowcheck.png");
  313. // }
  314. // if (int.Parse(procedureTable.Rows[i]["MustFlag"].ToString()) == 1)
  315. // {
  316. // node.CanSkip = true;
  317. // }
  318. // else
  319. // {
  320. // node.CanSkip = false;
  321. // }
  322. // node.Code = procedureTable.Rows[i]["ProcedureCode"].ToString();
  323. // node.Name = procedureTable.Rows[i]["ProcedureName"].ToString();
  324. // node.Remark = procedureTable.Rows[i]["Remarks"].ToString();
  325. // ProcedureEntity procedureEntity = new ProcedureEntity();//工序
  326. // procedureEntity.ProcedureID = int.Parse(procedureTable.Rows[i]["ProcedureID"].ToString());
  327. // procedureEntity.ProcedureCode = procedureTable.Rows[i]["ProcedureCode"].ToString();
  328. // procedureEntity.ProcedureName = procedureTable.Rows[i]["ProcedureName"].ToString();
  329. // procedureEntity.ProcedureModel = int.Parse(procedureTable.Rows[i]["ProcedureModel"].ToString());
  330. // procedureEntity.ModelType = int.Parse(procedureTable.Rows[i]["modeltype"].ToString());
  331. // procedureEntity.NodeType = int.Parse(procedureTable.Rows[i]["nodetype"].ToString());
  332. // procedureEntity.MustFlag = int.Parse(procedureTable.Rows[i]["MustFlag"].ToString());
  333. // procedureEntity.CollectType = int.Parse(procedureTable.Rows[i]["CollectType"].ToString());
  334. // procedureEntity.PieceType = int.Parse(procedureTable.Rows[i]["PieceType"].ToString());
  335. // procedureEntity.IsSpecialRework = int.Parse(procedureTable.Rows[i]["isspecialrework"].ToString());
  336. // procedureEntity.OrganizationID = int.Parse(procedureTable.Rows[i]["OrganizationID"].ToString());
  337. // procedureEntity.Remarks = procedureTable.Rows[i]["Remarks"].ToString();
  338. // procedureEntity.NodeNo = Convert.ToInt32(procedureTable.Rows[i]["NodeNo"]);
  339. // // 对应产品信息
  340. // DataRow[] goodsRows = this.ProductionDataSet.Tables["procedureGoodsTable"].Select("NodeNo =" + procedureTable.Rows[i]["NodeNo"].ToString());
  341. // if (goodsRows != null && goodsRows.Length > 0)
  342. // {
  343. // procedureEntity.ProcedureGoodsTable = goodsRows.CopyToDataTable();
  344. // procedureEntity.ProcedureGoodsTable.TableName = "procedureGoodsTable";
  345. // }
  346. // else
  347. // {
  348. // procedureEntity.ProcedureGoodsTable = this.ProductionDataSet.Tables["procedureGoodsTable"].Clone();
  349. // }
  350. // // 工序对应工号表
  351. // DataRow[] userRows = this.ProductionDataSet.Tables["procedureUserTable"].Select("NodeNo =" + procedureTable.Rows[i]["NodeNo"].ToString());
  352. // if (userRows != null && userRows.Length > 0)
  353. // {
  354. // procedureEntity.ProcedureUserTable = userRows.CopyToDataTable();
  355. // procedureEntity.ProcedureUserTable.TableName = "procedureUserTable";
  356. // }
  357. // else
  358. // {
  359. // procedureEntity.ProcedureUserTable = this.ProductionDataSet.Tables["procedureUserTable"].Clone();
  360. // }
  361. // // 工序对应缺陷表(在检验工序中能检验出来的缺陷。)
  362. // DataRow[] defectRows = this.ProductionDataSet.Tables["procedureDefectTable"].Select("NodeNo =" + procedureTable.Rows[i]["NodeNo"].ToString());
  363. // if (defectRows != null && defectRows.Length > 0)
  364. // {
  365. // procedureEntity.ProcedureDefectTable = defectRows.CopyToDataTable();
  366. // procedureEntity.ProcedureDefectTable.TableName = "procedureDefectTable";
  367. // }
  368. // else
  369. // {
  370. // procedureEntity.ProcedureDefectTable = this.ProductionDataSet.Tables["procedureDefectTable"].Clone();
  371. // }
  372. // // 生产工序对应缺陷表
  373. // DataRow[] defectProcedureJobsRows = this.ProductionDataSet.Tables["defectProcedureJobsTable"].Select("NodeNo =" + procedureTable.Rows[i]["NodeNo"].ToString());
  374. // if (defectProcedureJobsRows != null && defectProcedureJobsRows.Length > 0)
  375. // {
  376. // procedureEntity.DefectProcedureJobsTable = defectProcedureJobsRows.CopyToDataTable();
  377. // procedureEntity.DefectProcedureJobsTable.TableName = "defectProcedureJobsTable";
  378. // }
  379. // else
  380. // {
  381. // procedureEntity.DefectProcedureJobsTable = this.ProductionDataSet.Tables["defectProcedureJobsTable"].Clone();
  382. // }
  383. // node.TagNonSerialized = procedureEntity;
  384. // #endregion
  385. //}
  386. this.flowBox.RefreshItems();
  387. this.txtLineCode.Text = this._lineCode;
  388. this.txtLineName.Text = this._lineName;
  389. this.flowBox.NodeDoubleClick += flowBox_NodeDoubleClick;
  390. //if(this._currentnode!=null)
  391. //{
  392. // if (this._currentnode.NodeImageType == 2)
  393. // {
  394. // F_PC_0206 frm0206 = new F_PC_0206(this._currentnode, this.flowBox);
  395. // frm0206.ShowDialog();
  396. // }
  397. // else
  398. // {
  399. // F_PC_0207 frm0207 = new F_PC_0207(this._currentnode, this.flowBox);
  400. // frm0207.ShowDialog();
  401. // }
  402. // this.flowBox.RefreshItems();
  403. //}
  404. }
  405. /// <summary>
  406. /// 节点双击事件
  407. /// </summary>
  408. /// <param name="sender"></param>
  409. /// <param name="e"></param>
  410. void flowBox_NodeDoubleClick(object sender, NodeEventArgs e)
  411. {
  412. if (e.Node.NodeImageType == 2)
  413. {
  414. F_PC_0206 frm0206 = new F_PC_0206(e.Node, this.flowBox);
  415. if (this._editStatus == Constant.FormMode.Edit)
  416. {
  417. frm0206.IsReadOnlyCode = true;
  418. }
  419. frm0206.ShowDialog();
  420. }
  421. else
  422. {
  423. F_PC_0207 frm0207 = new F_PC_0207(e.Node, this.flowBox);
  424. if (this._editStatus == Constant.FormMode.Edit)
  425. {
  426. frm0207.IsReadOnlyCode = true;
  427. }
  428. frm0207.ShowDialog();
  429. }
  430. this.flowBox.RefreshItems();
  431. }
  432. /// <summary>
  433. /// 设置按钮事件
  434. /// </summary>
  435. /// <param name="sender"></param>
  436. /// <param name="e"></param>
  437. private void btnFlowSetting_Click(object sender, System.EventArgs e)
  438. {
  439. try
  440. {
  441. int w = Convert.ToInt32(txtFlowWidth.Text);
  442. int h = Convert.ToInt32(txtFlowHeigth.Text);
  443. this.flowBox.CanvasSize = new Size(w, h);
  444. this.flowBox.SaveFlow();
  445. }
  446. catch (Exception ex)
  447. {
  448. // 对异常进行共通处理
  449. ExceptionManager.HandleEventException(this.ToString(),
  450. System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex);
  451. }
  452. }
  453. /// <summary>
  454. /// 计件模型按钮事件
  455. /// </summary>
  456. /// <param name="sender"></param>
  457. /// <param name="e"></param>
  458. private void btnPiece_Click(object sender, EventArgs e)
  459. {
  460. try
  461. {
  462. FlowNode n = this.flowBox.DrawingNode();
  463. n.NodeImageType = 1;//计件模型
  464. ProcedureEntity entity = new ProcedureEntity();
  465. entity.NodeNo = n.ItemID;//(this.flowBox.AllNodes.Count - this.flowBox.DeletedNodes.Count) + _ValueFlagRow;
  466. entity.ProcedureCode = n.ItemID.ToString();
  467. entity.ProcedureName = n.Name;
  468. entity.CollectType = 1;
  469. entity.MustFlag = 1;
  470. entity.ProcedureModel = 1;
  471. entity.PieceType = 1;
  472. entity.ProcedureGoodsTable = this.ProductionDataSet.Tables["procedureGoodsTable"].Clone();
  473. entity.ProcedureUserTable = this.ProductionDataSet.Tables["procedureUserTable"].Clone();
  474. entity.ProcedureDefectTable = this.ProductionDataSet.Tables["procedureDefectTable"].Clone();
  475. entity.DefectProcedureJobsTable = this.ProductionDataSet.Tables["defectProcedureJobsTable"].Clone();
  476. entity.ProcedureKilnTable = this.ProductionDataSet.Tables["procedureKilnTable"].Clone();
  477. n.TagNonSerialized = entity;
  478. n.NodeImage = this.btnPiece.BackgroundImage;
  479. }
  480. catch (Exception ex)
  481. {
  482. // 对异常进行共通处理
  483. ExceptionManager.HandleEventException(this.ToString(),
  484. System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex);
  485. }
  486. }
  487. /// <summary>
  488. /// 检验模型按钮事件
  489. /// </summary>
  490. /// <param name="sender"></param>
  491. /// <param name="e"></param>
  492. private void btnCheck_Click(object sender, EventArgs e)
  493. {
  494. try
  495. {
  496. FlowNode n = this.flowBox.DrawingNode();
  497. n.NodeImageType = 2;//检验模型
  498. ProcedureEntity entity = new ProcedureEntity();
  499. entity.NodeNo = n.ItemID;//(this.flowBox.AllNodes.Count - this.flowBox.DeletedNodes.Count) + _ValueFlagRow;
  500. entity.ProcedureCode = n.ItemID.ToString();
  501. entity.ProcedureName = n.Name;
  502. entity.CollectType = 1;
  503. entity.MustFlag = 1;
  504. entity.ProcedureModel = 2;
  505. entity.PieceType = 1;
  506. entity.ProcedureGoodsTable = this.ProductionDataSet.Tables["procedureGoodsTable"].Clone();
  507. entity.ProcedureUserTable = this.ProductionDataSet.Tables["procedureUserTable"].Clone();
  508. entity.ProcedureDefectTable = this.ProductionDataSet.Tables["procedureDefectTable"].Clone();
  509. entity.DefectProcedureJobsTable = this.ProductionDataSet.Tables["defectProcedureJobsTable"].Clone();
  510. n.TagNonSerialized = entity;
  511. n.NodeImage = this.btnCheck.BackgroundImage;
  512. }
  513. catch (Exception ex)
  514. {
  515. // 对异常进行共通处理
  516. ExceptionManager.HandleEventException(this.ToString(),
  517. System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex);
  518. }
  519. }
  520. /// <summary>
  521. /// 直接按钮事件
  522. /// </summary>
  523. /// <param name="sender"></param>
  524. /// <param name="e"></param>
  525. private void btnLine_Click(object sender, EventArgs e)
  526. {
  527. FlowLine n = this.flowBox.DrawingLine();
  528. if (n == null)
  529. {
  530. MessageBox.Show(this.flowBox.BoxMode.ToString());
  531. return;
  532. }
  533. n.ShowName = false;
  534. }
  535. /// <summary>
  536. /// 保存按钮事件
  537. /// </summary>
  538. /// <param name="sender"></param>
  539. /// <param name="e"></param>
  540. private void btnSave_Click(object sender, EventArgs e)
  541. {
  542. try
  543. {
  544. bool check = this.flowBox.CheckFlow();
  545. bool isRefresh = false;
  546. if (this._editStatus == Constant.FormMode.Edit)
  547. {
  548. if (this.flowBox.DeletedNodes.Count > 0)
  549. {
  550. FlowNode[] flow = this.flowBox.DeletedNodes.ToArray();
  551. for (int i = 0; i < flow.Length; i++)
  552. {
  553. bool isDelete = PCModuleProxy.Service.GetAllowDelete(((ProcedureEntity)flow[i].TagNonSerialized).ProcedureID);
  554. if (isDelete)
  555. {
  556. this.flowBox.UndeleteNodeByNodeCode(flow[i].ItemCode);
  557. MessageBox.Show(((ProcedureEntity)flow[i].TagNonSerialized).ProcedureName + "有在产产品不能删除",
  558. this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
  559. isRefresh = true;//
  560. break;
  561. }
  562. }
  563. }
  564. this.flowBox.RefreshItems();
  565. }
  566. if (isRefresh)
  567. {
  568. this.flowBox.CheckFlow();
  569. }
  570. // 校验
  571. if (!this.CheckIntegrity2())
  572. {
  573. return;
  574. }
  575. this.SetPorcessFlow2(); //这个方法为干补也做了修改
  576. ProductionLineEntity productionLine = new ProductionLineEntity();
  577. if (this._editStatus == Constant.FormMode.Edit)
  578. {
  579. productionLine.ProductionLineID = this._lineID;
  580. }
  581. else
  582. {
  583. productionLine.ProductionLineID = 0;
  584. }
  585. productionLine.FlowXML = this.flowBox.SaveFlowXml();
  586. productionLine.ProductionLineCode = this.txtLineCode.Text.Trim();
  587. productionLine.ProductionLineName = this.txtLineName.Text.Trim();
  588. productionLine.Remarks = this._remarks;
  589. productionLine.OPTimeStamp = OPTimeStamp;
  590. // 节点对象
  591. List<ProcedureEntity> nodeList = new List<ProcedureEntity>();
  592. for (int i = 0; i < this.flowBox.AllNodes.Count; i++)
  593. {
  594. FlowNode node = (FlowNode)this.flowBox.AllNodes[i];
  595. ProcedureEntity procedure = node.TagNonSerialized as ProcedureEntity;
  596. if (this._editStatus == Constant.FormMode.Edit)
  597. {
  598. if (node.NodeState == FlowNodeState.Added)
  599. {
  600. procedure.ProcedureState = 1;
  601. }
  602. else if (node.NodeState == FlowNodeState.Deleted)
  603. {
  604. procedure.ProcedureState = 2;
  605. }
  606. else
  607. {
  608. procedure.ProcedureState = 0;
  609. }
  610. nodeList.Add(procedure);
  611. }
  612. else
  613. {
  614. //新建或者是新建复制
  615. if (node.NodeState == FlowNodeState.Added)
  616. {
  617. procedure.ProcedureState = 1;
  618. nodeList.Add(procedure);
  619. }
  620. else if (node.NodeState == FlowNodeState.Deleted)
  621. {
  622. procedure.ProcedureState = 2;
  623. }
  624. else
  625. {
  626. procedure.ProcedureState = 0;
  627. nodeList.Add(procedure);
  628. }
  629. }
  630. //nodeList.Add(procedure);
  631. }
  632. //productionLine.ProcedureList = nodeList.ToArray();
  633. productionLine.ProcedureList = nodeList;
  634. int result = PCModuleProxy.Service.SaveProductionLine(productionLine);
  635. if (result > Constant.INT_IS_ZERO)
  636. {
  637. IDList.Add(result);
  638. this.ProductionlineCode = txtLineCode.Text;
  639. MessageBox.Show(string.Format(Messages.MSG_CMN_I001, FormTitles.F_PC_0202, Constant.OPERATE_SAVE),
  640. this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
  641. _hasClose = true;
  642. this.DialogResult = DialogResult.OK;
  643. }
  644. else if (result == Constant.RETURN_IS_DATACHANGED)
  645. {
  646. MessageBox.Show(Messages.MSG_CMN_W012,
  647. this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
  648. return;
  649. }
  650. else if (result == Constant.RETURN_IS_EXIST)
  651. {
  652. MessageBox.Show(string.Format(Messages.MSG_CMN_W006, "生产线编码"),
  653. this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
  654. return;
  655. }
  656. else if (result == -10)
  657. {
  658. MessageBox.Show("工序总数量超过了授权数量,如需增加授权,请联系东科。",
  659. this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
  660. return;
  661. }
  662. else
  663. {
  664. MessageBox.Show(string.Format(Messages.MSG_CMN_W001, FormTitles.F_PC_0202, Constant.OPERATE_SAVE),
  665. this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning);
  666. return;
  667. }
  668. this.Close();
  669. }
  670. catch (Exception ex)
  671. {
  672. // 对异常进行共通处理
  673. ExceptionManager.HandleEventException(this.ToString(),
  674. System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex);
  675. }
  676. }
  677. /// <summary>
  678. /// 关闭按钮事件
  679. /// </summary>
  680. /// <param name="sender"></param>
  681. /// <param name="e"></param>
  682. private void btnClose_Click(object sender, EventArgs e)
  683. {
  684. this.Close();
  685. }
  686. /// <summary>
  687. /// 画面关闭前提示
  688. /// </summary>
  689. /// <param name="sender"></param>
  690. /// <param name="e"></param>
  691. private void F_PC_0203_FormClosing(object sender, FormClosingEventArgs e)
  692. {
  693. if (_hasClose)
  694. {
  695. return;
  696. }
  697. DialogResult dialogResult = MessageBox.Show("确定要放弃对生产线的编辑,并关闭画面",
  698. this.Text,
  699. MessageBoxButtons.OKCancel,
  700. MessageBoxIcon.Question,
  701. MessageBoxDefaultButton.Button2);
  702. if (dialogResult == DialogResult.Cancel)
  703. {
  704. e.Cancel = true;
  705. }
  706. }
  707. /// <summary>
  708. /// 导出图片
  709. /// </summary>
  710. /// <param name="sender"></param>
  711. /// <param name="e"></param>
  712. private void btnExpImage_Click(object sender, EventArgs e)
  713. {
  714. try
  715. {
  716. saveFileDialog1.FileName = this.txtLineName.Text + ".png";
  717. DialogResult dr = saveFileDialog1.ShowDialog();
  718. if (dr != System.Windows.Forms.DialogResult.OK)
  719. {
  720. return;
  721. }
  722. Bitmap b = new Bitmap(this.flowBox.CanvasImage);
  723. this.flowBox.CanvasControl.DrawToBitmap(b, new Rectangle(0, 0, b.Width, b.Height));
  724. b.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Png);
  725. }
  726. catch (Exception ex)
  727. {
  728. // 对异常进行共通处理
  729. ExceptionManager.HandleEventException(this.ToString(),
  730. System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex);
  731. }
  732. }
  733. #endregion
  734. #region 私有方法
  735. /// <summary>
  736. /// 向前工序校验是否满足入窑工序
  737. /// </summary>
  738. /// <param name="node"></param>
  739. /// <param name="modelType"></param>
  740. private string BackIntoKilnCheck(FlowNode checkNode, FlowNode backNode)
  741. {
  742. if (backNode.InLines.Count == 0)
  743. {
  744. return string.Format("节点【{0}】是" + Constant.PROCEDURE_INTOKILN + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_LOADCAR + "工序!", checkNode.Name);
  745. }
  746. foreach (FlowLine line in backNode.InLines)
  747. {
  748. // 只有最近 装窑车 入窑 出窑 卸窑车 工序中是装窑车的工序才符合入窑工序
  749. if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.LoadCar)
  750. {
  751. continue;
  752. }
  753. // 窑车补件工序除外
  754. if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.CarAdd)
  755. {
  756. continue;
  757. }
  758. else if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.IntoKiln
  759. || ((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.OutKiln
  760. || ((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.UnloadCar)
  761. {
  762. return string.Format("节点【{0}】是" + Constant.PROCEDURE_INTOKILN + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_LOADCAR + "工序!", checkNode.Name);
  763. }
  764. // 递归校验下一个节点
  765. string err = BackIntoKilnCheck(checkNode, line.NodeBegin);
  766. if (!string.IsNullOrEmpty(err))
  767. {
  768. return err;
  769. }
  770. }
  771. return null;
  772. }
  773. /// <summary>
  774. /// 校验装窑车后是入窑工序
  775. /// </summary>
  776. /// <param name="checkNode"></param>
  777. /// <param name="ForwardNode"></param>
  778. /// <returns></returns>
  779. private string ForwardLoadCarCheck(FlowNode checkNode, FlowNode ForwardNode)
  780. {
  781. if (ForwardNode.OutLines.Count == 0)
  782. {
  783. return string.Format("节点【{0}】是" + Constant.PROCEDURE_LOADCAR + "工序,在后续工序流程中必须要经过" + Constant.PROCEDURE_INTOKILN + "工序!", checkNode.Name);
  784. }
  785. foreach (FlowLine line in ForwardNode.OutLines)
  786. {
  787. // 只有最近 装窑车 入窑 出窑 卸窑车 工序中是入窑的工序才符合装窑车工序
  788. if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.IntoKiln)
  789. {
  790. continue;
  791. }
  792. else if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.LoadCar
  793. || ((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.OutKiln
  794. || ((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.UnloadCar)
  795. {
  796. return string.Format("节点【{0}】是" + Constant.PROCEDURE_LOADCAR + "工序,在后续工序流程中必须要经过" + Constant.PROCEDURE_INTOKILN + "工序!", checkNode.Name);
  797. }
  798. // 递归校验下一个节点
  799. string err = ForwardLoadCarCheck(checkNode, line.NodeEnd);
  800. if (!string.IsNullOrEmpty(err))
  801. {
  802. return err;
  803. }
  804. }
  805. return null;
  806. }
  807. /// <summary>
  808. /// 校验入窑后是出窑工序
  809. /// </summary>
  810. /// <param name="checkNode"></param>
  811. /// <param name="ForwardNode"></param>
  812. /// <returns></returns>
  813. private string ForwardIntoKilnCheck(FlowNode checkNode, FlowNode ForwardNode)
  814. {
  815. if (ForwardNode.OutLines.Count == 0)
  816. {
  817. return string.Format("节点【{0}】是" + Constant.PROCEDURE_INTOKILN + "工序,在后续工序流程中必须要经过" + Constant.PROCEDURE_OUTKILN + "工序!", checkNode.Name);
  818. }
  819. foreach (FlowLine line in checkNode.OutLines)
  820. {
  821. // 只有最近 装窑车 入窑 出窑 卸窑车 工序中是出窑的工序才符合出窑工序
  822. if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.OutKiln)
  823. {
  824. continue;
  825. }
  826. else if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.LoadCar
  827. || ((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.IntoKiln
  828. || ((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.UnloadCar)
  829. {
  830. return string.Format("节点【{0}】是" + Constant.PROCEDURE_INTOKILN + "工序,在后续工序流程中必须要经过" + Constant.PROCEDURE_OUTKILN + "工序!", checkNode.Name);
  831. }
  832. // 递归校验下一个节点
  833. string err = ForwardIntoKilnCheck(checkNode, line.NodeEnd);
  834. if (!string.IsNullOrEmpty(err))
  835. {
  836. return err;
  837. }
  838. }
  839. return null;
  840. }
  841. /// <summary>
  842. /// 校验出窑工序后是卸窑车工序
  843. /// </summary>
  844. /// <param name="checkNode"></param>
  845. /// <param name="ForwardNode"></param>
  846. /// <returns></returns>
  847. private string ForwardOutKilnCheck(FlowNode checkNode, FlowNode ForwardNode)
  848. {
  849. if (ForwardNode.OutLines.Count == 0)
  850. {
  851. return string.Format("节点【{0}】是" + Constant.PROCEDURE_OUTKILN + "工序,在后续工序流程中必须要经过" + Constant.PROCEDURE_UNLOADCAR + "工序!", checkNode.Name);
  852. }
  853. foreach (FlowLine line in ForwardNode.OutLines)
  854. {
  855. // 只有最近 装窑车 入窑 出窑 卸窑车 工序中是出窑的工序才符合出窑工序
  856. if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.UnloadCar)
  857. {
  858. continue;
  859. }
  860. else if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.LoadCar
  861. || ((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.IntoKiln
  862. || ((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.OutKiln)
  863. {
  864. return string.Format("节点【{0}】是" + Constant.PROCEDURE_OUTKILN + "工序,在后续工序流程中必须要经过" + Constant.PROCEDURE_UNLOADCAR + "工序!", checkNode.Name);
  865. }
  866. // 递归校验下一个节点
  867. string err = ForwardOutKilnCheck(checkNode, line.NodeEnd);
  868. if (!string.IsNullOrEmpty(err))
  869. {
  870. return err;
  871. }
  872. }
  873. return null;
  874. }
  875. /// <summary>
  876. /// 校验出窑前工序是入窑工序
  877. /// </summary>
  878. /// <param name="checkNode"></param>
  879. /// <param name="backNode"></param>
  880. /// <returns></returns>
  881. private string BackOutKilnCheck(FlowNode checkNode, FlowNode backNode)
  882. {
  883. if (backNode.InLines.Count == 0)
  884. {
  885. return string.Format("节点【{0}】是" + Constant.PROCEDURE_OUTKILN + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_INTOKILN + "工序!", checkNode.Name);
  886. }
  887. foreach (FlowLine line in backNode.InLines)
  888. {
  889. // 只有最近 装窑车 入窑 出窑 卸窑车 工序中是入窑的工序才符合出窑工序
  890. if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.IntoKiln)
  891. {
  892. continue;
  893. }
  894. else if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.LoadCar
  895. || ((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.OutKiln
  896. || ((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.UnloadCar)
  897. {
  898. return string.Format("节点【{0}】是" + Constant.PROCEDURE_OUTKILN + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_INTOKILN + "工序!", checkNode.Name);
  899. }
  900. // 递归校验下一个节点
  901. string err = BackOutKilnCheck(checkNode, line.NodeBegin);
  902. if (!string.IsNullOrEmpty(err))
  903. {
  904. return err;
  905. }
  906. }
  907. return null;
  908. }
  909. /// <summary>
  910. /// 校验卸窑车工序前工序是出窑工序
  911. /// </summary>
  912. /// <param name="checkNode"></param>
  913. /// <param name="backNode"></param>
  914. /// <returns></returns>
  915. private string BackUnloadCarCheck(FlowNode checkNode, FlowNode backNode)
  916. {
  917. if (backNode.InLines.Count == 0)
  918. {
  919. return string.Format("节点【{0}】是" + Constant.PROCEDURE_UNLOADCAR + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_OUTKILN + "工序!", checkNode.Name);
  920. }
  921. foreach (FlowLine line in backNode.InLines)
  922. {
  923. // 只有最近 装窑车 入窑 出窑 卸窑车 工序中是入窑的工序才符合出窑工序
  924. if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.OutKiln)
  925. {
  926. continue;
  927. }
  928. else if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.LoadCar
  929. || ((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.IntoKiln
  930. || ((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.UnloadCar)
  931. {
  932. return string.Format("节点【{0}】是" + Constant.PROCEDURE_UNLOADCAR + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_OUTKILN + "工序!", checkNode.Name);
  933. }
  934. // 递归校验下一个节点
  935. string err = BackUnloadCarCheck(checkNode, line.NodeBegin);
  936. if (!string.IsNullOrEmpty(err))
  937. {
  938. return err;
  939. }
  940. }
  941. return null;
  942. }
  943. /// <summary>
  944. /// 校验入窑前检验工序前工序是装窑车工序
  945. /// </summary>
  946. /// <param name="checkNode"></param>
  947. /// <param name="backNode"></param>
  948. /// <returns></returns>
  949. private string BackIntoKilnCheckCheck(FlowNode checkNode, FlowNode backNode)
  950. {
  951. if (backNode.InLines.Count == 0)
  952. {
  953. return string.Format("节点【{0}】是" + Constant.PROCEDURE_INTOKILNCHECK + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_LOADCAR + "工序!", checkNode.Name);
  954. }
  955. foreach (FlowLine line in backNode.InLines)
  956. {
  957. // 只有最近 装窑车工序才符合入窑前检验工序
  958. ProcedureEntity procedureEntity = line.NodeBegin.TagNonSerialized as ProcedureEntity;
  959. if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.LoadCar)
  960. {
  961. continue;
  962. }
  963. else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.LoadCar
  964. || procedureEntity.ModelType == (int)Constant.ProcedureModelType.IntoKiln
  965. || procedureEntity.ModelType == (int)Constant.ProcedureModelType.UnloadCar)
  966. {
  967. return string.Format("节点【{0}】是" + Constant.PROCEDURE_UNLOADCAR + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_OUTKILN + "工序!", checkNode.Name);
  968. }
  969. // 递归校验下一个节点
  970. string err = BackIntoKilnCheckCheck(checkNode, line.NodeBegin);
  971. if (!string.IsNullOrEmpty(err))
  972. {
  973. return err;
  974. }
  975. }
  976. return null;
  977. }
  978. /// <summary>
  979. /// 校验回环节点
  980. /// </summary>
  981. /// <param name="dic"></param>
  982. /// <param name="node"></param>
  983. /// <returns></returns>
  984. private bool LoopNodeCheck(FlowNode checkNode, FlowNode nextNode)
  985. {
  986. // 说明以后y有回环连接
  987. if (checkNode.Equals(nextNode))
  988. {
  989. return false;
  990. }
  991. else if (nextNode == null)
  992. {
  993. nextNode = checkNode;
  994. }
  995. if (checkNode.NextNodes.Contains(nextNode))
  996. {
  997. return true;
  998. }
  999. else
  1000. {
  1001. // 校验的节点放置到可到工序中,包括本身节点。
  1002. checkNode.NextNodes.Add(nextNode);
  1003. }
  1004. // 下一个节点
  1005. foreach (FlowLine line in nextNode.OutLines)
  1006. {
  1007. if (!LoopNodeCheck(checkNode, line.NodeEnd))
  1008. {
  1009. return false;
  1010. }
  1011. }
  1012. return true;
  1013. }
  1014. /// <summary>
  1015. /// 元素的完整性检查
  1016. /// </summary>
  1017. public bool CheckIntegrity()
  1018. {
  1019. if (this.flowBox.CheckedNodes.Count == 0) //不包括删除的
  1020. {
  1021. MessageBox.Show("请配置工序节点!", "Error");
  1022. return false;
  1023. }
  1024. // 连线校验
  1025. for (int i = 0; i < this.flowBox.CheckedLines.Count; i++)
  1026. {
  1027. FlowLine line = (FlowLine)this.flowBox.CheckedLines[i];
  1028. //开始端点没有连接
  1029. if (line.NodeBegin == null)
  1030. {
  1031. MessageBox.Show("连线【" + line.Name + "】开始端点没有连接节点!", "Error");
  1032. //line.Content = "开始端点没有连接节点";
  1033. // 选中该线
  1034. //SetSelectLine(line);
  1035. return false;
  1036. }
  1037. else if (line.NodeEnd == null)
  1038. {
  1039. MessageBox.Show("连线【" + line.Name + "】结束端点没有连接节点!", "Error");
  1040. //line.Content = "结束端点没有连接节点";
  1041. //选中该线
  1042. //SetSelectLine(line);
  1043. return false;
  1044. }
  1045. //校验是否有2个以上的线开始端点和结束端点连接的都是一个节点(重复连接)
  1046. for (int j = i + 1; j < this.flowBox.CheckedLines.Count; j++)
  1047. {
  1048. FlowLine nextLine = (FlowLine)this.flowBox.CheckedLines[j];
  1049. if (line.NodeBegin.Equals(nextLine.NodeBegin)
  1050. && line.NodeEnd.Equals(nextLine.NodeEnd))
  1051. {
  1052. MessageBox.Show("连线【" + line.Name + "】与连线【" + nextLine.Name + "】属于重复连接节点!", "Error");
  1053. //line.Content = "连线与连线【" + nextLine.Content + "】属于重复连接节点";
  1054. //选中该线
  1055. //SetSelectLine(line);
  1056. return false;
  1057. }
  1058. }
  1059. }
  1060. //结束节点的数量
  1061. int endCount = 0;
  1062. for (int i = 0; i < this.flowBox.CheckedNodes.Count; i++)
  1063. {
  1064. FlowNode node = (FlowNode)this.flowBox.CheckedNodes[i];
  1065. ProcedureEntity procedureEntity = node.TagNonSerialized as ProcedureEntity;
  1066. // 必填项校验
  1067. if (procedureEntity.OrganizationID <= 0)
  1068. {
  1069. MessageBox.Show("节点【" + node.Name + "】的组织机构不能为空!", "Error");
  1070. // 选中该节点
  1071. //SetSelectNode(node);
  1072. return false;
  1073. }
  1074. // 校验回环节点
  1075. //node.NextNodes = new List<FlowNode>();
  1076. if (!LoopNodeCheck(node, null))
  1077. {
  1078. MessageBox.Show("有循环节点存在,请重新设置!", "Error");
  1079. return false;
  1080. }
  1081. // 开始节点
  1082. if (node.InLines.Count == 0)
  1083. {
  1084. // 开始节点校验
  1085. // 孤立的节点
  1086. if (node.OutLines.Count == 0)
  1087. {
  1088. MessageBox.Show("节点【" + node.Name + "】是孤立工序!", "Error");
  1089. // 选中该节点
  1090. // SetSelectNode(node);
  1091. return false;
  1092. }
  1093. // 开始节点不能是成验和入窑前检验节点
  1094. else if (node.NodeImageType != 1)
  1095. {
  1096. MessageBox.Show("开始节点【" + node.Name + "】不能是成品检验或者入窑前检验工序!", "Error");
  1097. // 选中该节点
  1098. // SetSelectNode(node);
  1099. return false;
  1100. }
  1101. if (procedureEntity.MustFlag == Constant.ProcedureMustFlag.NonMust.GetHashCode())
  1102. {
  1103. MessageBox.Show("开始节点【" + node.Name + "】不能是非必须工序!", "Error");
  1104. // 选中该节点
  1105. //SetSelectNode(node);
  1106. return false;
  1107. }
  1108. // 开始工序必须为交坯或特殊返工工序
  1109. // 注释 先不做校验
  1110. //if (node.ProcedureEntity.IsSpecialRework != 1 && node.ProcedureEntity.ModelType != (int)Constant.ProcedureModelType.DeliverAdobe)
  1111. //{
  1112. // MessageForm.Show("开始节点【" + node.NodeText + "】必须为交坯或特殊返工工序!", "Error");
  1113. // // 选中该节点
  1114. // SetSelectNode(node);
  1115. // return false;
  1116. //}
  1117. // 开始节点如果是特定返工工序就必须与(标准计件或装窑车)组合
  1118. else if (procedureEntity.IsSpecialRework == (int)Constant.SpecialReworkFlag.Yes
  1119. && procedureEntity.ModelType != (int)Constant.ProcedureModelType.Normal
  1120. && procedureEntity.ModelType != (int)Constant.ProcedureModelType.LoadCar)
  1121. {
  1122. MessageBox.Show("开始节点【" + node.Name + "】是特定返工工序时,工序类别必须是" + Constant.PROCEDURE_NORMAL + "或" + Constant.PROCEDURE_LOADCAR + "!", "Error");
  1123. // 选中该节点
  1124. //SetSelectNode(node);
  1125. return false;
  1126. }
  1127. // 暂时不需要校验
  1128. // 开始节点如果是非特定返工工序那必须与交坯组合
  1129. //else if (node.ProcedureEntity.IsSpecialRework == 0
  1130. // && node.ProcedureEntity.ModelType != 5)
  1131. //{
  1132. // MessageForm.Show("开始节点【" + node.NodeText + "】工序类别是" + Constant.PROCEDURE_DELIVERADOBE + "时,不能是特定返工工序!", "Error");
  1133. // // 选中该节点
  1134. // SetSelectNode(node);
  1135. // return false;
  1136. //}
  1137. // 交坯工序必须为必须工序
  1138. else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.DeliverMud && procedureEntity.MustFlag == 0)
  1139. {
  1140. MessageBox.Show("开始节点【" + node.Name + "】是" + Constant.PROCEDURE_DELIVERADOBE + "工序时为必须工序!", "Error");
  1141. // 选中该节点
  1142. //SetSelectNode(node);
  1143. return false;
  1144. }
  1145. // 开始工序不能为窑车补件工序
  1146. else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.CarAdd)
  1147. {
  1148. MessageBox.Show("开始节点【" + node.Name + "】工序类别不能是" + Constant.PROCEDURE_CARADD + "工序!", "Error");
  1149. // 选中该节点
  1150. // SetSelectNode(node);
  1151. return false;
  1152. }
  1153. // 开始工序标识
  1154. procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Begin;
  1155. // 特殊返工工序 将工序节点类型修改成中间工序
  1156. if (procedureEntity.IsSpecialRework == Constant.SpecialReworkFlag.Yes.GetHashCode())
  1157. {
  1158. procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Middle;
  1159. }
  1160. }
  1161. // 过程节点
  1162. else
  1163. {
  1164. //过程节点校验
  1165. #region 中间节点不能设置为特殊返工工序
  1166. if (procedureEntity.IsSpecialRework == (int)Constant.SpecialReworkFlag.Yes)
  1167. {
  1168. MessageBox.Show("中间节点【" + node.Name + "】不能设置为特殊返工工序!", "Error");
  1169. // 选中该节点
  1170. //SetSelectNode(node);
  1171. return false;
  1172. }
  1173. #endregion
  1174. #region 校验坯库工序
  1175. if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.AdobeStock)
  1176. {
  1177. // 坯库工序必须指向唯一一个窑车补件工序
  1178. if (node.OutLines.Count > 1 || node.OutLines.Count == 0)
  1179. {
  1180. MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_ADOBESTOCK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_CARADD + "工序!", "Error");
  1181. // 选中该节点
  1182. // SetSelectNode(node);
  1183. return false;
  1184. }
  1185. else
  1186. {
  1187. // 坯库工序所指向的节点不是窑车补件
  1188. ProcedureEntity ProcedureEntityEnd = node.OutLines[0].NodeEnd.TagNonSerialized as ProcedureEntity;
  1189. if (ProcedureEntityEnd.ModelType != (int)Constant.ProcedureModelType.CarAdd)
  1190. {
  1191. MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_ADOBESTOCK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_CARADD + "工序!", "Error");
  1192. // 选中该节点
  1193. // SetSelectNode(node);
  1194. return false;
  1195. }
  1196. }
  1197. }
  1198. #endregion
  1199. #region 入窑前检验
  1200. if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.IntoKilnCheck)
  1201. {
  1202. // 入窑前检验前一个工序必须是装窑车
  1203. string err = BackIntoKilnCheckCheck(node, node);
  1204. if (!string.IsNullOrEmpty(err))
  1205. {
  1206. MessageBox.Show(err, "Error");
  1207. // 选中该节点
  1208. //SetSelectNode(node);
  1209. return false;
  1210. }
  1211. // 入窑前检验工序必须指向唯一一个坯库工序
  1212. // 入窑前检验工序必须指向唯一一个窑车补件工序
  1213. if (node.OutLines.Count != 1)
  1214. {
  1215. MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_INTOKILNCHECK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error");
  1216. // 选中该节点
  1217. //SetSelectNode(node);
  1218. return false;
  1219. }
  1220. else
  1221. if (((ProcedureEntity)node.OutLines[0].NodeEnd.TagNonSerialized).ModelType != (int)Constant.ProcedureModelType.AdobeStock)
  1222. {
  1223. MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_INTOKILNCHECK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error");
  1224. // 选中该节点
  1225. //SetSelectNode(node);
  1226. return false;
  1227. }
  1228. }
  1229. }
  1230. #endregion
  1231. #region 窑车补件
  1232. if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.CarAdd)
  1233. {
  1234. if (node.InLines.Count != 1)
  1235. {
  1236. MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_CARADD
  1237. + "工序,要求前工序必须是" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error");
  1238. // 选中该节点
  1239. //SetSelectNode(node);
  1240. return false;
  1241. }
  1242. // 前第一个工序不是坯库
  1243. if (((ProcedureEntity)node.InLines[0].NodeBegin.TagNonSerialized).ModelType != (int)Constant.ProcedureModelType.AdobeStock)
  1244. {
  1245. MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_CARADD
  1246. + "工序,要求前工序必须是" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error");
  1247. // 选中该节点
  1248. //SetSelectNode(node);
  1249. return false;
  1250. }
  1251. // 第二个前工序既不是坯库也不是入窑前检验
  1252. //if (node.InLines[1].StartNode.ProcedureEntity.ModelType != (int)Constant.ProcedureModelType.AdobeStock
  1253. // && node.InLines[1].StartNode.ProcedureEntity.ModelType != (int)Constant.ProcedureModelType.IntoKilnCheck)
  1254. //{
  1255. // MessageForm.Show("中间节点【" + node.NodeText + "】是" + Constant.PROCEDURE_CARADD + "工序,要求前工序必须是" + Constant.PROCEDURE_ADOBESTOCK + "和" + Constant.PROCEDURE_INTOKILNCHECK + "工序!", "Error");
  1256. // // 选中该节点
  1257. // SetSelectNode(node);
  1258. // return false;
  1259. //}
  1260. }
  1261. #endregion
  1262. //装窑车工序
  1263. if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.LoadCar)
  1264. {
  1265. if (procedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust)
  1266. {
  1267. MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_LOADCAR + "工序,要求为必须工序!", "Error");
  1268. // 选中该节点
  1269. //SetSelectNode(node);
  1270. return false;
  1271. }
  1272. // 校验装窑车后是入窑工序
  1273. string err = ForwardLoadCarCheck(node, node);
  1274. if (!string.IsNullOrEmpty(err))
  1275. {
  1276. MessageBox.Show(err, "Error");
  1277. // 选中该节点
  1278. //SetSelectNode(node);
  1279. return false;
  1280. }
  1281. }
  1282. // 入窑工序
  1283. else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.IntoKiln)
  1284. {
  1285. if (procedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust)
  1286. {
  1287. MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_INTOKILN + "工序,要求为必须工序!", "Error");
  1288. // 选中该节点
  1289. //SetSelectNode(node);
  1290. return false;
  1291. }
  1292. // 校验入窑工序前工序是否经过装窑车
  1293. string err = BackIntoKilnCheck(node, node);
  1294. if (!string.IsNullOrEmpty(err))
  1295. {
  1296. MessageBox.Show(err, "Error");
  1297. // 选中该节点
  1298. //SetSelectNode(node);
  1299. return false;
  1300. }
  1301. // 校验入窑工序后工序是出窑工序
  1302. //err = ForwardIntoKilnCheck(node, node);
  1303. //if (!string.IsNullOrEmpty(err))
  1304. //{
  1305. // MessageForm.Show(err, "Error");
  1306. // // 选中该节点
  1307. // SetSelectNode(node);
  1308. // return false;
  1309. //}
  1310. }
  1311. // 出窑工序
  1312. else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.OutKiln)
  1313. {
  1314. //if (node.ProcedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust)
  1315. //{
  1316. // MessageForm.Show("中间节点【" + node.NodeText + "】是" + Constant.PROCEDURE_OUTKILN + "工序,要求为必须工序!", "Error");
  1317. // // 选中该节点
  1318. // SetSelectNode(node);
  1319. // return false;
  1320. //}
  1321. // 校验出窑前工序是入窑工序
  1322. string err = BackOutKilnCheck(node, node);
  1323. if (!string.IsNullOrEmpty(err))
  1324. {
  1325. MessageBox.Show(err, "Error");
  1326. // 选中该节点
  1327. //SetSelectNode(node);
  1328. return false;
  1329. }
  1330. //校验出窑工序后工序是卸窑车工序
  1331. err = ForwardOutKilnCheck(node, node);
  1332. if (!string.IsNullOrEmpty(err))
  1333. {
  1334. MessageBox.Show(err, "Error");
  1335. // 选中该节点
  1336. //SetSelectNode(node);
  1337. return false;
  1338. }
  1339. }
  1340. // 卸窑车工序
  1341. else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.UnloadCar)
  1342. {
  1343. if (procedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust)
  1344. {
  1345. MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_UNLOADCAR + "工序,要求为必须工序!", "Error");
  1346. // 选中该节点
  1347. // SetSelectNode(node);
  1348. return false;
  1349. }
  1350. //校验卸窑车前工序是出窑工序
  1351. //string err = BackUnloadCarCheck(node, node);
  1352. //if (!string.IsNullOrEmpty(err))
  1353. //{
  1354. // MessageForm.Show(err, "Error");
  1355. // // 选中该节点
  1356. // SetSelectNode(node);
  1357. // return false;
  1358. //}
  1359. }
  1360. // 过程节点
  1361. if (node.OutLines.Count > 0)
  1362. {
  1363. // 过程(中间)工序标识
  1364. procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Middle;
  1365. }
  1366. // 结束节点
  1367. else
  1368. {
  1369. endCount++;
  1370. // 结束工序标识
  1371. procedureEntity.NodeType = (int)Constant.ProcedureNodeType.End;
  1372. //if (endCount > 1)
  1373. //{
  1374. // MessageBox.Show("生产线只能有一个结束节点!", "Error");
  1375. // // 选中该节点
  1376. // // SetSelectNode(node);
  1377. // return false;
  1378. //}
  1379. }
  1380. }
  1381. return true;
  1382. }
  1383. /// <summary>
  1384. /// 设置工序前后所到达的工序
  1385. /// </summary>
  1386. public void SetPorcessFlow()
  1387. {
  1388. foreach (var item in this.flowBox.CheckedNodes)
  1389. {
  1390. FlowNode node = (FlowNode)item;
  1391. List<ProcedureFlowEntity> flowList = new List<ProcedureFlowEntity>();
  1392. // 后工序,可以到达的下一个节点
  1393. SetArrive(node, node, flowList);
  1394. // 前工序,能到达此工序的工序
  1395. SetFrom(node, node, flowList);
  1396. //((ProcedureEntity)node.TagNonSerialized).ProcedureFlowDetailList = flowList.ToArray();
  1397. ((ProcedureEntity)node.TagNonSerialized).ProcedureFlowDetailList = flowList;
  1398. }
  1399. }
  1400. /// <summary>
  1401. /// 后工序,可以到达的下一个节点
  1402. /// </summary>
  1403. /// <param name="node"></param>
  1404. /// <param name="nextNode"></param>
  1405. private void SetArrive(FlowNode node, FlowNode nextNode, List<ProcedureFlowEntity> flowList)
  1406. {
  1407. foreach (FlowLine line in nextNode.OutLines)
  1408. {
  1409. if (flowList.Where(p => p.ArriveNodeNo == (line.NodeEnd.TagNonSerialized as ProcedureEntity).NodeNo).Count() == 0)
  1410. {
  1411. // 添加
  1412. flowList.Add(new ProcedureFlowEntity()
  1413. {
  1414. FlowFlag = (int)Constant.FlowFlag.Next,
  1415. ArriveNodeNo = (line.NodeEnd.TagNonSerialized as ProcedureEntity).NodeNo,
  1416. });
  1417. //ItemID
  1418. //xuwei move 2019-11-25
  1419. // 非必须工序 可以到达下一个节点
  1420. if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).MustFlag == (int)Constant.ProcedureMustFlag.NonMust)
  1421. {
  1422. SetArrive(node, line.NodeEnd, flowList);
  1423. }
  1424. }
  1425. //xuwei move 2019-11-25
  1426. // 非必须工序 可以到达下一个节点
  1427. //if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).MustFlag == (int)Constant.ProcedureMustFlag.NonMust)
  1428. //{
  1429. // SetArrive(node, line.NodeEnd, flowList);
  1430. //}
  1431. }
  1432. }
  1433. /// <summary>
  1434. /// 前工序,能到达此工序的工序
  1435. /// </summary>
  1436. /// <param name="node"></param>
  1437. /// <param name="fromNode"></param>
  1438. private void SetFrom(FlowNode node, FlowNode fromNode, List<ProcedureFlowEntity> flowList)
  1439. {
  1440. foreach (FlowLine line in fromNode.InLines)
  1441. {
  1442. //if (flowList.Where(p => p.ArriveNodeNo == line.NodeEnd.ItemID).Count() == 0)
  1443. if (flowList.Where(p => p.ArriveNodeNo == (line.NodeBegin.TagNonSerialized as ProcedureEntity).NodeNo ).Count() == 0)
  1444. {
  1445. // 添加
  1446. flowList.Add(new ProcedureFlowEntity()
  1447. {
  1448. FlowFlag = (int)Constant.FlowFlag.Previous,
  1449. ArriveNodeNo = (line.NodeBegin.TagNonSerialized as ProcedureEntity).NodeNo,
  1450. });
  1451. //line.NodeBegin.ItemID
  1452. //xuwei move 2019-11-25
  1453. // 非必须工序 可以到达下一个节点
  1454. if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).MustFlag == (int)Constant.ProcedureMustFlag.NonMust)
  1455. {
  1456. SetFrom(node, line.NodeBegin, flowList);
  1457. }
  1458. }
  1459. // xuwei move 2019-11-25
  1460. // 非必须工序 可以到达下一个节点
  1461. //if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).MustFlag == (int)Constant.ProcedureMustFlag.NonMust)
  1462. //{
  1463. // SetFrom(node, line.NodeBegin, flowList);
  1464. //}
  1465. }
  1466. }
  1467. /// <summary>
  1468. /// 元素的完整性检查(干补)
  1469. /// </summary>
  1470. public bool CheckIntegrity2()
  1471. {
  1472. if (this.flowBox.CheckedNodes.Count == 0) //不包括删除的
  1473. {
  1474. MessageBox.Show("请配置工序节点!", "Error");
  1475. return false;
  1476. }
  1477. // 连线校验
  1478. for (int i = 0; i < this.flowBox.CheckedLines.Count; i++)
  1479. {
  1480. FlowLine line = (FlowLine)this.flowBox.CheckedLines[i];
  1481. //开始端点没有连接
  1482. if (line.NodeBegin == null)
  1483. {
  1484. MessageBox.Show("连线【" + line.Name + "】开始端点没有连接节点!", "Error");
  1485. //line.Content = "开始端点没有连接节点";
  1486. // 选中该线
  1487. //SetSelectLine(line);
  1488. return false;
  1489. }
  1490. else if (line.NodeEnd == null)
  1491. {
  1492. MessageBox.Show("连线【" + line.Name + "】结束端点没有连接节点!", "Error");
  1493. //line.Content = "结束端点没有连接节点";
  1494. //选中该线
  1495. //SetSelectLine(line);
  1496. return false;
  1497. }
  1498. //干补判断
  1499. if (line.NodeBegin != null)
  1500. {
  1501. if (((ProcedureEntity)line.NodeBegin.TagNonSerialized as ProcedureEntity).ModelType == 8)
  1502. {
  1503. MessageBox.Show("连线【" + line.Name + "】开始端点不能连接干补节点!", "Error");
  1504. return false;
  1505. }
  1506. // wangx 2017-7-20
  1507. if (((ProcedureEntity)line.NodeEnd.TagNonSerialized as ProcedureEntity).ModelType == 8)
  1508. {
  1509. MessageBox.Show("连线【" + line.Name + "】结束端点不能连接干补节点!", "Error");
  1510. return false;
  1511. }
  1512. if (((ProcedureEntity)line.NodeEnd.TagNonSerialized as ProcedureEntity).ModelType == 9)
  1513. {
  1514. MessageBox.Show("连线【" + line.Name + "】结束端点不能连接回收节点!", "Error");
  1515. return false;
  1516. }
  1517. // wangx 2017-7-20 end
  1518. }
  1519. else if (line.NodeEnd != null)
  1520. {
  1521. if (((ProcedureEntity)line.NodeBegin.TagNonSerialized as ProcedureEntity).ModelType == 8)
  1522. {
  1523. MessageBox.Show("连线【" + line.Name + "】结束端点不能连接干补节点!", "Error");
  1524. return false;
  1525. }
  1526. }
  1527. //干补判断
  1528. //校验是否有2个以上的线开始端点和结束端点连接的都是一个节点(重复连接)
  1529. for (int j = i + 1; j < this.flowBox.CheckedLines.Count; j++)
  1530. {
  1531. FlowLine nextLine = (FlowLine)this.flowBox.CheckedLines[j];
  1532. if (line.NodeBegin.Equals(nextLine.NodeBegin)
  1533. && line.NodeEnd.Equals(nextLine.NodeEnd))
  1534. {
  1535. MessageBox.Show("连线【" + line.Name + "】与连线【" + nextLine.Name + "】属于重复连接节点!", "Error");
  1536. //line.Content = "连线与连线【" + nextLine.Content + "】属于重复连接节点";
  1537. //选中该线
  1538. //SetSelectLine(line);
  1539. return false;
  1540. }
  1541. }
  1542. }
  1543. DataTable procedureTable = this.ProductionDataSet.Tables["procedureTable"];
  1544. if (this._ValueFlagRow > 0)
  1545. {
  1546. bool existProcedureCode = false;
  1547. string ProcedureCode = "";
  1548. string ProcedureName = "";
  1549. for (int i = 0; i < this.flowBox.CheckedNodes.Count; i++)
  1550. {
  1551. FlowNode node = (FlowNode)this.flowBox.CheckedNodes[i];
  1552. ProcedureEntity procedureEntity = node.TagNonSerialized as ProcedureEntity;
  1553. DataRow[] dr = procedureTable.Select("ValueFlag=0 and ProcedureCode='" + procedureEntity.ProcedureCode + "'");
  1554. if (dr.Length > 0)
  1555. {
  1556. existProcedureCode = true;
  1557. ProcedureCode = procedureEntity.ProcedureCode;
  1558. ProcedureName = procedureEntity.ProcedureName;
  1559. break;
  1560. }
  1561. }
  1562. if (existProcedureCode)
  1563. {
  1564. MessageBox.Show(ProcedureName + "工序【" + ProcedureCode + "】编码已经存在!", "Error");
  1565. return false;
  1566. }
  1567. }
  1568. //结束节点的数量
  1569. int endCount = 0;
  1570. for (int i = 0; i < this.flowBox.CheckedNodes.Count; i++)
  1571. {
  1572. FlowNode node = (FlowNode)this.flowBox.CheckedNodes[i];
  1573. ProcedureEntity procedureEntity = node.TagNonSerialized as ProcedureEntity;
  1574. // 必填项校验
  1575. if (procedureEntity.OrganizationID <= 0)
  1576. {
  1577. MessageBox.Show("节点【" + node.Name + "】的组织机构不能为空!", "Error");
  1578. // 选中该节点
  1579. //SetSelectNode(node);
  1580. return false;
  1581. }
  1582. // 校验回环节点
  1583. //node.NextNodes = new List<FlowNode>();
  1584. if (!LoopNodeCheck(node, null))
  1585. {
  1586. MessageBox.Show("有循环节点存在,请重新设置!", "Error");
  1587. return false;
  1588. }
  1589. // 开始节点
  1590. if (node.InLines.Count == 0)
  1591. {
  1592. // 开始节点校验
  1593. // 孤立的节点
  1594. //if (node.OutLines.Count == 0)
  1595. if (node.OutLines.Count == 0 && procedureEntity.ModelType != 8)
  1596. {
  1597. MessageBox.Show("节点【" + node.Name + "】是孤立工序!", "Error");
  1598. // 选中该节点
  1599. // SetSelectNode(node);
  1600. return false;
  1601. }
  1602. // 开始节点不能是成验和入窑前检验节点
  1603. else if (node.NodeImageType != 1)
  1604. {
  1605. //if (procedureEntity.ModelType!= 0)
  1606. //{
  1607. MessageBox.Show("开始节点【" + node.Name + "】不能是成品检验或者入窑前检验工序!", "Error");
  1608. // 选中该节点
  1609. // SetSelectNode(node);
  1610. return false;
  1611. // }
  1612. }
  1613. // 开始节点可以非必须
  1614. //if (procedureEntity.MustFlag == Constant.ProcedureMustFlag.NonMust.GetHashCode())
  1615. //{
  1616. // MessageBox.Show("开始节点【" + node.Name + "】不能是非必须工序!", "Error");
  1617. // // 选中该节点
  1618. // //SetSelectNode(node);
  1619. // return false;
  1620. //}
  1621. // 开始工序必须为交坯或特殊返工工序
  1622. // 注释 先不做校验
  1623. //if (node.ProcedureEntity.IsSpecialRework != 1 && node.ProcedureEntity.ModelType != (int)Constant.ProcedureModelType.DeliverAdobe)
  1624. //{
  1625. // MessageForm.Show("开始节点【" + node.NodeText + "】必须为交坯或特殊返工工序!", "Error");
  1626. // // 选中该节点
  1627. // SetSelectNode(node);
  1628. // return false;
  1629. //}
  1630. // 开始节点如果是特定返工工序就必须与(标准计件或装窑车)组合
  1631. else if (procedureEntity.IsSpecialRework == (int)Constant.SpecialReworkFlag.Yes
  1632. && procedureEntity.ModelType != (int)Constant.ProcedureModelType.Normal
  1633. && procedureEntity.ModelType != (int)Constant.ProcedureModelType.LoadCar)
  1634. {
  1635. MessageBox.Show("开始节点【" + node.Name + "】是特定返工工序时,工序类别必须是" + Constant.PROCEDURE_NORMAL + "或" + Constant.PROCEDURE_LOADCAR + "!", "Error");
  1636. // 选中该节点
  1637. //SetSelectNode(node);
  1638. return false;
  1639. }
  1640. // 暂时不需要校验
  1641. // 开始节点如果是非特定返工工序那必须与交坯组合
  1642. //else if (node.ProcedureEntity.IsSpecialRework == 0
  1643. // && node.ProcedureEntity.ModelType != 5)
  1644. //{
  1645. // MessageForm.Show("开始节点【" + node.NodeText + "】工序类别是" + Constant.PROCEDURE_DELIVERADOBE + "时,不能是特定返工工序!", "Error");
  1646. // // 选中该节点
  1647. // SetSelectNode(node);
  1648. // return false;
  1649. //}
  1650. // 交坯工序必须为必须工序
  1651. else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.DeliverMud && procedureEntity.MustFlag == 0)
  1652. {
  1653. MessageBox.Show("开始节点【" + node.Name + "】是" + Constant.PROCEDURE_DELIVERADOBE + "工序时为必须工序!", "Error");
  1654. // 选中该节点
  1655. //SetSelectNode(node);
  1656. return false;
  1657. }
  1658. // 开始工序不能为窑车补件工序
  1659. else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.CarAdd)
  1660. {
  1661. MessageBox.Show("开始节点【" + node.Name + "】工序类别不能是" + Constant.PROCEDURE_CARADD + "工序!", "Error");
  1662. // 选中该节点
  1663. // SetSelectNode(node);
  1664. return false;
  1665. }
  1666. // 开始工序标识
  1667. procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Begin;
  1668. // 特殊返工工序 将工序节点类型修改成中间工序
  1669. if (procedureEntity.IsSpecialRework == Constant.SpecialReworkFlag.Yes.GetHashCode())
  1670. {
  1671. procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Middle;
  1672. }
  1673. }
  1674. // 过程节点
  1675. else
  1676. {
  1677. //过程节点校验
  1678. #region 中间节点不能设置为特殊返工工序
  1679. if (procedureEntity.IsSpecialRework == (int)Constant.SpecialReworkFlag.Yes)
  1680. {
  1681. MessageBox.Show("中间节点【" + node.Name + "】不能设置为特殊返工工序!", "Error");
  1682. // 选中该节点
  1683. //SetSelectNode(node);
  1684. return false;
  1685. }
  1686. #endregion
  1687. #region 校验坯库工序
  1688. if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.AdobeStock)
  1689. {
  1690. // 坯库工序必须指向唯一一个窑车补件工序
  1691. if (node.OutLines.Count > 1 || node.OutLines.Count == 0)
  1692. {
  1693. MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_ADOBESTOCK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_CARADD + "工序!", "Error");
  1694. // 选中该节点
  1695. // SetSelectNode(node);
  1696. return false;
  1697. }
  1698. else
  1699. {
  1700. // 坯库工序所指向的节点不是窑车补件
  1701. ProcedureEntity ProcedureEntityEnd = node.OutLines[0].NodeEnd.TagNonSerialized as ProcedureEntity;
  1702. if (ProcedureEntityEnd.ModelType != (int)Constant.ProcedureModelType.CarAdd)
  1703. {
  1704. MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_ADOBESTOCK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_CARADD + "工序!", "Error");
  1705. // 选中该节点
  1706. // SetSelectNode(node);
  1707. return false;
  1708. }
  1709. }
  1710. }
  1711. #endregion
  1712. #region 入窑前检验
  1713. if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.IntoKilnCheck)
  1714. {
  1715. // 入窑前检验前一个工序必须是装窑车
  1716. string err = BackIntoKilnCheckCheck(node, node);
  1717. if (!string.IsNullOrEmpty(err))
  1718. {
  1719. MessageBox.Show(err, "Error");
  1720. // 选中该节点
  1721. //SetSelectNode(node);
  1722. return false;
  1723. }
  1724. // 入窑前检验工序必须指向唯一一个坯库工序
  1725. // 入窑前检验工序必须指向唯一一个窑车补件工序
  1726. if (node.OutLines.Count != 1)
  1727. {
  1728. MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_INTOKILNCHECK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error");
  1729. // 选中该节点
  1730. //SetSelectNode(node);
  1731. return false;
  1732. }
  1733. // wangxin 2015/4/16
  1734. //else
  1735. // if (((ProcedureEntity)node.OutLines[0].NodeEnd.TagNonSerialized).ModelType != (int)Constant.ProcedureModelType.AdobeStock)
  1736. // {
  1737. // MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_INTOKILNCHECK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error");
  1738. // // 选中该节点
  1739. // //SetSelectNode(node);
  1740. // return false;
  1741. // }
  1742. // wangxin 2015/4/16 end
  1743. }
  1744. #endregion
  1745. }
  1746. #region 窑车补件
  1747. if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.CarAdd)
  1748. {
  1749. // wangxin 2015/4/16
  1750. //if (node.InLines.Count != 1)
  1751. //{
  1752. // MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_CARADD
  1753. // + "工序,要求前工序必须是" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error");
  1754. // // 选中该节点
  1755. // //SetSelectNode(node);
  1756. // return false;
  1757. //}
  1758. // 前第一个工序不是坯库
  1759. //if (((ProcedureEntity)node.InLines[0].NodeBegin.TagNonSerialized).ModelType != (int)Constant.ProcedureModelType.AdobeStock)
  1760. //{
  1761. // MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_CARADD
  1762. // + "工序,要求前工序必须是" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error");
  1763. // // 选中该节点
  1764. // //SetSelectNode(node);
  1765. // return false;
  1766. //}
  1767. // wangxin 2015/4/16 end
  1768. // 第二个前工序既不是坯库也不是入窑前检验
  1769. //if (node.InLines[1].StartNode.ProcedureEntity.ModelType != (int)Constant.ProcedureModelType.AdobeStock
  1770. // && node.InLines[1].StartNode.ProcedureEntity.ModelType != (int)Constant.ProcedureModelType.IntoKilnCheck)
  1771. //{
  1772. // MessageForm.Show("中间节点【" + node.NodeText + "】是" + Constant.PROCEDURE_CARADD + "工序,要求前工序必须是" + Constant.PROCEDURE_ADOBESTOCK + "和" + Constant.PROCEDURE_INTOKILNCHECK + "工序!", "Error");
  1773. // // 选中该节点
  1774. // SetSelectNode(node);
  1775. // return false;
  1776. //}
  1777. }
  1778. #endregion
  1779. #region 装窑车工序
  1780. if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.LoadCar)
  1781. {
  1782. if (procedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust)
  1783. {
  1784. MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_LOADCAR + "工序,要求为必须工序!", "Error");
  1785. // 选中该节点
  1786. //SetSelectNode(node);
  1787. return false;
  1788. }
  1789. // modify 2015/06/01 wangx begin
  1790. //// 校验装窑车后是入窑工序
  1791. //string err = ForwardLoadCarCheck(node, node);
  1792. //if (!string.IsNullOrEmpty(err))
  1793. //{
  1794. // MessageBox.Show(err, "Error");
  1795. // return false;
  1796. //}
  1797. // modify 2015/06/01 wangx end
  1798. }
  1799. #endregion
  1800. #region 入窑工序
  1801. else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.IntoKiln)
  1802. {
  1803. // modify 2015/06/01 wangx begin
  1804. if (procedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust)
  1805. {
  1806. // MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_INTOKILN + "工序,要求为必须工序!", "Error");
  1807. // return false;
  1808. }
  1809. // modify 2015/06/01 wangx end
  1810. // 校验入窑工序前工序是否经过装窑车
  1811. string err = BackIntoKilnCheck(node, node);
  1812. if (!string.IsNullOrEmpty(err))
  1813. {
  1814. MessageBox.Show(err, "Error");
  1815. // 选中该节点
  1816. //SetSelectNode(node);
  1817. return false;
  1818. }
  1819. // 校验入窑工序后工序是出窑工序
  1820. //err = ForwardIntoKilnCheck(node, node);
  1821. //if (!string.IsNullOrEmpty(err))
  1822. //{
  1823. // MessageForm.Show(err, "Error");
  1824. // // 选中该节点
  1825. // SetSelectNode(node);
  1826. // return false;
  1827. //}
  1828. }
  1829. #endregion
  1830. #region 出窑工序
  1831. else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.OutKiln)
  1832. {
  1833. //if (node.ProcedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust)
  1834. //{
  1835. // MessageForm.Show("中间节点【" + node.NodeText + "】是" + Constant.PROCEDURE_OUTKILN + "工序,要求为必须工序!", "Error");
  1836. // // 选中该节点
  1837. // SetSelectNode(node);
  1838. // return false;
  1839. //}
  1840. // 校验出窑前工序是入窑工序
  1841. string err = BackOutKilnCheck(node, node);
  1842. if (!string.IsNullOrEmpty(err))
  1843. {
  1844. MessageBox.Show(err, "Error");
  1845. // 选中该节点
  1846. //SetSelectNode(node);
  1847. return false;
  1848. }
  1849. //校验出窑工序后工序是卸窑车工序
  1850. err = ForwardOutKilnCheck(node, node);
  1851. if (!string.IsNullOrEmpty(err))
  1852. {
  1853. MessageBox.Show(err, "Error");
  1854. // 选中该节点
  1855. //SetSelectNode(node);
  1856. return false;
  1857. }
  1858. }
  1859. #endregion
  1860. #region 卸窑车工序
  1861. else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.UnloadCar)
  1862. {
  1863. if (procedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust)
  1864. {
  1865. MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_UNLOADCAR + "工序,要求为必须工序!", "Error");
  1866. // 选中该节点
  1867. // SetSelectNode(node);
  1868. return false;
  1869. }
  1870. //校验卸窑车前工序是出窑工序
  1871. //string err = BackUnloadCarCheck(node, node);
  1872. //if (!string.IsNullOrEmpty(err))
  1873. //{
  1874. // MessageForm.Show(err, "Error");
  1875. // // 选中该节点
  1876. // SetSelectNode(node);
  1877. // return false;
  1878. //}
  1879. }
  1880. #endregion
  1881. // 过程节点
  1882. if (node.OutLines.Count > 0)
  1883. {
  1884. // 过程(中间)工序标识
  1885. if (node.InLines.Count > 0)
  1886. {
  1887. if (node.CheckedNodeType == FlowNodeType.Begin)
  1888. { procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Begin; }
  1889. else{ procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Middle; }
  1890. }
  1891. else
  1892. {
  1893. if (procedureEntity.IsSpecialRework == Constant.SpecialReworkFlag.Yes.GetHashCode())
  1894. {
  1895. procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Middle;
  1896. }
  1897. else
  1898. {
  1899. procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Begin;
  1900. }
  1901. }
  1902. }
  1903. // 结束节点
  1904. else
  1905. {
  1906. if (procedureEntity.ModelType != 8)
  1907. {
  1908. //this._procedureEntity.NodeType != (int)Constant.ProcedureNodeType.End
  1909. if (procedureEntity.ModelType == (int)Dongke.IBOSS.PRD.Basics.BaseResources.Constant.ProcedureModelType.Normal
  1910. && procedureEntity.UnDo == 1)
  1911. {
  1912. MessageBox.Show("结束节点" + node.Name + "不能撤销计件!", "Error");
  1913. return false;
  1914. }
  1915. endCount++;
  1916. }
  1917. // 结束工序标识
  1918. procedureEntity.NodeType = (int)Constant.ProcedureNodeType.End;
  1919. //if (endCount > 1)
  1920. //{
  1921. // MessageBox.Show("生产线只能有一个结束节点!", "Error");
  1922. // // 选中该节点
  1923. // // SetSelectNode(node);
  1924. // return false;
  1925. //}
  1926. }
  1927. }
  1928. return true;
  1929. }
  1930. /// <summary>
  1931. /// 设置工序前后所到达的工序
  1932. /// </summary>
  1933. public void SetPorcessFlow2()
  1934. {
  1935. foreach (var item in this.flowBox.CheckedNodes)
  1936. {
  1937. FlowNode node = (FlowNode)item;
  1938. List<ProcedureFlowEntity> flowList = new List<ProcedureFlowEntity>();
  1939. // 后工序,可以到达的下一个节点
  1940. SetArrive(node, node, flowList);
  1941. // 前工序,能到达此工序的工序
  1942. SetFrom(node, node, flowList);
  1943. //((ProcedureEntity)node.TagNonSerialized).ProcedureFlowDetailList = flowList.ToArray();
  1944. if (((ProcedureEntity)node.TagNonSerialized).ModelType == 8)//干补
  1945. {
  1946. ((ProcedureEntity)node.TagNonSerialized).ProcedureFlowDetailList = null;
  1947. ((ProcedureEntity)node.TagNonSerialized).NodeType = 2;
  1948. }
  1949. else
  1950. {
  1951. if (((ProcedureEntity)node.TagNonSerialized).ModelType == 9)//回收
  1952. {
  1953. ((ProcedureEntity)node.TagNonSerialized).NodeType = 2;
  1954. }
  1955. //((ProcedureEntity)node.TagNonSerialized).ProcedureFlowDetailList = flowList.ToArray();
  1956. ((ProcedureEntity)node.TagNonSerialized).ProcedureFlowDetailList = flowList;
  1957. }
  1958. }
  1959. }
  1960. #endregion
  1961. }
  1962. }