bklLiudl
2025-04-28 9b3567a5a2f1a81bec684e8aecda3a1146906cca
Admin.NET/WCS.Application/OpenApi/OpenApi.cs
@@ -1,22 +1,8 @@
using DocumentFormat.OpenXml.Presentation;
using Elastic.Clients.Elasticsearch;
using Admin.NET.Core.Service;
using Furion.DatabaseAccessor;
using Furion.Logging;
using NewLife.Serialization;
using Newtonsoft.Json;
using System;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using WCS.Application.Entity;
using Microsoft.AspNetCore.Mvc;
using Admin.NET.Core.Service;
using DocumentFormat.OpenXml.Bibliography;
using AngleSharp.Common;
using AngleSharp.Text;
using Newtonsoft.Json.Linq;
using SqlSugar;
using NewLife.Reflection;
using WCS.Application.Util;
namespace WCS.Application;
@@ -42,7 +28,54 @@
        _taskService = taskService;
    }
    // <summary>
    /// <summary>
    /// 测试分配任务路径
    /// </summary>
    /// <param name="models">任务信息</param>
    /// <returns>反馈信息</returns>
    [AllowAnonymous]
    public async Task AddAssignTasks(ResponseTasksModel models)
    {
        // 验证任务是否已存在
        var taskInfo = await _db.Queryable<WcsTask>().FirstAsync(w => w.TaskNo == models.TaskNo);
        if (taskInfo == null)
        {
            throw Oops.Bah("任务:" + models.TaskNo + ";不存在!");
        }
        var data1 = FourWayCarUtil.GetCarPath(taskInfo.StartLocate, taskInfo.EndLocate);
        if (data1 == null) //|| data1.Count == 0
        {
            throw Oops.Bah("分配路径不存在!");
        }
        // 根据任务状态 补充起始结束节点状态
        var data2 = FourWayCarUtil.GetCarPathUp(data1, 1);
        var path = "";
        var executionPath1 = "";
        foreach (var item in data1)
        {
            //路径节点
            var pathXYZ = item.X.ToString().PadLeft(2, '0') + item.Y.ToString().PadLeft(2, '0') + item.Z.ToString().PadLeft(2, '0') + item.NodeCom.ToString();
            path += pathXYZ + ";";
            if (item.IsSendPlc)
            {
                executionPath1 += pathXYZ + ";";
            }
        }
        // 插入四向车任务表
        var carTask1 = new WcsCarTasks()
        {
            TaskNo = taskInfo.TaskNo,
            PreId = "",
            ExecutionPath = executionPath1,
            Path = path,
            CarNo = "",
            Status = TaskStatusEnum.Wait
        };
        var i = _db.Insertable(carTask1).ExecuteCommand();
        Console.WriteLine(""+i);
    }
    /// WCS接受WMS下发的任务(多
    /// 条任务)
    /// <param name="models">任务信息</param>
@@ -73,7 +106,7 @@
            //新增任务
            var taskAdd = new WcsTask()
            {
                TaskNo = models.TaskNo,
                TaskNo = models.TaskNo,
                TaskType = (TaskTypeEnum)Convert.ToInt32(models.TaskType),
                Type = models.Type,
                Status = TaskStatusEnum.Wait,
@@ -85,6 +118,13 @@
                EndRoadway = models.EndRoadway,
                PalletNo = models.PalletNo,
            };
            // 若非AGV任务增加任务ID
            if (models.Type != PLCTypeEnum.AGV)
            {
                taskAdd.TaskId = FourWayCarUtil.GetTaskId();
            }
            listTask.Add(taskAdd);
        }
        await _db.Insertable(listTask).ExecuteCommandAsync();
@@ -115,8 +155,9 @@
        var taskAdd = new WcsTask()
        {
            TaskNo = models.TaskNo,
            TaskType = TaskTypeEnum.Out,
            TaskType = (TaskTypeEnum?)int.Parse(models.TaskType),
            Status = TaskStatusEnum.Wait,
            Type = models.Type,
            Levels = 999,
            Origin = "WMS",
            StartRoadway = models.StartRoadway,
@@ -125,6 +166,13 @@
            EndRoadway = models.EndRoadway,
            PalletNo = models.PalletNo,
        };
        // 若非AGV任务增加任务ID
        if (models.Type != PLCTypeEnum.AGV)
        {
            taskAdd.TaskId = FourWayCarUtil.GetTaskId();
        }
        await _db.Insertable(taskAdd).ExecuteCommandAsync();
    }
@@ -377,33 +425,8 @@
                {
                    case "end"://任务完成
                        {
                            PLCService.AGVStatus = false;
                            //把成品货物拉到缓存工位后,下一个任务把托盘拉去提升机或者缓存区(优先级低一点)
                            if (modTask.EndLocate == AGVStaionEnum.C1.ToString() || modTask.EndLocate == AGVStaionEnum.C2.ToString())
                            {
                                var strEndLocate = "";
                                Enum.TryParse(await _sysConfigService.GetConfigValue<string>("workshop_Trend"), out WorkshopEnum workshop);
                                if (workshop == WorkshopEnum.Storage)
                                    strEndLocate = AGVStaionEnum.A1.ToString();
                                else
                                    strEndLocate = AGVStorageUtil.GetProductInStorage();
                                WcsTask modInsertTask = new WcsTask()
                                {
                                    TaskNo = _taskService.GetTaskCode(),
                                    TaskType = TaskTypeEnum.Move,
                                    Type = PLCTypeEnum.AGV,
                                    StartLocate = modTask.EndLocate,//缓存区
                                    EndLocate = strEndLocate,
                                    PalletNo = modTask.PalletNo,
                                    Status = TaskStatusEnum.Wait,
                                    Levels = 6,
                                    Origin = "WCS"
                                };
                                await _db.Insertable(modInsertTask).ExecuteCommandAsync();
                                HubUtil.PublicTask(modInsertTask.Adapt<WcsTaskOutput>());
                            }
                            //货品拉到电梯口需要向输送线写入100
                            //货品拉到密集库入库口需要向输送线写入值
                            if (modTask.EndLocate == AGVStaionEnum.A1.ToString())
                            {
                                var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == "输送线");
@@ -431,52 +454,6 @@
                                    Log.Error("C口申请入库写入值100失败");
                                }
                            }
                            //放入拆托机后,向拆托机写入完成信号
                            if (modTask.EndLocate == AGVStaionEnum.D1.ToString())
                            {
                                var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.PalletMachine);
                                var modConn = new PLCUtil(modPlc);
                                var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.Text == "拆托机");
                                var res = modConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "0");
                                var modTaskMonitorPLC = new WcsTaskMonitor()
                                {
                                    TaskNo = modTask.TaskNo,
                                    PlcId = modDevice.PlcId,
                                    PlcName = modDevice.WcsPos,
                                    Status = TaskStatusEnum.Doing,
                                    InteractiveMsg = $"向{modDevice.Text}写入完成信号0,结果{res.IsSucceed}",
                                };
                                _db.Insertable(modTaskMonitorPLC).ExecuteCommand();
                                HubUtil.PublicTaskMonitor(modTaskMonitorPLC.Adapt<WcsTaskMonitorOutput>());
                                modConn.Close();
                            }
                            //if (modTask.EndLocate == AGVStaionEnum.B1.ToString() || modTask.EndLocate == AGVStaionEnum.B2.ToString())
                            //{
                            //    var num = modTask.EndLocate.Substring(1, 1);
                            //    var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.RobotPalletizer && s.WareHouseNo == num);
                            //    var modConn = new PLCUtil(modPlc);
                            //    var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.DB);
                            //    var res = modConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos, "0");
                            //    var modTaskMonitorPLC = new WcsTaskMonitor()
                            //    {
                            //        TaskNo = modTask.TaskNo,
                            //        PlcId = modDevice.PlcId,
                            //        PlcName = modDevice.PlcPos,
                            //        Status = TaskStatusEnum.Doing,
                            //        InteractiveMsg = $"向{modDevice.Text}写入放托完成信号,结果{res.IsSucceed}",
                            //    };
                            //    _db.Insertable(modTaskMonitorPLC).ExecuteCommand();
                            //    HubUtil.PublicTaskMonitor(modTaskMonitorPLC.Adapt<WcsTaskMonitorOutput>());
                            //    modConn.Close();
                            //}
                            if (modTask.EndLocate == AGVStaionEnum.F1.ToString())
                            {
                                await _sysConfigService.UpdateConfigValue("cache_Materal", true);
                            }
                            if (modTask.StartLocate == AGVStaionEnum.F1.ToString())
                            {
                                await _sysConfigService.UpdateConfigValue("cache_Materal", false);
                            }
                            modTask.Status = TaskStatusEnum.Complete;
                            modTask.FinishDate = DateTime.Now;
                            await _db.Updateable(modTask).ExecuteCommandAsync();
@@ -493,6 +470,7 @@
                            await _db.Insertable(modTaskMonitor).ExecuteCommandAsync();
                            HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                            HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            //反馈WMS任务完成
                            if (modTask.Origin == "WMS")
                            {
                                HttpService httpService = new HttpService();
@@ -503,125 +481,23 @@
                                inputs.TaskStatus = "2";
                                var modResponseTask = httpService.RequestTask(inputs).Result;
                            }
                            //托盘进出缓存区 需要记录
                            if (new[] { "Z", "C" }.Contains(modTask.EndLocate.Substring(0, 1)))
                            {
                                await _sysConfigService.UpdateConfigValue($"cache_{modTask.EndLocate}", true);
                            }
                            if (new[] { "Z", "C" }.Contains(modTask.StartLocate.Substring(0, 1)))
                            {
                                await _sysConfigService.UpdateConfigValue($"cache_{modTask.StartLocate}", false);
                            }
                        }
                        break;
                    case "outbin"://走出储位
                        {
                            //取空托完成后,向拆托机写入完成信号
                            if (modTask.StartLocate == AGVStaionEnum.D1.ToString() && (modTask.EndLocate == AGVStaionEnum.B1.ToString() || modTask.EndLocate == AGVStaionEnum.B2.ToString()))
                            //反馈WMS任务取货完成、WMS判断是平库储位就更新储位状态
                            if (modTask.Origin == "WMS")
                            {
                                var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.PalletMachine);
                                var modConn = new PLCUtil(modPlc);
                                var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.Text == "拆托机");
                                var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "取托信号");
                                var res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "0");
                                WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor()
                                {
                                    TaskNo = modTask.TaskNo,
                                    PlcId = modDevice.PlcId,
                                    PlcName = modPos.PlcPos,
                                    Status = TaskStatusEnum.Doing,
                                    InteractiveMsg = $"向{modDevice.Text}写入取托信号0,结果{res.IsSucceed}",
                                };
                                _db.Insertable(modTaskMonitor).ExecuteCommand();
                                HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "取托完成");
                                res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "1");
                                modTaskMonitor = new WcsTaskMonitor()
                                {
                                    TaskNo = modTask.TaskNo,
                                    PlcId = modDevice.PlcId,
                                    PlcName = modPos.PlcPos,
                                    Status = TaskStatusEnum.Doing,
                                    InteractiveMsg = $"向{modDevice.Text}写入取托完成1,结果{res.IsSucceed}",
                                };
                                _db.Insertable(modTaskMonitor).ExecuteCommand();
                                HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                modConn.Close();
                                HttpService httpService = new HttpService();
                                var inputs = new TaskRequestWMS();
                                inputs.TaskNo = modTask.TaskNo;
                                inputs.PalletNo = modTask.PalletNo;
                                inputs.TaskType = "2";
                                inputs.TaskStatus = "2";
                                var modResponseTask = httpService.RequestTaskQh(inputs).Result;
                            }
                            //todo:去码垛工位取货完成后,需要写PLC信号开启光幕
                            if ((modTask.StartLocate == AGVStaionEnum.B1.ToString() || modTask.StartLocate == AGVStaionEnum.B2.ToString())
                                && (modTask.EndLocate == AGVStaionEnum.C1.ToString() || modTask.EndLocate == AGVStaionEnum.C2.ToString()))
                            {
                                var num = modTask.StartLocate.Substring(1, 1);
                                var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.RobotPalletizer && s.WareHouseNo == num);
                                var modConn = new PLCUtil(modPlc);
                                var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.DB);
                                var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "开启光幕");
                                var res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "1");
                                var modTaskMonitor = new WcsTaskMonitor()
                                {
                                    TaskNo = modTask.TaskNo,
                                    PlcId = modDevice.PlcId,
                                    PlcName = modPos.PlcPos,
                                    Status = TaskStatusEnum.Doing,
                                    InteractiveMsg = $"向{modDevice.Text}写入开启光幕1,结果{res.IsSucceed}",
                                };
                                _db.Insertable(modTaskMonitor).ExecuteCommand();
                                HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                //写入光幕0
                                Task.Run(() =>
                                {
                                    var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.DB);
                                    var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "开启光幕");
                                    Thread.Sleep(1000);
                                    var res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "0");
                                    var modTaskMonitor = new WcsTaskMonitor()
                                    {
                                        TaskNo = modTask.TaskNo,
                                        PlcId = modDevice.PlcId,
                                        PlcName = modPos.PlcPos,
                                        Status = TaskStatusEnum.Doing,
                                        InteractiveMsg = $"向{modDevice.Text}写入开启光幕0,结果{res.IsSucceed}",
                                    };
                                    _db.Insertable(modTaskMonitor).ExecuteCommand();
                                    HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                });
                                //向码垛机器人写取托完成信号
                                modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Level == DeviceLevelEnum.Station);
                                res = modConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos, "0");
                                modTaskMonitor = new WcsTaskMonitor()
                                {
                                    TaskNo = modTask.TaskNo,
                                    PlcId = modDevice.PlcId,
                                    PlcName = modPos.PlcPos,
                                    Status = TaskStatusEnum.Doing,
                                    InteractiveMsg = $"向{modDevice.Text}写入取托完成信号,结果{res.IsSucceed}",
                                };
                                _db.Insertable(modTaskMonitor).ExecuteCommand();
                                HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                modConn.Close();
                            }
                            //起始工位是提升机取货工位
                            if (modTask.StartLocate == AGVStaionEnum.A1.ToString())
                            {
                                var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.ConveyorLine);
                                var modConn = new PLCUtil(modPlc);
                                var modDevice = PLCTaskAction.plcDevices.FirstOrDefault(s => s.PlcId == modPlc.Id && s.Text == "C口");
                                var modPos = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDevice.Id && s.Text == "取走确认");
                                var res = modConn.SetPlcDBValue(modPos.PosType, modDevice.DbNumber, modPos.PlcPos, "1");
                                Log.Information($"向plc{modDevice.PlcId}写入1-取走确认,结果:{res.ToJson()}");
                                var modTaskMonitor = new WcsTaskMonitor()
                                {
                                    TaskNo = modTask.TaskNo,
                                    PlcId = modDevice.PlcId,
                                    PlcName = modPos.PlcPos,
                                    Status = TaskStatusEnum.Doing,
                                    InteractiveMsg = $"向{modDevice.Text}写入取走确认,结果{res.IsSucceed}",
                                };
                                _db.Insertable(modTaskMonitor).ExecuteCommand();
                                HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            }
                        }
                        break;
                    case "apply"://放货申请
@@ -687,7 +563,7 @@
                            HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                        break;
                    case "cancel"://任务结束
                    case "cancel"://任务取消
                        {
                            PLCService.AGVStatus = false;
                            modTask.IsSuccess = TaskSuccessEnum.Fail;