using NPOI.SS.Util; using System; using System.Collections.Generic; using System.Data; using System.Text; using System.Windows.Forms; using 优软MES.DataOperate; using 优软MES.PublicMethod; namespace 优软MES { public partial class Batch_Generation_CodeDetail : Form { DataHelper dh = new DataHelper(); DataTable dt = new DataTable(); //string caller = "ProdInOut!BarcodeIn"; string PD_ID; string PI_ID; string[] field = { "pd_inoutno","pd_pdno","pd_prodcode","pr_detail","pr_unit","pd_inqty", "pr_tracekind" ,"pi_cardcode","pi_title", "pd_inqty-nvl(pd_barcodeinqty,0)" , "pr_zxbzs","pr_unit" }; string table = "prodiodetail left join product on pr_code=pd_prodcode left join prodinout on pi_id=pd_piid"; //明细行需要隐藏的字段 string[] hiddenfield = {"bi_pdid","bi_pdaget"}; string[] EditAbleField = {"bi_location","bi_madedate", "bi_vendbarcode","bi_inqty" }; public Batch_Generation_CodeDetail() { InitializeComponent(); } public Batch_Generation_CodeDetail(string pd_id) { if (pd_id != null && pd_id != "") { InitializeComponent(); //设置只能输入数字的TextBox的委托事件 NumOnly(); PD_ID = pd_id; //初始的时候设置timepicker为空 bi_madedate.Format = DateTimePickerFormat.Custom; bi_madedate.CustomFormat = " "; string sql = BaseUtil.AddField(field); sql = "select " + sql + " from "+table+" where pd_id=" + pd_id; dt = (DataTable)dh.ExecuteSql(sql, "select"); //加载数据 LoadData(); //通过控件名称和列的描述相同时赋值,由于表格上部分的控件是装在一个panel里面的,所以需要通过controls[0]从panel中获取 BaseUtil.SetFormValue(Controls["Panel0"].Controls, dt); //从configs表中取数据 string Data = dh.GetConfig("UseLocationOrNot", "BarCodeSetting").ToString(); //如果配置的数据为1或者Y,说明启用这个配置 if (Data == "1" || Data == "Y") { bi_location.Visible = true; bi_location_label.Visible = true; } BaseUtil.HideField(dataGridView1, hiddenfield); BaseUtil.SetDataGridViewReadOnly(dataGridView1,EditAbleField); //手动转换批总量 ValueTransform(); } } private void dateTimePicker1_ValueChanged(object sender, System.EventArgs e) { bi_madedate.Format = DateTimePickerFormat.Long; } private void bi_prodate_ValueChanged(object sender, EventArgs e) { bi_madedate.Format = DateTimePickerFormat.Long; } private void GenerateCode_Click(object sender, EventArgs e) { //检查生成条码之前的逻辑 CheckBeforeGenCode(); //计算打包的数量num表示包数 //restqty表示不足整包之后的数量,单独作为一个包 int num = int.Parse(pd_qty.Text) / int.Parse(pr_zxbzs.Text); int restqty = int.Parse(pd_qty.Text) - (num * int.Parse(pr_zxbzs.Text)); string ve_id = GetVendorID(PD_ID); string pr_code = dh.getFieldDataByCondition("prodiodetail", "pd_prodcode","pd_id="+PD_ID).ToString(); //如果用为未选择日期则将日期置为空,否则选择日期的值 string madedate = bi_madedate.Text; if (madedate.Trim() == "") { madedate = null; } else { madedate = bi_madedate.Value.ToString(); } //用于拼接SQl的StringBulider对象 StringBuilder sql = new StringBuilder(); //用于存放条码的数组 string[] barcode = new string[num]; for (int i = 0; i < num; i++) { barcode[i] = BarcodeMethod(pr_code, ve_id); } BaseUtil.CleanDataTable(dt); //通过pd_id查询出需要插入的数据 dt = dh.getFieldsDataByCondition("prodiodetail left join prodinout on pd_piid=pi_id", new string[] { "pd_pdno", "pi_class", "pd_prodmadedate", "pi_date", "pd_whcode", "pi_whcode" }, "pd_id=" + PD_ID); object pd_pdno = dt.Rows[0]["pd_pdno"]; object pi_class = dt.Rows[0]["pi_class"]; object pi_date = dt.Rows[0]["pi_date"]; object pd_prodmadedate = dt.Rows[0]["pd_prodmadedate"]; object pi_whcode = dt.Rows[0]["pi_whcode"]; object pd_whcode = dt.Rows[0]["pd_whcode"]; sql.Append("insert into barcodeio ("); sql.Append("bi_id,bi_piid,bi_pdid,bi_pdno,bi_inoutno,bi_piclass,bi_barcode,bi_prodcode,bi_whcode,bi_inqty,"); sql.Append("bi_madedate,bi_vendbarcode,bi_location,bi_status,bi_printstatus)"); sql.Append(" values (barcodeio_seq.nextval," + PI_ID + "," + PD_ID + ",'" + pd_pdno + "','" + pd_inoutno.Text + "','" + pi_class + "',:barcode,'" + pd_prodcode.Text + "',nvl('" + pd_whcode + "','" + pi_whcode + "'),'"); sql.Append(pr_zxbzs.Text + "',nvl( to_date('" + madedate + "', 'YYYY-MM-DD HH24:MI:SS'),to_date('" + pd_prodmadedate + "', 'YYYY-MM-DD HH24:MI:SS')),'" + bi_vendbarcode.Text + "','仓位', 0, 0)"); if (num > 0) { dh.BatchInsert(sql.ToString(),new string[] {"barcode"},barcode); } //有余数的话单独生成一条 if (restqty != 0) { dh.BatchInsert(sql.ToString(), new string[] { "barcode" },new string[] { BarcodeMethod(pr_code, ve_id) } ); } MessageBox.Show("生成条码成功"); LoadData(); } private static string lpad(int length, string number) { while (number.Length < length) { number = "0" + number; } number = number.Substring(number.Length - length,length); return number; } //生成条码的方法 public static string BarcodeMethod(string pr_code, string ve_id) { StringBuilder code = new StringBuilder(); DataTable dt1 = new DataTable(); DataHelper dh = new DataHelper(); string date = "0"; dt1 =(DataTable) dh.ExecuteSql("select pr_id,pr_tracekind,pr_exbarcode from product where pr_code='"+pr_code+"'","select"); if (dt1.Rows.Count > 0) { if (dt1.Rows[0]["pr_tracekind"].ToString() != "") { if (int.Parse(dt1.Rows[0]["pr_tracekind"].ToString()) == 2) { //批量管控 string pr_id = dt1.Rows[0]["pr_id"].ToString(); //清掉dt1的数据和结构 BaseUtil.CleanDataTable(dt1); string[] field = { "bs_lenprid", "bs_datestr", "bs_lennum", "bs_maxnum", "bs_maxdate", "bs_lenveid" }; dt1 = dh.getFieldsDataByCondition("barcodeSet", field, "bs_type='BATCH'"); code.Append(lpad(int.Parse(dt1.Rows[0][0].ToString()), pr_id)); code.Append(lpad(int.Parse(dt1.Rows[0][5].ToString()), ve_id)); if (dt1.Rows[0][1].Equals("YYMMDD")) { SimpleDateFormat YMD = new SimpleDateFormat("yyMMdd"); date = YMD.Format(new DateTime()); } else if (dt1.Rows[0][1].Equals("YYMM")) { SimpleDateFormat YM = new SimpleDateFormat("yyMM"); date = YM.Format(new DateTime()); } else if (dt1.Rows[0][1].Equals("MMDD")) { SimpleDateFormat MD = new SimpleDateFormat("MMdd"); date = MD.Format(new DateTime()); } code.Append(date); dh.UpdateByCondition("barcodeSet", "bs_maxdate='" + date + "'", "bs_type='BATCH'"); if (!("").Equals(dt1.Rows[0][4]) && null != dt1.Rows[0][4] && (!date.Equals("0")) && (int.Parse(dt1.Rows[0][4].ToString()) > int.Parse(date))) { code.Append(lpad(int.Parse(dt1.Rows[0][2].ToString()), "1"));// 流水重新开始 dh.UpdateByCondition("barcodeSet", "bs_maxnum=2", "bs_type='BATCH'"); } else { code.Append(lpad(int.Parse(dt1.Rows[0][2].ToString()), dt1.Rows[0][3].ToString()));// 当前流水号 dh.UpdateByCondition("barcodeSet", "bs_maxnum=bs_maxnum+1", "bs_type='BATCH'");// 流水号增加1 } } else { BaseUtil.ShowError("管控类型错误!"); } } } return code.ToString(); } public static string outboxMethod(string pr_id, string kind) { StringBuilder code = new StringBuilder(); DataHelper dh = new DataHelper(); object pr_kind= dh.getFieldDataByCondition("product", "pr_tracekind", "pr_id=" + pr_id ); if (pr_kind.ToString()!="") { if ((kind.Equals("1") && pr_kind.ToString() == "1") || (kind.Equals("2") && pr_kind.ToString() == "2")) {// 单间管控或者批管控 DataTable dt= dh.getFieldsDataByCondition("barcodeSet",new string[] { "bs_id ,bs_lenprid,bs_lennum,bs_maxnum" } ,"bs_type='PACK'"); if (dt.Rows.Count>0) { code.Append(lpad(int.Parse(dt.Rows[0]["bs_lenprid"].ToString()), pr_id));// PR_ID物料ID的长度 code.Append(lpad(int.Parse(dt.Rows[0]["bs_lennum"].ToString()),dt.Rows[0]["bs_maxnum"].ToString()));// 当前流水号 dh.UpdateByCondition("barcodeSet", "bs_maxnum=bs_maxnum+1", "bs_type='PACK' and bs_id=" + dt.Rows[0]["bs_id"]);// 流水号增加1 } else { BaseUtil.ShowError("未定义包装箱号产生规则或规则为审核"); } } else { BaseUtil.ShowError("管控类型错误!"); } } return code.ToString(); } private void PrintCode_Click(object sender, EventArgs e) { } private void PrintAllBoxNum_Click(object sender, EventArgs e) { } private void deleteDetailButton1_Click(object sender, EventArgs e) { } private void saveButton1_Click(object sender, EventArgs e) { DataTable dt = (DataTable)dataGridView1.DataSource; dh.UpDateTableByCondition(dt.GetChanges(), "barcodeio", "bi_id"); } private void deleteDetailButton1_Click_1(object sender, EventArgs e) { //新建一个和grid长度一样的数组 string pd_status = dh.getFieldDataByCondition("prodiodetail", "pd_status", "pd_id=" +PD_ID).ToString(); if (pd_status=="99") { BaseUtil.ShowError("单据已过账,不允许删除明细"); } string[] deleteID = new string[dataGridView1.Rows.Count]; foreach (DataGridViewRow dgvc in dataGridView1.Rows) { deleteID[dataGridView1.Rows.IndexOf(dgvc)] = dgvc.Cells["ID"].Value.ToString(); } string bi_pdid=dh.getFieldDataByCondition("barcodeio", "bi_pdid", "bi_id=" + deleteID[0]).ToString(); //删除PackageDetail表信息 dh.ExecuteSql("delete from packagedetail where pd_outboxcode in (select bi_outboxcode from barcodeio where bi_pdid=" + bi_pdid + ")", "delete"); //删除Package表的信息 dh.ExecuteSql("delete from package where pa_outboxcode in (select bi_outboxcode from barcodeio where bi_pdid=" + bi_pdid + ")", "delete"); //删除BarcodeIO表信息 dh.DeleteDataByID("barcodeio", "bi_id", deleteID); MessageBox.Show("清除明细成功"); LoadData(); } /// /// 生成条码和箱号按钮 /// /// /// private void GenerateCodeAndBoxNum_Click(object sender, EventArgs e) { //调用生成条码的方法 CheckBeforeGenCode(); if (bi_boxnum.Text == "") { BaseUtil.ShowError("箱内总数必须填写"); } else { int rest = int.Parse(bi_boxnum.Text) % int.Parse(pr_zxbzs.Text); if (rest != 0) { BaseUtil.ShowError("箱内总是必须是最小包装量的整数倍"); } } string ve_id = GetVendorID(PD_ID); DataTable dt = dh.getFieldsDataByCondition("prodiodetail", new string[] { "pd_prodcode,pd_prodid" }, "pd_id=" + PD_ID); string pr_code = dt.Rows[0]["pd_prodcode"].ToString(); string pr_id = dt.Rows[0]["pd_prodid"].ToString(); //箱内件数 int numinpack = int.Parse(bi_boxnum.Text) / int.Parse(pr_zxbzs.Text); //装箱的数量和条码的数量 int packnum = int.Parse(pd_qty.Text) / int.Parse(bi_boxnum.Text); int codenum = int.Parse(pd_qty.Text) / int.Parse(pr_zxbzs.Text); //是否有剩余的最小包 int restcode = int.Parse(pd_qty.Text) -(codenum* int.Parse(pr_zxbzs.Text)) ; //是否有剩余的尾箱 int restpack = int.Parse(pd_qty.Text) -(packnum * int.Parse(bi_boxnum.Text)); //记录箱号的数组 //根据pd_id选出需要插入的数据 dt = dh.getFieldsDataByCondition("prodiodetail left join prodinout on pd_piid=pi_id", new string[] { "pd_pdno", "pi_class", "pd_prodmadedate", "pi_date", "pd_whcode", "pi_whcode" }, "pd_id=" + PD_ID); object pd_pdno = dt.Rows[0]["pd_pdno"]; object pi_class = dt.Rows[0]["pi_class"]; object pi_date = dt.Rows[0]["pi_date"]; object pd_prodmadedate = dt.Rows[0]["pd_prodmadedate"]; object pi_whcode = dt.Rows[0]["pi_whcode"]; object pd_whcode = dt.Rows[0]["pd_whcode"]; string madedate = bi_madedate.Text; if (madedate.Trim() == "") { madedate = null; } else { madedate = bi_madedate.Value.ToString(); } StringBuilder sql = new StringBuilder(); // //如果剩余的箱数量大于0,则箱号+1 if (restpack != 0) { packnum = packnum + 1; } string[] pa_id = new string[packnum]; string[] packNum = new string[packnum]; if (packnum > 0) { for (int i = 0; i < packnum; i++) { packNum[i] = outboxMethod(pr_id, "2"); //通过序列获取到ID pa_id[i] = dh.GetSEQ("PACKAGE_SEQ"); } sql.Append("insert into package ("); sql.Append("pa_id,pa_outboxcode,pa_prodcode, pa_packdate,pa_packageqty, pa_totalqty, pa_status, pa_indate)"); sql.Append("values (:pa_id,:packnum,'" + pr_code + "', sysdate," + numinpack + "," + bi_boxnum.Text + ",'0',nvl( to_date('" + madedate + "', 'YYYY-MM-DD HH24:MI:SS'),to_date('" + pd_prodmadedate + "', 'YYYY-MM-DD HH24:MI:SS')))"); dh.BatchInsert(sql.ToString(), new string[] { "pa_id", "packnum" }, pa_id, packNum); } sql.Clear(); //记录条码号的数组 //如果有余数则条码数量+1 if (restcode != 0){ codenum=codenum+1; } string[] codeNum = new string[codenum]; string[] bi_outboxid = new string[codenum]; string[] bi_outboxcode = new string[codenum]; if (codenum > 0){ for (int i = 0; i < codenum; i++) { codeNum[i] = BarcodeMethod(pr_code, ve_id); } //包装数-1*箱内数量,先处理整箱的 int k = 0; for (int i = 0; i < packnum-1; i++) { for (int j = 0; j < numinpack; j++) { bi_outboxid[k] = pa_id[i]; bi_outboxcode[k] = packNum[i]; k=k+1; } } //最后单独处理剩余的一箱的条码,不论整箱还是有零件都可以 //最后一箱的条码数量 int remain = codenum - k; for (int i = 0; i /// 通过pd_id获取供应商的ID /// /// /// public string GetVendorID(string pd_id) { DataHelper dh = new DataHelper(); string pi_id=dh.getFieldDataByCondition("prodiodetail", "pd_piid", "pd_id=" + pd_id).ToString() ; PI_ID = pi_id; object ve_id=dh.getFieldDataByCondition("Vendor left join ProdInOut on pi_cardcode=ve_code", "ve_id", "pi_id=" + pi_id); if (ve_id != null) { return ve_id.ToString(); } else { return "0"; } } private void ValueTransform() { switch (pr_tracekind.Text) { case "": pr_tracekind.Text = "不管控"; break; case "0": pr_tracekind.Text = "不管控"; break; case "1": pr_tracekind.Text = "单间管控"; break; case "2": pr_tracekind.Text = "批量管控"; break; } } private void CheckBeforeGenCode() { if (pr_tracekind.Text == "单件管控") { BaseUtil.ShowError("管控类型为单件管控时不允许生成条码"); } if (pd_qty.Text != "") { if (!(int.Parse(pd_qty.Text) > 0) || !(int.Parse(pr_zxbzs.Text) > 0)) { BaseUtil.ShowError("批总量,最小包装数必须大于0"); } if (int.Parse(pd_qty.Text) > int.Parse(pd_inqty.Text)) { BaseUtil.ShowError("批总量不允许大于来料总量!"); } } else { BaseUtil.ShowError("请填写批总量!"); } //判断是否已经入库,状态为99表示已经入库 if (dh.getFieldDataByCondition("prodiodetail", "pd_status", "pd_id=" + PD_ID).ToString().Equals("99")) { BaseUtil.ShowError("该批次已入库,不允许生成条码"); } object checknum = dh.getFieldDataByCondition("barcodeio", "sum(bi_inqty)", "bi_pdid=" + PD_ID); if (checknum != null && checknum.ToString() != "") { if (int.Parse(pd_qty.Text) > int.Parse(pd_inqty.Text) - int.Parse(checknum.ToString())) { BaseUtil.ShowError("批总量不能大于未生成条码数"); } } } private void LoadData() { dataGridView1.DataSource = dh.GetConfigureData("ProdInOut!BarcodeIn", "detailgrid", "bi_pdid=" + PD_ID); } private void NumOnly() { bi_boxnum.KeyPress += BaseUtil.NumOnly; pr_zxbzs.KeyPress += BaseUtil.NumOnly; pd_qty.KeyPress += BaseUtil.NumOnly; } } }