1
zxx
2 天以前 d66d362ee6d76f02331e56df1fdec1c2114c9f3e
HH.WCS.Mobox3/HH.WCS.Mobox3.XiaoMi/process/TaskProcess.cs
@@ -29,6 +29,7 @@
using System.Threading.Tasks;
using HH.WCS.XiaoMi.LISTA.dispatch;
using static HH.WCS.XiaoMi.LISTA.dispatch.RcsHelper;
using System.Diagnostics;
namespace HH.WCS.XiaoMi.process
{
@@ -124,8 +125,8 @@
                CacheBitCancelUpdate(mst);
                ////小米订单取消
                //CancelModel cancelModel = new CancelModel();
                //cancelModel.order_id = mst.S_WORKSHOP_NO;
                //cancelModel.order_command_type_id = "2";
                //cancelModel.order_name = mst.S_CODE;
                //cancelModel.order_command_type_id = 2;
                //RcsHelper.CancelOrder(cancelModel);
            }
@@ -386,7 +387,7 @@
                        model.order_name = mst.S_CODE;
                        model.priority = 1;
                        model.dead_line = DateTime.Now.ToString();
                        model.ts_name = mst.S_TYPE;
                        model.ts_name = "p2p";
                        model.parameters = parme;
                        //model.parameters = new AntsParasModel { 
                        //    src = mst.S_START_LOC,
@@ -410,9 +411,9 @@
                        PickingTaskModel model = new PickingTaskModel();
                        model.order_name = mst.S_CODE;
                        model.priority = "1";
                        model.priority = 1;
                        model.dead_line = DateTime.Now.ToString();
                        model.ts_name = mst.S_TYPE;
                        model.ts_name = "p2p";
                        model.parameters = parme;
                        //model.parameters = new AntsParasModel { 
                        //    src = mst.S_START_LOC,
@@ -423,7 +424,10 @@
                    }
                    else if (mst.S_TYPE == "inbound")
                    {
                        string tote_id = $"\"tote_id\":\"{mst.S_FRAME_CODE}\",";
                        //查出货架编码
                        var db = new SqlHelper<Object>().GetInstance();
                        var locFrameRel = db.Queryable<LocFrameRel>().Where(a => a.S_LOC_CODE == mst.S_START_LOC).First();
                        string tote_id = $"\"tote_id\":\"{locFrameRel.S_FRAME_CODE}\",";
                        string task_type = $"\"task_type\":\"{mst.S_TYPE}\",";
                        string src = $"\"src\":\"{mst.S_START_LOC}\",";
                        string dst = $"\"dst\":\"{mst.S_END_LOC}\",";
@@ -435,15 +439,15 @@
                        string parmeD = "}";
                        string parmezS = "[";
                        string parmezD = "]";
                        string parme = parmeS + src + dst + extra_info + parmeS + parmezS + layer + put + parmeD + parmezD + parmeD;
                        string parme = parmeS + tote_id + task_type + src + dst + extra_info + parmezS+ parmeS  + layer + put + parmeD + parmezD + parmeD;
                        LogHelper.Info($"推送任务参数{parme}", "任务");
                        PickingTaskModel model = new PickingTaskModel();
                        model.order_name = mst.S_CODE;
                        model.priority = "1";
                        model.priority = 1;
                        model.dead_line = DateTime.Now.ToString();
                        model.ts_name = mst.S_TYPE;
                        model.ts_name = "picking_ts";
                        model.parameters = parme;
                        //model.parameters = new AntsParasModel { 
                        //    src = mst.S_START_LOC,
@@ -521,7 +525,10 @@
                result = true;
                //任务创建成功,起点货位出库锁定,终点货位入库锁定
                LocationHelper.LockLoc(start, 2);
                LocationHelper.LockLoc(end, 1);
                if (end!=null&& end != "")
                {
                    LocationHelper.LockLoc(end, 1);
                }
            }
            return result;
        }
@@ -854,7 +861,7 @@
        /// <summary>
        /// 出库算法
        /// 出库算法 先进先出
        /// </summary>
        /// <param name="area">库区</param>
        /// <returns></returns>
@@ -893,6 +900,108 @@
                LogHelper.Error("OutWorkTransport:" + ex.Message, ex);
            }
            return result;
        }
        /// <summary>
        /// 小米出库算法 先进先出
        /// </summary>
        /// <param name="area">库区</param>
        /// <returns></returns>
        public static Location OutWorkTransportXm(string area, string issueMode)
        {
            Location result = null;
            try
            {
                var db = new SqlHelper<Object>().GetInstance();
                // 获取所有符合条件的货位
                var query = db.Queryable<Location>().Where(a => a.S_AREA_CODE == area);
                // 根据发料方式应用不同的筛选和排序逻辑
                switch (issueMode)
                {
                    case "9": // 发满箱,数量大于0的先进先出
                        query = query.Where(a => a.N_CURRENT_NUM > 0);
                        var list9 = query.ToList()
                            .OrderBy(s => s.T_CREATE) // 先进先出
                            .ToList();
                        result = GetFirstAvailableLocation(list9);
                        break;
                    case "0": // 发空箱,数量=0的先进先出
                        query = query.Where(a => a.N_CURRENT_NUM == 0);
                        var list0 = query.ToList()
                            .OrderBy(s => s.T_CREATE) // 先进先出
                            .ToList();
                        result = GetFirstAvailableLocation(list0);
                        break;
                    case "8": // 箱子型号优先级:残箱>空箱(残内衬)>满箱>空箱>空箱(满内衬)>其它
                        var list8 = query.ToList()
                            .OrderBy(s => GetBoxTypePriority(s,new[] { "2", "4", "1", "3", "5" })) // 按指定优先级排序
                            .ThenBy(s => s.T_CREATE) // 相同优先级按先进先出
                            .ToList();
                        result = GetFirstAvailableLocation(list8);
                        break;
                    case "1": // 箱子型号优先级:残箱>空箱(残内衬)>空箱>空箱(满内衬)>满箱>其它
                        var list1 = query.ToList()
                            .OrderBy(s => GetBoxTypePriority(s,new[] { "2", "4", "3", "5", "1" })) // 按指定优先级排序
                            .ThenBy(s => s.T_CREATE) // 相同优先级按先进先出
                            .ToList();
                        result = GetFirstAvailableLocation(list1);
                        break;
                    default: // 不填-按先进先出
                        var listDefault = query.ToList()
                            .OrderBy(s => s.T_CREATE) // 先进先出
                            .ToList();
                        result = GetFirstAvailableLocation(listDefault);
                        break;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("OutWorkTransport:" + ex.Message + ex.StackTrace);
                LogHelper.Error("OutWorkTransport:" + ex.Message, ex);
            }
            return result;
        }
        // 辅助方法:根据箱子型号获取优先级
        private static int GetBoxTypePriority(Location location, string[] priorityOrder)
        {
            var db = new SqlHelper<Object>().GetInstance();
            var locCntrRel = db.Queryable<LocCntrRel>().Where(s => s.S_LOC_CODE == location.S_CODE).First();
            if (locCntrRel != null)
            {
                var container = db.Queryable<Container>().Where(c => c.S_CODE == locCntrRel.S_CNTR_CODE).First();
                if (container != null)
                {
                    // 查找箱子型号在优先级数组中的位置
                    var index = Array.IndexOf(priorityOrder, container.S_SPEC);
                    return index >= 0 ? index : priorityOrder.Length; // 不在优先级列表中的排在最后
                }
            }
            return priorityOrder.Length; // 没有关联容器的排在最后
        }
        // 辅助方法:获取第一个可用的货位
        private static Location GetFirstAvailableLocation(List<Location> locations)
        {
            var db = new SqlHelper<Object>().GetInstance();
            foreach (var location in locations)
            {
                if (location.N_LOCK_STATE == 0) // 判断货位是否被锁住
                {
                    var locCntrRel = db.Queryable<LocCntrRel>().Where(s => s.S_LOC_CODE == location.S_CODE).First();
                    if (locCntrRel != null) // 判断是否有托盘
                    {
                        return location;
                    }
                }
            }
            return null;
        }
        /// <summary>
        /// WMS出库转运
@@ -1017,6 +1126,15 @@
                var startLoc = new Location();
                string endLocStr = null;
                string Message = null;
                //校验任务编号是否存在
                if (repeatTaskCode(model.order_name))
                {
                    Message = model.order_name+"任务编号已存在";
                    return new TaskResponse
                    {
                        header = new ResponseHead { code = 0, desc = Message }
                    };
                }
                switch (model.ts_name)
                {
                    case "p2p":
@@ -1024,6 +1142,10 @@
                        if (startLoc == null || startLoc.N_LOCK_STATE != 0 || startLoc.C_ENABLE != "Y")
                        {
                            Message = $"{model.parameters.src}库位已被锁定!";
                            return new TaskResponse
                            {
                                header = new ResponseHead { code = 0, desc = Message }
                            };
                        }
                        endLocStr = model.parameters.dst;
@@ -1033,6 +1155,10 @@
                        if (startLoc == null || startLoc.N_LOCK_STATE != 0 || startLoc.C_ENABLE != "Y")
                        {
                            Message = $"{model.parameters.src}库位已被锁定!";
                            return new TaskResponse
                            {
                                header = new ResponseHead { code = 0, desc = Message }
                            };
                        }
                        var endLoc = InWorkTransport(model.parameters.dst_area);
                        if (endLoc == null)
@@ -1043,19 +1169,27 @@
                        }
                        break;
                    case "a2p":
                        startLoc = OutWorkTransport(model.parameters.src_area);
                        startLoc = OutWorkTransportXm(model.parameters.src_area, model.parameters.issueMode);
                        if (startLoc == null)
                        {
                            Message = $"{model.parameters.dst}库区没有可出货位!";
                            return new TaskResponse
                            {
                                header = new ResponseHead { code = 0, desc = Message }
                            };
                        }
                        endLocStr = model.parameters.dst;
                        break;
                    case "a2a":
                        startLoc = OutWorkTransport(model.parameters.src_area);
                        startLoc = OutWorkTransportXm(model.parameters.src_area,model.parameters.issueMode);
                        if (startLoc == null)
                        {
                            Message = $"{model.parameters.src}库区没有可出货位!";
                            return new TaskResponse
                            {
                                header = new ResponseHead { code = 0, desc = Message }
                            };
                        }
                        var endLoc1 = InWorkTransport(model.parameters.dst_area);
                        if (endLoc1 == null)
@@ -1066,10 +1200,26 @@
                        }
                        break;
                    case "p2u":
                        startLoc = OutWorkTransport(model.parameters.src);
                        startLoc = db.Queryable<Location>().Where(a => a.S_CODE == model.parameters.src).First();
                        if (startLoc == null || startLoc.N_LOCK_STATE != 0 || startLoc.C_ENABLE != "Y")
                        {
                            Message = $"{model.parameters.src}库位已被锁定!";
                            return new TaskResponse
                            {
                                header = new ResponseHead { code = 0, desc = Message }
                            };
                        }
                        endLocStr = "";
                        break;
                    case "a2u":
                        startLoc = OutWorkTransportXm(model.parameters.src, model.parameters.issueMode);
                        if (startLoc == null)
                        {
                            Message = $"{model.parameters.src}库区没有可出货位!";
                            return new TaskResponse
                            {
                                header = new ResponseHead { code = 0, desc = Message }
                            };
                        }
                        endLocStr = "";
                        break;
@@ -1079,29 +1229,14 @@
                //创建托盘货位绑定关系
                string trayCode = ContainerHelper.GenerateCntrNo();
                //绑定起点货位(产线)和物料
                ContainerHelper.BindLocCntrsXm(startLoc.S_CODE, trayCode, model.parameters.sku, "", model.parameters.BatchNo, model.parameters.issueMode, model.parameters.num);
                ContainerHelper.BindLocCntrsXm(startLoc.S_CODE, trayCode, model.parameters.sku, "", model.parameters.BatchNo, model.parameters.issueMode, model.parameters.num, model.parameters.boxType);
                var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First();
                //创建任务
                LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLocStr}", "大件");
                var res = TaskProcess.CreateTransportDj(startLoc.S_CODE, endLocStr, "大件", locCntrRel.S_CNTR_CODE, model.order_name, 1, 1);
                if (!res)
                {
                    return new TaskResponse
                    {
                        header = new ResponseHead { code = 1, desc = Message }
                    };
                }
                var result = new TaskResponse();
                if (Message != null)
                {
                    result = new TaskResponse
                    {
                        header = new ResponseHead { code = 0, desc = Message }
                    };
                }
                else
                if (res)
                {
                    result = new TaskResponse
                    {
@@ -1110,10 +1245,17 @@
                        {
                            msg = "success",
                            app_name = "Guozi client",
                            data = new List<ResponseData> { new ResponseData { in_order_id = model.taskID } },
                            data = new List<ResponseData> { new ResponseData { in_order_id = model.order_name } },
                            version = ""
                        }
                    };
                }
                else {
                    Message = $"创建任务 起点:{startLoc.S_CODE}终点:{endLocStr}失败";
                    result = new TaskResponse
                    {
                        header = new ResponseHead { code = 0, desc = Message }
                    };
                }
                return result;
@@ -1149,24 +1291,46 @@
                {
                    ////创建到缓存区任务
                    //var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First();
                    //找p2a的任务编码
                    var order_name = model.taskList.Find(s=>s.ts_name=="p2a").order_name;
                    //校验任务编号是否存在
                    if (repeatTaskCode(order_name))
                    {
                        Message = order_name + "任务编号已存在";
                        return new TaskResponse
                        {
                            header = new ResponseHead { code = 0, desc = Message }
                        };
                    }
                    //创建任务
                    LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}", "小件通用车型");
                    var res = TaskProcess.CreateTransportDj(startLoc.S_CODE, endLoc.S_CODE, "小件通用车型", model.rackNumber, "", 1, 1);
                    var res = TaskProcess.CreateTransportDj(startLoc.S_CODE, endLoc.S_CODE, "小件通用车型", model.rackNumber, order_name, 1, 1);
                    if (!res)
                    {
                        return new TaskResponse
                        {
                            header = new ResponseHead { code = 0, desc = "自动上线任务创建失败" }
                            header = new ResponseHead { code = 0, desc = $"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}失败" }
                        };
                    }
                }
                var result = new TaskResponse();
                //料架上的托盘到指定的工位
                foreach (var tasklist in model.taskList)
                {
                    if (tasklist.ts_name == "p2p")
                    {
                        //校验任务编号是否存在
                        if (repeatTaskCode(tasklist.order_name))
                        {
                            Message = tasklist.order_name + "任务编号已存在";
                            return new TaskResponse
                            {
                                header = new ResponseHead { code = 0, desc = Message }
                            };
                        }
                        //先绑定料架和料箱位
                        ContainerHelper.BindLocCntrsXmLj(tasklist.parameters.src, model.rackNumber);
                        ContainerHelper.BindLocCntrsXmLj(tasklist.rackPosition, model.rackNumber);
                        var startloc = db.Queryable<Location>().Where(a => a.S_CODE == tasklist.rackPosition).First();
                        if (startloc == null || startloc.N_LOCK_STATE != 0)
@@ -1181,24 +1345,133 @@
                        //创建托盘货位绑定关系
                        string trayCode = ContainerHelper.GenerateCntrNo();
                        //绑定起点货位(产线)和物料
                        ContainerHelper.BindLocCntrsXm(startloc.S_CODE, trayCode, tasklist.parameters.sku, "", tasklist.parameters.BatchNo, tasklist.parameters.issueMode, tasklist.parameters.num);
                        ContainerHelper.BindLocCntrsXm(startloc.S_CODE, trayCode, tasklist.parameters.sku, "", tasklist.parameters.BatchNo, tasklist.parameters.issueMode, tasklist.parameters.num,"");
                        var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startloc.S_CODE).First();
                        //创建任务
                        LogHelper.Info($"创建任务 起点:{startloc.S_CODE}终点:{endlocstr}", "inbound");
                        var res = TaskProcess.CreateTransportDj(startloc.S_CODE, endlocstr, "inbound", locCntrRel.S_CNTR_CODE, tasklist.order_name, 1, 1);
                        if (!res)
                        if (res)
                        {
                            return new TaskResponse
                            result = new TaskResponse
                            {
                                header = new ResponseHead { code = 1, desc = Message }
                                header = new ResponseHead { code = 200, desc = "SUCCESS" },
                                body = new ResponseBody
                                {
                                    msg = "success",
                                    app_name = "Guozi client",
                                    data = new List<ResponseData> { new ResponseData { in_order_id = tasklist.order_name } },
                                    version = ""
                                }
                            };
                        }
                        else
                        {
                            Message = $"创建任务 起点:{startloc.S_CODE}终点:{endlocstr}失败";
                            result = new TaskResponse
                            {
                                header = new ResponseHead { code = 0, desc = Message }
                            };
                        }
                    }
                }
                return result;
            }
            catch (Exception ex)
            {
                Console.WriteLine("smallMaterial:" + ex.Message + ex.StackTrace);
                LogHelper.Error("smallMaterial:" + ex.Message, ex);
                throw;
            }
        }
        //任务号重复判断
        private static bool repeatTaskCode(string orderName) {
            var db = new SqlHelper<WCSTask>().GetInstance();
            var result = db.Queryable<WCSTask>().Where(a => a.S_CODE == orderName).Count();
            return result > 0;
        }
        //传感器小件
        public static TaskResponse sensorSmallMaterial(sensorSmallMaterial model)
        {
            var db = new SqlHelper<Location>().GetInstance();
            try
            {
                string Message = null;
                ////拆分成两条任务,一条是料架到指定的缓存区,二是料架上的托盘到指定的工位(小米wcs传)一对多
                //var startLoc = db.Queryable<Location>().Where(a => a.S_CODE == model.taskList[0].parameters.src).First();
                //if (startLoc == null || startLoc.N_LOCK_STATE != 0)
                //{
                //    return new TaskResponse
                //    {
                //        header = new ResponseHead { code = 0, desc = $"{model.taskList[0].parameters.src}库位已被锁定!" }
                //    };
                //}
                //var endLoc = TaskProcess.InWorkTransport(model.shippingRoute);
                //if (endLoc != null)
                //{
                //    ////创建到缓存区任务
                //    //var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First();
                //    //找p2a的任务编码
                //    var order_name = model.taskList.Find(s => s.ts_name == "p2a").order_name;
                //    //创建任务
                //    LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}", "小件通用车型");
                //    var res = TaskProcess.CreateTransportDj(startLoc.S_CODE, endLoc.S_CODE, "小件通用车型", model.rackNumber, order_name, 1, 1);
                //    if (!res)
                //    {
                //        return new TaskResponse
                //        {
                //            header = new ResponseHead { code = 0, desc = "自动上线任务创建失败" }
                //        };
                //    }
                //}
                ////料架上的托盘到指定的工位
                //foreach (var tasklist in model.taskList)
                //{
                //    if (tasklist.ts_name == "p2p")
                //    {
                //        //先绑定料架和料箱位
                //        ContainerHelper.BindLocCntrsXmLj(tasklist.rackPosition, model.rackNumber);
                //        var startloc = db.Queryable<Location>().Where(a => a.S_CODE == tasklist.rackPosition).First();
                //        if (startloc == null || startloc.N_LOCK_STATE != 0)
                //        {
                //            return new TaskResponse
                //            {
                //                header = new ResponseHead { code = 0, desc = $"{startloc.S_CODE}库位已被锁定!" }
                //            };
                //        }
                //        var endlocstr = tasklist.parameters.dst;
                //        //创建托盘货位绑定关系
                //        string trayCode = ContainerHelper.GenerateCntrNo();
                //        //绑定起点货位(产线)和物料
                //        ContainerHelper.BindLocCntrsXm(startloc.S_CODE, trayCode, tasklist.parameters.sku, "", tasklist.parameters.BatchNo, tasklist.parameters.issueMode, tasklist.parameters.num);
                //        var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startloc.S_CODE).First();
                //        //创建任务
                //        LogHelper.Info($"创建任务 起点:{startloc.S_CODE}终点:{endlocstr}", "inbound");
                //        var res = TaskProcess.CreateTransportDj(startloc.S_CODE, endlocstr, "inbound", locCntrRel.S_CNTR_CODE, tasklist.order_name, 1, 1);
                //        if (!res)
                //        {
                //            return new TaskResponse
                //            {
                //                header = new ResponseHead { code = 1, desc = Message }
                //            };
                //        }
                //    }
                //}
                var result = new TaskResponse();
                if (Message != null)
                {
@@ -1216,7 +1489,7 @@
                        {
                            msg = "success",
                            app_name = "Guozi client",
                            data = new List<ResponseData> { new ResponseData { in_order_id = model.taskList[0].taskID } },
                            data = new List<ResponseData> { new ResponseData { in_order_id = model.taskID } },
                            version = ""
                        }
                    };
@@ -1233,7 +1506,6 @@
                throw;
            }
        }
    }