Administrator
10 天以前 4b4afa78f556199e5778d5cac88d3d6de6d8c1da
Admin.NET/WCS.Application/OpenApi/OpenApi.cs
@@ -1,24 +1,9 @@
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 static SKIT.FlurlHttpClient.Wechat.Api.Models.CustomServiceKfSessionGetWaitCaseResponse.Types;
using WCS.Application.Util;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.ComponentTCBBatchCreateContainerServiceVersionRequest.Types;
namespace WCS.Application;
@@ -50,24 +35,29 @@
    /// <param name="models">任务信息</param>
    /// <returns>反馈信息</returns>
    [AllowAnonymous]
    public async Task AddAssignTasks(ResponseTasksModel models)
    public async Task<ResponseAgvDto> AddAssignTasks(AgvTaskSend 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("090501", "080501","0");
        if (data1 == null) //|| data1.Count == 0
        {
            throw Oops.Bah("分配路径不存在!");
        }
        // 根据任务状态 补充起始结束节点状态
        var data2 = FourWayCarUtil.GetCarPathUp(data1, 0);
        var path = "";
        var executionPath1 = "";
        var response = await new HttpService().GenAgvSendTask(models);
        //var response2 = await new HttpService().GenAgvContinueTask("Tk20250503000001");
        //var response3 = await new HttpService().GenAgvUnbind("models", "B010101");
            return response;
        // 验证任务是否已存在
        //var taskInfo = await _db.Queryable<WcsTask>().FirstAsync(w => w.TaskNo == models.TaskNo);
        //if (taskInfo == null)
        //{
        //    throw Oops.Bah("任务:" + models.TaskNo + ";不存在!");
        //}
        //var data1 = FourWayCarUtil.GetCarPath("091501", "091601","0");
        //if (data1 == null) //|| data1.Count == 0
        //{
        //    throw Oops.Bah("分配路径不存在!");
        //}
        //// 根据任务状态 补充起始结束节点状态
        //var data2 = FourWayCarUtil.GetCarPathUp(data1, 0);
        //var path = "";
        //var executionPath1 = "";
        //foreach (var item in data1)
        //{
        //    //路径节点
@@ -109,7 +99,8 @@
            throw Oops.Bah("任务已存在!");
        }
        var listTask = new List<WcsTask>();
        foreach (var models in modelList)
        var list = modelList.OrderBy(m => m.Order).ThenBy(m => m.TaskNo).ToList();
        foreach (var models in list)
        {
            if (models.TaskType == "0")
            {
@@ -122,21 +113,32 @@
            //新增任务
            var taskAdd = new WcsTask()
            {
                TaskNo = models.TaskNo,
                TaskNo = models.TaskNo,
                TaskType = (TaskTypeEnum)Convert.ToInt32(models.TaskType),
                Type = models.Type,
                Status = TaskStatusEnum.Wait,
                Levels = 999,
                Origin = "WMS",
                SkuNo = models.SkuNo,
                SkuName=models.SkuName,
                LotNo=models.LotNo,
                StartRoadway = models.StartRoadway,
                StartLocate = models.StartLocate,
                EndLocate = models.EndLocate,
                EndRoadway = models.EndRoadway,
                PalletNo = models.PalletNo,
                CreateTime = DateTime.Now
            };
            listTask.Add(taskAdd);
            // 若非AGV任务增加任务ID
            if (models.Type != PLCTypeEnum.AGV)
            {
                taskAdd.TaskId = FourWayCarUtil.GetTaskId();
            }
            await _db.Insertable(taskAdd).ExecuteCommandAsync();
        }
        await _db.Insertable(listTask).ExecuteCommandAsync();
    }
    /// <summary>
    /// WCS接受WMS下发的任务(单条任务)
@@ -169,12 +171,22 @@
            Type = models.Type,
            Levels = 999,
            Origin = "WMS",
            SkuNo = models.SkuNo,
            SkuName = models.SkuName,
            LotNo = models.LotNo,
            StartRoadway = models.StartRoadway,
            StartLocate = models.StartLocate,
            EndLocate = models.EndLocate,
            EndRoadway = models.EndRoadway,
            PalletNo = models.PalletNo,
        };
        // 若非AGV任务增加任务ID
        if (models.Type != PLCTypeEnum.AGV)
        {
            taskAdd.TaskId = FourWayCarUtil.GetTaskId();
        }
        await _db.Insertable(taskAdd).ExecuteCommandAsync();
    }
@@ -409,53 +421,29 @@
    [UnitOfWork]
    public async Task<dynamic> agvCallback(AGVCallBackInput input)
    {
        Log.Information("AGV反馈任务" + input.ToJson());
        AGVCallBackResponse result = new AGVCallBackResponse()
        {
            ReqCode = input.ReqCode,
            Message = "成功",
            Code = "0"
        };
        if (input.TaskCode.Substring(0, 3) != "WCS" && input.TaskCode.Substring(0, 2) != "TK")
        if (input.robotTaskCode.Substring(0, 3) != "WCS" && input.robotTaskCode.Substring(0, 2) != "TK")
        {
            result.Message = "反馈的任务不是WCS的任务";
            result.Code = "1";
            return result;
        }
        PLCUtil modUtil = null;
        try
        {
            var modTask = await _db.Queryable<WcsTask>().FirstAsync(s => s.TaskNo == input.TaskCode);
            var modTask = await _db.Queryable<WcsTask>().FirstAsync(s => s.TaskNo == input.robotTaskCode);
            if (modTask != null)
            {
                switch (input.Method)
                switch (input.Extra.Values.Method)
                {
                    case "end"://任务完成
                        {
                            //货品拉到密集库入库口需要向输送线写入值
                            if (modTask.EndLocate == AGVStaionEnum.A1.ToString())
                            {
                                var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == "输送线");
                                var modConn = new PLCUtil(modPlc);
                                var modDevice = PLCTaskAction.plcDevices.First(s => s.Text == "C口");
                                var modStation = PLCTaskAction.plcPositions.First(s => s.Text == "C口申请入库");
                                var plcResult = modConn.SetPlcDBValue(modStation.PosType, modDevice.DbNumber, modStation.PlcPos, "100");
                                if (plcResult.IsSucceed)
                                {
                                    WcsTaskMonitor modTaskMonitorPLC = new WcsTaskMonitor()
                                    {
                                        TaskNo = modTask.TaskNo,
                                        PlcId = modDevice.PlcId,
                                        PlcName = modStation.PlcPos,
                                        StartLocat = modTask.StartLocate,
                                        EndLocat = modTask.EndLocate,
                                        Status = TaskStatusEnum.Doing,
                                        InteractiveMsg = $"向{modStation.Text}写入指令100,结果{plcResult.IsSucceed}",
                                    };
                                    _db.Insertable(modTaskMonitorPLC).ExecuteCommand();
                                    HubUtil.PublicTaskMonitor(modTaskMonitorPLC.Adapt<WcsTaskMonitorOutput>());
                                }
                                else
                                {
                                    Log.Error("C口申请入库写入值100失败");
                                }
                            }
                            modTask.Status = TaskStatusEnum.Complete;
                            modTask.FinishDate = DateTime.Now;
                            await _db.Updateable(modTask).ExecuteCommandAsync();
@@ -479,7 +467,7 @@
                                var inputs = new TaskRequestWMS();
                                inputs.TaskNo = modTask.TaskNo;
                                inputs.PalletNo = modTask.PalletNo;
                                inputs.TaskType = "2";
                                inputs.TaskType = ((int)modTask.TaskType).ToString();
                                inputs.TaskStatus = "2";
                                var modResponseTask = httpService.RequestTask(inputs).Result;
                            }
@@ -488,6 +476,17 @@
                        break;
                    case "outbin"://走出储位
                        {
                            WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor()
                            {
                                TaskNo = modTask.TaskNo,
                                //PlcId = modDevice.PlcId,
                                PlcName = "AGV",
                                StartLocat = modTask.StartLocate,
                                EndLocat = modTask.EndLocate,
                                Status = TaskStatusEnum.Complete,
                                InteractiveMsg = $"AGV小车反馈任务取货完成,走出储位",
                            };
                            await _db.Insertable(modTaskMonitor).ExecuteCommandAsync();
                            //反馈WMS任务取货完成、WMS判断是平库储位就更新储位状态
                            if (modTask.Origin == "WMS")
                            {
@@ -495,74 +494,67 @@
                                var inputs = new TaskRequestWMS();
                                inputs.TaskNo = modTask.TaskNo;
                                inputs.PalletNo = modTask.PalletNo;
                                inputs.TaskType = "2";
                                inputs.TaskType = ((int)modTask.TaskType).ToString();
                                inputs.TaskStatus = "2";
                                var modResponseTask = httpService.RequestTaskQh(inputs).Result;
                            }
                        }
                        break;
                    case "apply"://放货申请
                    case "release"://放货申请
                        {
                            //todo:去码垛工位取货,需要写PLC信号关闭光幕
                            if ((modTask.StartLocate == AGVStaionEnum.B1.ToString() || modTask.StartLocate == AGVStaionEnum.B2.ToString())
                                && (modTask.EndLocate == AGVStaionEnum.C1.ToString() || modTask.EndLocate == AGVStaionEnum.C2.ToString()))
                            if (modTask.EndLocate != "B040101")//9号工位地址
                            {
                                var no = modTask.StartLocate.Substring(1, 1);
                                var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Type == PLCTypeEnum.RobotPalletizer && s.WareHouseNo == no);
                                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>());
                                Task.Run(() =>
                                {
                                    Thread.Sleep(1000);
                                    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>());
                                });
                                modConn.Close();
                                result.Code = "1";
                                result.Message = "找不到该任务";
                                return result;
                            }
                            //modTask.Status = TaskStatusEnum.Complete;
                            modTask.IsComple = "1";
                            await _db.Updateable(modTask).ExecuteCommandAsync();
                            WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor()
                            {
                                TaskNo = modTask.TaskNo,
                                //PlcId = modDevice.PlcId,
                                PlcName = "AGV",
                                StartLocat = modTask.StartLocate,
                                EndLocat = modTask.EndLocate,
                                Status = TaskStatusEnum.Complete,
                                InteractiveMsg = $"AGV小车反馈任务到达9工位",
                            };
                            await _db.Insertable(modTaskMonitor).ExecuteCommandAsync();
                            HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                            HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            if (modTask.Origin == "WMS")
                            {
                                HttpService httpService = new HttpService();
                                var inputs = new TaskRequestWMS();
                                inputs.TaskNo = modTask.TaskNo;
                                inputs.PalletNo = modTask.PalletNo;
                                inputs.TaskType = ((int)modTask.TaskType).ToString();
                                inputs.TaskStatus = "2";
                                var modResponseTask = httpService.RequestTaskQh(inputs).Result;
                            }
                        }
                        break;
                    case "start"://任务开始
                    case "notifyFullSite":
                        {
                            //开始向拆托机放入托盘任务
                            if (modTask.EndLocate == AGVStaionEnum.D1.ToString())
                            var palletNo = input.Extra.Values.carrierCode;
                            var count = input.Extra.Values.pileCount;
                            if (string.IsNullOrWhiteSpace(palletNo) || count <= 0)
                            {
                                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, "1");
                                modConn.Close();
                                throw new Exception("参数:托盘号/数量验证失败");
                            }
                            //向WMS申请空托入库
                            HttpService httpService = new HttpService();
                            var inputs = new NullPallInRequest();
                            inputs.PalletNo = palletNo;
                            inputs.PallNum = count;
                            inputs.Locate = "B100101";//叠托盘机位置
                            inputs.HouseNo = "W02";
                            var modResponseTask = httpService.RequestLiKuPallet(inputs);
                            var taskMonitor = new WcsTaskMonitor()
                            {
                                TaskNo = modTask.TaskNo,
                                PlcName = input.Method,
                                InteractiveMsg = $"AGV小车反馈任务开始"
                            };
                            await _db.Insertable(taskMonitor).ExecuteCommandAsync();
                            HubUtil.PublicTaskMonitor(taskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                        break;
                    case "cancel"://任务取消
@@ -611,11 +603,10 @@
            modUtil?.Close();
        }
        Log.Information("AGV反馈任务返回" + result.ToJson());
        return result;
    }
    /// <summary>
    /// 获取原材料仓状态
    /// </summary>
@@ -675,35 +666,35 @@
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [UnitOfWork]
    public async Task ProductStorage(RequestStorage input)
    {
        var intProduct = AGVStorageUtil.ProductCount();
        var intTask = await _db.Queryable<WcsTask>().Where(s => s.TaskType == TaskTypeEnum.Move
                                            && s.Type == PLCTypeEnum.AGV && s.Status <= TaskStatusEnum.Doing
                                            && s.StartLocate.StartsWith("Z") && s.EndLocate == AGVStaionEnum.A1.ToString()).CountAsync();
        if (input.Qty > intProduct)
            throw Oops.Bah($"输入数量大于可出数量{intProduct}");
        var listTask = new List<WcsTask>();
        var TaskNo = GetTaskCode("WCS");
        for (int i = 0; i < input.Qty; i++)
        {
            listTask.Add(new WcsTask()
            {
                TaskNo = "WCS" + DateTime.Now.ToString("yyyyMMdd") + (TaskNo++).ToString().PadLeft(4, '0'),
                TaskType = TaskTypeEnum.Move,
                Type = PLCTypeEnum.AGV,
                StartLocate = AGVStaionEnum.Z11.ToString(),
                EndLocate = AGVStaionEnum.A1.ToString(),
                PalletNo = "",
                Status = TaskStatusEnum.Wait,
                Levels = 10,
                Origin = "PDA"
            });
        }
        await _db.Insertable(listTask).ExecuteCommandAsync();
    }
    //[HttpPost]
    //[UnitOfWork]
    //public async Task ProductStorage(RequestStorage input)
    //{
    //    var intProduct = AGVStorageUtil.ProductCount();
    //    var intTask = await _db.Queryable<WcsTask>().Where(s => s.TaskType == TaskTypeEnum.Move
    //                                        && s.Type == PLCTypeEnum.AGV && s.Status <= TaskStatusEnum.Doing
    //                                        && s.StartLocate.StartsWith("Z") && s.EndLocate == AGVStaionEnum.A1.ToString()).CountAsync();
    //    if (input.Qty > intProduct)
    //        throw Oops.Bah($"输入数量大于可出数量{intProduct}");
    //    var listTask = new List<WcsTask>();
    //    var TaskNo = GetTaskCode("WCS");
    //    for (int i = 0; i < input.Qty; i++)
    //    {
    //        listTask.Add(new WcsTask()
    //        {
    //            TaskNo = "WCS" + DateTime.Now.ToString("yyyyMMdd") + (TaskNo++).ToString().PadLeft(4, '0'),
    //            TaskType = TaskTypeEnum.Move,
    //            Type = PLCTypeEnum.AGV,
    //            StartLocate = AGVStaionEnum.Z11.ToString(),
    //            EndLocate = AGVStaionEnum.A1.ToString(),
    //            PalletNo = "",
    //            Status = TaskStatusEnum.Wait,
    //            Levels = 10,
    //            Origin = "PDA"
    //        });
    //    }
    //    await _db.Insertable(listTask).ExecuteCommandAsync();
    //}
    /// <summary>
    /// 自动生成任务号
    /// </summary>