| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 | using PlcSiemens.Core.Extension;using ServiceCenter.Logs;using ServiceCenter.Redis;using ServiceCenter.SqlSugars;using System.ComponentModel;using WCS.Core;using WCS.Entity;using WCS.WorkEngineering.Extensions;using WCS.WorkEngineering.WebApi.Controllers;using WCS.WorkEngineering.WebApi.Models.AGV.Response;using WCS.WorkEngineering.Worlds;namespace WCS.WorkEngineering.Systems{    /// <summary>    ///  无交互系统    /// </summary>    [BelongTo(typeof(MainWorldd))]    [Description("无交互系统")]    public class NoInteractionSystems : DeviceSystem<Station>    {        public NoInteractionSystems()        {        }        protected override bool ParallelDo => true;        protected override bool SaveLogsToFile => true;        public override void Do(Station obj)        {            var key = $"WCS:Lock:无交互系统{obj.Entity.Code}";            try            {                if (RedisHub.Default.Get(key) != null)                {                    throw new KnownException($"[{obj.Entity.Code}]--触发并发管控", LogLevelEnum.High);                }                RedisHub.Default.Set(key, obj.Entity.Code);                #region 处理所有的新增任务                try                {                    List<WCS_TaskInfo> taskInfos = new List<WCS_TaskInfo>();                    SqlSugarHelper.Do(db =>                    {                        taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild).ToList();                    });                    if (taskInfos.Any())                    {                        foreach (var item in taskInfos)                        {                            try                            {                                SqlSugarHelper.Do(db =>                                {                                    var task = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.ID == item.ID).First() ?? throw new Exception($"未找到对应的WCS任务[{item.ID}]");                                                                       if (task.Type == TaskType.EnterDepot)                                    {                                        string nextPos = "";                                        int i = 0;                                        if (task.AddrFrom.Contains("A") || task.AddrFrom.Contains("B"))                                        {                                            nextPos = "1017";                                        }                                        else if (task.BarCode.StartsWith("PT"))                                        {                                            nextPos = "1017";                                            i = 1;                                        }                                        else                                        {                                            nextPos = "1018";                                        }                                                                                //创建AGV任务                                        var agvTask = new WCS_AgvTaskInfo()                                        {                                            ID = db.GetAGVTaskId(),                                            TaskType = AGVTaskType.EnterDepot,                                            Status = AGVTaskStatus.NewBuild,                                            Station = task.AddrFrom,                                            Position = nextPos,                                            WorkShop = i,                                            AddWho = "WCS",                                        };                                        db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();                                        //更新任务状态                                        task.Status = Entity.TaskStatus.WaitingToExecute;                                        task.AgvTaskID = agvTask.ID;                                        db.Default.Updateable(task).ExecuteCommand();                                        task.AddWCS_TASK_DTL(db, task.Device, $"初始化入库任务信息,并创建AGV任务中间表,AGV任务目标地址:{agvTask.Station}");                                    }                                    else if (task.Type == TaskType.OutDepot)                                    {                                        if (task.SrmStation.IsNullOrEmpty()) //如果没有指定放货站台                                        {                                            //获取堆垛机到目标地址的路径信息                                            var station = "";                                            switch (task.Tunnel)                                            {                                                case "1":                                                    station = "1002";                                                    break;                                                case "2":                                                    station = "1004";                                                    break;                                                case "3":                                                    station = "1006";                                                    break;                                                case "4":                                                    station = "1008";                                                    break;                                                case "5":                                                    station = "1010";                                                    break;                                                case "6":                                                    station = "1012";                                                    break;                                                case "7":                                                    station = "1014";                                                    break;                                                case "8":                                                    station = "1016";                                                    break;                                            }                                            task.SrmStation = station;                                        }                                        //创建AGV任务                                        var agvTask = new WCS_AgvTaskInfo()                                        {                                            ID = db.GetAGVTaskId(),                                            TaskType = AGVTaskType.CallMaterial,                                            Status = AGVTaskStatus.NewBuild,                                            Station = task.SrmStation,                                            Position = task.AddrTo,                                            AddWho = "WCS",                                        };                                                                                db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();                                        //更新任务状态                                        task.Status = Entity.TaskStatus.WaitingToExecute;                                        task.AgvTaskID = agvTask.ID;                                        db.Default.Updateable(task).ExecuteCommand();                                        task.AddWCS_TASK_DTL(db, task.Device, $"初始化叫料任务信息,并创建AGV任务中间表,AGV任务目标地址:{task.AddrTo}");                                    }                                    else if (task.Type == TaskType.Delivery)                                    {                                        var busType = 111;                                        //缓存区到出库口                                        if (task.AddrTo.StartsWith("10"))                                            busType = 111;                                        //入库口到缓存区、叫料区到缓存区                                        else                                            busType = 333;                                        //创建AGV搬运任务                                        var agvTask = new WCS_AgvTaskInfo()                                        {                                            ID = db.GetAGVTaskId(),                                            TaskType = AGVTaskType.ForkliftFilling,                                            Status = AGVTaskStatus.NewBuild,                                            Station = task.AddrFrom,                                            Position = task.AddrTo,                                            WorkShop = busType,//标识wms下发任务                                            AddWho = "WCS",                                        };                                        db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();                                        //更新任务状态                                        task.Status = Entity.TaskStatus.WaitingToExecute;                                        task.AgvTaskID = agvTask.ID;                                        db.Default.Updateable(task).ExecuteCommand();                                        task.AddWCS_TASK_DTL(db, task.Device, $"初始化搬运任务信息,并创建AGV任务中间表,AGV任务目标地址:{agvTask.Station}");                                    }                                });                            }                            catch (Exception ex)                            {                                World.Log(ex.Message, LogLevelEnum.Mid);                                continue;                            }                        }                    }                }                catch (Exception ex)                {                    World.Log(ex.Message, LogLevelEnum.Mid);                }                #endregion 处理所有的新增任务                #region 下发agv任务                SqlSugarHelper.Do(db =>                {                    var agvTasks = db.Default.Queryable<WCS_AgvTaskInfo>().Where(t => t.Status == AGVTaskStatus.NewBuild && (t.TaskType == AGVTaskType.EnterDepot || t.TaskType == AGVTaskType.ForkliftFilling)).SplitTable(v => v.Take(2)).ToList();                    if (agvTasks.Count > 0)                    {                        foreach (var agv in agvTasks)                        {                            //开始处理                            try                            {                                if (agv.TaskType == AGVTaskType.EnterDepot)                                {                                    //获取对应wcs任务                                                                       var wcs = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.AgvTaskID == agv.ID && t.Status == Entity.TaskStatus.WaitingToExecute).First();                                    if (wcs == null) throw new Exception($"未找到对应的WCS任务");                                    string startPos = "";                                    if (agv.WorkShop == 1)                                    {                                        if (wcs.AddrFrom == "1021" || wcs.AddrFrom == "1022" || wcs.AddrFrom == "1023" || wcs.AddrFrom == "1024")                                        {                                            startPos = "PT" + wcs.AddrFrom;                                        }                                                                                else                                        {                                            startPos = wcs.AddrFrom;                                        }                                    }                                    else                                    {                                        startPos = wcs.AddrFrom;                                    }                                                                        var res = AgvApi.盘条入库(startPos, agv.Position,"1001","PT", Guid.NewGuid().ToString().Replace("-", ""), "1");                                    agv.Status = AGVTaskStatus.Confirm;                                    agv.AgvID = res.data;                                    db.Default.Updateable(agv).SplitTable().ExecuteCommand();                                    //更新WCS数据                                    wcs.Status = Entity.TaskStatus.AGVExecution;                                    db.Default.Updateable(wcs).ExecuteCommand();                                    wcs.AddWCS_TASK_DTL(db, wcs.Device, $"任务下发至AGV-AGV任务ID{agv.AgvID}");                                }                                else if (agv.TaskType == AGVTaskType.ForkliftFilling)//搬运任务下发agv                                {                                    if (agv.WorkShop == 111)                                    {                                        //获取对应wcs任务                                        var wcs = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.AgvTaskID == agv.ID && t.Status == Entity.TaskStatus.WaitingToExecute).First();                                        if (wcs == null) throw new Exception($"未找到对应的WCS任务");                                        string endPos = "";                                        if (agv.Position == "1012" || agv.Position == "1014" || agv.Position == "1016")                                        {                                            endPos = "PT" + agv.Position;                                        }                                        else                                        {                                            endPos = agv.Position;                                        }                                        var res = AgvApi.搬运_wmsEnd("PT", agv.Station, endPos, Guid.NewGuid().ToString().Replace("-", ""), "1");                                        agv.Status = AGVTaskStatus.Confirm;                                        agv.AgvID = res.data;                                        db.Default.Updateable(agv).SplitTable().ExecuteCommand();                                        //更新WCS数据                                        wcs.Status = Entity.TaskStatus.AGVExecution;                                        db.Default.Updateable(wcs).ExecuteCommand();                                        wcs.AddWCS_TASK_DTL(db, wcs.Device, $"任务下发至AGV-AGV任务ID{agv.AgvID}");                                    }                                    else if (agv.WorkShop == 222)                                    {                                        var res = AgvApi.搬运("PT", agv.Station, agv.Position, Guid.NewGuid().ToString().Replace("-", ""), "1");                                        agv.Status = AGVTaskStatus.Confirm;                                        agv.AgvID = res.data;                                        db.Default.Updateable(agv).SplitTable().ExecuteCommand();                                    }                                    else if (agv.WorkShop == 333)                                    {                                        string startPos = "";                                                                                //获取对应wcs任务                                        var wcs = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.AgvTaskID == agv.ID && t.Status == Entity.TaskStatus.WaitingToExecute).First();                                        if (wcs == null) throw new Exception($"未找到对应的WCS任务");                                        if (wcs.AddrFrom == "1021" || wcs.AddrFrom == "1022" || wcs.AddrFrom == "1023" || wcs.AddrFrom == "1024")                                        {                                            startPos = "PT" + wcs.AddrFrom;                                        }                                                                                else                                        {                                            startPos = wcs.AddrFrom;                                        }                                        var res = AgvApi.搬运_wmsStart("PT", startPos, agv.Position, Guid.NewGuid().ToString().Replace("-", ""), "1");                                        agv.Status = AGVTaskStatus.Confirm;                                        agv.AgvID = res.data;                                        db.Default.Updateable(agv).SplitTable().ExecuteCommand();                                        //更新WCS数据                                        wcs.Status = Entity.TaskStatus.AGVExecution;                                        db.Default.Updateable(wcs).ExecuteCommand();                                        wcs.AddWCS_TASK_DTL(db, wcs.Device, $"任务下发至AGV-AGV任务ID{agv.AgvID}");                                    }                                }                                                           }                            catch (Exception ex)                            {                                World.Log(ex.Message, LogLevelEnum.Mid);                                continue;                            }                        }                    }                });                #endregion            }            finally            {                RedisHub.Default.Del(key);            }        }        public override bool Select(Device dev)        {            return dev.Code == "1001";        }    }}
 |