using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; 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.Make { public partial class Make_SeqProgramTransform : Form { AutoSizeFormClass asc = new AutoSizeFormClass(); LogStringBuilder sql = new LogStringBuilder(); DataHelper dh; //原序列号 string TSN=""; //转换后序列号 string SN=""; //错误信息 string errorMessage; //存放productsnrelation表中的数据 DataTable ListA; //存放工单信息 DataTable dt; //step 记录检验规则的进度 int step=0; //记录采集的IMEI,BT,MAC等信息 Hashtable hs; //存放关联信息类型 string type; public Make_SeqProgramTransform() { InitializeComponent(); } private void Make_SeqProgramTransform_Load(object sender, EventArgs e) { asc.controllInitializeSize(this); dh = new DataHelper(); code.Focus(); //提示用户“>>请输入TSN号” OperateResult.AppendText(">>请输入TSN号\n", Color.Green); } private void 序列烧录转换_SizeChanged(object sender, EventArgs e) { asc.controlAutoSize(this); } private void code_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode==Keys.Enter) { if (code.Text != "") { //为0,输入TSN if (step==0) { OperateResult.AppendText(">>序列号:" + code.Text + " , 发送请求\n", Color.Green); string oMakecode = ""; string oMsid = ""; //核对工序 if (LogicHandler.CheckStepSNAndMacode(ms_macode.Text, User.UserSourceCode, code.Text, User.UserCode, out oMakecode, out oMsid, out errorMessage)) { //核对TSN是否正确 string beforesn = dh.getFieldDataByCondition("makeserial", "ms_beforesn", "ms_sncode='" + code.Text + "'").ToString().Trim(); if (beforesn == "" || beforesn == null) { //按照out出的工单号查出工单相关信息,并赋值到相关控件 sql.Clear(); sql.Append("select ma_code as ms_macode,mcd_okqty,ma_qty,ma_qty-mcd_inqty as remain_qty,pr_detail,pr_code as ma_prodcode "); sql.Append("from makeserial left join make on ms_makecode=ma_code left join product on "); sql.Append("ms_prodcode=pr_code left join makecraftdetail on ms_makecode=mcd_macode where ms_sncode=:sncode and mcd_stepcode='" + User.CurrentStepCode + "'"); dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select", code.Text); if (dt.Rows.Count > 0) { BaseUtil.SetFormValue(this.Controls, dt); //判断用户是否锁定输入TSN长度, if (!checkLengthOrPre(TSNLength_checkBox, TSNLength, "长度")) { return; } //判断用户是否锁定输入TSN前缀, if (!checkLengthOrPre(TSNPre_checkBox, TSNPre, "前缀")) { return; } } else { OperateResult.AppendText(">>序列号" + code.Text + "不存在\n", Color.Red); return; } //获取需要关联采集的信息,以及校验规则 ListA = (DataTable)dh.ExecuteSql("select * from productsnrelation where psr_prodcode='" + ma_prodcode.Text + "' order by psr_detno", "select"); //没有获取到就提示错误请维护产品对应的关联采集信息 if (ListA.Rows.Count==0) { OperateResult.AppendText(">>请维护产品对应的关联采集信息\n", Color.Red); OperateResult.AppendText("<<请输入TSN\n", Color.Green); return; } hs = new Hashtable(); step = 1; //记录转换前的序列号 TSN = code.Text; code.Text = ""; OperateResult.AppendText("<<请输入SN\n", Color.Green); } else //不为空,进行过转换。不勾选修改结果,就不能再修改 { OperateResult.AppendText(">>序列号" + code.Text + "已进行了转换\n", Color.Red); code.Text = ""; OperateResult.AppendText("<<请重新输入TSN\n", Color.Green); } } else { OperateResult.AppendText(">>" + errorMessage + "\n", Color.Red); } } else if (step==1) { //开始录入SN if (!dh.CheckExist("makeserial", "ms_sncode='" + code.Text + "'")) { //判断用户是否锁定输入SN长度, if (!checkLengthOrPre(SNLength_checkBox, SNLength, "长度")) { return; } //判断用户是否锁定输入SN前缀, if (!checkLengthOrPre(SNPre_checkBox, SNPre, "前缀")) { return; } //SN校验成功,合法,记录下SN SN = code.Text; //开始进行校验规则 if (ListA.Rows.Count>0) { OperateResult.AppendText("<<请输入" + ListA.Rows[0]["psr_type"] + "\n", Color.Green); } //step+1 step = 2; } else { OperateResult.AppendText(">>序列号" + code.Text + "已存在,请输入其他序列号\n", Color.Red); } } else if(step < ListA.Rows.Count + 2) { //开始进行校验规则 if (checkRules(step)) { step += 1; } } } else { OperateResult.AppendText(">>输入不能为空\n", Color.Red); } } } /// /// 检验长度或者前缀是否合法 /// /// /// /// private bool checkLengthOrPre(CheckBox checkbox, TextBox textbox, string type) { if (checkbox.Checked == true) { if (type == "长度") { //则判断输入转换前的序列号长度是否合法,不合法则提示 if (code.Text.Trim().Length != int.Parse(textbox.Text)) { //序列号校验错误,长度错误 OperateResult.AppendText(">>TSN号" + code.Text + "校验错误,长度错误\n", Color.Red); code.Text = ""; OperateResult.AppendText("<<请重新输入TSN\n", Color.Green); return false; } } else if (type == "前缀") { //则判断输入转换前的序列号前缀是否合法,不合法则提示 if (!code.Text.StartsWith(textbox.Text.Trim())) { //序列号校验错误,前缀错误 OperateResult.AppendText(">>TSN号" + code.Text + "校验错误,前缀错误\n", Color.Red); code.Text = ""; OperateResult.AppendText("<<请重新输入TSN\n", Color.Green); return false; } } return true; } return true; } /// /// 关联采集的校验 /// /// private bool checkRules(int step) { type = ListA.Rows[step - 2]["psr_type"].ToString()=="WIFI"?"MAC": ListA.Rows[step - 2]["psr_type"].ToString(); //如果前缀和长度都满足的话 if ((ListA.Rows[step-2]["psr_length"].ToString() == "" ? true : code.Text.Length == ListA.Rows[step-2]["psr_length"].ToString().Length) && (ListA.Rows[step - 2]["psr_prefix"].ToString() == "" ? true : code.Text.StartsWith(ListA.Rows[step - 2]["psr_prefix"].ToString()))) { switch (type) { case "IMEI1": case "IMEI2": case "IMEI3": if (checkExist("ms_imei1='" + code.Text + "' or ms_imei2 = '" + code.Text + "' or ms_imei3 = '" + code.Text + "'")) { return false; } else { //判断IMEI1,IMEI2,IMEI3中是否已经有这个号了 foreach (DictionaryEntry de in hs) { if (de.Key.ToString().Contains("IMEI")&&de.Value.ToString()==code.Text) { OperateResult.AppendText(">>" + type + ":" + code.Text + "已录,请重新输入\n", Color.Red); code.Text = ""; return false; } } } break; case "BT": case "MAC": case "NETCODE": if (checkExist("MS_"+type+"='"+code.Text+"'")) { return false; } break; } //满足规则,则采集 hs.Add(type,code.Text); //说明已经是最后一个校验规则 if (step == ListA.Rows.Count+1) { //校验已经完成,此时要再次校验之前的SN和关联采集信息 //再次校验SN if (!dh.CheckExist("makeserial", "ms_sncode='" + SN + "'")) { bool flag = true; StringBuilder s1 = new StringBuilder(); //再次校验关联采集信息 foreach (DictionaryEntry de in hs) { s1.Append("MS_"+ de.Key.ToString()+" = '"+de.Value.ToString()+"',"); if (de.Key.ToString().Contains("IMEI")) { if (checkExist("ms_imei1='" + de.Value.ToString() + "' or ms_imei2 = '" + de.Value.ToString() + "' or ms_imei3 = '" + de.Value.ToString() + "'")) { flag = false; OperateResult.AppendText(">>"+de.Key.ToString()+":" + de.Value.ToString() + "已存在,请重新输入TSN\n", Color.Red); //清空信息 clearInfo(); break; } } else { if (checkExist("MS_" + de.Key.ToString() + "='" + de.Value.ToString() + "'")) { flag = false; OperateResult.AppendText(">>" + de.Key.ToString() + ":" + de.Value.ToString() + "已存在,请重新输入TSN\n", Color.Red); //清空信息 clearInfo(); break; } } } //根据flag判断关联采集信息二次校验结果 if (flag=true) { //说明SN和关联采集信息二次校验通过,则进行转换和采集信息绑定 //查询ms_firstsn string firstsn = dh.getFieldDataByCondition("makeserial", "ms_firstsn", "ms_sncode='" + TSN + "'").ToString(); //记录本次修改,存入makesnrelation表中 string updateSql = "update makeserial set ms_sncode='" + SN + "', ms_beforesn='" + TSN + "',"+ s1.Remove(s1.Length - 1, 1).ToString() + " where ms_sncode='" + TSN + "'"; string insertSql = "insert into makesnrelation (BEFORESN,SN,FIRSTSN,MAKECODE,msr_indate, msr_inman)values('" + TSN + "','" + SN + "','" + firstsn + "','" + ms_macode.Text + "', sysdate ,'" + User.UserCode + "')"; dh.ExecuteSQLTran(updateSql, insertSql); OperateResult.AppendText(">>序列号转换成功\n", Color.Green); //写入日志 LogManager.DoLog("修改序列号:" + TSN + "为" + SN + "成功!" + "操作人:" + User.UserCode); //完成该道工序 setFinish LogicHandler.UpdateMakeMessage(TSN, ms_macode.Text, "序列烧录转换", User.UserSourceCode, User.UserCode, "序列烧录转换成功", out errorMessage); //输出提示用户“>>序列号转换成功”,“>>关联采集成功” OperateResult.AppendText(">>关联采集成功\n", Color.Green); //获取剩余数,刷新页面 sql.Clear(); sql.Append("select ma_qty-mcd_inqty as remain_qty "); sql.Append("from makeserial left join make on ms_makecode=ma_code left join product on "); sql.Append("ms_prodcode=pr_code left join makecraftdetail on ms_makecode=mcd_macode where ms_sncode=:sncode and mcd_stepcode='" + User.CurrentStepCode + "'"); dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select", SN); if (dt.Rows.Count>0) { remain_qty.Text = dt.Rows[0]["remain_qty"].ToString(); } //更新页面计数+1 count.Text = int.Parse(count.Text) + 1 + ""; //完成之后,清除信息 clearInfo(); } } else { OperateResult.AppendText(">>序列号" + SN + "已存在,请重新输入TSN\n", Color.Red); //清空信息 clearInfo(); } return false; } else { OperateResult.AppendText("<<请输入"+ ListA.Rows[step-1]["psr_type"] + "\n", Color.Green); return true; } } else { //重新输入 OperateResult.AppendText(">>" + ListA.Rows[step-2]["psr_type"] + "校验不通过,请重新输入\n", Color.Red); return false; } } /// /// 工单号变化时,带出校验规则 /// /// /// private void ms_macode_TextChanged(object sender, EventArgs e) { //清空 TSNPre.Text = ""; TSNLength.Text = ""; SNPre.Text = ""; SNLength.Text = ""; //取消勾选 TSNPre_checkBox.Checked = false; TSNLength_checkBox.Checked = false; SNPre_checkBox.Checked = false; SNLength_checkBox.Checked = false; //设置可编辑 TSNLength.Enabled = true; TSNPre.Enabled = true; SNLength.Enabled = true; SNPre.Enabled = true; //查询表工单序列号防呆规则表 dt = (DataTable)dh.ExecuteSql("select msr_type, msr_prefix ,msr_length from makesnrule where msr_makecode='" + ms_macode.Text + "'", "select"); if (dt.Rows.Count > 0) { foreach (DataRow dr in dt.Rows) { //如果有值,则这个字段自动勾选,并且不可编辑 if (dr["msr_type"].ToString().ToLower() == "before") { //msr_type=before 的值赋值到转换前 //临时变量记录 string length = dr["msr_length"].ToString(); string prefix = dr["msr_prefix"].ToString(); //不为空 if (prefix != "" && prefix != null) { //则赋值 TSNPre.Text = prefix; //设置不可编辑 TSNPre.Enabled = false; //勾选 TSNPre_checkBox.Checked = true; } if (length != "" && length != null) { //赋值 TSNLength.Text = length; //设置不可编辑 TSNLength.Enabled = false; //勾选 TSNLength_checkBox.Checked = true; } } else if (dr["msr_type"].ToString().ToLower() == "after") { //msr_type=after 的值赋值到转换后 //临时变量记录 string length = dr["msr_length"].ToString(); string prefix = dr["msr_prefix"].ToString(); //不为空 if (prefix != "" && prefix != null) { //则赋值 SNPre.Text = prefix; //设置不可编辑 SNPre.Enabled = false; //勾选 SNPre_checkBox.Checked = true; } if (length != "" && length != null) { //赋值 SNLength.Text = length; //设置不可编辑 SNLength.Enabled = false; //勾选 SNLength_checkBox.Checked = true; } } } } else { /* 如果转换前没有值,则取 select productsnrule where psr_prodcode=? 产品编号, * 有值则赋值到 转换前,并且自动勾选不可编辑。*/ //dt = (DataTable)dh.ExecuteSql("select psr_prefix ,psr_length from productsnrule where psr_prodcode = " + ma_prodcode.Text, "select"); //if (dt.Rows.Count > 0) //{ // //将产品序列号防呆规则查出的数据填充 // beforeTransSNPre.Text = dt.Rows[0]["psr_prefix"].ToString(); // beforeTransSNPre.ReadOnly = true; // beforeTransSNPre_checkBox.Checked = true; // beforeTransSNLength.Text = dt.Rows[0]["psr_length"].ToString(); // beforeTransSNLength.ReadOnly = true; // beforeTransSNLength_checkBox.Checked = true; //} } } private bool checkExist(string fields) { //不存在 if (!dh.CheckExist("makeserial", fields)) { //则记录 return false; } else { OperateResult.AppendText(">>"+type+"错误,不允许重复\n", Color.Red); return true; } } private void clearInfo() { //步骤重置为0 step = 0; //关联采集信息清空 hs.Clear(); } private void cancel_Click(object sender, EventArgs e) { //清除已经采集的所有信息 clearInfo(); //提示用户输入TSN OperateResult.AppendText("<<请输入TSN\n", Color.Green); } } }