123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- using ServiceCenter.Extensions;
- using ServiceCenter.Logs;
- using ServiceCenter.SqlSugars;
- using System.ComponentModel;
- using System.Threading.Tasks;
- using WCS.Core;
- using WCS.Entity;
- using WCS.WorkEngineering.Extensions;
- using WCS.WorkEngineering.Protocol.Station;
- using WCS.WorkEngineering.WebApi.Controllers;
- using WCS.WorkEngineering.Worlds;
- using static System.Runtime.InteropServices.JavaScript.JSType;
- using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
- namespace WCS.WorkEngineering.Systems
- {
- /// <summary>
- /// 货架调度处理系统
- /// </summary>
- [BelongTo(typeof(MainWorld))]
- [Description("货架调度处理系统")]
- public class 货架调度处理系统 : DeviceSystem<Station>
- {
- protected override bool ParallelDo => true;
- protected override bool SaveLogsToFile => true;
-
- private List<Station> devsIn = new List<Station>();
- private List<Station> devsOut = new List<Station>();
- private List<Station> devsCallOut = new List<Station>();
- public 货架调度处理系统()
- {
- devsIn = Device.All.Where(v => v.HasFlag(DeviceFlags.一楼入库口)).Select(v => new Station(v, this.World)).ToList();
- devsOut = Device.All.Where(v => v.HasFlag(DeviceFlags.一楼出库口)).Select(v => new Station(v, this.World)).ToList();
- devsCallOut = Device.All.Where(v => v.HasFlag(DeviceFlags.叫料站台)).Select(v => new Station(v, this.World)).ToList();
- }
- public override void Do(Station obj)
- {
- //WCS_TaskInfo task = null;//处理完成的任务
- try
- {
- //入库口货架调度
- //if (obj.Entity.Code == "1001")
- if (obj.Entity.HasFlag(DeviceFlags.入库))
- {
- if (devsIn.Count(v => v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status)) == 0)
- return;
- if (devsIn.Count(v => v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status)) == 2 &&
- devsOut.Count(v => v.Data3.Status.HasFlag(StationStatus.PH_Status)) == 6)
- return;
- SqlSugarHelper.Do(_db =>
- {
- var db = _db.Default;
- ShelfScheduling(1,db);
- #region 1
- //foreach (var item in devsIn)
- //{
- // //入库口有空架子需搬走
- // if (item.Data3.Status.HasFlag(StationStatus.PH_Status) && !item.Data3.Status.HasFlag(StationStatus.PH_Status) && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == item.Entity.Code))
- // {
- // if (item.Data.TaskNumber > 0)
- // {
- // task = db.Queryable<WCS_TaskInfo>().First(v => v.ID == item.Data.TaskNumber && v.Status < Entity.TaskStatus.Finish);
- // if (task != null) throw new KnownException($"{item.Entity.Code}上有任务{item.Data.TaskNumber}未完成", LogLevelEnum.High);
- // }
- // //出库口不需要空架子,通知wms创建搬运任务
- // if (devsOut.Count(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status)) == 0)
- // {
- // var res = WmsApi.PinKuCarryInTask(item.Entity.Code);
- // continue;
- // }
- // else
- // {
- // //判断需要架子的出库口
- // foreach (var i in devsOut)
- // {
- // //出库口没有货架且没有到此处的搬运任务
- // if (!i.Data3.Status.HasFlag(StationStatus.PH_Status) && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == item.Entity.Code))
- // {
- // //创建agv搬运任务
- // SqlSugarHelper.Do(db =>
- // {
- // var agvTask = new WCS_AgvTaskInfo()
- // {
- // ID = db.GetAGVTaskId(),
- // TaskType = AGVTaskType.ForkliftFilling,
- // Status = AGVTaskStatus.NewBuild,
- // Station = i.Entity.Code,
- // AddWho = "WCS",
- // };
- // db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();
- // });
- // }
- // }
- // }
- // }
- //}
- #endregion
- });
- }
- //if (obj.Entity.Code == "1002")//叫料口货架调度
- else if (obj.Entity.HasFlag(DeviceFlags.出库))
- {
- ////叫料
- //if (!devsCallOut.Any(v => v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.PH_Status)))
- // return;
- //if (devsCallOut.Count(v => v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.PH_Status)) == 0)
- // return;
- //出库口补空货架
- SqlSugarHelper.Do(_db =>
- {
- var db = _db.Default;
- //ShelfScheduling(2, db);
- //有出库任务待执行
- if (db.Queryable<WCS_TaskInfo>().Any(v => v.Status == Entity.TaskStatus.WaitingToExecute))
- {
- foreach (var item in devsOut)
- {
- if (db.Queryable<WCS_TaskInfo>().Any(v => v.Status == Entity.TaskStatus.WaitingToExecute && v.SrmStation == item.Entity.Code) && !item.Data3.Status.HasFlag(StationStatus.PH_Status)
- && !item.Data3.Status.HasFlag(StationStatus.OT_Status) && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == item.Entity.Code))
- {
- //入库口没有空货架可用,通知WMS生成搬运任务
- //if (devsIn.Count(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status)) == 0)
- //{
- var res = WmsApi.PinKuCarryOutTask(item.Entity.Code);
- continue;
- //}
- }
- //if (!(db.Queryable<WCS_TaskInfo>().Any(v => v.Status == Entity.TaskStatus.WaitingToExecute && v.SrmStation == item.Entity.Code) && !item.Data3.Status.HasFlag(StationStatus.PH_Status)
- // && !item.Data3.Status.HasFlag(StationStatus.OT_Status)
- // && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == item.Entity.Code)))
- //{
- // throw new KnownException($"{item.Entity.Code}上不满足搬运条件申请", LogLevelEnum.High);
- //}
- //else
- //{
- // //入库口没有空货架可用,通知WMS生成搬运任务
- // if (devsIn.Count(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status)) == 0)
- // {
- // var res = WmsApi.PinKuCarryOutTask(item.Entity.Code);
- // continue;
- // }
- //}
- }
- }
- });
- }
- }
- catch (Exception ex)
- {
- throw new KnownException(ex.Message, LogLevelEnum.High);
- }
- }
- private void ShelfScheduling(int type,SqlSugar.SqlSugarScopeProvider db)
- {
- List<Station> items = null;
- items = type == 1 ? devsIn : devsCallOut;
- foreach (var item in items)
- {
- //有空架子需搬走
- if (item.Data3.Status.HasFlag(StationStatus.PH_Status) && !item.Data3.Status.HasFlag(StationStatus.OT_Status) && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Station == item.Entity.Code) && item.Data.GoodsStart == item.Entity.Code.ToShort())
- {
- var task = db.Queryable<WCS_TaskInfo>().First(v => v.Status < Entity.TaskStatus.Finish && v.SrmStation == item.Entity.Code);
- if (task != null) throw new KnownException($"{item.Entity.Code}上有任务{task.ID}未完成,搬运任务稍后申请", LogLevelEnum.High);
- //出库口不需要空架子,通知wms创建搬运任务
- if (devsOut.Count(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status)) == 0)
- {
- var res = WmsApi.PinKuCarryInTask(item.Entity.Code);
- continue;
- }
- else
- {
- //判断需要架子的出库口
- foreach (var i in devsOut)
- {
- //出库口没有货架且没有到此处的搬运任务
- if (!i.Data3.Status.HasFlag(StationStatus.PH_Status) && !i.Data3.Status.HasFlag(StationStatus.OT_Status) && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == i.Entity.Code)
- && !db.Queryable<WCS_AgvTaskInfo>().SplitTable().Any(v => v.Status < AGVTaskStatus.MissionCompleted && v.Station == item.Entity.Code))
- {
- //创建agv搬运任务
- SqlSugarHelper.Do(db =>
- {
- var agvTask = new WCS_AgvTaskInfo()
- {
- ID = db.GetAGVTaskId(),
- TaskType = AGVTaskType.Transport,
- Status = AGVTaskStatus.NewBuild,
- Station = item.Entity.Code,
- Position = i.Entity.Code,
- WorkShop = 222,
- AddWho = "WCS",
- };
- db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();
- });
- }
- }
- }
- }
- }
- }
- public override bool Select(Device dev)
- {
- //return dev.HasFlag(DeviceFlags.货架调度);
- return dev.Code is "1001" or "1002";
- }
- }
- }
|