kazelee
2025-05-28 de8cd5585ba690902333cf4ce9aa5dbc7eb9acf6
core/WCSCore.cs
@@ -4,8 +4,8 @@
using System.Text;
using System.Threading.Tasks;
using HH.WCS.Mobox3.DSZSH.api;
using HH.WCS.Mobox3.DSZSH.device;
using HH.WCS.Mobox3.DSZSH.models;
using HH.WCS.Mobox3.DSZSH.process;
using HH.WCS.Mobox3.DSZSH.util;
@@ -14,7 +14,6 @@
using Newtonsoft.Json;
using static HH.WCS.Mobox3.DSZSH.api.ApiModel;
namespace HH.WCS.Mobox3.DSZSH.core {
    public class WCSCore {
@@ -85,9 +84,12 @@
                    WCSHelper.UpdateStatus(TN_Task, "取货完成"); // 任务状态改成取货完成
                    TaskProcess.OperateStatus(TN_Task, 4); // 起点容器货位解绑,解锁起点
                    if (TN_Task.S_TYPE == TaskName.成品胶出库) {
                    if (TN_Task.S_TYPE == TaskName.C成品胶出库) {
                        var nextOutboundTask = Task.Run(() => {
                            UpdateOutboundTaskState(3);
                        });
                        var pickUpReturnErpTask = Task.Run(() => {
                            PickUpReturnErp(TN_Task);
                        });
                    }
@@ -102,11 +104,11 @@
                case 2: // 完成
                    WCSHelper.End(TN_Task); // 任务状态改成结束
                    if (TN_Task.S_TYPE == TaskName.抽检_出库) {
                        var checkCompleteTask = Task.Run(() => {
                            UpdateCheckTaskState(3);
                        });
                    }
                    //if (TN_Task.S_TYPE == TaskName.抽检_出库) {
                    //    var checkCompleteTask = Task.Run(() => {
                    //        UpdateCheckTaskState(3);
                    //    });
                    //}
                    break;
                case 7: // 异常
@@ -123,52 +125,108 @@
        }
        public static ReturnResult SafetyInteraction(SafetyInteractionInfo model) {
            var gzResult = new ReturnResult();
            var db = new SqlHelper<object>().GetInstance();
            ModbusHelper.Relink();
            var info = "";
            try {
                ModbusHelper.Relink();
                //var loc = db.Queryable<TN_Location>()
                //    .Where(l => l.S_AGV_SITE == model.station_name && Settings.AreaMap[AreaName.包装区].Contains(l.S_AREA_CODE))
                //    .First();
                var prodLineInfo = Settings.ProductionLines[0];
                var prodLineDevice = new ProductionLineDevice(prodLineInfo.PlcIp, prodLineInfo.PlcPort);
                if (!Settings.AgvSite_ProdLineCodeMap.TryGetValue(model.station_name, out int prodIndex)) {
                    info = $"AGV 站点{model.station_name}不是合法的产线接驳位站点";
                    LogHelper.Info(info);
                    return NewReturnResult(1, info);
                }
                var prodLineInfo = Settings.ProductionLines[prodIndex];
                var prodLineDevice = new ProductionLineDevice(prodLineInfo);
                if (!prodLineDevice.LoadDeviceStateOk()) {
                    LogHelper.Info("加载设备信息失败");
                    info = "与产线设备通讯失败";
                    LogHelper.Info(info);
                    return NewReturnResult(2, info);
                }
                var tn_task = db.Queryable<TN_Task>().First(a => a.S_CODE == model.task_no);
                if (tn_task == null) {
                    LogHelper.Info($"任务号 '{model.task_no}' 不存在");
                //var tn_task = db.Queryable<TN_Task>().First(a => a.S_CODE == model.task_no);
                //if (tn_task == null) {
                //    LogHelper.Info($"任务号 '{model.task_no}' 不存在");
                //}
                //if (prodLineDevice.SystemState == 1) {
                //    if (prodLineDevice.FullOffline == 1 && tn_task.S_TYPE == TaskName.托盘_满托下线入库) {
                //        prodLineDevice.AgvPicking = 1;
                //    }
                //    if (prodLineDevice.AllowAgvPlacePallet == 1 && tn_task.S_TYPE == TaskName.托盘_空托上线) {
                //        prodLineDevice.AgvPlacingPallet = 1;
                //    }
                //}
                if (prodLineDevice.SystemState != 1) {
                    info = $"当前产线无法与AGV联动:状态{prodLineDevice.SystemState}";
                    LogHelper.Info(info);
                    return NewReturnResult(3, info);
                }
                // 待修改:补充不同分支AGV判断
                if (prodLineDevice.SystemState == 1) {
                    if (prodLineDevice.FullOffline == 1 && tn_task.S_TYPE == TaskName.托盘_满托下线入库) {
                        prodLineDevice.AgvPicking = 1;
                if (model.apply_code == "5") { // 请求取货
                    if (prodLineDevice.FullOffline != 1) {
                        info = $"当前输送线满料下线信号不为1,无法取货";
                        LogHelper.Info(info);
                        return NewReturnResult(4, info);
                    }
                    if (prodLineDevice.AllowAgvPlacePallet == 1 && tn_task.S_TYPE == TaskName.托盘_空托上线) {
                        prodLineDevice.AgvPlacingPallet = 1;
                    if (!prodLineDevice.SetAgvPicking(1)) {
                        info = $"向输送线写入允许取货信号失败";
                        LogHelper.Info(info);
                        return NewReturnResult(5, info);
                    }
                    info = $"向输送线写入允许取货信号成功";
                    LogHelper.Info(info);
                    return NewReturnResult(0, info);
                }
                else if (model.apply_code == "1") { // 请求卸货
                    if (prodLineDevice.AllowAgvPlacePallet != 1) {
                        info = $"当前输送线允许放托盘信号不为1,无法放货";
                        LogHelper.Info(info);
                        return NewReturnResult(6, info);
                    }
                    if (!prodLineDevice.SetAgvPlacingPallet(1)) {
                        info = $"向输送线写入允许放货信号失败";
                        LogHelper.Info(info);
                        return NewReturnResult(7, info);
                    }
                    info = $"向输送线写入允许放货信号成功";
                    LogHelper.Info(info);
                    return NewReturnResult(0, info);
                }
                else {
                    info = $"当前AGV请求码不为 5取货 或 1卸货";
                    LogHelper.Info(info);
                    return NewReturnResult(8, info);
                }
                LogHelper.Info(JsonConvert.SerializeObject(prodLineDevice, Formatting.Indented));
                return gzResult;
            }
            catch (Exception ex) {
                LogHelper.Info($"发生了异常:{ex.Message}");
                return gzResult;
                info = $"发生了异常:{ex.Message}";
                LogHelper.InfoEx(ex);
                return NewReturnResult(1, info);
            }
        }
        public static void UpdateOutboundTaskState(int spotStateCode) {
            var taskName = TaskName.C成品胶出库;
            var db = new SqlHelper<object>().GetInstance();
            var detail = db.Queryable<TN_Outbound_Detail>()
                .First(d => d.N_B_STATE == 2);
            if (detail == null) {
                LogHelper.Info("出库--AGV取货--查询Detail:当前没有 执行中 的Detail表!");
                LogHelper.Info($"{taskName}--AGV取货--查询明细单:当前没有执行中的明细单");
                return;
            }
@@ -176,14 +234,14 @@
                detail.N_B_STATE = spotStateCode;
                if (db.Updateable<TN_Outbound_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                    tran.RollbackTran();
                    LogHelper.Info("出库--AGV取货:修改Detail状态 N_B_STATE 为 3任务执行完成 失败!");
                    LogHelper.Info($"{taskName}--AGV取货:修改明细单状态为3任务执行完成--失败!");
                    return;
                }
                var finishedCount = db.Queryable<TN_Outbound_Detail>().Count(d => d.S_OO_NO == detail.S_OO_NO && d.N_B_STATE == 3);
                var allCount = db.Queryable<TN_Outbound_Detail>().Count(d => d.S_OO_NO == detail.S_OO_NO);
                LogHelper.Info($"出库--AGV取货--统计任务已完成:{finishedCount} / {allCount}");
                LogHelper.Info($"{taskName}--AGV取货--统计任务已完成:{finishedCount}/{allCount}");
                if (finishedCount == allCount) { // 当前出库单下的所有明细单,任务都已经完成
@@ -192,7 +250,7 @@
                        .ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info("出库--AGV取货--所有任务完成时:修改Order状态 N_B_STATE 为 3任务执行完成 失败!");
                        LogHelper.Info($"{taskName}--AGV取货--所有任务完成时:修改单据状态为3任务执行完成--失败!");
                        return;
                    }
                }
@@ -201,84 +259,40 @@
            }
        }
        public static void UpdateCheckTaskState(int spotStateCode) {
            var db = new SqlHelper<object>().GetInstance();
            var detail = db.Queryable<TN_Check_Detail>()
                .First(d => d.N_B_STATE == 2);
            if (detail == null) {
                LogHelper.Info("抽检--AGV任务完成--查询Detail:当前没有 执行中 的Detail表!");
                return;
        public static void PickUpReturnErp(TN_Task task) {
            var httpH = new HttpHelper();
            var model = new OtherModel.PickUpReturnErpInfo();
            model.LocCode = task.S_START_LOC;
            try {
                var jsonInfo = JsonConvert.SerializeObject(model);
                var result = httpH.WebPost(Settings.ErpApiUrl + "PickUpReturn", jsonInfo);
                // TODO
            }
            using (var tran = db.Ado.UseTran()) {
                detail.N_B_STATE = spotStateCode;
                if (db.Updateable<TN_Check_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                    tran.RollbackTran();
                    LogHelper.Info("抽检--AGV任务完成:修改Detail状态 N_B_STATE 为 3任务执行完成 失败!");
                    return;
                }
                var finishedCount = db.Queryable<TN_Check_Detail>().Count(d => d.S_NO == detail.S_NO && d.N_B_STATE == 3);
                var allCount = db.Queryable<TN_Check_Detail>().Count(d => d.S_NO == detail.S_NO);
                LogHelper.Info($"抽检--AGV任务完成:统计任务已完成:{finishedCount} / {allCount}");
                if (finishedCount == allCount) { // 当前order下的detail,任务都已经完成
                    if (db.Updateable<TN_Check_Order>().SetColumns(it => it.N_B_STATE == 3)
                        .Where(it => it.S_NO == detail.S_NO)
                        .ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info("抽检--AGV任务完成--所有任务完成时:修改Order状态 N_B_STATE 为 3任务执行完成 失败!");
                        return;
                    }
                }
                tran.CommitTran();
            catch (Exception ex) {
                LogHelper.InfoEx(ex);
            }
        }
        public static void UpdateShiftTaskState(int spotStateCode) {
            var db = new SqlHelper<object>().GetInstance();
            var detail = db.Queryable<TN_Shift_Detail>()
                .First(d => d.N_B_STATE == 2);
            if (detail == null) {
                LogHelper.Info("移库--AGV任务完成--查询Detail:当前没有 执行中 的Detail表!");
                return;
        /// <summary>
        /// 任务分发,根据调度类型发给不同的调度系统
        /// </summary>
        internal static void Dispatch() {
            //查询任务
            //获取所有等待的任务
            var list = WCSHelper.GetWaitingTaskList();
            LogHelper.Info("等待任务信息" + JsonConvert.SerializeObject(list), "API");
            if (list.Count > 0) {
                list.ForEach(task => {
                    //使用自定义任务推送
                    TaskProcess.SendTask(task);//调度NDC或杭奥或国自设备
                    //TaskProcess.SendGZTask(task);///调度国自设备
                });
            }
            else {
                LogHelper.Info("暂无任务");
            }
            detail.N_B_STATE = spotStateCode;
            var finishedCount = db.Queryable<TN_Shift_Detail>().Count(d => d.S_NO == detail.S_NO && d.N_B_STATE == 3);
            var allCount = db.Queryable<TN_Shift_Detail>().Count(d => d.S_NO == detail.S_NO);
            LogHelper.Info($"移库--AGV任务完成:统计任务已完成:{finishedCount} / {allCount}");
            using (var tran = db.Ado.UseTran()) {
                if (db.Updateable<TN_Shift_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) {
                    tran.RollbackTran();
                    LogHelper.Info("移库--AGV任务完成:修改Detail状态 N_B_STATE 为 3任务执行完成 失败!");
                    return;
                }
                if (finishedCount == allCount) { // 当前order下的detail,任务都已经完成
                    if (db.Updateable<TN_Shift_Order>().SetColumns(it => it.N_B_STATE == 3)
                        .Where(it => it.S_NO == detail.S_NO)
                        .ExecuteCommand() <= 0) {
                        tran.RollbackTran();
                        LogHelper.Info("移库--AGV任务完成--所有任务完成时:修改Order状态 N_B_STATE 为 3任务执行完成 失败!");
                        return;
                    }
                }
                tran.CommitTran();
            }
        }
    }
}