StationDRExcute.cs 16.5 KB
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;

namespace HH_WCS_Standard
{
    public class StationDRExcute : I_Excute
    {
        private VM_StationDR vM_StationDR;
        private VM_StationDACK vM_StationDACK;
        private I_Device device;
        private BaseBll _bll = new BaseBll();
        private BaseDal<T_BaseNumber> basedal_T = new BaseDal<T_BaseNumber>();

        //方案二 称重数据获取
        //private SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8);

        public StationDRExcute(F_ServiceModel f_ServiceModel) : base(f_ServiceModel)
        {
            vM_StationDR = f_ServiceModel.vM_ReadModel as VM_StationDR;
            vM_StationDACK = f_ServiceModel.vM_WriteModel as VM_StationDACK;
            device = this.f_service.device;
        }

        public override BllResult Excute()
        {
            if (string.IsNullOrWhiteSpace(vM_StationDACK.PalletID) && vM_StationDACK.MessageID != 0)
            {
                LogExecute.logNet.WriteDebug($"大仙");
            }
            vM_StationDR.LatTime = DateTime.Now;
            if (vM_StationDR.MessageID != 0 && vM_StationDACK.MessageID == 0)
            {
                //地址请求
                if (device.Type == "Entrance")
                {
                    var task = App.taskList.FirstOrDefault(a => a.FromPlace == device.Code && (a.NextState == E_TaskState.响应出入口地址请求.GetIndexInt()));
                    if (task != null)
                    {
                        #region 超重检测回退
                        //App.weight = basedal_T.Query(a => a.Value == "SetWeight").Data[0].VKey;
                        //if (Convert.ToDouble(vM_StationDR.Weight) > Convert.ToDouble(App.weight))
                        //{
                        //    vM_StationDACK.MessageID = 6;
                        //    vM_StationDACK.LoadingStatus = 1;
                        //    vM_StationDACK.ScannerNr = vM_StationDR.ScannerNr;
                        //    vM_StationDACK.PalletID = task.PalletOrBoxNo;
                        //    vM_StationDACK.DeStation = int.Parse(device.BackPoint);

                        //    var sendtask_send = this.PutWriteAddress();
                        //    if (sendtask_send.Success)
                        //    {
                        //        LogExecute.logNet.WriteError($"响应{device.Name}地址请求:超重回退至人工操作口,托盘号{task.PalletOrBoxNo},重量是{vM_StationDR.Weight},任务号{task.tNo}");
                        //        return BllResult.Sucess();
                        //    }
                        //    else
                        //    {
                        //        LogExecute.logNet.WriteError($"响应{device.Name}地址请求回退写入失败(称重超重,发送PLC回退数据失败),托盘号{task.PalletOrBoxNo},重量是{vM_StationDR.Weight},任务号{task.tNo}");
                        //        return BllResult.Error();
                        //    }
                        //}
                        #endregion 超重检测回退

                        //Dictionary<string, object> lstColumnValues = new Dictionary<string, object>();
                        //lstColumnValues.Add("Weight", vM_StationDR.Weight);
                        //lstColumnValues.Add("Height", vM_StationDR.Height);
                        //BaseDal<I_Task> taskDb = new BaseDal<I_Task>();
                        //taskDb.BeginTran();
                        //var wheightUpdate = taskDb.Update(lstColumnValues, a => a.tNo == task.tNo);
                        //if (!wheightUpdate.Success)
                        //{
                        //    taskDb.RollbackTran();
                        //    LogExecute.logNet.WriteError($"托盘号{task.PalletOrBoxNo}称重数据写入数据失败");
                        //    return BllResult.Error();
                        //}
                        //taskDb.CommitTran();
                        //LogExecute.logNet.WriteDebug($"托盘号{task.PalletOrBoxNo},称重数据{vM_StationDR.Weight},高度数据{vM_StationDR.Height}写入成功");

                        //task.Weight = vM_StationDR.Weight.ToString();
                        //task.Height = vM_StationDR.Height.ToString();  //根据实际需要确定是否用到
                        Dictionary<string, object> lstColumnValues = new Dictionary<string, object>();
                       
                        //数据写入任务表
                       
                        lstColumnValues.Add("Weight", vM_StationDR.Weight);
                        lstColumnValues.Add("Height", vM_StationDR.Height);
                        
                        BaseDal<I_Task> taskDb = new BaseDal<I_Task>();
                        taskDb.BeginTran();
                        var taskUpdate = taskDb.Update(lstColumnValues, a => a.tNo == task.tNo);
                        if (!taskUpdate.Success)
                        {
                            taskDb.RollbackTran();
                            LogExecute.logNet.WriteError($"托盘号{task.PalletOrBoxNo}称重,高度,仓位数据写入数据失败");
                            return BllResult.Error();
                        }
                        taskDb.CommitTran();
                        task.Weight = vM_StationDR.Weight.ToString();
                        task.Height = vM_StationDR.Height.ToString();  
                        
                        LogExecute.logNet.WriteDebug($"托盘号{task.PalletOrBoxNo},称重数据{vM_StationDR.Weight},高度数据{vM_StationDR.Height}写入成功");
                        #region 请求WMS仓位 请求仓位

                        if (string.IsNullOrWhiteSpace(task.ExitPlace))
                        {
                            var wareresult = _bll.GetWareCell(task);
                            if (!wareresult.Success)
                            {
                                LogExecute.logNet.WriteError($"响应{device.Name}地址请求: 请求WMS获取仓位失败,任务号{task.tNo},错误原因是{wareresult.Msg}");
                                return BllResult.Error();
                            }
                            Dictionary<string, object> lstColumnValues1 = new Dictionary<string, object>();
                            lstColumnValues1.Add("ExitPlace", wareresult.Data.ToString());
                            BaseDal<I_Task> taskDb1 = new BaseDal<I_Task>();
                            taskDb1.BeginTran();
                            var taskUpdate1 = taskDb1.Update(lstColumnValues1, a => a.tNo == task.tNo);
                            if (!taskUpdate1.Success)
                            {
                                taskDb1.RollbackTran();
                                LogExecute.logNet.WriteError($"托盘号{task.PalletOrBoxNo}仓位数据写入数据失败");
                                return BllResult.Error();
                            }
                            taskDb1.CommitTran();
                            task.ExitPlace = wareresult.Data.ToString();
                            LogExecute.logNet.WriteDebug($"请求仓位{wareresult.Data}写入成功");
                        }
                        #endregion 请求WMS仓位 请求仓位
                        //var _device = App.f_ServiceModels.FirstOrDefault(a => a.device.Code == task.ToPlace);
                        var _device = App.f_ServiceModels.FirstOrDefault(a => a.device.Point == int.Parse(device.ToPoint) && a.device.Type == "InStation");
                        if (_device == null)
                        {
                            LogExecute.logNet.WriteError($"响应{device.Name}站台地址请求失败,找不到目的地的编码{task.ToPlace},任务号{task.tNo}");
                            return BllResult.Error();
                        }

                        vM_StationDACK.MessageID = 6;
                        vM_StationDACK.LoadingStatus = 1;
                        vM_StationDACK.ScannerNr = vM_StationDR.ScannerNr;
                        vM_StationDACK.PalletID = task.PalletOrBoxNo;
                        vM_StationDACK.DeStation = _device.device.Point;

                        BaseDal<I_Task> _taskDb = new BaseDal<I_Task>();
                        _taskDb.BeginTran();
                        var sendtask_update = _bll.NextStateChange(task, _taskDb);
                        if (sendtask_update.Success)
                        {
                            var sendtask_send = this.PutWriteAddress();
                            if (sendtask_send.Success)
                            {
                                _taskDb.CommitTran();
                                _bll.NextStateChangeCache(task);
                                LogExecute.logNet.WriteDebug($"响应{device.Name}站台地址请求成功,任务号{task.tNo},条码:{vM_StationDACK.PalletID},目的地:{vM_StationDACK.DeStation}");
                                if (string.IsNullOrWhiteSpace(vM_StationDACK.PalletID) && vM_StationDACK.MessageID != 0)
                                {
                                    LogExecute.logNet.WriteDebug($"大仙2");
                                }
                                return BllResult.Sucess();
                            }
                            else
                            {
                                _taskDb.RollbackTran();
                                LogExecute.logNet.WriteError($"响应{device.Name}站台地址请求失败(发送异常),任务号{task.tNo}");
                                return BllResult.Error();
                            }
                        }
                        else
                        {
                            _taskDb.RollbackTran();
                            LogExecute.logNet.WriteError($"响应{device.Name}站台地址请求失败(更新数据库异常),任务号{task.tNo}");
                            return BllResult.Error();
                        }
                        
                    }
                    else
                    {
                        //有托盘但无任务信息,托盘回退
                        var _device = App.f_ServiceModels.FirstOrDefault(a => a.device.Point == int.Parse(device.BackPoint) && a.device.Type == "Exit");
                        if (_device == null)
                        {
                            LogExecute.logNet.WriteError($"响应{device.Name}站台地址请求失败,无下发任务,回退托盘找不到目的地");
                            return BllResult.Error();
                        }
                        vM_StationDACK.MessageID = 6;
                        vM_StationDACK.LoadingStatus = 1;
                        vM_StationDACK.ScannerNr = vM_StationDR.ScannerNr;
                        vM_StationDACK.PalletID = vM_StationDR.PalletID;
                        vM_StationDACK.DeStation = _device.device.Point;
                        vM_StationDACK.Spare = 1;

                        var sendtask_send = this.PutWriteAddress();

                        if (sendtask_send.Success)
                        {
                            LogExecute.logNet.WriteError($"响应{device.Name}站台地址请求,WMS未下发任务,回退至人工操作台,请确认,托盘号:{vM_StationDR.PalletID}");
                            return BllResult.Sucess();
                        }
                        else
                        {
                            LogExecute.logNet.WriteError($"响应{device.Name}站台地址请求失败:无任务,回退,(回退信息写入PLC出现异常)");
                            return BllResult.Error();
                        }
                    }
                }
                else
                {
                    //中转站台,查找任务,查找不到返回报错
                    var task = App.taskList.FirstOrDefault(a => a.FromPlace == device.Code &&  (a.NextState == E_TaskState.响应中转站台地址请求.GetIndexInt()));//a.PalletOrBoxNo == vM_StationDR.PalletID &&
                    if (task != null)
                    {
                        var _device = App.f_ServiceModels.FirstOrDefault(a => a.device.Code == task.ToPlace);
                        if (_device == null)
                        {
                            LogExecute.logNet.WriteError($"响应{device.Name}站台地址请求失败,找不到目的地的编码{task.ToPlace},任务号{task.tNo}");
                            return BllResult.Error();
                        }

                        vM_StationDACK.MessageID = 6;
                        vM_StationDACK.LoadingStatus = 1;
                        vM_StationDACK.ScannerNr = vM_StationDR.ScannerNr;
                        vM_StationDACK.PalletID = task.PalletOrBoxNo;
                        vM_StationDACK.DeStation = _device.device.Point;

                        BaseDal<I_Task> _taskDb = new BaseDal<I_Task>();
                        _taskDb.BeginTran();
                        var sendtask_update = _bll.NextStateChange(task, _taskDb);
                        if (sendtask_update.Success)
                        {
                            var sendtask_send = this.PutWriteAddress();
                            if (sendtask_send.Success)
                            {
                                _taskDb.CommitTran();
                                _bll.NextStateChangeCache(task);
                                LogExecute.logNet.WriteDebug($"响应{device.Name}站台地址请求成功,任务号{task.tNo},条码:{vM_StationDACK.PalletID},目的地:{vM_StationDACK.DeStation}");
                                return BllResult.Sucess();
                            }
                            else
                            {
                                _taskDb.RollbackTran();
                                LogExecute.logNet.WriteError($"响应{device.Name}站台地址请求失败(发送一场),任务号{task.tNo}");
                                return BllResult.Error();
                            }
                        }
                        else
                        {
                            _taskDb.RollbackTran();
                            LogExecute.logNet.WriteError($"响应{device.Name}站台地址请求失败(更新数据库异常),任务号{task.tNo}");
                            return BllResult.Error();
                        }
                    }
                    else
                    {
                        LogExecute.logNet.WriteError($"响应{device.Name}站台地址请求失败,未找到对应的任务");
                        return BllResult.Error();
                    }
                }
            }
            else if (vM_StationDR.MessageID == 0 && vM_StationDACK.MessageID != 0)
            {
                //地址请求已回复,需要清除数据
                var clearresult = PutEmptyAddress();
                return BllResult.Sucess();
            }
            else
            {
                return BllResult.Sucess();
            }
        }
        #region
        //public string GetWeight()
        //{
        //    string weight;
        //    int num = 0;
        //    if (!port.IsOpen)
        //    {
        //        port.Open();
        //    }
        //    while (true)
        //    {
        //        num++;
        //        port.WriteLine("SI");
        //        int count = port.BytesToRead;
        //        byte[] RevData = new byte[count];
        //        port.Read(RevData, 0, count);
        //        LogExecute.logNet.WriteDebug($"称重数据原始值:{Encoding.Default.GetString(RevData)}");
        //        weight = Encoding.Default.GetString(RevData).Replace("k", "").Replace("g", "").Replace("S", "").Replace("D", "").Replace("\r\t", "").Trim();
        //        LogExecute.logNet.WriteDebug($"重量:{weight}");
        //        if (num >= 5)
        //        {
        //            LogExecute.logNet.WriteDebug($"连续5次未读取到合理数据");
        //            break;
        //        }
        //        if (string.IsNullOrWhiteSpace(weight))
        //        {
        //            LogExecute.logNet.WriteDebug($"第{num}读取扫码信息失败,请重试");
        //            continue;
        //        }
        //        else if (Convert.ToDouble(weight) <= Convert.ToDouble(0))
        //        {
        //            LogExecute.logNet.WriteDebug($"称重数据不合理,请重试");
        //            continue;
        //        }
        //        break;
        //    }
        //    port.Close();
        //    return weight;
        //}
        #endregion
    }
}