using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Windows.Forms;
using DevExpress.XtraBars;
using DevExpress.XtraGrid.Views.Base;
//using DeiNiu.wms.Logical;
using DeiNiu.wms.Data;
using DevExpress.XtraGrid.Columns;
 
using System.Threading;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraEditors.DXErrorProvider;
using DeiNiu.wms.Data.Model;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using DeiNiu.Utils;
using DevExpress.XtraEditors.Repository; 
using elelab;
using DeiNiu.wms.Logical;
using Model;
namespace DeiNiu.wms.win
{
    public partial class GoodsOutFormOld : BasicRibbonForm
    {
 
      //  lWmsStock ls = new lWmsStock();
        lWmsOutPickLableOld lgt = new lWmsOutPickLableOld();
      //  WmsOutPickRequest outRequest = new WmsOutPickRequest();
     //   lWmsOutRequest lgOutReq = new lWmsOutRequest();
       // lWmsOutPickRequest outPickRequest = new lWmsOutPickRequest();
        private string lastQuery = "";
        private DataTable dtPickOrders;
        private int selectedRowIndex = -1;
     //   private WmsOutPickRequest selectedRequest;
        int preCnt = 0;
        Thread threadPreProcess;
        bool autoOrder, autoWave;
        bool isManualRefreshPickList = false;
     //   string currentWaveOrder = "";
        DataTable dtException;
        DataTable dtBulks; 
    //    WmsOutPickDetail_tmp exceptionDetail;
        public GoodsOutFormOld()
        {
          debug("start 出库。。。。。。");
             
            InitializeComponent();
            initialControls();
            initialBackGroundTasks();
            debug("end 出库。。。。。。");
        }
        #region initialControls
        private void initialControls()
        {
            WmsConstants.MAX_COLORS = Convert.ToInt16(spinColors.Value);
            initialDataGrid();
            initialQueryInput(); 
            setValidationRule();
            initialTimer();
           // setProgressbar();
            
        }
        private void initialBackGroundTasks()
        {
            
            //lgOutReq.UpdateUIDelegate += updatePreOutStatus;
            //lgOutReq.TaskCallBack += preOutFinished;
            if (autoOrder)
            {
                preErpOrders();
            }
          
             swAutoWave.IsOn = WmsConstants.AUTO_NEW_WAVE;
            //lgt.UpdateUIDelegate +=  updatePickDetails;
            //lgt.TaskCallBack += loadWaveDetails;// waveStart;
            lightLabelsCurrentWave();
            if (autoWave)
            {
                newWave();
            }
            else
            {
              
             //   lightLabelsCurrentWave();
            }
            //Thread threadPreProcess = new Thread(searchLight);
            // threadPreProcess.IsBackground = true;
            // threadPreProcess.Start();
 
        }
       
        
      
        private void setValidationRule()
        {
          //  dxValidationProvider.SetValidationRule(comWarehouse, ValidationRules.notEmptyValidationRule);
            //txtGoodType.Properties.MaxLength = 40;
            //txtGoodDesc.Properties.MaxLength = 250;
            //textEdit1.Properties.MaxLength = txtGoodType.Properties.MaxLength;
        }
        private void initialQueryInput()
        {
        }
      
       
        
        private void initialGridView3Columns(GridView gridview)
        {
             
            {
                setupGridView(gridview, true, true, false);
            }
            gridview.FocusRectStyle = DrawFocusRectStyle.None;
            //   gridviewGoodsType.PopulateColumns();
            gridview.Columns.Clear();
            // gridviewGoodsType.Columns.Remove(gridviewGoodsType.Columns["DealerPrice"]); 
            GridColumn myCol0 = new GridColumn() { Caption = "ID", Visible = true, FieldName = "id" };
            myCol0.Visible = false;
            gridview.Columns.Add(myCol0);
       
            GridColumn myCol17 = new GridColumn() { Caption = "状态", Visible = true, FieldName ="state" };
            GridColumn myCol18 = new GridColumn() { Caption = "说明", Visible = true, FieldName ="description" };
            GridColumn myCol100 = new GridColumn() { Caption = "数量", Visible = true, FieldName = "count" };
            GridColumn myCol20 = new GridColumn() { Caption = "波次", Visible = true, FieldName = WmsOutPickLable.fields.waveOrder.ToString() };
            GridColumn myCol21 = new GridColumn() { Caption = "颜色", Visible = true, FieldName = "color" };
            GridColumn myCol22 = new GridColumn() { Caption = "货位", Visible = true, FieldName = WmsOutPickLable.fields.locationId.ToString() };
            GridColumn myCol23 = new GridColumn() { Caption = "标签", Visible = true, FieldName = WmsOutPickLable.fields.elabId.ToString() };
           /*
            GridColumn myCol24 = new GridColumn() { Caption = "客户", Visible = true, FieldName = WmsOutPickRequest.fields.customerName.ToString() };
            GridColumn myCol25 = new GridColumn() { Caption = "出库单", Visible = true, FieldName = WmsOutPickRequest.fields.pickOrderNo.ToString() };
            GridColumn myCol26 = new GridColumn() { Caption = "复核异常", Visible = true, FieldName = "exception" };
            GridColumn myCol27 = new GridColumn() { Caption = "复核数量", Visible = true, FieldName = WmsOutPickDetail.fields.confirmedCount.ToString() };
            GridColumn myCol28 = new GridColumn() { Caption = "说明", Visible = true, FieldName = WmsOutPickDetail.fields.validRemark.ToString() };
            GridColumn myCol281 = new GridColumn() { Caption = "复核台", Visible = true, FieldName = "desk" };
            */
            GridColumn myCol29 = new GridColumn() { Caption = "标签点亮", Visible = true, FieldName = "isLightUp" };
            GridColumn myCol30 = new GridColumn() { Caption = "拣货状态", Visible = true, FieldName = "isPicked" };
            GridColumn myCol31 = new GridColumn() { Caption = "端口", Visible = true, FieldName = "port" };
            GridColumn myCol32 = new GridColumn() { Caption = "坐标", Visible = true, FieldName = "elabAddress" };
            GridColumn myCol25 = new GridColumn() { Caption = "拣货单", Visible = true, FieldName = "pickOrderNo" };
 
            RepositoryItemImageComboBox repositoryImageComboBox2 = new RepositoryItemImageComboBox();//新建一个RepositoryItemImageComboBox  
            repositoryImageComboBox2.GlyphAlignment = DevExpress.Utils.HorzAlignment.Center;
            repositoryImageComboBox2.SmallImages = imageList1; //指定一组图片  
            string[] s = new String[] {"1","0"};
            for (int i = 0; i < s.Length; i++)
                repositoryImageComboBox2.Items.Add(new ImageComboBoxItem(s[i], i + 1, i));//对应值绑定对应的图片  
            RepositoryItem ri = repositoryImageComboBox2 as RepositoryItem;
            gridControl1.RepositoryItems.Add(ri);
            myCol29.ColumnEdit = ri;      //绑定到GridColumn  
            myCol30.ColumnEdit = ri;
            if (gridview == gridView1)
            { 
                gridview.Columns.Add(myCol22);
                gridview.OptionsView.ColumnAutoWidth = false;
                gridview.BestFitColumns();
                return;
            }
            gridview.Columns.Add(myCol25);
            gridview.Columns.Add(myCol29);
            gridview.Columns.Add(myCol30); 
        
            gridview.Columns.Add(myCol22);
            gridview.Columns.Add(myCol100);
            gridview.Columns.Add(myCol21);
           
            gridview.Columns.Add(myCol23);
         /*
            gridview.Columns.Add(myCol25);
            gridview.Columns.Add(myCol101);
            gridview.Columns.Add(myCol5);
          //  gridview.Columns.Add(myCol17);
            gridview.Columns.Add(myCol24);
            gridview.Columns.Add(myCol7);
            gridview.Columns.Add(myCol14);
            gridview.Columns.Add(myCol3);
            gridview.Columns.Add(myCol15);
            gridview.Columns.Add(myCol16);
            gridview.Columns.Add(myCol3); 
            gridview.Columns.Add(myCol8);
            //gridview.Columns.Add(myCol9);
             
            gridview.Columns.Add(myCol2);
            //   gridview.Columns.Add(myCol6);
             
            gridview.Columns.Add(myCol4);
             
            gridview.Columns.Add(myCol12);
            gridview.Columns.Add(myCol1);
           */
            gridview.Columns.Add(myCol32);
            gridview.Columns.Add(myCol31);
            gridview.Columns.Add(myCol18);
            //to show bottom scroll bar
            gridview.OptionsView.ColumnAutoWidth = false;
            gridview.BestFitColumns();
            //  gridView2.Focus();
        }
        #endregion
        
        /// 
        /// 预处理,按客户分拆订单,生成分拣单,并出库
        /// 
        private void preErpOrders()
        {
  
          
            this.loadPickOrders();
            
          //  client.Close();
        }
    
        delegate void AsynUpdateUI(int step);
       
        private void updatePreOutStatus(int i)
        {
            if (InvokeRequired)
            {
                this.Invoke(new AsynUpdateUI(delegate(int s)
                {
                    //progressBarControl1.Properties.Maximum = WmsConstants.PREPICKING_ORDERS_CNT;
                    //progressBarControl1.Position = i;
                    //this.prgbar. += s;
                   // this.prgbar.Text = i + "/" + preCnt;
                }), i);
                if (i == dtPickOrders.Rows.Count)
                {
                 //   loadData();//更新界面列表
                }
            }
            else
            {
                //progressBarControl1.Properties.Maximum = WmsConstants.PREPICKING_ORDERS_CNT;
                //progressBarControl1.Position += 1;
              //  this.prgbar.Text = i + "/" + preCnt;
                if (i == dtPickOrders.Rows.Count)
                {
                 //   loadData();//更新界面列表
                }
            }
        }
        DateTime lastRefreshTime;
        int refreshInterval = 5;
        //完成任务时需要调用
        delegate void loadNewPickOrders();
        private void refreshOrderList()
        {
            //还可以进行其他的一些完任务完成之后的逻辑处理
 
            //swAutoOrder.Enabled = true;
            //btnPickOrders.Enabled = !autoOrder; 
            if (!autoOrder && !this.isManualRefreshPickList)
            {
                return;
            }
            TimeSpan ts = DateTime.Now - lastRefreshTime;
            if (ts.TotalSeconds < refreshInterval)
            {
                return;
            }
           
            this.isManualRefreshPickList = false; //手动刷新 只单独自动刷一次
             
            lastRefreshTime = DateTime.Now;
            if (InvokeRequired)
            {
                this.Invoke(new loadNewPickOrders(delegate()
                {
                    
                    this.loadPickOrders();
                    if (autoOrder)
                    {
                        setPreOrderInterVal();
                    }
                }));
            }
            else
            {
              
                this.loadPickOrders();
                if (autoOrder)
                {
                    setPreOrderInterVal();
                }
            }
 
        }
        private void setPreOrderInterVal()
        {
            
        }
        
        /// 
        /// 更新拣选明细
        /// 
        private void   updatePickDetails() {
        }
        DateTime lastWaveRequestTime;
        delegate void loadNewCurrentWave();
        /// 
        /// start new wave
        /// 
        public void waveStart() {
            //swAutoWave.Enabled = true;
            //btnNewWave.Enabled = !autoWave;
          //  loadWaveDetails();
            if (lastWaveRequestTime == null)
            {
                lastWaveRequestTime = DateTime.Now;
            }
            else
            {
                TimeSpan ts = DateTime.Now - lastWaveRequestTime;
                int sleepTime = (int) spinWave.Value ;//波次间隔 5s
                if (ts.TotalSeconds < sleepTime)
                {
                    return;
                }
            }
            if (!canNewWave) // if (!lgt.canNewWave)
            {
                
                return;
            }
            if (swAutoWave.IsOn)
            {
                // int sleepTime = (int) spinWave.Value * 1000;//波次间隔 5s
                //while (!lgt.canNewWave)
                //{ 
                //    Thread.CurrentThread.Join(1000); 
                //}
                // Thread.CurrentThread.Join(sleepTime);  
                this.clearWaveData();
                newWave();
                lastWaveRequestTime = DateTime.Now;
            }
            else
            {
                btnNewWave.Enabled = dtBulks== null || dtBulks.Rows.Count == 0 ;
            }
        }
        void loadWaveDetails()
        {
            debug("start to loadWaveDetails.....");
            if (InvokeRequired)
            {
                this.Invoke(new loadNewCurrentWave(delegate()
                {
                    swAutoWave.Enabled = true;
                    btnNewWave.Enabled = !autoWave;
                    this.loadPickOrdersInWave();
                    this.loadPickOrders();//更新等待订单列表
                 //   btnEndWave.Enabled = true;
                }));
            }
            else
            {
                swAutoWave.Enabled = true;
                btnNewWave.Enabled = !autoWave;
                this.loadPickOrdersInWave();
             //   btnEndWave.Enabled = true;
            }
            debug("end loadWaveDetails....");
        }
       // Thread threadNewWave;
        private void newWave()
        {
            try
            {
                debug("start to create new wave .....");
                Thread threadNewWave = new Thread(newPickWave);
                threadNewWave.IsBackground = true;
                threadNewWave.Start();
               // loadWaveDetails();
                // lgt.newPickWave();
                debug(" create new wave in new thread.....");
            }
            catch (DeiNiuException de)
            {
                showErrorMsg(de.Message);
            }
            catch (Exception er)
            {
                showErrorMsg(er.Message);
            }
        }
 
        
        private void loadPickOrdersInWave()
        {
            debug("start loadPickOrdersInWave.....");
            showWaitForm();
            try
            {
                DataSet ds = lgt.getWmsOutPickLable.getCurrentWavePick();
                dtBulks = ds .Tables[0];
                gridControl1.DataSource = ds.Tables[1].DefaultView;
                initialGridView3Columns(gridView1);
                updateLableStatus(dtBulks);
                debug(string.Format("load bulk details in current wave,count {0} ", dtBulks.Rows.Count));
                gridControl2.DataSource = dtBulks.DefaultView;
                initialGridView3Columns(gridView3);
                btnRelight.Enabled = dtBulks.Rows.Count > 0;
                WmsConstants.WAVE_CURRENT_ORDER = "";
                btnNewWave.Enabled = dtBulks.Rows.Count == 0;
                if (dtBulks.Rows.Count > 0)
                {
                    WmsConstants.WAVE_LAST_FREE_TIME = DateTime.MinValue;
                    //if (string.IsNullOrEmpty(WmsConstants.WAVE_CURRENT_ORDER))
                    {
                        string waveStarTime = dtBulks.Rows[0]["createtime"].ToString();
                        DateTime lastWaveTime = Convert.ToDateTime(waveStarTime);
                        string currentWaveOrder = dtBulks.Rows[0]["waveOrder"].ToString();
                        WmsConstants.WAVE_LAST_TIME = lastWaveTime;
                        WmsConstants.WAVE_CURRENT_ORDER = currentWaveOrder; //只显示有零货的波次
                    }
                    
                }
                else
                {
                    if (WmsConstants.WAVE_LAST_FREE_TIME == DateTime.MinValue)
                    {
                        WmsConstants.WAVE_LAST_FREE_TIME = DateTime.Now;
                    }
                }
                debug("initialGridView2Columns .....1");
               
                lbWaveNo.Text = string.IsNullOrEmpty(WmsConstants.WAVE_CURRENT_ORDER) ? "空闲" : WmsConstants.WAVE_CURRENT_ORDER;
                btnEndWave.Enabled = !string.IsNullOrEmpty(WmsConstants.WAVE_CURRENT_ORDER);
                //get validaiton exception list
                debug("initialGridView2Columns .....2");
               
 
            }
             
            catch (Exception er)
            {
                //  setCurrentRequestDetail();
               // showErrorMsg(er.Message);
            } 
            closeWaitForm();
            debug("end loadPickOrdersInWave.....");
        }
        
        
        private void clearInputs()
        {
        }
        
       
        System.Timers.Timer timer = new System.Timers.Timer();//实例化Timer类
        //private void timeCnt()
        //{
        //    timer.Start(); ;
        //}
        private void initialTimer()
        {
            int intTime = 1000;
            timer.Interval = intTime;//设置间隔时间,为毫秒;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(showWaveSpan);//到达时间的时候执行事件;
            timer.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
            timer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
             timer.Start(); 
        }
        private void showWaveSpan(object source, System.Timers.ElapsedEventArgs e)
        {
         //   debug(string.Format(" timer loop begin .... " ));
            TimeSpan ts = DateTime.Now - WmsConstants.WAVE_LAST_TIME;// WmsConstants.WAVE_LAST_TIME; 
            try
            {
                if (InvokeRequired)
                {
                    this.Invoke(new loadNewCurrentWave(delegate()
                    {
                      //  lbLightsInfo.Text = (lights.Count > 0 ? "" : "未检测到通道灯");
                        refreshOrderList();
                        updateLableStatus();
                        if (string.IsNullOrEmpty(WmsConstants.WAVE_CURRENT_ORDER)) //start new wave
                        {
                            lbWaveSpan.ForeColor = Color.Green;
                            TimeSpan ts1 = DateTime.Now - WmsConstants.WAVE_LAST_FREE_TIME;
                            lbWaveSpan.Text = string.Format("{0:D2}:{1:D2}:{2:D2}", ts1.Hours, ts1.Minutes, ts1.Seconds);
                           // debug(string.Format(" timer loop to start new wave.... "));
                          //  this.clearWaveData();
                            waveStart();// newWave();
                        }
                        else
                        {
                            lbWaveSpan.ForeColor = Color.Black;
                            lbWaveSpan.Text = string.Format("{0:D2}:{1:D2}:{2:D2}", ts.Hours, ts.Minutes, ts.Seconds);
                        }
                    })); 
                }
                else
                {
                    //lbLightsInfo.Text = (lights.Count > 0 ? "" : "未检测到通道灯");
                    updateLableStatus();
                    if (string.IsNullOrEmpty(WmsConstants.WAVE_CURRENT_ORDER)) //start new wave
                    {
                        lbWaveSpan.ForeColor = Color.Green;
                        TimeSpan ts1 = DateTime.Now - WmsConstants.WAVE_LAST_FREE_TIME;
                        lbWaveSpan.Text = string.Format("{0:D2}:{1:D2}:{2:D2}", ts1.Hours, ts1.Minutes, ts1.Seconds);
                       // this.clearWaveData();
                        waveStart();// newWave();
                    }
                    else
                    {
                        lbWaveSpan.ForeColor = Color.Black;
                        lbWaveSpan.Text = string.Format("{0:D2}:{1:D2}:{2:D2}", ts.Hours, ts.Minutes, ts.Seconds);
                    }
                }
            }
            catch (Exception er)
            {
                LogHelper.WriteLog(typeof(GoodsOutFormOld), er);
            }
         //   debug(string.Format(" timer loop end .... "));
            
        }
       
        private void btnDelete_Click(object sender, EventArgs e)
        { 
        }
        protected void query()
        {
            
        }
        private void loadPickOrders()
        {
          //  showWaitForm();
            try
            {
                query();// loadData();  
            }
            catch (Exception e)
            {
                showErrorMsg(e.Message);
            }
            finally
            {
                // WaitFormService.Close();
             //   closeWaitForm();
                bbQuery.Enabled = true;
            }
        }
         
        private void bbQuery_ItemClick_1(object sender, ItemClickEventArgs e)
        {
            this.bbQuery.Enabled = false;
            loadPickOrders();
        }
       
 
        private bool getCurrentObject()
        {
            if (selectedRowIndex <0 || selectedRowIndex >= dtPickOrders.Rows.Count)
            {
                return false;
            }
           
            //DataRow currentRow = dtPickOrders.Rows[selectedRowIndex];
            //selectedRequest = new WmsOutPickRequest(currentRow); 
             return true;
        }
       
             
      
        private void initialDataGrid()
        {
            this.gridView3.IndicatorWidth = 40;
            this.gridView3.CustomDrawRowIndicator += new DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventHandler(gridView_CustomDrawRowIndicator);
    
            this.gridView1.IndicatorWidth = 40;
            this.gridView1.CustomDrawRowIndicator += new DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventHandler(gridView_CustomDrawRowIndicator);
            
            gridView3.CustomColumnDisplayText += gridView3_CustomColumnDisplayText;
        }
   
 
       void gridView_RowCellStyle(object sender,DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e)
       {
            var currentView = sender as GridView;
           if( currentView == null){return;}
           string state = currentView.GetDataRow(e.RowHandle)["priority"].ToString().Trim();
           
           if (state == "0")
           {
               return;
           }
           bool isFocused = e.RowHandle == currentView.FocusedRowHandle;
           DevExpress.Utils.AppearanceDefault rowStyle = null;
            DevExpress.Utils.AppearanceDefault appBlueRed = 
               new DevExpress.Utils.AppearanceDefault (Color.White, Color.Red, Color.Empty, Color.Blue, System.Drawing.Drawing2D.LinearGradientMode.Horizontal);
           DevExpress.Utils.AppearanceDefault appYB =
            new DevExpress.Utils.AppearanceDefault(Color.White, Color.Red, Color.Green);
           DevExpress.Utils.AppearanceDefault alertFocus = new DevExpress.Utils.AppearanceDefault(Color.White, Color.Red, Color.Green,  Color.Yellow);
           DevExpress.Utils.AppearanceDefault alert  = new DevExpress.Utils.AppearanceDefault(Color.Red, Color.White );
           DevExpress.Utils.AppearanceDefault highPriorityFocus = new DevExpress.Utils.AppearanceDefault(Color.White, Color.Green);
           DevExpress.Utils.AppearanceDefault highPriority = new DevExpress.Utils.AppearanceDefault(Color.Green, Color.White);
           if (state == "1")
           {
               rowStyle = isFocused ? highPriorityFocus : highPriority;
           }
           else if (state == "2")
           {
               rowStyle = isFocused ? alertFocus : alert;
           }
            
           DevExpress.Utils.AppearanceHelper.Apply(e.Appearance, rowStyle);
           
       }
       
        
 
        private void btnNewWave_Click(object sender, EventArgs e)
        {
            clearWaveData();
            btnNewWave.Enabled = false;
            newWave();
        }
        
 
 
 
        private void btnEndWave_Click(object sender, EventArgs e)
        {
          
            if (MessageBox.Show("确定确认货物已经拣选完毕,并强制结束本轮拣货吗?", "强制结束", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
            {
                return;
               
            }         
            endWave(true);
        }
        void turnOffLights()
        {
            if (lights.Count == 0)
            {
                //searchLight();
                return;
            }
              
           // Model.dis_id_comment id;
            dis_id id;
            //id.ele_id = Convert.ToInt16(new_id.Text);
            id.order = 1;
            id.ele_id = 65535; 
            id.state = 1;
            //id.
            foreach (int port in pick.activeComports)
            {
                if (port == 0)
                {
                    continue;
                }
              //  unart_manage.com_manage[port].write_reset_device(); 复位各个硬件,通道灯,标签。。。
                unart_manage.com_manage[port].init_port.write_clear_comment(id);
                if (!lights.ContainsKey(port))
                {
                    continue;
                }
                foreach (int light in lights[port])
                {
                    channel_led idx = new channel_led();
                    idx.channel_id = light;  
                    idx.state = 1;
                    unart_manage.com_manage[port].init_port.write_close_channel_led(idx);
                } 
              
               // a.write_clear_comment(id);
            }
        }
        Dictionary> lights = new Dictionary>();
        void searchLight()
        {
            Model.modify_id id;
         //   System.Threading.Thread.Sleep(50);
            foreach (int port in pick.activeComports)
            {
                if (port == 0)
                {
                    continue;
                }
                for (int i = 5000; i <= 5100; i++)
                {
                    id.order = 0;
                    id.new_ele_id = 0;
                    id.old_ele_id = i;
                    id.state = 1;
                    bool ret = unart_manage.com_manage[port].init_port.search_light_id(id);
                    if (ret)
                    {
                        if (!lights.ContainsKey(port))
                        {                           
                            lights[port] = new List();
                        }
                        lights[port].Add(i);
                       
                    }
                }
            }
             
        }
        void endWave(bool isForce=false)
        {
            if (isForce)               
            {
              //  pick.init_port(enumLabelPickType.pick);
                turnOffLights();
            }
            try
            {
                lgt.finishCurrentWave( WmsConstants.WAVE_CURRENT_ORDER, isForce);
                 
            }
            catch(Exception e)
            {
                showErrorMsg(e.Message);
            }
            clearWaveData();
            waveStart();
            btnEndWave.Enabled = false;
            btnRelight.Enabled = false;
            _canNewWave = true;
        }
        private void clearWaveData()
        {
            WmsConstants.WAVE_CURRENT_ORDER = "";
            lbWaveNo.Text = "空闲";
    
            if (dtBulks != null)
            {
                dtBulks.Clear();
            }
       //     gridControl3.DataSource = null;
            
        }
        private void swAutoOrder_Toggled(object sender, EventArgs e)
        {
         
            if (autoOrder)
            {
                preErpOrders();
            }
        }
        private void swAutoWave_Toggled(object sender, EventArgs e)
        {
            autoWave = swAutoWave.IsOn;
            btnNewWave.Enabled = !autoWave;
            btnNewWave.Enabled =!autoWave &&( dtBulks == null || dtBulks.Rows.Count == 0);
            if (autoWave)
            {
                newWave();
            }
        }
        private void btnRefresh_Click(object sender, EventArgs e)
        {
            loadPickOrdersInWave();
        }
        private void btnRelight_Click(object sender, EventArgs e)
        {
            turnOffLights();
            lightLabelsCurrentWave();
        }
        private void lightLabelsCurrentWave()
        {
            
            debug("start relightCurrentWave.....");
            //Thread light = new Thread(lgt.lightLables);
            //light.IsBackground = true;
            //light.Start();
           
            loadWaveDetails();
            closeWaitForm();
            showWaitForm("正在点亮标签...");
            try
            {
                lightLables(); // lgt.lightLables();
            }
            catch(Exception er)
            {
                closeWaitForm();
                showErrorMsg(er.Message);
            }
            finally
            {
             closeWaitForm();
            }
             debug("end relightCurrentWave.....");
        }
        //private void checkAuto_CheckedChanged(object sender, EventArgs e)
        //{
        //    spinOrder.Enabled = checkAuto.Checked;
        //}
        
        private void updateLableStatus(DataTable dt = null)
        {
           string key = "";
            if (dt != null)
            {
                foreach (DataRow dr in dt.Rows)
                {
                    if (dr["state"].ToString().Equals("1"))
                    {
                       key = Util.getLightKey(Convert.ToInt16(dr["color"].ToString()), Convert.ToInt16(dr["elabId"].ToString()), Convert.ToInt16(dr["elabAddress"].ToString()));
                       WmsConstants.WAVE_CURRENT_PICK_STATUS[key] = true;
                    } 
                }
                 
            }
            if (dtBulks == null || dtBulks.Rows.Count == 0)
            {
                return;
            }
          
            WmsOutPickLable label;
            DataView dv = dtBulks.DefaultView;
            dv.RowFilter = "isPicked =0";
            dv.Sort = "isPicked";
            if (dv.Count ==0)
            {
                //all picked, wave end
        
                endWave();
                return;
            } 
            foreach (DataRow dr in dtBulks.Rows)
            { 
                label = new  WmsOutPickLable(dr); 
                key = Util.getLightKey(label.color, label.elabId, label.elabAddress);
                if( WmsConstants.WAVE_CURRENT_LIGHTS_STATUS.ContainsKey(key)){
                    dr["isLightUp"] = WmsConstants.WAVE_CURRENT_LIGHTS_STATUS[key] ? 1 : 0;
                     
                }
                if (WmsConstants.WAVE_CURRENT_PICK_STATUS.ContainsKey(key))
                {
                    dr["isPicked"] = WmsConstants.WAVE_CURRENT_PICK_STATUS[key] ? 1 : 0;
                }  
            }
            dv.RowFilter = ""; // 如果   dv.RowFilter ="isPicked =0"; 则已拣的不再显示
            gridControl2.DataSource = dtBulks.DefaultView;
            
        }
        private void GoodsOutForm_FormClosing(object sender, FormClosingEventArgs e)
        {
          //  outClient.Close();
          //  pickClient.Close();
        }
        //-------------below moved from logic layer
 
         /// 
        /// 点亮待拣选标签
        /// 
        private void lightLablesInSvc()
        {
           
        }
        /// 
        /// 点亮待拣选标签
        /// 
        private void lightLables()
        {
          //  lightLablesInSvc();
            //lightLabelsInWinformSvc();
 
            if (InvokeRequired)
            {
                this.Invoke(new loadNewCurrentWave(delegate()
                {
                    lbLightsInfo.Text = "连接正常";
                    elelab.pick.init_port(enumLabelPickType.pick);
                    if (elelab.pick.activeComports.Count == 0)
                    {
                        lbLightsInfo.Text = "拣选设备连接错误";
                        // showErrorMsg("拣选设备连接错误,请检查设备连接");
                        return;
                    }
                }));
            }
            else
            {
                lbLightsInfo.Text = "连接正常";
                elelab.pick.init_port(enumLabelPickType.pick);
                if (elelab.pick.activeComports.Count == 0)
                {
                    lbLightsInfo.Text = "拣选设备连接错误";
                    // showErrorMsg("拣选设备连接错误,请检查设备连接");
                    return;
                }
            }
       
            
            lastWave = DateTime.Now;
            WmsConstants.WAVE_CURRENT_LIGHTS_STATUS.Clear();
            string result = elelab.pick.send_data_pick(lgt.getWmsOutPickLable.getData4Pick(WmsConstants.WAVE_CURRENT_ORDER).Tables[0], enumLabelPickType.pick);
            
 //#if DEBUG 
            closeWaitForm();
            if (!string.IsNullOrEmpty(result))
            {
                if (InvokeRequired)
                {
                    this.Invoke(new loadNewCurrentWave(delegate()
                    {
                        lbLightsInfo.Text = result;
                    }));
                }
                else
                {
                    lbLightsInfo.Text = result;
                }
       
              
                //showErrorMsg(result);
            }
//#endif
        }
        private static bool _canNewWave = true;
        //Int64 lastWave =0;
        DateTime lastWave;
        public bool canNewWave
        {
            get
            {
                 
              //  _canNewWave = _canNewWave && outRequest.canNewWave();
                if (!autoWave)
                {
                    return true;
                }
                if (_canNewWave)
                {
                    lastWave = DateTime.Now;
                }
                else
                {
                    TimeSpan ts = DateTime.Now - lastWave;
                    if (ts.TotalMilliseconds > WmsConstants.MAX_SECONDS_BETWEEN_WAVES) //强制开始新波次,有可能会有再次发送亮灯数据时
                    {
                        _canNewWave = true;
                        lastWave = DateTime.Now;
                    }
                }
                return _canNewWave;//|| outRequest.canNewWave() ;//|| true;
                //  return _canNewWave; // pickLabelDetail.getCurrentPickList(enumLabelPickState.notPicked).Tables[0].Rows.Count > 0;
            }
        }
        public void newPickWave()
        {
            if (!canNewWave)
            {
                return;
            }
            _canNewWave = false;
            bool exist = false;
            try
            {
                exist = lgt.getWmsOutPickLable.getCurrentPickList().Tables[0].Rows.Count > 0;
               
                // bool exist = outRequest.getRequests(enumOutOrderType.pickOrder, enumOutStockRequestStatus.picking).Tables[0].Rows.Count >0;
                if (exist)
                {
                    if (WmsConstants.WAVE_CURRENT_LIGHTS_STATUS.ContainsValue(false))
                    {
                        lightLables();
                    }
                    // TaskCallBack();
                    return;
                    //  throw new DeiNiuException("当前波次还未处理完毕,不能开始新的波次。");
                }
                // List requests = outRequest.getRequestObjects(enumOutOrderType.拣货单, enumOutStockRequestStatus.波次处理);
               /* int cnt = lgt.getRequests4WaveCnt((int)enumOutOrderType.拣货单, (int)enumOutStockRequestStatus.波次处理);
                
                if (cnt == 0)
                {
                    _canNewWave = true;
                    //   TaskCallBack();
                    return;
                    //throw new DeiNiuException("没有待出库数据需要处理的。");
                }*/
                //to call client for new wave
                showWaitForm("正在配置新波次");
                lgt.newPickWave();
                
            }
            catch (Exception er)
            {
                LogHelper.WriteLog(this.GetType(), er);
#if debug
                showErrorMsg(er.Message);
#endif
            }
            lastWaveRequestTime = DateTime.Now;
            WmsConstants.WAVE_CURRENT_PICK_STATUS.Clear();
            lightLabelsCurrentWave();
            _canNewWave = true;
        }
        private void label1_Click(object sender, EventArgs e)
        {
        }
      //  bool isPriorityQuery = false;
        private void btnQuery_Click_1(object sender, EventArgs e)
        {
          //  isPriorityQuery = true;
            this.query();
          //  isPriorityQuery = false;
        }
         
        private void lgPriority_CustomButtonChecked(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)
        {
            lastQuery = "";
             query();
        }
        private void lgPriority_CustomButtonUnchecked(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)
        {
           
        }
        private void btnExport_Click(object sender, EventArgs e)
        {
            exportExcel("",gridView1);
        }
        string[] colors = new string[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
        private void gridView3_CustomColumnDisplayText(object sender, DevExpress.XtraGrid.Views.Base.CustomColumnDisplayTextEventArgs e)
        {
            if (string.IsNullOrEmpty(e.DisplayText))
            {
                return;
            }
            if (e.Column.FieldName == "color")
            {
                if (colors.Contains(e.DisplayText))
                {
                    int display = -100;
                    string disTxt = e.DisplayText;
                    try
                    {
                        display = Convert.ToInt16(e.DisplayText);
                        e.DisplayText =getColor(display);
                    }
                    catch
                    {
                        return;
                    }
                }
              
            }
        }
        string getColor(int color)
        {
            string colorName = "";
            switch (color)
            {
                case 1:
                    colorName = "红";
                    break;
                case 2:
                    colorName = "绿";
                    break;
                case 3:
                    colorName = "蓝";
                    break;
                case 4:
                    colorName = "红闪";
                    break;
                case 5:
                    colorName = "绿闪";
                    break;
                case 6:
                    colorName = "蓝闪";
                    break;
                case 7:
                    colorName = "红绿";
                    break;
                case 8:
                    colorName = "红蓝";
                    break;
                case 9:
                    colorName = "绿蓝";
                    break;
                case 10:
                    colorName = "红绿蓝";
                    break;
              
                default:
                    colorName = "红";
                    break;
            }
            return colorName;
        }
        private void GoodsOutForm_Load(object sender, EventArgs e)
        {
        }
        private void spinColors_EditValueChanged(object sender, EventArgs e)
        {
            WmsConstants.MAX_COLORS = Convert.ToInt16( spinColors.Value) ;
        }
    }
}