using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using LabelManager2;
using UAS_LabelMachine.PublicMethod;
using UAS_LabelMachine.Entity;
using UAS_特殊解析规则;
using UAS_LabelMachine.PublicForm;
using System.Threading;
using System.IO;
using System.Globalization;
using System.Threading.Tasks;

namespace UAS_LabelMachine
{
    public partial class UAS_出货标签打印 : Form
    {
        //自适应屏幕
        AutoSizeFormClass asc = new AutoSizeFormClass();

        DataHelper dh;

        DataTable dt;
        /// <summary>
        /// 已经打印过的Vivo外箱号
        /// </summary>
        List<string> PrintedVivoOutboxCode = new List<string>();
        StringBuilder sql = new StringBuilder();
        /// <summary>
        /// CodeSoft新建打印机引擎
        /// </summary>
        ApplicationClass lbl;
        /// <summary>
        /// 单盘打印文件
        /// </summary>
        Document SingleDoc;
        /// <summary>
        /// 中盒打印文件
        /// </summary>
        Document MidDoc;
        /// <summary>
        /// 外箱打印文件
        /// </summary>
        Document OutBoxDoc;
        /// <summary>
        /// Loading窗口
        /// </summary>
        SetLoadingWindow stw;
        /// <summary>
        /// 弹窗线程
        /// </summary>
        Thread thread;
        /// <summary>
        /// 当前品牌
        /// </summary>
        string Brand;
        string PI_ID;
        /// <summary>
        /// 当前扫描的项目
        /// </summary>
        int CurrentItemIndex = 0;
        /// <summary>
        /// 当前扫描的所在行
        /// </summary>
        int CurrentRowIndex = 0;
        /// <summary>
        /// 最大的出入口单号
        /// </summary>
        int MaxOutBoxCode = 1;
        /// <summary>
        /// 正则表达式用于项目匹配
        /// </summary>
        Regex reg;
        /*标识供应商物料编号采集是否通过*/
        bool CollectVeProdCodePass = true;

        bool CollectQTYPass = true;

        bool logout = false;

        //每个不同序号存在的
        object[] ItemData;

        DataTable SingleLabelParam;
        DataTable MidLabelParam;
        DataTable OutLabelParam;

        Dictionary<string, string> CollectData;
        //缓存单盘数据数据的DataTable
        DataTable SingleBoxCacheData;
        /// <summary>
        /// 存放单盘的ID
        /// </summary>
        List<string> SingleID = new List<string>();
        /// <summary>
        /// 单盘的打印参数
        /// </summary>
        List<string> SingleBoxArgument = new List<string>();
        /// <summary>
        /// 中盒缓存数据
        /// </summary>
        DataTable MidBoxCacheData;
        /// <summary>
        /// 存放中盒的ID和盒号
        /// </summary>
        Dictionary<string, string> MidIDAndOutboxcode = new Dictionary<string, string>();
        /// <summary>
        /// 中盒的打印参数
        /// </summary>
        List<string> MidBoxArgument = new List<string>();
        /// <summary>
        /// 全部采集
        /// </summary>
        bool AllCollect = false;
        /// <summary>
        /// 是否全选
        /// </summary>
        bool AllChecked = false;
        /// <summary>
        /// 是否获取过箱号
        /// </summary>
        bool GetPackingCode = false;
        /*用于存放采集项目的Grid信息*/
        Dictionary<string, Dictionary<string, string>> SiItem;
        int CloumnCount = 0;
        /*需要重绘的Cell*/
        Dictionary<DataGridViewCell, bool> PaintCell = new Dictionary<DataGridViewCell, bool>();
        //使用二维数组进行排序
        ArrayList<ArrayList<string>> ScanData;
        ArrayList<string> GetData;
        /// <summary>
        /// 是否通过选择Combox来改变打开的文件
        /// </summary>
        bool ComBoxClickChangeLabelDoc = false;

        List<string> SingleParam = new List<string>();

        List<string> MidParam = new List<string>();

        List<string> OutParam = new List<string>();

        DataTable Attach;

        public UAS_出货标签打印(string Master)
        {
            InitializeComponent();
            Text = Text + "-" + Master;
        }

        protected override void WndProc(ref Message m)
        {
            //拦截双击标题栏、移动窗体的系统消息
            if (m.Msg != 0xA3)
            {
                base.WndProc(ref m);
            }
        }

        private void 贴标机条码打印_Load(object sender, EventArgs e)
        {
            //杀死之前全部未关闭的进程
            Process[] processes = System.Diagnostics.Process.GetProcessesByName("lppa");
            for (int i = 0; i < processes.Length; i++)
            {
                processes[i].Kill();
            }
            //用计时器重置数据库链接
            LogManager.DoLog("程序启动,登陆人员【" + User.UserName + "】");
            dh = SystemInf.dh;
            CheckForIllegalCrossThreadCalls = false;
            CloumnCount = LabelInf.Columns.Count;
            pi_inoutno.Focus();
            //将本地读取的打印机设置进Combox,并选中默认打印机
            if (User.UserAccountType == "admin")
                PowerSetting.Visible = true;
            MidBoxCacheData = new DataTable();
            SingleBoxCacheData = new DataTable();
            sg_code.FormName = Name;
            sg_code.SetValueField = new string[] { "sg_code" };
            sg_code.SelectField = "sg_code # 策略编号 ,sg_name # 策略名称,sg_brand # 品牌,sg_separator # 分隔符";
            sg_code.TableName = "scangroup";
            sg_code.DbChange += Sg_code_DbChange;
            pr_code.FormName = Name;
            pr_code.SetValueField = new string[] { "pr_code" };
            pr_code.TableName = "prodiodetail left join product on pd_prodcode=pr_code";
            pr_code.SelectField = "pd_pdno # 行号,pr_code # 物料编号";

            CollectionUnit.Text = "盘";
            Point pt = new Point();
            //禁止所有列的排序
            foreach (DataGridViewColumn dgv in LabelInf.Columns)
            {
                dgv.SortMode = DataGridViewColumnSortMode.NotSortable;
            }
            int ScreenWidth = Screen.GetWorkingArea(pt).Width;
            //设置获取当前屏幕大小自动全屏但是保留任务栏
            Rectangle ScreenArea = Screen.GetWorkingArea(this);
            Top = 0;
            Left = 0;
            Width = ScreenArea.Width;
            Height = ScreenArea.Height;
            MidBoxCapacity.Value = Properties.Settings.Default.MidBoxCapacity;
            OutboxCapacity.Value = Properties.Settings.Default.OutboxCapacity;
            //怡海能达添加的特殊字段
            if (DataHelper.DBConnectionString.Contains("sz.hi-mantech.com") || DataHelper.DBConnectionString.Contains("192.168.1.200"))
            {
                pib_datecode1.Visible = true;
                SingleLabelAutoPrint.Checked = true;
                MidLabelAutoPrint.Checked = true;
                pib_madein.Visible = true;
            }
            if (!(DataHelper.DBConnectionString.Contains("richwell") || DataHelper.DBConnectionString.Contains("192.168.0.88")))
            {
                pib_cusbarcode.Visible = false;
                pib_cusoutboxcode.Visible = false;
                ViVoPlate.Visible = false;
                OutBoxLabelPackage.Visible = false;
                //GetOutBoxCode.Visible = false;
            }
            asc.controllInitializeSize(this);
            asc.controlAutoSize(this);
            //实例化打印进程
            try
            {
                lbl = new ApplicationClass();
            }
            catch (Exception)
            {
                MessageBox.Show("未安装CodeSoft软件或者版本不正确");
            }
            RefreshDBConnect.Interval = 60000;
            RefreshDBConnect.Start();
        }

        private void Sg_code_DbChange(object sender, EventArgs e)
        {
            DataTable dt = sg_code.ReturnData;
            BaseUtil.SetFormValue(this.Controls, dt);
        }

        //只执行一次窗体自适应
        bool AutoSized = false;
        private void 贴标机条码打印_SizeChanged(object sender, EventArgs e)
        {
            if (!AutoSized)
            {
                asc.controlAutoSize(this);
                AutoSized = true;
            }
        }

        private void GenerateBarCode_Click(object sender, EventArgs e)
        {
            生成条码 form = new 生成条码(pi_inoutno.Text);
            form.FormClosed += LoadGridData;
            BaseUtil.SetFormCenter(form);
            form.ShowDialog();
        }

        private void CollectionSetting_Click(object sender, EventArgs e)
        {
            采集策略 form = new 采集策略(sg_code.Text);
            form.FormClosed += sg_code_UserControlTextChanged;
            BaseUtil.SetFormCenter(form);
            form.ShowDialog();
        }

        private void LabelMaintain_Click(object sender, EventArgs e)
        {
            客户标签维护 form = new 客户标签维护();
            BaseUtil.SetFormCenter(form);
            if (SingleDoc != null)
                SingleDoc.Close();
            if (MidDoc != null)
                MidDoc.Close();
            if (OutBoxDoc != null)
                OutBoxDoc.Close();
            form.FormClosed += LabelFormClose;
            form.ShowDialog();
        }

        private void LabelFormClose(object sender, EventArgs e)
        {
            if (GetGridOnly.Checked)
                GetInOutInfAndLabelFile();
            else
            {
                GetGridOnly.Checked = true;
                GetInOutInfAndLabelFile();
                GetGridOnly.Checked = false;
            }
        }

        /// <summary>
        /// 保存明细
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SaveGrid_Click(object sender, EventArgs e)
        {
            DataTable savedt = (LabelInf.DataSource as DataTable);
            if (savedt != null && savedt.GetChanges() != null)
            {
                MidSource.EndEdit();
                dh.SaveDataTable(savedt.GetChanges(), "ProdioBarCode", "pib_id");
                MessageBox.Show("保存成功!");
            }
        }

        //放大镜选择后出发的事件
        private void sg_code_UserControlTextChanged(object sender, EventArgs e)
        {
            //取已启用的的按照采集次序排序
            dt = (DataTable)dh.ExecuteSql("select si_item,si_detno,sg_separator,si_kind,si_expression,si_expressionitem,si_index,si_indexstring,si_length from scanitem left join scangroup on si_sgid=sg_id where sg_code='" + sg_code.Text + "' and si_enable<>0 order by si_detno,si_innerdetno", "select");
            BaseUtil.FillDgvWithDataTable(Si_ItemDGV, dt);
            if (dt.Rows.Count > 0)
            {
                sg_separator.Text = dt.Rows[0]["sg_separator"].ToString();
            }
            //按DetNo排列之后的采集项
            ScanData = new ArrayList<ArrayList<string>>();
            //每个采集项目的子项
            GetData = new ArrayList<string>();
            //将数据添加进一个List的二维数组中
            for (int i = 0; i < Si_ItemDGV.RowCount; i++)
            {
                //如果不包含这个则添加进数组
                if (!GetData.Contains(Si_ItemDGV.Rows[i].Cells["si_item"].Value.ToString()))
                {
                    GetData.Add(Si_ItemDGV.Rows[i].Cells["si_item"].Value.ToString());
                }
                //如果和后一个的采集次序相同
                if (((i + 1) < Si_ItemDGV.RowCount) && Si_ItemDGV.Rows[i].Cells["si_detno"].Value.ToString() == Si_ItemDGV.Rows[i + 1].Cells["si_detno"].Value.ToString())
                {
                    GetData.Add(Si_ItemDGV.Rows[i + 1].Cells["si_item"].Value.ToString());
                }
                else
                {
                    ScanData.Add(GetData);
                    //添加完一次数据需要一个新的List
                    GetData = new ArrayList<string>();
                }
            }
            RemindUser();
            if (ScanData.ToArray().Length > 0)
            {
                object[] arr = (ScanData.ToArray()[0] as ArrayList<string>).ToArray();
                if (arr.Contains("MPN"))
                {
                    AutoMatch.CheckState = CheckState.Checked;
                    AutoMatch.Enabled = true;
                }
                else
                {
                    AutoMatch.CheckState = CheckState.Unchecked;
                    AutoMatch.Enabled = false;
                }
            }
        }

        //输入框Enter事件
        private void Input_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (Input.Text == "")
                {
                    MessageBox.Show("采集的数据不能为空");
                    return;
                }
                if (Si_ItemDGV.Rows.Count == 0)
                {
                    MessageBox.Show("未维护采集策略");
                    return;
                }
                CollectInputData();
                DataTable savedt = (LabelInf.DataSource as DataTable);
                if (savedt != null && savedt.GetChanges() != null)
                {
                    MidSource.EndEdit();
                    dh.SaveDataTable(savedt.GetChanges(), "ProdioBarCode", "pib_id");
                }
            }
        }

        /// <summary>
        /// 设置自动匹配的数据的行号
        /// </summary>
        /// <returns></returns>
        private void SetAutoMatchRow()
        {
            //采集策略的第一组数据
            string[] arr = new string[ItemData.Length];
            if (sg_separator.Text == "")
            {
                for (int i = 0; i < arr.Length; i++)
                {
                    arr[i] = Input.Text;
                }
            }
            else
            {
                arr = Input.Text.Split(sg_separator.Text.ToCharArray()).ToArray();
            }
            bool FindAutoMatch = false;
            for (int i = 0; i < LabelInf.RowCount; i++)
            {
                for (int j = 0; j < arr.Length; j++)
                {
                    if (LabelInf.Rows[i].Cells["pr_vendprodcode"].Value.ToString() == MatchStr(arr[j].ToString(), "MPN") && LabelInf.Rows[i].Cells["pib_ifpick"].FormattedValue.ToString() != "True")
                    {
                        CurrentRowIndex = i;
                        FindAutoMatch = true;
                        break;
                    }
                }
                if (FindAutoMatch)
                    break;
            }
        }

        /// <summary>
        /// 采集数据
        /// </summary>
        private void CollectInputData()
        {
            LogManager.DoLog("采集数据【" + Input.Text + "】,使用采集策略编号【" + sg_code.Text + "】");
            //按DetNo排列之后的采集项
            ScanData = new ArrayList<ArrayList<string>>();
            //每个采集项目的子项
            GetData = new ArrayList<string>();
            //用于保存采集策略的具体信息
            SiItem = new Dictionary<string, Dictionary<string, string>>();
            for (int i = 0; i < Si_ItemDGV.RowCount; i++)
            {
                //如果不包含这个则添加进数组
                if (!GetData.Contains(Si_ItemDGV.Rows[i].Cells["si_item"].Value.ToString()))
                    GetData.Add(Si_ItemDGV.Rows[i].Cells["si_item"].Value.ToString());
                //如果和后一个的采集次序相同
                if (((i + 1) < Si_ItemDGV.RowCount) && Si_ItemDGV.Rows[i].Cells["si_detno"].Value.ToString() == Si_ItemDGV.Rows[i + 1].Cells["si_detno"].Value.ToString())
                    GetData.Add(Si_ItemDGV.Rows[i + 1].Cells["si_item"].Value.ToString());
                else
                {
                    ScanData.Add(GetData);
                    //添加完一次数据需要一个新的List
                    GetData = new ArrayList<string>();
                }
                Dictionary<string, string> item = new Dictionary<string, string>();
                for (int j = 0; j < Si_ItemDGV.ColumnCount; j++)
                {
                    item.Add(Si_ItemDGV.Columns[j].DataPropertyName, Si_ItemDGV.Rows[i].Cells[j].Value.ToString());
                }
                SiItem.Add(Si_ItemDGV.Rows[i].Cells["si_item"].Value.ToString().ToUpper(), item);
            }
            //采集项目的数组
            ItemData = (ScanData.ToArray()[CurrentItemIndex] as ArrayList<string>).ToArray();
            //分隔符不为空的时候  //采集的项和Grid的数目不等
            //用户采集的数据的分割数组
            CollectData = new Dictionary<string, string>();
            if (sg_separator.Text == "")
            {
                for (int i = 0; i < ItemData.Length; i++)
                    CollectData.Add(ItemData[i].ToString().ToUpper(), Input.Text);
            }
            else
            {
                int DataCount = Input.Text.Split(sg_separator.Text.ToCharArray()).Length;
                if (DataCount > ItemData.Length)
                {
                    MessageBox.Show("采集数据大于采集项次");
                    return;
                }
                else if (DataCount < ItemData.Length)
                {
                    MessageBox.Show("采集数据小于采集项次");
                    return;
                }
                for (int i = 0; i < DataCount; i++)
                    CollectData.Add(ItemData[i].ToString().ToUpper(), Input.Text.Split(sg_separator.Text.ToCharArray())[i]);
            }
            //首先判断当前采集的个数,如果采集的个数为1则不对数据进行分隔符验证
            if (ItemData.Length == 1)
            {
                CollectData.Clear();
                CollectData.Add(ItemData[0].ToString().ToUpper(), Input.Text);
                //勾选了自动匹配调用该函数
                if (AutoMatch.Checked)
                    SetAutoMatchRow();
                //将筛选之后的值赋给Cell 
                SetDataToCell(ref CollectData, ItemData[0].ToString().ToUpper());
            }
            //如果本次采集的数据分割后和当前的采集项目个数不一样提示用户错误
            else if (CollectData.ToArray().Length == ItemData.Length)
            {
                for (int i = 0; i < ItemData.Length; i++)
                {
                    //勾选了自动匹配调用该函数
                    if (AutoMatch.Checked)
                        SetAutoMatchRow();
                    //将筛选之后的值赋给Cell
                    SetDataToCell(ref CollectData, ItemData[i].ToString().ToUpper());
                }
            }
            else
            {
                MessageBox.Show("所采集的数据个数和采集项目不符");
                return;
            }
            //采集项目的索引+1
            CurrentItemIndex = CurrentItemIndex + 1;
            //如果已经采集完了最后一个
            if (CurrentItemIndex == ScanData.ToArray().Length)
            {
                //数据校验均已通过则勾选上已采集
                if (CollectVeProdCodePass && CollectQTYPass)
                {
                    //如果按盒号采集,所有的此盒的均更新为
                    DataTable dt = (DataTable)MidSource.DataSource;
                    if (CollectionUnit.Text == "盒")
                    {
                        string la_id = "";
                        if (SingleLabelCombox.SelectedValue != null)
                        {
                            la_id = SingleLabelCombox.SelectedValue.ToString().Split('#')[0];
                        }
                        string cl_labelname = SingleLabelCombox.Text;
                        string LabelUrl = dh.getFieldDataByCondition("label left join customerlabel on la_code=cl_labelcode", "cl_labelurl", "la_id='" + la_id + "' and cl_labelname='" + cl_labelname + "'").ToString();
                        for (int i = 0; i < LabelInf.RowCount; i++)
                        {
                            if (LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString() == LabelInf.Rows[CurrentRowIndex].Cells["pib_outboxcode1"].Value.ToString())
                            {
                                dt.Rows[i]["pib_lotno"] = LabelInf.Rows[CurrentRowIndex].Cells["pib_lotno"].Value;
                                dt.Rows[i]["pib_datecode"] = LabelInf.Rows[CurrentRowIndex].Cells["pib_datecode"].Value;
                                //将采集数据正确的Cell添加到键值对中
                                if (PaintCell.ContainsKey(LabelInf.Rows[i].Cells["pr_vendprodcode"]))
                                {
                                    PaintCell.Remove(LabelInf.Rows[i].Cells["pr_vendprodcode"]);
                                }
                                PaintCell.Add(LabelInf.Rows[i].Cells["pr_vendprodcode"], true);
                                if (PaintCell.ContainsKey(LabelInf.Rows[i].Cells["pib_qty"]))
                                {
                                    PaintCell.Remove(LabelInf.Rows[i].Cells["pib_qty"]);
                                }
                                PaintCell.Add(LabelInf.Rows[i].Cells["pib_qty"], true);
                                LabelInf.Refresh();
                                LabelInf.Rows[i].Cells["pib_ifpick"].Value = true;
                                LabelInf.Rows[i].Cells["Choose"].Value = true;
                                //当前行的索引随循环增长
                                CurrentRowIndex = i;
                                if (SingleLabelAutoPrint.Checked)
                                {
                                    if (la_id != "")
                                        AutoPrintSingleLabel(la_id, LabelUrl);
                                    else
                                    {
                                        MessageBox.Show("未维护单盘标签");
                                        return;
                                    }
                                }
                                if (MidLabelAutoPrint.Checked)
                                    AutoPrintMidLabel();
                                SetOutBoxCode2(true);
                            }
                        }
                    }
                    else if (CollectionUnit.Text == "全部")
                    {
                        for (int i = 0; i < LabelInf.RowCount; i++)
                        {
                            dt.Rows[i]["pib_lotno"] = LabelInf.Rows[CurrentRowIndex].Cells["pib_lotno"].Value;
                            dt.Rows[i]["pib_datecode"] = LabelInf.Rows[CurrentRowIndex].Cells["pib_datecode"].Value;
                            CurrentRowIndex = i;
                            //将采集数据正确的Cell添加到键值对中
                            if (PaintCell.ContainsKey(LabelInf.Rows[i].Cells["pr_vendprodcode"]))
                            {
                                PaintCell.Remove(LabelInf.Rows[i].Cells["pr_vendprodcode"]);
                            }
                            PaintCell.Add(LabelInf.Rows[i].Cells["pr_vendprodcode"], true);
                            if (PaintCell.ContainsKey(LabelInf.Rows[i].Cells["pib_qty"]))
                            {
                                PaintCell.Remove(LabelInf.Rows[i].Cells["pib_qty"]);
                            }
                            PaintCell.Add(LabelInf.Rows[i].Cells["pib_qty"], true);
                            LabelInf.Refresh();
                            LabelInf.Rows[i].Cells["pib_ifpick"].Value = true;
                            LabelInf.Rows[i].Cells["Choose"].Value = true;
                            SetOutBoxCode2(true);
                        }
                    }
                    else
                    {
                        LabelInf.Rows[CurrentRowIndex].Cells["pib_ifpick"].Value = true;
                        LabelInf.Rows[CurrentRowIndex].Cells["Choose"].Value = true;
                        //勾选了单盘自动打印
                        if (SingleLabelAutoPrint.Checked)
                        {
                            if (SingleLabelCombox.SelectedValue != null)
                            {
                                string la_id = SingleLabelCombox.SelectedValue.ToString().Split('#')[0];
                                string cl_labelname = SingleLabelCombox.Text;
                                string LabelUrl = dh.getFieldDataByCondition("label left join customerlabel on la_code=cl_labelcode", "cl_labelurl", "la_id='" + la_id + "' and cl_labelname='" + cl_labelname + "'").ToString();
                                AutoPrintSingleLabel(la_id, LabelUrl);
                            }
                            else
                            {
                                MessageBox.Show("未维护单盘标签");
                                return;
                            }
                        }
                        //勾选了中盒自动打印
                        if (MidLabelAutoPrint.Checked)
                            AutoPrintMidLabel();
                    }
                }
                //采集未通过的时候
                else
                {
                    //如果自动采集采集未成功需要移动到下一行
                    if (!AutoMatch.Checked)
                        SetRowIndexToCollectRow();
                }
                //当前项目已采集完成,重置采集项目
                CurrentItemIndex = 0;
                //未勾选自动匹配,设置到下一个未采集的行
                if (!AutoMatch.Checked)
                    SetRowIndexToCollectRow();
            }
            //提醒用户需要采集的数据
            RemindUser();
            RefreshProcessData();
            MessageLog.AppendText(">>扫描到数据" + Input.Text + "\n", Color.Blue);
            //如果所采集的行的物料不一样的话,重新计算箱内容量
            if (CurrentRowIndex - 1 > 0)
            {
                string LastRowProd = LabelInf.Rows[CurrentRowIndex - 1].Cells["pib_prodcode"].Value.ToString();
                string CurrentRowProd = LabelInf.Rows[CurrentRowIndex].Cells["pib_prodcode"].Value.ToString();
                //如果两行的物料资料不相等的话
                if (LastRowProd != CurrentRowProd)
                    SetOutBoxCapacity(CurrentRowProd);
            }
            if (CleanInputAfterCollect.Checked)
                Input.Text = "";
        }

        /// <summary>
        /// 根据物料资料的参数设置外箱容量
        /// </summary>
        /// <param name="pr_code"></param>
        private void SetOutBoxCapacity(string pr_code)
        {
            DataTable temp = (DataTable)dh.ExecuteSql("select pr_qtyperplace,pr_zxbzs from product where pr_code='" + pr_code + "'", "select");
            if (temp.Rows.Count > 0)
            {
                //try { OutboxCapacity.Value = (decimal)temp.Rows[0]["pr_qtyperplace"] / (decimal)temp.Rows[0]["pr_zxbzs"]; }
                //catch (Exception) { }
            }
        }

        //设置行的索引到当前需要采集的行
        private void SetRowIndexToCollectRow()
        {
            //获取当前需要采集的行
            for (int i = CurrentRowIndex; i < LabelInf.RowCount; i++)
            {
                if (LabelInf.Rows[i].Cells["pib_ifpick"].FormattedValue.ToString() != "True")
                {
                    griddetno.Text = LabelInf.Rows[i].Cells["pib_pdno"].FormattedValue.ToString();
                    pr_code.Text = LabelInf.Rows[i].Cells["pib_prodcode"].FormattedValue.ToString();
                    CurrentRowIndex = LabelInf.Rows[i].Cells["pib_prodcode"].RowIndex;
                    break;
                }
            }
        }

        private void AutoPrintSingleLabel(string la_id, string LabelUrl)
        {
            //用标签本身的变量作为最外层的循环条件去匹配;
            string[] arg = SingleBoxArgument.ToArray();
            StringBuilder ParamLog = new StringBuilder();
            for (int j = 0; j < SingleDoc.Variables.FreeVariables.Count; j++)
            {
                //将维护的模板参数和模板本身的参数名称进行比对
                for (int k = 0; k < SingleLabelParam.Rows.Count; k++)
                {
                    //名称相等的时候,取SQL进行值的查询
                    if (SingleDoc.Variables.FreeVariables.Item(j + 1).Name == SingleLabelParam.Rows[k]["lp_name"].ToString().ToLower())
                    {
                        string pib_id = LabelInf.Rows[CurrentRowIndex].Cells["pib_id1"].Value.ToString();
                        DataRow[] dr = SingleBoxCacheData.Select("pib_id=" + pib_id);
                        if (arg.Contains(SingleDoc.Variables.FreeVariables.Item(j + 1).Name))
                            SingleDoc.Variables.FreeVariables.Item(j + 1).Value = dr[0][SingleDoc.Variables.FreeVariables.Item(j + 1).Name].ToString();
                        if (SingleDoc.Variables.FreeVariables.Item(j + 1).Value == "")
                        {
                            DataRow[] dr1 = Attach.Select("lp_name='" + SingleDoc.Variables.FreeVariables.Item(j + 1).Name + "'");
                            if (dr1.Length > 0)
                            {
                                SingleDoc.Variables.FreeVariables.Item(j + 1).Value = dr1[0]["lp_sql"].ToString();
                            }
                        }
                        ParamLog.AppendLine("pib_id:" + LabelInf.Rows[CurrentRowIndex].Cells["pib_id1"].Value.ToString() + ",SingleDoc打印参数【" + SingleDoc.Variables.FreeVariables.Item(j + 1).Name + "】赋值," + "取到值" + SingleDoc.Variables.FreeVariables.Item(j + 1).Value);
                    }
                }
            }
            LogManager.DoLog(ParamLog.ToString());
            SingleDoc.Printer.SwitchTo(SingleLabelPrinter.Text);
            SingleDoc.PrintDocument();
            LabelInf.Rows[CurrentRowIndex].Cells["pib_ifprint"].Value = true;
        }

        /// <summary>
        /// 提醒用户当前采集的项目
        /// </summary>
        private void RemindUser()
        {
            SetRowIndexToCollectRow();
            if (ScanData.ToArray().Length > 0)
            {
                object[] arr = (ScanData.ToArray()[CurrentItemIndex] as ArrayList<string>).ToArray();
                string Inf = "";
                for (int i = 0; i < arr.Length; i++)
                {
                    Inf += arr[i] + "  ";
                }
                MessageLog.AppendText(">>当前采集行" + (CurrentRowIndex + 1) + ",请采集" + Inf + "\n", Color.Green);
            }
        }

        /// <summary>
        /// 自定义函数 将匹配之后的值设置到Cell中,传递引用,每次赋值之后从List中移除已使用过的
        /// </summary>
        /// <param name="data"></param>
        /// <param name="kind"></param>
        private void SetDataToCell(ref Dictionary<string, string> setdata, string kind)
        {
            int length = setdata.Count;
            for (int j = 0; j < length; j++)
            {
                string[] data = new string[setdata.Count];
                for (int i = 0; i < length; i++)
                {
                    data[i] = setdata[kind];
                }
                for (int i = 0; i < data.Length; i++)
                {
                    DataGridViewCell cell = null;
                    string Matchstr = "";
                    switch (kind.ToString().ToUpper())
                    {
                        case "DATECODE":
                            cell = LabelInf.Rows[CurrentRowIndex].Cells["pib_datecode"];
                            Matchstr = MatchStr(data[j], "DATECODE");
                            setdata.Remove("DATECODE");
                            length--;
                            break;
                        case "LOTNO":
                            cell = LabelInf.Rows[CurrentRowIndex].Cells["pib_lotno"];
                            Matchstr = MatchStr(data[j], "LOTNO");
                            setdata.Remove("LOTNO");
                            length--;
                            break;
                        case "MPN":
                            cell = LabelInf.Rows[CurrentRowIndex].Cells["pr_vendprodcode"];
                            Matchstr = MatchStr(data[j], "MPN");
                            //采集的供应商号不匹配的话
                            if (cell.Value.ToString() != Matchstr)
                            {
                                CollectVeProdCodePass = false;
                                //添加需要重绘的Cell
                                if (PaintCell.ContainsKey(cell))
                                    PaintCell.Remove(cell);
                                PaintCell.Add(cell, false);
                                LabelInf.Refresh();
                                MessageLog.AppendText(">>供应商物料编号不匹配\n", Color.Red);
                            }
                            else
                            {
                                if (PaintCell.ContainsKey(cell))
                                    PaintCell.Remove(cell);
                                PaintCell.Add(cell, true);
                                LabelInf.Refresh();
                                CollectVeProdCodePass = true;
                            }
                            setdata.Remove("MPN");
                            length--;
                            break;
                        case "QTY":
                            cell = LabelInf.Rows[CurrentRowIndex].Cells["pib_qty"];
                            Matchstr = MatchStr(data[j], "QTY");
                            //如果采集的数量不相等的话
                            if (cell.Value.ToString() != Matchstr)
                            {
                                CollectQTYPass = false;
                                //添加需要重绘的Cell
                                if (PaintCell.ContainsKey(cell))
                                    PaintCell.Remove(cell);
                                PaintCell.Add(cell, false);
                                LabelInf.Refresh();
                                MessageLog.AppendText(">>数量不匹配\n", Color.Red);
                            }
                            else
                            {
                                if (PaintCell.ContainsKey(cell))
                                    PaintCell.Remove(cell);
                                PaintCell.Add(cell, true);
                                LabelInf.Refresh();
                                CollectQTYPass = true;
                            }
                            setdata.Remove("QTY");
                            length--;
                            break;
                        case "品牌":
                            cell = LabelInf.Rows[CurrentRowIndex].Cells["pib_brand"];
                            Matchstr = MatchStr(data[j], "品牌");
                            //如果采集的数量不相等的话
                            if (cell.Value.ToString() != Matchstr)
                            {
                                CollectQTYPass = false;
                                //添加需要重绘的Cell
                                if (PaintCell.ContainsKey(cell))
                                    PaintCell.Remove(cell);
                                PaintCell.Add(cell, false);
                                LabelInf.Refresh();
                                MessageLog.AppendText(">>品牌不匹配\n", Color.Red);
                            }
                            else
                            {
                                if (PaintCell.ContainsKey(cell))
                                    PaintCell.Remove(cell);
                                PaintCell.Add(cell, true);
                                LabelInf.Refresh();
                                CollectQTYPass = true;
                            }
                            setdata.Remove("品牌");
                            length--;
                            break;
                        default:
                            break;
                    }
                    //如果数据为空或者数据不为空的时候但是和需要采集的数据不相等的情况下进行采集
                    //MPN和QTY只做比较不需要赋值
                    if (cell.Value.ToString() == "" || cell.Value.ToString() != Matchstr)
                    {
                        string MatchResult = "";
                        if (kind != "MPN" && kind != "QTY" && kind != "品牌")
                        {
                            DataTable dt = (DataTable)MidSource.DataSource;
                            cell.Value = Matchstr;
                            MatchResult = "成功";
                        }
                        else
                            MatchResult = "失败";
                        switch (SiItem[kind]["si_kind"])
                        {
                            case "索引字符":
                                LogManager.DoLog("采集项" + kind + ",匹配结果:【" + MatchResult + "】,匹配方式:" + SiItem[kind]["si_kind"] + ",使用字符" + SiItem[kind]["si_indexstring"] + ",匹配后字符串" + Matchstr);
                                break;
                            case "起始位置":
                                LogManager.DoLog("采集项" + kind + ",匹配结果:【" + MatchResult + "】,匹配方式:" + SiItem[kind]["si_kind"] + ",从第" + SiItem[kind]["si_index"] + "位开始匹配,匹配后字符串" + Matchstr);
                                break;
                            case "二次解析":
                                LogManager.DoLog("采集项" + kind + ",匹配结果:【" + MatchResult + "】,匹配方式:" + SiItem[kind]["si_kind"] + ",匹配后字符串" + Matchstr);
                                break;
                            case "全部":
                                LogManager.DoLog("采集项" + kind + ",匹配结果:【" + MatchResult + "】,匹配方式:" + SiItem[kind]["si_kind"] + ",匹配后字符串" + Matchstr);
                                break;
                            default:
                                break;
                        }
                    }
                    else
                        LogManager.DoLog("采集项" + kind + ",匹配结果:【成功】,匹配方式:" + SiItem[kind]["si_kind"] + ",,匹配后字符串" + Matchstr);
                }
            }
            //添加外箱号,如果外箱号的箱内容量不为0并且已经采集完成
            SetOutBoxCode2(false);
        }

        //
        /// <summary>
        /// 设置外箱号
        /// </summary>
        /// <param name="BatchCollect">是否批量采集</param>
        private void SetOutBoxCode2(bool BatchCollect)
        {
            if (OutboxCapacity.Value != 0)
            {
                //获取当前出入口单最大的外箱号
                for (int i = 0; i < LabelInf.RowCount; i++)
                {
                    string outboxcode = LabelInf.Rows[i].Cells["pib_outboxcode2"].Value.ToString();
                    if (outboxcode.Contains("-"))
                    {
                        if (int.Parse(outboxcode.Split('-')[0] == "" ? "1" : outboxcode.Split('-')[0]) > MaxOutBoxCode)
                            MaxOutBoxCode = int.Parse(outboxcode.Split('-')[0]);
                    }
                    else
                    {
                        if (int.Parse(outboxcode == "" ? "0" : outboxcode) > MaxOutBoxCode)
                            MaxOutBoxCode = int.Parse(outboxcode);
                    }
                }
                //统计最大的箱号存在多少
                int MaxOutBoxCodeCount = 0;
                for (int i = 0; i < LabelInf.RowCount; i++)
                {
                    if (LabelInf.Rows[i].Cells["pib_outboxcode2"].Value.ToString() == MaxOutBoxCode.ToString())
                        MaxOutBoxCodeCount = MaxOutBoxCodeCount + 1;
                }
                //如果是获取过包装单的话则不再继续追加箱号
                if (!GetPackingCode)
                {
                    //如果箱内的盒数量小于容量,继续使用此箱号赋值,否则箱号+1
                    if (BatchCollect)
                    {
                        if (MaxOutBoxCodeCount < OutboxCapacity.Value)
                            LabelInf.Rows[CurrentRowIndex].Cells["pib_outboxcode2"].Value = MaxOutBoxCode;
                        else
                        {
                            MaxOutBoxCode = MaxOutBoxCode + 1;
                            LabelInf.Rows[CurrentRowIndex].Cells["pib_outboxcode2"].Value = MaxOutBoxCode;
                        }
                    }
                    else
                    {
                        if (MaxOutBoxCodeCount <= OutboxCapacity.Value)
                            LabelInf.Rows[CurrentRowIndex].Cells["pib_outboxcode2"].Value = MaxOutBoxCode;
                        else
                        {
                            MaxOutBoxCode = MaxOutBoxCode + 1;
                            LabelInf.Rows[CurrentRowIndex].Cells["pib_outboxcode2"].Value = MaxOutBoxCode;
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 自定义函数 根据匹配规则
        /// si_item的二维数组,str是需要赋值的字符串,item表示DateCode,LotNo等
        /// </summary>
        /// <param name="SiItem"></param>
        /// <param name="str"></param>
        /// <param name="item"></param>
        /// <returns></returns>
        private string MatchStr(string str, string item)
        {
            string kind = SiItem[item]["si_kind"];
            //起始字符不为空的时候
            switch (kind)
            {
                case "起始位置":
                    if (SiItem[item]["si_index"] != "")
                    {
                        try
                        {
                            //长度不为空的时候按照指定的长度去取数据
                            if (SiItem[item]["si_length"] != "")
                                str = str.Substring(int.Parse(SiItem[item]["si_index"]), int.Parse(SiItem[item]["si_length"]));
                            //长度为空的时候取index之后的全部数据
                            else
                                str = str.Substring(int.Parse(SiItem[item]["si_index"]));
                        }
                        catch (Exception e) { LogManager.DoLog(e.StackTrace); }
                    }
                    break;
                case "索引字符":
                    try
                    {
                        if (SiItem[item]["si_indexstring"] != "")
                        {
                            //长度不为空的时候按照指定的长度去取数据
                            if (SiItem[item]["si_length"] != "")
                                str = str.Substring(str.IndexOf(SiItem[item]["si_indexstring"]) + 1, int.Parse(SiItem[item]["si_length"]));
                            //长度为空的时候取index之后的全部数据
                            else
                                str = str.Substring(str.IndexOf(SiItem[item]["si_indexstring"]) + 1);
                        }
                    }
                    catch (Exception e) { LogManager.DoLog(e.StackTrace); }
                    break;
                case "二次解析":
                    if (SiItem[item]["si_indexstring"] != "")
                    {
                        //长度不为空的时候按照指定的长度去取数据
                        if (SiItem[item]["si_length"] != "")
                            str = str.Substring(str.IndexOf(SiItem[item]["si_indexstring"]) + 1, int.Parse(SiItem[item]["si_length"]));
                        //长度为空的时候取index之后的全部数据
                        else
                            str = str.Substring(str.IndexOf(SiItem[item]["si_indexstring"]) + 1);
                    }
                    str = Analysis.AnalysisData(Brand, item, str);
                    break;
                case "全部":
                    break;
                default:
                    break;
            }
            if (SiItem[item]["si_expression"] != "")
            {
                string log = "使用正则表达式" + SiItem[item]["si_expression"] + "匹配数据" + str;
                reg = new Regex(SiItem[item]["si_expression"]);
                try
                {
                    str = reg.Matches(str)[int.Parse(SiItem[item]["si_expressionitem"].ToString()) - 1].Value;
                }
                catch (Exception)
                {

                }
                log += ",匹配后数据" + str;
                LogManager.DoLog(log);
            }
            return str;
        }

        //关闭窗口前提示用户确认
        private void 贴标机条码打印_FormClosing(object sender, FormClosingEventArgs e)
        {
            //如果不是注销的话
            if (!logout)
            {
                string close = MessageBox.Show(this.ParentForm, "是否关闭", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question).ToString();
                if (close.ToString() != "Yes")
                    e.Cancel = true;
                else
                {
                    lbl.Quit();
                    LogManager.DoLog("关闭程序");
                }
            }
        }

        /// <summary>
        /// 获取打印标签
        /// </summary>
        private void GetInOutInfAndLabelFile()
        {
            ComBoxClickChangeLabelDoc = false;
            Attach = (DataTable)dh.ExecuteSql("select lap_param lp_name,lap_value lp_sql  from LabelAttachPARAMETER where lap_custcode='" + pi_cardcode.Text + "'", "select");
            sql.Clear();
            sql.Append("select to_char(nvl(cl_date,sysdate),'YYYY-MM-DD HH24:Mi:SS') cl_date,cl_labelname,cl_isdefault,la_id||'#'||cl_labelurl||'#'||to_char(cl_date,'YYYY-MM-DD HH24:Mi:SS')  la_id,cl_custcode from customerlabel left join prodinout on pi_cardcode=cl_custcode ");
            sql.Append("left join customer on cu_code=cl_custcode left join label on la_code=CL_LABELCODE where ((pi_cardcode='" + pi_cardcode.Text + "' ");
            sql.Append("and  pi_inoutno='" + pi_inoutno.Text + "') or( cl_custcode is null)) and cl_labeltype='单盘' order by cl_custcode");
            dt = (DataTable)dh.ExecuteSql(sql.ToString(), "select");
            SingleLabelCombox.DisplayMember = "cl_labelname";
            SingleLabelCombox.ValueMember = "la_id";
            SingleLabelCombox.DataSource = dt;
            if (SingleDoc != null)
                SingleDoc.Close();
            if (!GetGridOnly.Checked)
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string LabelUrl = dt.Rows[i]["la_id"].ToString().Split('#')[1];
                    string LabelName = dt.Rows[i]["cl_labelname"].ToString();
                    System.DateTime time = Convert.ToDateTime(dt.Rows[i]["cl_date"].ToString());
                    FileInfo file = new FileInfo(ftpOperater.DownLoadTo + LabelName);
                    if (time.ToString() != file.LastWriteTime.ToString())
                        BaseUtil.GetLabelUrl(LabelUrl, LabelName, time);
                }
            if (SingleLabelCombox.Text != "")
            {
                SingleDoc = lbl.Documents.Open(ftpOperater.DownLoadTo + SingleLabelCombox.Text);
                SingleLabelParam = (DataTable)dh.ExecuteSql("select lp_name,lp_sql from label left join LABELPARAMETER on la_id= lp_laid where la_id=" + SingleLabelCombox.SelectedValue.ToString().Split('#')[0], "select");
                for (int i = 0; i < SingleDoc.Variables.FreeVariables.Count; i++)
                {
                    SingleParam.Add(SingleDoc.Variables.FreeVariables.Item(i + 1).Name);
                }
            }
            sql.Clear();
            sql.Append("select to_char(nvl(cl_date,sysdate),'YYYY-MM-DD HH24:Mi:SS') cl_date,cl_labelname,cl_isdefault,la_id||'#'||cl_labelurl||'#'||to_char(cl_date,'YYYY-MM-DD HH24:Mi:SS')  la_id,cl_custcode from customerlabel left join prodinout on pi_cardcode=cl_custcode ");
            sql.Append("left join customer on cu_code=cl_custcode left join label on la_code=CL_LABELCODE where ((pi_cardcode='" + pi_cardcode.Text + "' ");
            sql.Append("and  pi_inoutno='" + pi_inoutno.Text + "') or( cl_custcode is null)) and cl_labeltype='中盒' order by cl_custcode");
            dt = (DataTable)dh.ExecuteSql(sql.ToString(), "select");
            MidLabelCombox.DisplayMember = "cl_labelname";
            MidLabelCombox.ValueMember = "la_id";
            MidLabelCombox.DataSource = dt;
            if (MidDoc != null)
                MidDoc.Close();
            if (!GetGridOnly.Checked)
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string LabelUrl = dt.Rows[i]["la_id"].ToString().Split('#')[1];
                    string LabelName = dt.Rows[i]["cl_labelname"].ToString();
                    System.DateTime time = Convert.ToDateTime(dt.Rows[i]["cl_date"].ToString());
                    FileInfo file = new FileInfo(ftpOperater.DownLoadTo + LabelName);
                    if (time.ToString() != file.LastWriteTime.ToString())
                        BaseUtil.GetLabelUrl(LabelUrl, LabelName, time);
                }
            if (MidLabelCombox.Text != "")
            {
                MidDoc = lbl.Documents.Open(ftpOperater.DownLoadTo + MidLabelCombox.Text);
                MidLabelParam = (DataTable)dh.ExecuteSql("select lp_name,lp_sql from label left join LABELPARAMETER on la_id= lp_laid where la_id=" + MidLabelCombox.SelectedValue.ToString().Split('#')[0], "select");
            }
            //缓存中盒参数
            sql.Clear();
            sql.Append("select to_char(nvl(cl_date,sysdate),'YYYY-MM-DD HH24:Mi:SS') cl_date,cl_labelname,cl_isdefault,la_id||'#'||cl_labelurl||'#'||to_char(cl_date,'YYYY-MM-DD HH24:Mi:SS')  la_id,cl_custcode from customerlabel left join prodinout on pi_cardcode=cl_custcode ");
            sql.Append("left join customer on cu_code=cl_custcode left join label on la_code=CL_LABELCODE where ((pi_cardcode='" + pi_cardcode.Text + "' ");
            sql.Append("and  pi_inoutno='" + pi_inoutno.Text + "') or( cl_custcode is null)) and cl_labeltype='外箱' order by cl_custcode");
            dt = (DataTable)dh.ExecuteSql(sql.ToString(), "select");
            OutBoxCombox.DisplayMember = "cl_labelname";
            OutBoxCombox.ValueMember = "la_id";
            OutBoxCombox.DataSource = dt;
            if (OutBoxDoc != null)
                OutBoxDoc.Close();
            if (!GetGridOnly.Checked)
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string LabelUrl = dt.Rows[i]["la_id"].ToString().Split('#')[1];
                    string LabelName = dt.Rows[i]["cl_labelname"].ToString();
                    System.DateTime time = Convert.ToDateTime(dt.Rows[i]["cl_date"].ToString());
                    FileInfo file = new FileInfo(ftpOperater.DownLoadTo + LabelName);
                    if (time.ToString() != file.LastWriteTime.ToString())
                        BaseUtil.GetLabelUrl(LabelUrl, LabelName, time);
                }
            if (OutBoxCombox.Text != "")
            {
                OutBoxDoc = lbl.Documents.Open(ftpOperater.DownLoadTo + OutBoxCombox.Text);
                OutLabelParam = (DataTable)dh.ExecuteSql("select lp_name,lp_sql,lp_valuetype from label left join LABELPARAMETER on la_id= lp_laid where la_id=" + OutBoxCombox.SelectedValue.ToString().Split('#')[0], "select");
            }
            //缓存外箱参数
            ComBoxClickChangeLabelDoc = true;
            GetSingleBoxData();
            GetMidBoxData();
        }

        /// <summary>
        /// 出入库单录入框的回车事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pi_inoutno_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                sql.Clear();
                sql.Append("select pi_id,pi_cardcode,to_char(pi_date,'yyyymmdd')pi_date from prodinout where pi_inoutno='" + pi_inoutno.Text + "'");
                dt = (DataTable)dh.ExecuteSql(sql.ToString(), "select");
                if (dt.Rows.Count > 0)
                {
                    pi_cardcode.Text = dt.Rows[0]["pi_cardcode"].ToString();
                    pi_date.Text = dt.Rows[0]["pi_date"].ToString();
                    PI_ID = dt.Rows[0]["pi_id"].ToString();
                    if (dh.GetConfig("AutoBarcode", "ProdInOut!Sale").ToString() != "")
                    {
                        string[] param = new string[] { PI_ID, "", "" };
                        dh.CallProcedure("GetCustBarcode", param);
                    }
                    LoadGridData(sender, e);
                    //重新输入单号后清除缓存
                    MidBoxArgument.Clear();
                    MidBoxCacheData.Clear();
                    BaseUtil.CleanDataTable(MidBoxCacheData);
                    SingleBoxArgument.Clear();
                    SingleBoxCacheData.Clear();
                    BaseUtil.CleanDataTable(SingleBoxCacheData);
                    MidIDAndOutboxcode.Clear();
                    SingleID.Clear();
                    //刷新采集进度
                    RefreshProcessData();
                    //设置当前的最大箱号
                    for (int i = 0; i < LabelInf.RowCount; i++)
                    {
                        string outboxcode = LabelInf.Rows[i].Cells["pib_outboxcode2"].Value.ToString();
                        //如果包含有-,则需要解析
                        if (outboxcode.Contains("-"))
                            if (int.Parse(outboxcode.Split('-')[0] == "" ? "1" : outboxcode.Split('-')[0]) > MaxOutBoxCode)
                                MaxOutBoxCode = int.Parse(outboxcode.Split('-')[0]);
                        //else
                        //if (int.Parse(outboxcode == "" ? "1" : outboxcode) > MaxOutBoxCode)
                        //    MaxOutBoxCode = int.Parse(outboxcode);
                    }
                    thread = new Thread(GetInOutInfAndLabelFile);
                    stw = new SetLoadingWindow(thread, "正在获取打印标签");
                    BaseUtil.SetFormCenter(stw);
                    stw.ShowDialog();
                    //重置采集项次
                    CurrentItemIndex = 0;
                    LogManager.DoLog("输入单号【" + pi_inoutno.Text + "】");
                }
                else
                    MessageBox.Show("当前出入库单号不存在!");
            }
        }

        private void SingleBoxPrint()
        {
            try
            {
                if (SingleDoc.Variables.FreeVariables.Count == 0) { }
            }
            catch (Exception)
            {
                MessageBox.Show("单盘标签未维护参数");
            }
            if (MidLabelAutoPrint.Checked)
            {
                try
                {
                    if (MidDoc.Variables.FreeVariables.Count == 0) { }
                }
                catch (Exception)
                {
                    MessageBox.Show("中盘标签未维护参数");
                }
            }
            string la_id = SingleLabelCombox.SelectedValue.ToString().Split('#')[0];
            string cl_labelname = SingleLabelCombox.Text;
            string LabelUrl = dh.getFieldDataByCondition("label left join customerlabel on la_code=cl_labelcode", "cl_labelurl", "la_id='" + la_id + "' and cl_labelname='" + cl_labelname + "'").ToString();
            //查询该模板维护的所有参数
            dt = (DataTable)dh.ExecuteSql("select lp_name,lp_sql from label left join LABELPARAMETER on la_id= lp_laid where la_id=" + la_id, "select");
            if (SingleLabelParam.Rows.Count > 0 && LabelInf.Rows.Count > 0)
            {
                //每次打印清除之前缓存的行号和ID,后面会判断需要打印的数据重新加载
                MidIDAndOutboxcode.Clear();
                SingleID.Clear();
                //获取全部的中盒号
                Dictionary<string, bool> outboxcode1 = new Dictionary<string, bool>();
                //判断所有盒号为该盒的是否勾选已采集
                outboxcode1.Add(LabelInf.Rows[0].Cells["pib_outboxcode1"].Value.ToString(), true);
                for (int i = 0; i < LabelInf.Rows.Count; i++)
                {
                    if (!SingleID.Contains(LabelInf.Rows[i].Cells["pib_id1"].Value.ToString()))
                        SingleID.Add(LabelInf.Rows[i].Cells["pib_id1"].Value.ToString());
                    if (LabelInf.Rows[i].Cells["Choose"].FormattedValue.ToString() == "True" && LabelInf.Rows[i].Cells["pib_ifpick"].FormattedValue.ToString() == "True" && LabelInf.Rows[i].Cells["pib_ifprint"].FormattedValue.ToString() != "True")
                    {
                        //如果不存在中盒号则进行添加
                        if (!MidIDAndOutboxcode.ContainsValue(LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString()))
                        {
                            MidIDAndOutboxcode.Add(LabelInf.Rows[i].Cells["pib_id1"].Value.ToString(), LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString());
                        }
                    }
                }
                if (SingleID.ToArray().Length == 0)
                {
                    MessageBox.Show("选择的行未勾选采集或者已打印");
                    return;
                }
                //打印的时候如果不存在数据开始缓存
                if (SingleBoxCacheData.Rows.Count == 0)
                    GetSingleBoxData();
                if (MidBoxCacheData.Rows.Count == 0)
                    GetMidBoxData();
                for (int i = 0; i < LabelInf.RowCount; i++)
                {
                    if (i + 1 < LabelInf.RowCount)
                    {
                        //如果本行的中盒号和下一行不相等的话
                        if (LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString() != LabelInf.Rows[i + 1].Cells["pib_outboxcode1"].Value.ToString())
                        {
                            if (!outboxcode1.ContainsKey(LabelInf.Rows[i + 1].Cells["pib_outboxcode1"].Value.ToString()))
                                outboxcode1.Add(LabelInf.Rows[i + 1].Cells["pib_outboxcode1"].Value.ToString(), true);
                        }
                    }
                    //只要有一行没有采集满就不打印
                    if (LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString() == LabelInf.Rows[CurrentRowIndex].Cells["pib_outboxcode1"].Value.ToString())
                    {
                        if (LabelInf.Rows[i].Cells["pib_ifpick"].FormattedValue.ToString() != "True")
                            outboxcode1[LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString()] = false;
                    }
                }
                //用于判断用户是否勾选了行
                int CheckedRowCount = 0;
                string[] arg = SingleBoxArgument.ToArray();
                for (int i = 0; i < LabelInf.RowCount; i++)
                {
                    //勾选了并且未打印
                    if (LabelInf.Rows[i].Cells["Choose"].FormattedValue.ToString() == "True" && LabelInf.Rows[i].Cells["pib_ifpick"].FormattedValue.ToString() == "True" && LabelInf.Rows[i].Cells["pib_ifprint"].FormattedValue.ToString() != "True")
                    {
                        CheckedRowCount = CheckedRowCount + 1;
                        CurrentRowIndex = i;
                        //以标签模板的参数为基准,循环取数
                        try
                        {
                            string pib_id = LabelInf.Rows[i].Cells["pib_id1"].Value.ToString();
                            DataRow[] dr = SingleBoxCacheData.Select("pib_id=" + pib_id);
                            StringBuilder ParamLog = new StringBuilder();
                            for (int j = 0; j < SingleDoc.Variables.FreeVariables.Count; j++)
                            {
                                if (arg.Contains(SingleDoc.Variables.FreeVariables.Item(j + 1).Name))
                                    SingleDoc.Variables.FreeVariables.Item(j + 1).Value = dr[0][SingleDoc.Variables.FreeVariables.Item(j + 1).Name].ToString();
                                if (SingleDoc.Variables.FreeVariables.Item(j + 1).Value == "")
                                {
                                    DataRow[] dr1 = Attach.Select("lp_name='" + SingleDoc.Variables.FreeVariables.Item(j + 1).Name + "'");
                                    if (dr1.Length > 0)
                                    {
                                        SingleDoc.Variables.FreeVariables.Item(j + 1).Value = dr1[0]["lp_sql"].ToString();
                                    }
                                }
                                ParamLog.AppendLine("pib_id:" + LabelInf.Rows[i].Cells["pib_id1"].Value.ToString() + ",SingleDoc打印参数【" + SingleDoc.Variables.FreeVariables.Item(j + 1).Name + "】赋值," + "取到值" + SingleDoc.Variables.FreeVariables.Item(j + 1).Value);
                            }
                            LogManager.DoLog(ParamLog.ToString());
                            SingleDoc.Printer.SwitchTo(SingleLabelPrinter.Text);
                            SingleDoc.PrintDocument();
                            if (MidLabelAutoPrint.Checked)
                            {
                                //判断当前行的盒号和下一行不相等或者已经是最后一行了
                                if (i + 1 == LabelInf.RowCount || LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString() != LabelInf.Rows[i + 1 == LabelInf.RowCount ? i : i + 1].Cells["pib_outboxcode1"].Value.ToString())
                                {
                                    if (outboxcode1[LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString()])
                                    {
                                        if (MidLabelCombox.SelectedValue != null)
                                        {
                                            string la_id_mid = MidLabelCombox.SelectedValue.ToString().Split('#')[0];
                                            MidBoxCodePrint(la_id_mid, CurrentRowIndex);
                                        }
                                    }
                                }
                            }
                            //勾选为已打印
                            LabelInf.Rows[i].Cells["pib_ifprint"].Value = true;
                        }
                        catch (Exception ex) { LogManager.DoLog(ex.Message); }
                    }
                }
                dh.BatchInsert("update prodiobarcode set pib_printdate=sysdate where pib_id=:pib_id", new string[] { "pib_id" }, SingleID.ToArray());
                MidBoxCacheData.Clear();
                BaseUtil.CleanDataTable(MidBoxCacheData);
                if (CheckedRowCount == 0)
                    MessageBox.Show("未勾选打印明细!");
                else if (CurrentRowIndex + 1 < LabelInf.Rows.Count)
                    CurrentRowIndex = CurrentRowIndex + 1;
                outboxcode1.Clear();
            }
            else
            {
                MessageBox.Show("此模板尚未维护参数或不存在打印明细");
                return;
            }
        }

        /// <summary>
        /// 缓存单盘的数据
        /// </summary>
        private void GetSingleBoxData()
        {
            if (SingleDoc == null)
                return;
            for (int i = 0; i < LabelInf.Rows.Count; i++)
            {
                if (!SingleID.Contains(LabelInf.Rows[i].Cells["pib_id1"].Value.ToString()))
                    SingleID.Add(LabelInf.Rows[i].Cells["pib_id1"].Value.ToString());
                //如果不存在中盒号则进行添加
                if (!MidIDAndOutboxcode.ContainsValue(LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString()))
                    MidIDAndOutboxcode.Add(LabelInf.Rows[i].Cells["pib_id1"].Value.ToString(), LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString());
            }
            //id数组
            string[] pib_id_arr = SingleID.ToArray();
            //将所有的列存在在这里
            List<DataTable> AllSingleBoxCacheData = new List<DataTable>();
            //每五百条拼接一次条件
            //手动添加ID列
            DataColumn datacolumn = new DataColumn("pib_id");
            if (!SingleBoxCacheData.Columns.Contains("pib_id"))
                SingleBoxCacheData.Columns.Add(datacolumn);
            //获取打印的SQL
            for (int j = 0; j < SingleDoc.Variables.FreeVariables.Count; j++)
            {
                //将维护的模板参数和模板本身的参数名称进行比对
                for (int k = 0; k < SingleLabelParam.Rows.Count; k++)
                {
                    if (SingleDoc.Variables.FreeVariables.Item(j + 1).Name == SingleLabelParam.Rows[k]["lp_name"].ToString())
                    {
                        DataColumn dc = new DataColumn(SingleDoc.Variables.FreeVariables.Item(j + 1).Name);
                        SingleBoxCacheData.Columns.Add(dc);
                        SingleBoxArgument.Add(SingleDoc.Variables.FreeVariables.Item(j + 1).Name);
                        string sql = SingleLabelParam.Rows[k]["lp_sql"].ToString();
                        sql = sql.Substring(0, sql.IndexOf("{"));
                        sql = sql.Substring(0, sql.LastIndexOf("="));
                        DataTable temp = dh.getFieldsDatasByCondition(sql.Replace(" from ", " ,pib_id PIBID from ") + " in (select pib_id from PRODIOBARCODE where pib_inoutno='" + pi_inoutno.Text + "') ORDER by pib_id");
                        temp.Columns[0].ColumnName = SingleDoc.Variables.FreeVariables.Item(j + 1).Name;
                        AllSingleBoxCacheData.Add(temp);
                    }
                }
            }
            DataTable[] Temp = AllSingleBoxCacheData.ToArray();
            //将所有数据写入到CacheData中
            if (Temp.Length > 0)
                for (int i = 0; i < Temp[0].Rows.Count; i++)
                {
                    DataRow dr = SingleBoxCacheData.NewRow();
                    dr["pib_id"] = pib_id_arr[i];
                    //由于之前加了一个ID列,导致j从1开始
                    for (int j = 1; j < SingleBoxCacheData.Columns.Count; j++)
                    {
                        dr[Temp[j - 1].Columns[0].ColumnName] = (Temp[j - 1].Select("PIBID=" + pib_id_arr[i]))[0][0];
                    }
                    SingleBoxCacheData.Rows.Add(dr);
                }
        }

        /// <summary>
        /// 缓存中盒的数据
        /// </summary>
        private void GetMidBoxData()
        {
            if (MidDoc == null)
                return;
            StringBuilder pib_condition_string = new StringBuilder();
            StringBuilder pib_qtycondition_string = new StringBuilder();
            for (int i = 0; i < LabelInf.Rows.Count; i++)
            {
                //如果不存在中盒号则进行添加
                if (!MidIDAndOutboxcode.ContainsValue(LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString()))
                {
                    MidIDAndOutboxcode.Add(LabelInf.Rows[i].Cells["pib_id1"].Value.ToString(), LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString());
                }
            }
            //id数组
            string[] pib_id_arr = MidIDAndOutboxcode.Keys.ToArray();
            string[] pib_outbox_arr = MidIDAndOutboxcode.Values.ToArray();
            if (pib_id_arr.Length == 0)
            {
                MessageBox.Show("未勾选打印明细");
                return;
            }
            //记录一个ID用来取中盒的数量
            string pib_id = pib_id_arr[0];
            //id个数
            //将所有的列存在在这里
            List<DataTable> AllMidBoxCacheData = new List<DataTable>();
            //每五百条拼接一次条件
            //手动添加ID列
            DataColumn IDColumn = new DataColumn("pib_id");
            DataColumn OutBoxColumn = new DataColumn("pib_outboxcode1");
            if (!MidBoxCacheData.Columns.Contains("pib_id"))
                MidBoxCacheData.Columns.Add(IDColumn);
            if (!MidBoxCacheData.Columns.Contains("pib_outboxcode1"))
                MidBoxCacheData.Columns.Add(OutBoxColumn);
            if (MidLabelCombox.SelectedValue == null)
            {
                return;
            }
            string la_id = MidLabelCombox.SelectedValue.ToString().Split('#')[0];
            for (int j = 0; j < MidDoc.Variables.FreeVariables.Count; j++)
            {
                //将维护的模板参数和模板本身的参数名称进行比对
                for (int k = 0; k < MidLabelParam.Rows.Count; k++)
                {
                    if (MidDoc.Variables.FreeVariables.Item(j + 1).Name == MidLabelParam.Rows[k]["lp_name"].ToString())
                    {
                        DataColumn dc = new DataColumn(MidDoc.Variables.FreeVariables.Item(j + 1).Name);
                        MidBoxCacheData.Columns.Add(dc);
                        MidBoxArgument.Add(MidDoc.Variables.FreeVariables.Item(j + 1).Name);
                        string sql = MidLabelParam.Rows[k]["lp_sql"].ToString();
                        //如果打印的含有数量
                        if (sql.ToLower().Contains("pib_qty"))
                        {
                            sql = sql.Substring(0, sql.IndexOf("{")) + pib_id + sql.Substring(sql.IndexOf("}") + 1);
                            sql = sql.Substring(0, sql.LastIndexOf("=")) + " in (select distinct pib_outboxcode1 from PRODIOBARCODE where pib_inoutno='" + pi_inoutno.Text + "')" + sql.Substring(sql.LastIndexOf("}") + 1);
                        }
                        else
                        {
                            sql = sql.Substring(0, sql.IndexOf("{"));
                            sql = sql.Substring(0, sql.LastIndexOf("="));
                            sql = sql + " in (select distinct pib_outboxcode1 from PRODIOBARCODE where pib_inoutno='" + pi_inoutno.Text + "')" + " and pib_inoutno='" + pi_inoutno.Text + "' order by to_number(pib_outboxcode1)";
                        }
                        DataTable temp = dh.getFieldsDatasByCondition(sql);
                        temp.Columns[0].ColumnName = MidDoc.Variables.FreeVariables.Item(j + 1).Name;
                        AllMidBoxCacheData.Add(temp);
                    }
                }
            }
            DataTable[] Temp = AllMidBoxCacheData.ToArray();
            //将所有数据写入到CacheData中
            if (Temp.Length > 0)
            {
                for (int i = 0; i < pib_id_arr.Length; i++)
                {
                    DataRow dr = MidBoxCacheData.NewRow();
                    dr["pib_id"] = pib_id_arr[i];
                    dr["pib_outboxcode1"] = pib_outbox_arr[i];
                    //由于之前加了一个ID列和箱号,导致j从2开始
                    for (int j = 2; j < MidBoxCacheData.Columns.Count; j++)
                    {
                        //选出勾选的中盒号
                        dr[Temp[j - 2].Columns[0].ColumnName] = Temp[j - 2].Select("PIB_OUTBOXCODE1='" + pib_outbox_arr[i] + "'")[0][0];
                    }
                    MidBoxCacheData.Rows.Add(dr);
                }
            }
        }

        private void SingleLabelPrint_Click(object sender, EventArgs e)
        {
            if (SingleLabelCombox.Text != "")
            {
                if (SingleBoxBegin.Text != "" || SingleBoxEnd.Text != "")
                {
                    try
                    {
                        int begin = int.Parse(SingleBoxBegin.Text == "" ? "1" : SingleBoxBegin.Text);
                        int end = int.Parse(SingleBoxEnd.Text == "" ? LabelInf.Rows.Count.ToString() : SingleBoxEnd.Text);
                        if (begin > 0 && end <= LabelInf.Rows.Count && begin <= end)
                        {
                            for (int i = begin - 1; i < end; i++)
                            {
                                LabelInf.Rows[i].Cells["Choose"].Value = true;
                                LabelInf.Rows[i].Cells["pib_ifpick"].Value = true;
                                LabelInf.Rows[i].Cells["pib_ifprint"].Value = false;
                            }
                        }
                        else
                        {
                            MessageBox.Show("单盘打印范围错误");
                            return;
                        }
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("单盘打印范围错误");
                        return;
                    }
                }
                thread = new Thread(SingleBoxPrint);
                stw = new SetLoadingWindow(thread, "正在打印单盘");
                BaseUtil.SetFormCenter(stw);
                stw.ShowDialog();
            }
            else
                MessageBox.Show("未维护单盘标签");
        }

        private void MidBoxLabelPrint()
        {
            //未输入内容打印全部中盒
            if (MidLabelNum.Text == "")
            {
                int begin = 0;
                int end = 0;
                if (MidBoxBegin.Text != "" || MidBoxEnd.Text != "")
                {
                    try
                    {
                        begin = int.Parse(MidBoxBegin.Text == "" ? "1" : MidBoxBegin.Text);
                        end = int.Parse(MidBoxEnd.Text == "" ? LabelInf.Rows[LabelInf.Rows.Count - 1].Cells["pib_outboxcode1"].Value.ToString() : MidBoxEnd.Text);
                        int minmidbox = int.Parse(LabelInf.Rows[0].Cells["pib_outboxcode1"].Value.ToString());
                        int maxmidbox = int.Parse(LabelInf.Rows[LabelInf.Rows.Count - 1].Cells["pib_outboxcode1"].Value.ToString());
                        if (begin >= minmidbox && end <= maxmidbox && begin <= end)
                        {
                            //设置中盒打印范围的行号
                            for (int i = 0; i < LabelInf.Rows.Count; i++)
                            {
                                if (int.Parse(LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString()) == begin)
                                {
                                    begin = i;
                                }
                                if (int.Parse(LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString()) == end)
                                {
                                    end = i;
                                }
                            }
                        }
                        else
                        {
                            MessageBox.Show("中盒打印范围错误");
                            return;
                        }
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("中盒打印范围错误");
                        return;
                    }
                }
                MidBoxArgument.Clear();
                MidBoxCacheData.Clear();
                BaseUtil.CleanDataTable(MidBoxCacheData);
                List<int> MidOutBoxCode = new List<int>();
                List<int> MidOutBoxCodeIndex = new List<int>();
                string la_id = MidLabelCombox.SelectedValue.ToString().Split('#')[0];
                for (int i = (begin == 0 ? 0 : begin); i <= (end == 0 ? LabelInf.Rows.Count - 1 : end); i++)
                {
                    if (!MidIDAndOutboxcode.ContainsValue(LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString()))
                        MidIDAndOutboxcode.Add(LabelInf.Rows[i].Cells["pib_id1"].Value.ToString(), LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString());
                    if (!MidOutBoxCode.Contains(int.Parse(LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString())))
                    {
                        MidOutBoxCode.Add(int.Parse(LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString()));
                        MidOutBoxCodeIndex.Add(i);
                    }
                }
                GetMidBoxData();
                for (int i = 0; i < MidOutBoxCodeIndex.Count; i++)
                {
                    MidBoxCodePrint(la_id, MidOutBoxCodeIndex[i]);
                }
                MidBoxArgument.Clear();
                MidBoxCacheData.Clear();
                BaseUtil.CleanDataTable(MidBoxCacheData);
                return;
            }
            bool FindMidLabel = false;
            if (MidLabelCombox.SelectedValue != null)
            {
                string la_id = MidLabelCombox.SelectedValue.ToString().Split('#')[0];
                string cl_labelname = MidLabelCombox.Text;
                string LabelUrl = dh.getFieldDataByCondition("label left join customerlabel on la_code=cl_labelcode", "cl_labelurl", "la_id='" + la_id + "' and cl_labelname='" + cl_labelname + "'").ToString();
                //中盒号所在的行
                int MidLabelRowIndex = 0;
                //查找是否存在该中盒号
                List<int> MidRowIndex = new List<int>();
                //缓存中盒数据
                for (int i = 0; i < LabelInf.RowCount; i++)
                {
                    if (MidLabelNum.Text == LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString())
                    {
                        //找到了输入的中盒号停止循环
                        FindMidLabel = true;
                        MidLabelRowIndex = i;
                        MidRowIndex.Add(i);
                    }
                }
                //找到了指定的盒号
                if (FindMidLabel)
                    MidBoxCodePrint(la_id, MidLabelRowIndex, MidRowIndex.ToArray());
                else
                    MessageBox.Show("该出入库单未找到该中盒号!");
            }
            else
                MessageBox.Show("未维护中盒模板");
        }

        private void MidLabelPrint_Click(object sender, EventArgs e)
        {
            if (MidLabelCombox.Text != "")
            {
                thread = new Thread(MidBoxLabelPrint);
                stw = new SetLoadingWindow(thread, "正在打印中盒");
                BaseUtil.SetFormCenter(stw);
                stw.ShowDialog();
            }
            else
                MessageBox.Show("未维护中盒标签");
        }

        private void OutBoxPrint()
        {
            List<string> Outboxcode = new List<string>();
            //如果未勾选箱号则对勾选的数据的箱号进行整合
            string la_id = OutBoxCombox.SelectedValue.ToString().Split('#')[0];
            string cl_labelname = OutBoxCombox.Text;
            string LabelUrl = dh.getFieldDataByCondition("label left join customerlabel on la_code=cl_labelcode", "cl_labelurl", "la_id='" + la_id + "' and cl_labelname='" + cl_labelname + "'").ToString();
            if (OutBoxNum.Text == "")
            {
                for (int i = 0; i < LabelInf.RowCount; i++)
                {
                    if (LabelInf.Rows[i].Cells["Choose"].FormattedValue.ToString() == "True")
                    {
                        string outboxcode2 = LabelInf.Rows[i].Cells["pib_outboxcode2"].Value.ToString();
                        //富为使用包装单的逻辑
                        //如果不包含该箱号则进行添加
                        if (!Outboxcode.Contains(outboxcode2))
                            Outboxcode.Add(outboxcode2);
                    }
                }
                //按获取到的箱号列表进行打印
                if (Outboxcode.ToArray().Length > 0)
                {
                    try
                    {
                        // 循环打印外箱号
                        for (int i = 0; i < Outboxcode.ToArray().Length; i++)
                        {
                            for (int h = 0; h < LabelInf.RowCount; h++)
                            {
                                if (LabelInf.Rows[h].Cells["pib_outboxcode2"].Value.ToString() == Outboxcode.ToArray()[i])
                                {
                                    OutBoxCodePrint(la_id, h);
                                    break;
                                }
                            }
                        }
                    }
                    catch { }
                }
                else
                {
                    MessageBox.Show("请勾选需要打印的外箱");
                }
            }
            else
            {
                bool FindMidLabel = false;
                try
                {
                    int OutBoxLabelRowIndex = 0;
                    //查找是否存在该中盒号
                    for (int i = 0; i < LabelInf.RowCount; i++)
                    {
                        if (OutBoxNum.Text == LabelInf.Rows[i].Cells["pib_outboxcode2"].Value.ToString())
                        {
                            //找到了输入的中盒号停止循环
                            FindMidLabel = true;
                            OutBoxLabelRowIndex = i;
                            break;
                        }
                    }
                    //找到了指定的盒号
                    if (FindMidLabel)
                        OutBoxCodePrint(la_id, OutBoxLabelRowIndex);
                    else
                        MessageBox.Show("该出入库单未找到该外箱号!");
                }
                catch (Exception) { }
            }
            Outboxcode.Clear();
        }

        private void MidBoxCodePrint(string la_id, int rowindex)
        {
            if (MidBoxCacheData.Rows.Count == 0)
            {
                MidIDAndOutboxcode.Add(LabelInf.Rows[rowindex].Cells["pib_id1"].Value.ToString(), LabelInf.Rows[rowindex].Cells["pib_outboxcode1"].Value.ToString());
                GetMidBoxData();
            }
            DataTable dt = (DataTable)dh.ExecuteSql("select lp_name,lp_sql from label left join LABELPARAMETER on la_id= lp_laid where la_id=" + la_id, "select");
            string[] arg = MidBoxArgument.ToArray();
            for (int j = 0; j < MidDoc.Variables.FreeVariables.Count; j++)
            {
                //将维护的模板参数和模板本身的参数名称进行比对
                for (int k = 0; k < MidLabelParam.Rows.Count; k++)
                {
                    //名称相等的时候,取SQL进行值的查询
                    if (MidDoc.Variables.FreeVariables.Item(j + 1).Name == MidLabelParam.Rows[k]["lp_name"].ToString())
                    {
                        //获取对应行的pib_id
                        string pib_id = LabelInf.Rows[rowindex].Cells["pib_id1"].Value.ToString();
                        string pib_outboxcode1 = LabelInf.Rows[rowindex].Cells["pib_outboxcode1"].Value.ToString();
                        //获取打印执行的SQL
                        string sql = MidLabelParam.Rows[k]["lp_sql"].ToString();
                        try
                        {
                            //获取打印执行的SQL
                            if (sql.IndexOf("{") == 0)
                            {
                                MidDoc.Variables.FreeVariables.Item(j + 1).Value = dh.GetLabelParam(sql).ToString();
                                LogManager.DoLog("打印参数【" + MidDoc.Variables.FreeVariables.Item(j + 1).Name + "】赋值," + "取值SQL:" + dt.Rows[k]["lp_sql"].ToString() + ",取到值" + MidDoc.Variables.FreeVariables.Item(j + 1).Value);
                            }
                            else
                            {
                                DataRow[] dr = MidBoxCacheData.Select("pib_outboxcode1='" + pib_outboxcode1 + "'");
                                if (arg.Contains(MidDoc.Variables.FreeVariables.Item(j + 1).Name))
                                {
                                    if (dr.Length > 0)
                                    {
                                        MidDoc.Variables.FreeVariables.Item(j + 1).Value = dr[0][MidDoc.Variables.FreeVariables.Item(j + 1).Name].ToString();
                                    }
                                }
                                if (MidDoc.Variables.FreeVariables.Item(j + 1).Value == "")
                                {
                                    DataRow[] dr1 = Attach.Select("lp_name='" + MidDoc.Variables.FreeVariables.Item(j + 1).Name + "'");
                                    if (dr1.Length > 0)
                                    {
                                        MidDoc.Variables.FreeVariables.Item(j + 1).Value = dr1[0]["lp_sql"].ToString();
                                    }
                                }
                                LogManager.DoLog("打印参数【" + MidDoc.Variables.FreeVariables.Item(j + 1).Name + "】赋值," + "取值SQL:" + sql + ",取到值" + MidDoc.Variables.FreeVariables.Item(j + 1).Value);
                            }
                        }
                        catch (Exception)
                        {
                            LogManager.DoLog("SQL维护不正确,请检查SQL语句\n" + sql);
                            return;
                        }
                    }
                }
            }
            MidDoc.Printer.SwitchTo(MidLabelPrinter.Text);
            MidDoc.PrintDocument();
        }

        private void MidBoxCodePrint(string la_id, int rowindex, int[] midindex)
        {
            for (int j = 0; j < MidDoc.Variables.FreeVariables.Count; j++)
            {
                //将维护的模板参数和模板本身的参数名称进行比对
                for (int k = 0; k < MidLabelParam.Rows.Count; k++)
                {
                    //名称相等的时候,取SQL进行值的查询
                    if (MidDoc.Variables.FreeVariables.Item(j + 1).Name == MidLabelParam.Rows[k]["lp_name"].ToString())
                    {
                        //获取对应行的pib_id
                        string pib_id = LabelInf.Rows[rowindex].Cells["pib_id1"].Value.ToString();
                        string pib_outboxcode1 = LabelInf.Rows[rowindex].Cells["pib_outboxcode1"].Value.ToString();
                        //获取打印执行的SQL
                        string sql = MidLabelParam.Rows[k]["lp_sql"].ToString();
                        try
                        {
                            //获取打印执行的SQL
                            if (sql.IndexOf("{") == 0)
                            {
                                MidDoc.Variables.FreeVariables.Item(j + 1).Value = dh.GetLabelParam(sql).ToString();
                                LogManager.DoLog("打印参数【" + MidDoc.Variables.FreeVariables.Item(j + 1).Name + "】赋值," + "取值SQL:" + dt.Rows[k]["lp_sql"].ToString() + ",取到值" + MidDoc.Variables.FreeVariables.Item(j + 1).Value);
                            }
                            else
                            {
                                if (sql.ToLower().Contains("pib_qty"))
                                {
                                    sql = sql.Substring(0, sql.IndexOf("{")) + pib_id + sql.Substring(sql.IndexOf("}") + 1);
                                    sql = sql.Substring(0, sql.LastIndexOf("=")) + "='" + pib_outboxcode1 + "' group by pib_outboxcode1";
                                }
                                else
                                {
                                    sql = sql.Substring(0, sql.IndexOf("{"));
                                    sql = sql.Substring(0, sql.LastIndexOf("="));
                                    sql = sql + " in (select distinct pib_outboxcode1 from PRODIOBARCODE where pib_inoutno='" + pi_inoutno.Text + "')" + " and pib_inoutno='" + pi_inoutno.Text + "' and pib_outboxcode1='" + pib_outboxcode1 + "'";
                                }
                                MidDoc.Variables.FreeVariables.Item(j + 1).Value = dh.GetLabelParam(sql).ToString();
                                if (MidDoc.Variables.FreeVariables.Item(j + 1).Value == "")
                                {
                                    DataRow[] dr1 = Attach.Select("lp_name='" + MidDoc.Variables.FreeVariables.Item(j + 1).Name + "'");
                                    if (dr1.Length > 0)
                                    {
                                        MidDoc.Variables.FreeVariables.Item(j + 1).Value = dr1[0]["lp_sql"].ToString();
                                    }
                                }
                                LogManager.DoLog("打印参数【" + MidDoc.Variables.FreeVariables.Item(j + 1).Name + "】赋值," + "取值SQL:" + sql + ",取到值" + MidDoc.Variables.FreeVariables.Item(j + 1).Value);
                            }
                        }
                        catch (Exception)
                        {
                            LogManager.DoLog("SQL维护不正确,请检查SQL语句\n" + sql);
                            return;
                        }
                    }
                }
            }
            MidDoc.Printer.SwitchTo(MidLabelPrinter.Text);
            MidDoc.PrintDocument();
        }

        /// <summary>
        /// 执行打印外箱号
        /// </summary>
        private void OutBoxCodePrint(string la_id, int rowindex)
        {
            DataTable dt = (DataTable)dh.ExecuteSql("select lp_name,lp_sql,lp_valuetype from label left join LABELPARAMETER on la_id= lp_laid where la_id=" + la_id, "select");
            try
            {
                for (int j = 0; j < OutBoxDoc.Variables.FreeVariables.Count; j++)
                {
                    //将维护的模板参数和模板本身的参数名称进行比对
                    for (int k = 0; k < OutLabelParam.Rows.Count; k++)
                    {
                        //名称相等的时候,取SQL进行值的查询
                        if (OutBoxDoc.Variables.FreeVariables.Item(j + 1).Name == OutLabelParam.Rows[k]["lp_name"].ToString())
                        {
                            //获取对应行的pib_id
                            string pib_id = LabelInf.Rows[rowindex].Cells["pib_id1"].Value.ToString();
                            string pib_outboxcode2 = LabelInf.Rows[rowindex].Cells["pib_outboxcode2"].Value.ToString();
                            //获取打印执行的SQL
                            string sql = OutLabelParam.Rows[k]["lp_sql"].ToString();
                            //select * from productiobarcode where pib_id={pib_id} and pib_outboxcode1={pib_outboxcode1}
                            try
                            {
                                string ExeSQL = "";
                                ExeSQL = sql.ToLower().Replace("{pib_id}", "'" + pib_id + "'");
                                ExeSQL = ExeSQL.Replace("{pib_outboxcode2}", "'" + pib_outboxcode2 + "'");
                                OutBoxDoc.Variables.FreeVariables.Item(j + 1).Value = dh.GetLabelParam(ExeSQL).ToString();
                                if (OutBoxDoc.Variables.FreeVariables.Item(j + 1).Value == "")
                                {
                                    DataRow[] dr1 = Attach.Select("lp_name='" + OutBoxDoc.Variables.FreeVariables.Item(j + 1).Name + "'");
                                    if (dr1.Length > 0)
                                    {
                                        OutBoxDoc.Variables.FreeVariables.Item(j + 1).Value = dr1[0]["lp_sql"].ToString();
                                    }
                                }
                                LogManager.DoLog("打印参数【" + OutBoxDoc.Variables.FreeVariables.Item(j + 1).Name + "】赋值," + "取值SQL:" + ExeSQL + ",取到值" + OutBoxDoc.Variables.FreeVariables.Item(j + 1).Value);
                            }
                            catch (Exception)
                            {
                                LogManager.DoLog("SQL维护不正确,请检查SQL语句" + sql);
                                MessageBox.Show("SQL维护不正确,请检查SQL语句\n" + sql);
                                return;
                            }
                        }
                    }
                }
                OutBoxDoc.Printer.SwitchTo(OutBoxPrinter.Text);
                OutBoxDoc.PrintDocument();
                LogManager.DoLog("执行打印外箱,pib_id:" + LabelInf.Rows[rowindex].Cells["pib_id1"].Value.ToString());
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void CleanDetail_Click(object sender, EventArgs e)
        {
            ArrayList<string> DeleteID = new ArrayList<string>();
            for (int i = 0; i < LabelInf.RowCount; i++)
            {
                if (LabelInf.Rows[i].Cells["Choose"].FormattedValue.ToString() == "True")
                    DeleteID.Add(LabelInf.Rows[i].Cells["pib_id1"].Value.ToString());
            }
            //勾选了删除的明细之后
            if (DeleteID.ToArray().Length > 0)
            {
                string close = MessageBox.Show(this.ParentForm, "删除后不可恢复,是否确认删除", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question).ToString();
                if (close.ToString() == "Yes")
                {
                    dh.BatchInsert("delete from prodiobarcode where pib_id=:pib_id", new string[] { "pib_id" }, DeleteID.ToArray());
                    MessageBox.Show("删除成功");
                    LoadGridData(sender, e);
                    RefreshProcessData();
                }
            }
            else
                MessageBox.Show("尚未勾选需要删除的明细");
        }

        private void OutBoxLabelPrint_Click(object sender, EventArgs e)
        {
            if (OutBoxCombox.Text != "")
            {
                thread = new Thread(OutBoxPrint);
                stw = new SetLoadingWindow(thread, "正在打印外箱");
                BaseUtil.SetFormCenter(stw);
                stw.ShowDialog();
            }
            else
                MessageBox.Show("未维护外箱标签");
        }

        /// <summary>
        /// 刷新采集进度
        /// </summary>
        private void RefreshProcessData()
        {
            if (LabelInf.Rows.Count > 0)
            {
                //设置初始化的采集进度
                int Count = 0;
                int CurrentMidBoxCollectedCount = 0;
                //当前盒号的总盘数
                int CurrentMidBoxTotalCount = 0;
                //未超出当前范围的时候
                for (int i = 0; i < LabelInf.RowCount; i++)
                {
                    if (LabelInf.Rows[i].Cells["pib_ifpick"].FormattedValue.ToString() == "True")
                        Count++;
                    //和当前编辑箱号相等行
                    if (LabelInf.Rows[i].Cells["pib_ifpick"].FormattedValue.ToString() == "True" && LabelInf.Rows[CurrentRowIndex].Cells["pib_outboxcode1"].Value.ToString() == LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString())
                        CurrentMidBoxCollectedCount++;
                    //当前盒号一共有几盘
                    if (LabelInf.Rows[CurrentRowIndex].Cells["pib_outboxcode1"].Value.ToString() == LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString())
                        CurrentMidBoxTotalCount++;
                }
                Capacity.Text = "可装" + CurrentMidBoxTotalCount + "盘";
                Installed.Text = "已装" + CurrentMidBoxCollectedCount + "盘";
                //设置当前的箱号和盒号
                Process_outboxcode.Text = LabelInf.Rows[CurrentRowIndex].Cells["pib_outboxcode2"].Value.ToString();
                Process_midboxcode.Text = LabelInf.Rows[CurrentRowIndex].Cells["pib_outboxcode1"].Value.ToString();
                //设置当前总数和已采集数量
                TotalCount.Text = LabelInf.RowCount.ToString();
                CollectedCount.Text = Count.ToString();
            }
        }

        private void LoadGridData()
        {
            LoadGridData(new object(), new EventArgs());
        }

        /// <summary>
        /// 自定义函数  加载明细行的数据,多处使用添加进函数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void LoadGridData(object sender, EventArgs e)
        {
            AllCollect = false;
            PrintedVivoOutboxCode.Clear();
            //如果是富为则使用特殊的查询语句                                
            if (DataHelper.DBConnectionString.Contains("richwell") || DataHelper.DBConnectionString.Contains("192.168.0.88"))
            {
                sql.Clear();
                sql.Append("select pd_custprodcode,pd_pocode,pd_inoutno,pib_cusbarcode,pib_cusoutboxcode,pib_id,pib_pdid,pib_piid,pib_pdno,pib_prodcode,");
                sql.Append("pr_brand,pr_vendprodcode,pib_lotno,pib_datecode,pib_qty,pib_barcode,pib_outboxcode1,pib_outboxcode2,pib_ifpick,pib_ifprint,");
                sql.Append("pr_spec,pd_prodcode,pd_pocode,pr_code from prodiobarcode  left join prodiodetail on pib_piid=pd_piid and pd_pdno=pib_pdno ");
                sql.Append("and pd_prodcode=pib_prodcode left join product on pr_code=pib_prodcode left join (select pd_prodcode ");
                sql.Append("prcode,pd_pocode pocode,max(pd_detno) pd_detno from  prodinout left join packing on packing.pi_code=prodinout.pi_packingcode ");
                sql.Append("left join packingdetail on packing.pi_id=pd_piid where prodinout.pi_id='" + PI_ID + "' group by pd_prodcode,pd_pocode");
                sql.Append(")A on pd_pocode=A.pocode and pd_prodcode=A.PRCODE where pd_piid='" + PI_ID + "' order by pr_code,a.pd_detno,pib_id");
                GetOutBoxCode.Visible = true;
            }
            else
            {
                sql.Clear();
                sql.Append("select pd_custprodcode,pd_custprodspec,pd_pocode,pib_madein,pib_custbarcode,pib_custoutboxcode,pib_id,pib_datecode1,pib_pdid,pib_piid,pib_pdno,pib_prodcode,nvl(nvl(pd_brand,pib_brand),pr_brand)pib_brand, pr_vendprodcode,");
                sql.Append("pib_lotno,pib_datecode,pib_qty,pr_spec,pr_zxbzs,pr_unit,pib_barcode,pib_outboxcode1,pib_outboxcode2,nvl(pib_ifpick,0)pib_ifpick,nvl(pib_ifprint,0)pib_ifprint");
                sql.Append(" from prodiobarcode left join prodiodetail on pib_piid=pd_piid and pd_pdno=pib_pdno and ");
                sql.Append(" pd_prodcode=pib_prodcode left join product on pr_code=pib_prodcode left join sale on sa_code=pib_ordercode ");
                sql.Append("where pib_piid='" + PI_ID + "' order by to_number(pib_outboxcode1),pib_id,pd_prodcode");
            }
            dt = (DataTable)dh.ExecuteSql(sql.ToString(), "select");
            MidSource.DataSource = dt;
            BaseUtil.FillDgvWithDataTable(LabelInf, (DataTable)MidSource.DataSource);
            //有数据的话默认取第一条的品牌去取采集策略
            TotalCount.Text = LabelInf.RowCount.ToString();
            if (LabelInf.RowCount > 0)
            {
                Brand = LabelInf.Rows[0].Cells["pib_brand"].FormattedValue.ToString();
                if (Brand != "")
                    sg_code.Text = dh.getFieldDataByCondition("scangroup", "sg_code", "sg_brand='" + Brand + "'").ToString();
                SetOutBoxCapacity(LabelInf.Rows[0].Cells["pib_prodcode"].Value.ToString());
            }
            //绑定数据之后往下找到未采集的数据显示在当前采集的栏目
            for (int i = 0; i < LabelInf.RowCount; i++)
            {
                if (LabelInf.Rows[i].Cells["pib_ifpick"].FormattedValue.ToString() != "True")
                {
                    griddetno.Text = LabelInf.Rows[i].Cells["pib_pdno"].FormattedValue.ToString();
                    pr_code.Text = LabelInf.Rows[i].Cells["pib_prodcode"].FormattedValue.ToString();
                    pib_id.Text = LabelInf.Rows[i].Cells["pib_id1"].FormattedValue.ToString();
                    CurrentRowIndex = LabelInf.Rows[i].Cells["pib_prodcode"].RowIndex;
                    break;
                }
            }
        }

        /// <summary>
        /// 重绘Cell的颜色
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void LabelInf_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            bool mouseOver = e.CellBounds.Contains(this.PointToClient(Cursor.Position));
            if (e.ColumnIndex > 0)
            {
                if (LabelInf.Columns[e.ColumnIndex].Name == "pib_madein" || LabelInf.Columns[e.ColumnIndex].Name == "pib_lotno" || LabelInf.Columns[e.ColumnIndex].Name == "pib_datecode" || LabelInf.Columns[e.ColumnIndex].Name == "pib_outboxcode1" || LabelInf.Columns[e.ColumnIndex].Name == "pib_outboxcode2" || LabelInf.Columns[e.ColumnIndex].Name == "pib_brand")
                {
                    SolidBrush solidBrush = new SolidBrush(Color.FromArgb(51, 153, 255));
                    e.Graphics.FillRectangle(mouseOver ? solidBrush : Brushes.LightSeaGreen, e.CellBounds);
                    Rectangle border = e.CellBounds;
                    border.Width -= 1;
                    e.Graphics.DrawRectangle(Pens.White, border);
                    e.PaintContent(e.CellBounds);
                    e.Handled = true;
                }
                if (e.RowIndex >= 0)
                {
                    //重绘制定的Cell,表示采集的数量不匹配
                    if (LabelInf.Columns[e.ColumnIndex].Name == "pib_qty" && PaintCell.ContainsKey(LabelInf.Rows[e.RowIndex].Cells["pib_qty"]))
                    {
                        SolidBrush solidBrush = new SolidBrush(Color.FromArgb(51, 153, 255));
                        e.Graphics.FillRectangle(PaintCell[LabelInf.Rows[e.RowIndex].Cells["pib_qty"]] ? Brushes.ForestGreen : Brushes.Red, e.CellBounds);
                        Rectangle border = e.CellBounds;
                        border.Width -= 1;
                        e.Graphics.DrawRectangle(Pens.Black, border);
                        e.PaintContent(e.CellBounds);
                        e.Handled = true;
                    }
                    //表示采集的供应商物料编号不匹配
                    if (LabelInf.Columns[e.ColumnIndex].Name == "pr_vendprodcode" && PaintCell.ContainsKey(LabelInf.Rows[e.RowIndex].Cells["pr_vendprodcode"]))
                    {
                        SolidBrush solidBrush = new SolidBrush(Color.FromArgb(51, 153, 255));
                        e.Graphics.FillRectangle(PaintCell[LabelInf.Rows[e.RowIndex].Cells["pr_vendprodcode"]] ? Brushes.ForestGreen : Brushes.Red, e.CellBounds);
                        Rectangle border = e.CellBounds;
                        border.Width -= 1;
                        e.Graphics.DrawRectangle(Pens.Black, border);
                        e.PaintContent(e.CellBounds);
                        e.Handled = true;
                    }
                    //表示采集的供应商物料编号不匹配
                    if (LabelInf.Columns[e.ColumnIndex].Name == "pib_brand" && PaintCell.ContainsKey(LabelInf.Rows[e.RowIndex].Cells["pib_brand"]))
                    {
                        SolidBrush solidBrush = new SolidBrush(Color.FromArgb(51, 153, 255));
                        e.Graphics.FillRectangle(PaintCell[LabelInf.Rows[e.RowIndex].Cells["pib_brand"]] ? Brushes.ForestGreen : Brushes.Red, e.CellBounds);
                        Rectangle border = e.CellBounds;
                        border.Width -= 1;
                        e.Graphics.DrawRectangle(Pens.Black, border);
                        e.PaintContent(e.CellBounds);
                        e.Handled = true;
                    }
                }
            }
        }

        private void pr_code_SearchIconClick(object sender, EventArgs e)
        {
            pr_code.Condition = "  pd_inoutno='" + pi_inoutno.Text + "'";
        }

        private void OutBoxLabelPackage_Click(object sender, EventArgs e)
        {
            thread = new Thread(CusLabelPrint);
            stw = new SetLoadingWindow(thread, "正在打印客户外箱号");
            BaseUtil.SetFormCenter(stw);
            stw.ShowDialog();
        }

        private void CusLabelPrint()
        {
            //MaxOutBoxCode = MaxOutBoxCode + 1;
            List<int> CusOutBoxCode = new List<int>();
            //统计客户外箱号
            if (LabelInf.Rows.Count > 0)
                CusOutBoxCode.Add(0);
            for (int i = 0; i < LabelInf.Rows.Count; i++)
            {
                if (i - 1 > 0 && LabelInf.Rows[i].Cells["pib_ifprint"].FormattedValue.ToString() == "True")
                {
                    string cutboxcode = LabelInf.Rows[i].Cells["pib_cusoutboxcode"].Value.ToString();
                    string nextcutboxcode = LabelInf.Rows[i - 1].Cells["pib_cusoutboxcode"].Value.ToString();
                    if (cutboxcode != nextcutboxcode)
                        CusOutBoxCode.Add(i);
                }
            }
            //打印外箱号
            string la_id = OutBoxCombox.SelectedValue.ToString().Split('#')[0];
            for (int i = 0; i < CusOutBoxCode.Count; i++)
            {
                if (!PrintedVivoOutboxCode.Contains(CusOutBoxCode[i].ToString()))
                {
                    OutBoxCodePrint(la_id, CusOutBoxCode[i]);
                    PrintedVivoOutboxCode.Add(CusOutBoxCode[i].ToString());
                }
            }
        }

        private void pr_code_UserControlTextChanged(object sender, EventArgs e)
        {
            //用户在重新勾选后重置采集项目的索引
            CurrentItemIndex = 0;
            for (int i = 0; i < LabelInf.RowCount; i++)
            {
                if (pr_code.Text == LabelInf.Rows[i].Cells["pib_prodcode"].Value.ToString() && LabelInf.Rows[i].Cells["pib_ifpick"].FormattedValue.ToString() != "True")
                {
                    CurrentRowIndex = i;
                    break;
                }
            }
        }

        private void Refresh_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            KeyEventArgs e2 = new KeyEventArgs(Keys.Enter);
            pi_inoutno_KeyDown(sender, e2);
        }

        /// <summary>
        /// 采集明细切换
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void griddetno_KeyDown(object sender, KeyEventArgs e)
        {
            if (Keys.Enter == e.KeyData)
            {
                bool FindDetno = false;
                for (int i = 0; i < LabelInf.RowCount; i++)
                {
                    if (LabelInf.Rows[i].Cells["pib_pdno"].Value.ToString() == griddetno.Text && LabelInf.Rows[i].Cells["pib_ifpick"].FormattedValue.ToString() != "True")
                    {
                        FindDetno = true;
                        CurrentItemIndex = 0;
                        CurrentRowIndex = i;
                        RemindUser();
                        break;
                    }
                }
                if (!FindDetno)
                {
                    MessageBox.Show("不存在未采集的明细序号" + griddetno.Text);
                    return;
                }
            }
        }

        private void AutoPrintMidLabel()
        {
            bool FullBox = true;
            //判断所有盒号未该盒的是否勾选已采集
            for (int i = 0; i < LabelInf.RowCount; i++)
            {
                if (LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString() == LabelInf.Rows[CurrentRowIndex].Cells["pib_outboxcode1"].Value.ToString())
                {
                    if (LabelInf.Rows[i].Cells["pib_ifpick"].FormattedValue.ToString() != "True")
                        FullBox = false;
                }
            }
            //如果当前箱号已经装满了
            if (FullBox)
            {
                if (MidLabelCombox.SelectedValue != null)
                {
                    string la_id = MidLabelCombox.SelectedValue.ToString().Split('#')[0];
                    MidBoxCodePrint(la_id, CurrentRowIndex);
                }
                else
                    MessageBox.Show("未维护中盒模板");
            }
        }

        /// <summary>
        /// 勾选的时候自动打印
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void LabelInf_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (LabelInf.Columns[e.ColumnIndex].Name == "pib_datecode")
            {
                string datecode = LabelInf.Rows[e.RowIndex].Cells["pib_datecode"].Value.ToString();
                try
                {
                    System.DateTime dt = System.DateTime.ParseExact(datecode, "yyyyMMdd", CultureInfo.CurrentCulture);
                    GregorianCalendar gc = new GregorianCalendar();
                    int weekOfYear = gc.GetWeekOfYear(dt, CalendarWeekRule.FirstDay, DayOfWeek.Monday);
                    if (weekOfYear < 10)
                        LabelInf.Rows[e.RowIndex].Cells["pib_datecode1"].Value = dt.Year.ToString().Substring(2, 2) + "0" + weekOfYear;
                    else
                        LabelInf.Rows[e.RowIndex].Cells["pib_datecode1"].Value = dt.Year.ToString().Substring(2, 2) + weekOfYear;
                }
                catch (Exception) { }
            }
        }

        private void AllCollected_Click(object sender, EventArgs e)
        {
            if (AllCollect == false)
            {
                foreach (DataGridViewRow dr in LabelInf.Rows)
                    dr.Cells[1].Value = true;
                AllCollect = true;
            }
            else
            {
                foreach (DataGridViewRow dr in LabelInf.Rows)
                    dr.Cells[1].Value = false;
                AllCollect = false;
            }
        }

        private void PowerSetting_Click(object sender, EventArgs e)
        {
            PowerSetting pw = new PowerSetting();
            BaseUtil.SetFormCenter(pw);
            pw.ShowDialog();
        }

        private void GetOutBoxCode_Click(object sender, EventArgs e)
        {
            if (dh.GetConfig("UsingPacking", "ProdInOut!Sale").ToString() != "")
            {
                int Current = 0;
                sql.Clear();
                sql.Append("select pr_qtyperplace,pd_qty,packingdetail.pd_cartonno,pr_zxbzs,packingdetail.pd_cartons from packingdetail left join packing on pd_piid=pi_id left join prodinout on ");
                sql.Append("pi_packingcode=packing.pi_code left join product on pd_prodcode=pr_code where pi_inoutno='" + pi_inoutno.Text + "' order by pr_code,pd_detno");
                dt = (DataTable)dh.ExecuteSql(sql.ToString(), "select");
                if (dt.Rows.Count > 0)
                {
                    try { OutboxCapacity.Value = (decimal)dt.Rows[0]["pr_qtyperplace"] / (decimal)dt.Rows[0]["pr_zxbzs"]; }
                    catch (Exception) { }
                }
                try
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        int pd_qty = int.Parse(dt.Rows[i]["pd_qty"].ToString());
                        int pr_zxbzs = int.Parse(dt.Rows[i]["pr_zxbzs"].ToString());
                        int pd_cartons = int.Parse(dt.Rows[i]["pd_cartons"].ToString());
                        for (int j = 0; j < pd_qty * pd_cartons / pr_zxbzs; j++)
                        {
                            LabelInf.Rows[Current].Cells["pib_outboxcode2"].Value = dt.Rows[i]["pd_cartonno"].ToString();
                            Current++;
                        }
                    }
                    GetPackingCode = true;
                }
                catch (Exception)
                {
                }
            }
            else
            {
                int BoxCode = 1;
                for (int i = 0; i < LabelInf.Rows.Count; i++)
                {
                    LabelInf.Rows[i].Cells["pib_outboxcode2"].Value = BoxCode;
                    if (i + 1 < LabelInf.Rows.Count + 1)
                    {
                        if (int.Parse(LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString()) % OutboxCapacity.Value == 0 && (LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString() != LabelInf.Rows[i + 1].Cells["pib_outboxcode1"].Value.ToString()))
                        {
                            BoxCode = BoxCode + 1;
                        }
                    }
                }
            }
            SaveGrid_Click(sender, e);
        }

        private void LogingOut_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            string close = MessageBox.Show(this.ParentForm, "是否注销", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question).ToString();
            if (close.ToString() == "Yes")
            {
                Login login = new Login();
                //注销的时候需要将拼接的连接字符串置空
                DataHelper.DBConnectionString = null;
                logout = true;
                lbl.Quit();
                this.Hide();
                login.ShowDialog();
                this.Close();
            }
        }

        private void LabelInf_DataError(object sender, DataGridViewDataErrorEventArgs e) { }

        /// <summary>
        /// 切换打开的单盘文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SingleLabelCombox_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (ComBoxClickChangeLabelDoc)
                {
                    if (SingleDoc != null)
                        SingleDoc.Close();
                    if (SingleLabelCombox.Text != "" && SingleLabelCombox.SelectedValue != null && !GetGridOnly.Checked)
                    {
                        System.DateTime time = Convert.ToDateTime(SingleLabelCombox.SelectedValue.ToString().Split('#')[2]);
                        SingleDoc = lbl.Documents.Open(BaseUtil.GetLabelUrl(SingleLabelCombox.SelectedValue.ToString().Split('#')[1], SingleLabelCombox.Text, time));
                    }
                }
            }
            catch (Exception) { }
        }

        /// <summary>
        /// 切换打开的中盒文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MidLabelCombox_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (ComBoxClickChangeLabelDoc)
                {
                    if (MidDoc != null)
                        MidDoc.Close();
                    if (MidLabelCombox.Text != "" && MidLabelCombox.SelectedValue != null && !GetGridOnly.Checked)
                    {
                        System.DateTime time = Convert.ToDateTime(MidLabelCombox.SelectedValue.ToString().Split('#')[2]);
                        MidDoc = lbl.Documents.Open(BaseUtil.GetLabelUrl(MidLabelCombox.SelectedValue.ToString().Split('#')[1], MidLabelCombox.Text, time));
                    }
                }
            }
            catch (Exception) { }
        }

        /// <summary>
        /// 切换打开的外箱文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OutBoxCombox_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                if (ComBoxClickChangeLabelDoc)
                {
                    if (OutBoxDoc != null)
                        OutBoxDoc.Close();
                    if (OutBoxCombox.Text != "" && OutBoxCombox.SelectedValue != null && !GetGridOnly.Checked)
                    {
                        System.DateTime time = Convert.ToDateTime(OutBoxCombox.SelectedValue.ToString().Split('#')[2]);
                        OutBoxDoc = lbl.Documents.Open(BaseUtil.GetLabelUrl(OutBoxCombox.SelectedValue.ToString().Split('#')[1], OutBoxCombox.Text, time));
                    }
                }
            }
            catch (Exception) { }
        }

        /// <summary>
        /// 获取ViVo的料盘信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ViVoPlate_Click(object sender, EventArgs e)
        {
            thread = new Thread(GetVivoInf);
            stw = new SetLoadingWindow(thread, "正在获取Vivo箱号");
            BaseUtil.SetFormCenter(stw);
            stw.ShowDialog();
        }

        private void GetVivoInf()
        {
            if (LabelInf.Rows.Count > 0)
            {
                if (LabelInf.Rows[0].Cells["pib_outboxcode2"].Value != null)
                {
                    Vivo_GetPlateID.Service1SoapClient getPlateID = new Vivo_GetPlateID.Service1SoapClient();
                    Vivo_BoxReelRelation.Service1SoapClient getOutBox = new Vivo_BoxReelRelation.Service1SoapClient();
                    string VenderCode = dh.GetConfig("VivoCode", "ProdInOut!Sale").ToString();
                    string CurrentTime = System.DateTime.Now.ToString("yyyyMM");
                    string Createcode = VenderCode + CurrentTime;
                    string outboxcode = "";
                    //装入箱内的数量统计,用于判断是否达到容量
                    decimal InBoxCount = OutboxCapacity.Value;
                    for (int i = 0; i < LabelInf.Rows.Count; i++)
                    {
                        //勾选了的内容才进行料盘的获取和箱号的维护
                        if (LabelInf.Rows[i].Cells["Choose"].FormattedValue.ToString() == "True")
                        {
                            int amount = int.Parse(LabelInf.Rows[i].Cells["pib_qty"].Value.ToString());
                            string DateCode = LabelInf.Rows[i].Cells["pib_datecode"].Value.ToString();
                            string LotNo = LabelInf.Rows[i].Cells["pib_lotno"].Value.ToString();
                            string OrderCode = LabelInf.Rows[i].Cells["pr_vendprodcode"].Value.ToString();
                            string custprodcode = LabelInf.Rows[i].Cells["pd_custprodcode"].Value.ToString();
                            //通过接口获取Vivo料盘号
                            string custbarcode = getPlateID.getCompID(Createcode, "", custprodcode, VenderCode, LotNo, DateCode, amount, OrderCode, "", "").Replace("T-", "");
                            LabelInf.Rows[i].Cells["pib_cusbarcode"].Value = custbarcode;
                            //如果下一行的外箱号和当前行不一致
                            bool NextBoxDiff = false;
                            //通过接口维护料盘和外箱关系,需要根据箱内容量计算
                            //判断下一行箱号不一样重新取一个客户外箱号
                            if (i - 1 > 0)
                            {
                                string CurrentOutBoxCode = LabelInf.Rows[i].Cells["pib_outboxcode2"].Value.ToString();
                                string NextOutBoxCode = LabelInf.Rows[i - 1].Cells["pib_outboxcode2"].Value.ToString();
                                if (CurrentOutBoxCode != NextOutBoxCode)
                                {
                                    NextBoxDiff = true;
                                    InBoxCount = OutboxCapacity.Value - 1;
                                }
                            }
                            if (InBoxCount == OutboxCapacity.Value || NextBoxDiff)
                            {
                                outboxcode = VenderCode + "-" + CurrentTime + "-" + LabelInf.Rows[i].Cells["pib_id1"].Value.ToString();
                                InBoxCount = 1;
                                NextBoxDiff = false;
                            }
                            else
                                InBoxCount = InBoxCount + 1;
                            //获取信息为T-表示成功获取了信息
                            string Message = getOutBox.insertBoxReelRelation(Createcode, VenderCode, outboxcode, custbarcode, "", "");
                            if (Message.Substring(0, 1) == "T")
                                LabelInf.Rows[i].Cells["pib_cusoutboxcode"].Value = outboxcode;
                            else
                                LabelInf.Rows[i].Cells["pib_cusoutboxcode"].Value = Message;
                        }
                    }
                }
                else
                    MessageBox.Show("请先维护外箱号");
            }
        }

        private void ChooseAll_Click(object sender, EventArgs e)
        {
            if (AllChecked)
            {
                foreach (DataGridViewRow dr in LabelInf.Rows)
                    dr.Cells[0].Value = false;
                AllChecked = false;
            }
            else
            {
                foreach (DataGridViewRow dr in LabelInf.Rows)
                    dr.Cells[0].Value = true;
                AllChecked = true;
            }
        }

        private void LabelInf_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            if (LabelInf.Columns[e.ColumnIndex].Name == "pib_madein" && CollectionUnit.Text == "盒")
            {
                string madein = LabelInf.Rows[e.RowIndex].Cells["pib_madein"].Value.ToString();
                string midbox = LabelInf.Rows[e.RowIndex].Cells["pib_outboxcode1"].Value.ToString();
                for (int i = 0; i < LabelInf.Rows.Count; i++)
                {
                    if (midbox == LabelInf.Rows[i].Cells["pib_outboxcode1"].Value.ToString())
                        LabelInf.Rows[i].Cells["pib_madein"].Value = madein;
                }
            }
            if (LabelInf.Columns[e.ColumnIndex].Name == "pib_madein" && CollectionUnit.Text == "全部")
            {
                string madein = LabelInf.Rows[e.RowIndex].Cells["pib_madein"].Value.ToString();
                for (int i = 0; i < LabelInf.Rows.Count; i++)
                {
                    LabelInf.Rows[i].Cells["pib_madein"].Value = madein;
                }
            }
        }

        private void ExportData_Click(object sender, EventArgs e)
        {
            ExportFileDialog.Description = "选择导出的路径";
            DialogResult result = ExportFileDialog.ShowDialog();
            if (result == DialogResult.OK)
            {
                ExcelHandler eh = new ExcelHandler();
                DataTable dt = ((DataTable)MidSource.DataSource).Copy();
                for (int i = dt.Columns.Count - 1; i >= 0; i--)
                {
                    for (int j = 0; j < LabelInf.Columns.Count; j++)
                    {
                        //去除ID列
                        if (dt.Columns[i].ColumnName.ToLower().Contains("id") || dt.Columns[i].ColumnName.ToLower() == "pib_barcode" || dt.Columns[i].ColumnName.ToLower() == "pib_pdno" || dt.Columns[i].ColumnName.ToLower() == "pib_ifpick" || dt.Columns[i].ColumnName.ToLower() == "pib_ifprint" || dt.Columns[i].ColumnName.ToLower() == "pib_datecode1" || dt.Columns[i].ColumnName.ToLower() == "pr_vendprodcode")
                        {
                            dt.Columns.RemoveAt(i);
                            break;
                        }
                        switch (dt.Columns[i].ColumnName.ToLower())
                        {
                            case "pib_lotno":
                                dt.Columns[i].ColumnName = "批次号";
                                break;
                            case "pib_datecode":
                                dt.Columns[i].ColumnName = "生产日期";
                                break;
                            case "pib_custbarcode":
                                dt.Columns[i].ColumnName = "最小产品包装条码";
                                break;
                            default:
                                break;
                        }
                        if (dt.Columns[i].ColumnName.ToLower() == LabelInf.Columns[j].DataPropertyName.ToLower())
                        {
                            dt.Columns[i].ColumnName = LabelInf.Columns[j].HeaderText;
                            break;
                        }
                    }
                }
                eh.ExportExcel(dt, ExportFileDialog.SelectedPath, pi_date.Text + "-" + pi_inoutno.Text);
                string close = MessageBox.Show(this.ParentForm, "导出成功,是否打开文件", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question).ToString();
                if (close.ToString() == "Yes")
                    System.Diagnostics.Process.Start(ExportFileDialog.SelectedPath + "\\" + pi_date.Text + "-" + pi_inoutno.Text + ".xls");
            }
        }

        private void AttachInfo_Click(object sender, EventArgs e)
        {
            if (pi_cardcode.Text != "")
            {
                附件内容打印 att = new 附件内容打印(pi_cardcode.Text);
                att.ShowDialog();
            }
            else MessageBox.Show("请先获取出库单信息");
        }

        private void MidBoxCapacity_Leave(object sender, EventArgs e)
        {
            NumericUpDown nup = (NumericUpDown)sender;
            switch (nup.Name)
            {
                case "MidBoxCapacity":
                    Properties.Settings.Default.MidBoxCapacity = nup.Value;
                    Properties.Settings.Default.Save();
                    break;
                case "OutboxCapacity":
                    Properties.Settings.Default.OutboxCapacity = nup.Value;
                    Properties.Settings.Default.Save();
                    break;
                default:
                    break;
            }
        }

        private void RefreshDBConnect_Tick(object sender, EventArgs e)
        {
            dh.ExecuteSql("select sysdate from dual", "select");
        }
    }
}