using DevExpress.Printing.Core.PdfExport.Metafile; using HslCommunication; using LabelManager2; using Seagull.BarTender.Print; using System; using System.Data; using System.Drawing; using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Windows.Forms; using UAS_MES_NEW.DataOperate; using UAS_MES_NEW.Entity; using UAS_MES_NEW.PublicForm; using UAS_MES_NEW.PublicMethod; namespace UAS_MES_NEW.Query { public partial class Query_SN1 : Form { DataHelper dh = SystemInf.dh; Engine engine; Thread InitPrint; DataTable Dbfind; Document doc; DataTable _dt; public Query_SN1() { InitializeComponent(); } private void Query_SpecialReport_Load(object sender, EventArgs e) { InitPrint = new Thread(InPrint); SetLoadingWindow stw = new SetLoadingWindow(InitPrint, "初始化打印程序"); BaseUtil.SetFormCenter(stw); stw.ShowDialog(); ma_code.TableName = " make left join product on ma_prodcode=pr_code"; ma_code.SelectField = "ma_code # 工单编号,pr_code # 产品编号,pr_spec # 型号,pr_useattach # 标签规格"; ma_code.FormName = Name; ma_code.SetValueField = new string[] { "ma_code", "pr_useattach" }; ma_code.Condition = "ma_statuscode='STARTED'"; ma_code.DbChange += pr_code_DbChange; } private void pr_code_DbChange(object sender, EventArgs e) { Dbfind = ma_code.ReturnData; BaseUtil.SetFormValue(this.Controls, Dbfind); DataTable dt = (DataTable)dh.ExecuteSql("select ma_qty,ma_prodcode,pr_detail,ma_printnum,nvl(pr_useattach,'20mm10mm')pr_useattach from make left join product on ma_prodcode=pr_code left join (select count(1)ma_printnum,msl_makecode from makesnlist where msl_printstatus=-1 group by msl_makecode) on msl_makecode=ma_code where ma_code='" + ma_code.Text + "'", "select"); if (dt.Rows.Count > 0) { pr_useattach.Text = dt.Rows[0]["pr_useattach"].ToString(); pr_code.Text = dt.Rows[0]["ma_prodcode"].ToString(); ma_qty.Text = dt.Rows[0]["ma_qty"].ToString(); ma_printcount.Text = dt.Rows[0]["ma_printnum"].ToString(); pr_detail.Text = dt.Rows[0]["pr_detail"].ToString(); } } private void InPrint() { try { engine = new Engine(true); } catch (Exception) { MessageBox.Show("未正确安装BarTender软件"); } } private void Print_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); string ErrorMessage = ""; string batch = System.DateTime.Now.ToString("yyyyMMddhhmiss"); dt = (DataTable)dh.ExecuteSql("select msl_sncode from makesnlist where msl_makecode='" + ma_code.Text + "' and nvl(msl_printstatus,0)=0 order by msl_sncode", "select"); if (dt.Rows.Count < PrintNum.Value) { OperateResult.AppendText("未打印数量不足,剩余" + dt.Rows.Count + "未打印\n"); return; } for (int i = 0; i < PrintNum.Value; i++) { string mil_sncode = dt.Rows[i]["msl_sncode"].ToString(); if (Print.BarTender(Tag.ToString(), ref engine, PrintLabel.Text, PrintLabel.SelectedValue.ToString(), PrinterList.Text, mil_sncode, int.Parse("1"), ma_code.Text, pr_code.Text, "机身标", "0", out ErrorMessage)) { //提示用户打印成功 dh.ExecuteSql("update makesnlist set msl_printstatus=-1 where msl_sncode='" + mil_sncode + "'", "update"); dh.ExecuteSql("update makesnlist set msl_printstatus=-1,msl_printbatch='" + batch + "' where msl_sncode='" + mil_sncode + "'", "update"); OperateResult.AppendText(">>序列号:" + mil_sncode + "打印结束\n", Color.Green); } else { dh.ExecuteSql("update makesnlist set msl_printstatus=-1where msl_sncode='" + mil_sncode + "'", "update"); dh.ExecuteSql("update makesnlist set msl_printstatus=-1,msl_printbatch='" + batch + "' where msl_sncode='" + mil_sncode + "'", "update"); OperateResult.AppendText(">>" + ErrorMessage + "\n", Color.Red); } } dt = (DataTable)dh.ExecuteSql("select ma_qty,ma_prodcode,pr_detail,ma_printnum from make left join product on ma_prodcode=pr_code left join (select count(1)ma_printnum,msl_makecode from makesnlist where msl_printstatus=-1 group by msl_makecode) on msl_makecode=ma_code where ma_code='" + ma_code.Text + "'", "select"); if (dt.Rows.Count > 0) { pr_code.Text = dt.Rows[0]["ma_prodcode"].ToString(); ma_qty.Text = dt.Rows[0]["ma_qty"].ToString(); ma_printcount.Text = dt.Rows[0]["ma_printnum"].ToString(); pr_detail.Text = dt.Rows[0]["pr_detail"].ToString(); } } private void pr_code_TextChanged(object sender, EventArgs e) { _dt = (DataTable)dh.ExecuteSql("select la_id,la_url,la_isdefault from label where la_prodcode='" + pr_code.Text + "' and la_templatetype='SN标签' and la_statuscode='AUDITED' order by la_isdefault", "select"); if (_dt.Rows.Count == 0) { _dt = (DataTable)dh.ExecuteSql("select la_id,la_url,la_isdefault from label where la_prodcode is null and la_templatetype='SN标签' and la_statuscode='AUDITED' and la_code='" + pr_useattach.Text + "' order by la_isdefault desc", "select"); } PrintLabel.DataSource = _dt; PrintLabel.DisplayMember = "la_url"; PrintLabel.ValueMember = "la_id"; } private void PrintByBatch_Click(object sender, EventArgs e) { string Prefix = ""; string Suffix = ""; //获取编码规则 if (!dh.CheckExist("make", "ma_code='" + ma_code.Text + "'")) { MessageBox.Show("工单号不存在"); return; } DataTable dt = (DataTable)dh.ExecuteSql("select '模块' pr_exbarcode,ma_qty,pr_prefix from make left join product on ma_prodcode=pr_code where ma_code='" + ma_code.Text + "'", "select"); string pr_exbarcode = ""; string ma_qty = ""; string pr_prefix=""; if (dt.Rows.Count > 0) { pr_exbarcode = dt.Rows[0]["pr_exbarcode"].ToString(); pr_prefix = dt.Rows[0]["pr_prefix"].ToString(); ma_qty = dt.Rows[0]["ma_qty"].ToString(); } if (pr_prefix == "") { MessageBox.Show("未维护前缀信息"); return; } if (dh.getRowCount("makesnlist", "msl_makecode='" + ma_code.Text + "'") + PrintNum.Value > int.Parse(ma_qty)) { MessageBox.Show("工单号" + ma_code.Text + "生产序列号超出工单数"); return; } DataTable Nr = (DataTable)dh.ExecuteSql("select nrd_detno,nrd_name,nrd_type,nrd_radix,nrd_sql,nrd_length from NoRuleDetail left join norule on nrd_nrid=nr_id where nr_code='" + pr_exbarcode + "' order by nrd_detno", "select"); //如果没有则取公共规则 if (Nr.Rows.Count == 0) Nr = (DataTable)dh.ExecuteSql("select nrd_detno,nrd_name,nrd_radix,nrd_type,nrd_sql,nrd_length from NoRuleDetail left join norule on nrd_nrid=nr_id where nr_code ='模块' order by nrd_detno", "select"); //用于过滤参数的正则表达式 Regex match = new Regex("{\\w+}"); //用于存放每一项的明细的数据 string[] NrData = new string[Nr.Rows.Count]; //流水号的索引 int SerialNumIndex = 0; //流水长度 int SerialNumLength = 0; //存放键值对 int Radix = 10; string PrefixFixed = ""; for (int m = 0; m < Nr.Rows.Count; m++) { switch (Nr.Rows[m]["nrd_type"].ToString()) { //常量直接进行拼接 case "常量": NrData[m] = Nr.Rows[m]["nrd_sql"].ToString(); Prefix += NrData[m]; Suffix += NrData[m]; break; case "SQL": string SQL = Nr.Rows[m]["nrd_sql"].ToString(); DataTable Temp; //如果不包含参数替换 if (SQL.IndexOf("{") == 0) { Temp = (DataTable)dh.ExecuteSql(SQL, "select"); } else { //替换参数后重新执行SQL foreach (Match mch in match.Matches(SQL)) { SQL = SQL.Replace(mch.Value.Trim(), "'" + ma_code.Text + "'"); } Temp = (DataTable)dh.ExecuteSql(SQL, "select"); } if (Temp.Rows.Count > 0) { NrData[m] = Temp.Rows[0][0].ToString(); Prefix += NrData[m]; Suffix += NrData[m]; } else { NrData[m] = ""; Prefix += NrData[m]; Suffix += NrData[m]; } break; //流水需要通过MaxNumber去取 case "流水": NrData[m] = dh.getFieldDataByCondition("RuleMaxNum", "rmn_maxnumber", "rmn_nrcode='" + pr_exbarcode + "'").ToString(); Suffix = ""; PrefixFixed = Prefix; //设置当前流水 custserialnum = int.Parse(NrData[m] == "" ? "0" : NrData[m]); SerialNumIndex = m; SerialNumLength = int.Parse(Nr.Rows[m]["nrd_length"].ToString()); Radix = int.Parse(Nr.Rows[m]["nrd_radix"].ToString()); break; default: break; } } //获取最大的流水号 string maxnum = dh.getFieldDataByCondition("RuleMaxNum", "rmn_maxnumber", "rmn_nrcode='" + pr_exbarcode + "' and rmn_prefix='" + Prefix + "'").ToString(); //如果流水号为空则插入一条新记录,从1开始取 if (maxnum == "") { dh.ExecuteSql("insert into RuleMaxNum(rmn_id,rmn_nrcode,rmn_prefix,rmn_maxnumber) values(RuleMaxNum_seq.nextval,'" + pr_exbarcode + "','" + Prefix + "','1')", "insert"); custserialnum = 1; } //如果流水号不为空则取当前流水 else { custserialnum = int.Parse(maxnum); } //遍历整个Grid,勾选的项目全部进行条码生成 ArrayList custbarcode = new ArrayList(); for (int i = 0; i < PrintNum.Value; i++) { string data = BarcodeMethod1(PrefixFixed, Suffix, SerialNumIndex, SerialNumLength, Radix); if (!custbarcode.Contains(data)) custbarcode.Add(data); } //插入条码 string sql = "insert into makesnlist(MSL_ID, MSL_INDATE, MSL_MAKECODE, MSL_SNCODE, MSL_TYPE,msl_status)" + "select makesnlist_seq.nextval,sysdate,'" + ma_code.Text + "',:custbarcode,'before',0 from dual where :custbarcode not in " + "(select msl_sncode from makesnlist)"; dh.BatchInsert(sql, new string[] { "custbarcode", "custbarcode" }, custbarcode.ToArray(), custbarcode.ToArray()); //更新最大流水号 dh.UpdateByCondition("RuleMaxNum", "rmn_maxnumber='" + custserialnum + "'", "rmn_nrcode='" + pr_exbarcode + "' and rmn_prefix='" + Prefix + "'"); MessageBox.Show("工单" + ma_code.Text + "生成SN清单成功"); } int custserialnum = 0; public string BarcodeMethod1(string Prefix, string Suffix, int Index, int Length, int radix) { string str = Prefix; //如果是流水则需要在前面加0 string serialcode = BaseUtil.DToAny(custserialnum, radix); for (int j = serialcode.ToString().Length; j < Length; j++) { serialcode = "0" + serialcode; } str += serialcode; str += Suffix; custserialnum = custserialnum + 1; return str; } private void normalButton1_Click(object sender, EventArgs e) { DataTable dt = (DataTable)dh.ExecuteSql("select * from makesnlist where msl_printbatch='" + PrintBatch.Text + "' order by msl_sncode", "select"); string ErrorMessage = ""; if (dt.Rows.Count > 0) { for (int i = 0; i < dt.Rows.Count; i++) { string mil_sncode = dt.Rows[i]["msl_sncode"].ToString(); if (Print.BarTender(Tag.ToString(), ref engine, PrintLabel.Text, PrintLabel.SelectedValue.ToString(), PrinterList.Text, mil_sncode, int.Parse("1"), ma_code.Text, pr_code.Text, "机身标", "0", out ErrorMessage)) { //提示用户打印成功 dh.ExecuteSql("update makeimeilist set mil_printstatus=-1 where mil_sncode='" + mil_sncode + "'", "update"); dh.ExecuteSql("update makesnlist set msl_printstatus=-1 where msl_sncode='" + mil_sncode + "'", "update"); OperateResult.AppendText(">>序列号:" + mil_sncode + "打印结束\n", Color.Green); } else { dh.ExecuteSql("update makeimeilist set mil_printstatus=-1 where mil_sncode='" + mil_sncode + "'", "update"); OperateResult.AppendText(">>" + ErrorMessage + "\n", Color.Red); } } } else { OperateResult.AppendText(">>批号:" + PrintBatch.Text + "不存在\n", Color.Green); } } } }