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; //存放序列号防呆规则 DataTable rules; //step 记录检验规则的进度 int step = 0; //存放关联信息类型 string type; //存放包含IMEI的规则的值,方便拼接 StringBuilder imei = new StringBuilder(); LogStringBuilder logsql = new LogStringBuilder(); //存储最后插入数据库的赋值语句部分 StringBuilder s1 = new StringBuilder(); //存放工单中数量 int ma_qty; //存放所有关联信息的类型和录入的值 Hashtable hs; string oMakecode = ""; string oMsid = ""; string siid="";//存储TSN对应的sninfo记录id DataTable macRange;//记录macBT范围 StringBuilder insertSninfoFields;//存插入sninfo的字段 StringBuilder insertSninfoValues;//存插入sninfo的值 StringBuilder toSi;//存更新sninfo的值 string macOrBt = "";//存储去掉":"或者"-"的mac和bt string imeif = ""; bool hasSnList = false;//记录是否有转换后SN清单 bool hasMakeRule = false;//记录是否有工单防呆规则 public Make_SeqProgramTransform() { InitializeComponent(); } private void Make_SeqProgramTransform_Load(object sender, EventArgs e) { asc.controllInitializeSize(this); code.Focus(); //提示用户“>>请输入TSN号” OperateResult.AppendText(">>请输入TSN号\n", Color.Black); dh = new DataHelper(); } private void code_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { if (code.Text != "") { if (LogicHandler.CheckStepAttribute(Tag.ToString(), User.UserSourceCode, out errorMessage)) { //为0,输入TSN if (step == 0) { OperateResult.AppendText(">>TSN号" + code.Text + "\n", Color.Black); if (!ChangeResult.Checked)//不勾选 { //核对工序 if (!LogicHandler.CheckStepSNAndMacode("", User.UserSourceCode, code.Text, User.UserCode, out oMakecode, out oMsid, out errorMessage)) { OperateResult.AppendText(">>" + errorMessage + "\n", Color.Red, code); return; } } else//勾选 { oMsid = dh.getFieldDataByCondition("makeserial", "max(ms_id)", "ms_sncode in (select '" + code.Text + "' from dual union select sn from makesnrelation where beforesn='" + code.Text + "' and sn<>' ' union select beforesn from makesnrelation where sn='" + code.Text + "' and beforesn<>' ')").ToString(); if (oMsid=="") { OperateResult.AppendText("< 0) { if (dt.Rows[0]["ms_stepcode"].ToString()==User.CurrentStepCode) { step = 1; TSN = code.Text; //显示序列号 show_sncode.Text = TSN; ChangeResult.Enabled = false; } else { OperateResult.AppendText("<<当前工序不允许重新转号\n", Color.Red, code); return; } } else { OperateResult.AppendText("< 0) { //记录数量 ma_qty = int.Parse(dt.Rows[0]["ma_qty"].ToString()); BaseUtil.SetFormValue(this.Controls, dt); } else { OperateResult.AppendText("<>请输入TSN\n", Color.Black); if (ChangeResult.Checked) { clearInfo(); } return; } if (ChangeResult.Checked) { OperateResult.AppendText(">>请输入SN\n", Color.Green, code); } //判断重新转换未勾选 if (!ChangeResult.Checked) { //没有勾选,只能修改一次 //核对TSN是否正确 //string beforesn = dh.getFieldDataByCondition("makeserial", "ms_beforesn", "ms_sncode='" + code.Text + "'").ToString().Trim(); if (dh.CheckExist("makeserial", "ms_id='" + oMsid + "' and ms_sncode='" + code.Text + "' and ms_beforesn is null")) { step = 1; //记录转换前的序列号 TSN = code.Text; //显示之前的序列号 show_sncode.Text = TSN; OperateResult.AppendText(">>请输入SN\n", Color.Green, code); ChangeResult.Enabled = false; } else //不为空,进行过转换。不勾选修改结果,就不能再修改 { //修改转换结果时,输入两次SN直接过站 if (dh.CheckExist("MakeSerial", "ms_id='" + oMsid + "' and ms_sncode='" + code.Text + "' and ms_beforesn is not null")) { step = 1; TSN = code.Text; //显示序列号 show_sncode.Text = TSN; OperateResult.AppendText(">>请输入SN\n", Color.Green, code); ChangeResult.Enabled = false; } else { OperateResult.AppendText("<<序列号:" + code.Text + "已转换过\n", Color.Red, code); OperateResult.AppendText(">>请重新输入TSN\n", Color.Black); } } } } else if (step == 1) { OperateResult.AppendText(">>" + code.Text + "\n", Color.Black); //判断工单是否导入了序列号清单 if (hasSnList) { if (!dh.CheckExist("makesnlist", "msl_sncode='" + code.Text + "' and msl_makecode='" + ms_macode.Text + "' and msl_type='after'")) { //有序列号清单,输入的序列号却不在范围内 OperateResult.AppendText("< 0) { OperateResult.AppendText(">>请输入" + ListA.Rows[0]["psr_type"] + "\n", Color.Green); //实例化hashTable的值 hs = new Hashtable(); } //step+1 step = 2; insertSninfoFields = new StringBuilder(); insertSninfoValues = new StringBuilder(); toSi = new StringBuilder(); } else { OperateResult.AppendText("<<序列号" + code.Text + "已存在或无该转换后序列号\n", Color.Red); OperateResult.AppendText(">>请输入SN\n", Color.Black, code); } } else if (step < ListA.Rows.Count + 2) { OperateResult.AppendText(">>" + code.Text + "\n", Color.Black); //开始进行校验规则 if (checkRules(step)) { step += 1; } } } else { OperateResult.AppendText(">>" + errorMessage + "\n", Color.Red, code); } } else { OperateResult.AppendText("<<输入不能为空\n", Color.Red); } code.Text = ""; } } /// /// 检验长度或者前缀是否合法 /// /// /// /// private bool checkLengthOrPre(CheckBox checkbox, TextBox textbox, string type, string TSNorSN) { if (checkbox.Checked == true) { //如果勾选没有填值 if (textbox.Text == "") { OperateResult.AppendText("<<勾选长度或者前缀需要填写内容\n", Color.Red); return false; } if (type == "长度") { //则判断输入转换前的序列号长度是否合法,不合法则提示 if (code.Text.Trim().Length != int.Parse(textbox.Text)) { //序列号校验错误,长度错误 OperateResult.AppendText("<<" + TSNorSN + ":" + code.Text + "校验错误,长度错误\n", Color.Red, code); OperateResult.AppendText(">>请重新输入" + TSNorSN + "\n", Color.Black); return false; } } else if (type == "前缀") { string[] pres = textbox.Text.Split('|'); bool f = false; for (int i = 0; i < pres.Length; i++) { if (pres[i] == "" ? true : code.Text.StartsWith(pres[i])) { //满足其中一条即可 f = true; break; } } //则判断输入转换前的序列号前缀是否合法,不合法则提示 if (!f) { //序列号校验错误,前缀错误 OperateResult.AppendText("<<" + TSNorSN + ":" + code.Text + "校验错误,前缀错误\n", Color.Red, code); OperateResult.AppendText(">>请重新输入" + TSNorSN + "\n", Color.Black); return false; } } return true; } return true; } /// /// 关联采集的校验 /// /// private bool checkRules(int step) { type = ListA.Rows[step - 2]["psr_type"].ToString(); //将type中的mac和bt中的"-"和":"号去掉 if (type == "MAC" || type == "BT") { if (code.Text.Length > 40) { macOrBt = code.Text.Substring(0, 40).Replace(":", "").Replace("-", ""); } else { macOrBt = code.Text.Replace(":", "").Replace("-", ""); } } else { if (code.Text.Length > 40) { imeif = code.Text.Substring(0, 40); } else { imeif = code.Text; } } //如果前缀和长度都满足的话 if ((ListA.Rows[step - 2]["psr_length"].ToString() == "0" ? false : code.Text.Length != int.Parse(ListA.Rows[step - 2]["psr_length"].ToString()))) { OperateResult.AppendText("<<" + ListA.Rows[step - 2]["psr_type"] + "长度需为"+ ListA.Rows[step - 2]["psr_length"].ToString() + "校验不通过,请重新输入\n", Color.Red); OperateResult.AppendText(">>请重新输入" + ListA.Rows[step - 2]["psr_type"] + "\n", Color.Black, code); return false; } //以|符号分割前缀 string[] preFixs = ListA.Rows[step - 2]["psr_prefix"].ToString().Split('|'); //只要满足其中一个前缀条件即可 bool isfit = false; for (int i = 0; i < preFixs.Length; i++) { if (preFixs[i] == "" ? true : code.Text.StartsWith(preFixs[i])) { //满足其中一条即可 isfit = true; break; } } if (!isfit) { OperateResult.AppendText("<<" + ListA.Rows[step - 2]["psr_type"] + "前缀校验不通过,请重新输入\n", Color.Red); OperateResult.AppendText(">>请重新输入" + ListA.Rows[step - 2]["psr_type"] + "\n", Color.Black, code); return false; } switch (type) { case "IMEI1": case "IMEI2": case "IMEI3": if (checkExist("(ms_imei1='" + imeif + "' or ms_imei2 = '" + imeif + "' or ms_imei3 = '" + imeif + "') and ms_status in (0,1,2,3) and ms_id <> '" + oMsid + "'")) { OperateResult.AppendText("<<" + type + ":" + imeif + "错误,不允许重复\n", Color.Red); OperateResult.AppendText(">>请输入" + type + "\n", Color.Black, code); return false; } else { //校验sninfo中是否已经存在这个 if (dh.CheckExist("sninfo", "(si_imei1='" + imeif + "' or si_imei2 = '" + imeif + "' or si_imei3 = '" + imeif + "') and si_id <>'" + siid + "'")) { OperateResult.AppendText("<<" + type + ":" + imeif + "错误,不允许重复\n", Color.Red); OperateResult.AppendText(">>请输入" + type + "\n", Color.Black, code); return false; } //判断IMEI1,IMEI2,IMEI3中是否已经有这个号了 if (imei.ToString().Contains(imeif)) { OperateResult.AppendText("<<" + type + ":" + imeif + "已录,请重新输入\n", Color.Red); OperateResult.AppendText(">>请输入" + type + "\n", Color.Black, code); return false; } } //通过校验,将包含IMEI的值拼接 imei.Append("'" + imeif + "',"); s1.Append("MS_" + type + " = '" + imeif + "',"); insertSninfoFields.Append("si_" + type + ","); insertSninfoValues.Append("'" + imeif + "',"); toSi.Append("si_" + type + " = '" + imeif + "',"); break; case "BT": case "MAC": //验证是否符合合同防呆 if (!LogicHandler.checkMacOrBtRange(oMsid,macOrBt,type)) { OperateResult.AppendText("<<" + ListA.Rows[step - 2]["psr_type"].ToString() + ":" + code.Text + "错误,不在合同防呆范围内\n", Color.Red); OperateResult.AppendText(">>请输入" + ListA.Rows[step - 2]["psr_type"].ToString() + "\n", Color.Black, code); return false; } //验证是否已被使用 if (checkExist("MS_" + type + "='" + macOrBt + "' and ms_status in (0,1,2,3) and ms_id <> '" + oMsid + "'")) { OperateResult.AppendText("<<" + ListA.Rows[step - 2]["psr_type"].ToString() + ":" + code.Text + "错误,不允许重复\n", Color.Red); OperateResult.AppendText(">>请输入" + ListA.Rows[step - 2]["psr_type"].ToString() + "\n", Color.Black, code); return false; } else { //校验在sninfo表中是否存在 if (dh.CheckExist("sninfo", "si_" + type + "='" + macOrBt + "' and si_id <>'" + siid + "'")) { OperateResult.AppendText("<<" + ListA.Rows[step - 2]["psr_type"].ToString() + ":" + code.Text + "错误,不允许重复\n", Color.Red); OperateResult.AppendText(">>请输入" + ListA.Rows[step - 2]["psr_type"].ToString() + "\n", Color.Black, code); return false; } } //通过校验,将包含IMEI的值拼接 s1.Append("MS_" + type + " = '" + macOrBt + "',"); insertSninfoFields.Append("si_" + type + ","); insertSninfoValues.Append("'" + macOrBt + "',"); toSi.Append("si_" + type + " = '" + macOrBt + "',"); break; case "NETCODE": if (checkExist("MS_" + type + "='" + imeif + "' and ms_status in (0,1,2,3) and ms_id <> '" + oMsid + "'")) { OperateResult.AppendText("<<" + ListA.Rows[step - 2]["psr_type"].ToString() + ":" + imeif + "错误,不允许重复\n", Color.Red); OperateResult.AppendText(">>请输入" + ListA.Rows[step - 2]["psr_type"].ToString() + "\n", Color.Black, code); return false; } else { //校验在sninfo表中是否存在 if (dh.CheckExist("sninfo", "si_" + type + "='" + imeif + "' and si_id <>'" + siid + "'")) { OperateResult.AppendText("<<" + ListA.Rows[step - 2]["psr_type"].ToString() + ":" + imeif + "错误,不允许重复\n", Color.Red); OperateResult.AppendText(">>请输入" + ListA.Rows[step - 2]["psr_type"].ToString() + "\n", Color.Black, code); return false; } } //通过校验,将包含IMEI的值拼接 s1.Append("MS_" + type + " = '" + imeif + "',"); insertSninfoFields.Append("si_" + type + ","); insertSninfoValues.Append("'" + imeif + "',"); toSi.Append("si_" + type + " = '" + imeif + "',"); break; } //满足规则,则采集 if (type == "MAC" || type == "BT") { hs.Add(ListA.Rows[step - 2]["psr_type"].ToString(), macOrBt); } else { hs.Add(ListA.Rows[step - 2]["psr_type"].ToString(), imeif); } //说明已经是最后一个校验规则 if (step == ListA.Rows.Count + 1) { //校验已经完成,此时要再次校验之前的SN和关联采集信息 //再次校验SN if ((ChangeResult.Checked && dh.CheckExist("makeserial", "ms_id='" + oMsid + "' and ms_sncode='" + SN + "'")) || !dh.CheckExist("makeserial", "ms_sncode='" + SN + "'") || (!ChangeResult.Checked && (TSN == SN))) { bool flag = true; //遍历判断已采集的信息是否已存在 foreach (DictionaryEntry de in hs) { if (dh.CheckExist("makeserial", "MS_" + (de.Key.ToString()) + "='" + de.Value + "' and ms_status in (0,1,2,3) and ms_id <> '" + oMsid + "'")) { flag = false; OperateResult.AppendText("<<" + de.Key + "已被使用,请重新输入TSN,重新转换\n", Color.Red); //清空信息 clearInfo(); break; } else { //校验sninfo中是否存在 if (dh.CheckExist("sninfo", "si_" + (de.Key.ToString()) + "='" + de.Value + "' and si_id <>'" + siid + "'")) { flag = false; OperateResult.AppendText("<<" + de.Key + "已被使用,请重新输入TSN,重新转换\n", Color.Red); //清空信息 clearInfo(); break; } } } //根据flag判断关联采集信息二次校验结果 if (flag == true) { //说明SN和关联采集信息二次校验通过,则进行转换和采集信息绑定 string firstsn = ""; string updateSql = ""; //勾选了修改转换结果 if (ChangeResult.Checked) { //查询ms_firstsn firstsn = dh.getFieldDataByCondition("makeserial", "ms_firstsn", "ms_id='" + oMsid + "' and ms_beforesn='" + TSN + "'").ToString(); //记录本次修改,存入makesnrelation表中 updateSql = "update makeserial set ms_sncode='" + SN + "'," + s1.Remove(s1.Length - 1, 1).ToString() + " where ms_id='" + oMsid + "' and ms_beforesn='" + TSN + "'"; //删除最近一条转换记录 dh.ExecuteSql("delete from makesnrelation where BEFORESN='" + TSN + "' and makecode='" + ms_macode.Text + "'", "delete"); } //未勾选修改转换结果 else { //查询ms_firstsn firstsn = dh.getFieldDataByCondition("makeserial", "ms_firstsn", " ms_id='" + oMsid + "' and ms_sncode='" + TSN + "'").ToString(); //记录本次修改,存入makesnrelation表中 updateSql = "update makeserial set ms_sncode='" + SN + "', ms_beforesn='" + TSN + "'," + s1.Remove(s1.Length - 1, 1).ToString() + " where ms_id='" + oMsid + "' and 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<<关联采集成功\n", Color.Green); //写入日志 LogManager.DoLog("修改序列号:" + TSN + "为" + SN + "成功!" + "操作人:" + User.UserCode); //记录日志 LogicHandler.DoCommandLog(Tag.ToString(), User.UserCode, ms_macode.Text, User.UserLineCode, User.UserSourceCode, "序列烧录转换", "转换成功", TSN, ""); //写入sninfo表 insert2Sninfo(SN); //输出提示用户“>>序列号转换成功”,“>>关联采集成功” //完成该道工序 setFinish if (!LogicHandler.SetStepResult(ms_macode.Text, User.UserSourceCode, SN, "序列烧录转换", "序列烧录转换成功", User.UserCode, out errorMessage)) { OperateResult.AppendText(">>" + errorMessage + "\n", Color.Red, code); } //获取剩余数,刷新页面 sql.Clear(); sql.Append("select mcd_inqty from makecraftdetail where mcd_macode='" + ms_macode.Text + "' and mcd_stepcode='" + User.CurrentStepCode + "'"); dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select"); if (dt.Rows.Count > 0) { remain_qty.Text = ma_qty - int.Parse(dt.Rows[0]["mcd_inqty"].ToString()) + ""; } //更新页面计数+1 count.Text = int.Parse(count.Text) + 1 + ""; //完成之后,清除信息 clearInfo(); OperateResult.AppendText(">>请输入TSN号\n", Color.Black); } } else { OperateResult.AppendText("<<序列号" + SN + "已存在\n", Color.Red); OperateResult.AppendText(">>请重新输入TSN\n", Color.Black, code); //清空信息 clearInfo(); } code.Text = ""; return false; } else { OperateResult.AppendText(">>请输入" + ListA.Rows[step - 1]["psr_type"] + "\n", Color.Green, code); return true; } } /// /// 工单号变化时,带出校验规则 /// /// /// private void ms_macode_TextChanged(object sender, EventArgs e) { hasSnList = false; hasMakeRule = false; //清空 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; TSNPre_checkBox.Enabled = true; TSNLength_checkBox.Enabled = true; SNPre_checkBox.Enabled = true; SNLength_checkBox.Enabled = true; //判断工单是否导入了序列号清单 if (dh.CheckExist("makesnlist", "msl_makecode='" + ms_macode.Text + "' and msl_type='after'")) { hasSnList = true; return; } //查询表工单序列号防呆规则表 rules = (DataTable)dh.ExecuteSql("select msr_startno,msr_endno,msr_system,msr_type, msr_prefix ,msr_length from makesnrule where msr_makecode='" + ms_macode.Text + "'", "select"); if (rules.Rows.Count > 0) { hasMakeRule = true; } else { /* 如果转换前没有值,则取 select productsnrule where psr_prodcode=? 产品编号, * 有值则赋值到 转换前,并且自动勾选不可编辑。*/ rules = (DataTable)dh.ExecuteSql("select psr_prefix,psr_length from productsnrule where psr_prodcode ='" + dt.Rows[0]["ma_prodcode"].ToString() + "' and psr_type='after'", "select"); if (rules.Rows.Count > 0) { //将产品序列号防呆规则查出的数据填充 if (rules.Rows[0]["psr_prefix"].ToString() != "") { SNPre.Text = rules.Rows[0]["psr_prefix"].ToString(); SNPre.Enabled = false; SNPre_checkBox.Checked = true; SNPre_checkBox.Enabled = false; } if (rules.Rows[0]["psr_length"].ToString() != "") { SNLength.Text = rules.Rows[0]["psr_length"].ToString(); SNLength.Enabled = false; SNLength_checkBox.Checked = true; SNLength_checkBox.Enabled = false; } } } } private bool checkExist(string fields) { //不存在 if (!dh.CheckExist("makeserial", fields)) { //则记录 return false; } else { return true; } } private void clearInfo() { //步骤重置为0 step = 0; //关联采集信息清空 if (hs != null) { hs.Clear(); } imei.Clear(); logsql.Clear(); s1.Clear(); show_sncode.Text = ""; ChangeResult.Enabled = true; } private void cancel_Click(object sender, EventArgs e) { //清除已经采集的所有信息 clearInfo(); //提示用户输入TSN OperateResult.AppendText(">>请输入TSN\n", Color.Green); } private void ChangeResult_CheckedChanged(object sender, EventArgs e) { if (ChangeResult.Checked) { //勾选的时候提示输入TSN OperateResult.AppendText(">>请输入TSN号\n", Color.Black); } } private void insert2Sninfo(string sn) { //是否为空 if (siid == "") { //插入新的数据 sql.Clear(); sql.Append("insert into sninfo(si_id,si_sn," + insertSninfoFields.ToString().Substring(0, insertSninfoFields.ToString().Length - 1) + ") values "); sql.Append("(sninfo_seq.nextval,'" + sn + "'," + insertSninfoValues.ToString().Substring(0, insertSninfoValues.ToString().Length - 1) + ")"); dh.ExecuteSql(sql.GetString(), "insert"); } else { //更新sninfo sql.Clear(); sql.Append("update sninfo set "+(ChangeResult.Checked?("si_sn='"+sn+"',"):"")); sql.Append(toSi.ToString().Substring(0, toSi.ToString().Length - 1)); sql.Append(" where si_id='" + siid + "'"); dh.ExecuteSql(sql.GetString(), "update"); } } private void Make_SeqProgramTransform_SizeChanged(object sender, EventArgs e) { asc.controlAutoSize(this); } } }