pengmn
2025-06-24 51141e4955e3021058664bea526f16b368738b3a
HH.WCS.Mobox3.HangYang/process/TaskProcess.cs
@@ -374,9 +374,9 @@
        }
        /// <summary>
        /// 入库单新增
        /// 杭氧物料主数据新增接口
        /// </summary>
        /// <param name="model">入库单</param>
        /// <param name="model">物料主数据</param>
        /// <returns></returns>
        public static Result GetMaterialData(List<MES_Material> model)
        {
@@ -385,44 +385,25 @@
            {
                if (model == null)
                {
                    result.errMsg = "入库单不可为空值!";
                    result.errMsg = "物料主数据不可为空值!";
                    return result;
                }
                var materialList = new List<TN_Material>();
                //foreach (var item in model.InOrderDetail)
                //{
                //    var itemType = WMSHelper.GetItemType(item.S_ITEM_CODE);
                //    if (itemType == null)
                //    {
                //        result.errMsg = $"未查询到物料{item.S_ITEM_CODE}的物料属性!";
                //        return result;
                //    }
                //    item.S_EXT_ATTR1 = itemType.S_ITEM_TYPE;
                //}
                //var groupedInOrders = model.InOrderDetail
                //                      .GroupBy(detail => detail.S_EXT_ATTR1) // 按物料属性分组
                //                      .Select((group, index) => new InOrder
                //                      {
                //                          S_NO = $"{model.S_BS_NO}_{index + 1}", // 拼接来源单号
                //                          S_BS_NO = model.S_BS_NO,
                //                          S_OP_TYPE = model.S_OP_TYPE,
                //                          S_BS_TYPE = model.S_BS_TYPE,
                //                          S_NOTE = model.S_NOTE,
                //                          InOrderDetail = group.Select(detail =>
                //                          {
                //                              // 修改 group 中的 S_IO_NO 字段为 S_NO 的值
                //                              detail.S_IO_NO = $"{model.S_BS_NO}_{index + 1}";
                //                              detail.S_BS_NO = model.S_BS_NO;
                //                              return detail;
                //                          }).ToList() // 分组后的明细
                //                      })
                //                      .ToList();
                //var res = WMSHelper.CreateOrderIn(groupedInOrders);
                //if (res)
                //{
                //    result.success = true;
                //}
                foreach (var item in model)
                {
                    materialList.Add(new TN_Material
                    {
                        S_ITEM_CODE = item.S_ITEM_CODE,
                        S_ITEM_NAME = item.S_ITEM_NAME,
                        S_ITEM_TYPE = item.S_AREA_CODE,
                        S_ITEM_SPEC = item.S_MATERIAL_SPEC,
                        S_MATERIAL = item.S_MATERIAL,
                        S_UOM = item.S_UOM,
                        C_CLEAN = item.C_CLEAN,
                    });
                }
                WMSHelper.CreateMaterialData(materialList);
                return result;
            }
            catch (Exception ex)
@@ -433,7 +414,7 @@
                var frame = st.GetFrame(0); // 获取第一个堆栈帧
                if (frame != null)
                {
                    LogHelper.Error($"GetInboundOrder入库单新增出现错误!!", ex);
                    LogHelper.Error($"GetMaterialData物料主数据新增出现错误!!", ex);
                    LogHelper.Error($"文件名: {frame.GetFileName()}", ex);
                    LogHelper.Error($"行号: {frame.GetFileLineNumber()}", ex);
                    LogHelper.Error($"列号: {frame.GetFileColumnNumber()}", ex);
@@ -444,7 +425,7 @@
        }
        /// <summary>
        /// 入库单新增
        /// 入库单新增以及修改
        /// </summary>
        /// <param name="model">入库单</param>
        /// <returns></returns>
@@ -518,9 +499,9 @@
        }
        /// <summary>
        /// 出库单新增
        /// 出库单新增以及修改
        /// </summary>
        /// <param name="model">入库单</param>
        /// <param name="model">出库单</param>
        /// <returns></returns>
        public static Result GetOutboundOrder(OutOrder model)
        {
@@ -599,6 +580,85 @@
                return result;
            }
        }
        /// <summary>
        /// 入库单取消
        /// </summary>
        /// <param name="model">入库单</param>
        /// <returns></returns>
        public static Result CancelInboundOrder(InOrder model)
        {
            Result result = new Result() { success = false, };
            try
            {
                if (model == null || !model.OrderDetail.Any())
                {
                    result.errMsg = "入库单取消不可为空值!";
                    return result;
                }
                var res = WMSHelper.CancelOrderIn(model);
                if (res)
                {
                    result.success = true;
                }
                return result;
            }
            catch (Exception ex)
            {
                result.success = false;
                result.errMsg = ex.Message;
                var st = new System.Diagnostics.StackTrace(ex, true);
                var frame = st.GetFrame(0); // 获取第一个堆栈帧
                if (frame != null)
                {
                    LogHelper.Error($"CancelInboundOrder入库单取消出现错误!!", ex);
                    LogHelper.Error($"文件名: {frame.GetFileName()}", ex);
                    LogHelper.Error($"行号: {frame.GetFileLineNumber()}", ex);
                    LogHelper.Error($"列号: {frame.GetFileColumnNumber()}", ex);
                }
                return result;
            }
        }
        /// <summary>
        /// 出库单取消
        /// </summary>
        /// <param name="model">出库单</param>
        /// <returns></returns>
        public static Result CancelOutboundOrder(OutOrder model)
        {
            Result result = new Result() { success = false };
            try
            {
                if (model == null || !model.OrderDetail.Any())
                {
                    result.errMsg = "出库单不可为空值!";
                    return result;
                }
                var res = WMSHelper.CancelOrderOut(model);
                if (res)
                {
                    result.success = true;
                }
                return result;
            }
            catch (Exception ex)
            {
                result.success = false;
                result.errMsg = ex.Message;
                var st = new System.Diagnostics.StackTrace(ex, true);
                var frame = st.GetFrame(0);
                if (frame != null)
                {
                    LogHelper.Error($"CancelOutboundOrder出库单取消出现错误!", ex);
                    LogHelper.Error($"文件名: {frame.GetFileName()}", ex);
                    LogHelper.Error($"行号: {frame.GetFileLineNumber()}", ex);
                    LogHelper.Error($"列号: {frame.GetFileColumnNumber()}", ex);
                }
                return result;
            }
        }
        ///// <summary>
        ///// 获取作业创建入库任务
@@ -1607,6 +1667,246 @@
        #endregion
        #region WCS调用接口
        /// <summary>
        /// WCS调用设备信号反馈
        /// </summary>
        /// <param name="model">请求参数</param>
        /// <returns></returns>
        public static async Task<WcsResult> notifyDeviceSignal(List<WcsModel> model)
        {
            WcsResult result = new WcsResult() { code = 1, };
            try
            {
                foreach (var item in model)
                {
                    if (string.IsNullOrEmpty(item.cntrNo))
                    {
                        result.msg = "托盘号为空!";
                        return result;
                    }
                    var list = WMSHelper.GetWmsTaskList("等待", item.cntrNo);
                    if (list == null)
                    {
                        list = WMSHelper.GetWmsTaskList("执行", item.cntrNo);
                        if (list != null && list.S_TYPE.Contains("回库"))
                        {
                            list.S_END_AREA = "TPLKQ";
                        }
                    }
                    if (list == null)
                    {
                        result.msg = "未查询到在等待中的作业!";
                        return result;
                    }
                    var inbound = new Inbound()
                    {
                        areaCode = list.S_END_AREA
                    };
                    var wh = new Warehouse(inbound);
                    var stored = await wh.StoreItemAsync();
                    if (stored == null)
                    {
                        result.msg = "立库区未查询到可用货位!";
                        return result;
                    }
                    var startLoc = ContainerHelper.GetCntrLoc(list.S_CNTR_CODE);
                    if (startLoc == null)
                    {
                        result.msg = $"未查询到托盘{list.S_CNTR_CODE}所在的货位!";
                        return result;
                    }
                    var res = TaskProcess.HYCreateTransport(startLoc.S_LOC_CODE, stored.loationCode, list.S_B_STATE == "等待" ? "料箱入库" : "托盘入库", list.S_CNTR_CODE, list.S_CODE);
                    if (!res)
                    {
                        result.msg = "入库任务创建失败!";
                        return result;
                    }
                    WMSHelper.UpdateTaskStatus(list.S_CODE, 1);
                    ContainerHelper.UpdateCntrAbouts(list.S_CNTR_CODE, "");
                }
                result.code = 0;
                return result;
            }
            catch (Exception ex)
            {
                result.code = 2;
                result.msg = ex.Message;
                var st = new System.Diagnostics.StackTrace(ex, true);
                var frame = st.GetFrame(0); // 获取第一个堆栈帧
                if (frame != null)
                {
                    LogHelper.Error($"notifyDeviceSignal设备信号反馈出现错误!!", ex);
                    LogHelper.Error($"文件名: {frame.GetFileName()}", ex);
                    LogHelper.Error($"行号: {frame.GetFileLineNumber()}", ex);
                    LogHelper.Error($"列号: {frame.GetFileColumnNumber()}", ex);
                }
                return result;
            }
        }
        /// <summary>
        /// WCS调用任务状态反馈
        /// </summary>
        /// <param name="model">请求参数</param>
        /// <returns></returns>
        public static async Task<WcsResult> notifyTaskStatus(WcsTaskModel model)
        {
            WcsResult result = new WcsResult() { code = 1, };
            try
            {
                if (model == null)
                {
                    result.msg = "请求参数为空";
                    return result;
                }
                var task = WCSHelper.GetTask(model.taskNo);
                if (task == null)
                {
                    result.msg = "未查询到任务号";
                    return result;
                }
                // 状态与操作的映射字典
                var stateActions = new Dictionary<int, Action>
                {
                    [1] = () => WCSHelper.Begin(task),
                    [2] = () => HandleTaskCompletion(task),
                    [3] = () => WCSHelper.UpdateStatus(task, "开始取货"),
                    [4] = () => HandlePickCompletion(task),
                    [5] = () => WCSHelper.UpdateStatus(task, "开始卸货"),
                    [6] = () => HandleUnloadCompletion(task),
                    [7] = () => HandleTaskFailure(task),
                    [8] = () => HandleTaskCompletion(task)
                };
                result.code = 0;
                return result;
            }
            catch (Exception ex)
            {
                result.code = 2;
                result.msg = ex.Message;
                var st = new System.Diagnostics.StackTrace(ex, true);
                var frame = st.GetFrame(0); // 获取第一个堆栈帧
                if (frame != null)
                {
                    LogHelper.Error($"notifyTaskStatus任务状态反馈出现错误!!", ex);
                    LogHelper.Error($"文件名: {frame.GetFileName()}", ex);
                    LogHelper.Error($"行号: {frame.GetFileLineNumber()}", ex);
                    LogHelper.Error($"列号: {frame.GetFileColumnNumber()}", ex);
                }
                return result;
            }
        }
        // 处理任务完成逻辑
        private static void HandleTaskCompletion(WCSTask task)
        {
            WCSHelper.End(task);
            // 根据任务类型处理不同的完成逻辑
            if (Settings.CompleteTasks.taskType.Contains(task.S_TYPE))
            {
                WMSHelper.UpdateWmsTask(task, 2);
                WMSHelper.UpdateDistributionCntrState(2, 3, task.S_CNTR_CODE);
            }
            if (new List<string> { "料箱入库", "托盘入库" }.Contains(task.S_TYPE))
            {
                ContainerHelper.UpdateCntrItem(task.S_CNTR_CODE);
            }
            // 处理区域变更
            HandleAreaChange(task);
        }
        // 处理取货完成逻辑
        private static void HandlePickCompletion(WCSTask task)
        {
            WCSHelper.UpdateStatus(task, "取货完成");
            TaskProcess.OperateStatus(task, 4);
        }
        // 处理卸货完成逻辑
        private static void HandleUnloadCompletion(WCSTask task)
        {
            WCSHelper.UpdateStatus(task, "卸货完成");
            TaskProcess.OperateStatus(task, 6);
        }
        // 处理任务失败逻辑
        private static void HandleTaskFailure(WCSTask task)
        {
            TaskProcess.OperateStatus(task, 7);
            WCSHelper.Fail(task);
        }
        // 处理区域变更逻辑
        private static void HandleAreaChange(WCSTask task)
        {
            var areas = new List<string> { "TPLKQ", "LXLKQ" };
            var area = new List<string> { "配盘出库", "配盘缓存" };
            if (areas.Contains(task.S_START_AREA) && !area.Contains(task.S_TYPE))
            {
                WMSHelper.DeleteChange(task);
            }
            if (areas.Contains(task.S_END_AREA))
            {
                WMSHelper.AddChange(task);
            }
        }
        /// <summary>
        /// WCS调用申请终点
        /// </summary>
        /// <param name="model">请求参数</param>
        /// <returns></returns>
        public static async Task<WcsResult> applyDest(WcsTaskEnd model)
        {
            WcsResult result = new WcsResult() { code = 1, };
            try
            {
                if (model == null)
                {
                    result.msg = "请求参数为空";
                    return result;
                }
                var task = WCSHelper.GetTask(model.taskNo);
                if (task == null)
                {
                    result.msg = "未查询到任务号";
                    return result;
                }
                result.code = 0;
                result.data.Add(new DataModel { taskNo = task.S_CODE, cntrCode = task.S_CNTR_CODE, end = task.S_END_LOC });
                return result;
            }
            catch (Exception ex)
            {
                result.code = 2;
                result.msg = ex.Message;
                var st = new System.Diagnostics.StackTrace(ex, true);
                var frame = st.GetFrame(0); // 获取第一个堆栈帧
                if (frame != null)
                {
                    LogHelper.Error($"applyDest申请终点出现错误!!", ex);
                    LogHelper.Error($"文件名: {frame.GetFileName()}", ex);
                    LogHelper.Error($"行号: {frame.GetFileLineNumber()}", ex);
                    LogHelper.Error($"列号: {frame.GetFileColumnNumber()}", ex);
                }
                return result;
            }
        }
        #endregion
@@ -1629,10 +1929,6 @@
            LogHelper.Error("CreateInTask获取作业创建入库任务出现错误!" + errorDetails, ex);
        }
        /// <summary>
        /// 循环入库缓存区查询合托工位和入库接驳位是否有空货位(创建任务)
@@ -1795,87 +2091,6 @@
                return false;
            }
        }
        /// <summary>
        /// WCS调用设备信号反馈
        /// </summary>
        /// <param name="model">请求参数</param>
        /// <returns></returns>
        public static async Task<Result> notifyDeviceSignal(List<Wcsmodel> model)
        {
            Result result = new Result() { success = false, };
            try
            {
                foreach (var item in model)
                {
                    if (string.IsNullOrEmpty(item.cntrNo))
                    {
                        result.errMsg = "托盘号为空!";
                        return result;
                    }
                    var list = WMSHelper.GetWmsTaskList("等待", item.cntrNo);
                    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
                    };
                    var wh = new Warehouse(inbound);
                    var stored = await wh.StoreItemAsync();
                    if (stored == null)
                    {
                        result.errMsg = "立库区未查询到可用货位!";
                        return result;
                    }
                    var startLoc = ContainerHelper.GetCntrLoc(list.S_CNTR_CODE);
                    if (startLoc == null)
                    {
                        result.errMsg = $"未查询到托盘{list.S_CNTR_CODE}所在的货位!";
                        return result;
                    }
                    var res = TaskProcess.HYCreateTransport(startLoc.S_LOC_CODE, stored.loationCode, list.S_B_STATE == "等待" ? "料箱入库" : "托盘入库", list.S_CNTR_CODE, list.S_CODE);
                    if (!res)
                    {
                        result.errMsg = "入库任务创建失败!";
                        return result;
                    }
                    WMSHelper.UpdateTaskStatus(list.S_CODE, 1);
                    ContainerHelper.UpdateCntrAbouts(list.S_CNTR_CODE, "");
                }
                result.success = true;
                return result;
            }
            catch (Exception ex)
            {
                result.success = false;
                result.errMsg = ex.Message;
                var st = new System.Diagnostics.StackTrace(ex, true);
                var frame = st.GetFrame(0); // 获取第一个堆栈帧
                if (frame != null)
                {
                    LogHelper.Error($"notifyDeviceSignalWCS调用设备信号反馈出现错误!!", ex);
                    LogHelper.Error($"文件名: {frame.GetFileName()}", ex);
                    LogHelper.Error($"行号: {frame.GetFileLineNumber()}", ex);
                    LogHelper.Error($"列号: {frame.GetFileColumnNumber()}", ex);
                }
                return result;
            }
        }
        /// <summary>