| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 | using DBHelper;using System;using System.Collections.Generic;using System.Linq;using WCS.Core;using WCS.Entity;using WCS.Entity.Protocol.SRM;using WCS.Service.Helpers;namespace WCS.Service.Extensions{    /// <summary>    /// 任务扩展    /// </summary>    public static class TaskExtension    {        public static T Create<T>(this WCS_TASK source)        {            return (T)Activator.CreateInstance(typeof(T), source);        }        /// <summary>        /// 获取可用的出库任务        /// </summary>        /// <param name="tasks"></param>        /// <returns></returns>        public static Task[] GetOutTask(this List<WCS_TASK> tasks)        {            var tasklist = tasks.Select(v => v.Create<Task>());            var task = tasklist.FirstOrDefault() ?? throw new WarnException("无可用出库任务--GetOutTask");            //AGV任务ID不为零表示为车间叫料任务            if (task.AgvTask != 0)            {                //按照AGV任务ID分一次组                tasklist = tasklist.OrderByDescending(v => v.Priority)                                   .ThenBy(v => v.CREATETIME)                                   .GroupBy(v => v.AgvTask)                                   .FirstOrDefault() ?? throw new WarnException("无可用叫料任务--GetOutTask");                //无论这个AGV任务绑定的货物相隔多远都必须要一起出出去                return tasklist.OrderBy(v => v.Col).ToArray();            }            return tasklist.OrderByDescending(v => v.Priority)                           .GroupBy(v => v.MaterialCode)                           .OrderBy(v => v.Key).FirstOrDefault()                           .OrderByDescending(v => v.Priority)                           .ThenBy(v => v.Line)                           .ThenBy(v => v.Layer)                           .ThenBy(v => v.Col)                           .Take(2)                           .DistinctBy(v => v.Col)                           .OrderBy(v => v.Col)                           .ToArray();        }        /// <summary>        /// 获取出库任务的站台号及下一个地址        /// </summary>        /// <param name="task">任务</param>        /// <param name="srmFork">货叉</param>        public static void GetSrmStationAndaddNext(this WCS_TASK task, SrmFork srmFork)        {            //取任务巷道到达目标地址的下一个地址,即任务堆垛机的站台对应的设备组            var stations = Device.Where(v => v.DEVICEGROUP.Any(p => p.MEMBER == Device.Find(task.TUNNEL).GetPath(task.ADDRTO.Replace("G", ""))))                                 .Select(v => v.Create<StationDeviceGroup>())                                 .FirstOrDefault().Items                                 .OrderByDescending(v => v.Entity.CODE)                                 .ToArray();            //一工位放较大的站台号            switch (srmFork)            {                case SrmFork.货叉1:                    task.SRMSTATION = stations[0].Entity.CODE;                    task.ADDRNEXT = stations[0].Entity.GetPath(task.ADDRTO).CODE;                    break;                case SrmFork.货叉2:                    task.SRMSTATION = stations[1].Entity.CODE;                    task.ADDRNEXT = stations[1].Entity.GetPath(task.ADDRTO).CODE;                    break;            }        }        /// <summary>        /// 有效任务数是否符合任务组任务数        /// </summary>        /// <param name="tasks"></param>        /// <param name="executable"></param>        /// <param name="db"></param>        public static void ValidTaskCheck(this List<WCS_TASK> tasks, int executable, DB db)        {            var task = tasks.FirstOrDefault();            var taskCount = db.Default.Set<WCS_TASK>().Count(v => v.TaskGroupKey == task.TaskGroupKey && v.TYPE == TaskType.入库);            //开始检查任务数是否匹配            if (executable != taskCount) throw new WarnException($"可执行数{executable},任务组任务数{taskCount},数量不匹配,{task.ID}-{task.TaskGroupKey}");        }        /// <summary>        /// 有效任务数是否符合任务组任务数  临时        /// </summary>        /// <param name="tasks"></param>        /// <param name="executable"></param>        /// <param name="db"></param>        public static List<WCS_TASK> ValidTaskCheck(this List<FinishTaskList<string>> devs, DB db)        {            var taskIds = devs.Select(v => v.Station.Data2.Tasknum).ToList();            var taskList = db.Default.Set<WCS_TASK>().Where(v => taskIds.Contains(v.ID)).ToList();            var task = taskList.FirstOrDefault() ?? throw new WarnException($"ValidTaskCheck 无任务"); ;            var taskCount = db.Default.Set<WCS_TASK>().Count(v => v.TaskGroupKey == task.TaskGroupKey && v.TYPE == TaskType.入库);            //开始检查任务数是否匹配            if (devs.Count != taskCount) throw new WarnException($"可执行数{devs.Count},任务组任务数{taskCount},数量不匹配,{task.ID}-{task.TaskGroupKey}");            return taskList;        }        public static List<WCS_TASK> GetSrmValidTaskList(this IGrouping<string, WCS_TASK>[] taksList,SRMDevice srm, int index = 0)        {            return taksList[index].ToList();            //if (!taksList.Any() || index > (taksList.Length - 1)) throw new DoException("无可执行出库任务");            //var outDepot = taksList[index];            //WCS_TASK task=null;            //DB.Do(db =>            //{            //    task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.STATUS == TaskStatus.新建 && v.ADDRTO == outDepot.Key && v.Priority > 0 && v.DEVICE != srm.Entity.CODE);            //});            //if (task == null) return outDepot.ToList(); // 没有优先            //var dev = Device.Find(task.DEVICE).Create<SRMDevice>();            //if (dev.Data2.SRMMode == SCMode.远程 && dev.Data2.SRMStatus == SCRunStatus.空闲)            //{            //    taksList.GetSrmValidTaskList(srm, index++);            //}            //return outDepot.ToList(); //优先任务对应的堆垛机没有空闲        }    }    public enum SrmIndex    {        工位一 = 0,        工位二 = 1,    }    public class Task : WCS_TASK    {        /// <summary>        /// 行        /// </summary>        public short Line { get; set; }        /// <summary>        /// 列        /// </summary>        public short Col { get; set; }        /// <summary>        /// 层        /// </summary>        public short Layer { get; set; }        public Task(WCS_TASK task)        {            var addrFrom = task.ADDRFROM.Split("-");            ADDRTO = task.ADDRTO;            TUNNEL = task.TUNNEL;            DEVICE = task.DEVICE;            Priority = task.Priority;            AgvTask = task.AgvTask;            CREATETIME = task.CREATETIME;            MaterialCode = task.MaterialCode;            ID = task.ID;            Line = addrFrom[0].ToShort();            Col = addrFrom[1].ToShort();            Layer = addrFrom[2].ToShort();        }    }}
 |