| | |
| | | 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 |
| | | { |
| | |
| | | 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); |
| | | |
| | | } |
| | |
| | | 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, |
| | |
| | | result = true; |
| | | //任务创建成功,起点货位出库锁定,终点货位入库锁定 |
| | | LocationHelper.LockLoc(start, 2); |
| | | LocationHelper.LockLoc(end, 1); |
| | | if (end!=null&& end != "") |
| | | { |
| | | LocationHelper.LockLoc(end, 1); |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 出库算法 |
| | | /// 出库算法 先进先出 |
| | | /// </summary> |
| | | /// <param name="area">库区</param> |
| | | /// <returns></returns> |
| | |
| | | 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出库转运 |
| | |
| | | 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": |
| | |
| | | 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; |
| | | |
| | |
| | | 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) |
| | |
| | | } |
| | | 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) |
| | |
| | | } |
| | | 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; |
| | |
| | | //创建托盘货位绑定关系 |
| | | 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 |
| | | { |
| | |
| | | { |
| | | 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; |
| | | |
| | |
| | | |
| | | //找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, order_name, 1, 1); |
| | |
| | | { |
| | | 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.rackPosition, model.rackNumber); |
| | | |
| | |
| | | //创建托盘货位绑定关系 |
| | | 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) |
| | | { |
| | |
| | | { |
| | | 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 = "" |
| | | } |
| | | }; |
| | |
| | | throw; |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | } |