using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Diagnostics.Eventing.Reader;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using MESClassLibrary.BLL;
using MESClassLibrary.BLL.BasicInfo;
using MESClassLibrary.BLL.Injection;
using MESClassLibrary.BLL.Inspection;
using MESClassLibrary.BLL.Log;
using MESClassLibrary.BLL.Mistake247;
using MESClassLibrary.BLL.Weight;
using MESClassLibrary.DAL;
using MESClassLibrary.Model;
using OPCAutomation;
using System.IO;
using System.IO.Ports;
using System.Net.Mime;
using System.Net.NetworkInformation;
using gregn6Lib;
using MESClassLibrary;
using MESClassLibrary.EFModel;

namespace InjectionPC
{
    public partial class FrmMain2408 : Form
    {
        #region 变量

        private string strHostIP;
        private string strHostName;
        private OPCServer opcServer;
        private OPCGroups opcGroups;
        private OPCGroup opcGroup1;
        private OPCItems opcItems1;
        private OPCItem[] opcItemm1;
        private OPCGroup opcGroup2;
        private OPCItems opcItems2;
        private OPCItem[] opcItemm2;
        private string[] ItemIDs;
        object ItemValues;
        object Qualities;
        object TimeStamps;
        public bool Connected = false;
        private BasicBLL1 _basicBLL1 = new BasicBLL1();
        private UniqueBll _uniqueBll = new UniqueBll();
        private bool _isPrintPackage = true;
        private BarCodeBLL _barCodeBLL = new BarCodeBLL();
        private InjectionBoxBLL _injectionBoxBLL = new InjectionBoxBLL();
        //private DataTable  tb_Plastic = new DataTable();
        private string _currentStationID = string.Empty;
        private const string _leftType = "0"; //模具1
        private const string _rightType = "1";//模具2
        private DateTime _loginTime = DateTime.Now;
        private string _lastBoxNoL = string.Empty;
        private string _lastBoxNoR = string.Empty;
        private WmsBLL _wmsBll = new WmsBLL();
        private PLCMouldBLL _PLCbll = new PLCMouldBLL();
        private PLCBreakBLL _bbll = new PLCBreakBLL();
        bool _isLoad = false;
        //零件用的打印机编号  <零件号+工位ID,打印机编号>
        private Dictionary<string, string> _printNameDict = new Dictionary<string, string>();
        private PlasticBLL _plasticBLL = new PlasticBLL();
        private int _plcRate = 100; //500
        #endregion

        public FrmMain2408()
        {
            InitializeComponent();
            this.Size = new Size(1280, 920);

        }

        public string planID = "", productID = "", nextPlanID = "", nextproductID = "",aa="";
       // public string newPlanID = "";
        public static int ID = 0;
        DateTime lastTime = DateTime.Now;
        //public string Conn = ConfigurationManager.ConnectionStrings["SqlConnStringWeight"].ConnectionString;

        bool status = false;

        private static int InterVal_Seconds = 0;

        private void FrmMain_Load(object sender, EventArgs e)
        {
            try
            {
                _currentStationID = getStationID(Program.station);
                //tb_Plastic = GetPlastic();
                Control.CheckForIllegalCrossThreadCalls = false;
                //this.WindowState = FormWindowState.Maximized;
                Thread t = new Thread(new ThreadStart(TimeGo));
                t.Start();
                timer1.Interval = Program.interVal;
                timer1.Enabled=false;
                panel44.Visible = false;
                panel45.Visible = false;
                textBox4.Text = "";
                textBox3.Text = "";
                label6.Text = Program.station;          //工位
                label8.Text = Program.OperatorName;     //用户
                //InterVal_Seconds = GetSeconds(label6.Text);
                GetClass();
                comboBox1.Text = "A班";          //班次
                Program.cc = comboBox1.Text;
                initProduct();
                //textBox1.Text = Program.ProductDate.Substring(2, 2) + Program.ProductDate.Substring(5, 2) +
                //                Program.ProductDate.Substring(8, 2);     //批次
                textBox1.Text = GetBatch(true);
                string devRate = ConfigurationManager.AppSettings["DevRate"];
                if (!string.IsNullOrEmpty(devRate))
                {
                    int i = 0;
                    if (int.TryParse(devRate, out i) == true)
                    {
                        if (i > 0)
                        {
                            _plcRate = i;
                        }
                    }
                }


                initBarCode();
                label23.Enabled = false;
                label23.BackColor = System.Drawing.Color.Gray;




                DataTable plasticTable = GetPlastic();
                foreach(DataRow dr in plasticTable.Rows)
                {
                    string key = dr["PartNo"].ToString() + dr["StationID"].ToString();
                    if (_printNameDict.Keys.Contains(key) == false)
                    {
                        _printNameDict.Add(key, dr["PrinterNo"].ToString());
                    }
                }



               
                Ping p1 = new Ping();

                PingReply reply = p1.Send("10.60.101.60"); //发送主机名或Ip地址
                StringBuilder sbuilder;
                if (reply.Status == IPStatus.Success)
                {
                    status = true;
                    label2.BackColor = Color.LightGray;
                }
                else
                {
                    status = false;
                    label2.BackColor = Color.Red;
                }

               

                comboBox2.MouseWheel += new MouseEventHandler(comboBox2_MouseWheel);

                #region 获取当前生产信息

                initPlan();

                InitPackageInfo(true);
                #endregion



                #region 连接PLC 

                try
                {
                    if (CreateServer())
                    { 
                        if (ConnectServer(strHostIP, "Kepware.KEPServerEX.V6"))
                        { 
                            Connected = true;

                            #region 创建组

                            opcGroups = opcServer.OPCGroups;
                            opcGroup1 = opcGroups.Add("Mould");
                            SetGroupProperty(opcGroup1, _plcRate);
                            opcGroup2 = opcGroups.Add("Break");
                            SetGroupProperty(opcGroup2, _plcRate);

                            #endregion

                            #region 创建项

                            opcItems1 = opcGroup1.OPCItems;
                            opcItems1.DefaultIsActive = true;

                            //PLCMouldBLL PLCbll = new PLCMouldBLL();
                            //PLCBreakBLL bbll = new PLCBreakBLL();
                            DataTable PLCdt = _PLCbll.SearchMould(Program.station);
                            if (PLCdt != null && PLCdt.Rows.Count > 0)
                            {
                                opcItemm1 = new OPCItem[PLCdt.Rows.Count];
                                for (int i = 0; i < PLCdt.Rows.Count; i++)
                                {
                                    opcItemm1[i] = opcItems1.AddItem(PLCdt.Rows[i]["Address"].ToString(), i);
                                }
                            }
                            Thread.Sleep(200);

                            opcGroup1.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(opcGroup1_DataChange);

                            #endregion
                        }
                        else
                        {
                            MessageBox.Show("连接到OPC服务器失败!", "提示", MessageBoxButtons.OK);
                            Connected = false;
                            LogHelper.WriteLog("连接到OPC服务器失败!");
                            return;
                        }
                    }
                    else
                    {
                        MessageBox.Show("创建OPC服务失败!", "提示", MessageBoxButtons.OK);
                        Connected = false;
                        LogHelper.WriteLog("创建OPC服务失败!");
                        return;
                    }
                }
                catch(Exception ex)
                {
                    MessageBox.Show("创建OPC服务失败!", "提示", MessageBoxButtons.OK);
                    Connected = false;
                    LogHelper.WriteLog("创建OPC服务失败!");
                    LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                     
                    return;
                }
               

                #endregion
               
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
            }
            finally
            {
                _isLoad = true;
                _isShowHintL = true;
                comBoxSizeL.SelectedValueChanged += comBoxSizeL_SelectedValueChanged;
                comBoxSizeR.SelectedValueChanged += comBoxSizeR_SelectedValueChanged;
              
            }

        }

        private DataTable GetPlastic()
        { 
            return _plasticBLL.SearchAllInfo(_currentStationID);
        }

        List<string> _lastParts = new List<string>();
        private void initPlan()
        {
            try
            {
                InjectionPlanBLL bll = new InjectionPlanBLL();
                ProductBLL productBll = new ProductBLL();
                DataTable dt = bll.SearchInfoByName(Program.station);
                if (dt != null && dt.Rows.Count > 0)
                {
                    planID = dt.Rows[0]["InjectionPlanID"].ToString();
                    aa = dt.Rows[0]["PartNo"].ToString();
                    label17.Text = dt.Rows[0]["PlanCount"].ToString();
                    string actualTime = dt.Rows[0]["ActualTime"].ToString();
                    if (string.IsNullOrEmpty(actualTime))
                    {
                        InjectionPlanBLL ibll = new InjectionPlanBLL();
                        ibll.UpdatePlanStartTime(planID);
                    }
                    DataTable dt2 = bll.SearchQty(planID);
                    if (dt2 != null && dt2.Rows.Count > 0)
                    {
                        label27.Text = dt2.Rows[0]["ProductCount"].ToString();
                    }
                    else
                    {
                        label27.Text = "0";
                    }

                    string[] partNo = dt.Rows[0]["PartNo"].ToString().Split(',');

                    label12.Text = "当前生产计划为:";
                     
                    for (int i = 0; i < partNo.Length; i++)
                    {
                        DataTable sdt = productBll.SearchInfoByPartNo(partNo[i].ToString().Trim());
                        if (sdt != null && sdt.Rows.Count > 0)
                        {
                            label12.Text += "零件号" + partNo[i].ToString().Trim() + ",零件名称" + sdt.Rows[0]["ProductName"].ToString() + ";";
                        
                        
                        }
                       

                        if (!string.IsNullOrEmpty(partNo[i].ToString().Trim()))
                        {
                            if (_lastParts.Contains(partNo[i].ToString().Trim()) == false)
                            {
                                InitComboBoxSize(partNo[i].ToString().Trim(), i,"");
                                //string currentSize = string.Empty;
                                //List<string> list = GetProductBoxSize(partNo[i].ToString().Trim(), ref currentSize);

                                //if (i == 0)
                                //{
                                //    comBoxSizeL.DataSource = list;
                                //    comBoxSizeL.SelectedItem = currentSize;
                                //    _selectItemL = currentSize;
                                //    int j = 0;
                                //    int.TryParse(currentSize, out j);
                                //    if (j > 0)
                                //    {
                                //        lbNeedQtyL.Text = j.ToString();
                                //    }
                                //}
                                //else
                                //{
                                //    comBoxSizeR.DataSource = list;
                                //    comBoxSizeR.SelectedItem = currentSize;
                                //    _selectItemR = currentSize;
                                //    int j = 0;
                                //    int.TryParse(currentSize, out j);
                                //    if (j > 0)
                                //    {
                                //        lbNeedQtyR.Text = j.ToString();
                                //    }
                                //}
                            }
                        }
                        
                        if(_lastParts.Contains(partNo[i].ToString().Trim()) == false)
                        {
                            _lastParts.Add(partNo[i].ToString().Trim());
                        }
                    }
                }
                else
                {
                    label12.Text = "暂无生产计划";
                    label17.Text = "0";
                    label27.Text = "0";
                }

                if (Convert.ToDouble(label17.Text) < Convert.ToDouble(label27.Text))
                {
                    label27.BackColor = Color.Red;
                }
                else
                {
                    label27.BackColor = Color.DeepSkyBlue;
                }
                
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(),MethodBase.GetCurrentMethod());
            }
        }
        void InitComboBoxSize(string partCode,int mould,string fixedSize)
        {
            string currentSize = string.Empty;
            List<string> list = GetProductBoxSize(partCode, ref currentSize);
            if (!string.IsNullOrEmpty(fixedSize))
            {
                currentSize = fixedSize;
            }
            if (mould == 0)
            {
                _isShowHintL = false;
                comBoxSizeL.DataSource = list;
                comBoxSizeL.SelectedItem = currentSize;
                _selectItemL = currentSize;
                int j = 0;
                int.TryParse(currentSize, out j);
                if (j > 0)
                {
                    lbNeedQtyL.Text = j.ToString();
                }
            }
            else
            {
                _isShowHintR = false;
                comBoxSizeR.DataSource = list;
                comBoxSizeR.SelectedItem = currentSize;
                _selectItemR = currentSize;
                int j = 0;
                int.TryParse(currentSize, out j);
                if (j > 0)
                {
                    lbNeedQtyR.Text = j.ToString();
                }
            }
        }
        void comboBox2_MouseWheel(object sender, MouseEventArgs e)
        {
            HandledMouseEventArgs h = e as HandledMouseEventArgs;
            if (h != null)
            {
                h.Handled = true;
            }

        }

        void opcGroup1_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues,ref Array Qualities, ref Array TimeStamps)
        {
            try
            { 
                CheckPackageSelect(); 
                InjectionPlanBLL bll = new InjectionPlanBLL();
                BarCodeBLL brbll = new BarCodeBLL();
                BarCodeModel md = new BarCodeModel();
                ProductBLL productBll = new ProductBLL();
                PlasticBLL pbll= _plasticBLL;
                InjectionBoxBLL boxbll=new InjectionBoxBLL();
                InjectionBoxModel boxmd=new InjectionBoxModel();
                DataTable dt2 = null;
                string code = "", OneCode = "";
                string newcode = "", newcode1 = "", NewOneCode = "", NewOneCode1 = "";
                string IsPack = "", IsOne = "", QLevel="",IsPaint="",PartName="",IsSame="",IsSupply="";
                string ManufacturerName = "";
                string filename = "", printName = "", printBoxName="";
                int MaxCount = 0, CurrentCount = 0;

                if (status == false)
                {
                    MessageBox.Show("连接服务器失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
               
                for (int i = 1; i <= NumItems; i++)
                {
                    if (ItemValues == null)
                    {
                        _bbll.SavePlcReceive(Program.station, TransactionID, NumItems, "ItemValues= null ", planID, "2408");
                        continue;
                    }
                    if (ItemValues.Length == 0)
                    {
                        _bbll.SavePlcReceive(Program.station, TransactionID, NumItems, "ItemValues.Length ==0 ", planID, "2408");
                        continue;
                    }
                    //string val = ItemValues.GetValue(i)?.ToString();
                    //if (ItemValues.GetValue(i)?.ToString() != "True")
                    //{
                    //    _bbll.SavePlcReceive(Program.station, TransactionID, NumItems, "ItemValues.GetValue(i)= " + val, planID, "2408");
                    //}



                    if ((ItemValues!=null &&  ItemValues.GetValue(i)?.ToString() == "True") || IsTest ==true)
                    {
                        //LogSysBLL.AddInfo("true" + label6.Text, MethodBase.GetCurrentMethod());
                        GetClass();

                        #region 增加时间差判定

                        //DateTime lastTime = GetPrintTime(label6.Text);

                        //long ts = TimeDiff(lastTime, DateTime.Now);



                        TimeSpan span=DateTime.Now - lastTime;
                        if (span.TotalSeconds < Convert.ToDouble(ConfigurationManager.AppSettings["InterValT"])) 
                        {
                            return;
                        }


                        _bbll.SavePlcReceive(Program.station, TransactionID, NumItems, aa, planID, "2408");

                        #endregion

                        //comboBox1.Text = "A班";         //班次
                        //textBox1.Text = Program.ProductDate.Substring(2, 2) + Program.ProductDate.Substring(5, 2) +
                        //                Program.ProductDate.Substring(8, 2);     //批次
                        textBox1.Text = GetBatch(true);
                        #region 查找当前计划 
                        DataTable dt = bll.SearchInfoByName(Program.station);
                        if (dt != null && dt.Rows.Count > 0)
                        {
                           
                            if (aa != dt.Rows[0]["PartNo"].ToString())
                            { 
                                DialogResult result=MessageBox.Show("计划有变更,请确认!", "提示", MessageBoxButtons.OKCancel,
                                        MessageBoxIcon.Information);
                                if (result == DialogResult.OK)
                                {

                                    planID = dt.Rows[0]["InjectionPlanID"].ToString();
                                    string[] partNo = dt.Rows[0]["PartNo"].ToString().Split(',');
                                    //string[] stockNo = dt.Rows[0]["StockNo"].ToString().Split(',');
                                    string[] stockNo = new string[partNo.Length];
                                    string ProductNature = dt.Rows[0]["ProductNature"].ToString();
                                    aa = dt.Rows[0]["PartNo"].ToString();
                                   
                                    //ManufacturerName = dt.Rows[0]["ManufacturerName"].ToString();
                                    DataTable dtM = productBll.SearchInfoByPartNo(partNo[0]);
                                    if (dtM != null && dtM.Rows.Count > 0)
                                    {
                                        ManufacturerName = dtM.Rows[0]["ManufacturerName"].ToString();
                                    }

                                    #region 判断有几个零件号
                                    string mould = "0";
                                    for (int j = 0; j < partNo.Length; j++)
                                    {
                                        #region 根据零件号查找存货代码
                                        mould = j.ToString();
                                        DataTable sdt = productBll.SearchInfoByPartNo(partNo[j].ToString().Trim());
                                        if (sdt != null && sdt.Rows.Count > 0)
                                        {
                                            stockNo[j] = sdt.Rows[0]["StockNo"].ToString();
                                            IsSame = sdt.Rows[0]["IsSame"].ToString();
                                        }
                                        else
                                        {
                                            stockNo[j] = "";
                                        }

                                        #endregion

                                        #region 获取零件属性

                                        DataTable dtx = productBll.SearchInfoByPartNo(partNo[j].ToString().Trim());
                                        if (dtx != null && dtx.Rows.Count > 0)
                                        {
                                            QLevel = dtx.Rows[0]["QLevel"].ToString();
                                            IsOne = dtx.Rows[0]["IsPrintOneTag"].ToString();
                                            IsPack = dtx.Rows[0]["IsPrintPackList"].ToString();
                                            IsPaint = dtx.Rows[0]["IsPlating"].ToString();
                                            PartName = dtx.Rows[0]["ProductName"].ToString();
                                            IsSupply = dtx.Rows[0]["IsSupply"].ToString();
                                        }

                                        #endregion

                                        if (IsSame == "1")//一模两压相同的
                                        {
                                            for (int k = 0; k < 2; k++)
                                            {
                                                #region 非直供件打印

                                                if (IsSupply != "1")
                                                {
                                                    if (ManufacturerName.Contains("蔚来"))
                                                    {
                                                        GetSjBarCode(stockNo[j].ToString().Trim(), partNo[j].ToString().Trim(),true, mould, PartName, NumItems+"_551" , ref NewOneCode, ref newcode);
                                                    }
                                                    else
                                                    {
                                                        GetSjBarCode(stockNo[j].ToString().Trim(), partNo[j].ToString().Trim(), true, mould, PartName, NumItems + "_584", ref NewOneCode, ref newcode);
                                                    }
                                                }

                                                #endregion

                                                #region 直供件打印

                                                if (IsSupply == "1")
                                                {
                                                    GetSupplyCode(stockNo[j].ToString().Trim(), partNo[j].ToString().Trim(), QLevel, true, mould, PartName, ref NewOneCode, ref newcode);
                                                }

                                                #endregion

                                                #region 插入数据tb_barCode

                                                md.ID = Guid.NewGuid().ToString();
                                                md.StationID = dt.Rows[0]["StationID"].ToString();
                                                md.OneBarCode = NewOneCode;
                                                md.BarCode = newcode;
                                                md.StockNo = stockNo[j].ToString().Trim();
                                                md.PartNo = partNo[j].ToString().Trim();
                                                md.PrintType = 0;
                                                md.PlanID = planID;
                                                md.ProductNature = ProductNature;
                                                md.Des1 = PartName;
                                              
                                                string errMsg = string.Empty;
                                                bool saveRst = SaveInfo(md, true, mould, false, ref errMsg);
                                                if (saveRst == false)
                                                {
                                                    LogErrBLL.AddInfo($"自动打印[{partNo[j].ToString()}],条码" + md.OneBarCode + "报错:"+ errMsg, MethodBase.GetCurrentMethod());
                                                    //MessageBox.Show("条码" + md.OneBarCode + "存储时发生错误,原因:" + errMsg);
                                                    //return;
                                                }


                                                #endregion

                                                #region 打印条码,判断是否打印单个条码

                                                #region 打印单个标签

                                                if (IsOne == "1")
                                                {
                                                    if (IsSupply != "1")
                                                    {
                                                        filename = ManufacturerName.Contains("蔚来")
                                                            ? System.AppDomain.CurrentDomain.BaseDirectory +
                                                              "wl.grf"
                                                            : System.AppDomain.CurrentDomain.BaseDirectory +
                                                              PrintMoudleName("0","Print"+Program.station+"_679"); //new
                                                    }
                                                    else
                                                    {
                                                        filename = System.AppDomain.CurrentDomain.BaseDirectory +
                                                                   PrintMoudleName("1", "Print" + Program.station + "_684");
                                                    }

                                                    printName = "Printer" +_printNameDict[partNo[j].ToString().Trim()+ dt.Rows[0]["StationID"].ToString()];

                                                    string reportName = ConfigurationManager.AppSettings[printName]
                                                        .ToString();

                                                    DataTable headTable = GetPrintHeadTable(partNo[j].ToString().Trim(), PartName, NewOneCode, newcode);

                                                    //ReportHelper rp = new ReportHelper(filename, headTable, null,
                                                    //    (int) GRPaperOrientation.grpoDefault, 1, reportName);

                                                    ReportHelper rp = new ReportHelper(filename, headTable, null,
                                                        (int)GRPaperOrientation.grpoPortrait, 1, reportName);

                                                    LogSysBLL.AddInfo(
                                                        GetDateTime().ToString("yyyy/MM/dd HH:mm:ss") + NewOneCode,
                                                        MethodBase.GetCurrentMethod());
                                                    rp.Report.Print(false);

                                                }

                                                #endregion

                                                #endregion

                                                initBarCode();
                                            }
                                        }
                                        else//一模两压不同的
                                        {
                                            if (IsSupply != "1")
                                            {
                                                #region 非直供件

                                                if (ManufacturerName.Contains("蔚来"))
                                                {

                                                    GetSjBarCode(stockNo[j].ToString().Trim(), partNo[j].ToString().Trim(), true, mould, PartName, NumItems + "_743", ref NewOneCode, ref newcode);
                                                }
                                                else
                                                {
                                                    GetSjBarCode(stockNo[j].ToString().Trim(), partNo[j].ToString().Trim(), true, mould, PartName, NumItems + "_555", ref NewOneCode, ref newcode);
                                                }

                                                #endregion
                                            }
                                            else
                                            {
                                                #region 直供件

                                                GetSupplyCode(stockNo[j].ToString().Trim(), partNo[j].ToString().Trim(), QLevel, true, mould, PartName, ref NewOneCode, ref newcode);
                                                #endregion
                                            }

                                            #region 插入数据tb_barCode

                                            md.ID = Guid.NewGuid().ToString();
                                            md.StationID = dt.Rows[0]["StationID"].ToString();
                                            md.OneBarCode = NewOneCode;
                                            md.BarCode = newcode;
                                            md.StockNo = stockNo[j].ToString().Trim();
                                            md.PartNo = partNo[j].ToString().Trim();
                                            md.PrintType = 0;
                                            md.PlanID = planID;
                                            md.ProductNature = ProductNature;
                                            md.Des1 = PartName;
                                            DataTable pdt = productBll.SearchIsImportByPartNo(partNo[j].ToString());
                                            if (pdt != null && pdt.Rows.Count > 0)
                                            {
                                                if (pdt.Rows[0]["isImport"].ToString() == "1")
                                                {
                                                    md.Import = "国产料Kingfa";
                                                }
                                                else
                                                {
                                                    md.Import = "";
                                                }
                                            }

                                            string errMsg = string.Empty;
                                            bool saveRst = SaveInfo(md, true, mould, false, ref errMsg);
                                            if (saveRst == false)
                                            {
                                                LogErrBLL.AddInfo($"自动打印[{partNo[j].ToString()}],条码" + md.OneBarCode + "报错:" + errMsg, MethodBase.GetCurrentMethod());

                                                //MessageBox.Show("条码" + md.OneBarCode + "存储时发生错误,原因:" + errMsg);
                                                //return;
                                            }
                                            #endregion

                                            #region 打印条码,判断是否打印单个条码

                                            DataTable dt3 = productBll.SearchInfoByPartNo(partNo[j].ToString().Trim());
                                            if (dt3 != null && dt3.Rows.Count > 0)
                                            {
                                                QLevel = dt3.Rows[0]["QLevel"].ToString();
                                                IsOne = dt3.Rows[0]["IsPrintOneTag"].ToString();
                                                IsPack = dt3.Rows[0]["IsPrintPackList"].ToString();
                                                IsPaint = dt3.Rows[0]["IsPlating"].ToString();
                                                PartName = dt3.Rows[0]["ProductName"].ToString();
                                                //MaxCount = Convert.ToInt32(dt3.Rows[0]["PackCount"].ToString());
                                                IsSame = dt3.Rows[0]["IsSame"].ToString();
                                                IsSupply = dt3.Rows[0]["IsSupply"].ToString();
                                            }
                                            
                                            #region 打印单个标签

                                            if (IsOne == "1")
                                            {
                                                if (IsSupply != "1")
                                                {
                                                    filename = ManufacturerName.Contains("蔚来")
                                                        ? System.AppDomain.CurrentDomain.BaseDirectory +
                                                          "wl.grf"
                                                        : System.AppDomain.CurrentDomain.BaseDirectory +
                                                          PrintMoudleName("0", "Print" + Program.station + "_882"); //new
                                                    if (partNo[j].Contains("A2146982300") ||
                                                        partNo[j].Contains("A2146982400"))
                                                    {
                                                        filename = AppDomain.CurrentDomain.BaseDirectory +
                                                                   PrintMoudleName("0", "Print" + Program.station + "_887");
                                                    }
                                                }
                                                else
                                                {
                                                    filename = System.AppDomain.CurrentDomain.BaseDirectory +
                                                               PrintMoudleName("1", "Print" + Program.station + "_893");
                                                }


                                                //DataTable dt4 = pbll.SearchInfo(partNo[j].ToString().Trim(),
                                                //    dt.Rows[0]["StationID"].ToString());
                                                //if (dt4 != null && dt4.Rows.Count > 0)
                                                //{
                                                //    printName = "Printer" + dt4.Rows[0]["PrinterNo"].ToString();
                                                //}
                                                printName = "Printer" + _printNameDict[partNo[j].ToString().Trim() + dt.Rows[0]["StationID"].ToString()];

                                                string reportName = ConfigurationManager.AppSettings[printName]
                                                    .ToString();
                                                DataTable headTable = GetPrintHeadTable(partNo[j].ToString().Trim(), PartName, NewOneCode, newcode);


                                                ReportHelper rp = new ReportHelper(filename, headTable, null,
                                                    (int) GRPaperOrientation.grpoPortrait, 1, reportName);
                                                LogSysBLL.AddInfo(
                                                    GetDateTime().ToString("yyyy/MM/dd HH:mm:ss") + NewOneCode,
                                                    MethodBase.GetCurrentMethod());
                                                rp.Report.Print(false);
                                                
                                            }

                                            #endregion

                                            #endregion

                                            initBarCode();
                                        }
                                    }

                                    #endregion
                                }
                                else
                                {
                                    return;
                                }
                            }
                            else
                            {
                                planID = dt.Rows[0]["InjectionPlanID"].ToString();
                                string[] partNo = dt.Rows[0]["PartNo"].ToString().Split(',');
                                //string[] stockNo = dt.Rows[0]["StockNo"].ToString().Split(',');
                                string[] stockNo = new string[partNo.Length];
                                string ProductNature = dt.Rows[0]["ProductNature"].ToString();
                                //ManufacturerName = dt.Rows[0]["ManufacturerName"].ToString();
                                DataTable dtM = productBll.SearchInfoByPartNo(partNo[0]);
                                if (dtM != null && dtM.Rows.Count > 0)
                                {
                                    ManufacturerName = dtM.Rows[0]["ManufacturerName"].ToString();
                                }
                                #region 判断有几个零件号
                                string mould = "0";
                                for (int j = 0; j < partNo.Length; j++)
                                {
                                    try
                                    {
                                        #region 根据零件号查找存货代码
                                        mould = j.ToString();
                                        DataTable sdt = productBll.SearchInfoByPartNo(partNo[j].ToString().Trim());
                                        if (sdt != null && sdt.Rows.Count > 0)
                                        {
                                            stockNo[j] = sdt.Rows[0]["StockNo"].ToString();
                                            IsSame = sdt.Rows[0]["IsSame"].ToString();
                                        }
                                        else
                                        {
                                            stockNo[j] = "";
                                        }

                                        #endregion

                                        #region 查询零件属性

                                        DataTable dt10 = productBll.SearchInfoByPartNo(partNo[j].ToString().Trim());
                                        if (dt10 != null && dt10.Rows.Count > 0)
                                        {
                                            QLevel = dt10.Rows[0]["QLevel"].ToString();
                                            IsOne = dt10.Rows[0]["IsPrintOneTag"].ToString();
                                            IsPack = dt10.Rows[0]["IsPrintPackList"].ToString();
                                            IsPaint = dt10.Rows[0]["IsPlating"].ToString();
                                            PartName = dt10.Rows[0]["ProductName"].ToString();
                                            //MaxCount = Convert.ToInt32(dt10.Rows[0]["PackCount"].ToString());
                                            IsSupply = dt10.Rows[0]["IsSupply"].ToString();
                                        }

                                        #endregion
                                    }
                                    catch (Exception ex)
                                    {
                                        throw new Exception("p988" + ex.Message);
                                    }

                                   
                                    if (IsSame == "1")
                                    {
                                        for (int k = 0; k < 2; k++)
                                        {
                                            if (IsSupply != "1")
                                            {
                                                #region 非直供件

                                                try
                                                {
                                                    if (ManufacturerName.Contains("蔚来"))
                                                    {

                                                        GetSjBarCode(stockNo[j].ToString().Trim(), partNo[j].ToString().Trim(), true, mould, PartName, NumItems + "_1017", ref NewOneCode, ref newcode);

                                                    }
                                                    else
                                                    {
                                                        GetSjBarCode(stockNo[j].ToString().Trim(), partNo[j].ToString().Trim(), true, mould, PartName, NumItems + "_1056", ref NewOneCode, ref newcode);
                                                    }
                                                }
                                                catch (Exception ex)
                                                {
                                                    MessageBox.Show(ex.ToString());
                                                    LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                                                    return;
                                                }
                                                
                                                #endregion
                                            }
                                            else
                                            {
                                                #region 直供件

                                                try
                                                {
                                                    
                                                    GetSupplyCode(stockNo[j].ToString().Trim(), partNo[j].ToString().Trim(), QLevel, true, mould, PartName, ref NewOneCode, ref newcode);
                                                }
                                                catch (Exception ex)
                                                {
                                                    MessageBox.Show(ex.ToString());
                                                    LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                                                    return;
                                                }
                                                
                                                #endregion
                                            }

                                            #region 插入数据tb_barCode

                                            md.ID = Guid.NewGuid().ToString();
                                            md.StationID = dt.Rows[0]["StationID"].ToString();
                                            md.OneBarCode = NewOneCode;
                                            md.BarCode = newcode;
                                            md.StockNo = stockNo[j].ToString().Trim();
                                            md.PartNo = partNo[j].ToString().Trim();
                                            md.PrintType = 0;
                                            md.PlanID = planID;
                                            md.ProductNature = ProductNature;
                                            md.Des1 = PartName;
                                            DataTable pdt = productBll.SearchIsImportByPartNo(partNo[j].ToString());
                                            if (pdt != null && pdt.Rows.Count > 0)
                                            {
                                                if (pdt.Rows[0]["isImport"].ToString() == "1")
                                                {
                                                    md.Import = "国产料Kingfa";
                                                }
                                                else
                                                {
                                                    md.Import = "";
                                                }
                                            }

                                            string errMsg = string.Empty;
                                            bool saveRst = SaveInfo(md, true, mould, false, ref errMsg);
                                            if (saveRst == false)
                                            {
                                                LogErrBLL.AddInfo($"自动打印[{partNo[j].ToString()}],条码" + md.OneBarCode + "报错:" + errMsg, MethodBase.GetCurrentMethod());

                                                //MessageBox.Show("条码" + md.OneBarCode + "存储时发生错误,原因:" + errMsg);
                                                //return;
                                            }
                                            #endregion

                                            #region 打印条码,判断是否打印单个条码

                                            #region 打印单个标签

                                            if (IsOne == "1")
                                            {
                                                if (IsSupply != "1")
                                                {
                                                    filename = ManufacturerName.Contains("蔚来")
                                                        ? System.AppDomain.CurrentDomain.BaseDirectory +
                                                          "wl.grf"
                                                        : System.AppDomain.CurrentDomain.BaseDirectory +
                                                          PrintMoudleName("0", "Print" + Program.station + "_1167"); //new
                                                }
                                                else
                                                {
                                                    filename = System.AppDomain.CurrentDomain.BaseDirectory +
                                                               PrintMoudleName("1", "Print" + Program.station + "_1172");
                                                }

                                                //DataTable dt4 = pbll.SearchInfo(partNo[j].ToString().Trim(),
                                                //    dt.Rows[0]["StationID"].ToString());
                                                //if (dt4 != null && dt4.Rows.Count > 0)
                                                //{
                                                //    printName = "Printer" + dt4.Rows[0]["PrinterNo"].ToString();
                                                //}
                                                printName = "Printer" + _printNameDict[partNo[j].ToString().Trim() + dt.Rows[0]["StationID"].ToString()];

                                                string reportName = ConfigurationManager.AppSettings[printName]
                                                    .ToString();
                                                DataTable headTable = GetPrintHeadTable(partNo[j].ToString().Trim(), PartName, NewOneCode, newcode);

                                                ReportHelper rp = new ReportHelper(filename, headTable, null,
                                                    (int) GRPaperOrientation.grpoPortrait, 1, reportName);

                                                LogSysBLL.AddInfo(
                                                    GetDateTime().ToString("yyyy/MM/dd HH:mm:ss") + NewOneCode,
                                                    MethodBase.GetCurrentMethod());
                                                rp.Report.Print(false);
                                                
                                            }

                                            #endregion

                                            #endregion

                                            initBarCode();
                                        }
                                    }
                                    else
                                    {
                                        if (IsSupply != "1")
                                        {
                                            #region 非直供件
                                            try
                                            {
                                                if (ManufacturerName.Contains("蔚来"))
                                                {
                                                    GetSjBarCode(stockNo[j].ToString().Trim(), partNo[j].ToString().Trim(), true, mould, PartName, NumItems + "_1235", ref NewOneCode, ref newcode);

                                                }
                                                else
                                                {
                                                    try
                                                    {
                                                        GetSjBarCode(stockNo[j].ToString().Trim(), partNo[j].ToString().Trim(), true, mould, PartName, NumItems + "_1273", ref NewOneCode, ref newcode);

                                                    }
                                                    catch (Exception ex)
                                                    {
                                                        throw new Exception("p988" + ex.Message);
                                                    }

                                                }
                                            }
                                            catch (Exception ex)
                                            {
                                                MessageBox.Show(ex.ToString());
                                                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                                                return;
                                            }
                                            
                                            #endregion
                                        }
                                        else
                                        {
                                            #region 直供件

                                            try
                                            {
                                                GetSupplyCode(stockNo[j].ToString().Trim(), partNo[j].ToString().Trim(), QLevel, true, mould, PartName, ref NewOneCode, ref newcode);
                                            }
                                            catch (Exception ex)
                                            {
                                                MessageBox.Show(ex.ToString());
                                                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                                                return;
                                            }
                                            
                                            #endregion
                                        }

                                        #region 插入数据tb_barCode
                                        try
                                        {
                                            md.ID = Guid.NewGuid().ToString();
                                            md.StationID = dt.Rows[0]["StationID"].ToString();
                                            md.OneBarCode = NewOneCode;
                                            md.BarCode = newcode;
                                            md.StockNo = stockNo[j].ToString().Trim();
                                            md.PartNo = partNo[j].ToString().Trim();
                                            md.PrintType = 0;
                                            md.PlanID = planID;
                                            md.ProductNature = ProductNature;
                                            md.Des1 = PartName;
                                            DataTable pdt = productBll.SearchIsImportByPartNo(partNo[j].ToString());
                                            if (pdt != null && pdt.Rows.Count > 0)
                                            {
                                                if (pdt.Rows[0]["isImport"].ToString() == "1")
                                                {
                                                    md.Import = "国产料Kingfa";
                                                }
                                                else
                                                {
                                                    md.Import = "";
                                                }
                                            }

                                            string errMsg = string.Empty;
                                            bool saveRst = SaveInfo(md, true, mould, false, ref errMsg);
                                            if (saveRst == false)
                                            {
                                                LogErrBLL.AddInfo($"自动打印[{partNo[j].ToString()}],条码" + md.OneBarCode + "报错:" + errMsg, MethodBase.GetCurrentMethod());

                                                //MessageBox.Show("条码" + md.OneBarCode + "存储时发生错误,原因:" + errMsg);
                                                //return;
                                            }
                                        }
                                        catch (Exception ex)
                                        {
                                            throw new Exception("p1396" + ex.Message);
                                        }
                                        
                                        #endregion

                                        #region 打印条码,判断是否打印单个条码

                                        #region 打印单个标签

                                        if (IsOne == "1")
                                        {

                                            if (IsSupply != "1")
                                            {
                                                filename = ManufacturerName.Contains("蔚来")
                                                    ? System.AppDomain.CurrentDomain.BaseDirectory +
                                                      "wl.grf"
                                                    : System.AppDomain.CurrentDomain.BaseDirectory +
                                                      PrintMoudleName("0", "Print" + Program.station + "_1385");//new
                                                if (partNo[j].Contains("A2146982300") ||
                                                        partNo[j].Contains("A2146982400"))
                                                    {
                                                    filename = AppDomain.CurrentDomain.BaseDirectory +
                                                               "Sill.grf";
                                                }
                                            }
                                            else
                                            {
                                                filename = System.AppDomain.CurrentDomain.BaseDirectory + PrintMoudleName("1", "Print" + Program.station + "_1395");
                                            }

                                            //DataTable dt4 = pbll.SearchInfo(partNo[j].ToString().Trim(),
                                            //    dt.Rows[0]["StationID"].ToString());
                                            //if (dt4 != null && dt4.Rows.Count > 0)
                                            //{
                                            //    printName = "Printer" + dt4.Rows[0]["PrinterNo"].ToString();
                                            //}
                                            printName = "Printer" + _printNameDict[partNo[j].ToString().Trim() + dt.Rows[0]["StationID"].ToString()];

                                            string reportName = ConfigurationManager.AppSettings[printName].ToString();
                                            DataTable headTable = GetPrintHeadTable(partNo[j].ToString().Trim(), PartName, NewOneCode, newcode);

                                            ReportHelper rp = new ReportHelper(filename, headTable, null, (int)GRPaperOrientation.grpoPortrait, 1, reportName);
                                            LogSysBLL.AddInfo(GetDateTime().ToString("yyyy/MM/dd HH:mm:ss") + NewOneCode, MethodBase.GetCurrentMethod());
                                            rp.Report.Print(false);
                                        }

                                        #endregion

                                        #endregion

                                        initBarCode();
                                    }

                                }

                                #endregion
                            }
                            
                        }

                        #endregion

                        #region 修改打印时间

                        //UpdatePrintTime(DateTime.Now, label6.Text);

                        #endregion

                        initPlan();
                        lastTime=DateTime.Now;
                    }
                }
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                MessageBox.Show(ex.ToString());
            }
        }

      

        private void TimeGo()
        {
            System.Timers.Timer timer = new System.Timers.Timer();
            timer.Interval = 1000;
            timer.Enabled = true;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Tick);
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            try
            {
                label2.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                Thread.Sleep(500);
            }
           catch(Exception ex)
            {
                Console.Write(ex.Message);
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            int wID = 0;
            WeightRecordBLL wrbll = new WeightRecordBLL();
            WeightBLL wbll = new WeightBLL();
            WeightRecordModel wmd=new WeightRecordModel();
            InjectionPlanBLL bll = new InjectionPlanBLL();
            BarCodeBLL brbll = new BarCodeBLL();
            BarCodeModel md = new BarCodeModel();
            ProductBLL productBll = new ProductBLL();
            PlasticBLL pbll = _plasticBLL;
            InjectionBoxBLL boxbll = new InjectionBoxBLL();
            InjectionBoxModel boxmd = new InjectionBoxModel();
            InjectionQtyBLL qbll=new InjectionQtyBLL();
            InjectionQtyModel qmd = new InjectionQtyModel();
            StationBLL sbll=new StationBLL();
            DataTable dt2 = null;
            string code = "", OneCode = "";
            string newcode = "", newcode1 = "", NewOneCode = "", NewOneCode1 = "";
            string IsPack = "", IsOne = "", QLevel = "", IsPaint = "", PartName = "";
            string filename = "", printName = "",StationID="",printBoxName="";
            int MaxCount = 0, CurrentCount = 0,IsSame=0;
            int aa = 0;

            try
            {
                timer1.Enabled=false; 
                
                GetClass();
                aa = aa + 1;

                LogHelper.WriteLog(aa.ToString());

                #region 查找MES数据库总存储的最大ID

                DataTable wrdt = wrbll.SearchMaxIDByDevice(Program.station);
                if (wrdt != null && wrdt.Rows.Count > 0)
                {
                    ID = Convert.ToInt32(wrdt.Rows[0]["ID"].ToString());
                }
                else
                {
                    ID = 0;
                }
                LogHelper.WriteLog(ID.ToString());

                #endregion

                #region 如果称重数据库里的ID大于MES数据库中的ID,打印条码,并将称重数据库中的ID存入MES数据库

                if (wID > ID)
                {
                    #region 打印

                    #region 查找当前计划

                    DataTable dt = bll.SearchInfoByName(Program.station);
                    if (dt != null && dt.Rows.Count > 0)
                    {
                        planID = dt.Rows[0]["InjectionPlanID"].ToString();
                        string[] partNo = dt.Rows[0]["PartNo"].ToString().Split(',');
                        string[] stockNo = new string[partNo.Length]; 
                        //string[] stockNo = dt.Rows[0]["StockNo"].ToString().Split(',');
                        string ProductNature = dt.Rows[0]["ProductNature"].ToString();
                        int[] same = new int[partNo.Length];

                        #region 判断有几个零件号
                        int mould = 0;
                        for (int j = 0; j < partNo.Length; j++)
                        {
                            mould = j;
                            #region 根据零件号查找存货代码

                            DataTable sdt = productBll.SearchInfoByPartNo(partNo[j].ToString().Trim());
                            if (sdt != null && sdt.Rows.Count > 0)
                            {
                                stockNo[j] = sdt.Rows[0]["StockNo"].ToString();
                                same[j] = Convert.ToInt32(sdt.Rows[0]["IsSame"].ToString());
                            }
                            else
                            {
                                stockNo[j] = "";
                                same[j] =0;
                            }


                            #endregion

                            DataTable dt3 = productBll.SearchInfoByPartNo(partNo[j].ToString().Trim());
                            if (dt3 != null && dt3.Rows.Count > 0)
                            {
                                QLevel = dt3.Rows[0]["QLevel"].ToString();
                                IsOne = dt3.Rows[0]["IsPrintOneTag"].ToString();
                                IsPack = dt3.Rows[0]["IsPrintPackList"].ToString();
                                IsPaint = dt3.Rows[0]["IsPlating"].ToString();
                                PartName = dt3.Rows[0]["ProductName"].ToString();
                                MaxCount = Convert.ToInt32(dt3.Rows[0]["PackCount"].ToString());
                            }


                            if (partNo.Length == 1 && same[j] == 1)     //一个零件号,且一模两具生产的是两根一样的产品
                            {
                                for (int k = 0; k < 2; k++)
                                {
                                    GetSjBarCode(stockNo[j].ToString().Trim(), partNo[j].ToString().Trim(), true, mould.ToString(), PartName,"", ref NewOneCode, ref newcode);

                                    #region 插入数据tb_barCode

                                    md.ID = Guid.NewGuid().ToString();
                                    md.StationID = dt.Rows[0]["StationID"].ToString();
                                    md.OneBarCode = NewOneCode;
                                    md.BarCode = newcode;
                                    md.StockNo = stockNo[j].ToString().Trim();
                                    md.PartNo = partNo[j].ToString().Trim();
                                    md.PrintType = 0;
                                    md.PlanID = planID;
                                    md.ProductNature = ProductNature;
                                    md.Des1 = PartName;
                                    DataTable pdt = productBll.SearchIsImportByPartNo(partNo[j].ToString());
                                    if (pdt != null && pdt.Rows.Count > 0)
                                    {
                                        if (pdt.Rows[0]["isImport"].ToString() == "1")
                                        {
                                            md.Import = "国产料Kingfa";
                                        }
                                        else
                                        {
                                            md.Import = "";
                                        }
                                    }

                                    string errMsg = string.Empty;
                                    bool saveRst = SaveInfo(md, true, same[j].ToString(), false, ref errMsg);
                                    if (saveRst == false)
                                    {
                                        LogErrBLL.AddInfo($"自动打印[{partNo[j].ToString()}],条码" + md.OneBarCode + "报错:" + errMsg, MethodBase.GetCurrentMethod());

                                        //MessageBox.Show("条码" + md.OneBarCode + "存储时发生错误,原因:" + errMsg);
                                        //return;
                                    }
                                    #endregion

                                    #region 增加产量

                                    qmd.ID = Guid.NewGuid().ToString();
                                    qmd.PlanID = planID;
                                    qmd.StationID = getStationID(Program.station);
                                    qmd.ProductDate = Program.ProductDate;
                                    qmd.ClassName = Program.Shift;
                                    qmd.StockNo = stockNo[j].ToString().Trim();
                                    qmd.PartNo = partNo[j].ToString().Trim();
                                    if (ProductNature == "售后件")
                                    {
                                        qmd.MarketCount = 1;
                                    }
                                    else
                                    {
                                        qmd.MarketCount = 0;
                                    }

                                    DataTable isExistdt = qbll.SearchInfo(qmd);
                                    if (isExistdt != null && isExistdt.Rows.Count > 0)
                                    {
                                        qbll.UpdateQty(qmd);
                                    }
                                    else
                                    {
                                        qmd.ProductCount = 1;
                                        qbll.AddInfo(qmd);
                                    }

                                    #endregion

                                    #region 打印条码,判断是否打印单个条码

                                  

                                    //DataTable dt4 = pbll.SearchInfo(partNo[j].ToString().Trim(),
                                    //    dt.Rows[0]["StationID"].ToString());
                                    //if (dt4 != null && dt4.Rows.Count > 0)
                                    //{
                                    //    printName = "Printer" + dt4.Rows[0]["PrinterNo"].ToString();
                                    //}
                                    printName = "Printer" + _printNameDict[partNo[j].ToString().Trim() + dt.Rows[0]["StationID"].ToString()];

                                    #region 打印单个标签

                                    if (IsOne == "1")
                                    {
                                        filename = System.AppDomain.CurrentDomain.BaseDirectory + PrintMoudleName(); //new
                                       
                                        string reportName = ConfigurationManager.AppSettings[printName].ToString();
                                        DataTable headTable = GetPrintHeadTable(partNo[j].ToString().Trim(), PartName, NewOneCode, newcode);


                                        ReportHelper rp = new ReportHelper(filename, headTable, null, (int)GRPaperOrientation.grpoPortrait, 1, reportName);

                                        rp.Report.Print(false);
                                    }

                                    #endregion

                                    #endregion
                                }
                            }
                            else
                            {
                                GetSjBarCode(stockNo[j].ToString().Trim(), partNo[j].ToString().Trim(), true, mould.ToString(), PartName,"", ref NewOneCode, ref newcode);

                                #region 插入数据tb_barCode

                                md.ID = Guid.NewGuid().ToString();
                                md.StationID = dt.Rows[0]["StationID"].ToString();
                                md.OneBarCode = NewOneCode;
                                md.BarCode = newcode;
                                md.StockNo = stockNo[j].ToString().Trim();
                                md.PartNo = partNo[j].ToString().Trim();
                                md.PrintType = 0;
                                md.PlanID = planID;
                                md.ProductNature = ProductNature;
                                md.Des1 = PartName;
                                DataTable pdt = productBll.SearchIsImportByPartNo(partNo[j].ToString());
                                if (pdt != null && pdt.Rows.Count > 0)
                                {
                                    if (pdt.Rows[0]["isImport"].ToString() == "1")
                                    {
                                        md.Import = "国产料Kingfa";
                                    }
                                    else
                                    {
                                        md.Import = "";
                                    }
                                }

                               
                                string errMsg = string.Empty;
                                bool saveRst = SaveInfo(md, true, same[j].ToString(), false, ref errMsg);
                                if (saveRst == false)
                                {
                                    LogErrBLL.AddInfo($"自动打印[{partNo[j].ToString()}],条码" + md.OneBarCode + "报错:" + errMsg, MethodBase.GetCurrentMethod());

                                    //MessageBox.Show("条码" + md.OneBarCode + "存储时发生错误,原因:" + errMsg);
                                    //return;
                                }
                                #endregion

                                #region 增加产量

                                qmd.ID = Guid.NewGuid().ToString();
                                qmd.PlanID = planID;
                                qmd.StationID = getStationID(Program.station);
                                qmd.ProductDate = Program.ProductDate;
                                qmd.ClassName = Program.Shift;
                                qmd.StockNo = stockNo[j].ToString().Trim();
                                qmd.PartNo = partNo[j].ToString().Trim();
                                if (ProductNature == "售后件")
                                {
                                    qmd.MarketCount = 1;
                                }
                                else
                                {
                                    qmd.MarketCount = 0;
                                }

                                DataTable isExistdt = qbll.SearchInfo(qmd);
                                if (isExistdt != null && isExistdt.Rows.Count > 0)
                                {
                                    qbll.UpdateQty(qmd);
                                }
                                else
                                {
                                    qmd.ProductCount = 1;
                                    qbll.AddInfo(qmd);
                                }

                                #endregion

                                #region 打印条码,判断是否打印单个条码

                                printName = "Printer" + _printNameDict[partNo[j].ToString().Trim() + dt.Rows[0]["StationID"].ToString()];

                                #region 打印单个标签

                                if (IsOne == "1")
                                {
                                    filename = System.AppDomain.CurrentDomain.BaseDirectory + PrintMoudleName(); //new
                                    
                                    string reportName = ConfigurationManager.AppSettings[printName].ToString();
                                    DataTable headTable = GetPrintHeadTable(partNo[j].ToString().Trim(), PartName, NewOneCode, newcode);

                                    ReportHelper rp = new ReportHelper(filename, headTable, null, (int)GRPaperOrientation.grpoPortrait, 1, reportName);

                                    rp.Report.Print(false);
                                }

                                #endregion

                              
                                #endregion
                            }
                            

                            initBarCode();
                        }

                        #endregion
                    }

                    #endregion

                    #endregion

                    #region 存ID

                    wmd.GID = Guid.NewGuid().ToString();
                    wmd.ID = wID;
                    wmd.DeviceNo = Program.station;
                    wrbll.AddInfo(wmd);

                    #endregion
                }

                #endregion

                timer1.Enabled = true;
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
            }
            
        }

        private void initProduct()
        {
            comboBox2.Items.Clear();

            PlasticBLL bll= _plasticBLL;

            try
            {
                DataTable dt = bll.SearchPartByStation(Program.station);
                if (dt != null && dt.Rows.Count > 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        comboBox2.Items.Add(dt.Rows[i]["ProductName"].ToString());
                    }
                }
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
            }
            
        }

        private void GetClass()
        {
            try
            {
                DateTime aa = GetDateTime();

                if (GetDateTime().Hour >= 8 && GetDateTime().Hour < 20)
                {
                    Program.Shift = "A班";
                    Program.ProductDate = aa.ToString("yyyy-MM-dd");
                     
                }
                else
                {
                    Program.Shift = "B班";
                    if (GetDateTime().Hour >= 0 && GetDateTime().Hour < 8)
                    {
                        Program.ProductDate = aa.AddDays(-1).ToString("yyyy-MM-dd");
                    }
                    else if (GetDateTime().Hour >= 20 && GetDateTime().Hour <= 23)
                    {
                        Program.ProductDate = aa.ToString("yyyy-MM-dd");
                    }
                }
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
            }
        }

        private DateTime GetDateTime()
        {
            string sql = "";
            DateTime time;
            DataTable dt;
            try
            {
                sql = @"select  convert(char(23),getdate(),121) as time";

                dt = SqlHelper.ExecuteDataset(SqlHelper.GetConnSting(), CommandType.Text, sql, null).Tables[0];
                if (dt != null && dt.Rows.Count > 0)
                {
                    //time = Convert.ToDateTime(dt.Rows[0]["time"].ToString());
                    time = DateTime.ParseExact(dt.Rows[0]["time"].ToString(), "yyyy-MM-dd HH:mm:ss.fff",
                        System.Globalization.CultureInfo.CurrentCulture);

                }
                else
                {
                    time = DateTime.Now;
                }
                return time;
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return DateTime.Now;
            }
        }

        private void initBarCode()
        {
            BarCodeBLL bll = new BarCodeBLL();

            try
            {
                glacialList1.Items.Clear();
                DataTable dt1 = bll.SearchInfo(Program.station);
                DataTable dt = dt1.Clone();
                //List<DataRow> list = dt1.AsEnumerable().Where(p => string.IsNullOrEmpty(p.Field<string>("BoxNo")) == false).ToList();
                List<DataRow> list = dt1.AsEnumerable().ToList();
                if (list.Count > 0)
                {
                    dt = list.CopyToDataTable();
                }
                Program.strBarCode = "";
                Program.strBoxCode = "";
                if (dt != null && dt.Rows.Count > 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        glacialList1.Items.Add(i.ToString());
                        glacialList1.Items[i].SubItems[0].Text = dt.Rows[i]["OneBarCode"].ToString();
                        glacialList1.Items[i].SubItems[0].Tag = dt.Rows[i]["BoxNo"].ToString();
                        glacialList1.Items[i].SubItems[1].Text = dt.Rows[i]["ProductName"].ToString();
                        glacialList1.Items[i].SubItems[2].Text = dt.Rows[i]["PrintType"].ToString();
                        glacialList1.Items[i].SubItems[3].Text = dt.Rows[i]["CreateTime"].ToString() == "" ? "" : Convert.ToDateTime(dt.Rows[i]["CreateTime"].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
                        //glacialList1.Items[i].SubItems[4].Text = dt.Rows[i]["BoxNo"].ToString();
                        
                    }
                }
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
            }
        }

        
        /// <summary>  
        /// 创建服务  
        /// </summary>  
        /// <returns></returns>  
        private bool CreateServer()
        {
            try
            {
                opcServer = new OPCServer();
            }
            catch
            {
                return false;
            }
            return true;
        }

        /// <summary>  
        /// 连接到服务器  
        /// </summary>  
        /// <param name="strHostIP"></param>  
        /// <param name="strHostName"></param>  
        /// <returns></returns>  
        private bool ConnectServer(string strHostIP, string strHostName)
        {
            try
            {
                opcServer.Connect(strHostName, strHostIP);
            }
            catch
            {
                return false;
            }
            return true;
        }

        /// <summary>  
        /// 设置组的属性   
        /// </summary>  
        /// <param name="opcGroup"></param>  
        /// <param name="updateRate"></param>
        
        private void SetGroupProperty(OPCGroup opcGroup, int updateRate)
        {
            opcGroup.IsActive = true;
            opcGroup.DeadBand = 0;
            opcGroup.UpdateRate = updateRate;
            opcGroup.IsSubscribed = true;
        }

        #region 调用键盘

        private const Int32 WM_SYSCOMMAND = 274;

        private const UInt32 SC_CLOSE = 61536;

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]

        private static extern bool PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]

        private static extern bool PostMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam);

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]

        private static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]

        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]

        private static extern int RegisterWindowMessage(string lpString);



        //显示屏幕键盘

        public static int ShowInputPanel()
        {

            try
            {

                dynamic file = "C:\\Program Files\\Common Files\\microsoft shared\\ink\\TabTip.exe";

                if (!System.IO.File.Exists(file))

                    return -1;

                Process.Start(file);

                //return SetUnDock(); //不知SetUnDock()是什么,所以直接注释返回1

                return 1;

            }

            catch (Exception)
            {

                return 255;

            }

        }

        #endregion

        private void label2_Click(object sender, EventArgs e)
        {
            try
            {
                //if (serialPort1.IsOpen)
                //{
                //    serialPort1.Close();
                //}
                Environment.Exit(0);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(),MethodBase.GetCurrentMethod());
                Environment.Exit(0);
            }
        }

       
        /// <summary>
        /// 手工打印条码
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label23_Click(object sender, EventArgs e)
        {
            string code = "",stationID="",OneCode="";
            string newcode = "",partNo="",stockNo="",NewOneCode="";
            string IsPack = "", IsOne = "", QLevel = "", IsPaint = "", PartName = "", printBoxName="",IsSupply="",ManufacturerName="";
            string filename = "", printName = "";
            int MaxCount = 0, CurrentCount = 0;
            CheckPackageSelect();
            ProductBLL pbll = new ProductBLL();
            BarCodeBLL bll = new BarCodeBLL();
            BarCodeModel md = new BarCodeModel();
            PlasticBLL plbll= _plasticBLL;
            InjectionBoxBLL boxbll = new InjectionBoxBLL();
            InjectionBoxModel boxmd = new InjectionBoxModel();
            InjectionPlanBLL planbll=new InjectionPlanBLL();

            try
            {
                //if (status == false)
                //{
                //    MessageBox.Show("连接服务器失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                //    return;
                //}

                #region 数据合法性判断

                if (comboBox2.Text.Trim() == "")
                {
                    MessageBox.Show("请选择产品!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                if (textBox1.Text.Trim() == "")
                {
                    MessageBox.Show("请输入批次!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                if (textBox1.Text.Trim().Length != 6)
                {
                    MessageBox.Show("批次格式不正确!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                if (textBox2.Text.Trim() == "")
                {
                    MessageBox.Show("请输入数量!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
                if (!IsNumeric(textBox2.Text.Trim()))
                {
                    MessageBox.Show("数量格式不正确!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }

                //if (Convert.ToInt32(textBox2.Text.Trim()) > 10)
                //{
                //    MessageBox.Show("数量不能大于10!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                //    return;
                //}

                #endregion

                #region 获取工位编号

                StationBLL sbll = new StationBLL();
                DataTable sdt = sbll.SearchInfoByNo(Program.station);
                if (sdt != null && sdt.Rows.Count > 0)
                {
                    stationID = sdt.Rows[0]["StationID"].ToString();
                }

                #endregion

                DialogResult result = MessageBox.Show("确定手工打印条码?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
                if (result == DialogResult.OK)
                {
                    #region 查询零件号

                    DataTable pdt = pbll.SearchInfoByName(comboBox2.Text, "2000");
                    if (pdt != null && pdt.Rows.Count > 0)
                    {
                        partNo = pdt.Rows[0]["PartNo"].ToString().Trim();
                        stockNo = pdt.Rows[0]["StockNo"].ToString().Trim();
                        ManufacturerName = pdt.Rows[0]["ManufacturerName"].ToString().Trim();
                    }
                    else
                    {
                        MessageBox.Show($"零件[{comboBox2.Text}]在系统中不存在!");
                        return;
                    }

                    #endregion

                    #region 判断是否打印单个条码

                    DataTable dt3 = pbll.SearchInfoByPartNo(partNo);
                    if (dt3 != null && dt3.Rows.Count > 0)
                    {
                        QLevel = dt3.Rows[0]["QLevel"].ToString();
                        IsOne = dt3.Rows[0]["IsPrintOneTag"].ToString();
                        PartName = dt3.Rows[0]["ProductName"].ToString();
                        IsSupply = dt3.Rows[0]["IsSupply"].ToString();

                    }

                    #endregion

                    //todo 判断零件号和计划是不是一致

                    DataTable plandt = planbll.searchPlanInfo(planID);
                    if (plandt != null && plandt.Rows.Count > 0)
                    {
                        if (plandt.Rows[0]["PartNo"].ToString().Contains(partNo)==false)
                        {
                            planID = "";
                        }
                    }

                    if (IsSupply != "1")
                    {
                        #region 非直供件
                        int printCount = Convert.ToInt32(textBox2.Text.Trim());
                        for (int i = 1; i <= printCount; i++)
                        {
                            GetSjBarCode(stockNo, partNo,false,"0", PartName, "", ref NewOneCode, ref newcode);

                            string[] part = newcode.Split('.');

                            #region 插入数据tb_barCode

                            md.ID = Guid.NewGuid().ToString();
                            md.StationID = stationID;
                            md.OneBarCode = NewOneCode;
                            md.BarCode = newcode;
                            md.StockNo = stockNo;
                            md.PartNo = partNo;
                            md.PrintType = 1;
                            md.PlanID = planID;
                            
                            md.ProductNature = "正常件"; //第一次没有这个
                            md.Des1 = PartName;
                            DataTable dt2 = pbll.SearchIsImportByPartNo(partNo);
                            if (dt2 != null && dt2.Rows.Count > 0)
                            {
                                if (dt2.Rows[0]["isImport"].ToString() == "1")
                                {
                                    md.Import = "国产料Kingfa";
                                }
                                else
                                {
                                    md.Import = "";
                                }
                            }

                            string errMsg = string.Empty;
                            bool saveRst = SaveInfo(md, false, "0", i == printCount, ref errMsg);
                            if (saveRst == false)
                            {
                                LogErrBLL.AddInfo($"手工打印[{partNo}],条码" + md.OneBarCode + "报错:" + errMsg, MethodBase.GetCurrentMethod());

                                //MessageBox.Show("条码" + md.OneBarCode + "存储时发生错误,原因:" + errMsg);
                                //return;
                            }

                            #endregion

                            #region 打印单个标签

                            if (IsOne == "1")
                            {
                                //filename = System.AppDomain.CurrentDomain.BaseDirectory + "单个条码.grf";
                                filename = ManufacturerName.Contains("蔚来")
                                    ? System.AppDomain.CurrentDomain.BaseDirectory +
                                      "wl.grf"
                                    : System.AppDomain.CurrentDomain.BaseDirectory +
                                      PrintMoudleName("0", "Print" + Program.station + "_2514"); //new
                                if (partNo.Contains("A2146982300") ||
                                    partNo.Contains("A2146982400"))
                                {
                                    filename = AppDomain.CurrentDomain.BaseDirectory +
                                               "Sill.grf";
                                }
                                
                                //DataTable dt4 = plbll.SearchInfo(partNo, stationID);
                                //if (dt4 != null && dt4.Rows.Count > 0)
                                //{
                                //    printName = "Printer" + dt4.Rows[0]["PrinterNo"].ToString();
                                //}
                                printName = "Printer" + _printNameDict[partNo + stationID];

                                string reportName = ConfigurationManager.AppSettings[printName].ToString();
                                DataTable headTable = GetPrintHeadTable(partNo, PartName, NewOneCode, newcode);

                                ReportHelper rp = new ReportHelper(filename, headTable, null, (int)GRPaperOrientation.grpoPortrait, 1, reportName);
                                LogSysBLL.AddInfo(GetDateTime().ToString("yyyy/MM/dd HH:mm:ss") + NewOneCode, MethodBase.GetCurrentMethod());
                                rp.Report.Print(false);
                            }

                            #endregion


                        }


                        #endregion
                    }
                    else
                    {
                        #region 直供件

                        for (int i = 1; i <= Convert.ToInt32(textBox2.Text.Trim()); i++)
                        {
                            //newcode = code.Substring(0, code.Length - 4) +
                            //          (Convert.ToInt32(code.Substring(23, 3)) +
                            //           i).ToString()
                            //          .PadLeft(3, '0') + "#";
                            GetSupplyCode(stockNo, partNo, QLevel,false, "0", PartName, ref NewOneCode, ref newcode);

                            #region 插入数据tb_barCode

                            md.ID = Guid.NewGuid().ToString();
                            md.StationID = stationID;
                            md.OneBarCode = NewOneCode;
                            md.BarCode = newcode;
                            md.StockNo = stockNo;
                            md.PartNo = partNo;
                            md.PrintType = 1;
                            md.PlanID = planID;

                            DataTable dt2 = pbll.SearchIsImportByPartNo(partNo);
                            if (dt2 != null && dt2.Rows.Count > 0)
                            {
                                if (dt2.Rows[0]["isImport"].ToString() == "1")
                                {
                                    md.Import = "国产料Kingfa";
                                }
                                else
                                {
                                    md.Import = "";
                                }
                            }

                            string errMsg = string.Empty;
                            bool saveRst = SaveInfo(md, false, "0", false, ref errMsg);
                            if (saveRst == false)
                            {
                                LogErrBLL.AddInfo($"手工打印[{partNo}],条码" + md.OneBarCode + "报错:" + errMsg, MethodBase.GetCurrentMethod());

                                //MessageBox.Show("条码" + md.OneBarCode + "存储时发生错误,原因:" + errMsg);
                                //return;
                            }

                            #endregion

                            #region 打印单个标签

                            if (IsOne == "1")
                            {
                                filename = System.AppDomain.CurrentDomain.BaseDirectory + PrintMoudleName("1", "Print" + Program.station + "_2778"); ;
                                
                                //DataTable dt4 = plbll.SearchInfo(partNo, stationID);
                                //if (dt4 != null && dt4.Rows.Count > 0)
                                //{
                                //    printName = "Printer" + dt4.Rows[0]["PrinterNo"].ToString();
                                //}
                                printName = "Printer" + _printNameDict[partNo + stationID];

                                string reportName = ConfigurationManager.AppSettings[printName].ToString();
                                DataTable headTable = GetPrintHeadTable(partNo, PartName, NewOneCode, newcode);

                                ReportHelper rp = new ReportHelper(filename, headTable, null, (int)GRPaperOrientation.grpoPortrait, 1, reportName);
                                LogSysBLL.AddInfo(GetDateTime().ToString("yyyy/MM/dd HH:mm:ss") + NewOneCode, MethodBase.GetCurrentMethod());
                                rp.Report.Print(false);
                            }

                            #endregion
                        }

                      
                        #endregion
                    }
                    
                    initBarCode();
                }
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                MessageBox.Show(ex.ToString());
            }
        }

        private static bool IsNumeric(string str)
        {
            System.Text.RegularExpressions.Regex reg1 = new System.Text.RegularExpressions.Regex(@"^[0-9]\d*$");
            return reg1.IsMatch(str);
        }

        private static string getStationID(string stationName)
        {
            try
            {
                string id = "";
                StationBLL bll=new StationBLL();

                DataTable dt = bll.SearchInfoByNo(stationName);
                if (dt != null && dt.Rows.Count > 0)
                {
                    id = dt.Rows[0]["StationID"].ToString();
                }
                else
                {
                    id = "";
                }

                return id;

            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return "";
            }
        }
        /// <summary>
        /// 往左箱单添加新码
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lbAddPrintL_Click(object sender, EventArgs e)
        {
            ReAddBarCodeToBox( lbPackageCodeL,  lbCurrentlQtyL,  lbNeedQtyL,"左侧");
        
        }
        /// <summary>
        /// 往右箱单添加新码
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lbAddPrintR_Click(object sender, EventArgs e)
        {
            ReAddBarCodeToBox(lbPackageCodeR, lbCurrentlQtyR, lbNeedQtyR, "右侧");
        }
        /// <summary>
        /// 手动添加新箱码
        /// </summary>
        /// <param name="lbPackageCode"></param>
        /// <param name="lbCurrentlQty"></param>
        /// <param name="lbNeedQty"></param>
        /// <param name="hintTxt"></param>
        void ReAddBarCodeToBox(Label lbPackageCode, Label lbCurrentlQty, Label lbNeedQty,string hintTxt)
        {
            BarCodeBLL bll = new BarCodeBLL();
            InjectionBoxBLL inBoxBll = new InjectionBoxBLL();
            string boxCode = lbPackageCode.Text?.Trim();
            if (string.IsNullOrEmpty(boxCode))
            {
                MessageBox.Show(hintTxt + "箱码为空,无法添加新零件.");
                return;
            }
            string tcompletedQtyStr = lbCurrentlQty.Text?.Trim();
            string allQtyStr = lbNeedQty.Text?.Trim();
            int count1 = 0;
            int count2 = 0;
            int.TryParse(tcompletedQtyStr, out count1);
            int.TryParse(allQtyStr, out count2);
            if (count2 == 0)
            {
                MessageBox.Show(hintTxt + "箱码规格为空,无法添加新零件.");
                return;
            }
            if (count1 >= count2)
            {
                MessageBox.Show(hintTxt + "箱码已满,无法添加新零件.");
                return;
            }

            DialogResult result = MessageBox.Show($"确定向"+ hintTxt +$"箱码[{boxCode}]插入一条全新数据并打印?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
            if (result == DialogResult.OK)
            {
                DataTable dt = bll.SearchInfoByBox(boxCode, Program.tableName);
                if (dt.Rows.Count == 0)
                {
                    MessageBox.Show($"表[{Program.tableName}]中没有找到{hintTxt}箱码[{boxCode}]关联的数据记录.");
                    return;
                }
                try
                {

                    inBoxBll.UpdateBoxCount(boxCode, 1, false);
                    BoxBarCodeReAddAndPrint(dt.Rows[0]);
                    InitPackageInfo();
                    //试试打印数量是否更新
                    int count3 = 0;
                    int count4 = 0;
                    int.TryParse(lbCurrentlQty.Text?.Trim(), out count3);
                    int.TryParse(allQtyStr, out count4);

                    if(count3 == count4)
                    {
                        if(hintTxt == "左侧")
                        {
                            UnCompletePrintBox("手动打印箱码", "left");
                        }
                        else
                        {
                            UnCompletePrintBox("手动打印箱码", "right");
                        }
                       
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"向{hintTxt}箱码[{boxCode}]添加数据失败,原因:" + ex.Message);
                    InitPackageInfo();
                }
                
            }
        }
        bool BoxBarCodeReAddAndPrint(DataRow barCodeRow)
        {
            ProductBLL pbll = new ProductBLL();
            BarCodeBLL bll = new BarCodeBLL();
            string code = "", filename = "", printName = "", ManufacturerName = "";
            string IsSupply = "0";
            BarCodeModel md = new BarCodeModel();

           


            md.ID = Guid.NewGuid().ToString();
            md.StationID = barCodeRow["StationID"].ToString();
            md.StockNo = barCodeRow["StockNo"].ToString();
            md.PartNo = barCodeRow["PartNo"].ToString();
            md.BatchNo = barCodeRow["BatchNo"].ToString();
            string newOneCode = string.Empty;
            string newBarCode = string.Empty;
            GetBarCode(md.StockNo, md.BatchNo, md.PartNo, ref newOneCode, ref newBarCode);
            md.OneBarCode = newOneCode;
            md.BarCode = newBarCode;
            md.BoxNo = barCodeRow["BoxNo"].ToString();

            md.Des1 = barCodeRow["Des1"].ToString();
            md.PrintType = 2;

            //DataTable pdt = pbll.SearchIsImportByPartNo(md.PartNo);

            DataTable pdt = pbll.SearchInfoByPartNo(md.PartNo);
            if (pdt != null && pdt.Rows.Count > 0)
            {
                if (pdt.Rows[0]["isImport"].ToString() == "1")
                {
                    md.Import = "国产料Kingfa";
                }
                else
                {
                    md.Import = "";
                }

                ManufacturerName = pdt.Rows[0]["ManufacturerName"].ToString().Trim();
                IsSupply = pdt.Rows[0]["IsSupply"].ToString();
            }
            //向箱码手动添加条码
            string msg = bll.ReprintSave(md, Program.tableName, "", "", Program.station, "2");
            if (!string.IsNullOrEmpty(msg))
            {
                MessageBox.Show($"补打失败,原因:" + msg);
                return false;
            }
            glacialList1.SelectedItems.Clear();
            initBarCode();

            #region 打印条码

            filename = ManufacturerName.Contains("蔚来")
                ? AppDomain.CurrentDomain.BaseDirectory +
                  "wl.grf"
                : AppDomain.CurrentDomain.BaseDirectory +
                  PrintMoudleName(IsSupply, "Print" + Program.station + "_3102"); //new
            if (md.PartNo.Contains("A2146982300") ||
                md.PartNo.Contains("A2146982400"))
            {
                filename = AppDomain.CurrentDomain.BaseDirectory +
                           "Sill.grf";
            }

            string partName = "";
            DataTable dt2 = pbll.SearchInfoByPartNo(md.PartNo);
            if (dt2 != null && dt2.Rows.Count > 0)
            {
                partName = dt2.Rows[0]["ProductName"].ToString();
            }
            else
            {
                partName = "";
            }

            printName = "Printer" + _printNameDict[md.PartNo + md.StationID];

            string reportName = ConfigurationManager.AppSettings[printName].ToString();
            DataTable headTable = GetPrintHeadTable(md.PartNo, partName, md.OneBarCode, md.BarCode);


            ReportHelper rp = new ReportHelper(filename, headTable, null,
                (int)GRPaperOrientation.grpoPortrait, 1, reportName);
            LogSysBLL.AddInfo(GetDateTime().ToString("yyyy/MM/dd HH:mm:ss") + md.OneBarCode, MethodBase.GetCurrentMethod());
            rp.Report.Print(false);

            #endregion

            return true;
        }

        /// <summary>
        /// 补打条码
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label22_Click(object sender, EventArgs e)
        {
            string code = "", filename = "", printName = "", ManufacturerName="";
            string IsSupply = "0";
            BarCodeModel md = new BarCodeModel();
            BarCodeBLL bll = new BarCodeBLL();
            ProductBLL pbll = new ProductBLL();
            PlasticBLL plbll = _plasticBLL;
            try
            {
                if (glacialList1.SelectedItems.Count == 0)
                {
                    MessageBox.Show("请选择要补打的条码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
                else
                {
                    GlacialComponents.Controls.GLItem gv;
                    gv = glacialList1.SelectedItems[0] as GlacialComponents.Controls.GLItem;
                    code = gv.Text;
                    DialogResult result = MessageBox.Show($"补打条码[{code}]将被新的替换,确定补打条码?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
                    if (result == DialogResult.OK)
                    {

                        bool exsitWms = _wmsBll.IsReadBarCodeInWms(code);
                        if (exsitWms)
                        {
                            MessageBox.Show($"条码[{code}]在WMS系统已处理,无法补打!");
                            return;
                        }

                        DataTable dt = bll.SearchInfoByBarCodeNew(code, Program.tableName);
                        if (dt == null || dt.Rows.Count == 0)
                        {
                            MessageBox.Show($"补打失败,条码[{code}]在表[{ Program.tableName}]中不存在!");
                            return;
                        }


                        md.ID = Guid.NewGuid().ToString();
                        //md.BarCode = code;
                        md.StationID = dt.Rows[0]["StationID"].ToString();
                        md.StockNo = dt.Rows[0]["StockNo"].ToString();
                        md.PartNo = dt.Rows[0]["PartNo"].ToString();
                        md.BatchNo = dt.Rows[0]["BatchNo"].ToString();
                        string newOneCode = string.Empty;
                        string newBarCode = string.Empty;
                        GetBarCode(md.StockNo, md.BatchNo, md.PartNo, ref newOneCode, ref newBarCode);
                        md.OneBarCode = newOneCode;
                        md.BarCode = newBarCode;
                        md.BoxNo = dt.Rows[0]["BoxNo"].ToString();
                        if (gv.SubItems.Count > 1)
                        {
                            md.Des1 = gv.SubItems[1].Text;
                        }

                        md.PrintType = 2;

                        //DataTable pdt = pbll.SearchIsImportByPartNo(md.PartNo);

                        DataTable pdt = pbll.SearchInfoByPartNo(md.PartNo);
                        if (pdt != null && pdt.Rows.Count > 0)
                        {
                            if (pdt.Rows[0]["isImport"].ToString() == "1")
                            {
                                md.Import = "国产料Kingfa";
                            }
                            else
                            {
                                md.Import = "";
                            }

                            ManufacturerName = pdt.Rows[0]["ManufacturerName"].ToString().Trim();
                            IsSupply = pdt.Rows[0]["IsSupply"].ToString();
                        }


                        //补打条码
                        string msg = bll.ReprintSave(md, Program.tableName, dt.Rows[0]["OneBarCode"].ToString(), dt.Rows[0]["BarCode"].ToString(), Program.station,"3");
                        if (!string.IsNullOrEmpty(msg))
                        {
                            MessageBox.Show($"补打失败,原因:" + msg);
                            return;
                        }
                        //if (bll.Add_Info_New(md, Program.tableName) == false)
                        //{
                        //    return;
                        //}
                        glacialList1.SelectedItems.Clear();
                        initBarCode();

                        #region 打印条码

                        //filename = System.AppDomain.CurrentDomain.BaseDirectory + "单个条码.grf";
                        filename = ManufacturerName.Contains("蔚来")
                            ? AppDomain.CurrentDomain.BaseDirectory +
                              "wl.grf"
                            : AppDomain.CurrentDomain.BaseDirectory +
                              PrintMoudleName(IsSupply, "Print" + Program.station + "_3102"); //new
                        if (md.PartNo.Contains("A2146982300") ||
                            md.PartNo.Contains("A2146982400"))
                        {
                            filename = AppDomain.CurrentDomain.BaseDirectory +
                                       "Sill.grf";
                        }

                        string partName = "";
                        DataTable dt2 = pbll.SearchInfoByPartNo(md.PartNo);
                        if (dt2 != null && dt2.Rows.Count > 0)
                        {
                            partName = dt2.Rows[0]["ProductName"].ToString();
                        }
                        else
                        {
                            partName = "";
                        }


                        //DataTable dt4 = plbll.SearchInfo(md.PartNo, md.StationID);
                        //if (dt4 != null && dt4.Rows.Count > 0)
                        //{
                        //    printName = "Printer" + dt4.Rows[0]["PrinterNo"].ToString();
                        //}
                        printName = "Printer" + _printNameDict[md.PartNo + md.StationID];

                        string reportName = ConfigurationManager.AppSettings[printName].ToString();
                        DataTable headTable = GetPrintHeadTable(md.PartNo, partName, md.OneBarCode, md.BarCode);


                        ReportHelper rp = new ReportHelper(filename, headTable, null,
                            (int)GRPaperOrientation.grpoPortrait, 1, reportName);
                        LogSysBLL.AddInfo(GetDateTime().ToString("yyyy/MM/dd HH:mm:ss") + md.OneBarCode, MethodBase.GetCurrentMethod());
                        rp.Report.Print(false);

                        #endregion
                    }
                }
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
            }
        }

        /// <summary>
        /// 补打箱单
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label16_Click(object sender, EventArgs e)
        {
            panel44.Visible = true;
        }

        /// <summary>
        /// 删除条码
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label15_Click(object sender, EventArgs e)
        {
            BarCodeBLL bll = new BarCodeBLL();
            BarCodeModel md = new BarCodeModel();

            try
            {
                if (glacialList1.SelectedItems.Count == 0)
                {
                    MessageBox.Show("请选择要删除的条码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return;
                }
                else
                {
                    DialogResult result = MessageBox.Show("确定删除条码?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
                    if (result == DialogResult.OK)
                    {
                        GlacialComponents.Controls.GLItem gv;
                        gv = glacialList1.SelectedItems[0] as GlacialComponents.Controls.GLItem;
                        md.BarCode = gv.Text;
                        string boxCode = (glacialList1.SelectedItems[0] as GlacialComponents.Controls.GLItem).SubItems[0].Tag?.ToString();
                        if(boxCode == lbPackageCodeL.Text?.Trim() || boxCode == lbPackageCodeR.Text?.Trim())
                        {
                            string msg = bll.DelBarCode(gv.Text?.Trim(), Program.tableName,true, boxCode);
                            if (!string.IsNullOrEmpty(msg))
                            {
                                MessageBox.Show(msg);
                            }
                            else
                            {
                                InitPackageInfo();
                            }
                            initBarCode();
                        }
                        else
                        {
                            MessageBox.Show($" 删除条码的箱码[{boxCode}]不属于当前装箱范围内,无法删除.!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            return;
                        }
                       
                    }
                }
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
            }
        }


        /// <summary>
        /// 补打装箱单确定按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                InjectionBoxBLL boxbll=new InjectionBoxBLL();
                InjectionBoxModel boxmd=new InjectionBoxModel();
                BarCodeBLL bll=new BarCodeBLL();
                ProductBLL pbll=new ProductBLL();
                PlasticBLL plbll= _plasticBLL;
                StationBLL sbll=new StationBLL();
                string filename = "", printName = "", printBoxName="",stationID="";
                 
                #region 验证输入合法性

                if (textBox3.Text.Trim() == "")
                {
                    MessageBox.Show("请输入箱单号", "提示", MessageBoxButtons.OK);
                    return;
                }

                DataTable dt = boxbll.SearchBox(textBox3.Text.Trim());
                if (dt != null && dt.Rows.Count > 0)
                {
                    DataTable dt1 = bll.SearchCountByBox(textBox3.Text.Trim(), Program.tableName);
                    if (dt1 != null && dt1.Rows.Count > 0)
                    {
                        #region 查找该箱单内容

                        filename = System.AppDomain.CurrentDomain.BaseDirectory + "装箱单.grf";
                        DataTable headTable = new DataTable();
                        headTable.Columns.Add("BoxNo");
                        headTable.Columns.Add("PartName");
                        headTable.Columns.Add("PartNo");
                        headTable.Columns.Add("BatchNo");
                        headTable.Columns.Add("PackCount");
                        headTable.Columns.Add("QLevel");
                        DataRow row = headTable.NewRow();

                        string[] box = textBox3.Text.Trim().Split('.');
                        row["BoxNo"] = textBox3.Text.Trim();
                        row["PartNo"] = box[0].Trim();

                        DataTable dt2 = pbll.SearchInfoByPartNo(row["PartNo"].ToString());
                        if (dt2 != null && dt2.Rows.Count > 0)
                        {
                            row["PartName"] = dt2.Rows[0]["ProductName"].ToString();
                        }

                        row["BatchNo"] = box[1].Trim();
                        row["PackCount"] = dt1.Rows[0]["SumCount"].ToString();
                        row["QLevel"] = dt2.Rows[0]["QLevel"].ToString();

                        #endregion

                        #region 保存箱单

                        boxmd.ID = Guid.NewGuid().ToString();
                        boxmd.BoxNo = textBox3.Text.Trim();
                        boxmd.IsFlag = 1;
                        boxmd.BoxCount = Convert.ToInt32(dt1.Rows[0]["SumCount"].ToString());

                        boxbll.AddInfo(boxmd);

                        #endregion

                        #region 打印箱单

                        #region 查询工位ID

                        DataTable sdt = sbll.SearchInfoByNo(Program.station);
                        if (sdt != null && sdt.Rows.Count > 0)
                        {
                            stationID = sdt.Rows[0]["StationID"].ToString();
                        }

                        #endregion

                        #region 查询打印机名称

                        //DataTable dt3 = plbll.SearchInfo(row["PartNo"].ToString(), stationID);
                        //if (dt3 != null && dt3.Rows.Count > 0)
                        //{
                        //    printName = "Printer" + dt3.Rows[0]["PrinterNo"].ToString();
                        //}
                        printName = "Printer" + _printNameDict[row["PartNo"].ToString() + stationID];

                        #endregion

                        printBoxName = "Printer" + (Convert.ToInt32(printName.Substring(7, 1)) + 2).ToString();
                        string reportName = ConfigurationManager.AppSettings[printBoxName].ToString();
                        headTable.Rows.Add(row);
                        SaveLog3(Program.station + "打印箱单:" + textBox3.Text.Trim());
                        ReportHelper rp = new ReportHelper(filename, headTable, null, (int)GRPaperOrientation.grpoLandscape, 1, reportName);

                        rp.Report.Print(false);

                        #endregion

                        panel44.Visible = false;
                        textBox3.Text = "";

                       
                    }
                }
                else
                {
                    MessageBox.Show("此箱单不存在,请重新输入", "提示", MessageBoxButtons.OK);
                    textBox3.Focus();
                    return;
                }

                #endregion
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            panel44.Visible = false;
            textBox3.Text = "";
        }

        /// <summary>
        /// 下一计划
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label14_Click(object sender, EventArgs e)
        {
            try
            {

                if (UnCompletePrintBox("切换下一计划","all") == false) return;

                InjectionPlanBLL planbll=new InjectionPlanBLL();
                
                #region 查询有无下一计划

                DataTable dt = planbll.NextSearchInfoByName(Program.station);
                if (dt != null && dt.Rows.Count > 1)
                { 
                    planID = dt.Rows[0]["InjectionPlanID"].ToString();
                    productID = dt.Rows[0]["ProductID"].ToString();
                    nextproductID = dt.Rows[1]["InjectionPlanID"].ToString();
                    panel45.Visible = true;
                    if (lbCurrentlQtyL.Text == "0" || string.IsNullOrEmpty(lbCurrentlQtyL.Text))
                    {
                        lbPackageCodeL.Text = "";
                    }
                    if (lbCurrentlQtyR.Text == "0" || string.IsNullOrEmpty(lbCurrentlQtyR.Text))
                    {
                        lbPackageCodeR.Text = "";
                    }

                    string[] partNo = dt.Rows[0]["PartNo"].ToString().Split(',');
                    for (int i = 0; i < partNo.Length; i++)
                    {
                        InitComboBoxSize(partNo[i], i, "");
                    }
                }
                else
                {
                    MessageBox.Show("暂无下一计划,请联系计划员!", "提示", MessageBoxButtons.OK);
                    return;
                }

                #endregion
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
            }
        }

        /// <summary>
        /// 切换模具
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            try
            {
                ModelInfoBLL bll=new ModelInfoBLL();
                ModelProductBLL mbll=new ModelProductBLL();
                InjectionPlanBLL ibll=new InjectionPlanBLL();
                InjectionPlanModel md=new InjectionPlanModel();
                ProductBLL productBll = new ProductBLL();
                string aa = "";
                string[] partNo = null; 
                

                #region 验证数据有效性  模具条码不全暂时先屏蔽

                if (textBox4.Text.Trim() == "")
                {
                    MessageBox.Show("请扫描模具条码!", "提示", MessageBoxButtons.OK);
                    textBox4.Focus();
                    return;
                }

                #endregion

                #region 判断模具编号是否存在 模具条码不全暂时先屏蔽

                DataTable dt5 = bll.SearchInfo(textBox4.Text.Trim());
                if (dt5 != null && dt5.Rows.Count > 0)
                {
                    #region 校验模具和下一计划是否匹配

                    DataTable nextdt = ibll.NextSearchInfoByName(Program.station);
                    if (nextdt != null && nextdt.Rows.Count > 1)
                    {
                        nextPlanID = nextdt.Rows[1]["InjectionPlanID"].ToString();
                        aa= nextdt.Rows[1]["PartNo"].ToString();
                        partNo = aa.Split(',');

                        DataTable dt1 = mbll.SearchInfo(textBox4.Text.Trim(), partNo[0]);
                        if (dt1 != null && dt1.Rows.Count > 0)
                        {
                            #region 更新上一计划为完成

                            md.InjectionPlanID = planID;
                            ibll.UpdateFinish(md);
                            if (!string.IsNullOrEmpty(nextPlanID) && nextPlanID != planID)
                            {
                                ibll.UpdatePlanStartTime(nextPlanID);
                            }

                            #endregion

                            panel45.Visible = false;
                            textBox4.Text = "";

                        }
                        else
                        {
                            MessageBox.Show("模具和计划不匹配!", "提示", MessageBoxButtons.OK);
                            textBox4.SelectAll();
                            textBox4.Focus();
                            return;
                        }
                        
                    }
                    else
                    { 
                        label12.Text = "暂无一下生产计划";
                        return;
                    }

                    

                    #endregion
                }
                else
                {
                    MessageBox.Show("模具条码不存在!", "提示", MessageBoxButtons.OK);
                    textBox4.Focus();
                    return;
                }

                #endregion

                panel45.Visible = false;

                #region 获取当前生产信息

                initPlan();

                #endregion
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            panel45.Visible = false;
            textBox4.Text = "";
        }

        /// <summary>
        /// 暂停打印
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label13_Click(object sender, EventArgs e)
        {
            try
            {
                
                if (label13.Text == "暂停打印")
                {
                   
                    DialogResult result = MessageBox.Show("确认暂停打印?", "提示", MessageBoxButtons.OKCancel,
                        MessageBoxIcon.Information);
                    if (result == DialogResult.OK)
                    {
                        if (UnCompletePrintBox("切换手动打印","all") == false) return;
                        opcGroup1.DataChange -= new DIOPCGroupEvent_DataChangeEventHandler(opcGroup1_DataChange);
                        cboxHandBox.Enabled = true;
                        opcServer.OPCGroups.RemoveAll();
                        opcServer.Disconnect();
                        //serialPort1.Close();
                        comboBox2.Enabled = true;
                        label23.Enabled = true;
                        label23.BackColor = System.Drawing.Color.DeepSkyBlue;
                        //if (ConfigurationManager.AppSettings["StationMode"].ToString() == "1")
                        //{
                        //    timer1.Enabled = false;
                        //}
                        //if (ConfigurationManager.AppSettings["StationMode"].ToString() == "2")
                        //{
                        //    serialPort1.Close();
                        //}
                        label13.Text = "开始打印";
                        label13.BackColor = System.Drawing.Color.Gray;
                    }
                    else
                    {
                        return;
                    }
                }

                else
                {
                   
                    DialogResult result = MessageBox.Show("确认开始打印?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
                    if (result == DialogResult.OK)
                    {
                        if (UnCompletePrintBox("切换自动打印","all") == false) return;

                        cboxHandBox.Enabled = false;
                        comboBox2.Enabled = false;
                        #region 连接PLC  
                        try
                        {
                            if (CreateServer())
                            {
                                if (ConnectServer(strHostIP, "Kepware.KEPServerEX.V6"))
                                {
                                    Connected = true;

                                    #region 创建组

                                    opcGroups = opcServer.OPCGroups;
                                    opcGroup1 = opcGroups.Add("Mould");
                                    SetGroupProperty(opcGroup1, _plcRate);

                                    #endregion

                                    #region 创建项

                                    opcItems1 = opcGroup1.OPCItems;
                                    opcItems1.DefaultIsActive = true;

                                    //PLCMouldBLL PLCbll = new PLCMouldBLL();
                                    //PLCBreakBLL bbll = new PLCBreakBLL();

                                    DataTable PLCdt = _PLCbll.SearchMould(Program.station);
                                    if (PLCdt != null && PLCdt.Rows.Count > 0)
                                    {
                                        opcItemm1 = new OPCItem[PLCdt.Rows.Count];
                                        for (int i = 0; i < PLCdt.Rows.Count; i++)
                                        {
                                            opcItemm1[i] = opcItems1.AddItem(PLCdt.Rows[i]["Address"].ToString(), i);
                                        }
                                    }

                                    Thread.Sleep(200);

                                    opcGroup1.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(opcGroup1_DataChange);


                                    #endregion
                                }
                                else
                                {
                                    MessageBox.Show("连接到OPC服务器失败!", "提示", MessageBoxButtons.OK);
                                    Connected = false;
                                    LogHelper.WriteLog("连接到OPC服务器失败!");
                                    return;
                                }
                            }
                            else
                            {
                                MessageBox.Show("创建OPC服务失败!", "提示", MessageBoxButtons.OK);
                                Connected = false;
                                LogHelper.WriteLog("创建OPC服务失败!");
                                return;
                            }
                           
                        }
                        catch(Exception ex)
                        {
                            MessageBox.Show("创建OPC服务失败!", "提示", MessageBoxButtons.OK);
                            Connected = false;
                            LogHelper.WriteLog("创建OPC服务失败!");
                            LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                            return;
                        }
                       

                        #endregion

                        label13.Text = "暂停打印";
                        label13.BackColor = System.Drawing.Color.DeepSkyBlue;
                        label23.Enabled = false;
                        label23.BackColor = System.Drawing.Color.Gray;
                        textBox2.Text = "";
                    }
                    else
                    {
                        return;
                    }
                }
                
            }
        
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
            }
        }

        /// <summary>
        /// 质量录入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label9_Click(object sender, EventArgs e)
        {
            FrmQuality fr = new FrmQuality();
            fr.QualityViewClosed += (arg1) =>
            {
                try
                {
                    InitPackageInfo();
                    initBarCode();
                    if (arg1.Contains(lbPackageCodeL.Text?.Trim()))
                    {
                        lbPackageCodeL.Text = "";
                        lbCurrentlQtyL.Text = "0";
                    }
                    else if (arg1.Contains(lbPackageCodeR.Text?.Trim()))
                    {
                        lbPackageCodeR.Text = "";
                        lbCurrentlQtyR.Text = "0";
                    }
                }
               catch(Exception ex)
                {
                    LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                }
            };
            fr.Show();
        }

        /// <summary>
        /// 停机录入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label10_Click(object sender, EventArgs e)
        {
            Form fr = new FrmDown();
            fr.Show();
        }

        
        private void timer2_Tick(object sender, EventArgs e)
        {
            Program.ProductDate = _barCodeBLL.GetServiceTime().ToString();
            //initPlan();
        }

        private void comboBox2_TextChanged(object sender, EventArgs e)
        {
            label12.Focus();
        }

        private void glacialList1_Click(object sender, EventArgs e)
        {
            try
            {
                if (glacialList1.SelectedItems.Count > 0)
                {
                    GlacialComponents.Controls.GLItem gv;
                    gv = glacialList1.SelectedItems[0] as GlacialComponents.Controls.GLItem;
                     Program.strBarCode = gv.Text;
                    //Program.strBoxCode = gv.SubItems[4].Text;
                    Program.strBoxCode = gv.SubItems[0].Tag?.ToString();
                }
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
            }

        }
        /// <summary>
        /// 每隔几秒,连接一下服务器,刷新一下当前计划
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void timer3_Tick(object sender, EventArgs e)
        {
            try
            {
                Ping p1 = new Ping();

                PingReply reply = p1.Send("10.60.101.60"); //发送主机名或Ip地址
                StringBuilder sbuilder;
                if (reply.Status == IPStatus.Success)
                {
                    status = true;
                    label2.BackColor = Color.LightGray;
                }
                else
                {
                    status = false;
                    label2.BackColor = Color.Red;
                }
                GetClass();
                //textBox1.Text = Program.ProductDate.Substring(2, 2) + Program.ProductDate.Substring(5, 2) +
                //                Program.ProductDate.Substring(8, 2);     //批次

                textBox1.Text = GetBatch(true);


                #region 获取当前生产信息

                initPlan();
                #endregion
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
            }

        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            Program.cc = comboBox1.Text;
        }



        private DateTime GetPrintTime(string station)
        {
            try
            {
                DateTime time = DateTime.Now;
                StationBLL bll = new StationBLL();

                DataTable dt = bll.SearchInfoByNo(station);
                if (dt != null && dt.Rows.Count > 0)
                {
                    if (string.IsNullOrEmpty(dt.Rows[0]["PrintTime"].ToString()))
                    {
                        time = DateTime.Now;
                    }
                    else
                    {
                        time = Convert.ToDateTime(dt.Rows[0]["PrintTime"].ToString());
                    }
                }

                return time;
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return DateTime.Now;
            }
        }



        private bool UpdatePrintTime(DateTime time, string station)
        {
            try
            {
                StationBLL bll = new StationBLL();
                return bll.UpdateTime(time, station);
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return false;
            }
        }

        private int GetSeconds(string station)
        {
            try
            {
                int seconds = 0;
                StationBLL bll = new StationBLL();

                DataTable dt = bll.SearchInfoByNo(station);
                if (dt != null && dt.Rows.Count > 0)
                {
                    if (string.IsNullOrEmpty(dt.Rows[0]["Seconds"].ToString()))
                    {
                        seconds = 0;
                    }
                    else
                    {
                        seconds = Convert.ToInt32(dt.Rows[0]["Seconds"].ToString());
                    }
                }

                return seconds;
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                return 0;
            }
        }

        /// <summary>
        /// 计算时间差
        /// </summary>
        /// <param name="t">时间1</param>
        /// <param name="t2">时间2</param>
        /// <returns>返回值:时间差(毫秒为单位)</returns>
        private long TimeDiff(DateTime t, DateTime t2)
        {
            long lReturn = -1;
            System.TimeSpan NowValue = new TimeSpan(t.Ticks);
            System.TimeSpan TimeValue = new TimeSpan(t2.Ticks);
            System.TimeSpan DateDiff = TimeSpan.Zero;
            try
            {
                //计算时间差
                //DateDiff = TimeValue.Subtract(NowValue).Duration();
                DateDiff = TimeValue.Subtract(NowValue);
                int hours = DateDiff.Hours;
                int minutes = DateDiff.Minutes;
                int seconds = DateDiff.Seconds;
                int milliseconds = DateDiff.Milliseconds;

                string TimeDiff = hours.ToString() + ":"
                                                   + minutes.ToString() + ":"
                                                   + seconds.ToString() + "."
                                                   + milliseconds.ToString();
                //是否比现在的时间小,如果小就设置成第二天再启动,否则当天启动
                if (hours <= 0 && minutes <= 0 && seconds <= 0 && milliseconds <= 0)
                    hours += 24;

                lReturn = hours * 3600
                          + minutes * 60
                          + seconds;
            }
            catch (Exception ex)
            {
                LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
            }
            return lReturn;
        }



        bool SaveBarCode(BarCodeModel bcm,string tableName, bool isAutoPrint,string mould, ref string errorMsg, bool handPrint = false)
        {
            Label lbPackageCode = lbPackageCodeL;
            Label lbCurrentlQty = lbCurrentlQtyL;
            Label lbNeedQty = lbNeedQtyL;
            //BarCodeModel lastFailedModel = null;
            if (mould == _leftType)
            {
                lbPackageCode = lbPackageCodeL;
                lbCurrentlQty = lbCurrentlQtyL;
                lbNeedQty = lbNeedQtyL;
                //lastFailedModel = _lastFailedModelL;
            }
            else
            {
                lbPackageCode = lbPackageCodeR;
                lbCurrentlQty = lbCurrentlQtyR;
                lbNeedQty = lbNeedQtyR;
                //lastFailedModel = _lastFailedModelR;
            }
            
            bool saveRst = true;
            //自动模式 或者手动模式选中绑定箱码
            if (isAutoPrint == true || (isAutoPrint==false && cboxHandBox.Checked ==true))
            {
                bcm.BoxNo = lbPackageCode.Text.Trim();
                bool isSuccess = false;
                DataTable dt = null;
                int realCount = 0;
                int sizeCount = 0;
                LocalDBService local = new LocalDBService(SqlHelper.GetConnSting());
                try
                {
                    
                    local.BeginTrans();
                    _barCodeBLL.Add_Info_New(local, bcm, Program.tableName, "1");

                    //更新箱单数量
                    //查询箱单数量 是否等于标包数量 等于的话清空lb显示  小于,数量值赋值给lb显示
                    if (_injectionBoxBLL.UpdateBoxCount(local, bcm.BoxNo, 1))
                    {
                        dt = _injectionBoxBLL.SearchBox(local, bcm.BoxNo);
                        if (dt.Rows.Count > 0)
                        {
                            string realCountStr = dt.Rows[0]["BoxCount"].ToString();
                            string sizeCountStr = lbNeedQty.Text.Trim();
                           
                            int.TryParse(realCountStr, out realCount);
                            int.TryParse(sizeCountStr, out sizeCount);

                            if ((realCount != 0 && realCount == sizeCount) || (isAutoPrint == false && handPrint == true))
                            {
                                lbPackageCode.Text = "";
                                lbCurrentlQty.Text = "0";
                                 
                                _wmsBll.SaveInterface(local, bcm.BoxNo, "", Program.station);
                                isSuccess = true;
                            }
                            else
                            {
                                lbCurrentlQty.Text = realCountStr;
                            }
                        }

                    }
                    //throw new Exception("资源被占用,死锁了测试");

                    local.Commit();
                }
                catch (Exception ex)
                {
                    if (local != null)
                    {
                        local.Rollback();
                    }
                    errorMsg = ex.Message;
                    //lastFailedModel = bcm;
                    if (mould == _leftType) {
                        _lastFailedModelL = bcm;
                    }
                    else
                    {
                        _lastFailedModelR = bcm;
                    }
                    saveRst = false;
                }
                finally
                {
                    if (local != null)
                    {
                        local.EndTrans();
                    }
                }

                //保存后打印箱单
                if (isSuccess)
                {
                    _lastBoxNoL = lbPackageCodeL.Text;
                    _lastBoxNoR = lbPackageCodeR.Text;

                    //打印箱码
                    PrintBoxCode(dt.Rows[0], realCount, mould);
                   // _lastBoxNo = lbPackageCodeL.Text;
                    lbPackageCodeL.Text = "";
                }
            }
            else
            {
                try
                {
                    //手动打印, 关闭打印箱码, 直接存条码记录.不处理其他
                    saveRst = _barCodeBLL.Add_Info_New(bcm, Program.tableName);
                    if (saveRst == false)
                    {
                        //lastFailedModel = bcm;
                        if (mould == _leftType)
                        {
                            _lastFailedModelL = bcm;
                        }
                        else
                        {
                            _lastFailedModelR = bcm;
                        }
                    }
                }
                catch(Exception ex)
                {
                    errorMsg = ex.Message;
                    //lastFailedModel = bcm;
                    if (mould == _leftType)
                    {
                        _lastFailedModelL = bcm;
                    }
                    else
                    {
                        _lastFailedModelR = bcm;
                    }
                }
                
            }

            return saveRst;
        }
        /// <summary>
        /// 初始加载箱码
        /// </summary>
        /// <param name="needInitComboxSize">初始加载箱码后,是否需要加载</param>
        void InitPackageInfo(bool needInitComboxSize = false)
        {
            DataTable dt0 = _injectionBoxBLL.SearchUnBox(Program.station, "0");
            if (dt0.Rows.Count > 0)
            {
                lbPackageCodeL.Text = dt0.Rows[0]["BoxNo"].ToString();
                lbCurrentlQtyL.Text = dt0.Rows[0]["BoxCount"].ToString();

                if(needInitComboxSize == true && !string.IsNullOrEmpty(lbPackageCodeL.Text))
                {
                    string[] array = lbPackageCodeL.Text.Split('.');
                    if (array.Length >0)
                    {
                        string standardQty = dt0.Rows[0]["StandardQty"].ToString();
                        InitComboBoxSize(array[0].Trim(), 0, standardQty);
                    }
                  
                }
                
            }
            DataTable dt1 = _injectionBoxBLL.SearchUnBox(Program.station, "1");
            if (dt1.Rows.Count > 0)
            {
                lbPackageCodeR.Text = dt1.Rows[0]["BoxNo"].ToString();
                lbCurrentlQtyR.Text = dt1.Rows[0]["BoxCount"].ToString();

                if (needInitComboxSize == true && !string.IsNullOrEmpty(lbPackageCodeR.Text))
                {
                    string[] array = lbPackageCodeR.Text.Split('.');
                    if (array.Length > 0)
                    {
                        string standardQty = dt1.Rows[0]["StandardQty"].ToString();
                        InitComboBoxSize(array[0].Trim(), 1, standardQty);
                    }
                }
            }
        }

        /// <summary>
        /// 打印箱码
        /// </summary>
        /// <param name="boxRow"></param>
        /// <param name="realCount"></param>
        /// <param name="mould"></param>
        private void PrintBoxCode(DataRow boxRow,int realCount,string mould)
        {
            SaveLog3(Program.station + "箱单打印mould="+ mould);
            string filename = System.AppDomain.CurrentDomain.BaseDirectory + "装箱单.grf";
            DataTable headTable = new DataTable();
            headTable.Columns.Add("BoxNo");
            headTable.Columns.Add("PartName");
            headTable.Columns.Add("PartNo");
            headTable.Columns.Add("BatchNo");
            headTable.Columns.Add("PackCount");
            headTable.Columns.Add("Line");
            DataRow row = headTable.NewRow();
            string boxCode = boxRow["BoxNo"].ToString();
            string[] boxes = boxCode.Split('.');
            if(boxes.Length != 4)
            {
                //新生成一个箱码  应该都有
            }
            else
            {
                row["BoxNo"] = boxCode;
                row["PartNo"] = boxes[0].Trim();
                row["PartName"] = boxRow["PartName"].ToString();
                row["BatchNo"] = boxes[1].Trim();
                row["PackCount"] = realCount;
                row["Line"] = boxRow["StationNo"].ToString()+"注塑机";
            }
            UpdateBoxRecordPrintState(boxCode);
            string printBoxName = string.Empty;
            if (mould == "1")
            {
                printBoxName = "Printer3";
            }
            else
            {
                printBoxName = "Printer4";
            }
          
            string reportName = ConfigurationManager.AppSettings[printBoxName].ToString();
            headTable.Rows.Add(row);

            SaveLog3(Program.station + "打印箱单:" + boxCode);
            ReportHelper rp = new ReportHelper(filename, headTable, null, (int)GRPaperOrientation.grpoLandscape, 1, reportName);

            rp.Report.Print(false);


        }

        private void UpdateBoxRecordPrintState(string UpdatePrinted)
        {
            _injectionBoxBLL.UpdatePrinted(UpdatePrinted);
        }

       
        /// <summary>
        /// 检查是否有箱码. 没有箱码,生成一个箱码
        /// </summary>
        /// <param name="partCode"></param>
        /// <param name="autoPrint"></param>
        private void CheckPackageCode(string partCode, bool autoPrint,string mould, string partName)
        {
            if (autoPrint == true || (autoPrint == false && cboxHandBox.Checked == true))
            {
                Label lbPackageCode = lbPackageCodeL;
                Label lbNeedQty = lbNeedQtyL;
                Label lbCurrentlQty = lbCurrentlQtyL;
                if (mould == _leftType)
                {
                    lbPackageCode = lbPackageCodeL;
                    lbNeedQty = lbNeedQtyL;
                    lbCurrentlQty = lbCurrentlQtyL;
                }
                else
                {
                    lbPackageCode = lbPackageCodeR;
                    lbNeedQty = lbNeedQtyR;
                    lbCurrentlQty = lbCurrentlQtyR;
                }
                string pkgCode = lbPackageCode.Text.Trim();

               

                if (string.IsNullOrEmpty(pkgCode))
                {
                    string packageCode = GetPackageCode(partCode, autoPrint);
                    InjectionBoxModel boxmd = new InjectionBoxModel();
                    boxmd.ID = Guid.NewGuid().ToString();
                    boxmd.BoxNo = packageCode;
                    boxmd.BoxCount = 0;
                    boxmd.BoxType = 0;
                    boxmd.IsFlag = 0;
                    boxmd.StationNo = Program.station;
                    boxmd.PartName = partName;

                    boxmd.Mould = mould;
                    boxmd.StandardQty = lbNeedQty.Text;
                    if (_injectionBoxBLL.AddInfo(boxmd))
                    {
                        lbPackageCode.Text = packageCode;
                    }
                }
                else
                {
                    #region 如果零件号和箱码不匹配,重新生成箱码,打印前一箱并关闭
                    if (!string.IsNullOrEmpty(pkgCode) && pkgCode.Contains(partCode) == false)
                    {
                        DataTable dt = _injectionBoxBLL.SearchBox(pkgCode);
                        MessageBox.Show($"箱码[{pkgCode}]产品与当前产品[{partCode}]不匹配,将会打印上一箱码,请知悉!");
                        CompleteBoxAndPrint(dt.Rows[0], mould, lbPackageCode, lbCurrentlQty);

                        string packageCode = GetPackageCode(partCode, autoPrint);
                        InjectionBoxModel boxmd = new InjectionBoxModel();
                        boxmd.ID = Guid.NewGuid().ToString();
                        boxmd.BoxNo = packageCode;
                        boxmd.BoxCount = 0;
                        boxmd.BoxType = 0;
                        boxmd.IsFlag = 0;
                        boxmd.StationNo = Program.station;
                        boxmd.PartName = partName;

                        boxmd.Mould = mould;
                        boxmd.StandardQty = lbNeedQty.Text;
                        if (_injectionBoxBLL.AddInfo(boxmd))
                        {
                            lbPackageCode.Text = packageCode;
                        }
                    }
                    #endregion
                }
            }
              
        }

        /// <summary>
        /// 20位注塑条码
        /// </summary>
        /// <param name="stockNo"></param>
        /// <param name="partNo"></param>
        /// <param name="autoPrint"></param>
        /// <param name="mould"></param>
        /// <param name="newOneCode"></param>
        /// <param name="newCode"></param>
        void GetSjBarCode(string stockNo,string partNo, bool autoPrint,string mould,string partName,string printTest, ref string newOneCode,ref string newCode)
        {
            CheckPackageCode(partNo, autoPrint, mould, partName);

            string batch = GetBatch(autoPrint);
            GetBarCode(stockNo, batch, partNo, ref newOneCode, ref newCode);

            if (!string.IsNullOrEmpty(printTest))
            {
                SaveLog3("BarCodePrint:"+ Program.station  + ":" + printTest + "_" + newOneCode);
            }
            // newOneCode = _uniqueBll.GetSjBarCodeSerialNo(stockNo, batch);
            //newCode = partNo + "." + batch + "." + newOneCode.Substring(newOneCode.Length - 4, 4);
        }
        void GetBarCode(string stockNo,string batch,string partNo,ref string newOneCode, ref string newCode)
        {
            newOneCode = _uniqueBll.GetSjBarCodeSerialNo(stockNo, batch);
            newCode = partNo + "." + batch + "." + newOneCode.Substring(newOneCode.Length - 4, 4);
        }

        string GetPackageCode(string partNo,bool autoPrint )
        {
            string batch = GetBatch(autoPrint);
            string packageSize = lbNeedQtyL.Text.Trim();
            if (string.IsNullOrEmpty(packageSize))
            {
                packageSize = "1";
            }
            
            string packageCode = _uniqueBll. GetPackageCodeSerialNo(partNo, batch, packageSize);
            return packageCode;

        }
        string GetBatch(bool isAutoPrint)
        {
            string batch = string.Empty;
            if (isAutoPrint)
            {
                DateTime dt = DateTime.Now;
                if(DateTime.TryParse(Program.ProductDate, out dt) ==false)
                {
                    dt = DateTime.Now;
                }
                batch = dt.ToString("yyMMdd");
               // batch = Program.ProductDate.Substring(2, 2) + Program.ProductDate.Substring(5, 2) + Program.ProductDate.Substring(8, 2);
            }
            else
            {
                batch = textBox1.Text.Trim();
            }
            return batch;
        }
        private object _selectItemL = null;
        bool _isShowHintL = true;

        private object _selectItemR = null;
        bool _isShowHintR = true;
        private void comBoxSizeL_SelectedValueChanged(object sender, EventArgs e)
        {
            //TimeSpan interval = DateTime.Now - _loginTime;
            //if (interval.Minutes > 0)
            if(_isLoad == true)
            {
                if (_isShowHintL)
                {
                    DialogResult result = MessageBox.Show("确认切换当前包装箱规格?", "提示", MessageBoxButtons.OKCancel,
                        MessageBoxIcon.Information);
                    if (result == DialogResult.OK)
                    {
                        if (UnCompletePrintBox("切换包装规格","left") == false) 
                        {
                            _isShowHintL = false;
                            comBoxSizeL.SelectedItem = _selectItemL;
                            _isShowHintL = true;
                            return; 
                        }

                        string val = comBoxSizeL.SelectedValue?.ToString();
                        int i = 0;
                        int.TryParse(val, out i);
                        if (i > 0)
                        {
                            lbNeedQtyL.Text = i.ToString();
                        }
                    }
                    else
                    {
                        if (_selectItemL != null)
                        {
                            _isShowHintL = false;
                            comBoxSizeL.SelectedItem = _selectItemL;
                            _isShowHintL = true;
                        }

                    }
                }
                
            }
            else
            {
                string val = comBoxSizeL.SelectedValue?.ToString();
                int i = 0;
                int.TryParse(val, out i);
                if (i > 0)
                {
                    lbNeedQtyL.Text = i.ToString();
                }
                _selectItemL = comBoxSizeL.SelectedItem;
            }
            comBoxSizeL.Enabled = false;
        }
        private void comBoxSizeR_SelectedValueChanged(object sender, EventArgs e)
        {
            //TimeSpan interval = DateTime.Now - _loginTime;
            //if (interval.Minutes > 0)
              if (_isLoad == true)
                {
                if (_isShowHintR)
                {
                    DialogResult result = MessageBox.Show("确认切换当前包装箱规格?", "提示", MessageBoxButtons.OKCancel,
                           MessageBoxIcon.Information);
                    if (result == DialogResult.OK)
                    {
                        if (UnCompletePrintBox("切换包装规格", "right") == false)
                        {
                            _isShowHintR = false;
                            comBoxSizeR.SelectedItem = _selectItemR;
                            _isShowHintR = true;
                            return;
                        }

                        string val = comBoxSizeR.SelectedValue?.ToString();
                        int i = 0;
                        int.TryParse(val, out i);
                        if (i > 0)
                        {
                            lbNeedQtyR.Text = i.ToString();
                        }
                    }
                    else
                    {
                        if (_selectItemR != null)
                        {
                            _isShowHintR = false;
                            comBoxSizeR.SelectedItem = _selectItemR;
                            _isShowHintR = true;
                        }

                    }
                }
                   
            }
            else
            {
                string val = comBoxSizeR.SelectedValue?.ToString();
                int i = 0;
                int.TryParse(val, out i);
                if (i > 0)
                {
                    lbNeedQtyR.Text = i.ToString();
                }
                _selectItemR = comBoxSizeR.SelectedItem;
            }
            comBoxSizeR.Enabled = false;


        }
        void CheckPackageSelect()
        {
            string txt = lbNeedQtyL.Text;
            int i = 0;
            if(_isPrintPackage)
            {
                int.TryParse(txt, out i);
                if(i == 0)
                {
                    List<string> list = comBoxSizeL.DataSource as List<string>;
                    if (list.Count > 0)
                    {
                        lbNeedQtyL.Text = list[0];
                    }
                    else
                    {
                        lbNeedQtyL.Text = "30";
                        MessageBox.Show("当前生产计划[未选择装箱规格],默认设置为30, 如果与实际不符合,请尽快作出选择. ");
                        
                    }
                    //throw new Exception("未选择装箱规格,请选择. ");
                    //MessageBox.Show("未选择装箱规格,请选择. ");
                }
            }
        }

        private void lbCurrentlQty_Click(object sender, EventArgs e)
        {
            string boxCode  = "";
            Label lb = sender as Label;
            if(lb.Name == "lbCurrentlQtyL")
            {
                boxCode = lbPackageCodeL.Text?.Trim();
            }
            else
            {
                boxCode = lbPackageCodeR.Text?.Trim();
            }
            if (string.IsNullOrEmpty(boxCode)) return;

            FrmPackageDetail frmPackageDetail = new FrmPackageDetail(boxCode);
            frmPackageDetail.ShowDialog();
        }
     

        /// <summary>
        /// 直供件条码  A2478852600#Q02#240826#001#
        /// </summary>
        /// <param name="partNo"></param>
        /// <param name="qLevel"></param>
        /// <param name="newCode"></param>
        void GetSupplyCode(string stockNo, string partNo,string qLevel, bool autoPrint,string mould,string partName, ref string newOneCode, ref string newCode)
        {
            string batch = string.Empty;
            if (autoPrint)
            {
               // batch = Program.ProductDate.Substring(2, 2) + Program.ProductDate.Substring(5, 2) + Program.ProductDate.Substring(8, 2);
                batch = GetBatch(true);
            }
            else
            {
                batch = textBox1.Text.Trim();
            }
            newCode = _uniqueBll.GetSupplySerialNo(partNo, qLevel, batch);
            newOneCode = _uniqueBll.GetSjBarCodeSerialNo(stockNo, batch);

            CheckPackageCode(partNo, autoPrint, mould, partName);
        }

        private void btnHandPrintL_Click(object sender, EventArgs e)
        {
            UnCompletePrintBox("手动打印箱码","left");
        }

        private void btnHandPrintR_Click(object sender, EventArgs e)
        {
            UnCompletePrintBox("手动打印箱码","right");
        }

        bool? lastCheckState = null;
        /// <summary>
        /// 手动打码是否打印箱码
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cboxHandBox_CheckedChanged(object sender, EventArgs e)
        {
            if (cboxHandBox.Enabled == false)
            {
                return;
            }
                string display = "";
                if (cboxHandBox.Checked)
                {
                    display = "绑定";
                    cboxHandBox.Tag = "true";
                }
                else
                {
                    display = "解绑";
                    cboxHandBox.Tag = "false";
                }
            if (lastCheckState != cboxHandBox.Checked)
            {
                DialogResult result = MessageBox.Show($"确认手打条码与箱码{display}?", "提示", MessageBoxButtons.OKCancel,
                    MessageBoxIcon.Information);
                if (result == DialogResult.OK)
                {
                    if (UnCompletePrintBox("手打条码与箱码" + display,"all") == false)
                    {


                        if (cboxHandBox.Checked == true)
                        {
                            lastCheckState = false;
                            cboxHandBox.Checked = false;
                        }
                        else
                        {
                            lastCheckState = true;
                            cboxHandBox.Checked = true;
                        }

                    }
                    else
                    {
                        if (cboxHandBox.Checked == true)
                        {
                            lastCheckState = true;
                        }
                        else
                        {
                            lastCheckState = false;
                        }
                    }

                }
                else
                {

                    if (cboxHandBox.Checked == true)
                    {
                        lastCheckState = false;
                        cboxHandBox.Checked = false;
                    }
                    else
                    {
                        lastCheckState = true;
                        cboxHandBox.Checked = true;
                    }
                }


            }
            comboBox2_SelectedValueChanged(null, null);

        }

        /// <summary>
        /// 用户双击
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label7_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            string cs = ConfigurationManager.AppSettings["测试"];
            if (!string.IsNullOrEmpty(cs) && cs == "true")
            {
                timer3.Enabled = false;
                //调用测试
                Array a = null;
                Array b = new string[] { "1", "2", "3", "4", "5" };
                Array c = null;
                Array d = null;
                status = true;
                IsTest = true;
                bool bbb = true;
                //label23_Click(null, null);
                //textBox1.Text = Program.ProductDate.Substring(2, 2) + Program.ProductDate.Substring(5, 2) +
                //                            Program.ProductDate.Substring(8, 2);
                textBox1.Text = GetBatch(true);
                if (bbb == true)
                {   //自动
                    opcGroup1_DataChange(1, 1, ref a, ref b, ref c, ref d);
                }
                else
                {   //手动
                    label23_Click(null, null);
                }
            }

        }
        bool IsTest = false;
        /// <summary>
        /// 工位双击
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void label5_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            string cs = ConfigurationManager.AppSettings["测试"];
            if (!string.IsNullOrEmpty(cs) && cs == "true")
            {
                timer3.Enabled = false;
            }
        }
        /// <summary>
        /// 未满器具打箱码 变更规格型号,手工打印箱码,切换下一计划,手动自动切换
        /// </summary>
        /// <param name="lable"></param>
        /// <returns></returns>
        bool UnCompletePrintBox(string lable,string  leftOrRight,bool needConfirm = true)
        {
            string boxCodeL = lbPackageCodeL.Text?.Trim();
            string boxCodeR = lbPackageCodeR.Text?.Trim();

            if(leftOrRight == "left" || leftOrRight == "all")
            {
                if (!string.IsNullOrEmpty(boxCodeL))
                {
                    DataTable dt = _injectionBoxBLL.SearchBox(boxCodeL);
                    if (dt.Rows.Count > 0 && dt.Rows[0]["IsPrint"].ToString() == "0" && int.Parse(dt.Rows[0]["BoxCount"].ToString()) > 0)
                    {
                        if (needConfirm)
                        {
                            if (MessageBox.Show($"当前箱码[{boxCodeL}]未满器具,执行[{lable}]操作,该箱码会被设置为完成状态,是否继续?", "未满器具提醒", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
                            {
                                return false;
                            }
                        }
                       
                        CompleteBoxAndPrint(dt.Rows[0], "0", lbPackageCodeL, lbCurrentlQtyL);
                        lbPackageCodeL.Text = "";
                        comBoxSizeL.SelectedIndex = -1;
                        lbNeedQtyL.Text = "0";
                    }
                }
            }
            if (leftOrRight == "right" || leftOrRight == "all")
            {
                if (!string.IsNullOrEmpty(boxCodeR))
                {
                    DataTable dt = _injectionBoxBLL.SearchBox(boxCodeR);
                    if (dt.Rows.Count > 0 && dt.Rows[0]["IsPrint"].ToString() == "0" && int.Parse(dt.Rows[0]["BoxCount"].ToString()) > 0)
                    {
                        if (needConfirm)
                        {
                            if (MessageBox.Show($"当前箱码[{boxCodeR}]未满器具,执行[{lable}]操作,该箱码会被设置为完成状态,是否继续?", "未满器具提醒", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
                            {
                                return false;
                            }
                        }
                            
                         CompleteBoxAndPrint(dt.Rows[0], "1", lbPackageCodeR, lbCurrentlQtyR);
                        lbPackageCodeR.Text = "";
                        comBoxSizeR.SelectedIndex = -1;
                        lbNeedQtyR.Text = "0";
                    }
                }
            }
            
            return true;
        }
        /// <summary>
        /// 完成箱单并打印箱单
        /// </summary>
        bool CompleteBoxAndPrint(  DataRow boxRow,string mould, Label lbPackageCode, Label lbCurrentlQty)
        {
            try
            {
                lbPackageCode.Text = "";
                lbCurrentlQty.Text = "0";

                string rst = _wmsBll.SaveInterface(boxRow["BoxNo"].ToString(), "", "", MESClassLibrary.Enum.WmsInterfaceEnum.塑件箱码报工, Program.station);
                if (string.IsNullOrEmpty(rst))
                {
                    PrintBoxCode(boxRow, int.Parse(boxRow["BoxCount"].ToString()), mould);
                }
                else
                {
                    MessageBox.Show("CompleteBoxAndPrint" + rst);
                    return false;
                }
                return true;
            }
            catch(Exception ex)
            {
                LogErrBLL.AddInfo(Program.station + "完成箱单并打印箱单发生错误," + ex.ToString(), MethodBase.GetCurrentMethod());
                return false;
            }
        }

        private void btnChangeSizeL_Click(object sender, EventArgs e)
        {
            ChangeSize("0");
        }

        private void btnChangeSizeR_Click(object sender, EventArgs e)
        {
            ChangeSize("1");
        }
        void ChangeSize(string moudel)
        {
            if(moudel == "0")
            {
                string pcd = lbPackageCodeL.Text?.Trim();
                if (!string.IsNullOrEmpty(pcd))
                {
                    MessageBox.Show($"请先完成左箱码[{pcd}]装箱后,再进行切换.");
                    return;
                }
            }
            else
            {
                string pcd = lbPackageCodeR.Text?.Trim();
                if (!string.IsNullOrEmpty(pcd))
                {
                    MessageBox.Show($"请先完成右箱码[{pcd}]装箱后,再进行切换.");
                    return;
                }
            }
            string pass = _basicBLL1.GetInjectionChangedSizePass();
            Form frm = new Form();
            frm.Size = new Size(400, 300);
            frm.StartPosition = FormStartPosition.CenterParent;
            TextBox tb = new TextBox();
            tb.Width = 300;
            tb.Location = new System.Drawing.Point(30, 30);
            tb.PasswordChar = '#';
            Button bt = new Button();
            bt.Width = 100;
            bt.Text = "确定";
            bt.Margin = new Padding(40, 100, 0, 0);
            bt.Location = new System.Drawing.Point(100, 171);
            bt.Click += (arg1, arg2) => {
                frm.Close();
                string s = tb.Text;
                if(s == pass)
                {
                    if(moudel == "0")
                    {
                        comBoxSizeL.Enabled = true;
                    }
                    else
                    {
                        comBoxSizeR.Enabled = true;
                    }
                }
                else
                {
                    MessageBox.Show("密码错误");
                }
            };
            frm.Controls.Add(tb);
            frm.Controls.Add(bt);
            frm.ShowDialog();

          
        }

        private void btnOnlyBarCode_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("确定切换为单条码模式?", "切换确认", MessageBoxButtons.OKCancel) == DialogResult.Cancel) return;
            try
            {
                if (UnCompletePrintBox("切换单条码模式", "all") == false) return;

                if(Program.station == "IM18")
                {
                    SaveLog3($"IM18切换从箱码模式切换单条码模式,箱码[{ lbPackageCodeL.Text?.Trim()}],左实际数量[{lbCurrentlQtyL.Text?.Trim()}],右实际数量[{lbCurrentlQtyR.Text?.Trim()}]");
                }
                try
                {
                    this.FormClosed += (arg1, arg2) => {
                  
                    opcGroup1.DataChange -= new DIOPCGroupEvent_DataChangeEventHandler(opcGroup1_DataChange);
                    opcServer.OPCGroups.RemoveAll();
                    opcServer.Disconnect();
                    serialPort1.Close();
                    FrmMain2411 frm = new FrmMain2411();
                    frm.Show();
                    };
                    
                    this.Close();
                }
                catch
                {

                }
            }
            catch(Exception ex)
            {

            }
            
           
        }
       
        private void comboBox2_SelectedValueChanged(object sender, EventArgs e)
        {
            if (cboxHandBox.Checked == false) return;
            if (label13.Text == "暂停打印") return;

            string s = comboBox2.SelectedValue?.ToString();
            ProductBLL pbll = new ProductBLL();
            DataTable pdt = pbll.SearchInfoByName(comboBox2.Text, "2000");
            if (pdt != null && pdt.Rows.Count > 0)
            {
                string partNo = pdt.Rows[0]["PartNo"].ToString().Trim();
                //stockNo = pdt.Rows[0]["StockNo"].ToString().Trim();
                //ManufacturerName = pdt.Rows[0]["ManufacturerName"].ToString().Trim();

                string currentSize = string.Empty;
                List<string> list = GetProductBoxSize(partNo, ref currentSize);

                    comBoxSizeL.DataSource = list;
                    comBoxSizeL.SelectedItem = currentSize;
                    _selectItemL = currentSize;
                    int j = 0;
                    int.TryParse(currentSize, out j);
                    if (j > 0)
                    {
                        lbNeedQtyL.Text = j.ToString();
                    }
            }
            else
            {
                MessageBox.Show($"零件[{comboBox2.Text}]在系统中不存在!");
                return;
            }

            

        }

        string PrintMoudleName(string isSupply = "0",string invokeInfo ="")
        {
            return BussinessHelper.PrintMoudleName(Program.station, isSupply);

            //if("IM05,IM08,IM10".Contains(Program.station)) //二维小条码
            //{
            //    return "单个条码2.grf";
            //}
            //else if ("IM06,IM07,IM09,IM11,IM12,".Contains(Program.station)) //一维条码
            //{
            //    return "单个条码.grf";
            //}
           
            //else if ("IM01,IM02,IM03,IM04,IM15,IM18,IM20".Contains(Program.station)) //小米大条码
            //{
            //    return "Sill.grf";
            //}
            //else if ("IM13,IM14".Contains(Program.station)) //直供条码
            //{
            //    if(isSupply == "0") //13,14机台,直供件打二维码 非直供件打一维码
            //    {
            //        return "单个条码.grf";
            //    }
            //    else
            //    {
            //        return "单个条码2.grf";
            //    }
                
            //}
            //else
            //{
            //    return "单个条码2.grf";
            //}

        }
        DataTable GetPrintLableModel()
        {
            DataTable headTable = new DataTable();
            headTable.Columns.Add("PrintTime");
            headTable.Columns.Add("PartNo");
            headTable.Columns.Add("PartName");
            headTable.Columns.Add("OneBarCode");
            headTable.Columns.Add("BarCode");
            headTable.Columns.Add("Station");
            return headTable;
        }
        DataTable GetPrintHeadTable(string partNo,string partName,string oneBarCode,string barCode)
        {
            DataTable headTable = GetPrintLableModel();
            DataRow row = headTable.NewRow();
            row["PrintTime"] =
                GetDateTime().ToString("yyyy/MM/dd HH:mm:ss");
            row["PartNo"] = partNo;
            row["PartName"] = partName;
            row["OneBarCode"] = oneBarCode;
            row["BarCode"] = barCode;
            row["Station"] = Program.station;
            headTable.Rows.Add(row);
            return headTable;
        }
        /// <summary>
        /// 补打左侧上一箱单
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_lastBoxPrintL_Click(object sender, EventArgs e)
        {
            InjectionBoxBLL boxbll = new InjectionBoxBLL();
            DataRow dr = boxbll.SearchNewPrintedBoxInfo(Program.station, "0");
            if(dr == null)
            {
                MessageBox.Show("没找到上一个箱码");
                return;
            }
            PrintBoxCode(dr, int.Parse(dr["BoxCount"].ToString()), "0");
           

        }

        private void btn_lastBoxPrintR_Click(object sender, EventArgs e)
        {
            InjectionBoxBLL boxbll = new InjectionBoxBLL();
            DataRow dr = boxbll.SearchNewPrintedBoxInfo(Program.station, "1");
            if (dr == null)
            {
                MessageBox.Show("没找到上一个箱码");
                return;
            }
            PrintBoxCode(dr, int.Parse(dr["StandardQty"].ToString()), "1");
        }

        List<string> GetProductBoxSize(string productCode,ref string currentSize)
        {
            try
            {
                ProductBLL productBll = new ProductBLL();
                DataTable dt = productBll.SearchInfoByPartNo(productCode);
                if (dt.Rows.Count == 0)
                {
                    currentSize = "30";
                    MessageBox.Show($"零件号{productCode}未设置标包,默认为30,请及时核对后进行配置.");
                    return null;
                }
                currentSize = dt.Rows[0]["PackCount"].ToString();
                string sizeStr = dt.Rows[0]["PackCountSize"].ToString();
                List<string> list = new List<string>();
                if (string.IsNullOrEmpty(sizeStr) || sizeStr =="0")
                {
                    list.Add(currentSize);
                    return list;
                }
                else
                {
                    string[] array = sizeStr.Split(',');
                    foreach (string item in array)
                    {
                        if (!list.Contains(item))
                        {
                            list.Add(item);
                        }
                    }
                    if (!list.Contains(currentSize))
                    {
                        list.Add(currentSize);
                    }
                }
                return list;
            }
            catch(Exception ex)
            {
                currentSize = "24";
                List<string> list = new List<string>(); 
                list.Add(currentSize);
                MessageBox.Show("零件号{productCode}未设置标包,默认为24,请及时核对后进行配置.");
                return list;
            }
           
        }

        private void label5_Click(object sender, EventArgs e)
        {

        }
        /// <summary>
        /// 设备状态
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lbDevState_Click(object sender, EventArgs e)
        {
            if(lbDevState.Text == "设备已连接")
            {
                if (MessageBox.Show("确认断开设备连接?", "设备断开确认", MessageBoxButtons.OKCancel) == DialogResult.Cancel) return;
                lbDevState.Text = "设备已断开";
                lbDevState.BackColor = Color.Red;
                opcGroup1.DataChange -= new DIOPCGroupEvent_DataChangeEventHandler(opcGroup1_DataChange);
                opcServer.OPCGroups.RemoveAll();
                opcServer.Disconnect();
                serialPort1.Close();
                timer3.Enabled = false;
            }
            else
            {
                if (MessageBox.Show("确认连接到注塑设备?", "设备连接确认", MessageBoxButtons.OKCancel) == DialogResult.Cancel) return;
               
                try
                {
                    if (CreateServer())
                    {
                        if (ConnectServer(strHostIP, "Kepware.KEPServerEX.V6"))
                        {
                            Connected = true;

                            #region 创建组

                            opcGroups = opcServer.OPCGroups;
                            opcGroup1 = opcGroups.Add("Mould");
                            SetGroupProperty(opcGroup1, _plcRate);

                            #endregion

                            #region 创建项

                            opcItems1 = opcGroup1.OPCItems;
                            opcItems1.DefaultIsActive = true;

                            //PLCMouldBLL PLCbll = new PLCMouldBLL();
                            //PLCBreakBLL bbll = new PLCBreakBLL();

                            DataTable PLCdt = _PLCbll.SearchMould(Program.station);
                            if (PLCdt != null && PLCdt.Rows.Count > 0)
                            {
                                opcItemm1 = new OPCItem[PLCdt.Rows.Count];
                                for (int i = 0; i < PLCdt.Rows.Count; i++)
                                {
                                    opcItemm1[i] = opcItems1.AddItem(PLCdt.Rows[i]["Address"].ToString(), i);
                                }
                            }

                            Thread.Sleep(200);

                            opcGroup1.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(opcGroup1_DataChange);

                          
                            #endregion
                        }
                        else
                        {
                            MessageBox.Show("连接到OPC服务器失败!", "提示", MessageBoxButtons.OK);
                            Connected = false;
                            LogHelper.WriteLog("连接到OPC服务器失败!");
                            return;
                        }

                        lbDevState.Text = "设备已连接";
                        lbDevState.BackColor = Color.DeepSkyBlue;
                        timer3.Enabled = true;
                    }
                    else
                    {
                        MessageBox.Show("创建OPC服务失败!", "提示", MessageBoxButtons.OK);
                        Connected = false;
                        LogHelper.WriteLog("创建OPC服务失败!");
                        return;
                    }

                }
                catch (Exception ex)
                {
                    MessageBox.Show("创建OPC服务失败!", "提示", MessageBoxButtons.OK);
                    Connected = false;
                    LogHelper.WriteLog("创建OPC服务失败!");
                    LogErrBLL.AddInfo(ex.ToString(), MethodBase.GetCurrentMethod());
                    return;
                }

            }
        }

        void SaveLog(string txt)
        {
            //try
            //{
            //    LogSysBLL.AddInfo(txt, MethodBase.GetCurrentMethod());

            //}
            //catch (Exception ex)
            //{
            //    LogHelper.WriteLog("SaveLog:" + ex.Message);
            //}
        }
        void SaveLog2(string txt)
        {
            try
            {
                LogSysBLL.AddInfo(txt, MethodBase.GetCurrentMethod());

            }
            catch (Exception ex)
            {
                LogHelper.WriteLog("SaveLog:" + ex.Message);
            }
        }
        void SaveLog3(string txt)
        {
            try
            {
                LogSysBLL.AddInfo(txt, MethodBase.GetCurrentMethod());

            }
            catch (Exception ex)
            {
                LogHelper.WriteLog("SaveLog:" + ex.Message);
            }
        }
        private BarCodeModel _lastFailedModelL = null;
        private BarCodeModel _lastFailedModelR = null;
        bool SaveInfo(BarCodeModel md, bool isAutoPrint, string mould, bool handPrint, ref string errMsg)
        {
            if (_lastFailedModelL != null && mould == "0")
            {
                SaveBarCode(_lastFailedModelL, Program.tableName, isAutoPrint, mould, ref errMsg, handPrint);
                _lastFailedModelL = null;
            }
            if (_lastFailedModelR != null && !string.IsNullOrEmpty(mould) && mould != "0")
            {
                SaveBarCode(_lastFailedModelR, Program.tableName, isAutoPrint, mould, ref errMsg, handPrint);
                _lastFailedModelR = null;
            }

           bool rst =  SaveBarCode(md, Program.tableName, isAutoPrint, mould, ref errMsg, handPrint);

            //if (SaveBarCode(md, Program.tableName, isAutoPrint, mould, ref errMsg, handPrint) == false)
            //{
            //    int a = 0;
            //    for (int l = 0; l < 3; l++)
            //    {
            //        // if (brbll.Add_Info_New(md, Program.tableName))
            //        if (SaveBarCode(md, Program.tableName, true, mould, ref errMsg, handPrint) == true)
            //        {
            //            break;
            //        }

            //        a += 1;
            //        //Thread.Sleep(200);
            //        Thread.Sleep(200);
            //    }

            //    if (a >= 2)
            //    {
            //        SaveLog3(Program.station + "保存3次失败,条码" + md.OneBarCode);
            //        return false;
            //    }
            //}
            return rst;
        }

    }
}