海波 张
7 天以前 b67787b031e357c60565d3e1aa8b829706e520e2
wms/TaskHelper.cs
@@ -1,6 +1,8 @@
using HH.WCS.ZhongCeJinTan.device;
using HH.WCS.ZhongCeJinTan.api;
using HH.WCS.ZhongCeJinTan.device;
using HH.WCS.ZhongCeJinTan.dispatch;
using HH.WCS.ZhongCeJinTan.util;
using ICSharpCode.SharpZipLib.Zip;
using Newtonsoft.Json;
using SqlSugar;
using System;
@@ -12,6 +14,8 @@
using System.Xml.Linq;
using static HH.WCS.ZhongCeJinTan.util.Settings;
using static HH.WCS.ZhongCeJinTan.wms.WcsModel;
namespace HH.WCS.ZhongCeJinTan.wms
{
@@ -56,6 +60,13 @@
            var task = db.Queryable<WMSTask>().Where(a => a.S_OP_CODE == no && a.S_SCHEDULE_TYPE== type).First();
            return task;
        }
        internal static WmsWork GetWmsWork(string no) {
            var db = new SqlHelper<WmsWork>().GetInstance();
            return db.Queryable<WmsWork>().Where(it => it.S_CODE == no).First();
        }
        internal static WMSTask GetTaskByCntrCode(string cntrCode)
@@ -212,6 +223,7 @@
                    CreateOneTask(operation);
                    break;
                case 7:
                    //出库两段任务
                    CreateOutTowTask(operation);
                    break;
                case 9:
@@ -242,6 +254,8 @@
        private static void CreateOneTask(WmsWork operation)
        {
            var tasks = new List<Task>();
            // 任务1
            var task1 = new WMSTask()
@@ -278,6 +292,10 @@
                N_PRIORITY = operation.N_PRIORITY,
                //工装类型
                TOOLSTYPE = operation.TOOLSTYPE,
            };
            try
@@ -290,12 +308,14 @@
                {
                    LocationHelper.LockLoc(operation.S_START_LOC, "出库锁", 2);
                    LocationHelper.LockLoc(operation.S_END_LOC, "入库锁", 1);
                    LogHelper.Info($"任务{task1.S_OP_CODE}创建成功", "任务");
                    LogHelper.Info($"任务{task1.S_CODE}创建成功", "任务");
                    var db = new SqlHelper<object>().GetInstance();
                    db.Updateable(operation).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
                    TaskHelper.opMesTask(task1, 0);
                }
                else {
                    LogHelper.Info($"任务{task1.S_OP_CODE}创建失败", "任务");
                    LogHelper.Info($"任务{task1.S_CODE}创建失败", "任务");
                }
            }
@@ -399,12 +419,14 @@
                if (CreateTask(task1) && CreateTask(task2))
                {
                    LocationHelper.LockLoc(operation.S_START_LOC, "出库锁", 2);
                    LocationHelper.LockLoc(operation.S_END_LOC, "入库锁", 1);
                    LocationHelper.LockLoc(operation.CONNECTION, "其他锁", 3);
                    //LocationHelper.LockLoc(operation.S_START_LOC, "出库锁", 2);
                    //LocationHelper.LockLoc(operation.S_END_LOC, "入库锁", 1);
                    //LocationHelper.LockLoc(operation.CONNECTION, "其他锁", 3);
                    LogHelper.Info($"任务{task1.S_CODE},{task2.S_CODE}创建成功", "任务");
                    var db = new SqlHelper<object>().GetInstance();
                    db.Updateable(operation).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
                    LogHelper.Info($"回报{task1.S_OP_CODE}", "回报Mes任务");
                    TaskHelper.opMesTask(task1, 0);
                }
                else
                {
@@ -424,107 +446,117 @@
            var ConnectionLoc = LocationHelper.GetLocOne(operation.CONNECTION);
            // 任务1
            var task1 = new WMSTask()
            var count = LocationHelper.GetConnectionTaskCount(operation.CONNECTION);
            LogHelper.Info($"CreateOneTask 作业:{operation.S_CODE},接驳位:{operation.CONNECTION},任务数量:{count}", "任务");
            if (count<=2)
            {
                // 作业编码
                S_OP_CODE = operation.S_CODE,
                // 任务号
                S_CODE = operation.S_CODE + "_1",
                // 任务类型
                N_TYPE = operation.N_TYPE,
                // 任务类型
                S_TYPE = operation.S_TYPE,
                // 起点货位
                S_START_LOC = operation.S_START_LOC,
                // 起点库区
                S_START_AREA = operation.S_START_AREA,
                // 终点货位
                S_END_LOC = operation.CONNECTION,
                // 终点库区
                S_END_AREA = ConnectionLoc.S_AREA_CODE,
                // 设备类型
                N_SCHEDULE_TYPE = 2,
                // 设备类型
                S_SCHEDULE_TYPE = "wcs",
                // 容器编码
                S_CNTR_CODE = operation.S_CNTR_CODE,
                //任务状态
                S_B_STATE = "未执行",
                // 优先级
                N_PRIORITY = operation.N_PRIORITY,
                //工装类型
                TOOLSTYPE = operation.TOOLSTYPE,
                //起点库区名称
                S_START_AREA_NAME = operation.S_START_AREA_NAME,
                //终点库区名称
                S_END_AREA_NAME = operation.CONNECTION_AREA,
            };
            // 任务2
            var task2 = new WMSTask()
            {
                // 作业编码
                S_OP_CODE = operation.S_CODE,
                // 任务号
                S_CODE = operation.S_CODE + "_2",
                // 任务类型
                N_TYPE = operation.N_TYPE,
                // 任务类型
                S_TYPE = operation.S_TYPE,
                // 起点货位
                S_START_LOC = operation.CONNECTION,
                // 起点库区
                S_START_AREA = ConnectionLoc.S_AREA_CODE,
                // 终点货位
                S_END_LOC = operation.S_END_LOC,
                // 终点库区
                S_END_AREA = operation.S_END_AREA,
                // 设备类型
                N_SCHEDULE_TYPE = 3,
                // 设备类型
                S_SCHEDULE_TYPE = "agv",
                // 容器编码
                S_CNTR_CODE = operation.S_CNTR_CODE,
                //任务状态
                S_B_STATE = "未执行",
                // 优先级
                N_PRIORITY = operation.N_PRIORITY,
                //工装类型
                TOOLSTYPE = operation.TOOLSTYPE,
                //起点库区名称
                S_START_AREA_NAME = operation.CONNECTION_AREA,
                //终点库区名称
                S_END_AREA_NAME = operation.S_END_AREA_NAME,
            };
            try
            {
                // 修改作业状态为执行中
                operation.N_B_STATE = 1;
                operation.S_B_STATE = "执行";
                if (CreateTask(task1) && CreateTask(task2))
                // 任务1
                var task1 = new WMSTask()
                {
                    LocationHelper.LockLoc(operation.S_START_LOC, "出库锁", 2);
                    LocationHelper.LockLoc(operation.S_END_LOC, "入库锁", 1);
                    LocationHelper.LockLoc(operation.CONNECTION, "入库锁", 1);
                    LogHelper.Info($"任务{task1.S_CODE},{task2.S_CODE}创建成功", "任务");
                    var db = new SqlHelper<object>().GetInstance();
                    db.Updateable(operation).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
                }
                else
                {
                    LogHelper.Info($"任务{task1.S_CODE},{task2.S_CODE}创建失败", "任务");
                }
                    // 作业编码
                    S_OP_CODE = operation.S_CODE,
                    // 任务号
                    S_CODE = operation.S_CODE + "_1",
                    // 任务类型
                    N_TYPE = operation.N_TYPE,
                    // 任务类型
                    S_TYPE = operation.S_TYPE,
                    // 起点货位
                    S_START_LOC = operation.S_START_LOC,
                    // 起点库区
                    S_START_AREA = operation.S_START_AREA,
                    // 终点货位
                    S_END_LOC = operation.CONNECTION,
                    // 终点库区
                    S_END_AREA = ConnectionLoc.S_AREA_CODE,
                    // 设备类型
                    N_SCHEDULE_TYPE = 2,
                    // 设备类型
                    S_SCHEDULE_TYPE = "wcs",
                    // 容器编码
                    S_CNTR_CODE = operation.S_CNTR_CODE,
                    //任务状态
                    S_B_STATE = "未执行",
                    // 优先级
                    N_PRIORITY = operation.N_PRIORITY,
                    //工装类型
                    TOOLSTYPE = operation.TOOLSTYPE,
                    //起点库区名称
                    S_START_AREA_NAME = operation.S_START_AREA_NAME,
                    //终点库区名称
                    S_END_AREA_NAME = operation.CONNECTION_AREA,
                };
                // 任务2
                var task2 = new WMSTask()
                {
                    // 作业编码
                    S_OP_CODE = operation.S_CODE,
                    // 任务号
                    S_CODE = operation.S_CODE + "_2",
                    // 任务类型
                    N_TYPE = operation.N_TYPE,
                    // 任务类型
                    S_TYPE = operation.S_TYPE,
                    // 起点货位
                    S_START_LOC = operation.CONNECTION,
                    // 起点库区
                    S_START_AREA = ConnectionLoc.S_AREA_CODE,
                    // 终点货位
                    S_END_LOC = operation.S_END_LOC,
                    // 终点库区
                    S_END_AREA = operation.S_END_AREA,
                    // 设备类型
                    N_SCHEDULE_TYPE = 3,
                    // 设备类型
                    S_SCHEDULE_TYPE = "agv",
                    // 容器编码
                    S_CNTR_CODE = operation.S_CNTR_CODE,
                    //任务状态
                    S_B_STATE = "未执行",
                    // 优先级
                    N_PRIORITY = operation.N_PRIORITY,
                    //工装类型
                    TOOLSTYPE = operation.TOOLSTYPE,
                    //起点库区名称
                    S_START_AREA_NAME = operation.CONNECTION_AREA,
                    //终点库区名称
                    S_END_AREA_NAME = operation.S_END_AREA_NAME,
                };
                try
                {
                    // 修改作业状态为执行中
                    operation.N_B_STATE = 1;
                    operation.S_B_STATE = "执行";
                    if (CreateTask(task1) && CreateTask(task2))
                    {
                        //LocationHelper.LockLoc(operation.S_START_LOC, "出库锁", 2);
                        //LocationHelper.LockLoc(operation.S_END_LOC, "入库锁", 1);
                        //LocationHelper.LockLoc(operation.CONNECTION, "入库锁", 1);
                        LogHelper.Info($"任务{task1.S_CODE},{task2.S_CODE}创建成功", "任务");
                        var db = new SqlHelper<object>().GetInstance();
                        db.Updateable(operation).UpdateColumns(it => new { it.N_B_STATE, it.S_B_STATE }).ExecuteCommand();
                        TaskHelper.opMesTask(task2, 0);
                    }
                    else
                    {
                        LogHelper.Info($"任务{task1.S_CODE},{task2.S_CODE}创建失败", "任务");
                    }
                }
                catch (Exception e)
                {
                    LogHelper.Info("CreateOneTask异常信息" + e.Message, "任务");
                    throw;
                }
            }
            catch (Exception e)
            {
                LogHelper.Info("CreateOneTask异常信息" + e.Message, "任务");
                throw;
            }
        }
@@ -546,6 +578,7 @@
            var db = new SqlHelper<WmsTaskAction>().GetInstance();
            var action = new WmsTaskAction() {
                S_ACTION = state.ToString(),
                N_ACTION_CODE = state,
                S_TASK_CODE = no,
                S_EQ_CODE = forkliftNo,
                S_EQ_TYPE = "agv",
@@ -553,7 +586,95 @@
            };
            return db.Insertable(action).ExecuteCommand() > 0;
        }
        internal static WmsTaskAction GetActionRecord(string taskNo,string action)
        internal static bool opMesTask(WMSTask task, int state)
        {
            HttpHelper apiHelper = new HttpHelper();
            string baseUrl = Settings.MesApiAddres;
            try
            {
                var cntrItem = ContainerHelper.GetCntrItem(task.S_CNTR_CODE);
                if (cntrItem == null)
                {
                    LogHelper.Info($"任务{task.S_CODE}没查到容器物料{task.S_CNTR_CODE}", "回报Mes任务");
                    return false;
                }
                var work = TaskHelper.GetWmsWork(task.S_OP_CODE);
                if (work == null) {
                    LogHelper.Info($"任务{task.S_CODE}没查到作业{task.S_OP_CODE}", "回报Mes任务");
                    return false;
                }
                var endArea = "";
                if (LocationHelper.GetErroArea(task.S_END_AREA))
                {
                    if (task.S_TYPE.Contains("出库"))
                    {
                        endArea = task.S_END_LOC;
                    }
                    else {
                        endArea = task.S_END_AREA;
                    }
                }
                else {
                    if (task.S_TYPE.Contains("出库"))
                    {
                        endArea = task.S_END_LOC;
                    }
                    else {
                        endArea = work.S_END_AREA;
                    }
                }
                var interact = new
                {
                    taskNo = task.S_OP_CODE,//任务号
                    updater = "WMS",// 操作人 如WMS/MES等
                    endStock = endArea,//终点
                    taskStatus = state,//0:初始状态,1:进行中,2:完成,3:任务取消
                    updateTime = DateTime.Now.ToString(),//操作时间
                    TurnCardNum  = cntrItem.TurnCardNum,//周转卡号
                    TOOLS_NO = task.S_CNTR_CODE//工装编号
                };
                LogHelper.Info("Mes更新任务状态 地址信息:" + baseUrl + "updateTask", "回报Mes任务");
                LogHelper.Info("Mes更新任务状态 参数信息:" + JsonConvert.SerializeObject(interact), "回报Mes任务");
                var result = apiHelper.Post(baseUrl + "updateTask", JsonConvert.SerializeObject(interact));
                LogHelper.Info("Mes更新任务状态 返回信息:" + JsonConvert.SerializeObject(result), "回报Mes任务");
                if (!string.IsNullOrEmpty(result))
                {
                    var res = JsonConvert.DeserializeObject<MesTaskReturn>(result);
                    if (res.success && res.code == "0")
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    LogHelper.Info("Mes更新任务状态 返回信息为空", "回报Mes任务");
                    return false;
                }
            }
            catch (Exception ex)
            {
                LogHelper.Info("Mes更新任务状态异常"+ex.Message, "回报Mes任务");
                return false;
            }
        }
            internal static WmsTaskAction GetActionRecord(string taskNo,string action)
        {
            var db = new SqlHelper<WmsTaskAction>().GetInstance();
@@ -590,6 +711,7 @@
            var action = new WmsTaskAction()
            {
                S_ACTION = state.ToString(),
                N_ACTION_CODE = int.Parse(state),
                S_TASK_CODE = no,
                S_EQ_CODE = forkliftNo,
                S_EQ_TYPE = "wcs",
@@ -707,12 +829,28 @@
            if (task.S_TYPE.Contains("出库") && task.S_SCHEDULE_TYPE.Contains("wcs")) {
                LocationHelper.LockLoc(task.S_END_LOC, "出库锁", 2);
            }
            if (task.S_TYPE.Contains("出库")&&task.S_SCHEDULE_TYPE.Contains("agv") )
            if (task.S_SCHEDULE_TYPE.Contains("agv"))
            {
                if (LocationHelper.GetErroArea(task.S_END_AREA))
                {
                    db.Deleteable<Container>().Where(it => it.S_CODE == task.S_CNTR_CODE).ExecuteCommand();
                    db.Deleteable<LocCntrRel>().Where(it => it.S_CNTR_CODE == task.S_CNTR_CODE).ExecuteCommand();
                    db.Deleteable<CntrItemRel>().Where(it => it.S_CNTR_CODE == task.S_CNTR_CODE).ExecuteCommand();
                }
                else
                {
                    TaskHelper.opMesTask(task, 2);
                }
            }
            if (task.S_TYPE.Contains("出库") && task.S_SCHEDULE_TYPE.Contains("agv"))
            {
                var location = db.Queryable<Location>().Where(a => a.S_CODE == task.S_END_LOC).First();
                location.N_CURRENT_NUM = 0;
                db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM}).ExecuteCommand();
                db.Updateable(location).UpdateColumns(it => new { it.N_CURRENT_NUM }).ExecuteCommand();
                db.Deleteable<Container>().Where(it => it.S_CODE == task.S_CNTR_CODE).ExecuteCommand();
                db.Deleteable<LocCntrRel>().Where(it => it.S_CNTR_CODE == task.S_CNTR_CODE).ExecuteCommand();
                db.Deleteable<CntrItemRel>().Where(it => it.S_CNTR_CODE == task.S_CNTR_CODE).ExecuteCommand();
@@ -847,6 +985,79 @@
        }
        /// <summary>
        /// 根据任务状态和起点和类型查找任务
        /// </summary>
        /// <param name="state"></param>
        /// <returns></returns>
        internal static WMSTask GetTaskByType(string start,string type,string state)
        {
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                return db.Queryable<WMSTask>().Where(a => a.S_B_STATE.Trim() == state && a.S_TYPE.Contains(type) && a.S_START_LOC.Contains(start)).First();
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex.Message, ex);
                return new WMSTask();
            }
        }
        /// <summary>
        /// 根据作业编码和设备类型获取单个任务
        /// </summary>
        /// <param name="state"></param>
        /// <returns></returns>
        internal static WMSTask GetTaskByWork(string eq, string opCode)
        {
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                return db.Queryable<WMSTask>().Where(a =>  a.S_SCHEDULE_TYPE.Contains(eq) && a.S_OP_CODE.Contains(opCode)).First();
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex.Message, ex);
                return new WMSTask();
            }
        }
        /// <summary>
        /// 返回当前接驳位执行中任务数量
        /// </summary>
        internal static int GetConnectionTask(string Connection)
        {
            var db = new SqlHelper<object>().GetInstance();
            var ConnectionList = 0;
            ConnectionList = db.Queryable<WMSTask>().Where(a => a.S_END_LOC.Contains(Connection) && a.S_TYPE.Contains("出库") && a.S_B_STATE != "完成" && a.S_B_STATE != "取消" && a.S_B_STATE != "未执行").ToList().Count();
            return ConnectionList;
        }
        //internal static bool CreateAgvState(AgvState agvState)
        //{
        //    try
        //    {
        //        var db = new SqlHelper<object>().GetInstance();
        //        return db.Insertable<AgvState>(agvState).ExecuteCommand() > 0;
        //    }
        //    catch (Exception ex)
        //    {
        //        LogHelper.Info($"添加Agv动作缓存异常" + ex.Message, "NDC");
        //        throw;
        //    }
        //}
        internal static bool CreateMesKtTask(MesKtTask cntr)
        {
            try
@@ -857,12 +1068,98 @@
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                LogHelper.Info($"添加Mes空托缓存异常" + ex.Message, "Mes任务下发");
                throw;
            }
        }
        internal static MesKtTask GetMesKtTask(string end)
        {
                var db = new SqlHelper<object>().GetInstance();
                return db.Queryable<MesKtTask>().Where(a => a.Location_To==end && a.Status=="N").First();
        }
        internal static bool ChangeMesKtTask(MesKtTask kt)
        {
            var db = new SqlHelper<object>().GetInstance();
            kt.Status = "Y";
            return db.Updateable(kt).UpdateColumns(it => new {
                it.Status
            }).ExecuteCommand()>0;
        }
        internal static List<UnlimitedLoc> GetMesKtLoc()
        {
            var db = new SqlHelper<object>().GetInstance();
            return db.Queryable<UnlimitedLoc>().Where(a=>a.Enable=="Y").ToList();
        }
        /// <summary>
        /// 获取入库优先级表
        /// </summary>
        /// <returns></returns>
        internal static List<InPri> GetInPri()
        {
            var db = new SqlHelper<object>().GetInstance();
            return db.Queryable<InPri>().Where(a=>a.Enable=="Y") .ToList();
        }
        /// <summary>
        /// 获取出库提高优先级表
        /// </summary>
        /// <returns></returns>
        internal static OutMinutePriority GetOutMinutePriority()
        {
            var db = new SqlHelper<object>().GetInstance();
            return db.Queryable<OutMinutePriority>().Where(a => a.Enable == "Y").First();
        }
        /// <summary>
        /// 添加agv动作缓存
        /// </summary>
        /// <param name="agv"></param>
        /// <returns></returns>
        internal static bool CreateAgvActionState(AgvActionState agv)
        {
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                return db.Insertable<AgvActionState>(agv).ExecuteCommand() > 0;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                throw;
            }
        }
        /// <summary>
        /// 获取agv动作
        /// </summary>
        /// <returns></returns>
        internal static List<AgvActionState> GetAgvActionState( string taskNo)
        {
            var db = new SqlHelper<object>().GetInstance();
            return db.Queryable<AgvActionState>().Where(a => a.task_no==taskNo).ToList();
        }
    }
}