/******************************************************************************* * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential * 类的信息: * 1.程序名称:F_PC_0203.cs * 2.功能描述:生产线配置编辑界面 * 编辑履历: * 作者 日期 版本 修改内容 * 王鑫 2015/03/27 1.00 新建 *******************************************************************************/ using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Windows.Forms; using System.Linq; using Dongke.IBOSS.Basics.FlowSetting; using Dongke.IBOSS.PRD.Basics.BaseControls; using Dongke.IBOSS.PRD.Basics.BaseResources; using Dongke.IBOSS.PRD.Client.CommonModule; using Dongke.IBOSS.PRD.WCF.Proxys; using Dongke.IBOSS.PRD.WCF.Proxys.PCModuleService; using Dongke.IBOSS.PRD.WCF.DataModels; namespace Dongke.IBOSS.PRD.Client.PCModule { /// /// 生产线配置 /// public partial class F_PC_0203 : FormBase { #region 成员变量 private int _lineID = -1; //生产线ID private string _lineCode; //生产线编码 private string _lineName; //生产线名称 private string _remarks; //备注 private int _valueflag; //启用、禁用标记 private Constant.FormMode _editStatus; //窗体编辑状态 private List _IDList = new List(); // ID集合 private DataSet productionDataSet = null; //生产配置数据集 private int _ValueFlagRow = 0; //工序标识禁用的行数 private DateTime _optimestamp; // 时间戳 private string _productionlinecode; //保存成功后回显的生产线编码 private int? _nodeno; //节点唯一值 FlowNode _currentnode = null; //当前弹出节点 private bool _hasClose = false; #endregion #region 属性 /// /// 生产配置数据 /// public DataSet ProductionDataSet { get { return this.productionDataSet; } set { this.productionDataSet = value; } } /// /// ID集合 /// public List IDList { get { return _IDList; } set { _IDList = value; } } /// /// 时间戳 /// public DateTime OPTimeStamp { get { return _optimestamp; } set { _optimestamp = value; } } /// /// 保存成功后回显的生产线编码 /// public string ProductionlineCode { get { return _productionlinecode; } set { _productionlinecode = value; } } #endregion #region 构造函数 public F_PC_0203(Constant.FormMode editStatus, int lineID, string lineCode, string lineName, string remarks, int valueflag) { InitializeComponent(); this._lineID = lineID; this._lineCode = lineCode; this._lineName = lineName; this._remarks = remarks; this._valueflag = valueflag; this._editStatus = editStatus; } public F_PC_0203(Constant.FormMode editStatus, int lineID, string lineCode, string lineName, string remarks, int valueflag, int? nodeno) { InitializeComponent(); this._lineID = lineID; this._lineCode = lineCode; this._lineName = lineName; this._remarks = remarks; this._valueflag = valueflag; this._editStatus = editStatus; this._nodeno = nodeno; } #endregion #region 事件 /// /// 窗体加载事件 /// /// /// private void F_PC_0203_Load(object sender, System.EventArgs e) { this.txtLineCode.Focus(); // 查询数据 this.ProductionDataSet = PCModuleProxy.Service.GetProductionLineDetail(this._lineID); // tableName 要与 Dongke.IBOSS.PRD.Service.ConfigModuleLogic.ConfigModuleLogic的GetProductionLineDetail方法定义的名称对应 // 加载生产线信息 DataTable lineTable = this.ProductionDataSet.Tables["lineTable"]; // 画图 if (lineTable != null && lineTable.Rows.Count > 0) { this.flowBox.LoadFlow((byte[])(lineTable.Rows[0]["FlowXML"])); this.OPTimeStamp = Convert.ToDateTime(lineTable.Rows[0]["OPTimeStamp"]); } //加载画布大小给文本框 this.txtFlowWidth.Text = this.flowBox.CanvasSize.Width.ToString(); this.txtFlowHeigth.Text = this.flowBox.CanvasSize.Height.ToString(); // 加载工序信息 DataTable procedureTable = this.ProductionDataSet.Tables["procedureTable"]; _ValueFlagRow = procedureTable.Select("ValueFlag=0").Length; DataView dv = procedureTable.DefaultView; dv.RowFilter = "ValueFlag=1"; procedureTable = dv.ToTable(); foreach (FlowNode node in this.flowBox.AllNodes) { DataRow[] dr1 = procedureTable.Select("NodeNo=" + node.ItemID); if (node.ItemID == this._nodeno) { this._nodeno = node.ItemID; this._currentnode = node; } if (dr1.Length > 0) { node.NodeImageType = Convert.ToInt32(dr1[0]["ProcedureModel"]);//工序模型为了给双击事件弹出对应的窗体 } if (node.NodeImageType == 1) { if (Convert.ToInt32(dr1[0]["modeltype"]) == Constant.ProcedureModelType.IntoKiln.GetHashCode()) { node.NodeImage = new Bitmap(this.GetType(), "images.入窑64-01.png"); } else if (Convert.ToInt32(dr1[0]["modeltype"]) == Constant.ProcedureModelType.LoadCar.GetHashCode()) { node.NodeImage = new Bitmap(this.GetType(), "images.装车64-01.png"); } else if (Convert.ToInt32(dr1[0]["modeltype"]) == Constant.ProcedureModelType.UnloadCar.GetHashCode()) { node.NodeImage = new Bitmap(this.GetType(), "images.卸车64-01.png"); } else { node.NodeImage = new Bitmap(this.GetType(), "images.newflow.png"); } } else { node.NodeImage = new Bitmap(this.GetType(), "images.newflowcheck.png"); } if (Convert.ToInt32(dr1[0]["MustFlag"].ToString()) == 1) { node.CanSkip = false; } else { node.CanSkip = true; } node.Code = dr1[0]["ProcedureCode"].ToString(); node.Name = dr1[0]["ProcedureName"].ToString(); node.Remark = dr1[0]["Remarks"].ToString(); ProcedureEntity procedureEntity = new ProcedureEntity();//工序 procedureEntity.ProcedureID = Convert.ToInt32(dr1[0]["ProcedureID"].ToString()); procedureEntity.ProcedureCode = dr1[0]["ProcedureCode"].ToString(); procedureEntity.ProcedureName = dr1[0]["ProcedureName"].ToString(); procedureEntity.ProcedureModel = Convert.ToInt32(dr1[0]["ProcedureModel"].ToString()); procedureEntity.ModelType = Convert.ToInt32(dr1[0]["modeltype"].ToString()); procedureEntity.NodeType = Convert.ToInt32(dr1[0]["nodetype"].ToString()); procedureEntity.MustFlag = Convert.ToInt32(dr1[0]["MustFlag"].ToString()); procedureEntity.CollectType = Convert.ToInt32(dr1[0]["CollectType"].ToString()); procedureEntity.PieceType = Convert.ToInt32(dr1[0]["PieceType"].ToString()); procedureEntity.IsSpecialRework = Convert.ToInt32(dr1[0]["isspecialrework"].ToString()); //xuwei add 2019-10-17 procedureEntity.IsSemireWork = Convert.ToInt32(dr1[0]["isSemireWork"].ToString()); procedureEntity.OrganizationID = Convert.ToInt32(dr1[0]["OrganizationID"].ToString()); procedureEntity.Remarks = dr1[0]["Remarks"].ToString(); procedureEntity.NodeNo = Convert.ToInt32(dr1[0]["NodeNo"]); procedureEntity.MissPriority = Convert.ToInt32(dr1[0]["misspriority"]); procedureEntity.DisplayNo = Convert.ToInt32(dr1[0]["DisplayNo"]); procedureEntity.UnDo = Convert.ToInt32(dr1[0]["UNDOFLAG"]); procedureEntity.DeliverType = Convert.ToInt32(dr1[0]["DeliverType"]); procedureEntity.BarCodePrintCopies = Convert.ToInt32(dr1[0]["BarCodePrintCopies"]); procedureEntity.BarCodeFlag = Convert.ToInt32(dr1[0]["BarCodeFlag"]); //if (dr1[0]["LogoID"] != DBNull.Value) //{ // procedureEntity.LogoID = Convert.ToInt32(dr1[0]["LogoID"]); //} // 对应产品信息 DataRow[] goodsRows = this.ProductionDataSet.Tables["procedureGoodsTable"].Select("NodeNo =" + node.ItemID); if (goodsRows != null && goodsRows.Length > 0) { procedureEntity.ProcedureGoodsTable = goodsRows.CopyToDataTable(); procedureEntity.ProcedureGoodsTable.TableName = "procedureGoodsTable"; } else { procedureEntity.ProcedureGoodsTable = this.ProductionDataSet.Tables["procedureGoodsTable"].Clone(); } // 工序对应工号表 DataRow[] userRows = this.ProductionDataSet.Tables["procedureUserTable"].Select("NodeNo =" + node.ItemID); if (userRows != null && userRows.Length > 0) { procedureEntity.ProcedureUserTable = userRows.CopyToDataTable(); procedureEntity.ProcedureUserTable.TableName = "procedureUserTable"; } else { procedureEntity.ProcedureUserTable = this.ProductionDataSet.Tables["procedureUserTable"].Clone(); } // 工序对应缺陷表(在检验工序中能检验出来的缺陷。) DataRow[] defectRows = this.ProductionDataSet.Tables["procedureDefectTable"].Select("NodeNo =" + node.ItemID); if (defectRows != null && defectRows.Length > 0) { procedureEntity.ProcedureDefectTable = defectRows.CopyToDataTable(); procedureEntity.ProcedureDefectTable.TableName = "procedureDefectTable"; } else { procedureEntity.ProcedureDefectTable = this.ProductionDataSet.Tables["procedureDefectTable"].Clone(); } // 生产工序对应缺陷表 DataRow[] defectProcedureJobsRows = this.ProductionDataSet.Tables["defectProcedureJobsTable"].Select("NodeNo =" + node.ItemID); if (defectProcedureJobsRows != null && defectProcedureJobsRows.Length > 0) { procedureEntity.DefectProcedureJobsTable = defectProcedureJobsRows.CopyToDataTable(); procedureEntity.DefectProcedureJobsTable.TableName = "defectProcedureJobsTable"; } else { procedureEntity.DefectProcedureJobsTable = this.ProductionDataSet.Tables["defectProcedureJobsTable"].Clone(); } // 工序对应窑炉 DataRow[] kilnRows = this.ProductionDataSet.Tables["procedureKilnTable"].Select("NodeNo =" + node.ItemID); if (kilnRows != null && kilnRows.Length > 0) { procedureEntity.ProcedureKilnTable = kilnRows.CopyToDataTable(); procedureEntity.ProcedureKilnTable.TableName = "procedureKilnTable"; } else { procedureEntity.ProcedureKilnTable = this.ProductionDataSet.Tables["procedureKilnTable"].Clone(); } node.TagNonSerialized = procedureEntity; } //for (int i = 0; i < procedureTable.Rows.Count; i++) //{ // #region 加载工序信息 // FlowNode node = (FlowNode)this.flowBox.AllNodes[i]; // //if (node.NodeImageType == int.Parse(procedureTable.Rows[i]["ProcedureModel"].ToString())) // //{ // node.NodeImageType = int.Parse(procedureTable.Rows[i]["ProcedureModel"].ToString());//工序模型为了给双击事件弹出对应的窗体 // //} // if (node.NodeImageType == 1) // { // if (int.Parse(procedureTable.Rows[i]["modeltype"].ToString()) == Constant.ProcedureModelType.IntoKiln.GetHashCode()) // { // node.NodeImage = new Bitmap(this.GetType(), "images.入窑64-01.png"); // } // else if (int.Parse(procedureTable.Rows[i]["modeltype"].ToString()) == Constant.ProcedureModelType.LoadCar.GetHashCode()) // { // node.NodeImage = new Bitmap(this.GetType(), "images.装车64-01.png"); // } // else if (int.Parse(procedureTable.Rows[i]["modeltype"].ToString()) == Constant.ProcedureModelType.UnloadCar.GetHashCode()) // { // node.NodeImage = new Bitmap(this.GetType(), "images.卸车64-01.png"); // } // else // { // node.NodeImage = new Bitmap(this.GetType(), "images.newflow.png"); // } // } // else // { // node.NodeImage = new Bitmap(this.GetType(), "images.newflowcheck.png"); // } // if (int.Parse(procedureTable.Rows[i]["MustFlag"].ToString()) == 1) // { // node.CanSkip = true; // } // else // { // node.CanSkip = false; // } // node.Code = procedureTable.Rows[i]["ProcedureCode"].ToString(); // node.Name = procedureTable.Rows[i]["ProcedureName"].ToString(); // node.Remark = procedureTable.Rows[i]["Remarks"].ToString(); // ProcedureEntity procedureEntity = new ProcedureEntity();//工序 // procedureEntity.ProcedureID = int.Parse(procedureTable.Rows[i]["ProcedureID"].ToString()); // procedureEntity.ProcedureCode = procedureTable.Rows[i]["ProcedureCode"].ToString(); // procedureEntity.ProcedureName = procedureTable.Rows[i]["ProcedureName"].ToString(); // procedureEntity.ProcedureModel = int.Parse(procedureTable.Rows[i]["ProcedureModel"].ToString()); // procedureEntity.ModelType = int.Parse(procedureTable.Rows[i]["modeltype"].ToString()); // procedureEntity.NodeType = int.Parse(procedureTable.Rows[i]["nodetype"].ToString()); // procedureEntity.MustFlag = int.Parse(procedureTable.Rows[i]["MustFlag"].ToString()); // procedureEntity.CollectType = int.Parse(procedureTable.Rows[i]["CollectType"].ToString()); // procedureEntity.PieceType = int.Parse(procedureTable.Rows[i]["PieceType"].ToString()); // procedureEntity.IsSpecialRework = int.Parse(procedureTable.Rows[i]["isspecialrework"].ToString()); // procedureEntity.OrganizationID = int.Parse(procedureTable.Rows[i]["OrganizationID"].ToString()); // procedureEntity.Remarks = procedureTable.Rows[i]["Remarks"].ToString(); // procedureEntity.NodeNo = Convert.ToInt32(procedureTable.Rows[i]["NodeNo"]); // // 对应产品信息 // DataRow[] goodsRows = this.ProductionDataSet.Tables["procedureGoodsTable"].Select("NodeNo =" + procedureTable.Rows[i]["NodeNo"].ToString()); // if (goodsRows != null && goodsRows.Length > 0) // { // procedureEntity.ProcedureGoodsTable = goodsRows.CopyToDataTable(); // procedureEntity.ProcedureGoodsTable.TableName = "procedureGoodsTable"; // } // else // { // procedureEntity.ProcedureGoodsTable = this.ProductionDataSet.Tables["procedureGoodsTable"].Clone(); // } // // 工序对应工号表 // DataRow[] userRows = this.ProductionDataSet.Tables["procedureUserTable"].Select("NodeNo =" + procedureTable.Rows[i]["NodeNo"].ToString()); // if (userRows != null && userRows.Length > 0) // { // procedureEntity.ProcedureUserTable = userRows.CopyToDataTable(); // procedureEntity.ProcedureUserTable.TableName = "procedureUserTable"; // } // else // { // procedureEntity.ProcedureUserTable = this.ProductionDataSet.Tables["procedureUserTable"].Clone(); // } // // 工序对应缺陷表(在检验工序中能检验出来的缺陷。) // DataRow[] defectRows = this.ProductionDataSet.Tables["procedureDefectTable"].Select("NodeNo =" + procedureTable.Rows[i]["NodeNo"].ToString()); // if (defectRows != null && defectRows.Length > 0) // { // procedureEntity.ProcedureDefectTable = defectRows.CopyToDataTable(); // procedureEntity.ProcedureDefectTable.TableName = "procedureDefectTable"; // } // else // { // procedureEntity.ProcedureDefectTable = this.ProductionDataSet.Tables["procedureDefectTable"].Clone(); // } // // 生产工序对应缺陷表 // DataRow[] defectProcedureJobsRows = this.ProductionDataSet.Tables["defectProcedureJobsTable"].Select("NodeNo =" + procedureTable.Rows[i]["NodeNo"].ToString()); // if (defectProcedureJobsRows != null && defectProcedureJobsRows.Length > 0) // { // procedureEntity.DefectProcedureJobsTable = defectProcedureJobsRows.CopyToDataTable(); // procedureEntity.DefectProcedureJobsTable.TableName = "defectProcedureJobsTable"; // } // else // { // procedureEntity.DefectProcedureJobsTable = this.ProductionDataSet.Tables["defectProcedureJobsTable"].Clone(); // } // node.TagNonSerialized = procedureEntity; // #endregion //} this.flowBox.RefreshItems(); this.txtLineCode.Text = this._lineCode; this.txtLineName.Text = this._lineName; this.flowBox.NodeDoubleClick += flowBox_NodeDoubleClick; //if(this._currentnode!=null) //{ // if (this._currentnode.NodeImageType == 2) // { // F_PC_0206 frm0206 = new F_PC_0206(this._currentnode, this.flowBox); // frm0206.ShowDialog(); // } // else // { // F_PC_0207 frm0207 = new F_PC_0207(this._currentnode, this.flowBox); // frm0207.ShowDialog(); // } // this.flowBox.RefreshItems(); //} } /// /// 节点双击事件 /// /// /// void flowBox_NodeDoubleClick(object sender, NodeEventArgs e) { if (e.Node.NodeImageType == 2) { F_PC_0206 frm0206 = new F_PC_0206(e.Node, this.flowBox); if (this._editStatus == Constant.FormMode.Edit) { frm0206.IsReadOnlyCode = true; } frm0206.ShowDialog(); } else { F_PC_0207 frm0207 = new F_PC_0207(e.Node, this.flowBox); if (this._editStatus == Constant.FormMode.Edit) { frm0207.IsReadOnlyCode = true; } frm0207.ShowDialog(); } this.flowBox.RefreshItems(); } /// /// 设置按钮事件 /// /// /// private void btnFlowSetting_Click(object sender, System.EventArgs e) { try { int w = Convert.ToInt32(txtFlowWidth.Text); int h = Convert.ToInt32(txtFlowHeigth.Text); this.flowBox.CanvasSize = new Size(w, h); this.flowBox.SaveFlow(); } catch (Exception ex) { // 对异常进行共通处理 ExceptionManager.HandleEventException(this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex); } } /// /// 计件模型按钮事件 /// /// /// private void btnPiece_Click(object sender, EventArgs e) { try { FlowNode n = this.flowBox.DrawingNode(); n.NodeImageType = 1;//计件模型 ProcedureEntity entity = new ProcedureEntity(); entity.NodeNo = n.ItemID;//(this.flowBox.AllNodes.Count - this.flowBox.DeletedNodes.Count) + _ValueFlagRow; entity.ProcedureCode = n.ItemID.ToString(); entity.ProcedureName = n.Name; entity.CollectType = 1; entity.MustFlag = 1; entity.ProcedureModel = 1; entity.PieceType = 1; entity.ProcedureGoodsTable = this.ProductionDataSet.Tables["procedureGoodsTable"].Clone(); entity.ProcedureUserTable = this.ProductionDataSet.Tables["procedureUserTable"].Clone(); entity.ProcedureDefectTable = this.ProductionDataSet.Tables["procedureDefectTable"].Clone(); entity.DefectProcedureJobsTable = this.ProductionDataSet.Tables["defectProcedureJobsTable"].Clone(); entity.ProcedureKilnTable = this.ProductionDataSet.Tables["procedureKilnTable"].Clone(); n.TagNonSerialized = entity; n.NodeImage = this.btnPiece.BackgroundImage; } catch (Exception ex) { // 对异常进行共通处理 ExceptionManager.HandleEventException(this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex); } } /// /// 检验模型按钮事件 /// /// /// private void btnCheck_Click(object sender, EventArgs e) { try { FlowNode n = this.flowBox.DrawingNode(); n.NodeImageType = 2;//检验模型 ProcedureEntity entity = new ProcedureEntity(); entity.NodeNo = n.ItemID;//(this.flowBox.AllNodes.Count - this.flowBox.DeletedNodes.Count) + _ValueFlagRow; entity.ProcedureCode = n.ItemID.ToString(); entity.ProcedureName = n.Name; entity.CollectType = 1; entity.MustFlag = 1; entity.ProcedureModel = 2; entity.PieceType = 1; entity.ProcedureGoodsTable = this.ProductionDataSet.Tables["procedureGoodsTable"].Clone(); entity.ProcedureUserTable = this.ProductionDataSet.Tables["procedureUserTable"].Clone(); entity.ProcedureDefectTable = this.ProductionDataSet.Tables["procedureDefectTable"].Clone(); entity.DefectProcedureJobsTable = this.ProductionDataSet.Tables["defectProcedureJobsTable"].Clone(); n.TagNonSerialized = entity; n.NodeImage = this.btnCheck.BackgroundImage; } catch (Exception ex) { // 对异常进行共通处理 ExceptionManager.HandleEventException(this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex); } } /// /// 直接按钮事件 /// /// /// private void btnLine_Click(object sender, EventArgs e) { FlowLine n = this.flowBox.DrawingLine(); if (n == null) { MessageBox.Show(this.flowBox.BoxMode.ToString()); return; } n.ShowName = false; } /// /// 保存按钮事件 /// /// /// private void btnSave_Click(object sender, EventArgs e) { try { bool check = this.flowBox.CheckFlow(); bool isRefresh = false; if (this._editStatus == Constant.FormMode.Edit) { if (this.flowBox.DeletedNodes.Count > 0) { FlowNode[] flow = this.flowBox.DeletedNodes.ToArray(); for (int i = 0; i < flow.Length; i++) { bool isDelete = PCModuleProxy.Service.GetAllowDelete(((ProcedureEntity)flow[i].TagNonSerialized).ProcedureID); if (isDelete) { this.flowBox.UndeleteNodeByNodeCode(flow[i].ItemCode); MessageBox.Show(((ProcedureEntity)flow[i].TagNonSerialized).ProcedureName + "有在产产品不能删除", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning); isRefresh = true;// break; } } } this.flowBox.RefreshItems(); } if (isRefresh) { this.flowBox.CheckFlow(); } // 校验 if (!this.CheckIntegrity2()) { return; } this.SetPorcessFlow2(); //这个方法为干补也做了修改 ProductionLineEntity productionLine = new ProductionLineEntity(); if (this._editStatus == Constant.FormMode.Edit) { productionLine.ProductionLineID = this._lineID; } else { productionLine.ProductionLineID = 0; } productionLine.FlowXML = this.flowBox.SaveFlowXml(); productionLine.ProductionLineCode = this.txtLineCode.Text.Trim(); productionLine.ProductionLineName = this.txtLineName.Text.Trim(); productionLine.Remarks = this._remarks; productionLine.OPTimeStamp = OPTimeStamp; // 节点对象 List nodeList = new List(); for (int i = 0; i < this.flowBox.AllNodes.Count; i++) { FlowNode node = (FlowNode)this.flowBox.AllNodes[i]; ProcedureEntity procedure = node.TagNonSerialized as ProcedureEntity; if (this._editStatus == Constant.FormMode.Edit) { if (node.NodeState == FlowNodeState.Added) { procedure.ProcedureState = 1; } else if (node.NodeState == FlowNodeState.Deleted) { procedure.ProcedureState = 2; } else { procedure.ProcedureState = 0; } nodeList.Add(procedure); } else { //新建或者是新建复制 if (node.NodeState == FlowNodeState.Added) { procedure.ProcedureState = 1; nodeList.Add(procedure); } else if (node.NodeState == FlowNodeState.Deleted) { procedure.ProcedureState = 2; } else { procedure.ProcedureState = 0; nodeList.Add(procedure); } } //nodeList.Add(procedure); } //productionLine.ProcedureList = nodeList.ToArray(); productionLine.ProcedureList = nodeList; int result = PCModuleProxy.Service.SaveProductionLine(productionLine); if (result > Constant.INT_IS_ZERO) { IDList.Add(result); this.ProductionlineCode = txtLineCode.Text; MessageBox.Show(string.Format(Messages.MSG_CMN_I001, FormTitles.F_PC_0202, Constant.OPERATE_SAVE), this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); _hasClose = true; this.DialogResult = DialogResult.OK; } else if (result == Constant.RETURN_IS_DATACHANGED) { MessageBox.Show(Messages.MSG_CMN_W012, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } else if (result == Constant.RETURN_IS_EXIST) { MessageBox.Show(string.Format(Messages.MSG_CMN_W006, "生产线编码"), this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } else if (result == -10) { MessageBox.Show("工序总数量超过了授权数量,如需增加授权,请联系东科。", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } else { MessageBox.Show(string.Format(Messages.MSG_CMN_W001, FormTitles.F_PC_0202, Constant.OPERATE_SAVE), this.Text, MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } this.Close(); } catch (Exception ex) { // 对异常进行共通处理 ExceptionManager.HandleEventException(this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex); } } /// /// 关闭按钮事件 /// /// /// private void btnClose_Click(object sender, EventArgs e) { this.Close(); } /// /// 画面关闭前提示 /// /// /// private void F_PC_0203_FormClosing(object sender, FormClosingEventArgs e) { if (_hasClose) { return; } DialogResult dialogResult = MessageBox.Show("确定要放弃对生产线的编辑,并关闭画面", this.Text, MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); if (dialogResult == DialogResult.Cancel) { e.Cancel = true; } } /// /// 导出图片 /// /// /// private void btnExpImage_Click(object sender, EventArgs e) { try { saveFileDialog1.FileName = this.txtLineName.Text + ".png"; DialogResult dr = saveFileDialog1.ShowDialog(); if (dr != System.Windows.Forms.DialogResult.OK) { return; } Bitmap b = new Bitmap(this.flowBox.CanvasImage); this.flowBox.CanvasControl.DrawToBitmap(b, new Rectangle(0, 0, b.Width, b.Height)); b.Save(saveFileDialog1.FileName, System.Drawing.Imaging.ImageFormat.Png); } catch (Exception ex) { // 对异常进行共通处理 ExceptionManager.HandleEventException(this.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, this.Text, ex); } } #endregion #region 私有方法 /// /// 向前工序校验是否满足入窑工序 /// /// /// private string BackIntoKilnCheck(FlowNode checkNode, FlowNode backNode) { if (backNode.InLines.Count == 0) { return string.Format("节点【{0}】是" + Constant.PROCEDURE_INTOKILN + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_LOADCAR + "工序!", checkNode.Name); } foreach (FlowLine line in backNode.InLines) { // 只有最近 装窑车 入窑 出窑 卸窑车 工序中是装窑车的工序才符合入窑工序 if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.LoadCar) { continue; } // 窑车补件工序除外 if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.CarAdd) { continue; } else if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.IntoKiln || ((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.OutKiln || ((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.UnloadCar) { return string.Format("节点【{0}】是" + Constant.PROCEDURE_INTOKILN + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_LOADCAR + "工序!", checkNode.Name); } // 递归校验下一个节点 string err = BackIntoKilnCheck(checkNode, line.NodeBegin); if (!string.IsNullOrEmpty(err)) { return err; } } return null; } /// /// 校验装窑车后是入窑工序 /// /// /// /// private string ForwardLoadCarCheck(FlowNode checkNode, FlowNode ForwardNode) { if (ForwardNode.OutLines.Count == 0) { return string.Format("节点【{0}】是" + Constant.PROCEDURE_LOADCAR + "工序,在后续工序流程中必须要经过" + Constant.PROCEDURE_INTOKILN + "工序!", checkNode.Name); } foreach (FlowLine line in ForwardNode.OutLines) { // 只有最近 装窑车 入窑 出窑 卸窑车 工序中是入窑的工序才符合装窑车工序 if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.IntoKiln) { continue; } else if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.LoadCar || ((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.OutKiln || ((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.UnloadCar) { return string.Format("节点【{0}】是" + Constant.PROCEDURE_LOADCAR + "工序,在后续工序流程中必须要经过" + Constant.PROCEDURE_INTOKILN + "工序!", checkNode.Name); } // 递归校验下一个节点 string err = ForwardLoadCarCheck(checkNode, line.NodeEnd); if (!string.IsNullOrEmpty(err)) { return err; } } return null; } /// /// 校验入窑后是出窑工序 /// /// /// /// private string ForwardIntoKilnCheck(FlowNode checkNode, FlowNode ForwardNode) { if (ForwardNode.OutLines.Count == 0) { return string.Format("节点【{0}】是" + Constant.PROCEDURE_INTOKILN + "工序,在后续工序流程中必须要经过" + Constant.PROCEDURE_OUTKILN + "工序!", checkNode.Name); } foreach (FlowLine line in checkNode.OutLines) { // 只有最近 装窑车 入窑 出窑 卸窑车 工序中是出窑的工序才符合出窑工序 if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.OutKiln) { continue; } else if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.LoadCar || ((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.IntoKiln || ((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.UnloadCar) { return string.Format("节点【{0}】是" + Constant.PROCEDURE_INTOKILN + "工序,在后续工序流程中必须要经过" + Constant.PROCEDURE_OUTKILN + "工序!", checkNode.Name); } // 递归校验下一个节点 string err = ForwardIntoKilnCheck(checkNode, line.NodeEnd); if (!string.IsNullOrEmpty(err)) { return err; } } return null; } /// /// 校验出窑工序后是卸窑车工序 /// /// /// /// private string ForwardOutKilnCheck(FlowNode checkNode, FlowNode ForwardNode) { if (ForwardNode.OutLines.Count == 0) { return string.Format("节点【{0}】是" + Constant.PROCEDURE_OUTKILN + "工序,在后续工序流程中必须要经过" + Constant.PROCEDURE_UNLOADCAR + "工序!", checkNode.Name); } foreach (FlowLine line in ForwardNode.OutLines) { // 只有最近 装窑车 入窑 出窑 卸窑车 工序中是出窑的工序才符合出窑工序 if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.UnloadCar) { continue; } else if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.LoadCar || ((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.IntoKiln || ((ProcedureEntity)line.NodeEnd.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.OutKiln) { return string.Format("节点【{0}】是" + Constant.PROCEDURE_OUTKILN + "工序,在后续工序流程中必须要经过" + Constant.PROCEDURE_UNLOADCAR + "工序!", checkNode.Name); } // 递归校验下一个节点 string err = ForwardOutKilnCheck(checkNode, line.NodeEnd); if (!string.IsNullOrEmpty(err)) { return err; } } return null; } /// /// 校验出窑前工序是入窑工序 /// /// /// /// private string BackOutKilnCheck(FlowNode checkNode, FlowNode backNode) { if (backNode.InLines.Count == 0) { return string.Format("节点【{0}】是" + Constant.PROCEDURE_OUTKILN + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_INTOKILN + "工序!", checkNode.Name); } foreach (FlowLine line in backNode.InLines) { // 只有最近 装窑车 入窑 出窑 卸窑车 工序中是入窑的工序才符合出窑工序 if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.IntoKiln) { continue; } else if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.LoadCar || ((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.OutKiln || ((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.UnloadCar) { return string.Format("节点【{0}】是" + Constant.PROCEDURE_OUTKILN + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_INTOKILN + "工序!", checkNode.Name); } // 递归校验下一个节点 string err = BackOutKilnCheck(checkNode, line.NodeBegin); if (!string.IsNullOrEmpty(err)) { return err; } } return null; } /// /// 校验卸窑车工序前工序是出窑工序 /// /// /// /// private string BackUnloadCarCheck(FlowNode checkNode, FlowNode backNode) { if (backNode.InLines.Count == 0) { return string.Format("节点【{0}】是" + Constant.PROCEDURE_UNLOADCAR + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_OUTKILN + "工序!", checkNode.Name); } foreach (FlowLine line in backNode.InLines) { // 只有最近 装窑车 入窑 出窑 卸窑车 工序中是入窑的工序才符合出窑工序 if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.OutKiln) { continue; } else if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.LoadCar || ((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.IntoKiln || ((ProcedureEntity)line.NodeBegin.TagNonSerialized).ModelType == (int)Constant.ProcedureModelType.UnloadCar) { return string.Format("节点【{0}】是" + Constant.PROCEDURE_UNLOADCAR + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_OUTKILN + "工序!", checkNode.Name); } // 递归校验下一个节点 string err = BackUnloadCarCheck(checkNode, line.NodeBegin); if (!string.IsNullOrEmpty(err)) { return err; } } return null; } /// /// 校验入窑前检验工序前工序是装窑车工序 /// /// /// /// private string BackIntoKilnCheckCheck(FlowNode checkNode, FlowNode backNode) { if (backNode.InLines.Count == 0) { return string.Format("节点【{0}】是" + Constant.PROCEDURE_INTOKILNCHECK + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_LOADCAR + "工序!", checkNode.Name); } foreach (FlowLine line in backNode.InLines) { // 只有最近 装窑车工序才符合入窑前检验工序 ProcedureEntity procedureEntity = line.NodeBegin.TagNonSerialized as ProcedureEntity; if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.LoadCar) { continue; } else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.LoadCar || procedureEntity.ModelType == (int)Constant.ProcedureModelType.IntoKiln || procedureEntity.ModelType == (int)Constant.ProcedureModelType.UnloadCar) { return string.Format("节点【{0}】是" + Constant.PROCEDURE_UNLOADCAR + "工序,在工序流程中必须先经过" + Constant.PROCEDURE_OUTKILN + "工序!", checkNode.Name); } // 递归校验下一个节点 string err = BackIntoKilnCheckCheck(checkNode, line.NodeBegin); if (!string.IsNullOrEmpty(err)) { return err; } } return null; } /// /// 校验回环节点 /// /// /// /// private bool LoopNodeCheck(FlowNode checkNode, FlowNode nextNode) { // 说明以后y有回环连接 if (checkNode.Equals(nextNode)) { return false; } else if (nextNode == null) { nextNode = checkNode; } if (checkNode.NextNodes.Contains(nextNode)) { return true; } else { // 校验的节点放置到可到工序中,包括本身节点。 checkNode.NextNodes.Add(nextNode); } // 下一个节点 foreach (FlowLine line in nextNode.OutLines) { if (!LoopNodeCheck(checkNode, line.NodeEnd)) { return false; } } return true; } /// /// 元素的完整性检查 /// public bool CheckIntegrity() { if (this.flowBox.CheckedNodes.Count == 0) //不包括删除的 { MessageBox.Show("请配置工序节点!", "Error"); return false; } // 连线校验 for (int i = 0; i < this.flowBox.CheckedLines.Count; i++) { FlowLine line = (FlowLine)this.flowBox.CheckedLines[i]; //开始端点没有连接 if (line.NodeBegin == null) { MessageBox.Show("连线【" + line.Name + "】开始端点没有连接节点!", "Error"); //line.Content = "开始端点没有连接节点"; // 选中该线 //SetSelectLine(line); return false; } else if (line.NodeEnd == null) { MessageBox.Show("连线【" + line.Name + "】结束端点没有连接节点!", "Error"); //line.Content = "结束端点没有连接节点"; //选中该线 //SetSelectLine(line); return false; } //校验是否有2个以上的线开始端点和结束端点连接的都是一个节点(重复连接) for (int j = i + 1; j < this.flowBox.CheckedLines.Count; j++) { FlowLine nextLine = (FlowLine)this.flowBox.CheckedLines[j]; if (line.NodeBegin.Equals(nextLine.NodeBegin) && line.NodeEnd.Equals(nextLine.NodeEnd)) { MessageBox.Show("连线【" + line.Name + "】与连线【" + nextLine.Name + "】属于重复连接节点!", "Error"); //line.Content = "连线与连线【" + nextLine.Content + "】属于重复连接节点"; //选中该线 //SetSelectLine(line); return false; } } } //结束节点的数量 int endCount = 0; for (int i = 0; i < this.flowBox.CheckedNodes.Count; i++) { FlowNode node = (FlowNode)this.flowBox.CheckedNodes[i]; ProcedureEntity procedureEntity = node.TagNonSerialized as ProcedureEntity; // 必填项校验 if (procedureEntity.OrganizationID <= 0) { MessageBox.Show("节点【" + node.Name + "】的组织机构不能为空!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 校验回环节点 //node.NextNodes = new List(); if (!LoopNodeCheck(node, null)) { MessageBox.Show("有循环节点存在,请重新设置!", "Error"); return false; } // 开始节点 if (node.InLines.Count == 0) { // 开始节点校验 // 孤立的节点 if (node.OutLines.Count == 0) { MessageBox.Show("节点【" + node.Name + "】是孤立工序!", "Error"); // 选中该节点 // SetSelectNode(node); return false; } // 开始节点不能是成验和入窑前检验节点 else if (node.NodeImageType != 1) { MessageBox.Show("开始节点【" + node.Name + "】不能是成品检验或者入窑前检验工序!", "Error"); // 选中该节点 // SetSelectNode(node); return false; } if (procedureEntity.MustFlag == Constant.ProcedureMustFlag.NonMust.GetHashCode()) { MessageBox.Show("开始节点【" + node.Name + "】不能是非必须工序!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 开始工序必须为交坯或特殊返工工序 // 注释 先不做校验 //if (node.ProcedureEntity.IsSpecialRework != 1 && node.ProcedureEntity.ModelType != (int)Constant.ProcedureModelType.DeliverAdobe) //{ // MessageForm.Show("开始节点【" + node.NodeText + "】必须为交坯或特殊返工工序!", "Error"); // // 选中该节点 // SetSelectNode(node); // return false; //} // 开始节点如果是特定返工工序就必须与(标准计件或装窑车)组合 else if (procedureEntity.IsSpecialRework == (int)Constant.SpecialReworkFlag.Yes && procedureEntity.ModelType != (int)Constant.ProcedureModelType.Normal && procedureEntity.ModelType != (int)Constant.ProcedureModelType.LoadCar) { MessageBox.Show("开始节点【" + node.Name + "】是特定返工工序时,工序类别必须是" + Constant.PROCEDURE_NORMAL + "或" + Constant.PROCEDURE_LOADCAR + "!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 暂时不需要校验 // 开始节点如果是非特定返工工序那必须与交坯组合 //else if (node.ProcedureEntity.IsSpecialRework == 0 // && node.ProcedureEntity.ModelType != 5) //{ // MessageForm.Show("开始节点【" + node.NodeText + "】工序类别是" + Constant.PROCEDURE_DELIVERADOBE + "时,不能是特定返工工序!", "Error"); // // 选中该节点 // SetSelectNode(node); // return false; //} // 交坯工序必须为必须工序 else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.DeliverMud && procedureEntity.MustFlag == 0) { MessageBox.Show("开始节点【" + node.Name + "】是" + Constant.PROCEDURE_DELIVERADOBE + "工序时为必须工序!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 开始工序不能为窑车补件工序 else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.CarAdd) { MessageBox.Show("开始节点【" + node.Name + "】工序类别不能是" + Constant.PROCEDURE_CARADD + "工序!", "Error"); // 选中该节点 // SetSelectNode(node); return false; } // 开始工序标识 procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Begin; // 特殊返工工序 将工序节点类型修改成中间工序 if (procedureEntity.IsSpecialRework == Constant.SpecialReworkFlag.Yes.GetHashCode()) { procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Middle; } } // 过程节点 else { //过程节点校验 #region 中间节点不能设置为特殊返工工序 if (procedureEntity.IsSpecialRework == (int)Constant.SpecialReworkFlag.Yes) { MessageBox.Show("中间节点【" + node.Name + "】不能设置为特殊返工工序!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } #endregion #region 校验坯库工序 if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.AdobeStock) { // 坯库工序必须指向唯一一个窑车补件工序 if (node.OutLines.Count > 1 || node.OutLines.Count == 0) { MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_ADOBESTOCK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_CARADD + "工序!", "Error"); // 选中该节点 // SetSelectNode(node); return false; } else { // 坯库工序所指向的节点不是窑车补件 ProcedureEntity ProcedureEntityEnd = node.OutLines[0].NodeEnd.TagNonSerialized as ProcedureEntity; if (ProcedureEntityEnd.ModelType != (int)Constant.ProcedureModelType.CarAdd) { MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_ADOBESTOCK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_CARADD + "工序!", "Error"); // 选中该节点 // SetSelectNode(node); return false; } } } #endregion #region 入窑前检验 if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.IntoKilnCheck) { // 入窑前检验前一个工序必须是装窑车 string err = BackIntoKilnCheckCheck(node, node); if (!string.IsNullOrEmpty(err)) { MessageBox.Show(err, "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 入窑前检验工序必须指向唯一一个坯库工序 // 入窑前检验工序必须指向唯一一个窑车补件工序 if (node.OutLines.Count != 1) { MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_INTOKILNCHECK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } else if (((ProcedureEntity)node.OutLines[0].NodeEnd.TagNonSerialized).ModelType != (int)Constant.ProcedureModelType.AdobeStock) { MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_INTOKILNCHECK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } } } #endregion #region 窑车补件 if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.CarAdd) { if (node.InLines.Count != 1) { MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_CARADD + "工序,要求前工序必须是" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 前第一个工序不是坯库 if (((ProcedureEntity)node.InLines[0].NodeBegin.TagNonSerialized).ModelType != (int)Constant.ProcedureModelType.AdobeStock) { MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_CARADD + "工序,要求前工序必须是" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 第二个前工序既不是坯库也不是入窑前检验 //if (node.InLines[1].StartNode.ProcedureEntity.ModelType != (int)Constant.ProcedureModelType.AdobeStock // && node.InLines[1].StartNode.ProcedureEntity.ModelType != (int)Constant.ProcedureModelType.IntoKilnCheck) //{ // MessageForm.Show("中间节点【" + node.NodeText + "】是" + Constant.PROCEDURE_CARADD + "工序,要求前工序必须是" + Constant.PROCEDURE_ADOBESTOCK + "和" + Constant.PROCEDURE_INTOKILNCHECK + "工序!", "Error"); // // 选中该节点 // SetSelectNode(node); // return false; //} } #endregion //装窑车工序 if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.LoadCar) { if (procedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust) { MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_LOADCAR + "工序,要求为必须工序!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 校验装窑车后是入窑工序 string err = ForwardLoadCarCheck(node, node); if (!string.IsNullOrEmpty(err)) { MessageBox.Show(err, "Error"); // 选中该节点 //SetSelectNode(node); return false; } } // 入窑工序 else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.IntoKiln) { if (procedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust) { MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_INTOKILN + "工序,要求为必须工序!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 校验入窑工序前工序是否经过装窑车 string err = BackIntoKilnCheck(node, node); if (!string.IsNullOrEmpty(err)) { MessageBox.Show(err, "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 校验入窑工序后工序是出窑工序 //err = ForwardIntoKilnCheck(node, node); //if (!string.IsNullOrEmpty(err)) //{ // MessageForm.Show(err, "Error"); // // 选中该节点 // SetSelectNode(node); // return false; //} } // 出窑工序 else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.OutKiln) { //if (node.ProcedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust) //{ // MessageForm.Show("中间节点【" + node.NodeText + "】是" + Constant.PROCEDURE_OUTKILN + "工序,要求为必须工序!", "Error"); // // 选中该节点 // SetSelectNode(node); // return false; //} // 校验出窑前工序是入窑工序 string err = BackOutKilnCheck(node, node); if (!string.IsNullOrEmpty(err)) { MessageBox.Show(err, "Error"); // 选中该节点 //SetSelectNode(node); return false; } //校验出窑工序后工序是卸窑车工序 err = ForwardOutKilnCheck(node, node); if (!string.IsNullOrEmpty(err)) { MessageBox.Show(err, "Error"); // 选中该节点 //SetSelectNode(node); return false; } } // 卸窑车工序 else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.UnloadCar) { if (procedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust) { MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_UNLOADCAR + "工序,要求为必须工序!", "Error"); // 选中该节点 // SetSelectNode(node); return false; } //校验卸窑车前工序是出窑工序 //string err = BackUnloadCarCheck(node, node); //if (!string.IsNullOrEmpty(err)) //{ // MessageForm.Show(err, "Error"); // // 选中该节点 // SetSelectNode(node); // return false; //} } // 过程节点 if (node.OutLines.Count > 0) { // 过程(中间)工序标识 procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Middle; } // 结束节点 else { endCount++; // 结束工序标识 procedureEntity.NodeType = (int)Constant.ProcedureNodeType.End; //if (endCount > 1) //{ // MessageBox.Show("生产线只能有一个结束节点!", "Error"); // // 选中该节点 // // SetSelectNode(node); // return false; //} } } return true; } /// /// 设置工序前后所到达的工序 /// public void SetPorcessFlow() { foreach (var item in this.flowBox.CheckedNodes) { FlowNode node = (FlowNode)item; List flowList = new List(); // 后工序,可以到达的下一个节点 SetArrive(node, node, flowList); // 前工序,能到达此工序的工序 SetFrom(node, node, flowList); //((ProcedureEntity)node.TagNonSerialized).ProcedureFlowDetailList = flowList.ToArray(); ((ProcedureEntity)node.TagNonSerialized).ProcedureFlowDetailList = flowList; } } /// /// 后工序,可以到达的下一个节点 /// /// /// private void SetArrive(FlowNode node, FlowNode nextNode, List flowList) { foreach (FlowLine line in nextNode.OutLines) { if (flowList.Where(p => p.ArriveNodeNo == (line.NodeEnd.TagNonSerialized as ProcedureEntity).NodeNo).Count() == 0) { // 添加 flowList.Add(new ProcedureFlowEntity() { FlowFlag = (int)Constant.FlowFlag.Next, ArriveNodeNo = (line.NodeEnd.TagNonSerialized as ProcedureEntity).NodeNo, }); //ItemID } // 非必须工序 可以到达下一个节点 if (((ProcedureEntity)line.NodeEnd.TagNonSerialized).MustFlag == (int)Constant.ProcedureMustFlag.NonMust) { SetArrive(node, line.NodeEnd, flowList); } } } /// /// 前工序,能到达此工序的工序 /// /// /// private void SetFrom(FlowNode node, FlowNode fromNode, List flowList) { foreach (FlowLine line in fromNode.InLines) { //if (flowList.Where(p => p.ArriveNodeNo == line.NodeEnd.ItemID).Count() == 0) if (flowList.Where(p => p.ArriveNodeNo == (line.NodeBegin.TagNonSerialized as ProcedureEntity).NodeNo).Count() == 0) { // 添加 flowList.Add(new ProcedureFlowEntity() { FlowFlag = (int)Constant.FlowFlag.Previous, ArriveNodeNo = (line.NodeBegin.TagNonSerialized as ProcedureEntity).NodeNo, }); //line.NodeBegin.ItemID } // 非必须工序 可以到达下一个节点 if (((ProcedureEntity)line.NodeBegin.TagNonSerialized).MustFlag == (int)Constant.ProcedureMustFlag.NonMust) { SetFrom(node, line.NodeBegin, flowList); } } } /// /// 元素的完整性检查(干补) /// public bool CheckIntegrity2() { if (this.flowBox.CheckedNodes.Count == 0) //不包括删除的 { MessageBox.Show("请配置工序节点!", "Error"); return false; } // 连线校验 for (int i = 0; i < this.flowBox.CheckedLines.Count; i++) { FlowLine line = (FlowLine)this.flowBox.CheckedLines[i]; //开始端点没有连接 if (line.NodeBegin == null) { MessageBox.Show("连线【" + line.Name + "】开始端点没有连接节点!", "Error"); //line.Content = "开始端点没有连接节点"; // 选中该线 //SetSelectLine(line); return false; } else if (line.NodeEnd == null) { MessageBox.Show("连线【" + line.Name + "】结束端点没有连接节点!", "Error"); //line.Content = "结束端点没有连接节点"; //选中该线 //SetSelectLine(line); return false; } //干补判断 if (line.NodeBegin != null) { if (((ProcedureEntity)line.NodeBegin.TagNonSerialized as ProcedureEntity).ModelType == 8) { MessageBox.Show("连线【" + line.Name + "】开始端点不能连接干补节点!", "Error"); return false; } // wangx 2017-7-20 if (((ProcedureEntity)line.NodeEnd.TagNonSerialized as ProcedureEntity).ModelType == 8) { MessageBox.Show("连线【" + line.Name + "】结束端点不能连接干补节点!", "Error"); return false; } if (((ProcedureEntity)line.NodeEnd.TagNonSerialized as ProcedureEntity).ModelType == 9) { MessageBox.Show("连线【" + line.Name + "】结束端点不能连接回收节点!", "Error"); return false; } // wangx 2017-7-20 end } else if (line.NodeEnd != null) { if (((ProcedureEntity)line.NodeBegin.TagNonSerialized as ProcedureEntity).ModelType == 8) { MessageBox.Show("连线【" + line.Name + "】结束端点不能连接干补节点!", "Error"); return false; } } //干补判断 //校验是否有2个以上的线开始端点和结束端点连接的都是一个节点(重复连接) for (int j = i + 1; j < this.flowBox.CheckedLines.Count; j++) { FlowLine nextLine = (FlowLine)this.flowBox.CheckedLines[j]; if (line.NodeBegin.Equals(nextLine.NodeBegin) && line.NodeEnd.Equals(nextLine.NodeEnd)) { MessageBox.Show("连线【" + line.Name + "】与连线【" + nextLine.Name + "】属于重复连接节点!", "Error"); //line.Content = "连线与连线【" + nextLine.Content + "】属于重复连接节点"; //选中该线 //SetSelectLine(line); return false; } } } DataTable procedureTable = this.ProductionDataSet.Tables["procedureTable"]; if (this._ValueFlagRow > 0) { bool existProcedureCode = false; string ProcedureCode = ""; string ProcedureName = ""; for (int i = 0; i < this.flowBox.CheckedNodes.Count; i++) { FlowNode node = (FlowNode)this.flowBox.CheckedNodes[i]; ProcedureEntity procedureEntity = node.TagNonSerialized as ProcedureEntity; DataRow[] dr = procedureTable.Select("ValueFlag=0 and ProcedureCode='" + procedureEntity.ProcedureCode + "'"); if (dr.Length > 0) { existProcedureCode = true; ProcedureCode = procedureEntity.ProcedureCode; ProcedureName = procedureEntity.ProcedureName; break; } } if (existProcedureCode) { MessageBox.Show(ProcedureName + "工序【" + ProcedureCode + "】编码已经存在!", "Error"); return false; } } //结束节点的数量 int endCount = 0; for (int i = 0; i < this.flowBox.CheckedNodes.Count; i++) { FlowNode node = (FlowNode)this.flowBox.CheckedNodes[i]; ProcedureEntity procedureEntity = node.TagNonSerialized as ProcedureEntity; // 必填项校验 if (procedureEntity.OrganizationID <= 0) { MessageBox.Show("节点【" + node.Name + "】的组织机构不能为空!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 校验回环节点 //node.NextNodes = new List(); if (!LoopNodeCheck(node, null)) { MessageBox.Show("有循环节点存在,请重新设置!", "Error"); return false; } // 开始节点 if (node.InLines.Count == 0) { // 开始节点校验 // 孤立的节点 //if (node.OutLines.Count == 0) if (node.OutLines.Count == 0 && procedureEntity.ModelType != 8) { MessageBox.Show("节点【" + node.Name + "】是孤立工序!", "Error"); // 选中该节点 // SetSelectNode(node); return false; } // 开始节点不能是成验和入窑前检验节点 else if (node.NodeImageType != 1) { //if (procedureEntity.ModelType!= 0) //{ MessageBox.Show("开始节点【" + node.Name + "】不能是成品检验或者入窑前检验工序!", "Error"); // 选中该节点 // SetSelectNode(node); return false; // } } // 开始节点可以非必须 //if (procedureEntity.MustFlag == Constant.ProcedureMustFlag.NonMust.GetHashCode()) //{ // MessageBox.Show("开始节点【" + node.Name + "】不能是非必须工序!", "Error"); // // 选中该节点 // //SetSelectNode(node); // return false; //} // 开始工序必须为交坯或特殊返工工序 // 注释 先不做校验 //if (node.ProcedureEntity.IsSpecialRework != 1 && node.ProcedureEntity.ModelType != (int)Constant.ProcedureModelType.DeliverAdobe) //{ // MessageForm.Show("开始节点【" + node.NodeText + "】必须为交坯或特殊返工工序!", "Error"); // // 选中该节点 // SetSelectNode(node); // return false; //} // 开始节点如果是特定返工工序就必须与(标准计件或装窑车)组合 else if (procedureEntity.IsSpecialRework == (int)Constant.SpecialReworkFlag.Yes && procedureEntity.ModelType != (int)Constant.ProcedureModelType.Normal && procedureEntity.ModelType != (int)Constant.ProcedureModelType.LoadCar) { MessageBox.Show("开始节点【" + node.Name + "】是特定返工工序时,工序类别必须是" + Constant.PROCEDURE_NORMAL + "或" + Constant.PROCEDURE_LOADCAR + "!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 暂时不需要校验 // 开始节点如果是非特定返工工序那必须与交坯组合 //else if (node.ProcedureEntity.IsSpecialRework == 0 // && node.ProcedureEntity.ModelType != 5) //{ // MessageForm.Show("开始节点【" + node.NodeText + "】工序类别是" + Constant.PROCEDURE_DELIVERADOBE + "时,不能是特定返工工序!", "Error"); // // 选中该节点 // SetSelectNode(node); // return false; //} // 交坯工序必须为必须工序 else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.DeliverMud && procedureEntity.MustFlag == 0) { MessageBox.Show("开始节点【" + node.Name + "】是" + Constant.PROCEDURE_DELIVERADOBE + "工序时为必须工序!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 开始工序不能为窑车补件工序 else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.CarAdd) { MessageBox.Show("开始节点【" + node.Name + "】工序类别不能是" + Constant.PROCEDURE_CARADD + "工序!", "Error"); // 选中该节点 // SetSelectNode(node); return false; } // 开始工序标识 procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Begin; // 特殊返工工序 将工序节点类型修改成中间工序 if (procedureEntity.IsSpecialRework == Constant.SpecialReworkFlag.Yes.GetHashCode()) { procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Middle; } } // 过程节点 else { //过程节点校验 #region 中间节点不能设置为特殊返工工序 if (procedureEntity.IsSpecialRework == (int)Constant.SpecialReworkFlag.Yes) { MessageBox.Show("中间节点【" + node.Name + "】不能设置为特殊返工工序!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } #endregion #region 校验坯库工序 if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.AdobeStock) { // 坯库工序必须指向唯一一个窑车补件工序 if (node.OutLines.Count > 1 || node.OutLines.Count == 0) { MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_ADOBESTOCK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_CARADD + "工序!", "Error"); // 选中该节点 // SetSelectNode(node); return false; } else { // 坯库工序所指向的节点不是窑车补件 ProcedureEntity ProcedureEntityEnd = node.OutLines[0].NodeEnd.TagNonSerialized as ProcedureEntity; if (ProcedureEntityEnd.ModelType != (int)Constant.ProcedureModelType.CarAdd) { MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_ADOBESTOCK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_CARADD + "工序!", "Error"); // 选中该节点 // SetSelectNode(node); return false; } } } #endregion #region 入窑前检验 if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.IntoKilnCheck) { // 入窑前检验前一个工序必须是装窑车 string err = BackIntoKilnCheckCheck(node, node); if (!string.IsNullOrEmpty(err)) { MessageBox.Show(err, "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 入窑前检验工序必须指向唯一一个坯库工序 // 入窑前检验工序必须指向唯一一个窑车补件工序 if (node.OutLines.Count != 1) { MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_INTOKILNCHECK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } // wangxin 2015/4/16 //else // if (((ProcedureEntity)node.OutLines[0].NodeEnd.TagNonSerialized).ModelType != (int)Constant.ProcedureModelType.AdobeStock) // { // MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_INTOKILNCHECK + "工序,要求必须指向唯一一个" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error"); // // 选中该节点 // //SetSelectNode(node); // return false; // } // wangxin 2015/4/16 end } #endregion } #region 窑车补件 if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.CarAdd) { // wangxin 2015/4/16 //if (node.InLines.Count != 1) //{ // MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_CARADD // + "工序,要求前工序必须是" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error"); // // 选中该节点 // //SetSelectNode(node); // return false; //} // 前第一个工序不是坯库 //if (((ProcedureEntity)node.InLines[0].NodeBegin.TagNonSerialized).ModelType != (int)Constant.ProcedureModelType.AdobeStock) //{ // MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_CARADD // + "工序,要求前工序必须是" + Constant.PROCEDURE_ADOBESTOCK + "工序!", "Error"); // // 选中该节点 // //SetSelectNode(node); // return false; //} // wangxin 2015/4/16 end // 第二个前工序既不是坯库也不是入窑前检验 //if (node.InLines[1].StartNode.ProcedureEntity.ModelType != (int)Constant.ProcedureModelType.AdobeStock // && node.InLines[1].StartNode.ProcedureEntity.ModelType != (int)Constant.ProcedureModelType.IntoKilnCheck) //{ // MessageForm.Show("中间节点【" + node.NodeText + "】是" + Constant.PROCEDURE_CARADD + "工序,要求前工序必须是" + Constant.PROCEDURE_ADOBESTOCK + "和" + Constant.PROCEDURE_INTOKILNCHECK + "工序!", "Error"); // // 选中该节点 // SetSelectNode(node); // return false; //} } #endregion #region 装窑车工序 if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.LoadCar) { if (procedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust) { MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_LOADCAR + "工序,要求为必须工序!", "Error"); // 选中该节点 //SetSelectNode(node); return false; } // modify 2015/06/01 wangx begin //// 校验装窑车后是入窑工序 //string err = ForwardLoadCarCheck(node, node); //if (!string.IsNullOrEmpty(err)) //{ // MessageBox.Show(err, "Error"); // return false; //} // modify 2015/06/01 wangx end } #endregion #region 入窑工序 else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.IntoKiln) { // modify 2015/06/01 wangx begin if (procedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust) { // MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_INTOKILN + "工序,要求为必须工序!", "Error"); // return false; } // modify 2015/06/01 wangx end // 校验入窑工序前工序是否经过装窑车 string err = BackIntoKilnCheck(node, node); if (!string.IsNullOrEmpty(err)) { MessageBox.Show(err, "Error"); // 选中该节点 //SetSelectNode(node); return false; } // 校验入窑工序后工序是出窑工序 //err = ForwardIntoKilnCheck(node, node); //if (!string.IsNullOrEmpty(err)) //{ // MessageForm.Show(err, "Error"); // // 选中该节点 // SetSelectNode(node); // return false; //} } #endregion #region 出窑工序 else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.OutKiln) { //if (node.ProcedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust) //{ // MessageForm.Show("中间节点【" + node.NodeText + "】是" + Constant.PROCEDURE_OUTKILN + "工序,要求为必须工序!", "Error"); // // 选中该节点 // SetSelectNode(node); // return false; //} // 校验出窑前工序是入窑工序 string err = BackOutKilnCheck(node, node); if (!string.IsNullOrEmpty(err)) { MessageBox.Show(err, "Error"); // 选中该节点 //SetSelectNode(node); return false; } //校验出窑工序后工序是卸窑车工序 err = ForwardOutKilnCheck(node, node); if (!string.IsNullOrEmpty(err)) { MessageBox.Show(err, "Error"); // 选中该节点 //SetSelectNode(node); return false; } } #endregion #region 卸窑车工序 else if (procedureEntity.ModelType == (int)Constant.ProcedureModelType.UnloadCar) { if (procedureEntity.MustFlag == (int)Constant.ProcedureMustFlag.NonMust) { MessageBox.Show("中间节点【" + node.Name + "】是" + Constant.PROCEDURE_UNLOADCAR + "工序,要求为必须工序!", "Error"); // 选中该节点 // SetSelectNode(node); return false; } //校验卸窑车前工序是出窑工序 //string err = BackUnloadCarCheck(node, node); //if (!string.IsNullOrEmpty(err)) //{ // MessageForm.Show(err, "Error"); // // 选中该节点 // SetSelectNode(node); // return false; //} } #endregion // 过程节点 if (node.OutLines.Count > 0) { // 过程(中间)工序标识 if (node.InLines.Count > 0) { if (node.CheckedNodeType == FlowNodeType.Begin) { procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Begin; } else{ procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Middle; } } else { if (procedureEntity.IsSpecialRework == Constant.SpecialReworkFlag.Yes.GetHashCode()) { procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Middle; } else { procedureEntity.NodeType = (int)Constant.ProcedureNodeType.Begin; } } } // 结束节点 else { if (procedureEntity.ModelType != 8) { //this._procedureEntity.NodeType != (int)Constant.ProcedureNodeType.End if (procedureEntity.ModelType == (int)Dongke.IBOSS.PRD.Basics.BaseResources.Constant.ProcedureModelType.Normal && procedureEntity.UnDo == 1) { MessageBox.Show("结束节点" + node.Name + "不能撤销计件!", "Error"); return false; } endCount++; } // 结束工序标识 procedureEntity.NodeType = (int)Constant.ProcedureNodeType.End; //if (endCount > 1) //{ // MessageBox.Show("生产线只能有一个结束节点!", "Error"); // // 选中该节点 // // SetSelectNode(node); // return false; //} } } return true; } /// /// 设置工序前后所到达的工序 /// public void SetPorcessFlow2() { foreach (var item in this.flowBox.CheckedNodes) { FlowNode node = (FlowNode)item; List flowList = new List(); // 后工序,可以到达的下一个节点 SetArrive(node, node, flowList); // 前工序,能到达此工序的工序 SetFrom(node, node, flowList); //((ProcedureEntity)node.TagNonSerialized).ProcedureFlowDetailList = flowList.ToArray(); if (((ProcedureEntity)node.TagNonSerialized).ModelType == 8)//干补 { ((ProcedureEntity)node.TagNonSerialized).ProcedureFlowDetailList = null; ((ProcedureEntity)node.TagNonSerialized).NodeType = 2; } else { if (((ProcedureEntity)node.TagNonSerialized).ModelType == 9)//回收 { ((ProcedureEntity)node.TagNonSerialized).NodeType = 2; } //((ProcedureEntity)node.TagNonSerialized).ProcedureFlowDetailList = flowList.ToArray(); ((ProcedureEntity)node.TagNonSerialized).ProcedureFlowDetailList = flowList; } } } #endregion } }