using CarMeterSystem.OptionCls;
using com.hnshituo.core.webapp.vo;
using Common;
using iCore.Rtdb.RtdbTable;
using MeterConditionLibrary;
using MeterModelLibrary;
using MeterModuleLibrary.uc;
using MeterPlugInLibrary;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using SystemOffLine;

namespace CarMeterSystem
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }

        private Log l = Log.GetInstance();
        private Print printClass = new Print();//打印

        //内存表
        private MemoryTableDataSocket MemoClass = new MemoryTableDataSocket("");

        //实时表数据采集
        private DataCollectionControl collection = new DataCollectionControl();

        //图片控制器含图片压缩及上传curl
        private ImageCurlControl imageCurlControl = new ImageCurlControl();

        //与监控界面对接的表
        private MeterWorkMonitorService meterWorkMonitor = new MeterWorkMonitorService();

        //零点报警表
        private meterworkzeroalarmservice zeroAlarmService = new meterworkzeroalarmservice();

        //车号修正
        private CarNoModfiy modfiy = new CarNoModfiy();

        /// <summary>
        /// 这个是保存前一次采集中的车号信息
        /// </summary>
        private string preCarNo = "";

        //验证对射
        private validParkStatus valid = new validParkStatus();

        //语音播报
        private VoicePlay vicPlayClass = new VoicePlay();

        private LED_Control led_controler = null;

        //监控表操作
        private MeterMonitorWeightService monitorWeightService = new MeterMonitorWeightService();

        private MeterWorkScheduledHelpService meterWorkScheduledHelpService = new MeterWorkScheduledHelpService();

        //历史皮操作
        private MeterBaseHisTareDataService hisTareDataService = new MeterBaseHisTareDataService();

        /// <summary>
        /// 欢迎界面
        /// </summary>
        private frmWelcome_Jisco frmWelcome = new frmWelcome_Jisco();//欢迎

        /// <summary>
        /// 计量页
        /// </summary>
        private frmOneYardToEnd fcc = null;
        
        /// <summary>
        /// 基础数据载入
        /// </summary>
        private BaseDbCls bd = new BaseDbCls();

        //扫码修正车号标识
        private bool codeFlag = false;

        private List<ucBusinessType> lu = new List<ucBusinessType>();

        private bool isVoiceDownCar = false;//车上人员请下车播放一次
        private bool isShowFrmWelcome = true; //是否显示欢迎界面

        private bool isOpened = false;//是否已经打开了扫码计量界面

        //扫码器
        private SerialPortES sweepCodeClass = new SerialPortES();

        private SerialPortES sweepCodeClass2 = new SerialPortES();

        private void frmMain_Load(object sender, EventArgs e)
        {
            //*
            try
            {
                this.Hide();
               
                LoginCls lg = new LoginCls();
                // 计量页
                fcc = new frmOneYardToEnd();
                timer1.Start();

                //2021年6月21日 杨秀东添加
                if (isShowFrmWelcome)
                {
                    frmWelcome.Show();
                    frmWelcome.Visible = true;
                }
               
                if (lg.LoginIn())
                {
                    //if (SystemUpdate(false))
                    //{
                    //    return;
                    //}
                    if (bd.setBaseDb() && bd.getBaseDb())
                    {
                        if (!string.IsNullOrEmpty(PbCache.sportInfo.ledIp))
                        {
                            led_controler = new LED_Control(PbCache.sportInfo.ledIp);
                        }

                        //调用该方法时已赋值 test git 测试git推送代码123；456
                        RESTfulResult<List<MeterWorkMonitor>> rm = meterWorkMonitor.doQueryOneWf(new MeterWorkMonitor { validFlag = "1", pointNo = PbCache.sportInfo.baseSpotNo });
                        if (!rm.Succeed)
                        {
                            l.WriteLog(1, "载入监控表数据异常");
                            return;
                        }
                        else if (rm.Data != null && rm.Data.Count > 0)
                        {
                            if (string.IsNullOrEmpty(PbCache.collect_no))
                            {
                                PbCache.collect_no = rm.Data[0].collectionCode;
                                MemoClass = new MemoryTableDataSocket(PbCache.collect_no);
                            }
                        }
                        else
                        {
                            l.WriteLog(1, "为配置监控数据");
                            return;
                        }
                        //若未校秤的话，也不允许计量

                        //载入界面业务按钮
                        if (PbCache.businessType != null && PbCache.businessType.Count > 0)
                        {
                            foreach (ComBaseInfo info in PbCache.businessType)
                            {
                                ucBusinessType uc = new ucBusinessType();
                                switch (info.baseCode)
                                {
                                    case "001006003":
                                        uc.setControl(info.baseName, info.memo, info.baseCode);
                                        break;

                                    case "001006001":
                                    case "001006002":
                                        uc.setControl(info.baseName, info.memo, info.baseCode);
                                        break;

                                    default:
                                        uc.setControl(info.baseName, info.memo, info.baseCode);
                                        break;
                                }

                                uc.Dock = DockStyle.Top;
                                //uc.setControl("","","",);
                                uc.ucEvent += new EventHandler(ucEvents);
                                lu.Add(uc);
                                //panel7.Controls.Add(uc);
                            }
                        }

                        //开启基础进程
                        l.WriteLog(0, "系统登录成功");

                        collection.EventDataCollectionArgs += new EventDataCollection(EventData);//数据采集及扫码信息
                        collection.Start(PbCache.sportInfo.baseSpotNo, PbCache.sportInfo.baseSpotName);
                        StartWriteMonitor(0);//启动更新监控表线程
                        // 数据提交线程


                        imageCurlControl.Start(); //图片上传线程
                        //新扫码线程
                        if (AppConfigCache._comPara?.Split(new char[] { ',' })?.Length == 5)
                        {
                            sweepCodeClass.StartThreadSweep(AppConfigCache._comPara); //扫码线程
                        }
                        if (AppConfigCache._comPara2?.Split(new char[] { ',' })?.Length == 5)
                        {
                            sweepCodeClass2.StartThreadSweep(AppConfigCache._comPara2); //扫码线程
                        }


                    }
                    else
                    {
                        l.WriteLog(0, "系统登录失败");
                    }
                }
                else
                {
                    l.WriteLog(0, "按IP地址找不到计量点信息，系统登录失败,ip:" + IpAddress.getIp);
                }
            }
            catch (Exception ex)
            {
                l.WriteLog(0, "系统加载失败：" + ex.Message);
            }
            //*/
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //timer1.Stop();
            try
            {
                if ( PbCache.collect?.weight > 500)
                {
                    PbCache.bussinessTypeName = "";
                    PbCache.bussinessTypeCode = "";
                    if (fcc.Visible == false)
                    {
                        fcc.Visible = true;
                        fcc.init();
                    }
                }
                timer1.Interval = 1000;
            }
            catch (Exception ee)
            {
                //GlobalInstanceController.Instance.LastCallMessage = ee.Message;
                timer1.Interval = 1000;
            }
            //timer1.Start();
        }

        /// <summary>
        /// 直接打开扫码计量界面
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //private void timer1_Tick(object sender, EventArgs e)
        //{
        //    if (!isOpened && PbCache.collect?.weight > 500)
        //    {
        //        l.WriteLog(31, "frmOneYardToEnd页面打开（timer1_Tick：frmMain），车号：" + PbCache.resultCarNo + "||" + (PbCache.collect == null ? "" : PbCache.collect.carno));
        //        isOpened = true;
        //        PbCache.bussinessTypeName = "";
        //        PbCache.bussinessTypeCode = "";

        //        try
        //        {
        //            if(fcc.Visible == false)
        //            {
        //                fcc.Visible = true;
        //                fcc.init();
        //            }
        //        }
        //        catch(Exception exp)
        //        {

        //        }
        //    }
        //}

        #region
        //*

        /// <summary>
        /// 委托的方式调用控件的点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void ucEvents(object sender, EventArgs e)
        {
            Control control = (Control)sender;
            ucBusinessType um = control.Parent.Parent as ucBusinessType;

            try
            {
                switch (control.Name)
                {
                    case "btnContext":
                    case "btnPurchase":
                        {
                            PbCache.bussinessTypeName = um._bussiness == null ? "" : um._bussiness;
                            PbCache.bussinessTypeCode = um._code;

                            switch (um._code)
                            {
                                case "001006003":
                                    frmInternalTransport frm = new frmInternalTransport();
                                    frm.ShowDialog();
                                    break;
                                /*
                                case "001006001":
                                case "001006002":
                                    frmCarSalePurchase frmCar = new frmCarSalePurchase();
                                    frmCar.ShowDialog();
                                    break;
                                //*/
                                default:
                                    frmCarSalePurchase frmCar = new frmCarSalePurchase();
                                    frmCar.ShowDialog();
                                    break;
                            }
                        };
                        break;

                    default: break;
                }
            }
            catch (Exception ex)
            {
                //MessageBox.Show("操作异常：" + ex.Message);
            }
        }

        //*/
        #endregion

        #region

        private void setThisVis(bool visb)
        {
            if (this.InvokeRequired)
            {
                Action<bool> action = new Action<bool>(setThisVis);
                Invoke(action, new object[] { visb });
            }
            else
            {
                if (this.Visible != visb)
                {
                    this.Visible = visb;
                }
            }
        }

        #endregion

        #region

        private void setWelecomeVis(bool visb)
        {
            if (!isShowFrmWelcome) return;//2021年6月21日 杨秀东添加

            if (frmWelcome.InvokeRequired)
            {
                Action<bool> action = new Action<bool>(setWelecomeVis);
                Invoke(action, new object[] { visb });
            }
            else
            {
                if (frmWelcome.Visible != visb)
                {
                    frmWelcome.Visible = visb;
                    frmWelcome.setLogin();
                }
            }
            //*/
        }

        #endregion

        private int iCount = 0, iHodeTime = 0;
        private bool flagCarMonit = false;//车号修正
        private bool bEditCar = false; //手动修正车号
        private bool isOpenMeter = false; //是否已打开计量界面，若已经打开则这里关于超量程及红外的语音将停止播报
        private string firstCode = "";//上次扫码的信息

        private string ledTxt = "";
        private bool isLedWrite = false;//是否写入一次LED

        private string sPreNo = ""; //记录重量曲线变化
        private int preWgt = 0;//前一次重量，用于重量曲线
        private string sCarNo = "";

        private int iCountPark = 0;
        private string editCarNo = "";

        private bool isResFlag = true;
        private string RFIDCarNo = "";
        private string isWriteRFID = AppConfigCache.isWriteRFID;

        private int num = 0;
        //EventData实例化
        RESTfulResult<string> rmsEventDataLastTime = new RESTfulResult<string>();
        RESTfulResult<List<MeterWorkMonitor>> rmUpdateEventDataMonitor = new RESTfulResult<List<MeterWorkMonitor>>();
        MeterWorkMonitor updateEventDataMonitor = new MeterWorkMonitor();
        MeterMonitorWeight meterMonitorWeightEventData1 = new MeterMonitorWeight();
        MeterMonitorWeight meterMonitorWeightEventData2 = new MeterMonitorWeight();
        MeterWorkMonitor mwUpdate = new MeterWorkMonitor();
        PbModelDbService<List<PbModelDb>> pbpRFIDEventData = new PbModelDbService<List<PbModelDb>>();
        RESTfulResult<List<PbModelDb>> rmTRFIDEventData = new RESTfulResult<List<PbModelDb>>();
        RESTfulResult<string> rmsmwUpdateEventData = new RESTfulResult<string>();
        MeterWorkScheduledHelp meterWorkScheduledHelp1 = new MeterWorkScheduledHelp();
        MeterWorkScheduledHelp meterWorkScheduledHelpRFID = new MeterWorkScheduledHelp();
        RESTfulResult<string> rmsdoUpdateWfEventData = new RESTfulResult<string>();
        RESTfulResult<string> rmssEventData = new RESTfulResult<string>();
        MeterWorkMonitor meterWorkMonitorEventDataI = new MeterWorkMonitor();
        MeterWorkCarActualFirstService mwcfs = new MeterWorkCarActualFirstService();
        RESTfulResult<string> rmsSweepCodeClass = new RESTfulResult<string>();
        frmOneYardToEnd frmOneYardToEnd = new frmOneYardToEnd();
        /// <summary>
        /// 数据采集
        /// </summary>
        /// <param name="o"></param>
        /// <param name="e"></param>
        private void EventData(object o, DataCollectionArgs e)
        {
            if (!timer1.Enabled)
            {
                timer1.Enabled = true;
                //l.WriteLog(32, "定时器重启（timer1_Tick：frmMain）,车号：" + PbCache.resultCarNo + "||" + (PbCache.collect == null ? "" : PbCache.collect.carno));
            }
            #region
            //num++;

            //e.carno = "湘G88888";

            //if (num < 20)
            //{
            //    e.weight = 23580;
            //    e.weightStatus = 1;
            //}
            //else if (num < 26)
            //{
            //    e.weight = 23580;
            //    e.weightStatus = 0;
            //}
            //else if (num < 39)
            //{
            //    e.weight = 23580;
            //    e.weightStatus = 0;
            //}
            //else if (num < 45)
            //{
            //    e.weight = 15000;
            //    e.weightStatus = 1;
            //}
            //else
            //{
            //    e.weight = 400;
            //}
            #endregion


            //这里每隔0.5秒执行一次
            try
            {
                if (e.carno == "nown")
                {
                    e.carno = "";
                }
                #region 扫码信息
                //if (string.IsNullOrEmpty(sweepCodeClass.StrCode))
                //{
                //    if (string.IsNullOrEmpty(PbCache.strCode))
                //    {
                //        codeFlag = false;
                //        firstCode = "";
                //        PbCache.strCode = "";
                //        l.WriteLog(12, "主线程扫码值为空时清空；sweepCodeClass.StrCode值为" + sweepCodeClass.StrCode + " ；PbCache.strCode值为：" + PbCache.strCode);
                //    }
                //}
                //else
                //{
                //    codeFlag = true;
                //    frmOneYardToEnd frmOneYardToEnd = new frmOneYardToEnd();
                //    Hashtable hashTable = new Hashtable();
                //    hashTable.Add("message", sweepCodeClass.StrCode);
                //    rmsSweepCodeClass = mwcfs.DecryptionForWfTest(hashTable);
                //    if (rmsSweepCodeClass.Code == "0")
                //    {
                //        PbCache.collect.carno = rmsSweepCodeClass.Data;
                //        PbCache.strCode = rmsSweepCodeClass.Data;
                //    }
                //    if (rmsSweepCodeClass.Code == "1")
                //    {
                //        vicPlayClass.GetVoicePlay("车号二维码已过期", PbCache.collect.carno);
                //        frmOneYardToEnd.setMsgInfo("车号二维码已过期");
                //    }
                //    if (rmsSweepCodeClass.Code == "2")
                //    {
                //        vicPlayClass.GetVoicePlay("不是有效车号二维码", PbCache.collect.carno);
                //        frmOneYardToEnd.setMsgInfo("不是有效车号二维码");
                //    }
                //    if (rmsSweepCodeClass.Code == "9")
                //    {
                //        vicPlayClass.GetVoicePlay("不是有效车号二维码", PbCache.collect.carno);
                //        frmOneYardToEnd.setMsgInfo("不是有效车号二维码");
                //    }
                //    l.WriteLog(12, "测试扫码值" + rmsSweepCodeClass.Data);
                //}

                // 司机扫码为空，取工控机二维码
                if (string.IsNullOrEmpty(sweepCodeClass2.StrCode))
                {
                    if (string.IsNullOrEmpty(sweepCodeClass.StrCode))
                    {
                        if (string.IsNullOrEmpty(PbCache.strCode))
                        {
                            codeFlag = false;
                            firstCode = "";
                            PbCache.strCode = "";
                            l.WriteLog(12, "主线程扫码值为空时清空；sweepCodeClass.StrCode值为" + sweepCodeClass.StrCode + " ；PbCache.strCode值为：" + PbCache.strCode);
                        }
                    }
                    else
                    {
                        DecodeQRCode(sweepCodeClass.StrCode);
                    }
                }
                else
                {
                    DecodeQRCode(sweepCodeClass2.StrCode);
                }
                #endregion

                #region 秤上无车10分钟获取一次基础数据
                if (iCount < 1200)
                {
                    iCount++;
                }
                else
                {
                    try
                    {
                        //秤上没有车时，每隔10分钟获取一次基础数据
                        if (e.weight < 500)
                        {
                            if (bd.setBaseDb())
                            {
                                l.WriteLog(0, "十分钟获取基础数据成功");
                            }
                            else
                            {
                                l.WriteLog(0, "十分钟获取基础数据失败");
                            }
                            iCount = 0;
                        }
                    }
                    catch (Exception ex)
                    {
                        l.WriteLog(0, "十分钟获取基础数据失败：" + ex.Message);
                        iCount = 0;
                    }
                }
                #endregion

                #region 每10秒写入一次当前时间
                if (iCount % 20 == 0)
                {
                    //更新在线时间
                    rmsEventDataLastTime = meterWorkMonitor.doUpdateWfBySpotNo(new MeterWorkMonitor { pointNo = PbCache.sportInfo.baseSpotNo});
                    if (!rmsEventDataLastTime.Succeed)
                    {
                        l.WriteLog(0, "frmMain.EventData异常：写入时间异常，原因：" + rmsEventDataLastTime.ResultMessage);
                    }
                }
                #endregion

                #region
                //一旦界面锁定则不采集数据
                if (!PbCache.isLockFrm)
                {
                    PbCache.collect.pointid = PbCache.sportInfo.baseSpotNo;
                    PbCache.collect.weight = e.weight;
                    PbCache.collect.weightStatus = e.weightStatus;
                    PbCache.collect.parkStatus = e.parkStatus;
                    PbCache.collect.datetime = e.datetime;
                    PbCache.collect.licType = e.licType;
                }

                if (PbCache.collect != null && PbCache.collect.weightStatus == 0)
                {
                    if (string.IsNullOrEmpty(PbCache.resultWgt))
                    {
                        PbCache.resultWgt = e.weight + "";
                    }
                    if (!string.IsNullOrEmpty(PbCache.resultWgt) && e.weight > Convert.ToInt32(PbCache.resultWgt))
                    {
                        PbCache.resultWgt = e.weight + "";
                    }
                    if (!string.IsNullOrEmpty(e.carno) && PbCache.resultCarNo != e.carno)
                    {
                        PbCache.resultCarNo = e.carno + "";
                        //l.WriteLog(28, "车号賦值跟蹤:PbCache.resultCarNo" + PbCache.resultCarNo + "||e.carno" + e.carno);
                    }
                }
                //*/

                // 更新监控表
                //doLive();

                //重量大于500的情况下
                if (e.weight > 500)
                {
                    isResFlag = true;

                    if (PbCache.dtStartTime == null)
                        PbCache.dtStartTime = DateTime.Now;
                    isLedWrite = true;
                    PbCache.strState = "0";

                    #region 车上人员请下车
                    try
                    {
                        //界面未锁定的情况下，有车号，如果重量稳定了,停车线验证通过，未超量程的情况下，则按钮可用
                        if (PbCache.collect != null && !string.IsNullOrEmpty(PbCache.collect.carno) && PbCache.collect.weightStatus == 0 && PbCache.monitorResult.valid_park_status && PbCache.collect.weight < PbCache.range.upperRange)
                        {
                            if (!isVoiceDownCar)
                            {
                                isVoiceDownCar = true;
                                vicPlayClass.GetVoicePlay("车上人员请下车", PbCache.collect.carno);
                            }
                        }
                    }
                    catch { }
                    #endregion

                    setWelecomeVis(false);

                    //每隔1秒刷一次计量实时监控表数据值
                    if (iCount % 2 == 0)
                    {
                        //调用该方法时已赋值
                        updateEventDataMonitor.validFlag = "1";
                        updateEventDataMonitor.pointNo = PbCache.sportInfo.baseSpotNo;
                        rmUpdateEventDataMonitor = meterWorkMonitor.doQueryOneWf(updateEventDataMonitor);
                        if (!rmUpdateEventDataMonitor.Succeed)
                        {
                            l.WriteLog(0, "frmMain.EventData异常419：" + rmUpdateEventDataMonitor.ResultMessage);
                        }
                        else
                        {
                            if (rmUpdateEventDataMonitor.Data != null && rmUpdateEventDataMonitor.Data.Count > 0)
                            {
                                PbCache.monitor = rmUpdateEventDataMonitor.Data[0];

                                if (string.IsNullOrEmpty(PbCache.collect_no))
                                {
                                    PbCache.collect_no = rmUpdateEventDataMonitor.Data[0].collectionCode;
                                }

                                if (ledTxt != rmUpdateEventDataMonitor.Data[0].ledWriter && rmUpdateEventDataMonitor.Data[0].ledWriter != "")
                                {
                                    //调用LED信息写入******************************
                                    ledTxt = rmUpdateEventDataMonitor.Data[0].ledWriter;
                                }

                                if (string.IsNullOrEmpty(ledTxt))
                                {
                                    ledTxt = "欢迎使用酒钢汽车衡智能计量系统！";
                                }
                            }
                        }

                        #region 2021-03-29
                        #region 摄像头当前采集的车号与上次采集的不一样且当前未勾选不验证，且当前车号未进行手动修正的情况下
                        if (preCarNo != e.carno && PbCache.monitor != null && PbCache.monitor.validCarno != "0" && !bEditCar)
                        {
                            flagCarMonit = false;
                        }
                        preCarNo = e.carno;
                        #endregion

                        if (!flagCarMonit)
                        {
                            sCarNo = e.carno;
                        }

                        //*
                        //有车号，且重量稳定的情况下，只修正一次车号
                        if (!string.IsNullOrEmpty(e.carno) && e.weightStatus == 0 && !flagCarMonit && PbCache.monitor != null && PbCache.monitor.carMonitor == "1" && PbCache.monitor.carMonitorLvl > 0)
                        {
                            flagCarMonit = true;
                            string methods = "";
                            for (int i = 0; i <= PbCache.monitor.carMonitorLvl; i++)
                            {
                                methods += "CarNoTrustCorrect" + i + ",";
                            }
                            editCarNo = modfiy.CarNoCorrect(e.carno, methods.Substring(0, methods.Length - 1));
                            sCarNo = editCarNo;
                            //mwUpdate
                        }

                        //勾选了不验证车号的情况
                        if (PbCache.monitor.validCarno == "0")
                        {
                            flagCarMonit = true;
                        }
                        #endregion

                        #region 每隔1秒写入一次重量曲线
                        try
                        {
                            if (preWgt != e.weight)
                            {
                                preWgt = e.weight;
                                sPreNo = PbCache.sportInfo.baseSpotNo + DateTime.Now.ToString("yyyyMMddHHmmssfff");
                                meterMonitorWeightEventData1.weightNo = sPreNo;
                                meterMonitorWeightEventData1.baseSpotNo = PbCache.sportInfo.baseSpotNo;
                                meterMonitorWeightEventData1.baseSpotName = PbCache.sportInfo.baseSpotName;
                                meterMonitorWeightEventData1.collectWeight = e.weight + "";
                                meterMonitorWeightEventData1.collectStartTime = PbCache.dtStartTime.Value;
                                meterMonitorWeightEventData1.collectEndTime = DateTime.Now;
                                meterMonitorWeightEventData1.spotTypeNo = "001002001";
                                meterMonitorWeightEventData1.spotTypeName = "汽车衡";
                                meterMonitorWeightEventData1.actualFirstNo = PbCache.actualFirstNo;
                                monitorWeightService.doAddWf(meterMonitorWeightEventData1);
                            }
                            else
                            {
                                if (!string.IsNullOrEmpty(sPreNo))
                                {
                                    meterMonitorWeightEventData2.weightNo = sPreNo;
                                    meterMonitorWeightEventData2.collectEndTime = DateTime.Now;
                                    monitorWeightService.doUpdateWf(meterMonitorWeightEventData2);
                                }
                            }
                        }
                        catch { }
                        #endregion

                        #region 停留超时
                        iHodeTime++;
                        mwUpdate.pointNo = PbCache.sportInfo.baseSpotNo;
                        mwUpdate.editCar = editCarNo;

                        if (PbCache.holdTime != null && PbCache.holdTime.Count > 0)
                        {
                            if (PbCache.holdTime[0].retentionTime != null)
                            {
                                if (PbCache.holdTime[0].retentionTime.Value < iHodeTime)
                                {
                                    l.WriteLog(33, "iHodeTime："+ iHodeTime + ",PbCache.holdTime[0].retentionTime.Value:"+ PbCache.holdTime[0].retentionTime.Value + ",mwUpdate.stopOverTime:"+ mwUpdate.stopOverTime);
                                    PbCache.isOvertimeAlarm = true; //是否超时报警
                                    mwUpdate.stopOverTime = "1"; //写入一次停留超时
                                    //mwUpdate.isHelp = "1";//派位
                                    //mwUpdate.isTakeOver = "1";
                                    iHodeTime = 99999;//不再增长避免超出
                                }
                            }
                        }
                        #endregion

                        #region RFID识别车号信息
                        mwUpdate.rfidCar = "";
                        mwUpdate.photoCar = e.vdioCarNos;
                        mwUpdate.scanCar = "";
                        if (codeFlag)
                        {
                            mwUpdate.scanCar = PbCache.collect.carno;
                        }
                        //mwUpdate.photoCar = PbCache.collect.carno;
                        if (!string.IsNullOrEmpty(e.RfidNos))
                        {
                            string sqls = @"SELECT RFID_ID id,CAR_NO text FROM METER_BASE_RFID_INFO where RFID_CODE = '" + e.RfidNos + "'";

                            rmTRFIDEventData = pbpRFIDEventData.executeSqlDataWf(sqls);
                            if (rmTRFIDEventData.Data == null || rmTRFIDEventData.Data.Count == 0)
                            { }
                            else
                            {
                                mwUpdate.rfidCar = rmTRFIDEventData.Data[0].text;
                                sCarNo = rmTRFIDEventData.Data[0].text;
                                RFIDCarNo = rmTRFIDEventData.Data[0].text;
                            }
                        }
                        #endregion

                        #region 计量员修改的车号信息
                        if (PbCache.monitor != null && !string.IsNullOrEmpty(PbCache.monitor.setCar))
                        {
                            sCarNo = PbCache.monitor.setCar;
                            bEditCar = true;
                            flagCarMonit = true;
                            codeFlag = false;
                            sweepCodeClass.StrCode = "";
                            sweepCodeClass2.StrCode = "";
                        }
                        #endregion

                        #region 重量信息
                        if (!PbCache.isLockFrm)
                        {
                            mwUpdate.wgt = e.weight;
                        }
                        else
                        {
                            mwUpdate.wgt = Convert.ToInt32(PbCache.lockWgt);
                        }
                        #endregion

                        #region 写入一次监控表，将重量/车号停留超时等信息写入
                        mwUpdate.msgInfo = PbCache.ResultMessage;
                        mwUpdate.weightStatus = PbCache.collect.weightStatus;
                        //另外初始化一次监控数据
                        rmsmwUpdateEventData = meterWorkMonitor.doUpdateWf(mwUpdate);
                        if (!rmsmwUpdateEventData.Succeed)
                        {
                            l.WriteLog(0, "frmMain.EventData异常583：写入信息异常" + mwUpdate);
                        }
                        #endregion

                        //验证对射
                        valid.ValidMethod();

                        if (!isOpenMeter)
                        {
                            //if (PbCache.range != null && PbCache.range.upperRange < e.weight)
                            if (PbCache.range != null && PbCache.range.upperRange < e.weight)
                            {
                                //超量程
                                vicPlayClass.GetVoicePlay("已超量程", e.carno);
                                //return;
                            }
                            else if (e.weightStatus == 0)
                            {
                                if (!PbCache.monitorResult.valid_park_status)
                                {
                                    iCountPark++;
                                    if (iCountPark > 9)
                                    {
                                        PbCache.ResultMessage = "车辆超出秤台，请调整车位"; //btnSave_Click
                                        //重量稳定，且对射验证不合格
                                        vicPlayClass.GetVoicePlay("车辆超出秤台，请调整车位", e.carno);
                                        led_controler.setStaticLineMsg(PbCache.sportInfo.ledIp, "车辆超出秤台，请调整车位");
                                        //return;
                                        iCountPark = 0; //2021年7月27日5s播一次，然后重新在播
                                    }
                                }
                                else
                                {
                                    iCountPark = 0;
                                }
                            }
                        }

                        if (!lu[0].bcEnable)
                        {
                            foreach (ucBusinessType uc in lu)
                            {
                                uc.setControlEnable(true);
                            }
                        }

                        if ((sweepCodeClass.StrCode == "" || sweepCodeClass2.StrCode == "") && !codeFlag)
                        {
                            PbCache.collect.carno = sCarNo;
                        }

                        if (codeFlag)
                        {
                            meterWorkScheduledHelp1.baseSpotNo = PbCache.sportInfo.baseSpotNo;
                            meterWorkScheduledHelp1.baseSpotName = PbCache.sportInfo.baseSpotName;
                            meterWorkScheduledHelp1.carNo = string.IsNullOrEmpty(PbCache.collect.carno) ? PbCache.resultCarNo : PbCache.collect.carno;
                            meterWorkScheduledHelp1.helpContent = "车号：" + sCarNo + "扫码过秤";
                            meterWorkScheduledHelp1.warmType = "2";
                            meterWorkScheduledHelp1.warmTypeName = "智能终端报警";
                            meterWorkScheduledHelpService.add(meterWorkScheduledHelp1);
                        }
                    }

                    //写入LED信息
                    //if (PbCache.sportInfo != null && PbCache.ledInfo != PbCache.OldLedInfo)
                    //{
                    //    PbCache.OldLedInfo = PbCache.ledInfo;
                    //    if (PbCache.monitor != null && PbCache.monitor.ledKeep == "0")
                    //    {
                    //        //led_controler.setOneLineMsg(PbCache.sportInfo.ledIp, PbCache.ledInfo);
                    //    }
                    //}
                }
                else
                {
                    isOpened = false; //下次上秤直接打开主界面

                    if (e.weight > 10 && e.weight < 500)
                    {
                        //重量小于500，大于10
                        MeterWorkMonitor mwUpdate = new MeterWorkMonitor();
                        mwUpdate.pointNo = PbCache.sportInfo.baseSpotNo;
                        mwUpdate.wgt = e.weight;
                        rmsdoUpdateWfEventData = meterWorkMonitor.doUpdateWf(mwUpdate);
                    }
                    if (e.weight > 0 && e.weight < 200)
                    {
                        doOperateLive();
                    }
                    if (e.weight == 0)
                    {
                        PbCache.isZeroAlarm = false;
                    }
                    editCarNo = "";
                    firstCode = ""; //历史的扫码枪的值
                    preCarNo = "";
                    sCarNo = "";
                    sPreNo = "";
                    preWgt = 0;

                    //不等于空的时候说明写过一次日志了
                    if (isResFlag)
                    {
                        isResFlag = false;
                        meterWorkScheduledHelp1.baseSpotNo = PbCache.sportInfo.baseSpotNo;
                        meterWorkScheduledHelp1.baseSpotName = PbCache.sportInfo.baseSpotName;
                        meterWorkScheduledHelp1.carNo = string.IsNullOrEmpty(PbCache.collect.carno) ? PbCache.resultCarNo : PbCache.collect.carno;
                        meterWorkScheduledHelp1.helpContent = "车号:" + (string.IsNullOrEmpty(PbCache.collect.carno) ? (string.IsNullOrEmpty(PbCache.resultCarNo) ? "未识别" : PbCache.resultCarNo) : PbCache.collect.carno) + "；重量：" + (PbCache.lockWgt == 0 ? PbCache.resultWgt : PbCache.lockWgt + "") + "；提示信息：" + PbCache.resultMsgAll;
                        meterWorkScheduledHelp1.warmType = "5";
                        meterWorkScheduledHelp1.warmTypeName = "计量提示跟踪";
                        meterWorkScheduledHelpService.add(meterWorkScheduledHelp1);
                        //l.WriteLog(28, "车号:" + (string.IsNullOrEmpty(PbCache.collect.carno) ? (string.IsNullOrEmpty(PbCache.resultCarNo) ? "未识别" : PbCache.resultCarNo) : PbCache.collect.carno) + "；重量：" + (PbCache.lockWgt == 0 ? PbCache.resultWgt : PbCache.lockWgt + "") + "；提示信息：" + PbCache.resultMsgAll);
                    }
                    //不等于空的时候说明写过一次日志了
                    if (!string.IsNullOrEmpty(RFIDCarNo) && isWriteRFID == "1")
                    {
                        meterWorkScheduledHelp1.baseSpotNo = PbCache.sportInfo.baseSpotNo;
                        meterWorkScheduledHelp1.baseSpotName = PbCache.sportInfo.baseSpotName;
                        meterWorkScheduledHelp1.carNo = string.IsNullOrEmpty(PbCache.collect.carno) ? PbCache.resultCarNo : PbCache.collect.carno;
                        meterWorkScheduledHelp1.helpContent = RFIDCarNo;
                        meterWorkScheduledHelp1.warmType = "7";
                        meterWorkScheduledHelp1.warmTypeName = "RFID识别率";
                        meterWorkScheduledHelpService.add(meterWorkScheduledHelp1);
                        RFIDCarNo = "";
                    }

                    PbCache.isOvertimeAlarm = false; //是否超时报警
                    PbCache.strCode = "";
                    PbCache.strState = "";
                    PbCache.ResultMessage = "";
                    PbCache.resultMsgAll = "";
                    PbCache.resultCarNo = "";
                    PbCache.resultWgt = "";
                    bEditCar = false;
                    isVoiceDownCar = false;
                    flagCarMonit = false;
                    iHodeTime = 0;

                    isOpenMeter = false;
                    PbCache.isLockFrm = false;
                    PbCache.dtStartTime = null;
                    PbCache.voiceOver = true;
                    if (PbCache.collect != null && !string.IsNullOrEmpty(PbCache.collect.carno))
                    {
                        PbCache.collect.carno = "";
                    }

                    setWelecomeVis(true);
                    if (lu[0].bcEnable)
                    {
                        foreach (ucBusinessType uc in lu)
                        {
                            uc.setControlEnable(false);
                        }
                    }
                    
                    meterWorkMonitorEventDataI.pointNo = PbCache.sportInfo.baseSpotNo;
                    meterWorkMonitorEventDataI.validWgt = "1";
                    meterWorkMonitorEventDataI.validCarno = "1";
                    meterWorkMonitorEventDataI.validTareTime = "1";
                    meterWorkMonitorEventDataI.validMatTime = "1";
                    meterWorkMonitorEventDataI.validTimeInterval = "1";
                    meterWorkMonitorEventDataI.validParkStatus = "1";
                    meterWorkMonitorEventDataI.validExceedWgt = "1";
                    meterWorkMonitorEventDataI.validPredictionDiff = "1";
                    meterWorkMonitorEventDataI.validLianda = "1";
                    meterWorkMonitorEventDataI.validMatClick = "1";
                    meterWorkMonitorEventDataI.setCar = "";
                    meterWorkMonitorEventDataI.rfidCar = "";
                    meterWorkMonitorEventDataI.photoCar = "";
                    meterWorkMonitorEventDataI.scanCar = "";
                    meterWorkMonitorEventDataI.editCar = "";
                    meterWorkMonitorEventDataI.zeroState = "0";
                    meterWorkMonitorEventDataI.carErr = "0";
                    meterWorkMonitorEventDataI.ferroalloyResult = "0";
                    meterWorkMonitorEventDataI.wgtErr = "0";
                    meterWorkMonitorEventDataI.stopOverTime = "0";
                    meterWorkMonitorEventDataI.msgInfo = "";
                    meterWorkMonitorEventDataI.ledWriter = "";
                    meterWorkMonitorEventDataI.isOverWgt = "";
                    meterWorkMonitorEventDataI.isHelp = "0";
                    meterWorkMonitorEventDataI.wgt = e.weight;
                    //*
                    //另外初始化一次监控数据
                    RESTfulResult<string> rmssEventData = meterWorkMonitor.doUpdateWf(meterWorkMonitorEventDataI);
                    if (!rmssEventData.Succeed)
                    {
                        l.WriteLog(0, "frmMain.EventData异常754：写入信息异常");
                    }
                    //*/
                    //LED写入
                    if (isLedWrite)
                    {
                        isLedWrite = false;
                    }
                }

                #endregion
            }
            catch (Exception ex)
            {
                l.WriteLog(0, "frmMain.EventData异常：" + ex.Message);
            }
        }

        private delegate void ShowBtnTare(bool flag);//定义委托  期限皮重按钮


        List<LiveData> lldoOperateLive = new List<LiveData>();
        /// <summary>
        /// 操作Live表的数据：零点报警
        /// </summary>
        private void doOperateLive () {
            if (PbCache.collect_no==null)
            {
                return;
            }
            lldoOperateLive = MemoClass.getWarnInfo(PbCache.collect_no);
            if (lldoOperateLive != null)
            {
                foreach (LiveData lv in lldoOperateLive)
                {
                    switch (lv.Tagname.Replace(PbCache.collect_no, ""))
                    {
                        case "StaticStatus"://车辆检测	"0、东西方向激光均无报警；否则报警

                            break;
                        case "SwitchLight"://PLC红绿灯控制模式状态	"PLC有三种控制模式：1、自动、2、远控；3、检修

                            break;
                        case "LightWest"://红绿灯：1、为绿灯；2、为红灯；"

                            break;
                        case "ZeroWeightStatus": //0、其它，1、零点报警，红绿灯变红，
                            if (((lv.Value ?? "0") + "").Equals("1"))
                            {
                                doInsertZeroAlarm();
                                PbCache.isZeroAlarm = true;
                            }
                            else 
                            {
                                PbCache.isZeroAlarm = false;
                            }
                            break;
                        case "ZeroWeight":
                            mwmdoLive.zeroWeight = lv.Value.ToString();
                            break;
                    }
                }
            }
        }

        List<LiveData> lldoLive = new List<LiveData>();
        RESTfulResult<string> rmsdoLive = new RESTfulResult<string>();
        MeterWorkMonitor mwmdoLive = new MeterWorkMonitor();
        /// <summary>
        /// 操作Live表的数据：零点报警
        /// </summary>
        private void doLive()
        {

            if (PbCache.collect_no == null)
            {
                return;
            }
            lldoLive = MemoClass.getWarnInfo(PbCache.collect_no);
            mwmdoLive.pointNo = PbCache.sportInfo.baseSpotNo;
            mwmdoLive.redGreenLightState = "0";
            if (lldoLive != null)
            {
                foreach (LiveData lv in lldoLive)
                {
                    switch (lv.Tagname.Replace(PbCache.collect_no, ""))
                    {
                        case "PowerStatus":
                            mwmdoLive.powerState = lv.Value.ToString();
                            break;
                        case "PlcWatchDog":
                            if (int.Parse(lv.Value.ToString()) >= 0 && int.Parse(lv.Value.ToString()) <= 0)
                            {
                                mwmdoLive.plcState = 0.ToString();
                            }
                            break;
                        case "InfraredWest":
                            if (lv.Value.ToString() == "2")
                            {
                                mwmdoLive.leftInfraredRayState = "0";
                            }
                            else
                            {
                                mwmdoLive.leftInfraredRayState = lv.Value.ToString();
                            }
                            break;
                        case "InfraredEast":
                            if (lv.Value.ToString() == "2")
                            {
                                mwmdoLive.rightInfraredRayState = "0";
                            }
                            else
                            {
                                mwmdoLive.rightInfraredRayState = lv.Value.ToString();
                            }
                            break;
                        case "AmplifierState":
                            mwmdoLive.amplifierState = lv.Value.ToString();
                            break;
                        case "Lamp":
                            if (lv.Value.ToString() == "2")
                            {
                                mwmdoLive.lampState = "0";
                            }
                            else
                            {
                                mwmdoLive.lampState = lv.Value.ToString();
                            }
                            break;
                        case "InfraredLeft":
                            if (lv.Value.ToString() == "2")
                            {
                                mwmdoLive.frontInfraredRayState = "0";
                                PbCache.monitorResult.valid_frontInfraredRay_right_status = false;
                            }
                            else
                            {
                                mwmdoLive.frontInfraredRayState = lv.Value.ToString();
                                PbCache.monitorResult.valid_frontInfraredRay_right_status = true;
                            }
                            break;
                        case "InfraredRight":
                            if (lv.Value.ToString() == "2")
                            {
                                mwmdoLive.rearInfraredRayState = "0";
                                PbCache.monitorResult.valid_frontInfraredRay_left_status = false;
                            }
                            else
                            {
                                mwmdoLive.rearInfraredRayState = lv.Value.ToString();
                                PbCache.monitorResult.valid_frontInfraredRay_left_status = true;
                            }
                            break;
                        case "RfidState":
                            mwmdoLive.rfidState = lv.Value.ToString();
                            break;
                        case "ZeroWeightStatus":
                            mwmdoLive.zeroState = lv.Value.ToString();
                            if (((lv.Value ?? "0") + "").Equals("1"))
                            {
                                doInsertZeroAlarm();
                                PbCache.isZeroAlarm = true;
                            }
                            else
                            {
                                PbCache.isZeroAlarm = false;
                            }
                            break;
                        case "ZeroWeight":
                            mwmdoLive.zeroWeight = lv.Value.ToString();
                            break;
                    }
                }
            }
            rmsdoLive = meterWorkMonitor.doUpdateWf(mwmdoLive);
        }

        MeterWorkZeroAlarm workZeroAlarmdoInsertZeroAlarm = new MeterWorkZeroAlarm();
        RESTfulResult<String> rmsworkZeroAlarmdoInsertZeroAlarm = new RESTfulResult<string>();
        /// <summary>
        /// 新增零点报警的数据
        /// </summary>
        private void doInsertZeroAlarm()
        {
            if (!PbCache.isZeroAlarm)
            {
                PbCache.isZeroAlarm = true;
                workZeroAlarmdoInsertZeroAlarm.zeroWeight = PbCache.collect.weight;
                workZeroAlarmdoInsertZeroAlarm.spotTypeNo = PbCache.sportInfo.spotTypeNo;
                workZeroAlarmdoInsertZeroAlarm.spotTypeName = PbCache.sportInfo.spotTypeName;
                workZeroAlarmdoInsertZeroAlarm.baseSpotNo = PbCache.sportInfo.baseSpotNo;
                workZeroAlarmdoInsertZeroAlarm.baseSpotName = PbCache.sportInfo.baseSpotName;
                workZeroAlarmdoInsertZeroAlarm.scalePointNo = PbCache.collect_no;
                workZeroAlarmdoInsertZeroAlarm.createManNo = PbCache.sportInfo.baseSpotNo;
                workZeroAlarmdoInsertZeroAlarm.createManName = PbCache.sportInfo.baseSpotName;
                rmsworkZeroAlarmdoInsertZeroAlarm = zeroAlarmService.doInsertZeroAlarm(workZeroAlarmdoInsertZeroAlarm);
                if (rmsworkZeroAlarmdoInsertZeroAlarm.Succeed)
                {
                    l.WriteLog(20, "新增成功：" + workZeroAlarmdoInsertZeroAlarm.baseSpotName +"："+ workZeroAlarmdoInsertZeroAlarm.zeroWeight);
                }
                else
                {
                    l.WriteLog(20, "操作失败：" + workZeroAlarmdoInsertZeroAlarm.baseSpotName + "：" + workZeroAlarmdoInsertZeroAlarm.zeroWeight + rmsworkZeroAlarmdoInsertZeroAlarm.Data + rmsworkZeroAlarmdoInsertZeroAlarm.Message);
                }
            }
        }

        /// <summary>
        /// 关闭程序
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            StopWriteMonitor();//结束更新监控表线程
            collection.Stop();
            imageCurlControl.Stop();
            sweepCodeClass.CloseThread();
            sweepCodeClass2.CloseThread();
            timer1.Stop();
            timer1.Dispose();
        }

        private bool SystemUpdate(bool isMessage)
        {
            ReleaseList releaseList = new ReleaseList(Application.StartupPath + @"\" + GlobalVariable.Instance.ReleaseFileName);
            DownloadTools dt = new DownloadTools();
            try
            {
                bool isDownload = dt.IsDownloadFile(GlobalVariable.Instance.LocalPath, GlobalVariable.Instance.ReleaseURL, GlobalVariable.Instance.ReleaseFileName);
                if (!isDownload)
                {
                    if (isMessage) MessageBox.Show("无法连接到远程主机！", Application.ProductName);
                    return false;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }

            bool flag = this.CheckUpdate(releaseList);

            if (flag)
            {
                MessageBox.Show("有新版本，现在更新");
                string t = dt.DownloadFile(Application.StartupPath, GlobalVariable.Instance.ReleaseURL, GlobalVariable.Instance.ApplicationUpdater);
                this.Close();
                Application.Exit();
                GC.Collect();
                Process.Start(Application.StartupPath + @"\" + GlobalVariable.Instance.ApplicationUpdater);
                return true;
            }
            else
            {
                if (isMessage) MessageBox.Show("你的系统已经是最新版本，不需要更新!", Application.ProductName);
                return false;
            }
        }

        private bool CheckUpdate(ReleaseList localRelease)
        {
            try
            {
                string fileNameAll = Application.StartupPath + "\\" + GlobalVariable.Instance.LocalPath + "\\" + GlobalVariable.Instance.ReleaseFileName;
                ReleaseList remoteRelease = new ReleaseList(fileNameAll);
                return (((localRelease != null) && (remoteRelease != null)) && localRelease.ReleaseDate.CompareTo(remoteRelease.ReleaseDate) < 0);
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message);
            }
            return false;
        }


        private void DecodeQRCode(string strCode)
        {
            codeFlag = true;
            //frmOneYardToEnd frmOneYardToEnd = new frmOneYardToEnd();
            Hashtable hashTable = new Hashtable();
            hashTable.Add("message", strCode);
            rmsSweepCodeClass = mwcfs.DecryptionForWfTest(hashTable);
            if (rmsSweepCodeClass.Code == "0")
            {
                PbCache.collect.carno = rmsSweepCodeClass.Data;
                PbCache.strCode = rmsSweepCodeClass.Data;
            }
            if (rmsSweepCodeClass.Code == "1")
            {
                vicPlayClass.GetVoicePlay("车号二维码已过期", PbCache.collect.carno);
                frmOneYardToEnd.setMsgInfo("车号二维码已过期");
            }
            if (rmsSweepCodeClass.Code == "2")
            {
                vicPlayClass.GetVoicePlay("不是有效车号二维码", PbCache.collect.carno);
                frmOneYardToEnd.setMsgInfo("不是有效车号二维码");
            }
            if (rmsSweepCodeClass.Code == "9")
            {
                vicPlayClass.GetVoicePlay("不是有效车号二维码", PbCache.collect.carno);
                frmOneYardToEnd.setMsgInfo("不是有效车号二维码");
            }
            l.WriteLog(12, "测试扫码值" + rmsSweepCodeClass.Data);
        }

        #region 更新监控表线程
        //rxh add
        private Thread thWriteMonitor;//更新监控表线程
        private int writeMonitorInterval;//时间间隔
        private void WriteMonitorInTime()
        {
            while (true)
            {
                try
                {
                    doLive();//更新监控表！！！！！！！！！！！
                    writeMonitorInterval = 1000;
                }
                catch (Exception ee)
                {
                    //GlobalInstanceController.Instance.LastCallMessage = ee.Message;
                    writeMonitorInterval = 5000;
                }
                Thread.Sleep(writeMonitorInterval);
            }
        }
        private void StopWriteMonitor()
        {
            if (thWriteMonitor != null)
            {
                thWriteMonitor.Abort();
                thWriteMonitor = null;
            }
        }
        private void StartWriteMonitor(int interval)
        {
            writeMonitorInterval = (interval == 0 ? 1000 : interval);
            if (thWriteMonitor == null)
            {
                thWriteMonitor = new Thread(WriteMonitorInTime);
            }
            thWriteMonitor.Start();
        }
        #endregion 更新监控表线程
    }
}