using NetTaste;
using ServiceCenter.Extensions;
using ServiceCenter.Logs;
using ServiceCenter.Redis;
using ServiceCenter.SqlSugars;
using SqlSugar;
using WCS.Entity;
using TaskStatus = WCS.Entity.TaskStatus;
namespace WCS.WorkEngineering.Extensions
{
///
/// 任务扩展
///
public static class TaskExtension
{
///
/// 更新任务执行记录
/// 同步更新历史任务
///
/// 任务信息
/// 数据库上下文
/// 当前地址
/// 描述
public static void AddWCS_TASK_DTL(this WCS_TaskInfo task, SqlSugarScopeProvider db, string curPoint, string desc) => task.AddWCS_TASK_DTL(db, curPoint, "", desc);
///
/// 更新任务执行记录
/// 同步更新历史任务
///
/// 任务信息
/// 数据库上下文
/// 当前地址
/// 下一个地址
/// 描述
public static void AddWCS_TASK_DTL(this WCS_TaskInfo task, SqlSugarScopeProvider db, string curPoint, string nextPoint, string desc)
{
db.Insertable(new WCS_TaskDtl
{
ID = Guid.NewGuid(),
ParentTaskCode = task.ID,
CurPoint = curPoint,
NextPoint = nextPoint,
Desc = desc,
AddWho = "WCS"
}).SplitTable().ExecuteCommand();
task.UpdateableOldTask(db);
}
///
/// 更新历史表数据
///
///
///
public static void UpdateableOldTask(this WCS_TaskInfo taskInfo, SqlSugarScopeProvider db)
{
if (taskInfo.Status == TaskStatus.NewBuild) return;
// 同步任务信息
var taskOld = db.Queryable().SplitTable(tabs => tabs.Take(2)).Where(v => v.Id == taskInfo.ID).OrderByDescending(v => v.AddTime).First();
if (taskOld is not null)
{
if (taskInfo.Status >= TaskStatus.Finish) taskInfo.CompleteOrCancelTasks(db);
else
{
taskOld = taskInfo.Mapper();
taskOld.Id = taskInfo.ID;
db.Updateable(taskOld).Where(x => x.Id == taskOld.Id).SplitTable(x => x.Take(2)).ExecuteCommand();
}
}
else
{
throw new KnownException($"WCS_TaskOld表中不存在任务:{taskInfo.ID},无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
}
}
///
/// 完成或取消任务
///
///
///
public static void CompleteOrCancelTasks(this WCS_TaskInfo taskInfo, SqlSugarScopeProvider db)
{
if (taskInfo.Status < Entity.TaskStatus.Finish)
throw new KnownException("任务未完成或取消,无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
// 任务完成或取消,进行相关同步动作
var taskOld = db.Queryable().SplitTable(tabs => tabs.Take(2)).Where(v => v.Id == taskInfo.ID).OrderByDescending(v => v.AddTime).First();
if (taskOld is not null)
{
taskOld = taskInfo.Mapper();
taskOld.Id = taskInfo.ID;
//更新任务历史表,删除任务当前表
db.Updateable(taskOld).SplitTable(x => x.Take(2)).ExecuteCommand();
db.Deleteable(taskInfo).ExecuteCommand();
}
else
{
throw new KnownException($"WCS_TaskOld表中不存在任务:{taskInfo.ID},无法执行WCS_TaskInfo与WCS_TaskOld同步动作", LogLevelEnum.Mid);
}
}
///
/// 更新表数据
///
///
///
public static void Updateable(this WCS_TaskInfo taskInfo, SqlSugarScopeProvider db)
{
taskInfo.EditTime = DateTime.Now;
taskInfo.EditWho = "WCS";
db.Updateable(taskInfo).ExecuteCommand();
}
/////
///// 获取出库任务
/////
///// 任务
///// db
///// 可用出库站台
///// 楼层
///// 堆垛机
///// 递归次数
/////
/////
//public static WCS_TaskInfo GetOutTask(this WCS_TaskInfo taskInfo, SqlSugarHelper db, List allOutCode, int floor, SRM obj, int index = 1)
//{
// 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;
}
///
/// 更新任务执行记录
///
/// 任务信息
public static void UpdateRedisHash(this WCS_TaskInfo task)
{
var key = $"Hash:{task.ID}";
if (task.Status >= TaskStatus.Finish)
{
RedisHub.WMS.Del(key);
}
else
{
RedisHub.WMS.HMSet(key, task.ToDic());
}
}
#region 工字轮支线分流
public static string GetMatList(this List matList)
{
return matList.Distinct().Aggregate("", (current, mat) => current + $"[{mat}]");
}
#endregion 工字轮支线分流
///
/// 去除转义字符
///
///
///
public static string RemoveEscapeCharacters(this string? value)
{
return value.Trim('\0', '\a', '\b', '\f', '\n', '\r', '\t', '\v').Replace("�\u0012", "").Replace("\\0", "").Replace("\\r", "").Replace("\0", "").Trim();
}
public static void UpdataErrorinfo(this BaseErrorinfoWcs error)
{
SqlSugarHelper.Do(db =>
{
var errorinfoWcs = db.Default.Queryable().With(SqlWith.NoLock).Where(v => v.ContBarCode == error.ContBarCode && v.Message == error.Message).First();
if (errorinfoWcs != null)
{
errorinfoWcs.Count = errorinfoWcs.Count+1;
db.Default.Updateable(errorinfoWcs).ExecuteCommand();
}
else
{
db.Default.Insertable(error).ExecuteCommand();
}
});
}
}
///
/// 垛形位信息
///
public class StackPosInfo
{
///
/// 任务号
///
public int TaskNumber { get; set; }
///
/// 是否空置
///
public bool IsEmpty { get; set; }
///
/// 坐标号
///
public string XYNo { get; set; }
///
/// 物料编码
///
public string MatCode { get; set; }
///
/// 正反面
///
public int SideNum { get; set; }
///
/// 工字轮类型
///
public string SpoolType { get; set; }
///
/// 是否结束
///
public bool Finish { get; set; }
}
}