schangxiang@126.com
2024-12-16 06d6ba0da4d9036bf3eeab8a7cbef8df89565606
CC/iWareCC_ASRS/FormCC.cs
@@ -1,10 +1,13 @@
using iWareCC.Common.Helper;
using Admin.NET.Application;
using iWareCC.Common.Helper;
using iWareCC.DeviceThreadFactory;
using iWareCC.Forms;
using iWareCC.RgvService;
using iWareCC.SrmService;
using iWareCC.StationService;
using iWareCC.ThreadService;
using iWareCC.ThreadService._03_BZ12_机器人码包工位_;
using iWareCC.ThreadService._04_BZ21_搬运整垛机器人_;
using iWareCC.WCF;
using iWareCommon.Common.Globle;
using iWareCommon.Utils;
@@ -17,6 +20,8 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity.Core.Metadata.Edm;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Linq.Expressions;
@@ -26,11 +31,33 @@
using System.Windows.Forms;
using XiGang.Core.Model;
using XiGang.Core.Model.ViewModels;
using static WZ.Useful.Commons.NativeMethods;
namespace iWareCC
{
    public partial class FormCC : Form
    {
        /// <summary>
        /// 全局-269位置最新扫描的板件数据(格式 包号|Upi|时间点)
        /// </summary>
        public static string Globle_269_LastPackageUpi = "";
        /// <summary>
        /// 全局-配置报警信息列表
        /// </summary>
        public static DeviceWarningOutput configDeviceWarningList = DeviceWarningHandler.GetConfigWarningList();
        /// <summary>
        /// 全局—是否可以运行执行出库模式
        /// </summary>
        public static bool IsAllowRunOutMode = false;
        /// <summary>
        /// 当前下发出库任务的包号
        /// </summary>
        public static string currHandlerPackageCodeForIssueOutboundTask = "";
        /// <summary>
        /// 1号堆垛机入库口扫码强制验证通过
        /// </summary>
@@ -148,7 +175,7 @@
            this.rBNormal.Checked = SystemValue.rBNormal_Checked = true;
            this.rbHand.Checked = SystemValue.rbHand_Checked = false;
            this.rBDebug.Checked = SystemValue.rBDebug_Checked = false;
            this.rBOnlyIn.Checked = SystemValue.rBOnlyIn_Checked = false;
            SetModelCheckBoxToSystemValue();
@@ -157,44 +184,22 @@
            startModelTipsThread.Start();
            #region 获取设备数据
            ParameterizedThreadStart parStart1 = new ParameterizedThreadStart(GetSrmInfo);
            Thread thread1 = new Thread(parStart1);
            object o1 = (int)EDevice.一号堆垛机;
            thread1.Start(o1);
            ParameterizedThreadStart parStart2 = new ParameterizedThreadStart(GetSrmInfo);
            Thread thread2 = new Thread(parStart2);
            object o2 = (int)EDevice.二号堆垛机;
            thread2.Start(o2);
            ParameterizedThreadStart parStart3 = new ParameterizedThreadStart(GetSrmInfo);
            Thread thread3 = new Thread(parStart3);
            object o3 = (int)EDevice.三号堆垛机;
            thread3.Start(o3);
            ParameterizedThreadStart parStart4 = new ParameterizedThreadStart(GetSrmInfo);
            Thread thread4 = new Thread(parStart4);
            object o4 = (int)EDevice.四号堆垛机;
            thread4.Start(o4);
            tskGetRgv1Info = new Thread(GetRgvInfo);
            tskGetRgv1Info.Start();
            var tskGetStationInfo = new Thread(GetStationInfo);
            tskGetStationInfo.Start();
            //堆垛机UI赋值
            SetSrmUI();
            var _GetStationWarningInfo = new Thread(GetStationWarningInfo);
            _GetStationWarningInfo.Start();
            tskSetSrmLable = new Thread(SrmRead_Label);
            tskSetSrmLable.Start();
            #endregion
            #region 设置显示UI
            tskSetSrmLable = new Thread(SrmRead_Label);
            tskSetSrmLable.Start();
            tskSetRgvLable = new Thread(SetRgvLable);
            tskSetRgvLable.Start();
            #endregion
            #region 服务线程启动
@@ -207,34 +212,45 @@
            // rgvService.StartService();
            //处理【下发中】的出库计划任务
            // new Thread(OutPlanTaskDecompose.HandlerIssuingTask).Start();
            //任务分解线程-出库
            // new Thread(MainTaskDecompose.HandlerMainTaskDecompose).Start();
            //new Thread(DataProcess_RobotBuffer_ModeChange.Handler).Start();
            //任务分解线程-组盘入库
            // new Thread(MainTaskDecompose_ZPRK.HandlerMainTaskDecompose_ZPRK).Start();
            new Thread(DataProcess_RobotBuffer_IssueOutboundTask.Handler).Start();
            //new Thread(DataProcess_RobotBuffer_AutoQiTaoOutbound.Handler).Start();
            new Thread(DataProcess_RobotBuffer_PesonOutbound.Handler).Start();
            new Thread(DataProcess_RobotBuffer_FinishTaskForOutbound.Handler).Start();
            //自动组盘任务
            new Thread(DataProcess_RobotBuffer_ForceOutbound.Handler).Start();
            new Thread(DataProcess_RobotBuffer_FinishTask.Handler).Start();
            new Thread(DataProcess_BZ01.Handler).Start();
            //重新获取发动机信息
            new Thread(DataProcess_269.Handler).Start();
            //1014库位转运到1020线程
            new Thread(DataProcess_BZ39.Handler).Start();
            new Thread(DataProcess_BZ39_IssueInboundTask.Handler).Start();
            new Thread(DataProcess_BZ12.Hander).Start();
            new Thread(DataProcess_BZ12_IssueTask.Handler).Start();
            new Thread(DataProcess_BZ12_FinishTask.Handler).Start();
            new Thread(DataProcess_BZ21.Hander).Start();
            new Thread(DataProcess_BZ21_IssueTask.Handler).Start();
            new Thread(DataProcess_BZ21_FinishTask.Handler).Start();
            new Thread(DeleteData).Start();
            new Thread(LineInSacnResult.HandlerLineInSacnResult).Start();
            new Thread(PushPackageCodeToMes.Handler).Start();
            new Thread(PushPaperCutToMes.Handler).Start();
            new Thread(DataProcess_ValidateQiTao.Handler).Start();
            //*/
            #endregion
@@ -248,17 +264,8 @@
        }
        private void FormCC_Load(object sender, EventArgs e)
        {
            dateTimePicker_Start.Value = DateTime.Now;
            dateTimePicker_End.Value = DateTime.Now;
            asc_panel_DeviceTaskList.controllInitializeSize(this.panel_DeviceTaskList);
            asc_panel_DeviceTaskList_dgvPartTask_Finished.controllInitializeSize(this.panel_DeviceTaskList_dgvPartTask_Finished);
            asc_panel_dataGridView__OutTaskList.controllInitializeSize(this.panel_dataGridView__OutTaskList);
            asc_panel_WaitPlanDetail.controllInitializeSize(this.panel_WaitPlanDetail);
            asc_panel_DeviceTaskList_dataGridView_RgvStore.controllInitializeSize(this.panel_DeviceTaskList_dataGridView_RgvStore);
            asc_panel_dg_OutTaskRetryToMes.controllInitializeSize(this.panel_dg_OutTaskRetryToMes);
            this.dgvPartTask.ReadOnly = true;
            /*
            trCancelBatchBackToStore = new Thread(CancelBatchBackToStore);
@@ -270,7 +277,6 @@
            tr_reverseSplitFinishProdOutStoreThread.Start();
            //*/
            this.SetInitPlaceValue();
            #region 对外发布WCF形式数据访问服务
            try
@@ -301,7 +307,7 @@
            }
            else
            {//正式模式 
                rgvServiceClient = new RgvServiceClient();
                stationServiceClient = new StationServiceClient();
            }
            this.lbl_IsSimulationPLC.BackColor = IsSimulationPLC ? Color.Red : Color.Green;
@@ -309,10 +315,6 @@
            //此处快速启动 调试模式,用于开发用
            //btn_Start_Click(null, null);
        }
        #region 堆垛机线程和UI处理
        /// <summary>
        /// 设置1/2号堆垛机的前端显示
@@ -327,33 +329,37 @@
                    var showNowTime = "(" + DateTimeHelper.ConvertToStringForOnlyShowTime(DateTime.Now) + ")";
                    //设置堆垛机任务下发和任务确认线程消息
                    this.lbl_Alter_Srm1Release.Text = showNowTime + SystemWarningMsg._lbl_Alert_Srm1Release;
                    this.lbl_Alert_Srm2Release.Text = showNowTime + SystemWarningMsg._lbl_Alert_Srm2Release;
                    this.lbl_Alert_Srm3Release.Text = showNowTime + SystemWarningMsg._lbl_Alert_Srm3Release;
                    this.lbl_Alert_Srm4Release.Text = showNowTime + SystemWarningMsg._lbl_Alert_Srm4Release;
                    this.lbl_Alert_DataProcess_BZ39_IssueInboundTask.Text = showNowTime + SystemWarningMsg._lbl_Alert_DataProcess_BZ39_IssueInboundTask;
                    this.lbl_Alert_DataProcess_RobotBuffer_ForceOutbound.Text = showNowTime + SystemWarningMsg._lbl_Alert_DataProcess_RobotBuffer_ForceOutbound;
                    this.lbl_Alert_DataProcess_BZ12.Text = showNowTime + SystemWarningMsg._lbl_alert_DataProcess_BZ12;
                    //设置堆垛机任务下发和任务完成确认线程消息
                    this.lbl_Alter_Srm1ReleaseFinish.Text = showNowTime + SystemWarningMsg._lbl_Alert_Srm1ReleaseFinish;
                    this.lbl_Alert_Srm2ReleaseFinish.Text = showNowTime + SystemWarningMsg._lbl_Alert_Srm2ReleaseFinish;
                    this.lbl_Alert_Srm3ReleaseFinish.Text = showNowTime + SystemWarningMsg._lbl_Alert_Srm3ReleaseFinish;
                    this.lbl_Alert_Srm4ReleaseFinish.Text = showNowTime + SystemWarningMsg._lbl_Alert_Srm4ReleaseFinish;
                    this.lbl_Alert_RgvRelease.Text = showNowTime + SystemWarningMsg._lbl_Alert_RgvRelease;
                    this.lbl_Alert_RgvReleaseFinish.Text = showNowTime + SystemWarningMsg._lbl_Alert_RgvReleaseFinish;
                    this.lbl_Alert_RgvReleaseFinish_BuChang.Text = showNowTime + SystemWarningMsg._lbl_Alert_RgvReleaseFinish_BuChang;
                    this.lbl_Alert_DataProcess_BZ12_FinishTask.Text = showNowTime + SystemWarningMsg._lbl_Alert_DataProcess_BZ12_FinishTask;
                    this.lbl_Alert_DataProcess_BZ21_FinishTask.Text = showNowTime + SystemWarningMsg._lbl_Alert_DataProcess_BZ21_FinishTask;
                    this.lbl_Alert_HandlerIssuingTask.Text = showNowTime + SystemWarningMsg._lbl_Alert_HandlerIssuingTask;
                    this.lbl_Alert_PushPaperCutToMes.Text = showNowTime + SystemWarningMsg._lbl_Alert_PushPaperCutToMes;
                    this.lbl_Alert_PushPackageCodeToMes.Text = showNowTime + SystemWarningMsg._lbl_Alert_PushPackageCodeToMes;
                    this.lbl_Alert_DataProcess_BZ12_IssueTask.Text = showNowTime + SystemWarningMsg._lbl_Alert_DataProcess_BZ12_IssueTask;
                    this.lbl_DataProcess_ValidateQiTao.Text = showNowTime + SystemWarningMsg._lbl_Alert_DataProcess_ValidateQiTao;
                    this.lbl_Alert_DataProcess_RobotBuffer_FinishTask.Text = showNowTime + SystemWarningMsg._lbl_Alert_DataProcess_RobotBuffer_FinishTask;
                    this.lbl_MainTaskDecompose.Text = showNowTime + SystemWarningMsg._lbl_Alert_MainTaskDecompose;
                    this.lbl_DataProcess_BZ21_IssueTask.Text = showNowTime + SystemWarningMsg._lbl_Alert_DataProcess_BZ21_IssueTask;
                    this.lbl_MainTaskDecompose_ZPRK.Text = showNowTime + SystemWarningMsg._lbl_Alert_MainTaskDecompose_ZPRK;
                    this.lbl_DataProcess_RobotBuffer_ModeChange.Text = showNowTime + SystemWarningMsg._lbl_Alert_DataProcess_RobotBuffer_ModeChange;
                    this.lbl_Alert_DataProcess_RobotBuffer_FinishTaskForOutbound.Text = showNowTime + SystemWarningMsg._lbl_Alert_DataProcess_RobotBuffer_FinishTaskForOutbound;
                    this.lbl_Alert_DeleteData.Text = showNowTime + SystemWarningMsg._lbl_Alert_DeleteData;
                    this.lbl_Alert_EmptySalverTransfer.Text = showNowTime + SystemWarningMsg._lbl_Alert_EmptySalverTransfer;
                    this.lbl_Alert_DataProcess_RobotBuffer_AutoQiTaoOutbound.Text = showNowTime + SystemWarningMsg._lbl_Alert_DataProcess_RobotBuffer_AutoQiTaoOutbound;
                    this.lbl_Alter_DataProcess_BZ21.Text = showNowTime + SystemWarningMsg._lbl_Alert_DataProcess_BZ21;
                    this.lbl_alert_DataProcess_BZ39.Text = showNowTime + SystemWarningMsg._lbl_alert_DataProcess_BZ39;
@@ -361,10 +367,7 @@
                    this.lbl_alert_DataProcess_269.Text = showNowTime + SystemWarningMsg._lbl_alert_DataProcess_269;
                    this.lbl_Alert_Place1014ClearStoreTask.Text = showNowTime + SystemWarningMsg._lbl_Alert_Place1014To1020TaskTask;
                    this.lbl_Alter_OutTaskRetryToMes.Text = showNowTime + SystemWarningMsg._lbl_Alert_OutTaskRetryToMes;
                    this.lbl_Alert_DataProcess_RobotBuffer_IssueOutboundTask.Text = showNowTime + SystemWarningMsg._lbl_Alert_DataProcess_RobotBuffer_IssueOutboundTask;
@@ -372,220 +375,15 @@
                }
                catch (Exception ex)
                {
                    Log4NetHelper.WriteErrorLog(iWareCommon.Utils.LogType.SrmTheadService, "方法SrmRead_Label出现异常:" + ex.Message, ex);
                    continue;
                }
            }
        }
        /// <summary>
        /// 获取堆垛机的实时信息
        /// </summary>
        private void GetSrmInfo(object int_device)
        {
            while (true)
            {
                EDevice device = (EDevice)Enum.Parse(typeof(EDevice), int_device.ToString());
                Thread.Sleep(cycleDelay_Device);
                try
                {
                    using (var opcClinet = new SrmService.SrmServiceClient())
                    {
                        srmViewDict[(int)device] = opcClinet.GetSrmInfo((int)device);
                        CastToDevice_SrmRealTime(srmViewDict[(int)device]);
                        List<String> warningAddressList = new List<string>();
                        if (srmViewDict[(int)device].R_WarningDBList != null && srmViewDict[(int)device].R_WarningDBList.Length > 0)
                        {
                            var waringList = srmViewDict[(int)device].R_WarningDBList.ToList();
                            if (waringList != null && waringList.Count > 0)
                            {
                                for (int i = 0; i < waringList.Count; i++)
                                {
                                    DeviceWarningHandler.SaveWarning(device, iWareCommon.Utils.LogType.SrmTheadService,
                                        waringList[i].Code, waringList[i].Address, waringList[i].Context);//新增报警
                                    warningAddressList.Add(waringList[i].Address);
                                }
                            }
                        }
                        DeviceWarningHandler.AutoCloseWarning(device, iWareCommon.Utils.LogType.SrmTheadService, warningAddressList);//自动关闭报警
                    }
                }
                catch (Exception ex)
                {
                    Log4NetHelper.WriteErrorLog(iWareCommon.Utils.LogType.SrmTheadService, "获取" + device.ToString() + "的实时信息异常:" + ex.Message, ex);
                    continue;
                }
            };
        }
        /// <summary>
        /// 转换为SRM的实时状态
        /// </summary>
        /// <param name="view"></param>
        private void CastToDevice_SrmRealTime(SrmView view)
        {
            List<Device_SrmRealTime> realTimeList = new List<Device_SrmRealTime>();
            Device_SrmRealTime obj = new Device_SrmRealTime();
            EDevice device = (EDevice)Enum.Parse(typeof(EDevice), view.R_SrmNo.ToString());
            obj = new Device_SrmRealTime()
            {
                SrmCode = view.R_SrmNo.ToString(),
                SrmName = device.ToString(),
                Mode = view.R_Mode.ToString(),
                ModeName = view.ModeName,
                State = view.R_State.ToString(),
                StateName = view.StateName,
                TaskID = view.R_TaskNo.ToString(),
                LiftFull = view.R_LiftFull == 1,
                PosX = view.R_PosX,
                PosY = view.R_PosY,
                PosZ = view.R_PosZ,
                PosZName = EnumberHelper.GetEnumName<ESrmForkPosition>(view.R_PosZ).ToString(),
                // XCoordinate=view.r_xc
                SrmToPlace = view.SrmToPlace,
                SrmSourcePlace = view.SrmSourcePlace,
                ZCoordinate = view.R_PosZmm.ToString(),
                XCoordinate = view.R_PosXmm.ToString(),
                YCoordinate = view.R_PosYmm.ToString()
            };
            realTimeList.Add(obj);
            DeviceSrmRealTimeHandler.Update(realTimeList, iWareCommon.Utils.LogType.SrmTheadService);
        }
        #region 堆垛机线程和UI处理
        /// <summary>
        /// 堆垛机的UI显示
        /// </summary>
        /// <param name="device"></param>
        private void SetSrmUI()
        {
            if (FormCC.IsSimulationPLC == false)
            {
                SrmDeviceList.ForEach(x =>
                {
                    ParameterizedThreadStart parStart = new ParameterizedThreadStart(SingleSetSrmUI);
                    Thread thread = new Thread(parStart);
                    object o = (int)x;
                    thread.Start(o);
                });
            }
        }
        /// <summary>
        /// 堆垛机的UI显示
        /// </summary>
        /// <param name="device"></param>
        private void SingleSetSrmUI(object int_device)
        {
            while (true)
            {
                try
                {
                    EDevice device = (EDevice)Enum.Parse(typeof(EDevice), int_device.ToString());
                    SrmView srmInfo = srmViewDict[(int)device];
                    var panel = GetSrmPanel(device);
                    List<PropertieModel> proList = ClassHelper.GetPropertieModels<SrmView>(srmInfo);
                    foreach (var item in DeviceDict.LabelSrmDict)
                    {
                        //var lbl = ControlHelper.GetLabel(this, panel, item.Key + (int)device);
                        Object obj = ControlHelper.GetControlInstance(panel, item.Key + (int)device);
                        if (obj != null)
                        {
                            Label lbl = (Label)obj;
                            lbl.Text = item.Value.LablePreStr + proList.Find(x => x.PropertyName == item.Value.LableProName).DataValue;
                        }
                    }
                    //特殊处理- 报警
                    var lbSrmAlarm = GetSrmAlarmLabel(device);
                    if (srmInfo.R_Alarm != 1)
                    {
                        lbSrmAlarm.Text = string.Empty;
                        lbSrmAlarm.ForeColor = Color.SkyBlue;
                        lbSrmAlarm.BackColor = Color.Transparent;
                        lbSrmAlarm.ForeColor = Color.Maroon;
                        lbSrmAlarm.BackColor = Color.WhiteSmoke;
                    }
                    else
                    { //处于报警状态下
                        if (srmInfo.R_WarningDBList != null && srmInfo.R_WarningDBList.Length > 0)
                        {
                            lbSrmAlarm.Text = String.Join(",", srmInfo.R_WarningDBList.Select(x => x.Context).ToArray());
                        }
                        lbSrmAlarm.ForeColor = Color.White;
                        lbSrmAlarm.BackColor = Color.Red;
                        lbSrmAlarm.ForeColor = Color.White;
                        lbSrmAlarm.BackColor = Color.Red;
                    }
                    //注释
                    /*
                    if (lbSrmAlarm.Text == string.Empty)
                    {
                        using (var opcClinet = new SrmService.SrmServiceClient())
                        {
                            var isHandShare = SrmBLL.IsHandShare(opcClinet, device);
                            if (!isHandShare)
                            {
                                lbSrmAlarm.Text = (int)device + "号堆垛机没有心跳";
                            }
                        }
                    }
                    //*/
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }
        /// <summary>
        /// 获取堆垛机的报警Label
        /// </summary>
        /// <param name="device"></param>
        /// <returns></returns>
        private Label GetSrmAlarmLabel(EDevice device)
        {
            switch (device)
            {
                case EDevice.一号堆垛机:
                    return this.lblSrmAlarm1;
                case EDevice.二号堆垛机:
                    return this.lblSrmAlarm2;
                case EDevice.三号堆垛机:
                    return this.lblSrmAlarm3;
                case EDevice.四号堆垛机:
                    return this.lblSrmAlarm4;
            }
            return null;
        }
        /// <summary>
        /// 获取堆垛机的Panel
        /// </summary>
        /// <param name="device"></param>
        /// <returns></returns>
        private Panel GetSrmPanel(EDevice device)
        {
            switch (device)
            {
                case EDevice.一号堆垛机:
                    return this.panel_Srm1;
                case EDevice.二号堆垛机:
                    return this.panel_Srm2;
                case EDevice.三号堆垛机:
                    return this.panel_Srm3;
                case EDevice.四号堆垛机:
                    return this.panel_Srm4;
            }
            return null;
        }
@@ -642,167 +440,9 @@
            }
        }
        /// <summary>
        /// 获取RGV信息
        /// </summary>
        /// <param name="obj"></param>
        private void GetRgvInfo(object obj)
        {
            while (true)
            {
                Thread.Sleep(1000);//1秒钟读取一次
                try
                {
                    if (rgvServiceClient == null)
                    {
                        continue;
                    }
                    rgvView = rgvServiceClient.GetRgvInfo((int)EDevice.RGV);
                    CalcRGV_1012_HasCategory_COUNT();
                    CalcRGV_1011_HasCategory_COUNT();
                    CalcRGV_1020_NoHasCategory_COUNT();
                    CalcRGV_HasCategory_COUNT(EDevice.堆垛机1出库口1001, ref RGV_1001_HasCategory_COUNT, lbl_RGV_1001_HasCategory_COUNT);
                    CalcRGV_HasCategory_COUNT(EDevice.堆垛机2出库口1003, ref RGV_1003_HasCategory_COUNT, lbl_RGV_1003_HasCategory_COUNT);
                    CalcRGV_HasCategory_COUNT(EDevice.堆垛机3出库口1005, ref RGV_1005_HasCategory_COUNT, lbl_RGV_1005_HasCategory_COUNT);
                    CalcRGV_HasCategory_COUNT(EDevice.堆垛机4出库口1008, ref RGV_1008_HasCategory_COUNT, lbl_RGV_1008_HasCategory_COUNT);
                    _CommmonShowAgvStation();
                    CastToDevice_RgvRealTime(rgvView);
                    SetScanText();
                    Set1009_HighText();
                    //显示RGV任务完成和完成确认信号
                    this.lbl_R_RGV_Finish.Text = "RGV任务完成:" + rgvView.R_RGV_Finish;
                    this.lbl_W_RGV_FinishACK.Text = "RGV任务完成确认:" + rgvView.W_RGV_FinishACK;
                    this.lbl_RgvCoordinate.Text = "RGV实时坐标:" + rgvView.R_RGV_Coordinate;
                    //解析RGV对象
                    foreach (var item in rgvView.R_RgvForReadCommList)
                    {
                        var control = ControlHelper.GetControlInstance(this.tPTransAsrs, "btn_" + item.StationCode);
                        if (item.R_AlarmCode > 0)
                        {//有报警
                            if (control != null)
                            {
                                var btn = control as Button;
                                btn.BackColor = Color.Red;
                            }
                        }
                        else
                        {
                            if (control != null)
                            {
                                var btn = control as Button;
                                if (item.StationCode == ((int)EDevice.RGV1040).ToString())
                                {
                                    btn.BackColor = Color.Gold;
                                }
                                else if (item.StationCode == ((int)EDevice.拆盘机1020).ToString())
                                {
                                    btn.BackColor = Color.DodgerBlue;
                                }
                                else if (item.StationCode == ((int)EDevice.提升机1030).ToString())
                                {
                                    btn.BackColor = Color.SteelBlue;
                                }
                                else
                                {
                                    btn.BackColor = Color.SeaGreen;
                                }
                            }
                        }
                    }
                    //显示RGV报警信息
                    List<String> warningAddressList = new List<string>();
                    if (rgvView.R_Rgv_WarningDBList != null && rgvView.R_Rgv_WarningDBList.Length > 0)
                    {
                        tb_Rgv_Alter.Text = String.Join(",", rgvView.R_Rgv_WarningDBList.Select(x => x.Contextk__BackingField).ToArray());
                        //保存报警
                        var waringList = rgvView.R_Rgv_WarningDBList.ToList();
                        if (waringList != null && waringList.Count > 0)
                        {
                            for (int i = 0; i < waringList.Count; i++)
                            {
                                DeviceWarningHandler.SaveWarning(EDevice.RGV, iWareCommon.Utils.LogType.StationThreadService,
                                    waringList[i].Codek__BackingField, waringList[i].Addressk__BackingField, waringList[i].Contextk__BackingField);//新增报警
                                warningAddressList.Add(waringList[i].Addressk__BackingField);
                            }
                        }
                    }
                    else
                    {
                        tb_Rgv_Alter.Text = "";
                    }
                    DeviceWarningHandler.AutoCloseWarning(EDevice.RGV, iWareCommon.Utils.LogType.StationThreadService, warningAddressList);//自动关闭报警
                }
                catch (Exception ex)
                {
                    rgvView = null;
                    Log4NetHelper.WriteErrorLog(iWareCommon.Utils.LogType.StationThreadService, "获取RGV信息出现异常:" + ex.Message, ex);
                    continue;
                }
            }
        }
        private void SetScanText()
        {
            this.lbl_R_1015_Scan.Text = "1015扫码值:" + rgvView.R_1015_Scan;
            this.lbl_R_1019_Scan.Text = "1019扫码值:" + rgvView.R_1019_Scan;
            this.lblR_1019_CargoNoScan.Text = "1019发动机扫码:" + rgvView.R_1019_CargoNoScan;
            this.lbl_R_1002_Scan.Text = "1002扫码值:" + rgvView.R_1002_Scan;
            this.lbl_R_1004_Scan.Text = "1004扫码值:" + rgvView.R_1004_Scan;
            this.lbl_R_1006_Scan.Text = "1006扫码值:" + rgvView.R_1006_Scan;
            this.lbl_R_1007_Scan.Text = "1007扫码值:" + rgvView.R_1007_Scan;
            this.lbl_W_1002_ScanFailACK.Text = "1002扫描验证:" + rgvView.W_1002_ScanFailACK;
            this.lbl_W_1004_ScanFailACK.Text = "1004扫描验证:" + rgvView.W_1004_ScanFailACK;
            this.lbl_W_1006_ScanFailACK.Text = "1006扫描验证:" + rgvView.W_1006_ScanFailACK;
            this.lbl_W_1007_ScanFailACK.Text = "1007扫描验证:" + rgvView.W_1007_ScanFailACK;
        }
        private void Set1009_HighText()
        {
            this.lbl_R_1009_High1.Text = "1009站点1层光电:" + rgvView.R_1009_High1;
            this.lbl_R_1009_High2.Text = "1009站点2层光电:" + rgvView.R_1009_High2;
            this.lbl_R_1009_High3.Text = "1009站点3层光电:" + rgvView.R_1009_High3;
        }
        /// <summary>
        /// 转换为RGV的实时状态
        /// </summary>
        /// <param name="rgvView"></param>
        private void CastToDevice_RgvRealTime(RgvView rgvView)
        {
            List<Device_RgvRealTime> realTimeList = new List<Device_RgvRealTime>();
            Device_RgvRealTime obj = new Device_RgvRealTime();
            foreach (var item in rgvView.R_RgvForReadCommList)
            {
                EDevice device = (EDevice)Enum.Parse(typeof(EDevice), item.StationCode);
                obj = new Device_RgvRealTime()
                {
                    RgvCode = item.StationCode,
                    RgvName = device.ToString(),
                    Mode = item.R_Model.ToString(),
                    ModeName = EnumberHelper.GetEnumName<ERgvMode>(item.R_Model).ToString(),
                    State = item.R_State.ToString(),
                    StateName = EnumberHelper.GetEnumName<ERgvState>(item.R_State).ToString(),
                    WarningCode = item.R_AlarmCode.ToString(),
                    TaskID = item.R_TaskID.ToString(),
                    PH_1 = item.R_PH_1,
                    PH_2 = item.R_PH_2,
                    Shape = item.R_Shape.ToString(),
                    ShapeName = EnumberHelper.GetEnumName<ERgvBodyTest>(item.R_Shape).ToString(),
                    Destination = item.R_Destination.ToString(),
                    Coordinate = rgvView.R_RGV_Coordinate //赋值RGV坐标
                };
                realTimeList.Add(obj);
            }
            DeviceRgvRealTimeHandler.Update(realTimeList, iWareCommon.Utils.LogType.StationThreadService);
        }
        #endregion
@@ -876,8 +516,21 @@
                    stationView = stationServiceClient.GetStationInfo((int)EDevice.Station);
                    _CommmonShowAgvStation();
                    this.lbl_Mode_FJ.Text = "设备模式:" + PlcHelper.GetModeName(stationView.R_Mode_FJ);
                    this.lbl_XinTiao_FJ.Text = "心跳:" + stationView.R_HandShake_FJ;
                    this.lbl_Warning_FJ.Text = "报警类型:" + PlcHelper.GetWarningTypeName(stationView.R_Warning_FJ);
                    this.lbl_Mode_MB.Text = "设备模式:" + PlcHelper.GetModeName(stationView.R_Mode_MB);
                    this.lbl_XinTiao_MB.Text = "心跳:" + stationView.R_HandShake_MB;
                    this.lbl_Warning_MB.Text = "报警类型:" + PlcHelper.GetWarningTypeName(stationView.R_Warning_MB);
                    this.lbl_Mode_HB.Text = "设备模式:" + PlcHelper.GetModeName(stationView.R_Mode_HB);
                    this.lbl_XinTiao_HB.Text = "心跳:" + stationView.R_HandShake_HB;
                    this.lbl_Warning_HB.Text = "报警类型:" + PlcHelper.GetWarningTypeName(stationView.R_Warning_HB);
                    this.lbl_Mode_FX.Text = "设备模式:" + PlcHelper.GetModeName(stationView.R_Mode_FX);
                    this.lbl_XinTiao_FX.Text = "心跳:" + stationView.R_HandShake_FX;
                    this.lbl_Warning_FX.Text = "报警类型:" + PlcHelper.GetWarningTypeName(stationView.R_Warning_FX);
                    ////显示RGV任务完成和完成确认信号
                    //this.lbl_R_RGV_Finish.Text = "RGV任务完成:" + rgvView.R_RGV_Finish;
@@ -958,56 +611,64 @@
        }
        #endregion
        #region AGV
        /// <summary>
        /// 获取AGV车辆列表
        /// 获取Station 报警信息
        /// </summary>
        public void GetAgvVehicles()
        /// <param name="obj"></param>
        private async void GetStationWarningInfo(object obj)
        {
            while (true)
            {
                Thread.Sleep(3000);//1秒钟读取一次
                try
                {
                    if (SystemValue.isAllowRuning_Agv && SystemValue.isStartedModel)
                    if (stationServiceClient == null)
                    {
                        AGVRetModel list = AgvRequestHelper.GetVehicles();
                        AgvHandler.SaveAgvData(list);
                        List<String> warningAddressList = new List<string>();
                        if (list.alarms != null && list.alarms.errors != null && list.alarms.errors.Count > 0)
                        {
                            var waringList = list.alarms.errors;
                            if (waringList != null && waringList.Count > 0)
                            {
                                for (int i = 0; i < waringList.Count; i++)
                                {
                                    DeviceWarningHandler.SaveWarning(EDevice.AGV, iWareCommon.Utils.LogType.AGVTheadService,
                                        waringList[i].code, waringList[i].code, waringList[i].desc);//新增报警
                                    warningAddressList.Add(waringList[i].code);
                                }
                            }
                        }
                        DeviceWarningHandler.AutoCloseWarning(EDevice.AGV, iWareCommon.Utils.LogType.AGVTheadService, warningAddressList);//自动关闭报警
                        this.lbl_Alert_Agv.Text = "获取AGV车辆信息成功";
                        continue;
                    }
                    Stopwatch main = new Stopwatch();
                    main.Start();
                    iWareCC.StationService.DeviceWarningInfo[] waringList = await stationServiceClient.GetWaringInfoListAsync((int)EDevice.Station, configDeviceWarningList.wmsConfigDeviceWarnings.ToArray());
                    main.Stop();
                    var milliseconds = main.ElapsedMilliseconds;  //-- 操作时间(毫秒)
                    //显示报警信息
                    List<String> warningCodeList = new List<string>();
                    if (waringList != null && waringList.Length > 0)
                    {
                        for (int i = 0; i < waringList.Length; i++)
                        {
                            var findObj = configDeviceWarningList.wms_config_device_warning_list.Where(x => x.WarningCode == waringList[i].Codek__BackingField).FirstOrDefault();
                            DeviceWarningHandler.SaveWarning(EDevice.Station, iWareCommon.Utils.LogType.StationThreadService,
                                findObj.WarningCode, findObj.DeviceAreaCode, findObj.WarningContent, findObj.DeviceWarningType);//新增报警
                            warningCodeList.Add(findObj.WarningCode);
                        }
                    }
                    else
                    {
                    }
                    DeviceWarningHandler.AutoCloseWarning(EDevice.Station, iWareCommon.Utils.LogType.StationThreadService, warningCodeList);//自动关闭报警
                    //*/
                }
                catch (Exception ex)
                {
                    Log4NetHelper.WriteErrorLog(iWareCommon.Utils.LogType.CCWCFService, "获取AGV车辆列表 出现异常:" + ex.Message, ex);
                    this.lbl_Alert_Agv.Text = "获取AGV车辆信息异常:" + ex.Message;
                }
                finally
                {
                    Thread.Sleep(5000);//5秒一次
                    rgvView = null;
                    Log4NetHelper.WriteErrorLog(iWareCommon.Utils.LogType.StationThreadService, "获取站点信息出现异常:" + ex.Message, ex);
                    continue;
                }
            }
        }
        #endregion
        #region 其他线程
@@ -1060,82 +721,6 @@
        #region 私有方法
        /// <summary>
        /// 计算 某个站点的有货 值
        /// </summary>
        private void CalcRGV_HasCategory_COUNT(EDevice device, ref int RGV_HasCategory_COUNT, Label lbl_RGV_HasCategory_COUNT)
        {
            //改为 只判断有两个信号都有
            var isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattionFor2(((int)device).ToString());
            //改为 只判断有一个信号有货即可
            //var isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattion(((int)EDevice.出库口1012).ToString());
            if (isGD_HasCatogryForRgvStattion)
            {
                RGV_HasCategory_COUNT += 1;
            }
            else
            {
                RGV_HasCategory_COUNT = 0;
            }
            lbl_RGV_HasCategory_COUNT.Text = ((int)device).ToString() + "站点持续有货时间:" + RGV_HasCategory_COUNT;
        }
        /// <summary>
        /// 计算 RGV_1012_HasCategory_COUNT值
        /// </summary>
        private void CalcRGV_1012_HasCategory_COUNT()
        {
            //改为 只判断有两个信号都有
            var isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattionFor2(((int)EDevice.出库口1012).ToString());
            //改为 只判断有一个信号有货即可
            //var isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattion(((int)EDevice.出库口1012).ToString());
            if (isGD_HasCatogryForRgvStattion)
            {
                RGV_1012_HasCategory_COUNT += 1;
            }
            else
            {
                RGV_1012_HasCategory_COUNT = 0;
            }
            this.lbl_RGV_1012_HasCategory_COUNT.Text = "1012站点持续有货时间:" + RGV_1012_HasCategory_COUNT;
        }
        /// <summary>
        /// 计算 RGV_1011_HasCategory_COUNT值
        /// </summary>
        private void CalcRGV_1011_HasCategory_COUNT()
        {
            //改为 只判断有两个信号都有
            var isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattionFor2(((int)EDevice.空托缓存1011).ToString());
            //改为 只判断有一个信号有货即可
            //var isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattion(((int)EDevice.空托缓存1011).ToString());
            if (isGD_HasCatogryForRgvStattion)
            {
                RGV_1011_HasCategory_COUNT += 1;
            }
            else
            {
                RGV_1011_HasCategory_COUNT = 0;
            }
            this.lbl_RGV_1011_HasCategory_COUNT.Text = "1011站点持续有货时间:" + RGV_1011_HasCategory_COUNT;
        }
        /// <summary>
        /// 计算 RGV_1020_NoHasCategory_COUNT值
        /// </summary>
        private void CalcRGV_1020_NoHasCategory_COUNT()
        {
            var isGD_HasCatogryForRgvStattion = MyExtendHelper.IsGD_HasCatogryForRgvStattion(((int)EDevice.拆盘机1020).ToString());
            if (isGD_HasCatogryForRgvStattion)
            {
                RGV_1020_NoHasCategory_COUNT = 0;
            }
            else
            {
                RGV_1020_NoHasCategory_COUNT += 1;
            }
            this.lbl_RGV_1020_NoHasCategory_COUNT.Text = "1020站点持续无货时间:" + RGV_1020_NoHasCategory_COUNT;
        }
        /// <summary>
        /// 初始化实时堆垛机的字典
@@ -1149,56 +734,11 @@
            });
        }
        private void SetInitPlaceValue()
        {
            this.tbSrm1TaskId.Text = this.tbSrm2TaskId.Text = this.tbSrm3TaskId.Text = this.tbSrm4TaskId.Text = "11";
            var sourcePlace = "02-02-01";
            this.tB_Srm1SourcePlace.Text = this.tB_Srm2SourcePlace.Text = this.tB_Srm3SourcePlace.Text = this.tB_Srm4SourcePlace.Text = sourcePlace;
            var toPlace = "02-03-01";
            this.tB_Srm1ToPlace.Text = this.tB_Srm2ToPlace.Text = this.tB_Srm3ToPlace.Text = this.tB_Srm4ToPlace.Text = toPlace;
        }
        #endregion
        private void btnSrm1Send_Click(object sender, EventArgs e)
        {
            CommonSendSrmTask(ESrmCmd.库内搬运, "1-", tbSrm1TaskId, tB_Srm1SourcePlace, tB_Srm1ToPlace, EDevice.一号堆垛机);
        }
        private void btnSrm1Move_Click(object sender, EventArgs e)
        {
            CommonSendSrmTask(ESrmCmd.移动, "1-", tbSrm1TaskId, tB_Srm1SourcePlace, tB_Srm1ToPlace, EDevice.一号堆垛机);
        }
        private void btnSrm1Confirm_Click(object sender, EventArgs e)
        {
            CommonSrmConfirm(EDevice.一号堆垛机, tbSrm1TaskId);
        }
        private void btnSrm1EStop_Click(object sender, EventArgs e)
        {
            CommonSrmEStop(EDevice.一号堆垛机);
        }
        private void btnSrm1RlsAlert_Click(object sender, EventArgs e)
        {
            using (var opcClinet = new SrmService.SrmServiceClient())
            {
                opcClinet.ReleaseAlert((int)EDevice.一号堆垛机);
            }
        }
        private void btnSrm1Delete_Click(object sender, EventArgs e)
        {
            CommonDeleteSrmTask(EDevice.一号堆垛机);
        }
        private void btnSrm2Send_Click(object sender, EventArgs e)
        {
            CommonSendSrmTask(ESrmCmd.库内搬运, "2-", tbSrm2TaskId, tB_Srm2SourcePlace, tB_Srm2ToPlace, EDevice.二号堆垛机);
        }
        #region 公共
@@ -1212,7 +752,7 @@
                using (var opcClinet = new SrmService.SrmServiceClient())
                {
                    var result = opcClinet.SendEStop((int)_EDevice);
                    Log4NetHelper.WriteInfoLog(iWareCommon.Utils.LogType.SrmTheadService, "字符串:" + JsonConvert.SerializeObject(result));
                    Log4NetHelper.WriteInfoLog(iWareCommon.Utils.LogType.DataProcess_BZ39_IssueInboundTask, "字符串:" + JsonConvert.SerializeObject(result));
                    if (result.result)
                    {
                        WZ.Useful.Commons.MessageUtil.ShowTips("发送" + _EDevice.ToString() + "急停指令成功");
@@ -1230,74 +770,7 @@
        }
        /// <summary>
        /// 公共发送堆垛机命令(搬运/移动)
        /// </summary>
        /// <param name="pre_Srm"></param>
        /// <param name="tbTaskId"></param>
        /// <param name="tbSourcePlace"></param>
        /// <param name="tbToPlace"></param>
        /// <param name="_EDevice"></param>
        private void CommonSendSrmTask(ESrmCmd srmCmd, string pre_Srm, TextBox tbTaskId, TextBox tbSourcePlace, TextBox tbToPlace, EDevice _EDevice)
        {
            if (SystemValue.isStartedModel)
            {
                WZ.Useful.Commons.MessageUtil.ShowError("手动发任务,需要将模式关闭!");
                return;
            }
            MessageBoxButtons messButton = MessageBoxButtons.OKCancel;
            var deviceName = _EDevice.ToString();
            var cmdName = srmCmd.ToString();
            DialogResult dr = MessageBox.Show("确定要给" + deviceName + "发送" + cmdName + "命令吗?", "确认", messButton);
            if (dr == DialogResult.OK)//如果点击“确定”按钮
            {
                try
                {
                    using (var opcClinet = new SrmService.SrmServiceClient())
                    {
                        var sourcePlce = tbSourcePlace.Text.Trim();
                        var toPlace = tbToPlace.Text.Trim();
                        if (!IsNumeric(tbTaskId.Text.Trim()))
                        {
                            WZ.Useful.Commons.MessageUtil.ShowError("任务号格式错误,必须是数字!");
                            return;
                        }
                        var taskId = int.Parse(tbTaskId.Text.Trim());
                        if (!(taskId >= 1 && taskId <= 100))
                        {
                            WZ.Useful.Commons.MessageUtil.ShowError("手动任务号必须是在1-100之间!");
                            return;
                        }
                        iWareCC.SrmService.SdaResEntity sdaResult = opcClinet.SendSrmTask((int)_EDevice, int.Parse(tbTaskId.Text.Trim()), pre_Srm + sourcePlce, pre_Srm + toPlace, (short)srmCmd);
                        if (sdaResult.result)
                        {
                            WZ.Useful.Commons.MessageUtil.ShowTips(deviceName + cmdName + "命令发送成功!");
                            //  tB_Srm1SourcePlace.Clear();
                            // tB_Srm1ToPlace.Clear();
                            Log4NetHelper.WriteInfoLog(iWareCommon.Utils.LogType.CCWCFService, "手动堆垛机任务发送成功,任务号:" + taskId + ",起点:" + sourcePlce + ",目标点:" + toPlace + ",堆垛机:" + deviceName);
                        }
                        else
                        {
                            WZ.Useful.Commons.MessageUtil.ShowError(deviceName + cmdName + "命令发送失败!返回代码:" + sdaResult.resMsg);
                            Log4NetHelper.WriteErrorLog(iWareCommon.Utils.LogType.CCWCFService, "手动堆垛机任务发送失败!返回代码:" + sdaResult.resMsg + ",任务号:" + taskId + ",起点:" + sourcePlce + ",目标点:" + toPlace + ",堆垛机:" + deviceName);
                        }
                    }
                    tbSourcePlace.Focus();
                    tbSourcePlace.SelectAll();
                }
                catch (Exception ex)
                {
                    WZ.Useful.Commons.MessageUtil.ShowError(deviceName + cmdName + "命令发送出现异常:" + ex.Message);
                    Log4NetHelper.WriteErrorLog(iWareCommon.Utils.LogType.CCWCFService, deviceName + cmdName + "命令发送出现异常:" + ex.Message, ex);
                }
            }
            else//如果点击“取消”按钮
            {
            }
        }
        /// <summary>
        /// 堆垛机任务确认
@@ -1360,109 +833,6 @@
        #endregion
        private void btnSrm2Move_Click(object sender, EventArgs e)
        {
            CommonSendSrmTask(ESrmCmd.移动, "2-", tbSrm2TaskId, tB_Srm2SourcePlace, tB_Srm2ToPlace, EDevice.二号堆垛机);
        }
        private void btnSrmTransSend_Click(object sender, EventArgs e)
        {
            if (SystemValue.isStartedModel)
            {
                WZ.Useful.Commons.MessageUtil.ShowError("手动发任务,需要将模式关闭!");
                return;
            }
            MessageBoxButtons messButton = MessageBoxButtons.OKCancel;
            DialogResult dr = MessageBox.Show("确定要发送命令吗?", "确认", messButton);
            if (dr == DialogResult.OK)//如果点击“确定”按钮
            {
                try
                {
                    using (var opcClinet = new RgvService.RgvServiceClient())
                    {
                        var sourcePlce = tBSrmTransSouce.Text.Trim();
                        if (sourcePlce == "1010")
                        {
                            WZ.Useful.Commons.MessageUtil.ShowError("站点1010不能发任务!");
                            return;
                        }
                        var toPlace = tBSrmTransToPlace.Text.Trim();
                        if (!IsNumeric(tBSrmTransTskId.Text.Trim()))
                        {
                            WZ.Useful.Commons.MessageUtil.ShowError("任务号格式错误,必须是数字!");
                            return;
                        }
                        var taskId = int.Parse(tBSrmTransTskId.Text.Trim());
                        if (!(taskId >= 1 && taskId <= 100))
                        {
                            WZ.Useful.Commons.MessageUtil.ShowError("手动任务号必须是在1-100之间!");
                            return;
                        }
                        iWareCC.RgvService.SdaResEntity sdaResult = opcClinet.SendRgvTask((int)EDevice.RGV, Convert.ToInt32(tBSrmTransTskId.Text.Trim()), sourcePlce, toPlace);
                        if (sdaResult.result)
                        {
                            WZ.Useful.Commons.MessageUtil.ShowTips("命令发送成功!");
                            //  tB_Srm1SourcePlace.Clear();
                            // tB_Srm1ToPlace.Clear();
                        }
                        else
                        {
                            WZ.Useful.Commons.MessageUtil.ShowError("命令发送失败!返回消息:" + sdaResult.resMsg);
                        }
                    }
                }
                catch (Exception ex)
                {
                    WZ.Useful.Commons.MessageUtil.ShowError("命令发送出现异常:" + ex.Message);
                }
            }
            else//如果点击“取消”按钮
            {
            }
        }
        private void btnSrm2Confirm_Click(object sender, EventArgs e)
        {
            CommonSrmConfirm(EDevice.二号堆垛机, tbSrm2TaskId);
        }
        private void btnSrm2EStop_Click(object sender, EventArgs e)
        {
            CommonSrmEStop(EDevice.二号堆垛机);
        }
        private void btnSrm2RlsAlert_Click(object sender, EventArgs e)
        {
            using (var opcClinet = new SrmService.SrmServiceClient())
            {
                opcClinet.ReleaseAlert((int)EDevice.二号堆垛机);
            }
        }
        private void btnSrm2Delete_Click(object sender, EventArgs e)
        {
            CommonDeleteSrmTask(EDevice.二号堆垛机);
        }
        /// <summary>
        /// 校验输入的库位ID是否符合格式
        /// </summary>
        /// <param name="str">库位号</param>
        /// <returns></returns>
        private bool IsNumeric(string str)
        {
            try
            {
                return (WZ.Useful.Commons.Util.IsNumeric(int.Parse(str)));
            }
            catch (Exception)
            {
                return false;
            }
        }
        private void rBNormal_CheckedChanged(object sender, EventArgs e)
        {
@@ -1483,7 +853,6 @@
            SystemValue.rBNormal_Checked = this.rBNormal.Checked ? true : false;
            SystemValue.rbHand_Checked = this.rbHand.Checked ? true : false;
            SystemValue.rBDebug_Checked = this.rBDebug.Checked ? true : false;
            SystemValue.rBOnlyIn_Checked = this.rBOnlyIn.Checked ? true : false;
            var title = "当前模式: ";
@@ -1515,8 +884,8 @@
                this.lbl_ModelText.Text = title + currentCheckModelText;
                SetAllCheckBoxChecked(true);
                //将特殊的取消
                this.ckHandlerIssuingTask.Checked = false;
                this.ckMainTaskDecompose.Checked = false;
                this.ck_DataProcess_BZ12_IssueTask.Checked = false;
                this.ck_DataProcess_BZ21_IssueTask.Checked = false;
                this.gBoxThread.Enabled = true;
            }
@@ -1552,43 +921,41 @@
        private void CommonCheckedChanged(object sender, EventArgs e)
        {
            //堆垛机1任务下发
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_SrmTaskThreadService_1, ckBSrm1Release);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_SrmTaskThreadService_1_Finish, ckBSrm1FinishedHandle);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_SrmTaskThreadService_1, ckB_DataProcess_BZ39_IssueInboundTask);
            //堆垛机2任务下发
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_SrmTaskThreadService_2, ckBSrm2Release);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_SrmTaskThreadService_2_Finish, ckBSrm2FinishedHandle);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_SrmTaskThreadService_2, ckBDataProcess_RobotBuffer_ForceOutbound);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_SrmTaskThreadService_2_Finish, ckBDataProcess_BZ12_FinishTask);
            //堆垛机3任务下发
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_SrmTaskThreadService_3, ckBSrm3Release);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_SrmTaskThreadService_3_Finish, ckBSrm3FinishedHandle);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_SrmTaskThreadService_3, ckBDataProcess_BZ12);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_SrmTaskThreadService_3_Finish, ckBDataProcess_BZ21_FinishTask);
            //堆垛机4任务下发
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_SrmTaskThreadService_4, ckBSrm4Release);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_SrmTaskThreadService_4_Finish, ckBSrm4FinishedHandle);
            //RGV任务下发
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_RgvThreadService, ckBRgvRelease);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_RgvThreadService_Finish, ckBRgvFinishedHandle);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_RgvThreadService_Finish_BuChang, ckBRgvFinishedHandle_BuChang);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_HandlerIssuingTask, ckHandlerIssuingTask);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_RgvThreadService_Finish, ckB_PushPaperCutToMes);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_RgvThreadService_Finish_BuChang, ck_PushPackageCodeToMes);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_HandlerIssuingTask, ck_DataProcess_BZ12_IssueTask);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_DataProcess_RobotBuffer_FinishTask, ck_DataProcess_RobotBuffer_FinishTask);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_MainTaskDecompose, ckMainTaskDecompose);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_MainTaskDecompose, ck_DataProcess_BZ21_IssueTask);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_MainTaskDecompose_ZPRK, ckMainTaskDecompose_ZPRK);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_DataProcess_RobotBuffer_ModeChange, ck_DataProcess_RobotBuffer_ModeChange);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_DataProcess_ValidateQiTao, ck_DataProcess_ValidateQiTao);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_DataProcess_RobotBuffer_FinishTaskForOutbound, checkBox_DataProcess_RobotBuffer_FinishTaskForOutbound);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_DeleteData, ckDeleteData);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_Agv, ckAgv);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_EmptySalverTransfer, ckEmptySalverTransfer);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_DataProcess_RobotBuffer_AutoQiTaoOutbound, ckDataProcess_RobotBuffer_AutoQiTaoOutbound);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_DataProcess_BZ39, ck_DataProcess_BZ39);
@@ -1596,9 +963,9 @@
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_DataProcess_269, ck_DataProcess_269);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_Place1014To1020Task, ckPlace1014ClearStoreTask);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_DataProcess_RobotBuffer_IssueOutboundTask, ck_DataProcess_RobotBuffer_IssueOutboundTask);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_OutTaskRetryToMes, checkBox_OutTaskRetryToMes);
            DoCommonCheckedChanged(ref SystemValue.isAllowRuning_OutTaskRetryToMes, checkBox_DataProcess_BZ21);
        }
        private void DoCommonCheckedChanged(ref bool isAllowValue, CheckBox cb)
@@ -1608,12 +975,8 @@
        private void FormCC_SizeChanged(object sender, EventArgs e)
        {
            asc_panel_DeviceTaskList.controlAutoSize(this.panel_DeviceTaskList);
            asc_panel_DeviceTaskList_dgvPartTask_Finished.controlAutoSize(this.panel_DeviceTaskList_dgvPartTask_Finished);
            asc_panel_dataGridView__OutTaskList.controlAutoSize(this.panel_dataGridView__OutTaskList);
            asc_panel_WaitPlanDetail.controlAutoSize(this.panel_WaitPlanDetail);
            asc_panel_DeviceTaskList_dataGridView_RgvStore.controlAutoSize(this.panel_DeviceTaskList_dataGridView_RgvStore);
            asc_panel_dg_OutTaskRetryToMes.controlAutoSize(this.panel_dg_OutTaskRetryToMes);
        }
        /// <summary>
@@ -1873,6 +1236,9 @@
                        this.btn_Start.BackColor = default_btn_Start_Color;//还原颜色
                    }
                }
                this.lbl_RobotMode.Text = "缓存岛机器人模式:" + (IsAllowRunOutMode ? "出库模式" : "入库模式");
                this.lbl_currHandlerPackageCodeForIssueOutboundTask.Text = "当前下发出库任务的包号:" + currHandlerPackageCodeForIssueOutboundTask;
            }
        }
@@ -1881,1696 +1247,208 @@
        }
        /// <summary>
        /// 起始位和目标位互换
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_Change1_Click(object sender, EventArgs e)
        {
            var old_source = this.tB_Srm1SourcePlace.Text;
            var old_to = this.tB_Srm1ToPlace.Text;
            this.tB_Srm1SourcePlace.Text = old_to;
            this.tB_Srm1ToPlace.Text = old_source;
        private void button24_Click(object sender, EventArgs e)
        {
            ////强制该包号出库
            //var packageCode = this.tb_PackageCode.Text.Trim();
            //var alertMsg = "";
            //CC_DataProcess_RobotBuffer_ForceOutbound.Handler(packageCode, ref alertMsg);
            //if (!string.IsNullOrEmpty(alertMsg))
            //{
            //    MessageBox.Show("错误:" + alertMsg);
            //}
            //else
            //{
            //    MessageBox.Show("已处理");
            //}
        }
        private void btn_Change2_Click(object sender, EventArgs e)
        private void button25_Click(object sender, EventArgs e)
        {
            var old_source = this.tB_Srm2SourcePlace.Text;
            var old_to = this.tB_Srm2ToPlace.Text;
            this.tB_Srm2SourcePlace.Text = old_to;
            this.tB_Srm2ToPlace.Text = old_source;
        }
            var packageCode = this.tb_PackageCode.Text.Trim();
        private void tPTransAsrs_Click(object sender, EventArgs e)
        {
        }
        private void panel16_Paint(object sender, PaintEventArgs e)
        {
        }
        private void btnSrm4Send_Click(object sender, EventArgs e)
        {
            CommonSendSrmTask(ESrmCmd.库内搬运, "4-", tbSrm4TaskId, tB_Srm4SourcePlace, tB_Srm4ToPlace, EDevice.四号堆垛机);
        }
        private void btnSrm4RlsAlert_Click(object sender, EventArgs e)
        {
            using (var opcClinet = new SrmService.SrmServiceClient())
            var alertMsg = "";
            using (WmsDBModel db = new WmsDBModel())
            {
                opcClinet.ReleaseAlert((int)EDevice.四号堆垛机);
                var upiList = db.mes_batchOrderUPI_new.Where(x => x.PackageCode == packageCode).ToList();
                foreach (var item in upiList)
                {
                    item.AreaCode = (int)AreaCodeEnum.无区域;
                    item.UpiStatus = (int)UpiStatusEnum.初始;
                }
                var pList = db.mes_package_gather.Where(x => x.PackageCode == packageCode).ToList();
                foreach (var item in pList)
                {
                    item.AreaCode = (int)AreaCodeEnum.无区域;
                    item.UpiStatus = (int)UpiStatusEnum.初始;
                }
                //清空队列数据
                var list = db.mes_upi_linequeue.ToList();
                db.mes_upi_linequeue.RemoveRange(list);
                db.SaveChanges();
            }
        }
        private void btn_Srm4EStop_Click(object sender, EventArgs e)
        {
            CommonSrmEStop(EDevice.四号堆垛机);
        }
        private void btn_Srm3EStop_Click(object sender, EventArgs e)
        {
            CommonSrmEStop(EDevice.三号堆垛机);
        }
        private void btnSrm3RlsAlert_Click(object sender, EventArgs e)
        {
            using (var opcClinet = new SrmService.SrmServiceClient())
            if (!string.IsNullOrEmpty(alertMsg))
            {
                opcClinet.ReleaseAlert((int)EDevice.三号堆垛机);
            }
        }
        private void btnSrm4Confirm_Click(object sender, EventArgs e)
        {
            CommonSrmConfirm(EDevice.四号堆垛机, tbSrm4TaskId);
        }
        private void btn_Change4_Click(object sender, EventArgs e)
        {
            var old_source = this.tB_Srm4SourcePlace.Text;
            var old_to = this.tB_Srm4ToPlace.Text;
            this.tB_Srm4SourcePlace.Text = old_to;
            this.tB_Srm4ToPlace.Text = old_source;
        }
        private void btn_Change3_Click(object sender, EventArgs e)
        {
            var old_source = this.tB_Srm3SourcePlace.Text;
            var old_to = this.tB_Srm3ToPlace.Text;
            this.tB_Srm3SourcePlace.Text = old_to;
            this.tB_Srm3ToPlace.Text = old_source;
        }
        private void btnSrm3Send_Click(object sender, EventArgs e)
        {
            CommonSendSrmTask(ESrmCmd.库内搬运, "3-", tbSrm3TaskId, tB_Srm3SourcePlace, tB_Srm3ToPlace, EDevice.三号堆垛机);
        }
        private void btnSrm4Move_Click(object sender, EventArgs e)
        {
            CommonSendSrmTask(ESrmCmd.移动, "4-", tbSrm4TaskId, tB_Srm4SourcePlace, tB_Srm4ToPlace, EDevice.四号堆垛机);
        }
        private void btnSrm3Confirm_Click(object sender, EventArgs e)
        {
            CommonSrmConfirm(EDevice.三号堆垛机, tbSrm3TaskId);
        }
        private void btnSrm4Delete_Click(object sender, EventArgs e)
        {
            CommonDeleteSrmTask(EDevice.四号堆垛机);
        }
        private void btnSrm3Delete_Click_1(object sender, EventArgs e)
        {
            CommonDeleteSrmTask(EDevice.三号堆垛机);
        }
        private void btnSrm3Move_Click(object sender, EventArgs e)
        {
            CommonSendSrmTask(ESrmCmd.移动, "3-", tbSrm3TaskId, tB_Srm3SourcePlace, tB_Srm3ToPlace, EDevice.三号堆垛机);
        }
        private void panel15_Paint(object sender, PaintEventArgs e)
        {
        }
        private void CommmonShowAgvStation(object sender)
        {
            var btn = sender as Button;
            var stationName = "";
            int stationCode = 0;
            if (int.TryParse(btn.Text, out stationCode))
            {
                stationName = btn.Text;
                MessageBox.Show("错误:" + alertMsg);
            }
            else
            {
                stationName = BusinessHelper.ConvertStationCodeForRGV(btn.Text).ToString();
                MessageBox.Show("已处理");
            }
            current_rgv_stationName = stationName;
            _CommmonShowAgvStation();
        }
        private void _CommmonShowAgvStation()
        private void button1_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(current_rgv_stationName))
            var alertMsg = "";
            using (WmsDBModel db = new WmsDBModel())
            {
                this.lbl_StationCode.Text = "当前位置号:" + "";
                this.lbl_PH_1.Text = "光电1状态:" + "";
                this.lbl_PH_2.Text = "光电2状态:" + "";
                this.lbl_ACK.Text = "收到任务下发反馈:" + "";
                this.lbl_Model.Text = "模式:" + "";
                this.lbl_State.Text = "运行状态:" + "";
                this.lbl_AlarmCode.Text = "报警代码:" + "";
                this.lbl_Destination.Text = "当前目标地址:" + "";
                this.lbl_Shape.Text = "外形检测:" + "";
                this.lbl_TaskID.Text = "当前任务号:" + "";
                this.lbl_Rgv_STP.Text = "STP:" + "";
                this.lbl_Rgv_WriteTaskNo.Text = "写入任务号:" + "";
                this.lbl_Rgv_WriteToPlace.Text = "写入目标地址:" + "";
                //查询立体库中的upi列表
                var quanList = db.wms_stock_quan.ToList().Select(x => x.Upi).ToList();
                var upiList = db.mes_batchOrderUPI_new.Where(x => !quanList.Contains(x.UPI)).ToList();
                foreach (var item in upiList)
                {
                    item.AreaCode = (int)AreaCodeEnum.无区域;
                    item.UpiStatus = (int)UpiStatusEnum.初始;
                }
                var packageCodeList = upiList.Select(x => x.PackageCode).ToList();
                var pList = db.mes_package_gather.Where(x => packageCodeList.Contains(x.PackageCode)).ToList();
                foreach (var item in pList)
                {
                    item.AreaCode = (int)AreaCodeEnum.无区域;
                    item.UpiStatus = (int)UpiStatusEnum.初始;
                }
                //清空队列数据
                var list = db.mes_upi_linequeue.ToList();
                db.mes_upi_linequeue.RemoveRange(list);
                db.SaveChanges();
            }
            if (!string.IsNullOrEmpty(alertMsg))
            {
                MessageBox.Show("错误:" + alertMsg);
            }
            else
            {
                var r_station = rgvView.R_RgvForReadCommList.Where(x => x.StationCode == current_rgv_stationName).FirstOrDefault();
                var w_station = rgvView.W_RgvForWriteCommList.Where(x => x.StationCode == current_rgv_stationName).FirstOrDefault();
                this.lbl_StationCode.Text = "当前位置号:" + r_station.StationCode;
                this.lbl_PH_1.Text = "光电1状态:" + r_station.R_PH_1;
                this.lbl_PH_2.Text = "光电2状态:" + r_station.R_PH_2;
                this.lbl_ACK.Text = "收到任务下发反馈:" + r_station.R_ACK;
                this.lbl_Model.Text = "模式:" + EnumberHelper.GetEnumName<ERgvMode>(r_station.R_Model);
                this.lbl_State.Text = "运行状态:" + EnumberHelper.GetEnumName<ERgvState>(r_station.R_State);
                this.lbl_AlarmCode.Text = "报警:" + (r_station.R_AlarmCode == 1 ? "有报警" : "无");
                this.lbl_Destination.Text = "当前目标地址:" + r_station.R_Destination;
                this.lbl_Shape.Text = "外形检测:" + EnumberHelper.GetEnumName<ERgvBodyTest>(r_station.R_Shape);
                this.lbl_TaskID.Text = "当前任务号:" + r_station.R_TaskID;
                this.lbl_Rgv_STP.Text = "STP:" + w_station.W_STP;
                this.lbl_Rgv_WriteTaskNo.Text = "写入任务号:" + w_station.W_TaskID;
                this.lbl_Rgv_WriteToPlace.Text = "写入目标地址:" + w_station.W_Destination;
                MessageBox.Show("已处理");
            }
        }
        private void btn_1001_Click(object sender, EventArgs e)
        private void btn1_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
            var taskNo = this.tb_taskNo.Text.Trim();
        private void btn_1002_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1003_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1004_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1005_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1006_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1007_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1008_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1009_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1010_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1011_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1012_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1013_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1030_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1014_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1020_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_1015_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_RGV_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void btn_ResetSTP_Click(object sender, EventArgs e)
        {
            CommmonResetSTP(sender);
        }
        private void CommmonResetSTP(object sender)
        {
            var btn = sender as Button;
            var stationName = current_rgv_stationName;
            if (string.IsNullOrEmpty(stationName))
            var alertMsg = "";
            using (WmsDBModel wmsDB = new WmsDBModel())
            {
                MessageBox.Show("请选择站点号");
                return;
            }
            using (RgvService.RgvServiceClient client = new RgvServiceClient())
            {
                var result = client.WriteStp((int)EDevice.RGV, false, stationName);
                if (result.result == false)
                var task = wmsDB.wms_rbline_task.Where(x => x.TaskNo == taskNo && x.RbTaskType == (int)RbTaskTypeEnum.入库任务 && x.TaskStatus == (int)TaskStatusEnum.已下发).FirstOrDefault();
                if (task == null)
                {
                    MessageBox.Show("失败:" + result.resMsg);
                }
            }
        }
        private void btnFind_Click_1(object sender, EventArgs e)
        {
            //查询设备任务列表
            dgvPartTask.AutoGenerateColumns = false;
            for (int i = 0; i < dgvPartTask.Columns.Count; i++)
            {
                if (i == (dgvPartTask.Columns.Count - 1))
                {//最后一列填充
                    dgvPartTask.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                }
                else
                {//其他列自动适应宽度
                    dgvPartTask.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                }
            }
            BindData();
            //this.dgvPartTask.Columns["CreateTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["IssueTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["FinishTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["AllowSimulateExecute_Time"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            FormHelper.DataGridViewSelfAdaptionWidth(this.dgvPartTask);
        }
        public void BindData()
        {
            List<Task_Part> partList = new List<Task_Part>();
            dgvPartTask.ClearSelection();   //可消除所有选择的行
            dgvPartTask.DataSource = null;
            dgvPartTask.CurrentCell = null; //可消除选择行的行头箭头
            using (DbModel db = new DbModel())
            {
                //取 最后一个未结束的任务,然后取前5条已经结束的任务
                var queryState1 = (int)DeviceTaskStatusEnum.已取消;
                var queryState2 = (int)DeviceTaskStatusEnum.已完成;
                var firstNoFinishedTaskList = db.Task_Part.Where(x => x.TaskState != queryState1 && x.TaskState != queryState2).OrderBy(x => x.CreateTime).ToList();
                if (firstNoFinishedTaskList == null)
                {
                    partList = new List<Task_Part>();
                }
                else
                {
                    List<int> mainIdList = new List<int>();
                    foreach (var item in firstNoFinishedTaskList)
                    {
                        if (!mainIdList.Contains(item.MainTaskId))
                        {
                            mainIdList.Add(item.MainTaskId);
                        }
                    }
                    var partList2 = db.Task_Part.Where(x => mainIdList.Contains(x.MainTaskId)).ToList();
                    //partList.AddRange(partList1);
                    partList.AddRange(partList2);
                }
                if (partList != null && partList.Count > 0)
                {
                    partList = partList.OrderBy(x => x.MainTaskId).ThenByDescending(x => x.CreateTime).ToList();//重新 升序排序
                    dgvPartTask.DataSource = null;
                    dgvPartTask.DataSource = partList;
                }
                else
                {
                    //if (dgvPartTask.Rows.Count > 0)
                    //{
                    //    int i = dgvPartTask.Rows[0].Cells.Count;
                    //    var cells = dgvPartTask.Rows[0].Cells;
                    //    for (int j = 0; j < i; j++)
                    //    {
                    //        cells[j].Value = null;
                    //    }
                    //}
                }
            }
        }
        private void btnFinish_Click_1(object sender, EventArgs e)
        {
            //强制完成
            try
            {
                var _AllowSimulateExecute_Rmark = this.tb_AllowSimulateExecute_Rmark.Text;
                if (string.IsNullOrEmpty(_AllowSimulateExecute_Rmark))
                {
                    MessageBox.Show("请输入强制完成原因说明!");
                    return;
                }
                using (DbModel context = new DbModel())
                {
                    var row = dgvPartTask.SelectedRows;
                    if (row.Count > 0)
                    {
                        var cell = row[0].Cells;
                        // var id = cell[0].Value.ToString();
                        var id = cell["Id"].Value.ToString();
                        var task = context.Task_Part.FirstOrDefault(x => x.Id == id);
                        if (task != null)
                        {
                            #region 数据处理
                            MessageBoxButtons messButton = MessageBoxButtons.OKCancel;
                            DialogResult dr = MessageBox.Show("确定要将该任务" + task.PlcTaskId + "标记为强制完成吗?", "确认", messButton);
                            if (dr == DialogResult.OK)//如果点击“确定”按钮
                            {
                                task.IsAllowSimulateExecute = true;
                                task.AllowSimulateExecute_User = SysGloble.WCSSystem;
                                task.AllowSimulateExecute_Time = DateTime.Now;
                                task.AllowSimulateExecute_Rmark = _AllowSimulateExecute_Rmark;
                                task.ModifyTime = DateTime.Now;
                                task.OperationRemark = "用户强制完成," + _AllowSimulateExecute_Rmark;
                                task.ModifyBy = SysGloble.WCSSystem;
                                //保存人工处理日志 [EditBy shaocx,2022-05-01]
                                Base_PersonHandlerRecord record = new Base_PersonHandlerRecord()
                                {
                                    MainTaskNo = task.MainTaskNo,
                                    HandlerType = "标记任务强制完成",
                                    PartTaskId = task.Id,
                                    PlcTaskId = task.PlcTaskId,
                                    RealSourcePlace = task.RealSourcePlace,
                                    RealToPlace = task.RealToPlace,
                                    SalverCode = task.SalverCode,
                                    SerialNumber = task.SerialNumber,
                                    OrderNo = task.OrderNo,
                                    TaskTypeName = task.TaskTypeName,
                                    Qty = task.Qty,
                                    ManualHandlerRemark = _AllowSimulateExecute_Rmark
                                };
                                PersonHandlerRecordHandler.SavePersonHandlerRecord(context, record);
                                context.SaveChanges();
                                MessageBox.Show("标记任务强制完成成功!注意:标记强制完成只是更新标记,要想处理完库存,您还需要运行自动模式,让其自动处理库存!");
                                BindData();
                            }
                            else//如果点击“取消”按钮
                            {
                                BindData();
                            }
                            #endregion
                        }
                        else
                        {
                            MessageBox.Show("未找到该任务!");
                            return;
                        }
                    }
                    else
                    {
                        MessageBox.Show("请先选中要标记任务强制完成的行!");
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("标记任务强制完成异常:" + ex.Message);
            }
        }
        private void btnDelete_Click_1(object sender, EventArgs e)
        {
            //任务取消
            try
            {
                if (SystemValue.isStartedModel)
                {
                    WZ.Useful.Commons.MessageUtil.ShowError("手动取消任务,需要将模式关闭!");
                    MessageBox.Show("没找到任务");
                    return;
                }
                var _AllowSimulateExecute_Rmark = this.tb_AllowSimulateExecute_Rmark.Text;
                if (string.IsNullOrEmpty(_AllowSimulateExecute_Rmark))
                var upiCode = task.Upi;
                var upiObj = wmsDB.mes_batchOrderUPI_new.Where(x => x.UPI == upiCode).FirstOrDefault();
                if (upiObj == null)
                {
                    MessageBox.Show("请输入取消原因说明!");
                    MessageBox.Show($"根据UPI:{upiCode}没有找到对象 ");
                    return;
                }
                var myNotext = "人工取消任务,原因:" + _AllowSimulateExecute_Rmark;
                MessageBoxButtons messButton = MessageBoxButtons.OKCancel;
                DialogResult dr = MessageBox.Show("【取消任务只是将状态变更为取消,并不处理库存,请谨慎操作。确认取消后,还需人工校验下该任务库存是否正确!】,确定要取消任务吗?", "提示", messButton);
                if (dr == DialogResult.OK)//如果点击“确定”按钮
                //增加库存
                wms_stock_quan qun = new wms_stock_quan()
                {
                    using (DbModel context = new DbModel())
                    {
                        var row = dgvPartTask.SelectedRows;
                    Id = Yitter.IdGenerator.YitIdHelper.NextId(),
                    Shelf = upiObj.Shelf,
                    Upi = upiCode,
                    PlanNo = task.PlanNo,
                    DetailName = upiObj.DetailName,
                    OrderId = task.OrderId,
                    CreateTime = DateTime.Now,
                    CreateUserName = SysGloble.WCSSystem,
                    InTime = DateTime.Now,
                    OperReason = "入库",
                    PackageCode = task.PackageCode,
                    Length = task.Length,
                    Width = task.Width,
                    Thk = task.Thk,
                    PlaceCode = task.PlaceCode,
                    StockStatus = (int)StockStatusEnum.在库,
                    StockStatusName = StockStatusEnum.在库.ToString(),
                        if (row.Count > 0)
                        {
                            var cell = row[0].Cells;
                            //var id = cell[0].Value.ToString();
                            var id = cell["Id"].Value.ToString();
                            var partTask = context.Task_Part.FirstOrDefault(x => x.Id == id);
                            if (partTask != null)
                            {
                                //找到主任务
                                var mainTask = context.Task_Main.Where(x => x.Id == partTask.MainTaskId).FirstOrDefault();
                                if (mainTask == null)
                                {
                                    MessageBox.Show("未找到该任务的主任务!");
                                    return;
                                }
                                //找另一个partTask
                                var partTask2 = context.Task_Part.FirstOrDefault(x => x.Id != partTask.Id && x.MainTaskId == mainTask.Id);
                };
                wmsDB.wms_stock_quan.Add(qun);
                                var mainTaskType = (MainTaskTypeEnum)Enum.Parse(typeof(MainTaskTypeEnum), mainTask.TaskType.ToString());
                                var partTaskType = (DeviceTaskTypeEnum)Enum.Parse(typeof(DeviceTaskTypeEnum), partTask.TaskType.ToString());
                                switch (partTaskType)
                                {
                                    case DeviceTaskTypeEnum.组盘入库:
                                        //判断库存现在在哪里,然后删掉他
                                        var store = context.V_AllStore.Where(x => x.SerialNumber == mainTask.SerialNumber).FirstOrDefault();
                                        if (store != null)
                                        {
                                            var place = context.Base_Station.Where(x => x.Id == store.StationId).First();
                                            StoreHandler.ClearStockByPlaceId(context, place, "人工取消任务");
                                        }
                                        //解绑起点和终点
                                        var place1 = context.Base_Station.Where(x => x.Id == partTask2.SourcePlace).First();
                                        var place2 = context.Base_Station.Where(x => x.Id == partTask2.ToPlace).First();
                                        StationHandler.SetPlaceLockStatus(false, SysGloble.WCSSystem, ref place1, myNotext);
                                        StationHandler.SetPlaceTaskDoingStatus(false, SysGloble.WCSSystem, ref place1, myNotext);
                                        StationHandler.SetPlaceLockStatus(false, SysGloble.WCSSystem, ref place2, myNotext);
                                        StationHandler.SetPlaceTaskDoingStatus(false, SysGloble.WCSSystem, ref place2, myNotext);
                                        var place3 = context.Base_Station.Where(x => x.Id == partTask.SourcePlace).First();
                                        var place4 = context.Base_Station.Where(x => x.Id == partTask.ToPlace).First();
                                        StationHandler.SetPlaceLockStatus(false, SysGloble.WCSSystem, ref place3, myNotext);
                                        StationHandler.SetPlaceTaskDoingStatus(false, SysGloble.WCSSystem, ref place3, myNotext);
                                        StationHandler.SetPlaceLockStatus(false, SysGloble.WCSSystem, ref place4, myNotext);
                                        StationHandler.SetPlaceTaskDoingStatus(false, SysGloble.WCSSystem, ref place4, myNotext);
                                        //判断堆垛机上现在是否正在执行该任务,如果执行了,就删掉他
                                        var srmPlcTaskId = "";
                                        int deviceId = 0;
                                        if (partTask.DeviceType == (int)(EDeviceType.堆垛机))
                                        {
                                            srmPlcTaskId = partTask.PlcTaskId;
                                            deviceId = (int)partTask.DeviceId;
                                        }
                                        else if (partTask2.DeviceType == (int)(EDeviceType.堆垛机))
                                        {
                                            srmPlcTaskId = partTask2.PlcTaskId;
                                            deviceId = (int)partTask2.DeviceId;
                                        }
                                        if (srmViewDict[deviceId].R_TaskNo.ToString() == srmPlcTaskId)
                                        {//删除堆垛机任务
                                            using (SrmService.SrmServiceClient opcClinet = new SrmServiceClient())
                                            {
                                                var result = opcClinet.SendSrmDelete((int)deviceId);
                                                if (result.result == false)
                                                {
                                                    MessageBox.Show("删除堆垛机任务失败:" + result.resMsg);
                                                    return;
                                                }
                                            }
                                        }
                                        break;
                                    default:
                                        MessageBox.Show("不支持的业务类型");
                                        return;
                                }
                                var changeState = DeviceTaskStatusEnum.已取消;
                                partTask.TaskState = (int)changeState;
                                partTask.TaskStateName = changeState.ToString();
                                partTask.ModifyTime = DateTime.Now;
                                partTask.OperationRemark = "用户取消任务," + _AllowSimulateExecute_Rmark;
                                partTask.ModifyBy = SysGloble.WCSSystem;
                                if (partTask2 != null)
                                {
                                    partTask2.TaskState = (int)changeState;
                                    partTask2.TaskStateName = changeState.ToString();
                                    partTask2.ModifyTime = DateTime.Now;
                                    partTask2.OperationRemark = "用户取消任务," + _AllowSimulateExecute_Rmark;
                                    partTask2.ModifyBy = SysGloble.WCSSystem;
                                }
                                //主任务也要修改为取消
                                mainTask.TaskState = (int)MainTaskStatusEnum.已取消;
                                mainTask.TaskStateName = MainTaskStatusEnum.已取消.ToString();
                                mainTask.FinishTime = DateTime.Now;
                                mainTask.OperationRemark = "用户取消任务," + _AllowSimulateExecute_Rmark;
                task.TaskStatus = (int)TaskStatusEnum.已完成;
                task.FinishedTime = DateTime.Now;
                                //同时将目标点和起点解除锁定
                                //我想了想,还是别解锁了,万一有别的问题呢?
                var place = StationHandler.GetPlaceByPlaceCode(task.PlaceCode, wmsDB);
                place.PlaceStatus = (int)PlaceStatusEnum.正常;
                                //保存人工处理日志 [EditBy shaocx,2022-05-01]
                                Base_PersonHandlerRecord record = new Base_PersonHandlerRecord()
                                {
                                    MainTaskNo = partTask.MainTaskNo,
                                    HandlerType = "取消任务",
                                    PartTaskId = partTask.Id,
                                    PlcTaskId = partTask.PlcTaskId,
                                    RealSourcePlace = partTask.RealSourcePlace,
                                    RealToPlace = partTask.RealToPlace,
                                    SalverCode = partTask.SalverCode,
                                    SerialNumber = partTask.SerialNumber,
                                    OrderNo = partTask.OrderNo,
                                    TaskTypeName = partTask.TaskTypeName,
                                    Qty = partTask.Qty,
                                    ManualHandlerRemark = _AllowSimulateExecute_Rmark
                WmsRecordUpiProcessHandler.SaveWmsRecordUpiProcess(wmsDB, upiObj, task.PlaceCode, "缓存入库完成:" + task.PlaceCode);
                                };
                                PersonHandlerRecordHandler.SavePersonHandlerRecord(context, record);
                                context.SaveChanges();
                            }
                            else
                            {
                                MessageBox.Show("未找到该任务!");
                                return;
                            }
                            MessageBox.Show("取消任务成功!");
                            BindData();
                        }
                        else
                        {
                            MessageBox.Show("请先选中要执行的行!");
                        }
                    }
                }
                else//如果点击“取消”按钮
                {
                }
                wmsDB.SaveChanges();
            }
            catch (Exception ex)
            if (!string.IsNullOrEmpty(alertMsg))
            {
                MessageBox.Show("取消任务异常:" + ex.Message);
                Log4NetHelper.WriteErrorLog(iWareCommon.Utils.LogType.CCWCFService, "取消任务异常:" + ex.Message, ex);
                MessageBox.Show("错误:" + alertMsg);
            }
        }
        private void btnReset_Click_1(object sender, EventArgs e)
        {
            //任务重发
            try
            else
            {
                var _AllowSimulateExecute_Rmark = this.tb_AllowSimulateExecute_Rmark.Text;
                if (string.IsNullOrEmpty(_AllowSimulateExecute_Rmark))
                {
                    MessageBox.Show("请输入任务重发原因说明!");
                    return;
                }
                if (SystemValue.isStartedModel)
                {
                    WZ.Useful.Commons.MessageUtil.ShowError("手动发任务,需要将模式关闭!");
                    return;
                }
                MessageBoxButtons messButton = MessageBoxButtons.OKCancel;
                using (DbModel db = new DbModel())
                {
                    var row = dgvPartTask.SelectedRows;
                    if (row.Count > 0)
                    {
                        var cell = row[0].Cells;
                        //var id = cell[0].Value.ToString();
                        var id = cell["Id"].Value.ToString();
                        var task = db.Task_Part.FirstOrDefault(x => x.Id == id);
                        if (task != null)
                        {
                            if (task.TaskState != (int)DeviceTaskStatusEnum.已下发)
                            {//增加限制 【Editby shaocx,2022-11-04】
                                WZ.Useful.Commons.MessageUtil.ShowError("任务状态必须是'已下发'才能重试发任务!");
                                return;
                            }
                            //判断设备类型
                            DialogResult dr = MessageBox.Show(string.Format("确定要手动重新发送{0}任务,起点:{1},目标点:{2}吗?", task.DeviceName, task.RealSourcePlace, task.RealToPlace), "提示", messButton);
                            if (dr == DialogResult.OK)//如果点击“确定”按钮
                            {
                                var sourcePlce = task.RealSourcePlace;
                                var toPlace = task.RealToPlace;
                                var tbTaskId = task.PlcTaskId;
                                EDeviceType deviceType = (EDeviceType)Enum.Parse(typeof(EDeviceType), task.DeviceType.ToString());
                                switch (deviceType)
                                {
                                    case EDeviceType.堆垛机:
                                        using (var opcClinet = new SrmService.SrmServiceClient())
                                        {
                                            iWareCC.SrmService.SdaResEntity sdaResult = opcClinet.SendSrmTask((int)task.DeviceId, int.Parse(tbTaskId),
                                                sourcePlce, toPlace, (short)ESrmCmd.库内搬运);
                                            if (sdaResult.result)
                                            {
                                                WZ.Useful.Commons.MessageUtil.ShowTips(task.DeviceName + ESrmCmd.库内搬运.ToString() + "命令发送成功!");
                                            }
                                            else
                                            {
                                                WZ.Useful.Commons.MessageUtil.ShowError(task.DeviceName + ESrmCmd.库内搬运.ToString() + "命令发送失败!返回代码:" + sdaResult.resMsg);
                                            }
                                        }
                                        break;
                                    case EDeviceType.RGV:
                                        using (var opcClinet = new RgvService.RgvServiceClient())
                                        {
                                            if (sourcePlce == "1010")
                                            {
                                                WZ.Useful.Commons.MessageUtil.ShowError("站点1010不能发任务!");
                                                return;
                                            }
                                            iWareCC.RgvService.SdaResEntity sdaResult = opcClinet.SendRgvTask((int)EDevice.RGV, Convert.ToInt32(tbTaskId), sourcePlce, toPlace);
                                            if (sdaResult.result)
                                            {
                                                WZ.Useful.Commons.MessageUtil.ShowTips("RGV命令发送成功!");
                                            }
                                            else
                                            {
                                                WZ.Useful.Commons.MessageUtil.ShowError("RGV命令发送失败!返回消息:" + sdaResult.resMsg);
                                            }
                                        }
                                        break;
                                }
                            }
                            else//如果点击“取消”按钮
                            {
                                return;
                            }
                        }
                        else
                        {
                            MessageBox.Show("未找到该任务!");
                            return;
                        }
                        using (DbModel context = new DbModel())
                        {
                            //保存人工处理日志 [EditBy shaocx,2022-05-01]
                            Base_PersonHandlerRecord record = new Base_PersonHandlerRecord()
                            {
                                MainTaskNo = task.MainTaskNo,
                                HandlerType = "任务重发",
                                PartTaskId = task.Id,
                                PlcTaskId = task.PlcTaskId,
                                RealSourcePlace = task.RealSourcePlace,
                                RealToPlace = task.RealToPlace,
                                SalverCode = task.SalverCode,
                                SerialNumber = task.SerialNumber,
                                OrderNo = task.OrderNo,
                                TaskTypeName = task.TaskTypeName,
                                Qty = task.Qty,
                                ManualHandlerRemark = _AllowSimulateExecute_Rmark
                            };
                            PersonHandlerRecordHandler.SavePersonHandlerRecord(context, record);
                            context.SaveChanges();
                        }
                        MessageBox.Show("任务重发成功!");
                        BindData();
                    }
                    else
                    {
                        MessageBox.Show("请先选中要执行的行!");
                    }
                }
                MessageBox.Show("已处理");
            }
            catch (Exception ex)
        }
        private void button2_Click(object sender, EventArgs e)
        {
            //更新库存表中的次序字段
            var alertMsg = "";
            using (WmsDBModel db = new WmsDBModel())
            {
                MessageBox.Show("任务重发出现异常:" + ex.Message);
            }
        }
                //查询立体库中的upi列表
                var quanList = db.wms_stock_quan.ToList();
                var query_quanList = quanList.Select(x => x.Upi).ToList();
                var upiList = db.mes_batchOrderUPI_new.Where(x => query_quanList.Contains(x.UPI)).ToList();
                foreach (var item in quanList)
                {
                    var _shelf = upiList.Find(x => x.UPI == item.Upi);
                    item.Shelf = _shelf.Shelf;
                }
        /// <summary>
        /// 关闭1015重新扫描
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            using (var opcClinet = new RgvService.RgvServiceClient())
                db.SaveChanges();
            }
            if (!string.IsNullOrEmpty(alertMsg))
            {
                iWareCC.RgvService.SdaResEntity sdaResult = opcClinet.Write1015ReScan((int)EDevice.RGV, false);
                if (sdaResult.result)
                {
                    WZ.Useful.Commons.MessageUtil.ShowTips("关闭命令发送成功!");
                }
                else
                {
                    WZ.Useful.Commons.MessageUtil.ShowError("关闭命令发送失败!返回消息:" + sdaResult.resMsg);
                }
                MessageBox.Show("错误:" + alertMsg);
            }
        }
        /// <summary>
        /// 关闭1019重新扫描
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button21_Click(object sender, EventArgs e)
        {
            using (var opcClinet = new RgvService.RgvServiceClient())
            else
            {
                iWareCC.RgvService.SdaResEntity sdaResult = opcClinet.Write1019ReScan((int)EDevice.RGV, false);
                if (sdaResult.result)
                {
                    WZ.Useful.Commons.MessageUtil.ShowTips("关闭命令发送成功!");
                }
                else
                {
                    WZ.Useful.Commons.MessageUtil.ShowError("关闭命令发送失败!返回消息:" + sdaResult.resMsg);
                }
                MessageBox.Show("已处理");
            }
        }
        private void dgvPartTask_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            SolidBrush b = new SolidBrush(this.dgvPartTask.RowHeadersDefaultCellStyle.ForeColor);
            e.Graphics.DrawString((e.RowIndex + 1).ToString(System.Globalization.CultureInfo.CurrentUICulture), this.dgvPartTask.DefaultCellStyle.Font, b, e.RowBounds.Location.X + 20, e.RowBounds.Location.Y + 4);
        }
        private void label3_Click(object sender, EventArgs e)
        {
        }
        private void panel_DeviceTaskList_Paint(object sender, PaintEventArgs e)
        {
        }
        private void button5_Click(object sender, EventArgs e)
        {
            if (SystemValue.isStartedModel)
            {
                WZ.Useful.Commons.MessageUtil.ShowError("手动库位维护,需要将模式关闭!");
                return;
            }
            //手动库位维护
            SrmStockForm frm = new SrmStockForm();
            frm.ShowDialog();
        }
        private void button7_Click(object sender, EventArgs e)
        {
            //查询RGV&输送线库存
            dataGridView_RgvStore.AutoGenerateColumns = false;
            for (int i = 0; i < dataGridView_RgvStore.Columns.Count; i++)
            {
                if (i == (dataGridView_RgvStore.Columns.Count - 1))
                {//最后一列填充
                    dataGridView_RgvStore.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                }
                else
                {//其他列自动适应宽度
                    dataGridView_RgvStore.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                }
            }
            BindDataForRgvStore();
            //this.dgvPartTask.Columns["CreateTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["IssueTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["FinishTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["AllowSimulateExecute_Time"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            FormHelper.DataGridViewSelfAdaptionWidth(this.dataGridView_RgvStore);
        }
        public void BindDataForRgvStore()
        {
            dataGridView_RgvStore.ClearSelection();   //可消除所有选择的行
            dataGridView_RgvStore.DataSource = null;
            dataGridView_RgvStore.CurrentCell = null; //可消除选择行的行头箭头
            using (DbModel db = new DbModel())
            {
                var storeList = db.V_AllStationStore.Where(x => x.IsRgvStation == true).ToList();
                if (storeList != null && storeList.Count > 0)
                {
                    storeList = storeList.OrderBy(x => x.RgvStationCode).ToList();//重新 升序排序
                    dataGridView_RgvStore.DataSource = null;
                    dataGridView_RgvStore.DataSource = storeList;
                }
                else
                {
                    //if (dataGridView_RgvStore.Rows.Count > 0)
                    //{
                    //    int i = dataGridView_RgvStore.Rows[0].Cells.Count;
                    //    var cells = dataGridView_RgvStore.Rows[0].Cells;
                    //    for (int j = 0; j < i; j++)
                    //    {
                    //        cells[j].Value = null;
                    //    }
                    //}
                }
            }
        }
        private void dataGridView_RgvStore_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            SolidBrush b = new SolidBrush(this.dataGridView_RgvStore.RowHeadersDefaultCellStyle.ForeColor);
            e.Graphics.DrawString((e.RowIndex + 1).ToString(System.Globalization.CultureInfo.CurrentUICulture), this.dataGridView_RgvStore.DefaultCellStyle.Font, b, e.RowBounds.Location.X + 20, e.RowBounds.Location.Y + 4);
        }
        private void btn_RgvConfirmFinishTask_Click(object sender, EventArgs e)
        {
            if (SystemValue.isStartedModel)
            {
                WZ.Useful.Commons.MessageUtil.ShowError("手动RGV任务完成确认,需要将模式关闭!");
                return;
            }
            MessageBoxButtons messButton = MessageBoxButtons.OKCancel;
            DialogResult dr = MessageBox.Show("确定要发送任务完成确认吗?", "确认", messButton);
            if (dr == DialogResult.OK)//如果点击“确定”按钮
            {
                try
                {
                    //读取1040上的任务号
                    int taskId = 0;
                    var queryRgv = ((int)EDevice.RGV1040).ToString();
                    var rgv = rgvView.R_RgvForReadCommList.Where(x => x.StationCode == queryRgv).FirstOrDefault();
                    if (rgv != null)
                    {
                        taskId = rgv.R_TaskID;
                    }
                    using (var opcClinet = new RgvService.RgvServiceClient())
                    {
                        //if (!IsNumeric(tBSrmTransTskId.Text.Trim()))
                        //{
                        //    WZ.Useful.Commons.MessageUtil.ShowError("任务号格式错误,必须是数字!");
                        //    return;
                        //}
                        //var taskId = int.Parse(tBSrmTransTskId.Text.Trim());
                        iWareCC.RgvService.SdaResEntity sdaResult = opcClinet.WriteRGV_FinishACK((int)EDevice.RGV, true, taskId);
                        if (sdaResult.result)
                        {
                            WZ.Useful.Commons.MessageUtil.ShowTips("命令发送成功!");
                            //  tB_Srm1SourcePlace.Clear();
                            // tB_Srm1ToPlace.Clear();
                            Log4NetHelper.WriteInfoLog(iWareCommon.Utils.LogType.CCWCFService, "手动RGV任务确认成功,任务号:" + taskId);
                        }
                        else
                        {
                            WZ.Useful.Commons.MessageUtil.ShowError("命令发送失败!返回消息:" + sdaResult.resMsg);
                            Log4NetHelper.WriteErrorLog(iWareCommon.Utils.LogType.CCWCFService, "手动RGV任务确认失败:" + sdaResult.resMsg + ",任务号:" + taskId);
                        }
                    }
                }
                catch (Exception ex)
                {
                    WZ.Useful.Commons.MessageUtil.ShowError("命令发送出现异常:" + ex.Message);
                    Log4NetHelper.WriteErrorLog(iWareCommon.Utils.LogType.CCWCFService, "手动RGV任务确认异常:" + ex.Message, ex);
                }
            }
            else//如果点击“取消”按钮
            {
            }
        }
        //查询已完成的设备任务
        private void button17_Click(object sender, EventArgs e)
        {
            //查询设备任务列表
            dgvPartTask_Finished.AutoGenerateColumns = false;
            for (int i = 0; i < dgvPartTask_Finished.Columns.Count; i++)
            {
                if (i == (dgvPartTask_Finished.Columns.Count - 1))
                {//最后一列填充
                    dgvPartTask_Finished.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                }
                else
                {//其他列自动适应宽度
                    dgvPartTask_Finished.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                }
            }
            BindData_dgvPartTask_Finished();
            //this.dgvPartTask.Columns["CreateTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["IssueTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["FinishTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["AllowSimulateExecute_Time"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            FormHelper.DataGridViewSelfAdaptionWidth(this.dgvPartTask_Finished);
        }
        public void BindData_dgvPartTask_Finished()
        {
            List<Task_Part> partList = new List<Task_Part>();
            dgvPartTask_Finished.ClearSelection();   //可消除所有选择的行
            dgvPartTask_Finished.DataSource = null;
            dgvPartTask_Finished.CurrentCell = null; //可消除选择行的行头箭头
            var query_plc_taskNo = this.tb_Query_PlcTaskNo.Text.Trim();
            var query_Salver = this.tb_query_Salver.Text.Trim();
            //取 最后一个未结束的任务,然后取前5条已经结束的任务
            var queryState1 = (int)MainTaskStatusEnum.已取消;
            var queryState2 = (int)MainTaskStatusEnum.已完成;
            using (DbModel db = new DbModel())
            {
                List<Task_Main> firstNoFinishedTaskList = new List<Task_Main>();
                if (!string.IsNullOrEmpty(query_plc_taskNo) || !string.IsNullOrEmpty(query_Salver))
                {
                    Expression<Func<Task_Part, bool>> predicate_plc_taskno = a => 1 == 1;
                    Expression<Func<Task_Part, bool>> predicate_query_Salver = a => 1 == 1;
                    if (!string.IsNullOrEmpty(query_plc_taskNo))
                    {
                        predicate_plc_taskno = a => a.PlcTaskId == query_plc_taskNo;
                    }
                    if (!string.IsNullOrEmpty(query_Salver))
                    {
                        predicate_query_Salver = a => a.SalverCode == query_Salver;
                    }
                    partList = db.Task_Part.Where(predicate_plc_taskno).Where(predicate_query_Salver).ToList();
                }
                else
                {
                    //增加 显示 ,最近已完成的任务,要 最近30个任务 【Editby shaocx,2023-04-03】
                    firstNoFinishedTaskList = db.Task_Main.Where(x =>
               (x.TaskState == queryState1 || x.TaskState == queryState2)
               ).OrderByDescending(x => x.CreateTime).Take(30).ToList();
                    if (firstNoFinishedTaskList == null)
                    {
                        partList = new List<Task_Part>();
                    }
                    else
                    {
                        List<int> mainIdList = new List<int>();
                        foreach (var item in firstNoFinishedTaskList)
                        {
                            if (!mainIdList.Contains(item.Id))
                            {
                                mainIdList.Add(item.Id);
                            }
                        }
                        var partList2 = db.Task_Part.Where(x => mainIdList.Contains(x.MainTaskId)).ToList();
                        //partList.AddRange(partList1);
                        partList.AddRange(partList2);
                    }
                }
                if (partList != null && partList.Count > 0)
                {
                    partList = partList.OrderBy(x => x.MainTaskId).ThenByDescending(x => x.CreateTime).ToList();//重新 升序排序
                    dgvPartTask_Finished.DataSource = null;
                    dgvPartTask_Finished.DataSource = partList;
                }
                else
                {
                    //if (dgvPartTask_Finished.Rows.Count > 0)
                    //{
                    //    int i = dgvPartTask_Finished.Rows[0].Cells.Count;
                    //    var cells = dgvPartTask_Finished.Rows[0].Cells;
                    //    for (int j = 0; j < i; j++)
                    //    {
                    //        cells[j].Value = null;
                    //    }
                    //}
                }
            }
        }
        private void button18_Click(object sender, EventArgs e)
        {
            //查询设备任务列表
            dataGridView__OutTaskList.AutoGenerateColumns = false;
            for (int i = 0; i < dataGridView__OutTaskList.Columns.Count; i++)
            {
                if (i == (dataGridView__OutTaskList.Columns.Count - 1))
                {//最后一列填充
                    dataGridView__OutTaskList.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                }
                else
                {//其他列自动适应宽度
                    dataGridView__OutTaskList.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                }
            }
            BindData_OutTaskList();
            //this.dgvPartTask.Columns["CreateTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["IssueTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["FinishTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["AllowSimulateExecute_Time"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            FormHelper.DataGridViewSelfAdaptionWidth(this.dataGridView__OutTaskList);
        }
        public void BindData_OutTaskList()
        {
            List<Task_Main> mainList = new List<Task_Main>();
            dataGridView__OutTaskList.ClearSelection();   //可消除所有选择的行
            dataGridView__OutTaskList.DataSource = null;
            dataGridView__OutTaskList.CurrentCell = null; //可消除选择行的行头箭头
            using (DbModel db = new DbModel())
            {
                var queryState1 = (int)MainTaskStatusEnum.已取消;
                var queryState2 = (int)MainTaskStatusEnum.已完成;
                var queryInOutFlag = (int)MainInOutFlagEnum.出库;
                mainList = db.Task_Main.Where(x => x.TaskState != queryState1 && x.TaskState != queryState2
                   && x.InOutFlag == queryInOutFlag
                   ).OrderBy(x => x.TaskSequence).ThenBy(x => x.CreateTime).ToList();
                if (mainList != null && mainList.Count > 0)
                {
                    dataGridView__OutTaskList.DataSource = null;
                    dataGridView__OutTaskList.DataSource = mainList;
                }
                else
                {
                    //if (dataGridView__OutTaskList.Rows.Count > 0)
                    //{
                    //    int i = dataGridView__OutTaskList.Rows[0].Cells.Count;
                    //    var cells = dataGridView__OutTaskList.Rows[0].Cells;
                    //    for (int j = 0; j < i; j++)
                    //    {
                    //        cells[j].Value = null;
                    //    }
                    //}
                }
            }
        }
        private void panel_DeviceTaskList_dgvPartTask_Finished_Paint(object sender, PaintEventArgs e)
        {
        }
        private void btn_TongJi_Click(object sender, EventArgs e)
        {
            //统计
            int store_FDJ = 0;//现有发动机数
            int store_EmptySalver = 0;//空托盘数量
            int store_EmptySalver_TS = 0;//空托盘托数
            int count_In_FDJ = 0;//查询某天入库了多少发动机
            int count_In_EmptySalver = 0;//查询某天入库了多少 空托盘
            int count_In_EmptySalver_TS = 0;//查询某天入库了多少 空托盘托数
            int count_Out_FDJ = 0;//查询某天出库了多少发动机
            int count_Out_EmptySalver = 0;//查询某天出库了多少 空托盘
            int count_Out_EmptySalver_TS = 0;//查询某天出库了多少 空托盘托数
            int count_ZY_EmptySalver = 0;//查询某天转运了多少 空托盘
            int count_ZY_EmptySalver_TS = 0;//查询某天转运了多少 空托盘托数
            //某段时间的统计
            var str_start = this.dateTimePicker_Start.Value.ToString("yyyy-MM-dd" + " " + "00:00:00");
            var str_end = this.dateTimePicker_End.Value.ToString("yyyy-MM-dd" + " " + "23:59:59");
            var start = Convert.ToDateTime(str_start);
            var end = Convert.ToDateTime(str_end);
            int allPlacesCount = 0;
            using (DbModel edm = new DbModel())
            {
                var queryMaterialType_一般物料 = (int)MaterialTypeEnum.一般物料;
                var queryMaterialType_托盘 = (int)MaterialTypeEnum.托盘;
                var queryInOutFlag_In = (int)MainInOutFlagEnum.入库;
                var queryInOutFlag_Out = (int)MainInOutFlagEnum.出库;
                var queryInOutFlag_ZY = (int)MainInOutFlagEnum.转运;
                var allPlaces = edm.Base_Station.Where(x => x.IsSrmStation == true).ToList();
                allPlaces = StationHandler.FindCommonFilter(allPlaces);
                allPlacesCount = allPlaces.Count;
                store_FDJ = edm.V_Store.Where(x => x.MaterialType == queryMaterialType_一般物料).Count();
                store_EmptySalver_TS = edm.V_Store.Where(x => x.MaterialType == queryMaterialType_托盘).Count();
                store_EmptySalver = store_EmptySalver_TS == 0 ? 0 : edm.V_Store.Where(x => x.MaterialType == queryMaterialType_托盘).Sum(x => (int)x.Qty);
                //查询某天入库了多少发动机
                var taskState = (int)MainTaskStatusEnum.已完成;
                count_In_FDJ = edm.Task_Main.Where(x => x.MaterialType == queryMaterialType_一般物料 && x.InOutFlag == queryInOutFlag_In && x.TaskState == taskState && (x.FinishTime >= start && x.FinishTime <= end)).Count();
                //查询某天入库了多少托盘
                count_In_EmptySalver_TS = edm.Task_Main.Where(x => x.MaterialType == queryMaterialType_托盘 && x.InOutFlag == queryInOutFlag_In && x.TaskState == taskState && (x.FinishTime >= start && x.FinishTime <= end)).Count();
                count_In_EmptySalver = count_In_EmptySalver_TS == 0 ? 0 : edm.Task_Main.Where(x => x.MaterialType == queryMaterialType_托盘 && x.InOutFlag == queryInOutFlag_In && x.TaskState == taskState && (x.FinishTime >= start && x.FinishTime <= end)).Sum(x => (int)x.Qty);
                //查询某天出库了多少发动机
                count_Out_FDJ = edm.Task_Main.Where(x => x.MaterialType == queryMaterialType_一般物料 && x.InOutFlag == queryInOutFlag_Out && x.TaskState == taskState && (x.FinishTime >= start && x.FinishTime <= end)).Count();
                //查询某天入库了多少托盘
                count_Out_EmptySalver_TS = edm.Task_Main.Where(x => x.MaterialType == queryMaterialType_托盘 && x.InOutFlag == queryInOutFlag_Out && x.TaskState == taskState && (x.FinishTime >= start && x.FinishTime <= end)).Count();
                count_Out_EmptySalver = count_Out_EmptySalver_TS == 0 ? 0 : edm.Task_Main.Where(x => x.MaterialType == queryMaterialType_托盘 && x.InOutFlag == queryInOutFlag_Out && x.TaskState == taskState && (x.FinishTime >= start && x.FinishTime <= end)).Sum(x => (int)x.Qty);
                //查询某天转运了多少托盘(注意:只查询去1014位置的)
                count_ZY_EmptySalver_TS = edm.Task_Main.Where(x => x.MaterialType == queryMaterialType_托盘 && x.InOutFlag == queryInOutFlag_ZY && x.TaskState == taskState && (x.FinishTime >= start && x.FinishTime <= end) && x.RealToPlace == "1014").Count();
                count_ZY_EmptySalver = count_ZY_EmptySalver_TS == 0 ? 0 : edm.Task_Main.Where(x => x.MaterialType == queryMaterialType_托盘 && x.InOutFlag == queryInOutFlag_ZY && x.TaskState == taskState && (x.FinishTime >= start && x.FinishTime <= end) && x.RealToPlace == "1014").Sum(x => (int)x.Qty);
            }
            //显示
            //var aa = "\r\n";
            var str = "";
            str += "时间范围: " + str_start + "至" + str_end + " \r\n";
            str += "==================【库存】========================= \r\n";
            str += "现有发动机数: " + store_FDJ + "  \r\n";
            str += "现有空托盘数: " + store_EmptySalver + " \r\n";
            str += "现有空托盘托数: " + store_EmptySalver_TS + " \r\n";
            str += "总库位" + allPlacesCount + ",有发动机或托盘库位" + (store_FDJ + store_EmptySalver_TS) + ",库存占比: " + CSharpHelper.ExecPercent((store_FDJ + store_EmptySalver_TS), allPlacesCount) + " \r\n";
            str += "\r\n";
            str += "==================【入库】========================= \r\n";
            str += "入库发动机数: " + count_In_FDJ + " \r\n";
            str += "入库空托盘数: " + count_In_EmptySalver + " \r\n";
            str += "入库空托盘托数: " + count_In_EmptySalver_TS + " \r\n";
            str += "\r\n";
            str += "==================【出库】========================= \r\n";
            str += "出库发动机数: " + count_Out_FDJ + " \r\n";
            str += "出库空托盘数: " + count_Out_EmptySalver + " \r\n";
            str += "出库空托盘托数: " + count_Out_EmptySalver_TS + " \r\n";
            str += "\r\n";
            str += "==================【转运托盘】========================= \r\n";
            str += "转运空托盘数: " + count_ZY_EmptySalver + " \r\n";
            str += "转运空托盘托数: " + count_ZY_EmptySalver_TS + " \r\n";
            str += "\r\n";
            this.tb_TongJi.Text = str;
        }
        private void checkBox_NowDay_CheckedChanged(object sender, EventArgs e)
        {
            if (this.checkBox_NowDay.Checked)
            {
                dateTimePicker_Start.Value = DateTime.Now;
                dateTimePicker_End.Value = DateTime.Now;
            }
        }
        private void rBOnlyIn_CheckedChanged(object sender, EventArgs e)
        {
            SetModelCheckBoxToSystemValue();
        }
        private void btnSMQZYZTG1_Click(object sender, EventArgs e)
        {
            DobtnSMQZYZTG(EDevice.一号堆垛机);
        }
        private void DobtnSMQZYZTG(EDevice device)
        {
            MessageBoxButtons messButton = MessageBoxButtons.OKCancel;
            DialogResult dr = MessageBox.Show("注意:入库口扫码强制验证通过功能,仅适用于扫码器没有扫到码,但是实际托盘码和堆垛机要执行的任务托盘码一致的情况!如果堆垛机要执行的任务跟实际托盘码不符,请不要点击该按钮,及时联系管理员过来处理。您确定要操作吗?", "确认", messButton);
            if (dr == DialogResult.OK)//如果点击“确定”按钮
            {
                var stationCode = MyExtendHelper.GetRgvStationCodeBySrm(device);
                var srm = FormCC.srmViewDict[(int)device];
                //只有当堆垛机有任务执行时,并且是入库任务的时候才判断
                var realSrmSourcePlace = (int)device + "-" + srm.SrmSourcePlace;
                if (srm.R_TaskNo > 0 && (srm.R_State == (int)ESrmState.取货中 || srm.R_State == (int)ESrmState.取货定位中)
                   && SysGloble.Dict_SpecialPlace_IN.ContainsKey(realSrmSourcePlace))
                {
                    var result = MyExtendHelper.WriteScanValidateACK(false, "入库口扫码强制验证通过", stationCode, srm.R_TaskNo, true, "", "");
                    if (result)
                    {
                        MyExtendHelper.SetSrm_IN_SMQZYZTG(device, true);
                        MessageBox.Show("入库口扫码强制验证通过 成功!");
                    }
                    else
                    {
                        MessageBox.Show("入库口扫码强制验证通过 失败!");
                    }
                }
                else
                {
                    MessageBox.Show(device.ToString() + "任务号不是大于0,或者 状态不是 '取货中'或'取货定位中',不允许操作");
                }
            }
            else//如果点击“取消”按钮
            {
            }
        }
        private void btnSMQZYZTG4_Click(object sender, EventArgs e)
        {
            DobtnSMQZYZTG(EDevice.四号堆垛机);
        }
        private void btnSMQZYZTG3_Click(object sender, EventArgs e)
        {
            DobtnSMQZYZTG(EDevice.三号堆垛机);
        }
        private void btnSMQZYZTG2_Click(object sender, EventArgs e)
        {
            DobtnSMQZYZTG(EDevice.二号堆垛机);
        }
        private void btn_WaitPlanDetail_Click(object sender, EventArgs e)
        {
            //查询设备任务列表
            dataGridView_WaitPlanDetail.AutoGenerateColumns = false;
            for (int i = 0; i < dataGridView_WaitPlanDetail.Columns.Count; i++)
            {
                if (i == (dataGridView_WaitPlanDetail.Columns.Count - 1))
                {//最后一列填充
                    dataGridView_WaitPlanDetail.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                }
                else
                {//其他列自动适应宽度
                    dataGridView_WaitPlanDetail.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                }
            }
            BindData_WaitPlanDetail();
            //this.dgvPartTask.Columns["CreateTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["IssueTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["FinishTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["AllowSimulateExecute_Time"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            FormHelper.DataGridViewSelfAdaptionWidth(this.dataGridView_WaitPlanDetail);
        }
        public void BindData_WaitPlanDetail()
        {
            List<Plan_OutTaskDetail> mainList = new List<Plan_OutTaskDetail>();
            dataGridView_WaitPlanDetail.ClearSelection();   //可消除所有选择的行
            dataGridView_WaitPlanDetail.DataSource = null;
            dataGridView_WaitPlanDetail.CurrentCell = null; //可消除选择行的行头箭头
            using (DbModel db = new DbModel())
            {
                var queryState1 = (int)OutTaskDetailStateEnum.等待中;
                var queryState2 = (int)OutTaskDetailStateEnum.缺料;
                mainList = db.Plan_OutTaskDetail.Where(x => x.OutTaskDetailState == queryState1
                    || x.OutTaskDetailState == queryState2
                   ).OrderBy(x => x.TaskSequence).ThenBy(x => x.CreateTime).ToList();
                if (mainList != null && mainList.Count > 0)
                {
                    dataGridView_WaitPlanDetail.DataSource = null;
                    dataGridView_WaitPlanDetail.DataSource = mainList;
                }
                else
                {
                    //if (dataGridView__OutTaskList.Rows.Count > 0)
                    //{
                    //    int i = dataGridView__OutTaskList.Rows[0].Cells.Count;
                    //    var cells = dataGridView__OutTaskList.Rows[0].Cells;
                    //    for (int j = 0; j < i; j++)
                    //    {
                    //        cells[j].Value = null;
                    //    }
                    //}
                }
            }
        }
        private void btnDeleteTask_Click(object sender, EventArgs e)
        {
            //任务强制删除
            try
            {
                if (SystemValue.isStartedModel)
                {
                    WZ.Useful.Commons.MessageUtil.ShowError("手动任务强制删除,需要将模式关闭!");
                    return;
                }
                var _AllowSimulateExecute_Rmark = this.tb_AllowSimulateExecute_Rmark.Text;
                if (string.IsNullOrEmpty(_AllowSimulateExecute_Rmark))
                {
                    MessageBox.Show("请输入任务强制删除原因说明!");
                    return;
                }
                var myNotext = "人工任务强制删除任务,原因:" + _AllowSimulateExecute_Rmark;
                MessageBoxButtons messButton = MessageBoxButtons.OKCancel;
                DialogResult dr = MessageBox.Show("【任务强制删除,并不处理库存,请谨慎操作。确认任务强制删除后,还需人工校验下该任务库存是否正确!】,确定要任务强制删除吗?", "提示", messButton);
                if (dr == DialogResult.OK)//如果点击“确定”按钮
                {
                    using (DbModel context = new DbModel())
                    {
                        var row = dgvPartTask.SelectedRows;
                        if (row.Count > 0)
                        {
                            var cell = row[0].Cells;
                            //var id = cell[0].Value.ToString();
                            var id = cell["Id"].Value.ToString();
                            var partTask = context.Task_Part.FirstOrDefault(x => x.Id == id);
                            if (partTask != null)
                            {
                                //找到主任务
                                var mainTask = context.Task_Main.Where(x => x.Id == partTask.MainTaskId).FirstOrDefault();
                                if (mainTask == null)
                                {
                                    MessageBox.Show("未找到该任务的主任务!");
                                    return;
                                }
                                //找另一个partTask
                                var partTask2 = context.Task_Part.FirstOrDefault(x => x.Id != partTask.Id && x.MainTaskId == mainTask.Id);
                                if (partTask2 != null)
                                {
                                    //解绑起点和终点
                                    var place1 = context.Base_Station.Where(x => x.Id == partTask2.SourcePlace).First();
                                    var place2 = context.Base_Station.Where(x => x.Id == partTask2.ToPlace).First();
                                    StationHandler.SetPlaceLockStatus(false, SysGloble.WCSSystem, ref place1, myNotext);
                                    StationHandler.SetPlaceTaskDoingStatus(false, SysGloble.WCSSystem, ref place1, myNotext);
                                    StationHandler.SetPlaceLockStatus(false, SysGloble.WCSSystem, ref place2, myNotext);
                                    StationHandler.SetPlaceTaskDoingStatus(false, SysGloble.WCSSystem, ref place2, myNotext);
                                }
                                var place3 = context.Base_Station.Where(x => x.Id == partTask.SourcePlace).First();
                                var place4 = context.Base_Station.Where(x => x.Id == partTask.ToPlace).First();
                                StationHandler.SetPlaceLockStatus(false, SysGloble.WCSSystem, ref place3, myNotext);
                                StationHandler.SetPlaceTaskDoingStatus(false, SysGloble.WCSSystem, ref place3, myNotext);
                                StationHandler.SetPlaceLockStatus(false, SysGloble.WCSSystem, ref place4, myNotext);
                                StationHandler.SetPlaceTaskDoingStatus(false, SysGloble.WCSSystem, ref place4, myNotext);
                                //主任务也要修改为取消
                                mainTask.TaskState = (int)MainTaskStatusEnum.已取消;
                                mainTask.TaskStateName = MainTaskStatusEnum.已取消.ToString();
                                mainTask.FinishTime = DateTime.Now;
                                mainTask.OperationRemark = "用户任务强制删除," + _AllowSimulateExecute_Rmark;
                                if (partTask2 != null)
                                {
                                    context.Task_Part.Remove(partTask2);
                                }
                                context.Task_Part.Remove(partTask);
                                //保存人工处理日志 [EditBy shaocx,2022-05-01]
                                Base_PersonHandlerRecord record = new Base_PersonHandlerRecord()
                                {
                                    MainTaskNo = partTask.MainTaskNo,
                                    HandlerType = "任务强制删除",
                                    PartTaskId = partTask.Id,
                                    PlcTaskId = partTask.PlcTaskId,
                                    RealSourcePlace = partTask.RealSourcePlace,
                                    RealToPlace = partTask.RealToPlace,
                                    SalverCode = partTask.SalverCode,
                                    SerialNumber = partTask.SerialNumber,
                                    OrderNo = partTask.OrderNo,
                                    TaskTypeName = partTask.TaskTypeName,
                                    Qty = partTask.Qty,
                                    ManualHandlerRemark = _AllowSimulateExecute_Rmark
                                };
                                PersonHandlerRecordHandler.SavePersonHandlerRecord(context, record);
                                context.SaveChanges();
                            }
                            else
                            {
                                MessageBox.Show("未找到该任务!");
                                return;
                            }
                            MessageBox.Show("任务强制删除成功!");
                            BindData();
                        }
                        else
                        {
                            MessageBox.Show("请先选中要执行的行!");
                        }
                    }
                }
                else//如果点击“取消”按钮
                {
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("任务强制删除异常:" + ex.Message);
                Log4NetHelper.WriteErrorLog(iWareCommon.Utils.LogType.CCWCFService, "任务强制删除异常:" + ex.Message, ex);
            }
        }
        private void btn_Find_OutTaskRetryToMes_Click(object sender, EventArgs e)
        {
            //查询设备任务列表
            dg_OutTaskRetryToMes.AutoGenerateColumns = false;
            for (int i = 0; i < dg_OutTaskRetryToMes.Columns.Count; i++)
            {
                if (i == (dg_OutTaskRetryToMes.Columns.Count - 1))
                {//最后一列填充
                    dg_OutTaskRetryToMes.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                }
                else
                {//其他列自动适应宽度
                    dg_OutTaskRetryToMes.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
                }
            }
            BindData_OutTaskRetryToMesList();
            //this.dgvPartTask.Columns["CreateTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["IssueTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["FinishTime"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            //this.dgvPartTask.Columns["AllowSimulateExecute_Time"].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss";
            FormHelper.DataGridViewSelfAdaptionWidth(this.dg_OutTaskRetryToMes);
        }
        public void BindData_OutTaskRetryToMesList()
        {
            List<Task_Main> mainList = new List<Task_Main>();
            dg_OutTaskRetryToMes.ClearSelection();   //可消除所有选择的行
            dg_OutTaskRetryToMes.DataSource = null;
            dg_OutTaskRetryToMes.CurrentCell = null; //可消除选择行的行头箭头
            using (DbModel db = new DbModel())
            {
                mainList = db.Task_Main.Where(x => (x.IsNeedOnLine != null && x.IsNeedOnLine == true) && (x.IsOnLine == null || x.IsOnLine == false)).OrderBy(x => x.TaskSequence).ThenBy(x => x.CreateTime).ToList();
                if (mainList != null && mainList.Count > 0)
                {
                    dg_OutTaskRetryToMes.DataSource = null;
                    dg_OutTaskRetryToMes.DataSource = mainList;
                }
                else
                {
                    //if (dataGridView__OutTaskList.Rows.Count > 0)
                    //{
                    //    int i = dataGridView__OutTaskList.Rows[0].Cells.Count;
                    //    var cells = dataGridView__OutTaskList.Rows[0].Cells;
                    //    for (int j = 0; j < i; j++)
                    //    {
                    //        cells[j].Value = null;
                    //    }
                    //}
                }
            }
        }
        private void button19_Click(object sender, EventArgs e)
        {
            //重新通知MES出库
            try
            {
                if (SystemValue.isStartedModel)
                {
                    WZ.Useful.Commons.MessageUtil.ShowError("手动重新通知MES出库,需要将模式关闭!");
                    return;
                }
                MessageBoxButtons messButton = MessageBoxButtons.OKCancel;
                using (DbModel db = new DbModel())
                {
                    var row = dg_OutTaskRetryToMes.SelectedRows;
                    if (row.Count > 0)
                    {
                        var cell = row[0].Cells;
                        //var id = cell[0].Value.ToString();
                        var id = Convert.ToInt32(cell["MesId"].Value.ToString());
                        var task = db.Task_Main.FirstOrDefault(x => x.Id == id);
                        if (task != null)
                        {
                            //判断设备类型
                            DialogResult dr = MessageBox.Show(string.Format("确定要手动重新通知MES出库吗?序列号{0},订货号{1}", task.SerialNumber, task.OrderNo), "提示", messButton);
                            if (dr == DialogResult.OK)//如果点击“确定”按钮
                            {
                                MesRetModel<string> ret = MesService.updateOnlineStatusWithNoTask(task);
                                if (ret.code == 200)
                                {
                                    using (DbModel context = new DbModel())
                                    {
                                        //保存人工处理日志 [EditBy shaocx,2022-05-01]
                                        Base_PersonHandlerRecord record = new Base_PersonHandlerRecord()
                                        {
                                            MainTaskNo = task.TaskNo,
                                            HandlerType = "重新通知MES出库",
                                            PartTaskId = "",
                                            PlcTaskId = "",
                                            RealSourcePlace = task.RealSourcePlace,
                                            RealToPlace = task.RealToPlace,
                                            SalverCode = task.SalverCode,
                                            SerialNumber = task.SerialNumber,
                                            OrderNo = task.OrderNo,
                                            TaskTypeName = task.TaskTypeName,
                                            Qty = task.Qty,
                                            ManualHandlerRemark = "重新推送"
                                        };
                                        PersonHandlerRecordHandler.SavePersonHandlerRecord(context, record);
                                        context.SaveChanges();
                                    }
                                    MessageBox.Show("已重新给MES推送出库成功!");
                                    BindData();
                                }
                                else
                                {
                                    MessageBox.Show("已重新给MES推送出库失败!" + ret.msg);
                                    BindData();
                                }
                            }
                            else//如果点击“取消”按钮
                            {
                                return;
                            }
                        }
                        else
                        {
                            MessageBox.Show("未找到该任务!");
                            return;
                        }
                    }
                    else
                    {
                        MessageBox.Show("请先选中要执行的行!");
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("任务重发出现异常:" + ex.Message);
            }
        }
        private void panel_dg_OutTaskRetryToMes_Paint(object sender, PaintEventArgs e)
        {
        }
        private void btn_1019_Click(object sender, EventArgs e)
        {
            CommmonShowAgvStation(sender);
        }
        private void button22_Click(object sender, EventArgs e)
        {
            var cargNo = this.tb_wlm.Text.Trim();
            var ret = WmsRequestHelper.test_getEngineInfo(cargNo);
            //转换后
            MesRetModel2<MesRetProductModel> retModel = JsonConvert.DeserializeObject<MesRetModel2<MesRetProductModel>>(ret);
            this.tb_TongJi.Text = "MES返回:" + ret + "\r\n" +
                "转换后:" + "\r\n" +
                JsonConvert.SerializeObject(retModel)
                ;
        }
        private void button23_Click(object sender, EventArgs e)
        {
            var cargNo = this.tb_wlm.Text.Trim();
            var ret = WmsRequestHelper.test_btjReceive(cargNo);
            //转换后
            MessageModel<string> retModel = JsonConvert.DeserializeObject<MessageModel<string>>(ret);
            this.tb_TongJi.Text = "WMS返回:" + ret + "\r\n" +
                "转换后:" + "\r\n" +
                JsonConvert.SerializeObject(retModel);
        }
    }
}