using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Windows.Forms; using UAS_MES.DataOperate; using UAS_MES.Entity; using UAS_MES.PublicMethod; namespace UAS_MES.Query { public partial class Query_ExeProgress : Form { DataHelper dh; LogStringBuilder sql = new LogStringBuilder(); //经过的步骤 string PastStep = ""; //经过的步骤 string nextStepCode = ""; //拆分后的经过的步骤 Dictionary Step; List PaintColor = new List(); //屏幕高度 int ScreenWidth; //屏幕宽度 int ScreenHeight; DataTable dt; DataTable ms_id;//记录ms_id DataTable ListA;//记录数据的当前序列号和之前序列号 AutoSizeFormClass asc = new AutoSizeFormClass(); public Query_ExeProgress() { InitializeComponent(); } private void Query_ExeProgress_Load(object sender, EventArgs e) { dh = SystemInf.dh; ScreenWidth = this.Width; ScreenHeight = this.Height; asc.controllInitializeSize(this); sn_code.Focus(); } private void Query_ExeProgress_SizeChanged(object sender, EventArgs e) { asc.controlAutoSize(this); } private void sn_code_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { ms_id = (DataTable)dh.ExecuteSql("select beforesn,sn from makesnrelation where beforesn='" + sn_code.Text + "' or sn='" + sn_code.Text + "'", "select"); if (ms_id.Rows.Count > 0) { //说明有过转号 ms_id = (DataTable)dh.ExecuteSql("select ms_id,ms_makecode from makeserial where ms_sncode='" + ms_id.Rows[0]["beforesn"].ToString() + "' or ms_sncode='" + ms_id.Rows[0]["sn"].ToString() + "' order by ms_id", "select"); } else { //没有过转号 ms_id = (DataTable)dh.ExecuteSql("select ms_id,ms_makecode from makeserial where ms_sncode='" + sn_code.Text + "' order by ms_id", "select"); } if (ms_id.Rows.Count==0) { //无值则提示 MessageBox.Show("序列号" + sn_code.Text + "不存在"); return; } StringBuilder ms_ids = new StringBuilder();//存所有的ms_id //设置界面工单号 ma_code.Text = ms_id.Rows[ms_id.Rows.Count-1]["ms_makecode"].ToString(); int idCount = ms_id.Rows.Count; for (int i=0;i 0) { if (Step != null && Step.Count > 0) { Step.Clear(); SerialPanel.Controls.Clear(); PaintColor.Clear(); } string ifRework = dt.Rows[idCount-1]["ms_ifrework"].ToString(); //执行过的步骤 PastStep = dt.Rows[idCount - 1]["ms_paststep"].ToString(); //下一步骤 nextStepCode = dt.Rows[idCount - 1]["ms_nextstepcode"].ToString(); //如果为不良的时候 string BadStep = ""; string RejectStep = ""; string currentStep = ""; //先判断是否是返工的 if (ifRework != "0") { //是返工的 if (dt.Rows[idCount - 1]["ms_reworkstatus"].ToString() == "3") { BadStep = dt.Rows[idCount - 1]["ms_stepcode"].ToString(); } else if (dt.Rows[idCount - 1]["ms_reworkstatus"].ToString() == "4") { RejectStep = dt.Rows[idCount - 1]["ms_stepcode"].ToString(); } } else { //不是返工的 if (dt.Rows[idCount - 1]["ms_status"].ToString() == "3") { BadStep = dt.Rows[idCount - 1]["ms_stepcode"].ToString(); } else if (dt.Rows[idCount - 1]["ms_status"].ToString() == "4") { RejectStep = dt.Rows[idCount - 1]["ms_stepcode"].ToString(); } } currentStep = dt.Rows[idCount - 1]["ms_stepcode"].ToString(); bool flag = false;//记录返工单开始就是不良的情况 //如果只有一个单 if (idCount == 1) { //添加开始节点绿色,除了返工单 if (BadStep == "" && ((dt.Rows[idCount - 1]["ms_status"].ToString() == "3" && ifRework == "0") || (dt.Rows[idCount - 1]["ms_reworkstatus"].ToString() == "3" && ifRework == "-1"))) { PaintColor.Add(Brushes.Red); } else { PaintColor.Add(Brushes.Green); } } else//有至少两个工单,之前的工单肯定是已经完工的 { PaintColor.Add(Brushes.Green); if (BadStep == "" && ((dt.Rows[idCount - 1]["ms_status"].ToString() == "3" && ifRework == "0") || (dt.Rows[idCount - 1]["ms_reworkstatus"].ToString() == "3" && ifRework == "-1"))) { //单独记录返工前oqc判不良 flag = true; } } //查询执行过的步骤 sql.Clear(); sql.Append("select CD_DETNO,CD_STEPCODE,ms_makecode,ms_id from craft left join craftdetail on cd_crid = cr_id left join makeserial "); sql.Append("on ms_craftcode=cr_code and ms_prodcode=cr_prodcode where ms_id in (" + ms_ids.ToString().Substring(0, ms_ids.ToString().Length - 1) + ") order by ms_id,cd_detno"); dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select"); Step = new Dictionary(); for (int i = 0; i < dt.Rows.Count + 2; i++) { if (i == 0) Step.Add(i, "开始"); else if (i == dt.Rows.Count + 1) Step.Add(i, "结束"); else Step.Add(i, dt.Rows[i - 1]["CD_STEPCODE"].ToString()); } //添加中间节点 bool passed = true; int index = 0; for (int i = 0; i < dt.Rows.Count; i++) { //正在生产的途程才算 if (dt.Rows[i]["ms_id"].ToString()==ms_id.Rows[ms_id.Rows.Count-1]["ms_id"].ToString()) { if (nextStepCode == dt.Rows[i]["CD_STEPCODE"].ToString()) { index = i; } } } for (int i = 0; i < dt.Rows.Count; i++) { //只考虑正在生产的途程,之前工单的途程工序必定为绿色完工 if (dt.Rows[i]["ms_id"].ToString() == ms_id.Rows[ms_id.Rows.Count - 1]["ms_id"].ToString()) { ////下一步不在途程中,不良或者报废或者完工 if (nextStepCode == "" || nextStepCode == " ") { //返工单 if (currentStep == "") { passed = false; } //找到不良步骤 if (BadStep == dt.Rows[i]["CD_STEPCODE"].ToString()) { PaintColor.Add(Brushes.Red); //是不良品,后面就不执行 passed = false; } //找到报废步骤 else if (PastStep.Contains(dt.Rows[i]["CD_STEPCODE"].ToString() + "," + RejectStep) && RejectStep != "") { PaintColor.Add(Brushes.Black); //是报废品,后面就不执行 passed = false; } else { //通过加绿色 if (PastStep.Contains(dt.Rows[i]["CD_STEPCODE"].ToString())) { PaintColor.Add(Brushes.Green); } //不通过加白色 else { PaintColor.Add(Brushes.White); } } } ////序列号下一步不为空 else { /////SN下一步是否在途程中,是则标记 //找到下一步 if (i < index) { //已执行 PaintColor.Add(Brushes.Green); } else { //未执行 PaintColor.Add(Brushes.White); } } } else { //就是之前生产的途程,为绿色,除了返工 if (flag && (dt.Rows[i + 1]["ms_id"].ToString() == ms_id.Rows[ms_id.Rows.Count - 1]["ms_id"].ToString())) { PaintColor.Add(Brushes.Red); } else { PaintColor.Add(Brushes.Green); } } } if (ifRework != "0") { //完工添加绿色,未完工添加白色 if (dh.CheckExist("Makeserial", "ms_id='" + ms_id.Rows[ms_id.Rows.Count - 1]["ms_id"] + "' and ms_reworkstatus='2'")) PaintColor.Add(Brushes.Green); else PaintColor.Add(Brushes.White); } else { //完工添加绿色,未完工添加白色 if (dh.CheckExist("Makeserial", "ms_id='" + ms_id.Rows[ms_id.Rows.Count - 1]["ms_id"] + "' and ms_status='2'")) PaintColor.Add(Brushes.Green); else PaintColor.Add(Brushes.White); } Refresh(); SerialPanel.Refresh(); StringBuilder mp_sncodes = new StringBuilder(); StringBuilder makecodes = new StringBuilder(); //拼接序列号的和工单号的 for (int i=0;i