using System; using System.Data; using System.Drawing; using System.Windows.Forms; using UAS_MES.CustomControl.TextBoxWithIcon; using UAS_MES.DataOperate; using UAS_MES.Entity; using UAS_MES.PublicMethod; namespace UAS_MES.Make { public partial class Make_SeqTransform : Form { AutoSizeFormClass asc = new AutoSizeFormClass(); DataHelper dh; DataTable dt; DataTable rules; LogStringBuilder sql = new LogStringBuilder(); string bsncode = "";//转换前序列号 string errorMessage = ""; string startNo = "";//起始序列 string endNo = "";//终止序列 string system = "";//进制 bool flag = false;//标识是否只是过站 DataTable ListA; //存放工单中数量 int ma_qty; string oMakeCode = ""; string oMsId = ""; public Make_SeqTransform() { InitializeComponent(); } private void 序列转换_Load(object sender, EventArgs e) { asc.controllInitializeSize(this); dh = new DataHelper(); sncode.Focus(); OperateResult.AppendText(">>请输入TSN号\n", Color.Black); ////设置锁定工单 //ms_makecode_lock.GetMakeCodeCtl(ma_code); //ma_code.SetLockCheckBox(ms_makecode_lock); ////工单放大镜的配置 //ma_code.TableName = "make left join product on ma_prodcode=pr_code"; //ma_code.SelectField = "ma_code # 工单号,ma_prodcode # 产品编号,pr_detail # 产品名称"; //ma_code.FormName = Name; //ma_code.SetValueField = new string[] { "ma_code", "ma_prodcode", "pr_detail" }; //ma_code.Condition = "ma_statuscode='STARTED'"; //ma_code.DbChange += Ma_code_DbChange; } //private void Ma_code_DbChange(object sender, EventArgs e) //{ // Dbfind = ma_code.ReturnData; // BaseUtil.SetFormValue(this.Controls, Dbfind); //} private void sncode_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { if (sncode.Text != "") { if (LogicHandler.CheckStepAttribute(Tag.ToString(), User.UserSourceCode, out errorMessage)) { OperateResult.AppendText(">>" + sncode.Text + "\n", Color.Black); //如果用户没有输入工单号自行去后台查询 //通过工单序列号关系验证 //bsncode为空,就说明是输入转换之前的序列号 if (bsncode == "") { if (!ChangeResult.Checked) { //用户填写了工单号,那么序列号必须要是该工单的,否则提示错误 if (!LogicHandler.CheckStepSNAndMacode("", User.UserSourceCode, sncode.Text, User.UserCode, out oMakeCode, out oMsId, out errorMessage)) { OperateResult.AppendText(">>" + errorMessage + "\n", Color.Red, sncode); return; } } else//勾选 { oMsId = dh.getFieldDataByCondition("makeserial", "max(ms_id)", "ms_sncode in (select '" + sncode.Text + "' from dual union select sn from makesnrelation where beforesn='" + sncode.Text + "' and sn<>' ' union select beforesn from makesnrelation where sn='" + sncode.Text + "' and beforesn<>' ')").ToString(); if (oMsId == "") { OperateResult.AppendText(">>TSN号错误\n", Color.Red, sncode); return; } //根据ms_id查询 sql.Clear(); sql.Append("select 1 from makeserial where ms_id='" + oMsId + "' and ms_beforesn='" + sncode.Text + "' and ms_nextmacode is null and ms_outboxcode is null"); dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select"); //如果行数大于0则允许转号 if (dt.Rows.Count > 0) { sql.Clear(); sql.Append("select 1 from makeserial where ms_id='" + oMsId + "' and ms_stepcode='" + User.CurrentStepCode + "'"); dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select"); if (dt.Rows.Count > 0) { bsncode = sncode.Text; //显示序列号 show_sncode.Text = bsncode; ChangeResult.Enabled = false; } else { OperateResult.AppendText(">>当前工序不允许重新转号\n", Color.Red, sncode); return; } } else { OperateResult.AppendText(">>TSN号" + sncode.Text + "当前状态不允许重新转号\n", Color.Red, sncode); return; } } //如果用户没有选择工单号 if (ma_code.Text == "" || ma_code.Text != oMakeCode||ChangeResult.Checked) { //按照out出的工单号查出工单相关信息,并赋值到相关控件 sql.Clear(); sql.Append("select ma_code,ma_softversion,ma_prodcode,pr_detail,ma_qty,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_id=:msid and mcd_stepcode='" + User.CurrentStepCode + "'"); dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select", oMsId); if (dt.Rows.Count > 0) { //记录数量 ma_qty = int.Parse(dt.Rows[0]["ma_qty"].ToString()); BaseUtil.SetFormValue(this.Controls, dt); //ms_makecode_lock.Checked = true; } } //获取需要关联采集的信息,以及校验规则 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, sncode); OperateResult.AppendText("<<请输入TSN\n", Color.Black); if (ChangeResult.Checked) { bsncode = ""; ChangeResult.Enabled = true; flag = false; show_sncode.Text = ""; } return; } if (ChangeResult.Checked) { OperateResult.AppendText("<<请输入SN号\n", Color.Green, sncode); } switch (ChangeResult.CheckState) { //勾选是修改已转换的序列,矫正修改错了的序列号 case CheckState.Checked: //if (dh.CheckExist("MakeSerial", "ms_beforesn='" + sncode.Text + "' and ms_id='" + oMsId + "'")) //{ // bsncode = sncode.Text; // //显示序列号 // show_sncode.Text = bsncode; // OperateResult.AppendText("<<请输入SN号\n", Color.Green, sncode); // ChangeResult.Enabled = false; //} //else //{ // OperateResult.AppendText(">>不存在该已转序列号:" + sncode.Text + "\n", Color.Red, sncode); // OperateResult.AppendText("<<请重新输入TSN号\n", Color.Black); //} break; case CheckState.Unchecked: //string beforesn = dh.getFieldDataByCondition("makeserial", "ms_beforesn", "ms_sncode='" + sncode.Text + "'").ToString().Trim(); //为空,就说明,没有进行过序列号的转换 if (dh.CheckExist("makeserial", "ms_id='" + oMsId + "' and ms_sncode='" + sncode.Text + "' and ms_beforesn is null")) { //记录转换前的序列号 bsncode = sncode.Text; //显示序列号 show_sncode.Text = bsncode; OperateResult.AppendText("<<请输入SN号\n", Color.Green, sncode); ChangeResult.Enabled = false; } else //不为空,进行过转换。不勾选修改结果,就不能再修改 { //修改转换结果时,输入两次SN直接过站 if (dh.CheckExist("MakeSerial", "ms_id='" + oMsId + "' and ms_sncode='" + sncode.Text + "' and ms_beforesn is not null")) { bsncode = sncode.Text; //显示序列号 show_sncode.Text = bsncode; OperateResult.AppendText("<<请输入SN号\n", Color.Green, sncode); ChangeResult.Enabled = false; flag = true; } else { OperateResult.AppendText(">>序列号:" + sncode.Text + "已转换过\n", Color.Red, sncode); OperateResult.AppendText("<<请重新输入TSN号\n", Color.Black); } } break; default: break; } } //bsncode不为空,说明输入的是转换后的序列号 else { //判断工单是否导入了序列号清单 if (dh.CheckExist("makesnlist", "msl_makecode='" + ma_code.Text + "' and msl_type='after'")) { if (!dh.CheckExist("makesnlist", "msl_sncode='" + sncode.Text + "' and msl_makecode='" + ma_code.Text + "' and msl_type='after'")) { //有序列号清单,输入的序列号却不在范围内 OperateResult.AppendText(">>SN号" + sncode.Text + "错误,不在工单设定的转换后序列号清单中\n", Color.Red, sncode); return; } } //判断用户是否锁定输入转换后序列号长度, if (!checkLengthOrPre(afterTransSNLength_checkBox, afterTransSNLength, "长度")) return; //判断用户是否锁定输入转换后序列号前缀, if (!checkLengthOrPre(afterTransSNPre_checkBox, afterTransSNPre, "前缀")) return; //判断输入的转换后序列号是否符合起始终止 if (!checkStartAndEnd()) { OperateResult.AppendText(">>SN号" + sncode.Text + "校验错误,不在工单防呆规则指定范围内!\n", Color.Red, sncode); return; } //如果只是需要过站的序列号 if (flag) { if (bsncode == sncode.Text) { //写入日志 if (LogicHandler.SetStepResult(ma_code.Text, User.UserSourceCode, sncode.Text, "序列转换", "序列转换成功", User.UserCode, out errorMessage)) { //记录日志 LogicHandler.DoCommandLog(Tag.ToString(), User.UserCode, ma_code.Text, User.UserLineCode, User.UserSourceCode, "序列转换", "转换成功", sncode.Text, ""); OperateResult.AppendText(">>转换成功\n", Color.Green, sncode); } else { OperateResult.AppendText(">>" + errorMessage + "\n", Color.Red, sncode); } if (errorMessage.Contains("AFTERSUCCESS")) OperateResult.AppendText(">>" + errorMessage + "\n"); flag = false; ChangeResult.Enabled = true; show_sncode.Text = ""; bsncode = ""; } else { OperateResult.AppendText(">>输入一致才可过站\n", Color.Red, sncode); } return; } //如果两次输入的序列号相同进行提示,不相同则进行下一步 //if (bsncode != sncode.Text) //{ if ((ChangeResult.Checked && dh.CheckExist("makeserial", "ms_id='" + oMsId + "' and ms_sncode='" + sncode.Text + "'")) || !dh.CheckExist("makeserial", "ms_sncode='" + sncode.Text + "'") || (!ChangeResult.Checked && (bsncode == sncode.Text))) { string firstsn = ""; string updateSql = ""; //勾选了修改转换结果 if (ChangeResult.Checked) { //查询ms_firstsn firstsn = dh.getFieldDataByCondition("makeserial", "ms_firstsn", "ms_id='" + oMsId + "' and ms_beforesn='" + bsncode + "'").ToString(); //记录本次修改,存入makesnrelation表中 updateSql = "update makeserial set ms_sncode='" + sncode.Text + "' where ms_id='" + oMsId + "' and ms_beforesn='" + bsncode + "'"; //删除最近一条转换记录 dh.ExecuteSql("delete from makesnrelation where BEFORESN='" + bsncode + "' and makecode='" + ma_code.Text + "'", "delete"); } //未勾选修改转换结果 else { //查询ms_firstsn firstsn = dh.getFieldDataByCondition("makeserial", "ms_firstsn", "ms_id='" + oMsId + "' and ms_sncode='" + bsncode + "'").ToString(); //记录本次修改,存入makesnrelation表中 updateSql = "update makeserial set ms_sncode='" + sncode.Text + "', ms_beforesn='" + bsncode + "' where ms_id='" + oMsId + "' and ms_sncode='" + bsncode + "'"; } string insertSql = "insert into makesnrelation (BEFORESN,SN,FIRSTSN,MAKECODE,msr_indate, msr_inman)values('" + bsncode + "','" + sncode.Text + "','" + firstsn + "','" + ma_code.Text + "', sysdate ,'" + User.UserCode + "')"; dh.ExecuteSQLTran(updateSql, insertSql); OperateResult.AppendText(">>转换成功\n", Color.Green); //记录日志 LogicHandler.DoCommandLog(Tag.ToString(), User.UserCode, ma_code.Text, User.UserLineCode, User.UserSourceCode, "序列转换", "转换成功", sncode.Text, ""); LogManager.DoLog("修改序列号:" + bsncode + "为" + sncode.Text + "成功!" + "操作人:" + User.UserCode); //写入日志 if (LogicHandler.SetStepResult(ma_code.Text, User.UserSourceCode, sncode.Text, "序列转换", "序列转换成功", User.UserCode, out errorMessage)) { } else { OperateResult.AppendText(">>" + errorMessage + "\n", Color.Red, sncode); } OperateResult.AppendText(">>请输入TSN号\n", Color.Black); //置空 bsncode = ""; show_sncode.Text = ""; //获取剩余数,刷新页面 sql.Clear(); sql.Append("select mcd_inqty from makecraftdetail where mcd_macode='" + ma_code.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()) + ""; } //更新数量 changenum.Text = int.Parse(changenum.Text) + 1 + ""; ChangeResult.Enabled = true; } else OperateResult.AppendText(">>序列号" + sncode.Text + "已存在,请输入其他序列号\n", Color.Red); //} //else //{ // OperateResult.AppendText(">>相同序列号不能进行转换\n", Color.Red); //} sncode.Text = ""; } } else { OperateResult.AppendText(">>" + errorMessage + "\n", Color.Red, sncode); } } else { OperateResult.AppendText(">>序列号不能为空\n", Color.Red); } sncode.Text = ""; } } private void 序列转换_SizeChanged(object sender, EventArgs e) { asc.controlAutoSize(this); } private void Confirm_Click(object sender, EventArgs e) { KeyEventArgs ky = new KeyEventArgs(Keys.Enter); sncode_KeyDown(sender, ky); } private void ReCall_Click(object sender, EventArgs e) { bsncode = ""; OperateResult.AppendText(">>请输入TSN号\n", Color.Green, show_sncode); ChangeResult.Enabled = true; flag = false; } /// /// 工单号keydown /// /// /// private void ms_makecode_KeyDown(object sender, KeyEventArgs e) { } /// /// 如果清空了工单号,或者更换了工单号则将 : 转换前序列号长度,转换前序列号前缀 ///转换后序列号长度,转换后序列号前缀 四个字段值清空。 /// /// /// private void ms_makecode_UserControlTextChanged(object sender, EventArgs e) { //清空 beforeTransSNPre.Text = ""; beforeTransSNLength.Text = ""; afterTransSNPre.Text = ""; afterTransSNLength.Text = ""; //取消勾选 beforeTransSNPre_checkBox.Checked = false; beforeTransSNLength_checkBox.Checked = false; afterTransSNPre_checkBox.Checked = false; afterTransSNLength_checkBox.Checked = false; //设置可编辑 beforeTransSNLength.Enabled = true; beforeTransSNPre.Enabled = true; afterTransSNLength.Enabled = true; afterTransSNPre.Enabled = true; beforeTransSNPre_checkBox.Enabled = true; beforeTransSNLength_checkBox.Enabled = true; afterTransSNPre_checkBox.Enabled = true; afterTransSNLength_checkBox.Enabled = true; //判断工单是否导入了序列号清单 if (dh.CheckExist("makesnlist", "msl_makecode='" + ma_code.Text + "' and msl_type='after'")) { return; } //查询表工单序列号防呆规则表 rules = (DataTable)dh.ExecuteSql("select msr_startno,msr_endno,msr_system,msr_type, msr_prefix ,msr_length from makesnrule where msr_makecode='" + ma_code.Text + "'", "select"); if (rules.Rows.Count > 0) { foreach (DataRow dr in rules.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) { //则赋值 beforeTransSNPre.Text = prefix; //设置不可编辑 beforeTransSNPre.Enabled = false; //勾选 beforeTransSNPre_checkBox.Checked = true; beforeTransSNPre_checkBox.Enabled = false; } if (length != "" && length != null) { //赋值 beforeTransSNLength.Text = length; //设置不可编辑 beforeTransSNLength.Enabled = false; //勾选 beforeTransSNLength_checkBox.Checked = true; beforeTransSNLength_checkBox.Enabled = false; } } else if (dr["msr_type"].ToString().ToLower() == "after") { //msr_type=after 的值赋值到转换后 //临时变量记录 string length = dr["msr_length"].ToString(); string prefix = dr["msr_prefix"].ToString(); //记录进制 system = dr["msr_system"].ToString(); //不为空 if (prefix != "" && prefix != null) { //则赋值 afterTransSNPre.Text = prefix; //设置不可编辑 afterTransSNPre.Enabled = false; //勾选 afterTransSNPre_checkBox.Checked = true; afterTransSNPre_checkBox.Enabled = false; } if (dr["msr_startno"].ToString() != "" && dr["msr_endno"].ToString() != "") { //记录起止序列号 startNo = dr["msr_startno"].ToString().Substring(afterTransSNPre.Text.Length); endNo = dr["msr_endno"].ToString().Substring(afterTransSNPre.Text.Length); } if (length != "" && length != null) { //赋值 afterTransSNLength.Text = length; //设置不可编辑 afterTransSNLength.Enabled = false; //勾选 afterTransSNLength_checkBox.Checked = true; afterTransSNLength_checkBox.Enabled = false; } } } } 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() != "") { afterTransSNPre.Text = rules.Rows[0]["psr_prefix"].ToString(); afterTransSNPre.Enabled = false; afterTransSNPre_checkBox.Checked = true; afterTransSNPre_checkBox.Enabled = false; } if (rules.Rows[0]["psr_length"].ToString() != "") { afterTransSNLength.Text = rules.Rows[0]["psr_length"].ToString(); afterTransSNLength.Enabled = false; afterTransSNLength_checkBox.Checked = true; afterTransSNLength_checkBox.Enabled = false; } } } } /// /// 检验长度或者前缀是否合法 /// /// /// /// private bool checkLengthOrPre(CheckBox checkbox, TextBox textbox, string type) { if (checkbox.Checked == true) { //如果勾选没有填值 if (textbox.Text == "") { OperateResult.AppendText(">>勾选长度或者前缀需要填写内容\n", Color.Red); return false; } if (type == "长度") { //则判断输入转换前的序列号长度是否合法,不合法则提示 if (sncode.Text.Trim().Length != int.Parse(textbox.Text)) { //序列号校验错误,长度错误 OperateResult.AppendText(">>序列号" + sncode.Text + "校验错误,长度错误\n", Color.Red, sncode); OperateResult.AppendText("<<请重新输入SN号\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 : sncode.Text.StartsWith(pres[i])) { //满足其中一条即可 f = true; break; } } //则判断输入转换前的序列号前缀是否合法,不合法则提示 if (!f) { //序列号校验错误,前缀错误 OperateResult.AppendText(">>序列号" + sncode.Text + "校验错误,前缀错误\n", Color.Red, sncode); OperateResult.AppendText("<<请重新输入SN号\n", Color.Black); return false; } } return true; } return true; } /// /// 检测转换后的序列号是否满足起止序列号范围 /// /// private bool checkStartAndEnd() { if (system == "") { return true; } if (system == "decimal") { //十进制 if (int.Parse(sncode.Text.Substring(afterTransSNPre.Text.Length)) >= int.Parse(startNo) && int.Parse(sncode.Text.Substring(afterTransSNPre.Text.Length)) <= int.Parse(endNo)) { //满足 return true; } } else { //十六进制 if (int.Parse(sncode.Text.Substring(afterTransSNPre.Text.Length), System.Globalization.NumberStyles.HexNumber) >= int.Parse(startNo, System.Globalization.NumberStyles.HexNumber) && int.Parse(sncode.Text.Substring(afterTransSNPre.Text.Length), System.Globalization.NumberStyles.HexNumber) <= int.Parse(endNo, System.Globalization.NumberStyles.HexNumber)) { //满足 return true; } } return false; } private void ChangeResult_CheckedChanged(object sender, EventArgs e) { if (ChangeResult.Checked) { //勾选的时候提示输入TSN OperateResult.AppendText("<<请输入TSN号\n", Color.Black); } } } }