using HH.WCS.QingXigongchang.process;
|
using HH.WCS.QingXigongchang.util;
|
using Newtonsoft.Json;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Linq.Expressions;
|
|
namespace HH.WCS.QingXigongchang.wms
|
{
|
internal class TaskHelper
|
{
|
internal static string GenerateTaskNo()
|
{
|
var id = SYSHelper.GetSerialNumber("任务号", "TN");
|
var date = DateTime.Now.ToString("yyMMdd");
|
return $"TN{date}{id.ToString().PadLeft(4, '0')}";
|
}
|
internal static bool UpdateStatus(WMSTask task, string status)
|
{
|
var res = false;
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
task.S_B_STATE = status;
|
db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand();
|
return res;
|
}
|
internal static bool UpdateInfo(WMSTask task, string sourceNo, string endBit, string status)
|
{
|
var res = false;
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
task.S_B_STATE = status;
|
task.S_SRC_NO = sourceNo;
|
task.S_END_LOC = endBit;
|
db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE, it.S_SRC_NO, it.S_END_LOC }).ExecuteCommand();
|
return res;
|
}
|
internal static WMSTask GetTask(string no)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = db.Queryable<WMSTask>().Where(a => a.S_TASK_NO.Trim() == no).ToList().FirstOrDefault();
|
if (task != null)
|
{
|
task.S_TASK_NO = task.S_TASK_NO.Trim();
|
task.S_START_LOC = task.S_START_LOC.Trim();
|
task.S_END_LOC = task.S_END_LOC.Trim();
|
}
|
return task;
|
}
|
internal static WMSTask GetTask(Expression<Func<WMSTask, bool>> expression, Expression<Func<WMSTask, object>> expression2, OrderByType type = OrderByType.Asc)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = db.Queryable<WMSTask>().Where(expression).OrderBy(expression2, type).ToList().FirstOrDefault();
|
if (task != null)
|
{
|
task.S_TASK_NO = task.S_TASK_NO.Trim();
|
task.S_START_LOC = task.S_START_LOC.Trim();
|
task.S_END_LOC = task.S_END_LOC.Trim();
|
}
|
return task;
|
}
|
internal static WMSTask GetTaskBySrcNo(string no)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = db.Queryable<WMSTask>().Where(a => a.S_SRC_NO.Trim() == no).First();
|
return task;
|
}
|
internal static List<WMSTask> GetTaskByStart(string bit)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = db.Queryable<WMSTask>().Where(a => a.S_START_LOC.Trim() == bit.Trim()).ToList();
|
return task;
|
}
|
internal static List<WMSTask> GetTaskByEnd(string bit)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = db.Queryable<WMSTask>().Where(a => a.S_END_LOC.Trim() == bit.Trim()).ToList();
|
return task;
|
}
|
internal static List<WMSTask> GetTaskByType(string taskType)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
return db.Queryable<WMSTask>().Where(a => a.S_TYPE.Trim() == taskType).ToList();
|
}
|
internal static bool CreateTask(string no, string from, string to, string taskType, int pri, string cntrInfo, int cntrCount = 1, int startLayer = 1, int endLayer = 1, string note = "", bool lockLoc = false, string TwoEndLoc = "")
|
{
|
var fromLoc = LocationHelper.GetLoc(from);
|
var endLoc = LocationHelper.GetLoc(to);
|
if (fromLoc.S_AREA_CODE == "YWLRGDD")
|
{
|
//查询任务表 要求是只能生成两个任务 起点库区为YWLRGDD hh_plg 2025年6月9日
|
List<string> TaskState = new List<string>() { "完成", "取消" };
|
var TaskListNum = LocationHelper.GetList<WMSTask>(x => x.S_START_LAREA == "YWLRGDD" && !TaskState.Contains(x.S_B_STATE));
|
if (TaskListNum.Count() >= 2)
|
{
|
LogHelper.Info($"CreateTransport- CreateTask Error" + $"起点库区为YWLRGDD 则最多只能生成两个任务");
|
return false;
|
}
|
}
|
else if (endLoc.S_AREA_CODE == "YWLWJJB")
|
{
|
//查询任务表 要求是只能生成两个任务 起点库区为YWLWJJB hh_plg 2025年6月9日
|
List<string> TaskState = new List<string>() { "完成", "取消" };
|
var TaskListNum = LocationHelper.GetList<WMSTask>(x => x.S_END_LAREA == "YWLWJJB" && !TaskState.Contains(x.S_B_STATE));
|
if (TaskListNum.Count() >= 2)
|
{
|
LogHelper.Info($"CreateTransport- CreateTask Error" + $"终点库区为YWLWJJB 则最多只能生成两个任务");
|
return false;
|
}
|
}
|
if (!taskType.Contains("清溪纸箱"))
|
{
|
if (fromLoc == null || endLoc == null)
|
{
|
LogHelper.Info($"CreateTransport- CreateTask Error" + $"起点或终点货位数据null");
|
return false;
|
}
|
if (fromLoc.S_AREA_CODE != "YWLWJJB")
|
{
|
if (fromLoc.S_LOCK_STATE.Trim() != "无" || endLoc.S_LOCK_STATE.Trim() != "无")
|
{
|
LogHelper.Info($"CreateTransport- CreateTask Error" + $"起点 {fromLoc.S_LOCK_STATE}或终点{endLoc.S_LOCK_STATE}状态不为 无 ");
|
return false;
|
}
|
}
|
}
|
WMSTask wmsTask = new WMSTask()
|
{
|
S_TASK_NO = GenerateTaskNo(),
|
S_START_LAREA = fromLoc.S_AREA_CODE,
|
S_END_LAREA = endLoc.S_AREA_CODE,
|
S_DEPART_NAME = endLoc.S_WH_CODE,//taskType.Contains("原物料") ? "原物料" : (endLoc.S_WH_CODE == "CK002" ? "瓶盖" : GetDeptName(taskType)),
|
S_START_LOC = from,
|
S_END_LOC = to,
|
S_TYPE = taskType,
|
S_SRC_NO = no,
|
N_PRIORITY = pri,
|
S_NOTE = note,
|
S_TWO_END_LOC = TwoEndLoc,
|
S_WORK_MODE = "agv",
|
S_B_STATE = "未执行",
|
S_CNTRS = cntrInfo,
|
N_START_LAYER = startLayer,
|
N_END_LAYER = endLayer,
|
N_CNTR_COUNT = cntrCount
|
};
|
|
LogHelper.Info($"CreateTransport- CreateTask" + $"{JsonConvert.SerializeObject(wmsTask)}");
|
return CreateTask(wmsTask, lockLoc);
|
}
|
internal static string GetDeptName(string taskType)
|
{
|
if (taskType.Contains("成品")) return "成品";
|
|
else return "瓶坯";
|
}
|
internal static bool CheckExist(string no)
|
{
|
return GetTask(no.Trim()) != null;
|
}
|
internal static bool UpdateStatus(string no, string status)
|
{
|
var res = false;
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
var task = db.Queryable<WMSTask>().Where(a => a.S_TASK_NO.Trim() == no).First();
|
if (task != null)
|
{
|
task.S_B_STATE = status;
|
//需要判断任务是否失败或者已完成,不允许再修改
|
res = db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand() > 0;
|
}
|
return res;
|
}
|
internal static bool AddActionRecord(string no, int state, string forkliftNo, string extData)
|
{
|
var db = new SqlHelper<WmsTaskAction>().GetInstance();
|
var action = new WmsTaskAction()
|
{
|
S_ACTION_CODE = state.ToString(),
|
S_TASK_NO = no,
|
S_EQ_NO = forkliftNo,
|
S_EQ_TYPE = "agv",
|
S_DATA = extData
|
};
|
return db.Insertable(action).ExecuteCommand() > 0;
|
}
|
|
internal static bool lOCReSetValue(Expression<Func<WMSTask, bool>> exQ, Action<WMSTask> exu, Action<List<WMSTask>, SqlSugarClient> action = null)
|
{
|
bool res = false;
|
SqlSugarClient db = new SqlHelper<object>().GetInstance();
|
List<WMSTask> models = db.Queryable<WMSTask>().Where(exQ).ToList();
|
if (models != null && models.Count > 0)
|
{
|
if (exu != null)
|
{
|
res = (db.Updateable(models).ReSetValue(exu).ExecuteCommand() > 0);
|
LogHelper.Info("lOCReSetValue:结果" + res.ToString());
|
}
|
action?.Invoke(models, db);
|
}
|
else
|
{
|
LogHelper.Info("lOCReSetValue 失败,没有找到数据 ");
|
}
|
return res;
|
}
|
|
internal static bool CheckActionRecordExist(string no, string code)
|
{
|
var db = new SqlHelper<WmsTaskAction>().GetInstance();
|
return db.Queryable<WmsTaskAction>().Count(a => a.S_TASK_NO.Trim() == no.Trim() && a.S_ACTION_CODE == code) > 0;
|
}
|
internal static void Begin(WMSTask task)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
if (task != null)
|
{
|
if (task.S_B_STATE.Trim() == "已推送")
|
{
|
task.S_B_STATE = "执行中";
|
task.T_START_TIME = DateTime.Now;
|
db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE, it.T_START_TIME }).ExecuteCommand();
|
}
|
}
|
}
|
internal static void End(WMSTask task)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
if (task != null)
|
{
|
task.S_B_STATE = "完成";
|
task.T_END_TIME = DateTime.Now;
|
db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE, it.T_END_TIME }).ExecuteCommand();
|
}
|
|
//plg 2025年6月13日 10:42:24
|
if (task.S_END_LAREA == "YWLWJJB" && task.S_START_LAREA != "YWLRGDD")
|
{
|
var model = db.Queryable<Location>().Where(a => a.S_LOC_CODE == task.S_TWO_END_LOC).First();
|
//先解锁终点 在锁定
|
db.Ado.BeginTran();
|
try
|
{
|
model.S_LOCK_STATE = "无";
|
var res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand() > 0;
|
LogHelper.Info(task.S_TWO_END_LOC + "LockLoc:锁结果" + res);
|
db.Ado.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
db.Ado.RollbackTran();
|
LogHelper.Info("CreateTask 失败 " + ex.Message);
|
}
|
var b = TaskProcess.CreateTransport(task.S_SRC_NO, task.S_END_LOC, task.S_TWO_END_LOC, "原物料搬运-纸箱", task.S_CNTRS.Split(',').ToList(), task.N_START_LAYER, 1, task.N_CNTR_COUNT, task.N_PRIORITY);
|
}
|
}
|
internal static void Fail(WMSTask task)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
if (task != null)
|
{
|
//判断有没有取货完成,没有就变成失败。有取货完成默认完成了(跟据项目而定,有些项目人工拉走了也没有放到终点)。
|
task.S_B_STATE = "失败";
|
db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand();
|
}
|
}
|
|
internal static void SetTaskState(WMSTask task, string state)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
if (task != null)
|
{
|
//判断有没有取货完成,没有就变成失败。有取货完成默认完成了(跟据项目而定,有些项目人工拉走了也没有放到终点)。
|
task.S_B_STATE = state;
|
task.T_MODIFY = DateTime.Now;
|
db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE, it.T_MODIFY }).ExecuteCommand();
|
}
|
}
|
internal static void BeEnd(WMSTask task)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
if (task != null)
|
{
|
task.S_B_STATE = "强制完成";
|
db.Updateable(task).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand();
|
}
|
}
|
internal static bool CreateTask(WMSTask wmsTask, bool lockLoc = false)
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
db.Ado.BeginTran();
|
try
|
{
|
if (lockLoc)
|
{
|
var model = db.Queryable<Location>().Where(a => a.S_LOC_CODE == wmsTask.S_START_LOC).First();
|
|
model.S_LOCK_STATE = "出库锁";
|
var res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand() > 0;
|
LogHelper.Info(wmsTask.S_START_LOC + "LockLoc:锁结果" + res);
|
|
model = db.Queryable<Location>().Where(a => a.S_LOC_CODE == wmsTask.S_END_LOC).First();
|
model.S_LOCK_STATE = "入库锁";
|
res = db.Updateable(model).UpdateColumns(it => new { it.S_LOCK_STATE }).ExecuteCommand() > 0;
|
LogHelper.Info(wmsTask.S_END_LOC + "LockLoc:锁结果" + res);
|
|
}
|
db.Insertable(wmsTask).ExecuteCommand();
|
db.Ado.CommitTran();
|
}
|
catch (Exception ex)
|
{
|
db.Ado.RollbackTran();
|
LogHelper.Info("CreateTask 失败 " + ex.Message);
|
return false;
|
}
|
return true;
|
}
|
|
static DateTime ShuiGaiTask = DateTime.Now;
|
|
/// <summary>
|
/// 根据任务状态获取任务
|
/// </summary>
|
/// <param name="state"></param>
|
/// <returns></returns>
|
internal static List<WMSTask> GetTaskListByState(string state)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
//LogHelper.Info(DateTime.Now.ToLongTimeString() + "=====" + ShuiGaiTask.ToString());
|
return db.Queryable<WMSTask>().OrderBy(" N_PRIORITY DESC ").Where(a => a.S_B_STATE.Trim() == state).Take(10).ToList();
|
|
}
|
|
internal static List<WMSTask> GetTaskListByState2(string state)
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
//LogHelper.Info(DateTime.Now.ToLongTimeString() + "=====" + ShuiGaiTask.ToString());
|
|
var list2 = db.Queryable<WMSTask>().OrderBy(" N_PRIORITY DESC ").Where(a => a.S_B_STATE.Trim() == state).Take(4).ToList();
|
|
return list2;
|
}
|
|
#region 任务切面处理
|
|
internal static T GetTSingle<T>(Expression<Func<T, bool>> expression) where T : class, new()
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var t = db.Queryable<T>().Where(expression).ToList().FirstOrDefault();
|
return t;
|
}
|
internal static List<T> GetTList<T>(Expression<Func<T, bool>> expression) where T : class, new()
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
var t = db.Queryable<T>().Where(expression).ToList();
|
return t;
|
}
|
|
internal static bool InsertT<T>(T t) where T : class, new()
|
{
|
var db = new SqlHelper<object>().GetInstance();
|
return db.Insertable(t).ExecuteCommand() > 0;
|
}
|
|
internal static void DoUpdate<T>(T t, Expression<Func<T, object>> columns) where T : class, new()
|
{
|
var db = new SqlHelper<WMSTask>().GetInstance();
|
if (t != null)
|
{
|
db.Updateable(t).UpdateColumns(columns).ExecuteCommand();
|
}
|
}
|
|
#endregion
|
|
|
internal static AgvTask GetAgvTask(WMSTask wmsTask)
|
{
|
var db = new SqlHelper<AgvTask>().GetInstance(true);
|
var task = db.Queryable<AgvTask>().Where(a => a.CN_S_TASK_NO.Trim() == wmsTask.S_TASK_NO).ToList().FirstOrDefault();
|
return task;
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
[SugarTable("dbo.TN_SYS_TASK")]
|
public class AgvTask
|
{
|
public string CN_GUID { get; set; }
|
public int CN_N_STATE { get; set; }
|
public int CN_N_INDEX { get; set; }
|
public int CN_N_FLAG { get; set; }
|
public string CN_S_ERR { get; set; }
|
public int CN_N_TSNO { get; set; }
|
public int CN_N_PRI { get; set; }
|
public int CN_N_IKEY { get; set; }
|
public string CN_S_TASK_NO { get; set; }
|
public DateTime CN_DT_CREATE { get; set; }
|
}
|
}
|