using System; using System.Data; using System.Text; using System.Windows.Forms; using UAS_MES.CustomControl.TextBoxWithIcon; using UAS_MES.DataOperate; using UAS_MES.Entity; using UAS_MES.PublicMethod; using System.Drawing; using System.Text.RegularExpressions; namespace UAS_MES.Make { public partial class Make_FeedingCollection : Form { //MakeSerial表主键 string ms_id; //制造单号 string make_code; //产品编号 string make_prodcode; //工序编号 string nextstepcode; //完工状态 string ms_status; //流程码 string ms_code; //工序名称 string stepname; //工艺路线编号 string ms_craftcode; //管控类型 string ErrorMessage; //用于提醒的序列B string[] RemainList = new string[0]; //提醒序列的索引 int RemainIndex = 0; DataHelper dh; LogStringBuilder sql = new LogStringBuilder(); DataTable dt; //保存ListB中的数据 DataTable dt1; AutoSizeFormClass asc = new AutoSizeFormClass(); public Make_FeedingCollection() { InitializeComponent(); } private void 上料采集_Load(object sender, EventArgs e) { dh = new DataHelper(); code.Focus(); asc.controllInitializeSize(this); //工单号放大镜配置 ma_code.TableName = "make left join product on ma_prodcode=pr_code"; ma_code.SelectField = "ma_code # 工单号,ma_prodcode # 产品编号,ma_qty # 工单数量,pr_detail # 产品名称"; ma_code.FormName = Name; ma_code.DBTitle = "工单查询"; ma_code.SetValueField = new string[] { "ma_code", "ma_prodcode", "ma_qty", "pr_detail" }; ma_code.Condition = "ma_statuscode='STARTED'"; } private void 上料采集_SizeChanged(object sender, EventArgs e) { asc.controlAutoSize(this); } private void Clean_Click(object sender, EventArgs e) { OperateResult.Clear(); } private void Confirm_Click(object sender, EventArgs e) { //模拟键盘事件 KeyEventArgs e2 = new KeyEventArgs(Keys.Enter); code_KeyDown(sender, e2); } private void code_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { //勾选的是上料的步骤 if (Loading.Checked) { //如果录入框和工单号均有输入 if (code.Text != "" && ma_code.Text != "" && sn_code.Text == "") { string ErrorMessage = ""; bool ifFirst; if (LogicHandler.CheckCurrentStepAndIfFirst(code.Text, ma_code.Text, User.UserSourceCode, Tag.ToString(), out ifFirst, out ErrorMessage)) { //如果当前工序是第一道工序 #region if (ifFirst) { //根据序列号查出ma_code,ma_prodcode,stepcode dt = (DataTable)dh.ExecuteSql("select ms_id,ms_makecode,ms_craftcode,ms_status,ms_nextstepcode,ms_prodcode,ms_code from makeserial where ms_sncode='" + code.Text + "'", "select"); if (dt.Rows.Count > 0) { ms_id = dt.Rows[0]["ms_id"].ToString(); make_code = dt.Rows[0]["ms_makecode"].ToString(); ms_craftcode = dt.Rows[0]["ms_craftcode"].ToString(); make_prodcode = dt.Rows[0]["ms_prodcode"].ToString(); nextstepcode = dt.Rows[0]["ms_nextstepcode"].ToString(); ms_status = dt.Rows[0]["ms_status"].ToString(); ms_code = dt.Rows[0]["ms_code"].ToString(); } //勾选了前一工单 if (iflastsn.Checked) { //判断序列号的前一工单是否已经完工 if (dt.Rows[0]["ms_makecode"].ToString() != ma_code.Text && dt.Rows[0]["ms_status"].ToString() == "2") { sql.Clear(); sql.Append("Insert into MakeSerial (ms_id, ms_code, ms_sncode ,ms_prodcode, ms_indate,ms_wccode,ms_craftcode,ms_craftname"); sql.Append(",ms_nextstepcode,ms_status,ms_makecode) select MAKESERIAL_SEQ.NEXTVAL,'" + code.Text + "','" + code.Text + "',"); sql.Append("ma_prodcode,sysdate,ma_wccode,ma_craftcode,ma_craftname,'" + User.CurrentStepCode + "',0,ma_code from make where ma_code='" + ma_code.Text + "'"); dh.ExecuteSql(sql.GetString(), "insert"); //查询 stepproduct 中是否有采集类型为其他序列号, 并且物料号等于ms_prodcode dt = (DataTable)dh.ExecuteSql("select sp_id from stepproduct where sp_mothercode='" + make_prodcode + "' and sp_stepcode='" + nextstepcode + "' and sp_soncode='" + make_prodcode + "'", "select"); string sp_id = dt.Rows[0]["sp_id"].ToString(); if (dt.Rows.Count > 0) { sql.Clear(); sql.Append("insert into Craftmaterial (cm_id, cm_makecode,cm_maid,cm_maprodcode,"); sql.Append("cm_soncode,cm_mscode,cm_sncode,cm_stepcode,cm_stepname,cm_craftcode,cm_craftname,"); sql.Append("cm_barcode,cm_inqty,cm_indate,cm_inman,cm_linecode,cm_wccode,cm_sourcecode,cm_spid) "); sql.Append("select Craftmaterial_seq.nextval, ma_code, ma_id, ma_prodcode, sp_soncode,"); sql.Append("'" + code.Text + "','" + code.Text + "',mcd_stepcode,mcd_stepname,ma_craftcode"); sql.Append(",ma_craftname,'" + code.Text + "',1,sysdate,'" + User.UserName + "',ma_linecode,ma_wccode,"); sql.Append("'" + User.UserSourceCode + "','" + sp_id + "' from make left join makecraftdetail on mcd_macode=ma_code"); sql.Append(" left join stepproduct on sp_stepcode=mcd_stepcode where ma_code = '" + make_code + "'and "); sql.Append("sp_id = " + sp_id + " and mcd_stepcode='" + nextstepcode + "'"); dh.ExecuteSql(sql.GetString(), "insert"); if (make_code == ma_code.Text && nextstepcode == "") { sn_code.Text = code.Text; sql.Clear(); sql.Append("select ma_code,ma_prodcode,pr_detail,ma_qty from makeserial left "); sql.Append("join product on ms_prodcode=pr_code left join make on ms_makecode=ma_code "); sql.Append("left join makecraftdetail on mcd_macode=ms_makecode where ms_sncode='" + sn_code.Text + "'"); dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select"); BaseUtil.SetFormValue(this.Controls, dt); //将录入框的值给序列号 OperateResult.AppendText(">>获取序列号" + code.Text + "成功\n", Color.Green); code.Text = ""; } else { OperateResult.AppendText(">>序列号无前段工单\n", Color.Red); } } } else if (make_code == ma_code.Text && nextstepcode == User.CurrentStepCode) { sn_code.Text = code.Text; OperateResult.AppendText(">>获取序列号" + code.Text + "成功\n", Color.Green); code.Text = ""; } } //未勾选上一工序 else { dt = (DataTable)dh.ExecuteSql("select ms_status,ms_stepcode,ms_nextstepcode from makeserial where ms_sncode='" + code.Text + "' and ms_makecode='" + ma_code.Text + "'", "select"); if (dt.Rows.Count == 0) { sql.Clear(); sql.Append("Insert into MakeSerial (ms_id, ms_code, ms_sncode ,ms_prodcode, ms_indate,ms_wccode,ms_craftcode,ms_craftname"); sql.Append(",ms_nextstepcode,ms_status,ms_makecode) select MAKESERIAL_SEQ.NEXTVAL,'" + code.Text + "','" + code.Text + "',"); sql.Append("ma_prodcode,sysdate,ma_wccode,ma_craftcode,ma_craftname,'" + User.CurrentStepCode + "',0,ma_code from make where ma_code='" + ma_code.Text + "'"); dh.ExecuteSql(sql.GetString(), "insert"); } else { nextstepcode = dt.Rows[0]["ms_nextstepcode"].ToString(); ms_status = dt.Rows[0]["ms_status"].ToString(); } //如果尚未开始工序或者已经在产线并且当前工序和人员负责工序一致 if ((ms_status == "0" || ms_status == "1") && nextstepcode == User.CurrentStepCode) { sn_code.Text = code.Text; sql.Clear(); sql.Append("select ma_code,ma_prodcode,pr_detail,ma_qty from makeserial left join product "); sql.Append(" on ms_prodcode=pr_code left join make on ms_makecode=ma_code left join "); sql.Append("makecraftdetail on mcd_macode=ms_makecode where ms_sncode='" + sn_code.Text + "'"); dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select"); BaseUtil.SetFormValue(this.Controls, dt); OperateResult.AppendText(">>获取序列号" + code.Text + "成功\n", Color.Green); GetCollectItem(); code.Text = ""; } else { OperateResult.AppendText(">>" + ErrorMessage + "\n", Color.Red); code.Text = ""; } } } #endregion //不是第一道工序 else { if (dh.CheckExist("makeserial", "ms_sncode='" + code.Text + "' and ms_status=1 and ms_nextstepcode='" + User.CurrentStepCode + "'")) { OperateResult.AppendText(">>获取序列号" + code.Text + "成功\n", Color.Green); sn_code.Text = code.Text; GetCollectItem(); code.Text = ""; } else { OperateResult.AppendText(">>序列号" + code.Text + "错误\n", Color.Red); } } } else { OperateResult.AppendText(">>" + ErrorMessage + "\n", Color.Red); code.Text = ""; } } //输入框有值但未选择工单号 else if (code.Text != "" && ma_code.Text == "" && sn_code.Text == "") { Console.WriteLine("fiugwabkrflbslvblebf"); GetCollectItem(); } //序列号不为空的时候 else if (sn_code.Text != "") { //索引超出长度表示内容均已提醒 if (RemainIndex >= RemainList.Length) { OperateResult.AppendText(">>当前序列号没有需要采集的内容,请采集其他序列号\n", Color.Red); sn_code.Text = ""; code.Text = ""; return; } string sp_soncode = dt1.Rows[RemainIndex]["sp_soncode"].ToString(); string sp_prefix = dt1.Rows[RemainIndex]["sp_prefix"].ToString(); string sp_ifuseregex = dt1.Rows[RemainIndex]["sp_ifuseregex"].ToString(); string sp_regex = dt1.Rows[RemainIndex]["sp_regex"].ToString(); string length = dt1.Rows[RemainIndex]["sp_length"].ToString(); string sp_id = dt1.Rows[RemainIndex]["sp_id"].ToString(); string sp_ifforsn = dt1.Rows[RemainIndex]["sp_ifforsn"].ToString(); string pr_tracekind = dt1.Rows[RemainIndex]["pr_tracekind"].ToString(); int sp_length = int.Parse(length != "" ? length : "0"); if (dt1.Rows[RemainIndex]["sp_type"].ToString() == "物料") { //序列号用作条码 if (sp_ifforsn != "0") { dt = (DataTable)dh.ExecuteSql("select count(1) from makeserial where ms_sncode='" + code.Text + "' and ms_status=2 and ms_prodcode='" + sp_soncode + "'", "select"); if (dt.Rows.Count > 0) { if (dh.getRowCount("craftmaterial", "cm_sncode='" + sn_code.Text + "' and cm_barcode='" + code.Text + "' and cm_soncode='" + sp_soncode + "'") > 0) { OperateResult.AppendText(">>条码已采集过\n", Color.Red); } else { Save_OtherCode(sp_soncode, make_code, sn_code.Text, sp_id); } } else { OperateResult.AppendText(">>序列号不存在\n", Color.Red); } } //单件管控物料 else if (pr_tracekind == "1") { dt = (DataTable)dh.ExecuteSql("select bar_prodcode,bar_code from barcode where bar_code='" + code.Text + "'", "select"); if (dt.Rows.Count > 0) { if (sp_soncode != dt.Rows[0]["bar_prodcode"].ToString()) { OperateResult.AppendText(">>用户条码号对应的物料不是:" + sp_soncode + "\n"); } else { dt = (DataTable)dh.ExecuteSql("select cm_id from craftmaterail where cm_soncode='" + sp_soncode + "' and cm_barcode='" + code.Text + "'", "select"); if (dt.Rows.Count > 0) { OperateResult.AppendText(">>条码已采集过\n", Color.Red); } else { Save_OtherCode(sp_soncode, make_code, sn_code.Text, sp_id); } } } else { OperateResult.AppendText(">>条码不存在\n", Color.Red); code.Text = ""; } } //不管控 else if (pr_tracekind == "0") { //进行前缀匹配 if (code.Text.Substring(0, sp_prefix.Length) == sp_prefix || sp_prefix == "") { //进行长度匹配 if (code.Text.Length == sp_length || sp_length == 0) { if (sp_ifuseregex != "0") { //进行正则表达式匹配 Regex re = new Regex(sp_regex); if (re.IsMatch(code.Text)) { Save_OtherCode(sp_soncode, make_code, sn_code.Text, sp_id); } else { OperateResult.AppendText(">>正则表达式不匹配\n", Color.Red); } } else { Save_OtherCode(sp_soncode, make_code, sn_code.Text, sp_id); } } else { OperateResult.AppendText(">>长度不匹配\n", Color.Red); } } else { OperateResult.AppendText(">>前缀不匹配\n", Color.Red); } } } else { //如果sp_type!='物料'的话 //Wifi和蓝牙公用一个字段 switch (dt1.Rows[RemainIndex]["sp_type"].ToString()) { case "MAC": dh.UpdateByCondition("makeserial", "ms_mac='" + code.Text + "'", "ms_id=" + ms_id); break; case "BT": dh.UpdateByCondition("makeserial", "ms_bt='" + code.Text + "'", "ms_id=" + ms_id); break; case "WIFI": dh.UpdateByCondition("makeserial", "ms_bt='" + code.Text + "'", "ms_id=" + ms_id); break; case "IMEI1": dh.UpdateByCondition("makeserial", "ms_imei1='" + code.Text + "'", "ms_id=" + ms_id); break; case "IMEI2": dh.UpdateByCondition("makeserial", "ms_imei2='" + code.Text + "'", "ms_id=" + ms_id); break; default: break; } Save_OtherCode(sp_soncode, make_code, sn_code.Text, sp_id); } } } //勾选了下料的时候 else if (UnLoading.Checked) { //序列号不为空的时候 if (sn_code.Text != "") { dt = (DataTable)dh.ExecuteSql("select cm_id,cm_stepcode,ms_makecode,cm_mccode from craftmaterial left join makeserial on cm_makecode=ms_makecode and cm_sncode=ms_sncode where ms_sncode='" + sn_code.Text + "' and cm_barcode='" + code.Text + "'", "select"); if (dt.Rows.Count > 0) { string cm_id = dt.Rows[0]["cm_id"].ToString(); string ms_macode = dt.Rows[0]["ms_makecode"].ToString(); string cm_stepcode = dt.Rows[0]["cm_stepcode"].ToString(); string cm_mccode = dt.Rows[0]["cm_mccode"].ToString(); dh.ExecuteSql("delete from Craftmaterial where cm_id=" + cm_id, "delete"); LogicHandler.InsertMakeProcess(ms_macode, sn_code.Text, "下料成功", User.UserName); int count = dh.getRowCount("craftMaterial", "cm_mccode='" + cm_mccode + "' and cm_stepcode='" + cm_stepcode + "' and cm_sncode='" + sn_code.Text + "'"); if (count == 0) { dh.UpdateByCondition("makecraftdetail ", "mcd_inqty=mcd_inqty-1,mcd_outqty=mcd_outqty-1,mcd_okqty = mcd_okqty - 1", "mcd_mccode='" + cm_mccode + "' and mcd_stepcode='" + cm_stepcode + "'"); } OperateResult.AppendText(">>下料成功\n", Color.Green); code.Text = ""; } } //序列号为空的时候 else if (sn_code.Text == "") { dt = (DataTable)dh.ExecuteSql("select ms_status,ms_nextstepcode from ma keserial where ms_sncode='" + code.Text + "'", "select"); if (dt.Rows.Count > 0) { string ms_status = dt.Rows[0]["ms_status"].ToString(); string ms_nextstepcode = dt.Rows[0]["ms_nextstepcode"].ToString(); if (ms_status == "1" && ms_nextstepcode != User.CurrentStepCode) { OperateResult.AppendText(">>该序列号当前工序不是" + User.CurrentStepName + "\n", Color.Red); } else if (ms_status == "0" && ms_nextstepcode != User.CurrentStepCode) { OperateResult.AppendText(">>该序列号当前工序不是" + User.CurrentStepName + "\n", Color.Red); } else if (ms_status == "2" && ms_nextstepcode != User.CurrentStepCode) { OperateResult.AppendText(">>该序列号已经包装\n", Color.Red); } else { dt = (DataTable)dh.ExecuteSql("select cm_id from craftmaterial where cm_sncode='" + sn_code.Text + "'", "select"); if (dt.Rows.Count > 0) { OperateResult.AppendText(">>请采集需要下料的序列号\n", Color.Green); sn_code.Text = code.Text; } else { OperateResult.AppendText(">>该序列号未上料,无需下料\n", Color.Red); } } } code.Text = ""; } } } } //获取采集的项目 private void GetCollectItem() { //将录入框的值给序列号 sql.Clear(); sql.Append("select ma_prodcode,ma_qty,ma_code,pr_detail,ms_status,ms_id,ms_craftcode,ms_nextstepcode"); sql.Append(",ms_prodcode,ms_makecode,ms_code,ms_stepname from makeserial left join make on ma_code=ms_makecode "); sql.Append("left join product on ms_prodcode=pr_code where ms_sncode='" + code.Text + "'"); dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select"); if (dt.Rows.Count > 0) { ms_id = dt.Rows[0]["ms_id"].ToString(); ms_craftcode = dt.Rows[0]["ms_craftcode"].ToString(); make_code = dt.Rows[0]["ma_code"].ToString(); make_prodcode = dt.Rows[0]["ms_prodcode"].ToString(); nextstepcode = dt.Rows[0]["ms_nextstepcode"].ToString(); ms_code = dt.Rows[0]["ms_code"].ToString(); ms_status = dt.Rows[0]["ms_status"].ToString(); stepname = dt.Rows[0]["ms_stepname"].ToString(); BaseUtil.SetFormValue(this.Controls, dt); bool ifFirst; if (LogicHandler.CheckCurrentStepAndIfFirst(code.Text, ma_code.Text, User.UserSourceCode, Tag.ToString(), out ifFirst, out ErrorMessage)) { //ms_status==1表示正在生产中,ms_status==2表示已完工 //并且当前的执行步骤和用户的岗位工序一致 if ((ms_status == "1" && nextstepcode == User.CurrentStepCode) || ms_status == "0") { //单独用一个DataTable存储一个 dt1 = new DataTable(); sql.Clear(); sql.Append("select sp_id,sp_prefix,sp_ifuseregex,sp_ifforsn,sp_length,sp_description,sp_soncode,pr_tracekind,pr_detail,pr_spec,sp_repcode,pr_id,"); sql.Append("sp_type,case when (sp_type='物料' and sp_soncode=pr_code) then '已采集' else '未采集' end sp_ifpick ,sp_prefix,"); sql.Append("sp_length,sp_regex,sp_ifforsn from stepproduct left join product on pr_code=sp_soncode where "); sql.Append("sp_craftcode='" + ms_craftcode + "' and sp_stepcode='" + User.CurrentStepCode + "' And sp_mothercode ='" + make_prodcode + "' "); sql.Append("and((sp_type = '物料' and( pr_tracekind <> 2 or pr_tracekind is null))or sp_type <> '物料') order by SP_DETNO asc"); dt1 = (DataTable)dh.ExecuteSql(sql.GetString(), "select"); sn_code.Text = code.Text; code.Clear(); //用于记录提醒的数据长度 RemainList = new string[dt1.Rows.Count]; for (int i = 0; i < dt1.Rows.Count; i++) { RemainList[i] = dt1.Rows[i]["sp_soncode"].ToString(); } //A序列不存在需要提醒的内容则直接判断B的 if (dt1.Rows.Count > 0) { OperateResult.AppendText("<<请采集" + dt1.Rows[0]["sp_soncode"].ToString() + "的" + dt1.Rows[0]["sp_type"].ToString() + "数据\n", Color.Green); } else { OperateResult.AppendText(">>当前序列号没有需要采集的内容,请采集其他序列号\n", Color.Red); code.Text = ""; sn_code.Text = ""; } } else { OperateResult.AppendText(">>当前工单不在线或者岗位资源不对应\n", Color.Red); code.Text = ""; } } else { OperateResult.AppendText(">>" + ErrorMessage + "\n", Color.Red); code.Text = ""; } } else { OperateResult.AppendText(">>序列号" + code.Text + "不存在\n", Color.Red); code.Text = ""; } } //此类中通用的保存逻辑 private void Save_OtherCode(string sp_soncode, string ma_code, string ms_sncode, string sp_id) { if (LogicHandler.SetMaterialUp(ms_sncode, make_code, code.Text, sp_soncode, User.UserSourceCode, User.UserName, sp_id, out ErrorMessage)) { //采集成功提示 RemainIndex = RemainIndex + 1; OperateResult.SelectionColor = Color.Green; OperateResult.AppendText(">>采集成功\n"); code.Clear(); //如果+1后不小于B序列的长度,则已采集完成,不需要进行提示了 if (RemainIndex < RemainList.Length) { OperateResult.AppendText("<<请采集" + RemainList[RemainIndex] + "的" + dt1.Rows[RemainIndex]["sp_type"].ToString() + "数据\n", Color.Green); } else { //上料采集成功,设置序列号栏目为空 RemainIndex = 0; OperateResult.AppendText(">>上料采集完成!\n", Color.Green); if (LogicHandler.UpdateMakeMessage(sn_code.Text, ma_code, User.UserSourceCode, User.UserName, "上料成功", out ErrorMessage)) { sn_code.Text = ""; if (待采集数.Text == "0") { BaseUtil.CleanForm(this); } //刷新数据 EventArgs e = new EventArgs(); object sender = null; ma_code_UserControlTextChanged(sender, e); } else { OperateResult.AppendText(">>" + ErrorMessage + "\n"); code.Text = ""; } } } else { OperateResult.AppendText(">>" + ErrorMessage + "\n", Color.Red); code.Text = ""; } } private void ClearSn_code_Click(object sender, EventArgs e) { sn_code.Clear(); } private void CleanMa_code_Click(object sender, EventArgs e) { ma_code.Text = ""; } private void ma_code_UserControlTextChanged(object sender, EventArgs e) { sql.Clear(); sql.Append("select mcd_inqty,ma_qty-mcd_inqty 待采集数 "); sql.Append("from make left join makecraftdetail "); sql.Append("on mcd_macode=ma_code where ma_code='" + ma_code.Text + "' and mcd_stepcode='" + User.CurrentStepCode + "'"); dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select"); if (dt.Rows.Count > 0) { BaseUtil.SetFormValue(Controls, dt); } } } }