kazelee
2025-05-21 a8627a98b82d2364cbe849ca746e72fbab9916e5
core/WCSCore.cs
File was renamed from Services/AgvService.cs
@@ -1,47 +1,34 @@
using HH.WCS.Mobox3.AnGang.Helpers;
using HH.WCS.Mobox3.AnGang.Models;
using HH.WCS.Mobox3.AnGang.device;
using HH.WCS.Mobox3.AnGang.dispatch;
using HH.WCS.Mobox3.AnGang.models;
using HH.WCS.Mobox3.AnGang.process;
using HH.WCS.Mobox3.AnGang.config;
using HH.WCS.Mobox3.AnGang.Helper;
using Newtonsoft.Json;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static HH.WCS.Mobox3.AnGang.api.ApiModel;
using HH.WCS.Mobox3.AnGang.wms;
using HH.WCS.Mobox3.AnGang.util;
using static HH.WCS.Mobox3.AnGang.Dtos.Request.AgvRequest;
using static HH.WCS.Mobox3.AnGang.Dtos.Response.AgvResponse;
using HH.WCS.Mobox3.AnGang.Consts;
using HH.WCS.Mobox3.AnGang.Dispatch;
using HH.WCS.Mobox3.AnGang.Devices;
namespace HH.WCS.Mobox3.AnGang.Services {
    public class AgvService {
namespace HH.WCS.Mobox3.AnGang.core
{
    internal class WCSCore
    {
        public static ReturnResult OperateAgvTaskStatus(AgvTaskState model) {
            var result = new ReturnResult();
            try {
                switch (model.state) {
                    case 1023:
                        break;
                    case 1025:
                        break;
                    case 1012:
                        break;
                    case 1004:
                        break;
                    case 1103:
                        break;
                    default:
                        // AGV 执行任务的逻辑处理
                        if (!AgvTaskProcessOk(model)) {
                            // 执行不OK,说明没有找到任务
                            result.ResultCode = 1;
                            result.ResultMsg = $"根据Model.No未找到对应的任务,{model.task_no}";
                            LogHelper.Info(result.ResultMsg, "API");
                            return result;
                        }
                        break;
                if (model.state > 0 && model.state < 1000) {
                    // AGV 执行任务的逻辑处理
                    if (!AgvTaskProcessOk(model)) {
                        // 执行不OK,说明没有找到任务
                        result.ResultCode = 1;
                        result.ResultMsg = $"根据Model.No未找到对应的任务,{model.task_no}";
                        LogHelper.Info(result.ResultMsg, "API");
                        return result;
                    }
                }
                result.ResultCode = 0;
@@ -69,48 +56,48 @@
            if (model.state > 7) {
                //安全请求等
                TaskHelper.OperateReq(model.task_no, model.state, model.forklift_no, model.ext_data);
                TaskProcess.OperateReq(model.task_no, model.state, model.forklift_no, model.ext_data);
                return true;
            }
            // AGV 任务 134562(7) 状态处理
            switch (model.state) {
                case AgvStateCode.执行:
                case 1: // 执行
                    WCSHelper.Begin(TN_Task, model.forklift_no); // 已推送的任务的状态改成执行
                    break;
                case AgvStateCode.开始取货:
                case 3: // 开始取货
                    WCSHelper.UpdateStatus(TN_Task, "开始取货"); // 任务状态改成开始取货
                    break;
                case AgvStateCode.取货完成:
                case 4: // 取货完成
                    WCSHelper.UpdateStatus(TN_Task, "取货完成"); // 任务状态改成取货完成
                    var captureTask = Task.Run(() => {
                        if (TN_Task.S_TYPE == TaskName.产品入库 || TN_Task.S_TYPE == TaskName.产品部分回库) {
                    if (TN_Task.S_TYPE == TaskName.产品入库 || TN_Task.S_TYPE == TaskName.产品部分回库) {
                        var captureTask = Task.Run(() => {
                            CapturePic(TN_Task);
                        }
                    });
                        });
                    }
                    var setEndLocTask = Task.Run(() => {
                        // 只要任务为产品入库(PDA),就需要重新指定终点(默认endLoc为"")
                        if (TN_Task.S_TYPE == TaskName.产品入库) {
                    if (TN_Task.S_TYPE == TaskName.产品入库) {
                        var setEndLocTask = Task.Run(() => {
                            // 只要任务为产品入库(PDA),就需要重新指定终点(默认endLoc为"")
                            SetEndLoc(TN_Task);
                        }
                    });
                        });
                    }
                    TaskHelper.OperateStatus(TN_Task, 4); // 起点容器货位解绑,解锁起点
                    TaskProcess.OperateStatus(TN_Task, 4); // 起点容器货位解绑,解锁起点
                    break;
                case AgvStateCode.开始卸货:
                case 5: // 开始卸货
                    WCSHelper.UpdateStatus(TN_Task, "开始卸货"); // 任务状态改成开始卸货
                    break;
                case AgvStateCode.卸货完成:
                case 6: // 卸货完成
                    WCSHelper.UpdateStatus(TN_Task, "卸货完成"); // 任务状态改成卸货完成
                    TaskHelper.OperateStatus(TN_Task, 6); // 终点容器货位绑定,解锁终点
                    TaskProcess.OperateStatus(TN_Task, 6); // 终点容器货位绑定,解锁终点
                    break;
                case AgvStateCode.完成:
                case 2: // 完成
                    WCSHelper.End(TN_Task); // 任务状态改成结束
                    break;
                case AgvStateCode.异常:
                    TaskHelper.OperateStatus(TN_Task, 7); // 异常处理
                case 7: // 异常
                    TaskProcess.OperateStatus(TN_Task, 7); // 异常处理
                    WCSHelper.Fail(TN_Task); // 任务状态改成错误
                    break;
            }
@@ -122,7 +109,7 @@
        }
        public static void CapturePic(TN_Task model) {
            var db = DbHelper.GetDbClient();
            var db = new SqlHelper<object>().GetInstance();
            var filepath = SnapManager.GetCapturePicturePath();
            if (string.IsNullOrEmpty(filepath)) {
@@ -140,7 +127,7 @@
        }
        public static void SetEndLoc(TN_Task tn_task) {
            var db = DbHelper.GetDbClient();
            var db = new SqlHelper<object>().GetInstance();
            var endLoc = db.Queryable<TN_Location>()
                .First(a => a.S_CODE == tn_task.S_END_LOC);
@@ -218,45 +205,58 @@
                //};
                //GZRobot.UpdateInteractInfo(request);
                using (var trans = db.Ado.UseTran()) {
                    if (db.Updateable<TN_Task>(tn_task).UpdateColumns(it => new { it.S_END_LOC })
                if (db.Updateable<TN_Task>(tn_task).UpdateColumns(it => new { it.S_END_LOC })
                        .ExecuteCommand() > 0) {
                        //LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁
                        trans.CommitTran();
                        LogHelper.Info($"重新计算后没有合适货位,任务 {tn_task.S_CODE} 修改成功,修改终点货位为 0空");
                    }
                    else {
                        trans.RollbackTran();
                        LogHelper.Info($"重新计算后没有合适货位,任务 {tn_task.S_CODE} 修改失败,修改终点货位为 0空");
                    }
                    //LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁
                    LogHelper.Info($"重新计算后没有合适货位,任务 {tn_task.S_CODE} 修改成功,修改终点货位为 0空");
                }
                else {
                    LogHelper.Info($"重新计算后没有合适货位,任务 {tn_task.S_CODE} 修改失败,修改终点货位为 0空");
                }
            }
            else {
                // 找到合适的货位,推送
                tn_task.S_END_LOC = endLoc.S_CODE;
                using (var trans = db.Ado.UseTran()) {
                    if (db.Updateable<TN_Task>(tn_task).UpdateColumns(it => new { it.S_END_LOC })
                if (db.Updateable<TN_Task>(tn_task).UpdateColumns(it => new { it.S_END_LOC })
                        .ExecuteCommand() > 0) {
                        LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁
                        trans.CommitTran();
                        LogHelper.Info($"计算货位成功,任务 {tn_task.S_CODE} 修改成功,终点货架为 {endLoc.N_ROW},修改终点位置为 {endLoc.S_CODE}");
                    }
                    else {
                        trans.RollbackTran();
                        LogHelper.Info($"计算货位成功,任务 {tn_task.S_CODE} 修改失败,终点货架为 {endLoc.N_ROW},修改终点位置为 {endLoc.S_CODE}");
                    }
                    LocationHelper.LockLoc(endLoc.S_CODE, 1);//终点入库锁
                    LogHelper.Info($"计算货位成功,任务 {tn_task.S_CODE} 修改成功,终点货架为 {endLoc.N_ROW},修改终点位置为 {endLoc.S_CODE}");
                }
                else {
                    LogHelper.Info($"计算货位成功,任务 {tn_task.S_CODE} 修改失败,终点货架为 {endLoc.N_ROW},修改终点位置为 {endLoc.S_CODE}");
                }
            }
        }
        /// <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("暂无任务");
            }
        }
        public static ReturnResult SafetyInteraction(SafetyInteractionInfo model) {
            var gzResult = new ReturnResult();
            //var db = DbHelper.GetDbClient();
            //var db = new SqlHelper<object>().GetInstance();
            //ModbusHelper.Relink();
            //var productionLineInfo = Settings.ProductionLines[0];