using ServiceCenter.Logs;
using ServiceCenter.SqlSugars;
using WCS.Entity;
using WCS.WorkEngineering.WebApi.Controllers;
using WCS.WorkEngineering.WebApi.Models.AGV.Response;
using TaskStatus = WCS.Entity.TaskStatus;
namespace WCS.WorkEngineering.Extensions
{
///
/// 任务扩展
///
public static class TaskExtension
{
///
/// 更新任务执行记录
///
/// 任务信息
/// 数据库上下文
/// 当前地址
/// 描述
public static void AddWCS_TASK_DTL(this WCS_TaskInfo task, SqlSugarHelper db, string curPoint, string desc) => task.AddWCS_TASK_DTL(db, curPoint, "", desc);
///
/// 更新任务执行记录
///
/// 任务信息
/// 数据库上下文
/// 当前地址
/// 下一个地址
/// 描述
public static void AddWCS_TASK_DTL(this WCS_TaskInfo task, SqlSugarHelper db, string curPoint, string NextPoint, string desc)
{
db.Default.Insertable(new WCS_TaskDtl
{
ID = Guid.NewGuid(),
ParentTaskCode = task.ID,
CurPoint = curPoint,
NextPoint = NextPoint,
Desc = desc,
AddWho = "WCS"
}).SplitTable().ExecuteCommand();
}
///
/// 完成或取消任务
///
///
///
///
public static void CompleteOrCancelTasks(this WCS_TaskInfo taskInfo, SqlSugarHelper db)
{
if (taskInfo.Status is not Entity.TaskStatus.Finish and not Entity.TaskStatus.Cancel) throw new KnownException("任务未完成或取消,无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
else // 任务完成或取消,进行相关同步动作
{
WCS_TaskOld taskOld = db.Default.Queryable().SplitTable(tabs => tabs.Take(2)).Where(v => v.ID == taskInfo.ID).OrderByDescending(v => v.AddTime).First();
if (taskOld is null) throw new KnownException($"WCS_TaskOld表中不存在任务:{taskInfo.ID},无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
else
{
//状态
taskOld.Status = taskInfo.Status;
taskOld.Uploaded = taskInfo.Uploaded;
//任务号
taskOld.WmsTask = taskInfo.WmsTask;
taskOld.AgvTaskID = taskInfo.AgvTaskID;
taskOld.TaskGroupKey = taskInfo.TaskGroupKey;
taskOld.Priority = taskInfo.Priority;
//时间与用户
taskOld.AddTime = taskInfo.AddTime;
taskOld.AddWho = taskInfo.AddWho;
taskOld.StartTime = taskInfo.StartTime;
taskOld.EndTime = taskInfo.EedTime;
taskOld.EditWho = taskInfo.EditWho;
taskOld.EditTime = taskInfo.EditTime;
//条码与地址
taskOld.BarCode = taskInfo.BarCode;
taskOld.MaterialCode = taskInfo.MaterialCode;
taskOld.AddrFrom = taskInfo.AddrFrom;
taskOld.AddrTo = taskInfo.AddrTo;
taskOld.LastInteractionPoint = taskInfo.LastInteractionPoint;
taskOld.AddrNext = taskInfo.AddrNext;
taskOld.Tunnel = taskInfo.Tunnel;
taskOld.Floor = taskInfo.Floor;
taskOld.Device = taskInfo.Device;
taskOld.SrmStation = taskInfo.SrmStation;
//码垛信息
taskOld.DocID = taskInfo.DocID;
taskOld.PalletType = taskInfo.PalletType;
taskOld.ProdLine = taskInfo.ProdLine;
taskOld.FullQty = taskInfo.FullQty;
//外形信息
taskOld.Height = taskInfo.Height;
taskOld.Length = taskInfo.Length;
taskOld.Weight = taskInfo.Weight;
//手动处理备注
taskOld.ManualRemarks = taskInfo.ManualRemarks;
//更新任务历史表,删除任务当前表
db.Default.Updateable(taskOld).SplitTable().ExecuteCommand();
db.Default.Deleteable(taskInfo).ExecuteCommand();
}
}
}
///
/// 获取出库任务
///
/// 任务
/// db
/// 可用出库站台
/// 楼层
/// 堆垛机
/// 递归次数
///
///
public static WCS_TaskInfo GetOutTask(this WCS_TaskInfo taskInfo, SqlSugarHelper db, List allOutCode, int floor, SRM obj, int index = 1)
{
//按条件先后排序获取一条排序后第一条结果1.优先级2.所在楼层与本次优先执行楼层
var tasks = db.Default.Queryable().Where(v => v.Type == TaskType.OutDepot && v.Status == TaskStatus.WaitingToExecute)
.Where(v => allOutCode.Contains(v.SrmStation))
.OrderByDescending(v => v.Priority)
.OrderByDescending(v => v.Floor == floor ? 1 : 0)
.Take(index).ToList();
if (!tasks.Any()) throw new KnownException($"{obj.Entity.Code}未找到出库任务", LogLevelEnum.High);
var task = tasks.ToArray()[tasks.Count - 1];
//判断是否是二深位任务
var addrFrom = task.AddrFrom.Split("-");
if (addrFrom[4] == "02")
{
var res = WmsApi.AddWcsMoveTask(task.ID);
switch (res.ResData.ResType)
{
case WmsApiMoveTask.允许2升位执行:
break;
case WmsApiMoveTask.执行移库任务:
throw new KnownException($"堆垛机{obj.Entity.Code}需要先执行移库任务", LogLevelEnum.Mid);
case WmsApiMoveTask.一深位有出库任务:
task = db.Default.Queryable()
.Where(v => v.Type == TaskType.OutDepot && v.Status == TaskStatus.WaitingToExecute)
.Where(v => allOutCode.Contains(v.SrmStation) && v.AddrFrom == res.ResData.CellNo)
.First();
if (task == null) task.GetOutTask(db, allOutCode, floor, obj, index + 1);
break;
};
}
return task;
}
///
/// 获取AGV任务ID
///
/// db
///
public static int GetAGVTaskId(this SqlSugarHelper db)
{
var id = db.Default.Queryable().SplitTable(v => v.Take(1)).Max(v => v.ID);
return id + 1;
}
}
}