123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- using DBHelper;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using WCS.Core;
- using WCS.Entity;
- using WCS.Entity.Protocol;
- using WCS.Service.Helpers;
- using WCS.Service.Log;
- 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;
- }
- /// <summary>
- /// 用于任务创建时获取放货站台
- /// </summary>
- /// <param name="task"></param>
- public static void TaskGetSrmStation(this WCS_TASK task)
- {
- task.GetSrmStationAndaddNext(SrmFork.货叉1);
- task.SRMSTATION = Device.Where(v => v.IsDevGroup()).FirstOrDefault(v => v.DEVICEGROUP.Any(b => b.MEMBER.CODE == task.SRMSTATION))?.CODE;
- task.ADDRNEXT = string.Empty;
- }
- public static void AGVStatusChange(this WCS_AGVTask task, AGVTaskStatus status, string type = "同步")
- {
- InfoLog.INFO_AGV($"AGV状态更新Status:{task.Status},AGVStatus:{status},{type}");
- }
- }
- 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;
- SRMSTATION = task.SRMSTATION;
- ID = task.ID;
- Line = addrFrom[0].ToShort();
- Col = addrFrom[1].ToShort();
- Layer = addrFrom[2].ToShort();
- }
- }
- }
|