| | |
| | | using Swashbuckle.Swagger; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Diagnostics; |
| | | using System.Linq; |
| | | using System.Reflection; |
| | | using System.Security.Cryptography; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using static HH.WCS.HangYang.api.OtherModel.Putaway_Order_In; |
| | | using static HH.WCS.HangYang.LISTA.process.HttpModel; |
| | | using static HH.WCS.HangYang.util.Settings; |
| | | using static HH.WCS.HangYang.wms.WMSHelper; |
| | | using static System.Runtime.CompilerServices.RuntimeHelpers; |
| | | |
| | |
| | | { |
| | | |
| | | LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}"); |
| | | LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList(),mst.S_NOTE); |
| | | LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList(), mst.S_NOTE); |
| | | } |
| | | |
| | | } |
| | |
| | | internal static bool Intercept(WCSTask mst) |
| | | { |
| | | var result = false; |
| | | |
| | | |
| | | return result; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 入库单新增 |
| | | /// 杭氧物料主数据新增接口 |
| | | /// </summary> |
| | | /// <param name="model">入库单</param> |
| | | /// <param name="model">物料主数据</param> |
| | | /// <returns></returns> |
| | | public static Result GetMaterialData(List<MES_Material> model) |
| | | { |
| | |
| | | /// <returns></returns> |
| | | public static Result GetOutboundOrder(OutOrder model) |
| | | { |
| | | Result result = new Result() { success = false, }; |
| | | Result result = new Result() { success = false }; |
| | | try |
| | | { |
| | | if (model == null || !model.OutOrderDetail.Any()) |
| | |
| | | return result; |
| | | } |
| | | |
| | | // 第一步:设置物料属性信息 |
| | | foreach (var item in model.OutOrderDetail) |
| | | { |
| | | var itemType = WMSHelper.GetItemType(item.S_ITEM_CODE); |
| | |
| | | return result; |
| | | } |
| | | item.S_EXT_ATTR1 = itemType.S_ITEM_TYPE; |
| | | item.S_ITEM_NAME = itemType.S_ITEM_NAME; |
| | | item.S_ITEM_NAME = itemType.S_ITEM_NAME; |
| | | item.C_CLEAN = itemType.C_CLEAN; |
| | | } |
| | | |
| | | var groupedInOrders = model.OutOrderDetail |
| | | .GroupBy(detail => detail.S_EXT_ATTR1) // 按物料属性分组 |
| | | .Select((group, index) => new OutOrder |
| | | { |
| | | S_NO = $"{model.S_BS_NO}_{index + 1}", // 拼接来源单号 |
| | | S_BS_NO = model.S_BS_NO, |
| | | S_OP_TYPE = model.S_OP_TYPE, |
| | | S_NOTE = model.S_NOTE, |
| | | S_BS_TYPE = "ERP", |
| | | S_FACTORY = "HY001", |
| | | S_WH_CODE = "CK001", |
| | | S_AREA_CODE = group.Key.Equals("料箱库") ? "LXLKQ" : "TPLKQ", |
| | | OutOrderDetail = group.Select(detail => |
| | | { |
| | | // 修改 group 中的 S_IO_NO 字段为 S_NO 的值 |
| | | detail.S_OO_NO = $"{model.S_BS_NO}_{index + 1}"; |
| | | detail.S_BS_NO = model.S_BS_NO; |
| | | return detail; |
| | | }).ToList() // 分组后的明细 |
| | | }) |
| | | .ToList(); |
| | | var res = WMSHelper.CreateOrderOut(groupedInOrders); |
| | | // 第二步:先按物料属性分组,再按是否清洗分组 |
| | | var groupedOrders = model.OutOrderDetail |
| | | .GroupBy(detail => new |
| | | { |
| | | MaterialType = detail.S_EXT_ATTR1, |
| | | IsClean = detail.C_CLEAN |
| | | }) // 按物料属性和是否清洗双重分组 |
| | | .Select((group, index) => new OutOrder |
| | | { |
| | | S_NO = $"{model.S_BS_NO}_{index + 1}", |
| | | S_BS_NO = model.S_BS_NO, |
| | | S_OP_TYPE = model.S_OP_TYPE, |
| | | S_OUT_TO = model.S_OUT_TO, |
| | | S_NOTE = model.S_NOTE, |
| | | S_BS_TYPE = "ERP", |
| | | S_FACTORY = "HY001", |
| | | S_WH_CODE = "CK001", |
| | | S_AREA_CODE = group.Key.MaterialType.Equals("料箱库") ? "LXLKQ" : "TPLKQ", |
| | | C_CLEAN = group.Key.IsClean, // 添加是否清洗标记 |
| | | OutOrderDetail = group.Select(detail => |
| | | { |
| | | detail.S_OO_NO = $"{model.S_BS_NO}_{index + 1}"; |
| | | detail.S_BS_NO = model.S_BS_NO; |
| | | return detail; |
| | | }).ToList() |
| | | }) |
| | | .ToList(); |
| | | |
| | | // 第三步:调用创建出库单方法 |
| | | var res = WMSHelper.CreateOrderOut(groupedOrders); |
| | | if (res) |
| | | { |
| | | result.success = true; |
| | |
| | | result.success = false; |
| | | result.errMsg = ex.Message; |
| | | var st = new System.Diagnostics.StackTrace(ex, true); |
| | | var frame = st.GetFrame(0); // 获取第一个堆栈帧 |
| | | var frame = st.GetFrame(0); |
| | | if (frame != null) |
| | | { |
| | | LogHelper.Error($"GetInboundOrder入库单新增出现错误!!", ex); |
| | | LogHelper.Error($"GetOutboundOrder出库单新增出现错误!", ex); |
| | | LogHelper.Error($"文件名: {frame.GetFileName()}", ex); |
| | | LogHelper.Error($"行号: {frame.GetFileLineNumber()}", ex); |
| | | LogHelper.Error($"列号: {frame.GetFileColumnNumber()}", ex); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | } |
| | | |
| | | ///// <summary> |
| | | ///// 获取作业创建入库任务 |
| | | ///// </summary> |
| | | ///// <param name="mst"></param> |
| | | ///// <returns></returns> |
| | | //internal static bool CreateInTask(WMSTask mst) |
| | | //{ |
| | | // try |
| | | // { |
| | | // var result = false; |
| | | // var taskState = mst.S_B_STATE.Trim(); |
| | | // if (taskState == "等待") |
| | | // { |
| | | // if (!string.IsNullOrEmpty(mst.S_START_LOC)) |
| | | // { |
| | | // //杭氧所有库区 |
| | | // var reservoirs = Settings.ReservoirAreas.ToList(); |
| | | // if (!reservoirs.Any() || reservoirs == null) |
| | | // { |
| | | // LogHelper.Info("Settings出现错误未查询到杭氧的库区!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // if (mst.S_TYPE == "托盘转运") |
| | | // { |
| | | // var lxAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "料箱入库缓存位").FirstOrDefault().areaCode); |
| | | // if (lxAnyLoc.Any()) |
| | | // { |
| | | // var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, lxAnyLoc.FirstOrDefault().S_CODE, "料箱缓存位入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | // if (!res) |
| | | // { |
| | | // LogHelper.Info("料箱缓存位入库任务创建失败!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // WMSHelper.UpdateStatus(mst, 1); |
| | | // } |
| | | // else |
| | | // { |
| | | // var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "入库缓存区").FirstOrDefault().areaCode); |
| | | // if (rkAnyLoc.Any()) |
| | | // { |
| | | // var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "料箱码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | // if (!res) |
| | | // { |
| | | // LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // WMSHelper.UpdateStatus(mst, 1); |
| | | // //标记为合托 |
| | | // ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "料箱合托"); |
| | | // } |
| | | // else |
| | | // { |
| | | // LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // } |
| | | // } |
| | | // if (mst.S_TYPE == "托盘入库") |
| | | // { |
| | | // //1.查询下下库里面是否有要合托的托盘 |
| | | // var locMerge = WMSHelper.GetLocMerge(mst.S_CNTR_CODE); |
| | | // if (locMerge != null) |
| | | // { |
| | | // //(1.1)如果有要合托的托盘就去判断一下合托工位是否为空 |
| | | // var anyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "合托区").FirstOrDefault().areaCode); |
| | | // if (anyLoc.Any()) |
| | | // { |
| | | |
| | | // foreach (var item in anyLoc) |
| | | // { |
| | | // //生成一条出库的任务 |
| | | // var relevancys = Settings.Relevancys.Where(s => s.InLoc == item.S_CODE).FirstOrDefault(); |
| | | // if (relevancys == null) |
| | | // { |
| | | // LogHelper.Info($"Settings未查询到合托入库位{item.S_CODE}对应的出库位!", "杭氧"); |
| | | // continue; |
| | | // } |
| | | // //生成到合托区的任务 |
| | | // var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, item.S_CODE, "码盘合托入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | // if (!res) |
| | | // { |
| | | // LogHelper.Info("码盘合托入库任务创建失败!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // res = TaskProcess.HYCreateTransport(locMerge.S_LOC_CODE, relevancys.OutLoc, "码盘合托出库", locMerge.S_CNTR_CODE, mst.S_CODE); |
| | | // if (!res) |
| | | // { |
| | | // LogHelper.Info("码盘合托出库任务创建失败!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // //(1.2)如果合托工位为空就直接合托到合托工位里面,同时生成一个出库任务把被合托的托盘出出来(标记为要合托) |
| | | // ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "合托"); |
| | | // WMSHelper.UpdateStatus(mst, 1); |
| | | // break; |
| | | // } |
| | | |
| | | |
| | | // } |
| | | // else |
| | | // { |
| | | // //(1.3)如果合托工位不为空就去入库缓存区(标记为要合托) |
| | | // //生成到入库缓存区的任务 |
| | | // var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "入库缓存区").FirstOrDefault().areaCode); |
| | | // if (rkAnyLoc.Any()) |
| | | // { |
| | | // var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | // if (!res) |
| | | // { |
| | | // LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // WMSHelper.UpdateStatus(mst, 1); |
| | | // //标记为合托 |
| | | // ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "合托"); |
| | | // } |
| | | // else |
| | | // { |
| | | // LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // } |
| | | |
| | | // } |
| | | // else |
| | | // { |
| | | // //2.如果没有要合托的托盘 |
| | | // var area = reservoirs.Where(s => s.areaName == "入库接驳位").FirstOrDefault(); |
| | | // if (area == null) |
| | | // { |
| | | // LogHelper.Info("Settings出现错误未查询到入库接驳位!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // //(2.1)先查询入库接驳位是否为空,如果为空直接生成到入库的任务 |
| | | // var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | // if (anyLoc.Any()) |
| | | // { |
| | | // //生成到接驳位的任务 |
| | | // var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "码盘接驳入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | // if (!res) |
| | | // { |
| | | // LogHelper.Info("码盘接驳入库任务创建失败!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // WMSHelper.UpdateStatus(mst, 1); |
| | | // } |
| | | // else |
| | | // { |
| | | // //(2.2)如果入库接驳位不为空,则生成到入库缓存区的任务(标记为不合托) |
| | | // //生成到入库缓存区的任务 |
| | | // var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "入库缓存区").FirstOrDefault().areaCode); |
| | | // if (rkAnyLoc.Any()) |
| | | // { |
| | | // var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | // if (!res) |
| | | // { |
| | | // LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // WMSHelper.UpdateStatus(mst, 1); |
| | | // //标记为不合托 |
| | | // ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "不合托"); |
| | | // } |
| | | // else |
| | | // { |
| | | // LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | |
| | | // } |
| | | |
| | | // } |
| | | // } |
| | | // if (mst.S_TYPE == "合托回库") |
| | | // { |
| | | // var trayLst = ContainerHelper.GetCntrItemRel(mst.S_CNTR_CODE); |
| | | // if (trayLst.Any()) |
| | | // { |
| | | // //满托回库 |
| | | // var area = reservoirs.Where(s => s.areaName == "入库接驳位").FirstOrDefault(); |
| | | // if (area == null) |
| | | // { |
| | | // LogHelper.Info("Settings出现错误未查询到入库接驳位!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // //(2.1)先查询入库接驳位是否为空,如果为空直接生成到入库的任务 |
| | | // var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | // if (anyLoc.Any()) |
| | | // { |
| | | // //生成到接驳位的任务 |
| | | // var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "码盘接驳入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | // if (!res) |
| | | // { |
| | | // LogHelper.Info("码盘接驳入库任务创建失败!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // WMSHelper.UpdateStatus(mst, 1); |
| | | // } |
| | | // else |
| | | // { |
| | | // //(2.2)如果入库接驳位不为空,则生成到入库缓存区的任务(标记为不合托) |
| | | // //生成到入库缓存区的任务 |
| | | // var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "入库缓存区").FirstOrDefault().areaCode); |
| | | // if (rkAnyLoc.Any()) |
| | | // { |
| | | // var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | // if (!res) |
| | | // { |
| | | // LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // WMSHelper.UpdateStatus(mst, 1); |
| | | // //标记为不合托 |
| | | // ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "不合托"); |
| | | // } |
| | | // else |
| | | // { |
| | | // LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | |
| | | // } |
| | | // } |
| | | // else |
| | | // { |
| | | // //空托回库 |
| | | // var area = reservoirs.Where(s => s.areaName == "人机接驳位-空托位").FirstOrDefault(); |
| | | // if (area == null) |
| | | // { |
| | | // LogHelper.Info("Settings出现错误未查询到入库接驳位!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // //(2.1)先查询人机接驳位-空托位是否为空,如果为空直接生成到入库的任务 |
| | | // var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | // if (anyLoc.Any()) |
| | | // { |
| | | // //生成到接驳位的任务 |
| | | // var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "人机接驳入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | // if (!res) |
| | | // { |
| | | // LogHelper.Info("码盘接驳入库任务创建失败!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // WMSHelper.UpdateStatus(mst, 1); |
| | | // } |
| | | // else |
| | | // { |
| | | // //生成到入库缓存区的任务 |
| | | // var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "入库缓存区").FirstOrDefault().areaCode); |
| | | // if (rkAnyLoc.Any()) |
| | | // { |
| | | // var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | // if (!res) |
| | | // { |
| | | // LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // //标记为不合托 |
| | | // ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "不合托"); |
| | | // WMSHelper.UpdateStatus(mst, 1); |
| | | |
| | | // } |
| | | // else |
| | | // { |
| | | // LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // if (mst.S_TYPE == "料箱出库") |
| | | // { |
| | | |
| | | // //满托回库 |
| | | // var area = reservoirs.Where(s => s.areaName == "料箱码盘区").FirstOrDefault(); |
| | | // if (area == null) |
| | | // { |
| | | // LogHelper.Info("Settings出现错误未查询到料箱码盘区!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // //(2.1)先查询入库接驳位是否为空,如果为空直接生成到入库的任务 |
| | | // var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | // if (anyLoc.Any()) |
| | | // { |
| | | // //生成到接驳位的任务 |
| | | // var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "料箱出库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | // if (!res) |
| | | // { |
| | | // LogHelper.Info("料箱出库任务创建失败!", "杭氧"); |
| | | // return false; |
| | | // } |
| | | // WMSHelper.UpdateStatus(mst, 1); |
| | | // } |
| | | // else |
| | | // { |
| | | // LogHelper.Info("料箱码盘区未有可用货位!", "杭氧"); |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // else { result = true; } |
| | | // return result; |
| | | // } |
| | | // catch (Exception ex) |
| | | // { |
| | | // var st = new System.Diagnostics.StackTrace(ex, true); |
| | | // var frame = st.GetFrame(0); // 获取第一个堆栈帧 |
| | | // if (frame != null) |
| | | // { |
| | | // LogHelper.Error($"CreateInTask获取作业创建入库任务出现错误!!", ex); |
| | | // LogHelper.Error($"文件名: {frame.GetFileName()}", ex); |
| | | // LogHelper.Error($"行号: {frame.GetFileLineNumber()}", ex); |
| | | // LogHelper.Error($"列号: {frame.GetFileColumnNumber()}", ex); |
| | | // } |
| | | // return false; |
| | | // } |
| | | |
| | | //} |
| | | |
| | | #region 等待作业 |
| | | |
| | | /// <summary> |
| | | /// 获取作业创建入库任务 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <returns></returns> |
| | | internal static bool CreateInTask(WMSTask mst) |
| | | internal static async Task<bool> CreateInTask(WMSTask mst) |
| | | { |
| | | try |
| | | { |
| | | var result = false; |
| | | var taskState = mst.S_B_STATE.Trim(); |
| | | if (taskState == "等待") |
| | | if (mst.S_B_STATE.Trim() != "等待") return true; |
| | | //if (string.IsNullOrEmpty(mst.S_START_LOC)) return false; |
| | | |
| | | var reservoirs = Settings.ReservoirAreas?.ToList(); |
| | | if (reservoirs == null || !reservoirs.Any()) |
| | | { |
| | | if (!string.IsNullOrEmpty(mst.S_START_LOC)) |
| | | { |
| | | //杭氧所有库区 |
| | | var reservoirs = Settings.ReservoirAreas.ToList(); |
| | | if (!reservoirs.Any() || reservoirs == null) |
| | | { |
| | | LogHelper.Info("Settings出现错误未查询到杭氧的库区!", "杭氧"); |
| | | return false; |
| | | } |
| | | if (mst.S_TYPE == "托盘转运") |
| | | { |
| | | var lxAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "料箱入库缓存位").FirstOrDefault().areaCode); |
| | | if (lxAnyLoc.Any()) |
| | | { |
| | | |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, lxAnyLoc.FirstOrDefault().S_CODE, "料箱缓存位入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("料箱缓存位入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | else |
| | | { |
| | | var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "入库缓存区").FirstOrDefault().areaCode); |
| | | if (rkAnyLoc.Any()) |
| | | { |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "料箱码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | //标记为合托 |
| | | ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "料箱合托"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | if (mst.S_TYPE == "托盘入库") |
| | | { |
| | | //1.查询下下库里面是否有要合托的托盘 |
| | | var locMerge = WMSHelper.GetLocMerge(mst.S_CNTR_CODE); |
| | | if (locMerge != null) |
| | | { |
| | | //(1.1)如果有要合托的托盘就去判断一下合托工位是否为空 |
| | | var anyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "合托区").FirstOrDefault().areaCode); |
| | | if (anyLoc.Any()) |
| | | { |
| | | |
| | | //生成一条出库的任务 |
| | | var relevancys = Settings.Relevancys.Where(s => s.InLoc == anyLoc.FirstOrDefault().S_CODE).FirstOrDefault(); |
| | | if (relevancys == null) |
| | | { |
| | | LogHelper.Info("Settings出现错误未查询到合托入库位对应的出库位!", "杭氧"); |
| | | return false; |
| | | } |
| | | //生成到合托区的任务 |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "码盘合托入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘合托入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | res = TaskProcess.HYCreateTransport(locMerge.S_LOC_CODE, relevancys.OutLoc, "码盘合托出库", locMerge.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘合托出库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | //(1.2)如果合托工位为空就直接合托到合托工位里面,同时生成一个出库任务把被合托的托盘出出来(标记为要合托) |
| | | ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "合托"); |
| | | |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | else |
| | | { |
| | | //(1.3)如果合托工位不为空就去入库缓存区(标记为要合托) |
| | | //生成到入库缓存区的任务 |
| | | var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "入库缓存区").FirstOrDefault().areaCode); |
| | | if (rkAnyLoc.Any()) |
| | | { |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | //标记为合托 |
| | | ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "合托"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | //2.如果没有要合托的托盘 |
| | | var area = reservoirs.Where(s => s.areaName == "入库接驳位").FirstOrDefault(); |
| | | if (area == null) |
| | | { |
| | | LogHelper.Info("Settings出现错误未查询到入库接驳位!", "杭氧"); |
| | | return false; |
| | | } |
| | | //(2.1)先查询入库接驳位是否为空,如果为空直接生成到入库的任务 |
| | | var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | if (anyLoc.Any()) |
| | | { |
| | | //生成到接驳位的任务 |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "码盘接驳入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘接驳入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | else |
| | | { |
| | | //(2.2)如果入库接驳位不为空,则生成到入库缓存区的任务(标记为不合托) |
| | | //生成到入库缓存区的任务 |
| | | var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "入库缓存区").FirstOrDefault().areaCode); |
| | | if (rkAnyLoc.Any()) |
| | | { |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | //标记为不合托 |
| | | ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "不合托"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | return false; |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | } |
| | | if (mst.S_TYPE == "合托回库") |
| | | { |
| | | var trayLst = ContainerHelper.GetCntrItemRel(mst.S_CNTR_CODE); |
| | | if (trayLst.Any()) |
| | | { |
| | | //满托回库 |
| | | var area = reservoirs.Where(s => s.areaName == "入库接驳位").FirstOrDefault(); |
| | | if (area == null) |
| | | { |
| | | LogHelper.Info("Settings出现错误未查询到入库接驳位!", "杭氧"); |
| | | return false; |
| | | } |
| | | //(2.1)先查询入库接驳位是否为空,如果为空直接生成到入库的任务 |
| | | var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | if (anyLoc.Any()) |
| | | { |
| | | //生成到接驳位的任务 |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "码盘接驳入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘接驳入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | else |
| | | { |
| | | //(2.2)如果入库接驳位不为空,则生成到入库缓存区的任务(标记为不合托) |
| | | //生成到入库缓存区的任务 |
| | | var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "入库缓存区").FirstOrDefault().areaCode); |
| | | if (rkAnyLoc.Any()) |
| | | { |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | //标记为不合托 |
| | | ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "不合托"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | return false; |
| | | } |
| | | |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //空托回库 |
| | | var area = reservoirs.Where(s => s.areaName == "人机接驳位-空托位").FirstOrDefault(); |
| | | if (area == null) |
| | | { |
| | | LogHelper.Info("Settings出现错误未查询到入库接驳位!", "杭氧"); |
| | | return false; |
| | | } |
| | | //(2.1)先查询人机接驳位-空托位是否为空,如果为空直接生成到入库的任务 |
| | | var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | if (anyLoc.Any()) |
| | | { |
| | | //生成到接驳位的任务 |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "人机接驳入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘接驳入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | else |
| | | { |
| | | //生成到入库缓存区的任务 |
| | | var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "入库缓存区").FirstOrDefault().areaCode); |
| | | if (rkAnyLoc.Any()) |
| | | { |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | //标记为不合托 |
| | | ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "不合托"); |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | if (mst.S_TYPE == "料箱出库") |
| | | { |
| | | |
| | | //满托回库 |
| | | var area = reservoirs.Where(s => s.areaName == "料箱码盘区").FirstOrDefault(); |
| | | if (area == null) |
| | | { |
| | | LogHelper.Info("Settings出现错误未查询到料箱码盘区!", "杭氧"); |
| | | return false; |
| | | } |
| | | //(2.1)先查询入库接驳位是否为空,如果为空直接生成到入库的任务 |
| | | var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | if (anyLoc.Any()) |
| | | { |
| | | //生成到接驳位的任务 |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "料箱出库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("料箱出库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("料箱码盘区未有可用货位!", "杭氧"); |
| | | } |
| | | } |
| | | } |
| | | LogHelper.Info("Settings出现错误未查询到杭氧的库区!", "杭氧"); |
| | | return false; |
| | | } |
| | | else { result = true; } |
| | | return result; |
| | | |
| | | switch (mst.S_TYPE) |
| | | { |
| | | case "托盘转运": |
| | | return HandlePalletTransport(mst, reservoirs); |
| | | case "托盘入库": |
| | | return HandlePalletStorage(mst, reservoirs); |
| | | case "合托回库": |
| | | return HandleMergeReturn(mst, reservoirs); |
| | | case "分拣回库": |
| | | return await SortingReturn(mst, reservoirs); |
| | | case "解绑回库": |
| | | return await UnbindReturn(mst, reservoirs); |
| | | case "空托回库": |
| | | return await EmptyPalletReturn(mst, reservoirs); |
| | | case "空托出库": |
| | | return EmptyPalletOutbound(mst); |
| | | case "料箱出库": |
| | | return HandleBoxOutbound(mst, reservoirs); |
| | | case "发货暂存": |
| | | return PreShipmentStage(mst); |
| | | case "发货清洗": |
| | | return PreShipmentStage(mst); |
| | | case "发货装配": |
| | | return PreShipmentStage(mst); |
| | | default: |
| | | return true; |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | var st = new System.Diagnostics.StackTrace(ex, true); |
| | | var frame = st.GetFrame(0); // 获取第一个堆栈帧 |
| | | if (frame != null) |
| | | LogErrorDetails(ex); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 托盘转运 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <param name="reservoirs"></param> |
| | | /// <returns></returns> |
| | | private static bool HandlePalletTransport(WMSTask mst, List<ReservoirArea> reservoirs) |
| | | { |
| | | var res = true; |
| | | var lxArea = reservoirs.FirstOrDefault(s => s.areaName == "料箱入库缓存位"); |
| | | if (lxArea != null) |
| | | { |
| | | var lxLocations = LocationHelper.GetLocAreaList(lxArea.areaCode); |
| | | if (lxLocations.Any()) |
| | | { |
| | | LogHelper.Error($"CreateInTask获取作业创建入库任务出现错误!!", ex); |
| | | LogHelper.Error($"文件名: {frame.GetFileName()}", ex); |
| | | LogHelper.Error($"行号: {frame.GetFileLineNumber()}", ex); |
| | | LogHelper.Error($"列号: {frame.GetFileColumnNumber()}", ex); |
| | | res = TaskProcess.HYCreateTransport(mst.S_START_LOC, lxLocations.FirstOrDefault().S_CODE, "料箱缓存位入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("料箱缓存位入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | } |
| | | |
| | | var rkArea = reservoirs.FirstOrDefault(s => s.areaName == "入库缓存区"); |
| | | if (rkArea == null) return false; |
| | | |
| | | var rkLocations = LocationHelper.GetLocAreaList(rkArea.areaCode); |
| | | if (!rkLocations.Any()) |
| | | { |
| | | LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | return false; |
| | | } |
| | | |
| | | res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkLocations.FirstOrDefault().S_CODE, "料箱码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | //标记为合托 |
| | | ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "料箱合托"); |
| | | return true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 托盘入库 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <param name="reservoirs"></param> |
| | | /// <returns></returns> |
| | | private static bool HandlePalletStorage(WMSTask mst, List<ReservoirArea> reservoirs) |
| | | { |
| | | var result = true; |
| | | var locMerge = WMSHelper.GetLocMerge(mst.S_CNTR_CODE); |
| | | if (locMerge != null) |
| | | { |
| | | //(1.1)如果有要合托的托盘就去判断一下合托工位是否为空 |
| | | var anyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "合托区").FirstOrDefault().areaCode); |
| | | if (anyLoc.Any()) |
| | | { |
| | | foreach (var item in anyLoc) |
| | | { |
| | | //生成一条出库的任务 |
| | | var relevancys = Settings.Relevancys.Where(s => s.InLoc == item.S_CODE).FirstOrDefault(); |
| | | if (relevancys == null) |
| | | { |
| | | LogHelper.Info($"Settings未查询到合托入库位{item.S_CODE}对应的出库位!", "杭氧"); |
| | | continue; |
| | | } |
| | | //生成到合托区的任务 |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, item.S_CODE, "码盘合托入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘合托入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | res = TaskProcess.HYCreateTransport(locMerge.S_LOC_CODE, relevancys.OutLoc, "码盘合托出库", locMerge.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘合托出库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | //(1.2)如果合托工位为空就直接合托到合托工位里面,同时生成一个出库任务把被合托的托盘出出来(标记为要合托) |
| | | ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "合托"); |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | break; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //(1.3)如果合托工位不为空就去入库缓存区(标记为要合托) |
| | | //生成到入库缓存区的任务 |
| | | var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "入库缓存区").FirstOrDefault().areaCode); |
| | | if (rkAnyLoc.Any()) |
| | | { |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | //标记为合托 |
| | | ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "合托"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | //2.如果没有要合托的托盘 |
| | | var area = reservoirs.Where(s => s.areaName == "入库接驳位").FirstOrDefault(); |
| | | if (area == null) |
| | | { |
| | | LogHelper.Info("Settings出现错误未查询到入库接驳位!", "杭氧"); |
| | | return false; |
| | | } |
| | | //(2.1)先查询入库接驳位是否为空,如果为空直接生成到入库的任务 |
| | | var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | if (anyLoc.Any()) |
| | | { |
| | | //生成到接驳位的任务 |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "码盘接驳入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘接驳入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | else |
| | | { |
| | | //(2.2)如果入库接驳位不为空,则生成到入库缓存区的任务(标记为不合托) |
| | | //生成到入库缓存区的任务 |
| | | var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "入库缓存区").FirstOrDefault().areaCode); |
| | | if (rkAnyLoc.Any()) |
| | | { |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | //标记为不合托 |
| | | ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "不合托"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | return false; |
| | | } |
| | | |
| | | } |
| | | |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 合托回库 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <param name="reservoirs"></param> |
| | | /// <returns></returns> |
| | | private static bool HandleMergeReturn(WMSTask mst, List<ReservoirArea> reservoirs) |
| | | { |
| | | var trayLst = ContainerHelper.GetCntrItemRel(mst.S_CNTR_CODE); |
| | | if (trayLst.Any()) |
| | | { |
| | | //满托回库 |
| | | var area = reservoirs.Where(s => s.areaName == "入库接驳位").FirstOrDefault(); |
| | | if (area == null) |
| | | { |
| | | LogHelper.Info("Settings出现错误未查询到入库接驳位!", "杭氧"); |
| | | return false; |
| | | } |
| | | //(2.1)先查询入库接驳位是否为空,如果为空直接生成到入库的任务 |
| | | var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | if (anyLoc.Any()) |
| | | { |
| | | //生成到接驳位的任务 |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "码盘接驳入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘接驳入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | else |
| | | { |
| | | //(2.2)如果入库接驳位不为空,则生成到入库缓存区的任务(标记为不合托) |
| | | //生成到入库缓存区的任务 |
| | | var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "入库缓存区").FirstOrDefault().areaCode); |
| | | if (rkAnyLoc.Any()) |
| | | { |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | //标记为不合托 |
| | | ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "不合托"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | return false; |
| | | } |
| | | |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //空托回库 |
| | | var area = reservoirs.Where(s => s.areaName == "人机接驳位-空托位").FirstOrDefault(); |
| | | if (area == null) |
| | | { |
| | | LogHelper.Info("Settings出现错误未查询到入库接驳位!", "杭氧"); |
| | | return false; |
| | | } |
| | | //(2.1)先查询人机接驳位-空托位是否为空,如果为空直接生成到入库的任务 |
| | | var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | if (anyLoc.Any()) |
| | | { |
| | | //生成到接驳位的任务 |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "人机接驳入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘接驳入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | else |
| | | { |
| | | //生成到入库缓存区的任务 |
| | | var rkAnyLoc = LocationHelper.GetLocAreaList(reservoirs.Where(s => s.areaName == "入库缓存区").FirstOrDefault().areaCode); |
| | | if (rkAnyLoc.Any()) |
| | | { |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, rkAnyLoc.FirstOrDefault().S_CODE, "码盘缓存入库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘缓存入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | //标记为不合托 |
| | | ContainerHelper.UpdateCntrAbouts(mst.S_CNTR_CODE, "不合托"); |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("入库缓存区没有空货位!", "杭氧"); |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 分拣回库 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <param name="reservoirs"></param> |
| | | /// <returns></returns> |
| | | private static async Task<bool> SortingReturn(WMSTask mst, List<ReservoirArea> reservoirs) |
| | | { |
| | | var trayLst = ContainerHelper.GetCntr(mst.S_CNTR_CODE); |
| | | if (trayLst != null && trayLst.S_TYPE.Equals("托盘")) |
| | | { |
| | | //托盘分拣回库 |
| | | var area = reservoirs.Where(s => s.areaName == "入库接驳位").FirstOrDefault(); |
| | | if (area == null) |
| | | { |
| | | LogHelper.Info("Settings出现错误未查询到入库接驳位!", "杭氧"); |
| | | return false; |
| | | } |
| | | //(2.1)先查询入库接驳位是否为空,如果为空直接生成到入库的任务 |
| | | var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | if (anyLoc.Any()) |
| | | { |
| | | //生成到接驳位的任务 |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "托盘分拣回库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("托盘分拣回库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //料箱回库 |
| | | var inbound = new Inbound() |
| | | { |
| | | areaCode = "LXLKQ" |
| | | }; |
| | | var wh = new Warehouse(inbound); |
| | | var stored = await wh.StoreItemAsync(); |
| | | if (stored == null) |
| | | { |
| | | LogHelper.Info($"未查询到{inbound.areaCode}可用货位!", "杭氧"); |
| | | return false; |
| | | } |
| | | |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, stored.loationCode, "料箱分拣回库" , mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("料箱分拣回库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 解绑回库 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <param name="reservoirs"></param> |
| | | /// <returns></returns> |
| | | private static async Task<bool> UnbindReturn(WMSTask mst, List<ReservoirArea> reservoirs) |
| | | { |
| | | var trayLst = ContainerHelper.GetCntr(mst.S_CNTR_CODE); |
| | | if (trayLst != null && trayLst.S_TYPE.Equals("托盘")) |
| | | { |
| | | //托盘分拣回库 |
| | | var area = reservoirs.Where(s => s.areaName == "入库接驳位").FirstOrDefault(); |
| | | if (area == null) |
| | | { |
| | | LogHelper.Info("Settings出现错误未查询到入库接驳位!", "杭氧"); |
| | | return false; |
| | | } |
| | | //(2.1)先查询入库接驳位是否为空,如果为空直接生成到入库的任务 |
| | | var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | if (anyLoc.Any()) |
| | | { |
| | | //生成到接驳位的任务 |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "托盘解绑回库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("托盘解绑回库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //料箱回库 |
| | | var inbound = new Inbound() |
| | | { |
| | | areaCode = "LXLKQ" |
| | | }; |
| | | var wh = new Warehouse(inbound); |
| | | var stored = await wh.StoreItemAsync(); |
| | | if (stored == null) |
| | | { |
| | | LogHelper.Info($"未查询到{inbound.areaCode}可用货位!", "杭氧"); |
| | | return false; |
| | | } |
| | | |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, stored.loationCode, "料箱解绑回库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("料箱解绑回库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 空托回库 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <param name="reservoirs"></param> |
| | | /// <returns></returns> |
| | | private static async Task<bool> EmptyPalletReturn(WMSTask mst, List<ReservoirArea> reservoirs) |
| | | { |
| | | var trayLst = ContainerHelper.GetCntr(mst.S_CNTR_CODE); |
| | | if (trayLst != null && trayLst.S_TYPE.Equals("托盘")) |
| | | { |
| | | //托盘空托回库 |
| | | var area = reservoirs.Where(s => s.areaName == "入库接驳位").FirstOrDefault(); |
| | | if (area == null) |
| | | { |
| | | LogHelper.Info("Settings出现错误未查询到入库接驳位!", "杭氧"); |
| | | return false; |
| | | } |
| | | //(2.1)先查询入库接驳位是否为空,如果为空直接生成到入库的任务 |
| | | var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | if (anyLoc.Any()) |
| | | { |
| | | //生成到接驳位的任务 |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "托盘空托回库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("托盘空托回库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | //料箱空托回库 |
| | | var inbound = new Inbound() |
| | | { |
| | | areaCode = "LXLKQ" |
| | | }; |
| | | var wh = new Warehouse(inbound); |
| | | var stored = await wh.StoreItemAsync(); |
| | | if (stored == null) |
| | | { |
| | | LogHelper.Info($"未查询到{inbound.areaCode}可用货位!", "杭氧"); |
| | | return false; |
| | | } |
| | | |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, stored.loationCode, "料箱空托回库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("料箱空托回库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 空托出库 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <param name="reservoirs"></param> |
| | | /// <returns></returns> |
| | | private static bool EmptyPalletOutbound(WMSTask mst) |
| | | { |
| | | var result = true; |
| | | var scheduler = new EmptyPalletOutboundScheduler(mst.S_START_AREA); |
| | | |
| | | var outbound = new Outbound |
| | | { |
| | | endArea = mst.S_END_AREA, |
| | | endBit = mst.S_END_LOC, |
| | | requiredCount = 1, |
| | | taskType = "空托出库" |
| | | }; |
| | | // 请求出库 |
| | | var tasks = scheduler.GenerateEmptyPalletTasks(outbound); |
| | | |
| | | foreach (var item in tasks) |
| | | { |
| | | // 创建出库任务 |
| | | var res = TaskProcess.HYCreateTransport(item.S_START_LOC, item.S_END_LOC, item.S_TYPE, item.S_CNTR_CODE, mst.S_CODE); |
| | | mst.S_START_LOC = item.S_START_LOC; |
| | | mst.S_CNTR_CODE = item.S_CNTR_CODE; |
| | | //修改空托出库起点和托盘码 |
| | | UpdateTask(mst,1); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info($"根据配盘单生成出库任务创建出库任务失败!!"); |
| | | return false; |
| | | } |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 料箱出库 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <param name="reservoirs"></param> |
| | | /// <returns></returns> |
| | | private static bool HandleBoxOutbound(WMSTask mst, List<ReservoirArea> reservoirs) |
| | | { |
| | | var result = true; |
| | | var area = reservoirs.Where(s => s.areaName == "料箱码盘区").FirstOrDefault(); |
| | | if (area == null) |
| | | { |
| | | LogHelper.Info("Settings出现错误未查询到料箱码盘区!", "杭氧"); |
| | | return false; |
| | | } |
| | | //(2.1)先查询入库接驳位是否为空,如果为空直接生成到入库的任务 |
| | | var anyLoc = LocationHelper.GetLocAreaList(area.areaCode); |
| | | if (anyLoc.Any()) |
| | | { |
| | | //生成到接驳位的任务 |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, anyLoc.FirstOrDefault().S_CODE, "料箱出库", mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("料箱出库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("料箱码盘区未有可用货位!", "杭氧"); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 发货暂存 || 发货清洗 || 发货装配 (暂时使用一个方法处理) |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <returns></returns> |
| | | private static bool PreShipmentStage(WMSTask mst) |
| | | { |
| | | var locList = LocationHelper.GetLocAreaList(mst.S_END_AREA); |
| | | if (locList.Any()) |
| | | { |
| | | var res = TaskProcess.HYCreateTransport(mst.S_START_LOC, locList.FirstOrDefault().S_CODE, mst.S_TYPE, mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info($"{mst.S_TYPE}入库任务创建失败!", "杭氧"); |
| | | return false; |
| | | } |
| | | WMSHelper.UpdateStatus(mst, 1); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 发货清洗 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <returns></returns> |
| | | private static bool OutboundCleaning(WMSTask mst) |
| | | { |
| | | return true; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 发货装配 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <returns></returns> |
| | | private static bool OutboundAssembly(WMSTask mst) |
| | | { |
| | | return true; |
| | | } |
| | | #endregion |
| | | |
| | | #region 执行作业 |
| | | |
| | | /// <summary> |
| | | /// 获取执行的作业创建任务 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <returns></returns> |
| | | internal static bool exeCreateInTask(WMSTask mst) |
| | | { |
| | | try |
| | | { |
| | | if (mst.S_B_STATE.Trim() != "执行") return true; |
| | | if (string.IsNullOrEmpty(mst.S_START_LOC)) return false; |
| | | |
| | | var reservoirs = Settings.ReservoirAreas?.ToList(); |
| | | if (reservoirs == null || !reservoirs.Any()) |
| | | { |
| | | LogHelper.Info("Settings出现错误未查询到杭氧的库区!", "杭氧"); |
| | | return false; |
| | | } |
| | | |
| | | switch (mst.S_TYPE) |
| | | { |
| | | case "配盘出库": |
| | | return PalletOutbound(mst); |
| | | default: |
| | | return true; |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | LogErrorDetails(ex); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 配盘出库 |
| | | /// </summary> |
| | | /// <param name="mst"></param> |
| | | /// <param name="reservoirs"></param> |
| | | /// <returns></returns> |
| | | private static bool PalletOutbound(WMSTask mst) |
| | | { |
| | | var relevancys = Settings.OutRelevancys.Where(s => s.conLoc == mst.S_END_LOC).FirstOrDefault(); |
| | | if (relevancys == null) |
| | | { |
| | | LogHelper.Info($"Settings未查询到集货位{mst.S_END_LOC}对应的分拣位!", "杭氧"); |
| | | return false; |
| | | } |
| | | var locList = LocationHelper.GetLocListEmptyFree(relevancys.sorLoc.ToList()); |
| | | if (locList.Any()) |
| | | { |
| | | var startLoc = WMSHelper.GetCntrLoc(mst.S_CNTR_CODE); |
| | | if (startLoc != null) |
| | | { |
| | | // 创建出库任务 |
| | | var res = TaskProcess.HYCreateTransport(startLoc.S_LOC_CODE, locList.FirstOrDefault().S_CODE, mst.S_TYPE, mst.S_CNTR_CODE, mst.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info($"根据配盘单生成出库任务创建出库任务失败!!"); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 错误日志记录 |
| | | /// </summary> |
| | | /// <param name="ex">错误信息</param> |
| | | private static void LogErrorDetails(Exception ex) |
| | | { |
| | | var st = new System.Diagnostics.StackTrace(ex, true); |
| | | var frame = st.GetFrame(0); |
| | | if (frame == null) return; |
| | | |
| | | var errorDetails = new StringBuilder() |
| | | .AppendLine($"错误信息: {ex.Message}") |
| | | .AppendLine($"文件名: {frame.GetFileName()}") |
| | | .AppendLine($"行号: {frame.GetFileLineNumber()}") |
| | | .AppendLine($"列号: {frame.GetFileColumnNumber()}") |
| | | .ToString(); |
| | | |
| | | LogHelper.Error("CreateInTask获取作业创建入库任务出现错误!" + errorDetails, ex); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 循环入库缓存区查询合托工位和入库接驳位是否有空货位(创建任务) |
| | |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | |
| | | //生成一条出库的任务 |
| | | var relevancys = Settings.Relevancys.Where(s => s.InLoc == anyLoc.FirstOrDefault().S_CODE).FirstOrDefault(); |
| | | if (relevancys == null) |
| | |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | |
| | | //不合托逻辑 |
| | | var noCntrAbouts = ContainerHelper.GetCntrAbouts(rkAnyLoc.areaCode, "不合托").FirstOrDefault(); |
| | | if (noCntrAbouts != null) |
| | |
| | | } |
| | | //2.2如果入库接驳位为空创建码盘接驳入库的任务 |
| | | //生成到接驳位的任务 |
| | | res = TaskProcess.HYCreateTransport(noCntrAbouts.S_LOC_CODE, anyLoc.FirstOrDefault().S_CODE, "码盘接驳入库", noCntrAbouts.S_CNTR_CODE,list.S_CODE); |
| | | res = TaskProcess.HYCreateTransport(noCntrAbouts.S_LOC_CODE, anyLoc.FirstOrDefault().S_CODE, "码盘接驳入库", noCntrAbouts.S_CNTR_CODE, list.S_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info("码盘接驳入库任务创建失败!", "杭氧"); |
| | |
| | | if (list == null) |
| | | { |
| | | list = WMSHelper.GetWmsTaskList("执行", item.cntrNo); |
| | | if (list != null && list.S_TYPE.Contains("回库")) |
| | | { |
| | | list.S_END_AREA = "TPLKQ"; |
| | | } |
| | | } |
| | | if (list == null) |
| | | { |
| | | result.errMsg = "未查询到在等待中的作业!"; |
| | | return result; |
| | | } |
| | | |
| | | |
| | | var inbound = new Inbound() |
| | | { |
| | | areaCode = list.S_END_AREA |
| | |
| | | WMSHelper.UpdateTaskStatus(list.S_CODE, 1); |
| | | ContainerHelper.UpdateCntrAbouts(list.S_CNTR_CODE, ""); |
| | | } |
| | | |
| | | |
| | | |
| | | result.success = true; |
| | | return result; |
| | |
| | | /// <summary> |
| | | /// 根据配盘单生成出库任务 |
| | | /// </summary> |
| | | /// <param name="distributionCntr">配盘单</param> |
| | | /// <param name="distributionCntrs">配盘单</param> |
| | | /// <returns></returns> |
| | | internal static bool GenerateFromPicking(List<DistributionCntr> distributionCntr) |
| | | internal static bool GenerateFromPicking(List<DistributionCntr> distributionCntrs) |
| | | { |
| | | try |
| | | { |
| | | // 创建调度器 |
| | | var scheduler = new DoubleDeepOutboundScheduler(distributionCntr); |
| | | // 1. 初始化调度器和出库任务列表 |
| | | var scheduler = new DoubleDeepOutboundScheduler(distributionCntrs); |
| | | var outboundTasks = CreateOutboundTasks(distributionCntrs); |
| | | |
| | | var listOut = new List<Outbound>(); |
| | | foreach (var item in distributionCntr) |
| | | { |
| | | listOut.Add(new Outbound |
| | | { |
| | | locCode = item.S_LOC_CODE, |
| | | areaCode = item.S_AREA_CODE, |
| | | endArea = item.S_EXIT_AREA_CODE, |
| | | endBit = item.S_EXIT_LOC_CODE, |
| | | trayCode = item.S_CNTR_CODE, |
| | | taskType = "配盘出库" |
| | | }); |
| | | } |
| | | // 请求出库 |
| | | var tasks = scheduler.GenerateOutboundTasks(listOut); |
| | | foreach (var item in tasks) |
| | | { |
| | | // 创建出库任务 |
| | | var res = TaskProcess.HYCreateTransport(item.S_START_LOC, item.S_END_LOC, item.S_TYPE, item.S_CNTR_CODE, item.S_OP_CODE); |
| | | UpdateDistributionCntrState("作业中", item.S_CNTR_CODE); |
| | | if (!res) |
| | | { |
| | | LogHelper.Info($"根据配盘单生成出库任务创建出库任务失败!!"); |
| | | return false; |
| | | } |
| | | } |
| | | return true; |
| | | // 2. 计算货位生成任务数据 |
| | | var tasks = scheduler.GenerateOutboundTasks(outboundTasks); |
| | | if (!tasks.Any()) return false; |
| | | |
| | | // 3. 创建WMS作业 |
| | | var mainTask = CreateMainWmsTask(tasks.Where(s=>s.S_TYPE == "配盘出库").First()); |
| | | if (!WMSHelper.CreateWmsTask(mainTask)) return false; |
| | | |
| | | // 4. 生成WMS主任务 |
| | | return ProcessAllTransportTasks(tasks, mainTask.S_CODE); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | var st = new System.Diagnostics.StackTrace(ex, true); |
| | | var frame = st.GetFrame(0); // 获取第一个堆栈帧 |
| | | if (frame != null) |
| | | LogErrorWithStackTrace("根据配盘单生成出库任务失败", ex); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | // --------------------- 辅助方法 --------------------- |
| | | |
| | | private static List<Outbound> CreateOutboundTasks(List<DistributionCntr> distributionCntrs) |
| | | { |
| | | return distributionCntrs.Select(item => new Outbound |
| | | { |
| | | locCode = item.S_LOC_CODE, |
| | | areaCode = item.S_AREA_CODE, |
| | | endArea = item.S_EXIT_AREA_CODE, |
| | | endBit = item.S_EXIT_LOC_CODE, |
| | | trayCode = item.S_CNTR_CODE, |
| | | taskType = "配盘出库" |
| | | }).ToList(); |
| | | } |
| | | |
| | | private static WMSTask CreateMainWmsTask(WCSTask firstTask) |
| | | { |
| | | return new WMSTask |
| | | { |
| | | S_CNTR_CODE = firstTask.S_CNTR_CODE, |
| | | S_CODE = WMSHelper.GenerateTaskNo(), |
| | | S_START_LOC = firstTask.S_START_LOC, |
| | | S_START_AREA = firstTask.S_START_AREA, |
| | | S_END_LOC = firstTask.S_END_LOC, |
| | | S_END_AREA = firstTask.S_END_AREA, |
| | | S_START_WH = "CK001", |
| | | S_END_WH = "CK001", |
| | | N_B_STATE = 1, |
| | | S_B_STATE = "执行", |
| | | N_TYPE = 2, |
| | | S_TYPE = "配盘出库" |
| | | }; |
| | | } |
| | | |
| | | private static bool ProcessAllTransportTasks(List<WCSTask> tasks, string wmsTaskCode) |
| | | { |
| | | foreach (var task in tasks.OrderBy(t => t.N_PRIORITY)) |
| | | { |
| | | if (IsLxLkqOrRelocationTask(task)) |
| | | { |
| | | LogHelper.Error($"根据配盘单生成出库任务!!", ex); |
| | | LogHelper.Error($"文件名: {frame.GetFileName()}", ex); |
| | | LogHelper.Error($"行号: {frame.GetFileLineNumber()}", ex); |
| | | LogHelper.Error($"列号: {frame.GetFileColumnNumber()}", ex); |
| | | if (!ProcessLxLkqTransportTask(task, wmsTaskCode)) |
| | | return false; |
| | | } |
| | | else |
| | | { |
| | | if (!ProcessNormalTransportTask(task, wmsTaskCode)) |
| | | return false; |
| | | } |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | private static bool IsLxLkqOrRelocationTask(WCSTask task) |
| | | { |
| | | return task.S_START_AREA == "LXLKQ" || task.S_TYPE == "深位移库"; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 生成LXLKQ || 深位移库的配盘任务 |
| | | /// </summary> |
| | | /// <param name="task"></param> |
| | | /// <param name="wmsTaskCode"></param> |
| | | /// <returns></returns> |
| | | private static bool ProcessLxLkqTransportTask(WCSTask task, string wmsTaskCode) |
| | | { |
| | | bool success = false; |
| | | if (task.S_TYPE == "深位移库") |
| | | { |
| | | success = TaskProcess.HYCreateTransport( |
| | | task.S_START_LOC, |
| | | task.S_END_LOC, |
| | | task.S_TYPE, |
| | | task.S_CNTR_CODE, |
| | | wmsTaskCode, |
| | | task.N_PRIORITY); |
| | | return success; |
| | | } |
| | | var relevancy = Settings.OutRelevancys.FirstOrDefault(s => s.conLoc == task.S_END_LOC); |
| | | if (relevancy == null) |
| | | { |
| | | LogHelper.Info($"Settings未查询到集货位{task.S_END_LOC}对应的分拣位!", "杭氧"); |
| | | return false; |
| | | } |
| | | |
| | | |
| | | // 尝试使用分拣位 |
| | | var emptyLoc = LocationHelper.GetLocListEmptyFree(relevancy.sorLoc.ToList()).FirstOrDefault(); |
| | | if (emptyLoc != null) |
| | | { |
| | | success = TaskProcess.HYCreateTransport( |
| | | task.S_START_LOC, |
| | | emptyLoc.S_CODE, |
| | | task.S_TYPE, |
| | | task.S_CNTR_CODE, |
| | | wmsTaskCode, |
| | | task.N_PRIORITY); |
| | | if (success && task.S_TYPE != "深位移库") |
| | | { |
| | | UpdateDistributionCntrState(1, 2, task.S_CNTR_CODE); |
| | | } |
| | | } |
| | | return success; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 生成TPLKQ的配盘任务 |
| | | /// </summary> |
| | | /// <param name="task"></param> |
| | | /// <param name="wmsTaskCode"></param> |
| | | /// <returns></returns> |
| | | private static bool ProcessNormalTransportTask(WCSTask task, string wmsTaskCode) |
| | | { |
| | | var relevancy = Settings.OutRelevancys.FirstOrDefault(s => s.conLoc == task.S_END_LOC); |
| | | if (relevancy == null) |
| | | { |
| | | LogHelper.Info($"Settings未查询到集货位{task.S_END_LOC}对应的分拣位!", "杭氧"); |
| | | return false; |
| | | } |
| | | |
| | | // 尝试使用分拣位 |
| | | var emptyLoc = LocationHelper.GetLocListEmptyFree(relevancy.sorLoc.ToList()).FirstOrDefault(); |
| | | if (emptyLoc != null) |
| | | { |
| | | return CreateAndLogTransport( |
| | | task.S_START_LOC, |
| | | emptyLoc.S_CODE, |
| | | task.S_TYPE, |
| | | task.S_CNTR_CODE, |
| | | wmsTaskCode, |
| | | task.N_PRIORITY); |
| | | } |
| | | |
| | | // 尝试使用拣选缓存区 |
| | | var reservoir = Settings.ReservoirAreas.FirstOrDefault(s => s.areaName == "拣选缓存区"); |
| | | if (reservoir == null) return false; |
| | | |
| | | var lxLocation = LocationHelper.GetLocAreaList(reservoir.areaCode).FirstOrDefault(); |
| | | if (lxLocation == null) return false; |
| | | |
| | | return CreateAndLogTransport( |
| | | task.S_START_LOC, |
| | | lxLocation.S_CODE, |
| | | "配盘缓存", |
| | | task.S_CNTR_CODE, |
| | | wmsTaskCode, |
| | | task.N_PRIORITY); |
| | | } |
| | | |
| | | private static bool CreateAndLogTransport(string startLoc, string endLoc, string taskType, |
| | | string cntrCode, string wmsTaskCode, int priority) |
| | | { |
| | | var success = TaskProcess.HYCreateTransport( |
| | | startLoc, endLoc, taskType, cntrCode, wmsTaskCode, priority); |
| | | |
| | | if (success) |
| | | { |
| | | UpdateDistributionCntrState(1, 2, cntrCode); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info("根据配盘单生成出库任务创建出库任务失败!!"); |
| | | } |
| | | |
| | | return success; |
| | | } |
| | | |
| | | private static void LogErrorWithStackTrace(string message, Exception ex) |
| | | { |
| | | var st = new StackTrace(ex, true); |
| | | var frame = st.GetFrame(0); |
| | | if (frame == null) return; |
| | | |
| | | LogHelper.Error($"{message}{ex.Message}!!", ex); |
| | | LogHelper.Error($"文件名: {frame.GetFileName()}", ex); |
| | | LogHelper.Error($"行号: {frame.GetFileLineNumber()}", ex); |
| | | LogHelper.Error($"列号: {frame.GetFileColumnNumber()}", ex); |
| | | } |
| | | |
| | | #endregion |