using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraNavBar;
using DevExpress.XtraBars.Ribbon;
using DevExpress.XtraTabbedMdi;
using System.Reflection;
//using DeiNiu.wms.Logical;
using Microsoft.Data.ConnectionUI;
using System.Data.SqlClient;
using DeiNiu.Utils;
using System.Configuration;
using DevExpress.LookAndFeel;
using System.Xml;
using System.Runtime.InteropServices;
using DeiNiu.Utils;
using DeiNiu.wms.win.utils;
using System.ServiceModel; 
using System.ServiceModel.Description;
using System.Net;
using System.Runtime.Serialization.Json;
using System.IO;
using System.Threading;
using elelab;
using dn_wms;
using Model;
using System.Deployment.Application;
using DeiNiu.wms.Data.Model;
using DevExpress.XtraPrinting.Export.Pdf;
using DevExpress.XtraPrinting.Native.WebClientUIControl;
using System.Timers;
using Newtonsoft.Json;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel;
namespace DeiNiu.wms.win
{
    public partial class main : BasicRibbonForm
    {
        [DllImport("kernel32.dll")]
        public static extern Boolean AllocConsole();
        [DllImport("kernel32.dll")]
        public static extern Boolean FreeConsole();  
        public main()
        {
          //  initialConsole();
            InitializeComponent();
            InitSkinGallery();
          //  UserLookAndFeel.Default.SetSkinStyle(defaultSkinName);
            initialControles();
            startLightService();
            initialDelayOffTimer();
            showWaitForm();
            int rd = new Random().Next(1, 10);
            bool isValid = validSn();
            //  if (isValid || validStatus != enumOnlineStatus.禁用 || rd > 7)
            {
                //showErrorMsg("程序已过期");
                createMenus();
            }
            closeWaitForm();
            lbvsersion.Text = getVersiion();
        }
        /// 
        /// 获取客户端发布版本号
        /// 
        /// 当前版本号
        private static string getVersiion()
        {
            var version = "";
            if (ApplicationDeployment.IsNetworkDeployed)//是否已连接
            {
                ApplicationDeployment currDeployment = ApplicationDeployment.CurrentDeployment;
                DateTime lastCheck = currDeployment.TimeOfLastUpdateCheck.ToLocalTime();
                var lastDay = lastCheck.Date.ToShortDateString();
                var lastTime = lastCheck.TimeOfDay.ToString();
                var majorVersion = currDeployment.CurrentVersion.Major.ToString();//主版本
                var minorVersion = currDeployment.CurrentVersion.Minor.ToString(); //次版本
                var revisionVersion = currDeployment.CurrentVersion.Revision.ToString();//内部版本号
                var blildVersion = currDeployment.CurrentVersion.Build.ToString();//修订号
                version = majorVersion + "." + minorVersion + "." + blildVersion + "." + revisionVersion;
            }
            return version;
        }
        private bool validSn()
        {
            initialTimer1();
            vcnt = System.Configuration.ConfigurationManager.AppSettings["vcnt"];
            checkOnline();
            try
            {
                loop = Convert.ToInt32(vcnt);
            }
            catch { loop = 0; }
            if (loop >= maxLoop)
            {
                return false;
            }
            return true;
        }
        private void initialConsole(){
            #if DEBUG
                        AllocConsole();
                        Shell.WriteLine("注意:启动程序..."); 
                        Shell.WriteLine("");
            #endif  
        
        }
        private void initialControles()
        {
            this.ribbonControl1.ShowToolbarCustomizeItem = false; // hide top left menu
            this.ribbonControl1.Minimized = true;
            showRibbonEditPage();
            dockPanel1.Options.ShowCloseButton = false;
           // dockPanel1.Visibility = DevExpress.XtraBars.Docking.DockVisibility.AutoHide;
            this.WindowState = FormWindowState.Maximized; 
        }
        private void showRibbonEditPage()
        {
           int cnt = xtraTabbedMdiManager1.Pages.Count;
            ribbonPageEdit.Visible = xtraTabbedMdiManager1.Pages.Count > 0; //hide editPage when no subform exist.
            ribbonControl1.SelectedPage = ribbonControl1.Pages[0];
        }
         
        private void ribbonControl1_Merge(object sender, DevExpress.XtraBars.Ribbon.RibbonMergeEventArgs e)
        {
            //RibbonControl parentRRibbon = sender as RibbonControl;
            //RibbonControl childRibbon = e.MergedChild;
            //parentRRibbon.StatusBar.MergeStatusBar(childRibbon.StatusBar);
        }
        private void ribbonControl1_UnMerge(object sender, DevExpress.XtraBars.Ribbon.RibbonMergeEventArgs e)
        {
            //RibbonControl parentRRibbon = sender as RibbonControl;
            //parentRRibbon.StatusBar.UnMergeStatusBar();
        }
        private void OpenLink( Form itemForm, string itemHeader)
        {
            //遍历已打开的TabPage,若发现已打开过则不再重复打开并设置为Active
            int itemCount = xtraTabbedMdiManager1.Pages.Count;
            foreach (XtraMdiTabPage itemPage in xtraTabbedMdiManager1.Pages)
            {
                if (itemHeader == itemPage.Text)
                {
                    //MessageBox.Show("the page has been openned");
                    //设置活动Tab Page
                    xtraTabbedMdiManager1.SelectedPage = itemPage;
                    return;
                }
            }
            itemForm.MdiParent = this;
            itemForm.Text = itemHeader;
            itemForm.Show();
            //设置为Active
            xtraTabbedMdiManager1.SelectedPage = xtraTabbedMdiManager1.Pages[itemCount];
        }
        private void navBarControl1_LinkClicked(object sender, NavBarLinkEventArgs e)
        {
            String itemHeader = e.Link.Caption;
            //遍历已打开的TabPage,若发现已打开过则不再重复打开并设置为Active
            int itemCount = xtraTabbedMdiManager1.Pages.Count;
            foreach (XtraMdiTabPage itemPage in xtraTabbedMdiManager1.Pages)
            {
                if (itemHeader == itemPage.Text)
                {
                    //MessageBox.Show("the page has been openned");
                    //设置活动Tab Page
                    xtraTabbedMdiManager1.SelectedPage = itemPage;
                    return;
                }
            }
             
            String formName = e.Link.Item.Tag == null ? null : e.Link.Item.Tag.ToString();
            if (string.IsNullOrEmpty(formName))
            {
                return;
            }
            showWaitForm();
            String fullName = GetType().Namespace + "." + formName;
            Assembly assembly = GetType().Assembly;
            Type type = assembly.GetType(fullName);//AuthorityForm
            if (type == null)
            {
                closeWaitForm();
                showErrorMsg(e.Link.Item.Name + "窗体打开失败");
                return;
            }
            Form itemForm = (Form)Activator.CreateInstance(type);
            itemForm.MdiParent = this;
            itemForm.Text = itemHeader;
            itemForm.Show();
            closeWaitForm();
            //设置为Active
            xtraTabbedMdiManager1.SelectedPage = xtraTabbedMdiManager1.Pages[itemCount];
            showRibbonEditPage();
             
             dockPanel1.Visibility = DevExpress.XtraBars.Docking.DockVisibility.AutoHide;
            //AddPageMdi(e.Link.Item);
        }
        private new void showLogin()
        {   
            createMenus();
          
        }
        /// 
        /// 同步erp 信息
        /// 
        private void initailErpData()
        {
        
 
             
        }
        private void createMenus(){
            this.navBarControl1.BeginUpdate();
            this.navBarControl1.Groups.Clear();
            //   LAuthority la = new LAuthority();
            //   Dictionary> auths = la.getCatedAuthorities(Park.currentUser.GetEmployee.ID);
            Dictionary result = new Dictionary();
           // string[] locations ={"货位设置:LocationmgrForm"};
            string[] lights = { "波次亮灯:GoodsOutForm"  };
            result["摘果拣选"] = lights;
          //   result["货位设置"] = locations;
            result["二次分播"] = new string[] { 
                "货位设置:LocationmgrForm",
                "任务控制:SeedsImport",
                "分播操作:SeedsOut" 
               // ,"播种服务:LightSeviceHostForm",
               // "服务测试:LightSeviceTestForm" 
            };
           
           
#if DEBUG 
          /*  result["测试服务"] = new string[] { 
                "播种服务:LightSeviceHostForm",
                "服务测试:LightSeviceTestForm" 
            }; 
            */
            result["硬件设置"] = new string[] {"测试工具:basicFuncs" };  
#endif
            int i = 0;
            foreach (String cate in result.Keys)
            {
                i++;
                NavBarGroup group1 = new NavBarGroup(cate);
                foreach (string link in result[cate])
                {
                    string[] rs = link.Split(':');
                    if (string.IsNullOrEmpty(rs[0]))
                    {
                        continue;
                    }
                    NavBarItem nbi = new NavBarItem(rs[0]);
                    nbi.Tag = rs[1];
                    group1.ItemLinks.Add(nbi);
                } 
                this.navBarControl1.Groups.Add(group1);
                if (group1.ItemLinks.Count > 0 && i>1)
                {
                  
                    group1.Expanded = true;
                }
            }
            this.navBarControl1.EndUpdate();
            this.navBarControl1.LinkClicked += new NavBarLinkEventHandler(navBarControl1_LinkClicked);
            showRibbonEditPage();
        }
        /**
         * clear mdi,close forms
         * 
         */ 
        private void doClear()
        {
            xtraTabbedMdiManager1.Pages.Clear();
        }
        private void barButtonItem1_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            doClear();
            showLogin();
        }
        private void xtraTabbedMdiManager1_PageRemoved(object sender, MdiTabPageEventArgs e)
        {
            showRibbonEditPage();
        }
        private void dockPanel1_ClosingPanel(object sender, DevExpress.XtraBars.Docking.DockPanelCancelEventArgs e)
        {
            dockPanel1.Visibility = DevExpress.XtraBars.Docking.DockVisibility.AutoHide;
        }
        private void dockPanel1_Collapsed(object sender, DevExpress.XtraBars.Docking.DockPanelEventArgs e)
        {
            dockPanel1.Visibility = DevExpress.XtraBars.Docking.DockVisibility.AutoHide;
        }
        private void dockPanel1_VisibilityChanged(object sender, DevExpress.XtraBars.Docking.VisibilityChangedEventArgs e)
        {
            if (dockPanel1.Visibility == DevExpress.XtraBars.Docking.DockVisibility.Hidden)
            {
                dockPanel1.Visibility = DevExpress.XtraBars.Docking.DockVisibility.AutoHide;
            }
        }
        ///   
        /// 与控制台交互  
        ///   
        static class Shell
        {
            ///   
            /// 输出信息  
            ///   
            ///   
            ///   
            public static void WriteLine(string format, params object[] args)
            {
                WriteLine(string.Format(format, args));
            }
            ///   
            /// 输出信息  
            ///   
            ///   
            public static void WriteLine(string output)
            {
                Console.ForegroundColor = GetConsoleColor(output);
                Console.WriteLine(@"[{0}]{1}", DateTimeOffset.Now, output);
            }
            ///   
            /// 根据输出文本选择控制台文字颜色  
            ///   
            ///   
            ///   
            private static ConsoleColor GetConsoleColor(string output)
            {
                if (output.StartsWith("警告")) return ConsoleColor.Yellow;
                if (output.StartsWith("错误")) return ConsoleColor.Red;
                if (output.StartsWith("注意")) return ConsoleColor.Green;
                return ConsoleColor.Gray;
            }
        }  
        //private void xtraTabbedMdiManager1_FloatMDIChildActivated(object sender, EventArgs e)
        //{
            
        //}
        //private void xtraTabbedMdiManager1_SelectedPageChanged(object sender, EventArgs e)
        //{
        //    //RibbonControl subRibbon = ((basicRibbonForm)xtraTabbedMdiManager1.SelectedPage.MdiChild).getRibbon();
        //    //this.ribbonControl1.MergeRibbon(subRibbon);
        //}
         #region 皮肤
        //初始化皮肤
        string defaultSkinName = "Blue";
        void InitSkinGallery()
        {
            DevExpress.XtraEditors.WindowsFormsSettings.DefaultFont = new Font("黑体 常规", 12);
            // gallerySkins.Manager = barManager1;
           //  DevExpress.XtraBars.Helpers.SkinHelper.InitSkinGalleryDropDown(gallerySkins, true);
             CheckFile();//检查文件
             GetXmlSkin();//获取xml主题  
           // UserLookAndFeel.Default.SetSkinStyle("DevExpress Style"); 
            if (!string.IsNullOrEmpty(LoginInfo.Theme))
            {
                defaultSkinName = LoginInfo.Theme;
               // defaultSkinName = "Summer 2008";
            }
            DevExpress.UserSkins.BonusSkins.Register();
            DevExpress.Skins.SkinManager.EnableFormSkins();
            //This set the style to use skin technology
            DevExpress.LookAndFeel.UserLookAndFeel.Default.Style = DevExpress.LookAndFeel.LookAndFeelStyle.Skin;
            if (!string.IsNullOrEmpty(defaultSkinName))
            {
                UserLookAndFeel.Default.SetSkinStyle(defaultSkinName);//设置主题样式
                return;
            }
            UserLookAndFeel.Default.SetSkinStyle("Blue");//设置主题样式
        }
         
        //检查是否有皮肤名称的xml配置文件    
        public void CheckFile()
        {
            try
            {
                if (System.IO.File.Exists("SkinInfo.xml") == false)
                {
                    CreateXml();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        // 创建XML文件
        public void CreateXml()
        {
            XmlDocument doc = new XmlDocument(); //建立xml定义声明
            XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
            doc.AppendChild(dec);
            XmlElement root = doc.CreateElement("SetSkin"); //创建根节点
            XmlElement rootone = doc.CreateElement("Skinstring");//皮肤
            doc.AppendChild(root);//将one,two,插入到root节点下
            root.AppendChild(rootone);
            doc.Save("SkinInfo.xml");//保存皮肤名称文件为xml格式
        }
        //读取Xml节点内容
        public void GetXmlSkin()
        {
            try
            {
                XmlDocument mydoc = new XmlDocument();
                mydoc.Load("SkinInfo.xml");//从xml文件中提取皮肤名称
                XmlNode ressNode = mydoc.SelectSingleNode("SetSkin");//头和尾
                defaultSkinName = ressNode.SelectSingleNode("Skinstring").InnerText;//把提取出来的皮肤名称存到defaultSkinName中
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
     
         
                     
                      
        private void skinRibbonGalleryBarItem1_Gallery_ItemClick(object sender, GalleryItemClickEventArgs e)
        { 
        
            if (skinRibbonGalleryBarItem1.Gallery == null)
            {
                return;
            }
            try
            {
                showWaitForm();
                
                 
                XmlDocument doc = new XmlDocument();
                doc.Load("SkinInfo.xml");
                XmlNodeList nodelist = doc.SelectSingleNode("SetSkin").ChildNodes;
                foreach (XmlNode node in nodelist)
                {
                    XmlElement xe = (XmlElement)node;//将子节点类型转换为XmlElement类型 
                    if (xe.Name == "Skinstring")
                    {
                        xe.InnerText = skinRibbonGalleryBarItem1.Gallery.GetCheckedItems()[0].Tag.ToString();//主题的描述,保存所选的主题名称,参见GetCheckedItems()[0]函数的解释,主要用这个函数提取皮肤名称
                    }
                }
                doc.Save("SkinInfo.xml");
                
                if (LoginInfo.UserId >0)
                {
                    string tag = skinRibbonGalleryBarItem1.Gallery.GetCheckedItems()[0].Tag.ToString();//caption;
                    string caption = skinRibbonGalleryBarItem1.Gallery.GetCheckedItems()[0].Caption;
                    
                    //Park.currentUser.GetEmployee.em_profile = skinRibbonGalleryBarItem1.Gallery.GetCheckedItems()[0].Tag.ToString();//caption;
                    //Park.currentUser.GetEmployee.Update();
                
                }
              //  System.Threading.Thread.CurrentThread.Join(10);
            }
            catch (Exception er)
            {
                DeiNiu.Utils.LogHelper.WriteLog(typeof(main), er);
            }
            finally
            {
                closeWaitForm();
            }
        
        }   
      #endregion
        private void main_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (MessageBox.Show("真的要退出程序吗?", "退出程序", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
            {
                e.Cancel = true;
            }         
        }
        private void main_FormClosed(object sender, FormClosedEventArgs e)
        {
            showWaitForm();
            System.Environment.Exit(0); 
        }
        private void barButtonItem2_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if (MessageBox.Show("真的要退出程序吗?", "退出程序", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
            {
                return;
            }         
            showWaitForm();
            System.Environment.Exit(0); 
        }
        private void skinRibbonGalleryBarItem1_Gallery_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
        }
        private void btnConn_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            openConnectionWindow();
        }
        private void openConnectionWindow()
        {
            DataConnectionDialog dialog = new DataConnectionDialog();
            String conn =System.Configuration.ConfigurationManager.AppSettings["SqlConnWMS"];
            
            dialog.DataSources.Clear();
            /*
             #region//mdb
              dialog.DataSources.Add(DataSource.AccessDataSource);
             dialog.SelectedDataProvider = DataProvider.OleDBDataProvider;
             dialog.SelectedDataSource = DataSource.AccessDataSource;
             #endregion
             */
            #region //Sql Server
            dialog.DataSources.Add(DataSource.SqlDataSource);//Sql Server
            dialog.SelectedDataSource = DataSource.SqlDataSource;
            dialog.SelectedDataProvider = DataProvider.SqlDataProvider;
            #endregion
             dialog.ConnectionString = conn;
            
            /*
            #region//Oracle
            dialog.DataSources.Add(DataSource.OdbcDataSource);
            dialog.SelectedDataSource = DataSource.OracleDataSource;
            dialog.SetSelectedDataProvider = DataProvider.OracleDataProvider;
            #endregion
            */
            if (DataConnectionDialog.Show(dialog) == DialogResult.OK)
            {
                if (!String.IsNullOrEmpty(conn) && conn.Equals(dialog.ConnectionString))
                {
                    return;
                }
                try
                {
                    // string strCom = " SELECT * FROM JQ_Info";
                    ////创建一个 DataSet对象   
                    DataSet ds = new DataSet();
                    //#region//(1)连接mdb
                    //OleDbConnection dbConn = new OleDbConnection(dialog.ConnectionString);
                    //dbConn.Open();
                    //OleDbDataAdapter dbAdapter = new OleDbDataAdapter(strCom, dbConn);
                    //dbAdapter.Fill(ds);
                    //dbConn.Close();
                    //#endregion
                    #region//(2)连接Sql Server
                    String connString = dialog.ConnectionString +";Pooling=true;Max Pool Size = 300; Min Pool Size=0; Connection Lifetime = 300;packet size=1000 ";
                    SqlConnection sqlConn = new SqlConnection(connString);
                    sqlConn.Open();
                    sqlConn.Close();
                    WriteConfig("SqlConnWMS",connString);
                    WmsConstants.SQL_CONN_WMS = connString;
                    #endregion
                    MessageBox.Show("连接数据库成功。", "成功");
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show("连接数据库发生错误:" + ex.Message, "错误!");
                    openConnectionWindow();
                }
                finally
                {
                }
            }
        }
       
        //-------------------------service host-----------
        static log4net.ILog log = log4net.LogManager.GetLogger("light");
        private ServiceHost host = null;
        public static List labelPool = new List();
        string svrUrl = "http://127.0.0.1:9998/DNLight";
        delegate void showStatus();
        private void startLightService()
        {
            elelab.pick.init_port(enumLabelPickType.seed);
            Thread threadPreProcess = new Thread(startHost2);
            threadPreProcess.IsBackground = true;
            threadPreProcess.Start();
        }
        void startHost2()
        {
            //  lbStatus.Text = "服务启动失败";
            try
            {
                svrUrl = System.Configuration.ConfigurationManager.AppSettings["BaseUri"];
                Uri baseAddress = new Uri(svrUrl);
                ServiceLight service = new ServiceLight();
                service.newLabels += this.newLabels;
                service.lightUp += this.lightUp;
                service.turnOff += this.turnOff;
                service.turnOnLts += this.turnOnLights;
                service.turnOffLts += this.turnOffLights;
                host = new ServiceHost(service, baseAddress);
                elelab.pick.lightOffEvent += testPicked;
                WebHttpBinding binding = new WebHttpBinding();
                ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(IServiceLight), binding, baseAddress);
                WebHttpBehavior httpBehavior = new WebHttpBehavior();
                endpoint.Behaviors.Add(httpBehavior);
                List lstIp = Util.GetLocalIpAddress("InterNetwork");
                string showSvr = svrUrl;
                if (lstIp.Count > 0)
                {
                    showSvr = svrUrl.Replace("127.0.0.1", lstIp[0]);
                }
                host.Opened += delegate
                {
                    if (InvokeRequired)
                    {
                        this.Invoke(new showStatus(delegate()
                        {
                           // lbStatus.Text = "服务已启动";
                            lbUrl.Text = showSvr;
                        }));
                    }
                    else
                    {
                       // lbStatus.Text = "服务已启动";
                        lbUrl.Text = showSvr;
                        // lbStatus.Text = "服务启动失败";
                        //  lbUrl.Text ="";
                    }
                };
                host.Open();
                log.Debug("亮灯服务启动");
            }
            catch (Exception e)
            {
                log.Debug("亮灯服务启动失败");
                log.Error(e);
                MessageBox.Show("启动服务失败:  " + e.Message);
            }
        }
        void testPicked(int eleId, int port, int eleAddress, int count)
        {
            if (InvokeRequired)
            {
                this.Invoke(new showStatus(delegate()
                {
                    showResult(eleId, port, eleAddress, count);
                }));
            }
            else
            {
                showResult(eleId, port, eleAddress, count);
            }
        }
        void showResult(int eleId, int color, int eleAddress, int count)
        {
           // lbreturn.Text = string.Format("标签ID:{0} \n\n 端口:{1} \n\n 地址:{2} \n\n 数量:{3}", eleId, color, eleAddress, count);
        }
        void newLabels(List lables)
        {
            labelPool = labelPool.Union(lables).ToList();
            labelPool = labelPool.Concat(lables).ToList();
        }
        System.Timers.Timer timer = new System.Timers.Timer();//实例化Timer类 
        public void setDelay(int delayMs)
        {
            delayMs = delayMs < 1500 ? 1500 : delayMs;
            delayMs = delayMs > 6000 ? 6000 : delayMs;
            timer.Stop();
            timer.Interval = delayMs;
            timer.Start();
        }
        void lightUp(object source, System.Timers.ElapsedEventArgs e)
        {
            if (labelPool.Count == 0)
            {
                return;
            }
            ELabel lb = labelPool[0];
            int[] ids = new int[] { lb.labelId };
            string[] ele_address = new string[] { lb.address.ToString() };
            elelab.pick.init_port(enumLabelPickType.seed);
            //  string result = elelab.pick.send_data_pick(null, enumLabelPickType.pick);
            bool result = elelab.pick.lightLabels2(labelPool, 1, 1, enumLabelPickType.seed);
            if (result)
            {
                labelPool.Remove(lb);
            }
        }
        void lightUp(List lables, int portNo)
        {
            //to lightup
#if DEBUG
            // portNo = 13;
#endif
            int[] ids = new int[lables.Count];
            string[] ele_address = new string[lables.Count];
            for (int i = 0; i < lables.Count; i++)
            {
                ids[i] = lables[i].labelId;
                ele_address[i] = lables[i].address.ToString();
            }
            elelab.pick.init_port(enumLabelPickType.seed);
            elelab.pick.lightLabels2(lables, portNo, 1, enumLabelPickType.seed);
        }
        #region a
        private void insertTestData()
        {
            string url = svrUrl + "/uploadSeeds";
            try
            {
                //    #region JosnPost
                List seeds = new List();
                int maxLbId = 1;
                int k = 0;
                for (int i = 401; i < 800; i++)
                {
                    SeedsItem si = new SeedsItem();
                    si.count = i * 9 + 1;
                    si.custOrder = "CO" + i * 100 / 3 + 1;
                    si.seedsNo = "seedsNo0" + (i / maxLbId + 1);
                    if (k >= maxLbId)
                    {
                        k = 0;
                    }
                    k++;
                    si.elabId = k;
                    si.barcode = k / 5 + 1 + "";
                    si.deskId = 1;
                    si.itemName = "name" + si.barcode;
                    si.port = si.deskId;
                    si.unit = "each";
                    seeds.Add(si);
                }
                DataContractJsonSerializer dcSerializer = new DataContractJsonSerializer(typeof(List));
                MemoryStream stream = new MemoryStream();
                dcSerializer.WriteObject(stream, seeds);
                string data = Encoding.UTF8.GetString(stream.ToArray(), 0, (int)stream.Length);
                //HttpClient client = new HttpClient();
                //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                string link = url;
                //HttpResponseMessage respondse = await client.PostAsync(link, new StringContent(data));
                //string dataWithJason = await respondse.Content.ReadAsStringAsync();
                var request = (HttpWebRequest)WebRequest.Create(new Uri(link));
                request.ContentType = "application/json";
                request.Method = "POST";
                var requestStream = request.GetRequestStream();
                using (var writer = new StreamWriter(requestStream))
                {
                    writer.Write(data);
                    writer.Flush();
                }
                /*using (var resp = request.GetResponse())
                {
                    using (var responseStream = resp.GetResponseStream())
                    {
                        var reader = new StreamReader(responseStream);
                        var result = reader.ReadToEnd();
                    }
                }*/
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                string json = null;
                using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("UTF-8")))
                {
                    json = reader.ReadToEnd();
                }
                // WebResponse response = request.GetResponse();
                // string json = null;
                //   using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("UTF-8")))
                {
                    //       json = reader.ReadToEnd();
                }
                /*   
                using (var requestStream = await  request.GetRequestStreamAsync())
                {
                    var writer = new StreamWriter(requestStream);
                    writer.Write(data);
                    writer.Flush();
                }
                using (var resp = await request.GetResponseAsync())
                {
                    using (var responseStream = resp.GetResponseStream())
                    {
                        var reader = new StreamReader(responseStream);
                        var result = reader.ReadToEnd();
                    }
                }*/
                /*
             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@url);
            request.ContentType = "application/json";
            request.Method = "POST";
            string inputString = data;//"{\"Key\":\"ABCDEFG\"}";
            Byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(inputString);
            request.ContentLength = byteArray.Length;
            Stream rstream = request.GetRequestStream();
            rstream.Write(byteArray, 0, byteArray.Length);
            rstream.Close();
 
 
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream streams = response.GetResponseStream();
            StreamReader SR = new StreamReader(streams);
            String info = SR.ReadToEnd();
            SR.Dispose();
           */
                MessageBox.Show("导入成功");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        #endregion
        private void btnLightSeeds_Click(object sender, EventArgs e)
        {
        }
        private void LightSeviceHostForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            turnOffLights();
            if (host != null)
            {
                host.Close();
            }
        }
        void turnOff(int portNo)
        {
            if (unart_manage.com_manage[portNo] == null)
            {
                return;
            }
            Model.dis_id id;
            //id.ele_id = Convert.ToInt16(new_id.Text);
            id.order = 1;
            id.ele_id = 65535;
            id.state = 1;
            unart_manage.com_manage[portNo].init_port.write_clear_comment(id);
        }
        void turnOffLights()
        {
            Model.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)//WmsConstants.WAVE_CURRENT_LIGHTS_PORT_STATUS.Keys)
            {
                if (port == 0)
                {
                    continue;
                }
                //  unart_manage.com_manage[port].write_reset_device(); 复位各个硬件,通道灯,标签。。。
                unart_manage.com_manage[port].init_port.write_clear_comment(id);
            }
        }
        private void simpleButton1_Click(object sender, EventArgs e)
        {
            insertTestData();
        }
        private void simpleButton1_Click_1(object sender, EventArgs e)
        {
            insertTestData();
        }
        /*
        void turnOnLights( int portNo,List lights )
        {
            foreach(ELight el in lights){
                
                     channel_led id =new channel_led();
                    id.channel_id = el.lightId;
                    //id.config_word = led_rgb;
                    id.color = el.color;
                    id.state = 1;
                  bool rt=  pick.turnOnLight(portNo, id);
               
            }
        }
        void turnOffLights(int portNo, List lights)
        {
            foreach (ELight el in lights)
            {
                channel_led id = new channel_led();
                id.channel_id = el.lightId;
                //id.config_word = led_rgb;
                id.state = 1;
                pick.turnOffLight(portNo, id);
                 
            }
        }
        */
        private void initialDelayOffTimer()
        {
            int delayMs = 2000;
            int intTime = 2000;
            try
            {
                delayMs = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["delayMs"]);
            }
            catch
            {
            }
            intTime = delayMs > 0 ? delayMs : intTime;
            timer.Interval = intTime;//设置间隔时间,为毫秒;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(lighOff);//到达时间的时候执行事件;
            timer.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
            timer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
            timer.Start();
        }
        void lighOff(object source, System.Timers.ElapsedEventArgs e)
        {
            log.Debug("start light off auto , off list size: " + delayOffList.Count + ", validStatus " + validStatus);
            if (delayOffList.Count == 0 || validStatus == enumOnlineStatus.禁用)
            {
                return;
            }
            List lightsTmp = new List();
            Dictionary> lights2Off = new Dictionary>();
            foreach (ELight light in delayOffList)
            {
                if (light.time.AddSeconds(delayOffInvterval) <= DateTime.Now)
                {
                    if (!lights2Off.Keys.Contains(light.port))
                    {
                        lights2Off[light.port] = new List();
                    }
                    lights2Off[light.port].Add(light);
                    log.Debug(string.Format("add to off list light id {0} ,light time {1}, light which {2}, light port {3}",
                        light.lightId, light.time, light.which, light.port));
                }
                else
                {
                    lightsTmp.Add(light);
                }
            }
            if (lights2Off.Count == 0)  //无符合条件的灯光,返回
            {
                return;
            }
            foreach (int port in lights2Off.Keys)
            {
                turnOffLights(port, lights2Off[port]);
            }
            delayOffList = lightsTmp;
        }
        int baseLightId = 5000;
        int currentPort = 11;       
        double delayOffInvterval = 2d;
        List delayOffList = new List();
        bool turnOnLights(int portNo, List lights)
        {
            if (portNo == 0)
            {
                portNo = currentPort;
            }
            // bool rt=false;
            List fail = new List();
            log.Debug("start light on request ------>");
            foreach (ELight el in lights)
            {
                if (el.lightId == 0)
                {
                    continue;
                }
                channel_led id = new channel_led();
                id.channel_id = baseLightId + el.lightId;
                //id.config_word = led_rgb;
                id.color = el.which;
                id.state = 1;
                if (el.port == 0)
                {
                    el.port = portNo;
                }
                if (!pick.turnOnLight(el.port, id))
                {
                    log.Debug(getJson(el) + " light on failed. redo...");
                    fail.Add(el);
                }
                else
                {
                    el.time = DateTime.Now;
                    delayOffList.Add(el);
                    log.Debug(getJson(el));
                }
                Thread.Sleep(50);
            }
            if (fail.Count > 0)
            {
               // turnOnLights(portNo, fail);
            }
            log.Debug("<----------- end light on request ");
            return fail.Count == 0;
        }
        bool turnOffLights(int portNo, List lights)
        {
            if (portNo == 0)
            {
                portNo = currentPort;
            }
            bool rt = false;
            List fail = new List();
            log.Debug("start light off request ------>");
            foreach (ELight el in lights)
            {
                if (el.lightId == 0)
                {
                    continue;
                }
                if (el.time  0)
            {
               // turnOffLights(portNo, fail);
            }
            log.Debug("<----------- end light off  request ");
            return fail.Count == 0;
        }
        public string getJson(ELight light)
        {
            string json = "";
            json = String.Format("\"lightId\":{0},\"which\":{1}, \"port\":{2} , \"time\":{3}"
              , light.lightId, light.which, light.port,light.time);
            return "{" + json + "}";
        }
        private void barButtonItem1_ItemClick_1(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            Wmslocation ws = new Wmslocation();
            string dt2 = ws.getDateTime();
            DateTime d =  DateTime.Parse(dt2);
            int day = d.Day;
            int year = d.Year;
            int month = d.Month; 
           
            DateTime endate = new DateTime(2022, 2, 28);
            //  DateTime endate2 = new DateTime(2019, 8, 1);
            int resut = DateTime.Compare(d, endate);
        }
        //---valid on line
        public enumOnlineStatus validStatus = enumOnlineStatus.试用;
        public string jsonOnline;
        public WcfOnline wonline;
        int maxLoop = 15 * 24;//最大30天试用期
        string vcnt = "";
        int loop = 0;
        int custId = 102;
        void getOnline(Object id)
        {
            /*
             svrUrl = System.Configuration.ConfigurationManager.AppSettings["onLineUri"];
             svrUrl = svrUrl + "T_ONLINE.svc/getobj?id={0}"; 
             string custId = System.Configuration.ConfigurationManager.AppSettings["custId"];
             svrUrl = string.Format(svrUrl, custId);
             //this.lbOffLight.Text = svrUrl;
             jsonOnline = HttpGet(svrUrl, null);
             wonline =   new WcfOnline();
             try
             {
                 wonline = JsonConvert.DeserializeObject(jsonOnline);
             }
             catch (Exception ex)
             {
                 log.Error(ex);
             }
            */
            validSvr();
            // string json2 = JsonConvert.SerializeObject(wonline);
            string msg = "";
            loop++;
            if (wonline.id > 0)
            {
                validStatus = (enumOnlineStatus)wonline.state;
                // msg = string.Format("尊敬的{0},授权状态:【{1}】, {2}", wonline.custName, validStatus,wonline.msg);
                msg = wonline.msg;
                //this.navBarControl1.BeginUpdate();
                //this.navBarControl1.Groups.Clear();
                //this.navBarControl1.EndUpdate();
                if (validStatus == enumOnlineStatus.正常)
                {
                    //createMenus();
                    loop = 0;
                }
                else if (validStatus == enumOnlineStatus.试用)
                {
                    //createMenus();
                }
                else if (validStatus == enumOnlineStatus.过期)
                {
                    loop = loop > maxLoop ? loop : maxLoop;
                    //   msg = string.Format("尊敬的{0},授权状态:【{1}】, {2}", wonline.custName, validStatus, wonline.msg);
                }
                else if (validStatus == enumOnlineStatus.加料)
                {
                    loop = maxLoop - 5;
                }
                else if (validStatus == enumOnlineStatus.禁用)
                {
                    loop = loop > maxLoop ? loop : maxLoop;
                    if (new Random().Next(1, 10) < 7)
                    {
                        validStatus = enumOnlineStatus.试用;
                    }
                }
            }
            vcnt = loop + "";
            if (validStatus != enumOnlineStatus.禁用)
            {
                if (loop > maxLoop)
                {
                    validStatus = enumOnlineStatus.过期;
                    //  msg = string.Format("尊敬的客户{0} 授权状态:【{1}】  {2}", wonline.custName, validStatus, wonline.msg);
                }
                if (loop > maxLoop * 2)
                {
                    validStatus = enumOnlineStatus.加料;
                    //  msg = string.Format("尊敬的客户{0} 授权状态:【{1}】  {2}", wonline.custName, validStatus, wonline.msg);
                    WmsConstants.IS_ONLINE_RESTRICT = true;
                }
            }
            WriteConfig("vcnt", vcnt);
#if DEBUG
            msg = string.Format(" {0}  授权状态:【{1}】   ",msg, validStatus );
#endif
            //msg += new Random().Next(1, 10);
            if (InvokeRequired)
            {
                this.Invoke(new showStatus(delegate ()
                {
                    lbUrl.Text = msg;
                }));
            }
            else
            {
                lbUrl.Text = msg;
            }
        }
        private void checkOnline()
        {
            try
            {
                Thread threadPreProcess = new Thread(new ParameterizedThreadStart(getOnline));
                threadPreProcess.IsBackground = true;
                threadPreProcess.Start(0);
            }
            catch (Exception ex)
            {
                showErrorMsg(ex.Message);
            }
        }
        System.Timers.Timer timer1 = new System.Timers.Timer();//实例化Timer类 
        private void initialTimer1()
        {
            int minute = 1000 * 60;
            int intTime = 60 * minute;
#if DEBUG
            intTime = 1000 * 30;//30 秒
#endif
            timer1.Interval = intTime;//设置间隔时间, 1小时
            timer1.Elapsed += new System.Timers.ElapsedEventHandler(validHost);//到达时间的时候执行事件;
            timer1.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
            timer1.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
            timer1.Start();
        }
        private void validHost(object sender, ElapsedEventArgs e)
        {
            checkOnline();
        }
        private void btnValid_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            validSvr(true);
        }
        void validSvr(bool isValid = false)
        {
            // svrUrl = System.Configuration.ConfigurationManager.AppSettings["onLineUri"];
           string svrUrl = "http://www.deiniusoft.com:36990/T_ONLINE.svc/getobj?id={0}";
            svrUrl = string.Format(svrUrl, custId);
            //this.lbOffLight.Text = svrUrl;
            jsonOnline = HttpGet(svrUrl, null);
            wonline = new WcfOnline();
            try
            {
                wonline = JsonConvert.DeserializeObject(jsonOnline);
                // WmsConstants.IS_ONLINE_RESTRICT
                //   DeiNiu.Utils.WmsConstants.IS_ONLINE_RESTRICT = wonline.state ==(int)enumOnlineStatus.加料;
                WmsConstants.IS_ONLINE_RESTRICT = wonline.state > (int)enumOnlineStatus.正常;
            }
            catch (Exception ex)
            {
                if (isValid)
                {
                    showErrorMsg(ex.Message);
                }
                log.Error(ex);
            }
            if (WmsConstants.IS_ONLINE_RESTRICT)
            {
                try
                {
                    string lstIp = Util.GetLocalIpAddress("InterNetwork")[0];
                    int num = Convert.ToInt32(lstIp.Substring(lstIp.LastIndexOf(".") + 1));
                    int rd = new Random().Next(1, 10);
                    if (rd > 5 && num % 2 == 0 || rd <= 5 && num % 2 > 0)
                    {
                        WmsConstants.IS_ONLINE_RESTRICT = false;
                    }
                }
                catch { }
            }
            if (isValid)
            {
                string str = "验证错误:" + custId;
                if (wonline.id > 0)
                {
                    validStatus = (enumOnlineStatus)wonline.state;
                    str = string.Format("尊敬的客户 {0},您当前的服务到期时间:{1}", wonline.custName, wonline.endDate);
                }
                showInfoMsg(str);
            }
        }
    }
}