chengsc
2025-05-06 d06e44eb1c8818c8d19709602631eb7888d4f0e9
修改程序,AGV交互
12个文件已修改
1385 ■■■■■ 已修改文件
Admin.NET/WCS.Application/Entity/WcsTask.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Enum/FourWayCarEnum.cs 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Hub/HubUtil.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Model/AGVModel.cs 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/OpenApi/OpenApi.cs 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCCommon.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCService.cs 342 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs 98 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Service/WcsTask/WcsTaskService.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Util/AGVStorageUtil.cs 316 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Util/HttpService.cs 215 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Admin.NET/WCS.Application/Entity/WcsTask.cs
@@ -188,5 +188,9 @@
    /// </summary>
    public string? CarIp { get; set; }
    /// <summary>
    /// 是否完成分段任务 用于小车到达成品入库口  0/""/null 未完成  1完成
    /// </summary>
    public string? IsComple { get; set; }
    
}
Admin.NET/WCS.Application/Enum/FourWayCarEnum.cs
@@ -76,12 +76,53 @@
    /// 极限电量 低于此电量不执行任务
    /// </summary>
    [Description("极限电量")]
    Dl = 30,
    Dl = 10,
    /// <summary>
    /// 健康电量 低于此电量 且无任务时去充电
    /// </summary>
    [Description("健康电量")]
    Dl2 = 80,
    Dl2 = 15,
    
}
public class carConverModel
{
    public Dictionary<string, string> conveyorNan = new Dictionary<string, string>();
    public Dictionary<string, string> conveyorBei = new Dictionary<string, string>();
    public Dictionary<string, string> conveyorRuKu = new Dictionary<string, string>();
    public carConverModel(){
        conveyorNan = new Dictionary<string, string>()
        {
            {"190601","13"},
            {"190602","15"},
            {"191201","14"},
            {"191202","16"}
        };
        conveyorBei = new Dictionary<string, string>()
        {
            {"030401","2"},
            {"030402","6"},
            {"030601","3"},
            {"030602","7"},
            {"031201","5"},
            {"031202","8"},
        };
        conveyorRuKu = new Dictionary<string, string>()
        {
            {"190601","9"},
            {"190602","9"},
            {"191201","9"},
            {"191202","9"},
            {"030401","17"},
            {"030402","17"},
            {"030601","18"},
            {"030602","18"},
            {"031201","18"},
            {"031202","18"},
        };
    }
}
Admin.NET/WCS.Application/Hub/HubUtil.cs
@@ -83,11 +83,11 @@
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    public static async Task PublicPlcDevice(WcsDeviceOutput context)
    {
        if (PLCTaskAction.boRefresh)
            await _plcDeviceHubContext.Clients.All.PublicPlcDevice(context);
    }
    //public static async Task PublicPlcDevice(WcsDeviceOutput context)
    //{
    //    if (PLCTaskAction.boRefresh)
    //        await _plcDeviceHubContext.Clients.All.PublicPlcDevice(context);
    //}
    /// <summary>
    /// 下发分拣任务信息
Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs
@@ -38,7 +38,7 @@
            //开启读取服务线程
            boRunningState = true;
            cts = new CancellationTokenSource();//取消线程标识
            StartRead();
            //StartRead();
        }
        await base.OnConnectedAsync();
    }
@@ -225,7 +225,7 @@
                                     modDevice.PickStorey != initialState.PickStorey)))
                            {
                                // 通知用户变更
                                HubUtil.PublicPlcDevice(modDevice);
                                //HubUtil.PublicPlcDevice(modDevice);
                            }
                        }
                        initialStates[modDevice.Id] = modDevice.Adapt<WcsDeviceOutput>();
Admin.NET/WCS.Application/Model/AGVModel.cs
@@ -6,6 +6,144 @@
namespace WCS.Application
{
    #region JC34
    /// <summary>
    /// agv任务下发model
    /// </summary>
    public class AgvTaskSend
    {
        /// <summary>
        /// 外部任务唯一编号,如果为空,系统生成任务号并返回。
        /// </summary>
        public string robotTaskCode { get; set; }
        /// <summary>
        /// 任务类型
        /// </summary>
        public string taskType { get; set; }
        /// <summary>
        /// 执行步骤集合。本次任务机器人需要执行的关键路径,如货架起点 A 至出库工作台 B
        /// </summary>
        public List<targetRoute> targetRoute { get; set; }
        /// <summary>
        /// 任务执行的初始优先顺序,数值越大,优先级越高。但机器人调度系统会根据任务繁忙程度,机器人的工作状态,以及其他优先级修正条件,进行综合判定后,实时动态调整任务实际的优先级数值。范围:1~120
        /// </summary>
        public int? initPriority { get; set; }
        /// <summary>
        /// 自定义扩展字段,可随业务的差异而传入不同的扩展内容,在业务流程的执行中使用
        /// </summary>
        public extra extra { get; set; }
    }
    /// <summary>
    /// 执行步骤集合。本次任务机器人需要执行的关键路径,如货架起点 A 至出库工作台 B
    /// </summary>
    public class targetRoute
    {
        /// <summary>
        /// 目标路径序列。从 0 开始。
        /// </summary>
        public int seq { get; set; }
        /// <summary>
        /// 目标类型。可扩展枚举值。
        /// 预制枚举值:
        /// ZONE目标所处区域编号
        /// SITE站点别名
        /// STORAGE仓位别名
        /// MAT_LABEL物料标签
        /// CARRIER载具编号
        /// STACK巷道编号
        /// STACK_LABEL巷道特征值
        /// CHANNEL通道编号
        /// EQPT 外部设备
        /// PTL_WALL
        /// CTU 缓存架
        /// CARRIER_TYPE载具类型
        /// BIN_TYPE仓位类型
        /// AREA_STATION区域工作台
        /// PILE_COUNT一次搬几个
        /// MIX_CONDITION条件组合
        /// DEGREE 热度
        /// MULTI_BIN_GROUP多深位组号
        /// </summary>
        public string type { get; set; }
        /// <summary>
        /// 机器人到达目标位置后的操作。国标要求,
        /// 非必要。对 AMR 动作无影响。可扩展的枚举值。
        /// 预制枚举值:
        /// COLLECT取货
        /// DELIVERY送货
        /// ROTATE旋转
        /// </summary>
        public string code { get; set; }
    }
    public class extra
    {
        /// <summary>
        /// 载具的信息,包含载具编号、层号。
        /// 使用场景:
        /// 1.装卸机或输送线专用
        /// 2.载具与站点没有绑定,但需要传入载具的场景。
        /// </summary>
        public List<carrierInfo> carrierInfo { get; set; }
    }
    public class carrierInfo
    {
        /// <summary>
        /// 载具类型
        /// </summary>
        public string carrierType { get; set; }
        /// <summary>
        /// 载具编号
        /// </summary>
        public string carrierCode { get; set; }
        /// <summary>
        /// 层号: 从 0 开始、从下往上编号
        /// </summary>
        public int layer { get; set; }
    }
    /// <summary>
    /// 返回实体
    /// </summary>
    public class ResponseAgvDto
    {
        /// <summary>
        /// true 成功  false 失败
        /// </summary>
        public bool success { get; set; }
        /// <summary>
        /// 返回码
        /// SUCCESS:成功
        /// FAIL:失败
        /// 是否必填:是
        /// </summary>
        public string code { get; set; }
        /// <summary>
        /// 返回消息
        /// 是否必填:是
        /// </summary>
        public string message { get; set; }
        /// <summary>
        /// 返回的数据结构
        /// 是否必填:否
        /// </summary>
        public data data { get; set; }
    }
    public class data
    {
        public string robotTaskCode { get; set; }
    }
    #endregion
    public class AGVApplyLockInput
    {
        /// <summary>
Admin.NET/WCS.Application/OpenApi/OpenApi.cs
@@ -34,24 +34,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("091501", "091601","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)
        //{
        //    //路径节点
@@ -425,35 +430,6 @@
                {
                    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();
@@ -477,14 +453,14 @@
                                var inputs = new TaskRequestWMS();
                                inputs.TaskNo = modTask.TaskNo;
                                inputs.PalletNo = modTask.PalletNo;
                                inputs.TaskType = "2";
                                inputs.TaskType = modTask.TaskType.ToString();
                                inputs.TaskStatus = "2";
                                var modResponseTask = httpService.RequestTask(inputs).Result;
                            }
                            
                        }
                        break;
                    case "outbin"://走出储位
                    case "admin"://走出储位
                        {
                            //反馈WMS任务取货完成、WMS判断是平库储位就更新储位状态
                            if (modTask.Origin == "WMS")
@@ -500,67 +476,31 @@
                        }
                        break;
                    case "apply"://放货申请
                    case "continue"://放货申请
                        {
                            //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 != "B010101")//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()
                                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 = modPos.PlcPos,
                                    Status = TaskStatusEnum.Doing,
                                    InteractiveMsg = $"向{modDevice.Text}写入关闭光幕1,结果{res.IsSucceed}",
                                //PlcId = modDevice.PlcId,
                                PlcName = "AGV",
                                StartLocat = modTask.StartLocate,
                                EndLocat = modTask.EndLocate,
                                Status = TaskStatusEnum.Complete,
                                InteractiveMsg = $"AGV小车反馈任务到达9工位",
                                };
                                _db.Insertable(modTaskMonitor).ExecuteCommand();
                            await _db.Insertable(modTaskMonitor).ExecuteCommandAsync();
                            HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                                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();
                            }
                        }
                        break;
                    case "start"://任务开始
                        {
                            //开始向拆托机放入托盘任务
                            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, "1");
                                modConn.Close();
                            }
                            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"://任务取消
@@ -612,7 +552,6 @@
        return result;
    }
    /// <summary>
    /// 获取原材料仓状态
@@ -673,35 +612,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>
Admin.NET/WCS.Application/PLC/PLCCommon.cs
@@ -454,7 +454,7 @@
    {
        string stationNum = "";
        string[] lists = endRoadway.Split("R");
        string[] lists = endRoadway.Split("MR");
        var model = _db.Queryable<WcsStorageLocat>().First(m => m.RoadwayNo == endRoadway && m.IsDelete == false);
        string stat = model.AisleOne;
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -1,8 +1,11 @@
using Admin.NET.Core.Service;
using AngleSharp.Io;
using COSXML.Network;
using DocumentFormat.OpenXml.Bibliography;
using DocumentFormat.OpenXml.Drawing;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml.Wordprocessing;
using Elastic.Clients.Elasticsearch.Snapshot;
using Furion.Logging;
using IoTClient;
using NewLife.Reflection;
@@ -25,6 +28,7 @@
        try
        {
            var mod = sender as WcsDeviceDto;
            //Console.WriteLine($"{mod.Text}值为" + mod.Value);
            switch (mod.Type)
            {
@@ -70,7 +74,7 @@
                    TaskNo = _taskService.GetTaskCode(),
                    TaskType = TaskTypeEnum.Move,
                    Type = PLCTypeEnum.AGV,
                    StartLocate = AGVStorageUtil.GetPalletOutStorage(),
                    StartLocate = "",
                    EndLocate = AGVStaionEnum.D1.ToString(),
                    PalletNo = "",
                    Status = TaskStatusEnum.Wait,
@@ -190,6 +194,7 @@
                                {
                                    TaskNo = carTask.TaskNo,
                                    PlcName = modDevice.Text,
                                    Status = TaskStatusEnum.Complete,
                                    InteractiveMsg = $"穿梭车反馈任务完成"
                                };
                                _db.Insertable(taskMonitor).ExecuteCommand();
@@ -202,9 +207,71 @@
                            //总任务下没有其他未执行小车的任务 变更总任务信息
                            if (carTaskNext == null && modFinshTask != null && modFinshTask.Status != TaskStatusEnum.Complete)
                            {
                                if (modFinshTask.TaskType == TaskTypeEnum.Out)
                                {
                                    //#region 任务变更成输送线任务
                                    //modFinshTask.Status = TaskStatusEnum.Wait;
                                    //modFinshTask.Type = PLCTypeEnum.ConveyorLine;
                                    //_db.Updateable(modFinshTask).ExecuteCommand();
                                    //#endregion
                                    #region 输送线 写入PLC 740
                                    var text = "";
                                    var devStation = ""; //工位
                                    var endLocate = modFinshTask.EndRoadway;
                                    var carcon = new carConverModel();
                                    if ( carcon.conveyorBei.Keys.Contains(endLocate))
                                    {
                                        text = "输送线北";
                                        devStation = carcon.conveyorBei[endLocate];
                                    }
                                    else if (carcon.conveyorNan.Keys.Contains(endLocate))
                                    {
                                        text = "输送线南";
                                        devStation = carcon.conveyorNan[endLocate];
                                    }
                                    if (text != "")
                                    {
                                        var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == text);
                                        var modConn = new PLCUtil(modPlc);
                                        var modDeviceConver = PLCTaskAction.plcDevices.First(s => s.StationNum == devStation);
                                        var (plcResult, palletVal) = modConn.GetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.PlcPos);
                                        if (!plcResult.IsSucceed || Convert.ToInt32(palletVal) != 730)
                                        {
                                            modConn.Close();
                                            return;//放货工位没有读取成功或不是空闲
                                        }
                                        var plcResult2 = modConn.SetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.WcsPos, "740");
                                        if (!plcResult.IsSucceed)
                                        {
                                            modConn.Close();
                                            return;
                                        }
                                        //添加任务明细
                                        var taskMonitor = new WcsTaskMonitor()
                                        {
                                            TaskNo = modFinshTask.TaskNo,
                                            PlcName = modDevice.Text,
                                            Status = TaskStatusEnum.Complete,
                                            InteractiveMsg = $"写入指令740:托盘到达{modFinshTask.EndRoadway}"
                                        };
                                        _db.Insertable(taskMonitor).ExecuteCommand();
                                        modConn.Close();
                                    }
                                    #endregion
                                }
                                else
                                {
                                modFinshTask.Status = TaskStatusEnum.Complete;
                                modFinshTask.FinishDate = DateTime.Now;
                                _db.Updateable(modFinshTask).ExecuteCommand();
                                }
                            
                                //判断任务是否充电任务,下发开始充电命令
                                if (modFinshTask.Levels == 888)
@@ -281,6 +348,9 @@
                            var getCdTask = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Levels == 888 && m.EndLocate == endLocateCar && m.Type == PLCTypeEnum.ShuttleCar && m.Status <= TaskStatusEnum.Doing);
                            if (getCdTask == null)
                            {
                                var (resultDlLock, valueDlLock) = plcConn.GetDBValue(modDevice.PosType, modDevice.PlcPos);
                                if (resultDlLock.IsSucceed && valueDlLock!=3)
                                {
                                //添加小车充电位置
                                WcsTask modCarTask = new WcsTask()
                                {
@@ -297,6 +367,7 @@
                                };
                                _db.Insertable(modCarTask).ExecuteCommand();
                                HubUtil.PublicTask(modCarTask.Adapt<WcsTaskOutput>());
                                }
                            }
                            
                        }
@@ -344,6 +415,9 @@
                                        var getCdTask = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Levels == 888 && m.EndLocate == endLocateCar && m.Type == PLCTypeEnum.ShuttleCar && m.Status <= TaskStatusEnum.Doing);
                                        if (getCdTask == null)
                                        {
                                            var (resultDlLock, valueDlLock) = plcConn.GetDBValue(modDevice.PosType, modDevice.PlcPos);
                                            if (resultDlLock.IsSucceed && valueDlLock != 3)
                                            {
                                            //添加小车充电位置
                                            WcsTask modCarTask = new WcsTask()
                                            {
@@ -360,6 +434,8 @@
                                            };
                                            _db.Insertable(modCarTask).ExecuteCommand();
                                            HubUtil.PublicTask(modCarTask.Adapt<WcsTaskOutput>());
                                            }
                                        }
                                       
                                    }
@@ -472,6 +548,77 @@
                            carTaskNext.Status = TaskStatusEnum.Doing;
                            carTaskNext.CarTaskNo = carTaskNo;
                            _db.Updateable(carTaskNext).ExecuteCommand();
                            if (modTask.TaskType == TaskTypeEnum.Out)
                            {
                                #region 输送线 写入PLC 730
                                var text = "";
                                var devStation = "";
                                var endLocate = modTask.EndRoadway;
                                var carcon = new carConverModel();
                                if (carcon.conveyorBei.Keys.Contains(endLocate))
                                {
                                    text = "输送线北";
                                    devStation = carcon.conveyorBei[endLocate];
                                }
                                else if (carcon.conveyorNan.Keys.Contains(endLocate))
                                {
                                    text = "输送线南";
                                    devStation = carcon.conveyorNan[endLocate];
                                }
                                if (text != "")
                                {
                                    var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == text);
                                    var modConn = new PLCUtil(modPlc);
                                    var modDeviceConver = PLCTaskAction.plcDevices.First(s => s.StationNum == devStation);
                                    var (plcResult, palletVal) = modConn.GetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.PlcPos);
                                    if (!plcResult.IsSucceed || Convert.ToInt32(palletVal) != 720)
                                    {
                                        modConn.Close();
                                        return;//放货工位没有读取成功或不是空闲
                                    }
                                    var listResultcon = new List<Result>();
                                    //任务号与托盘条码
                                    var modPosConverTask = PLCTaskAction.plcPositions.First(s => s.DeviceId == modDeviceConver.Id && s.Text == "任务号");
                                    listResultcon.Add(modConn.SetPlcDBValue(modPosConverTask.PosType, modDeviceConver.DbNumber, modPosConverTask.PlcPos, modTask.TaskId.ToString()));
                                    var modPosConverPallet = PLCTaskAction.plcPositions.First(s => s.DeviceId == modDeviceConver.Id && s.Text == "托盘条码");
                                    listResultcon.Add(modConn.SetPlcDBValue(modPosConverPallet.PosType, modDeviceConver.DbNumber, modPosConverPallet.PlcPos, modTask.PalletNo.ToString()));
                                    // 起始工位、目的工位
                                    var modPosConverStrLocat = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDeviceConver.Id && s.Text == "起始工位");
                                    listResultcon.Add(modConn.SetPlcDBValue(modPosConverStrLocat.PosType, modDeviceConver.DbNumber, modPosConverStrLocat.PlcPos, modDeviceConver.StationNum));
                                    var modPosConverEndLocat = PLCTaskAction.plcPositions.FirstOrDefault(s => s.DeviceId == modDeviceConver.Id && s.Text == "目的工位");
                                    listResultcon.Add(modConn.SetPlcDBValue(modPosConverEndLocat.PosType, modDeviceConver.DbNumber, modPosConverEndLocat.PlcPos, modTask.EndLocate));
                                    if (listResultcon.All(s => s.IsSucceed))
                                    {
                                        var plcResult2 = modConn.SetPlcDBValue(modDeviceConver.PosType, modDeviceConver.DbNumber, modDeviceConver.WcsPos, "730");
                                        if (!plcResult.IsSucceed)
                                        {
                                            modConn.Close();
                                            return;
                                        }
                                        //添加任务明细
                                        var taskMonitor2 = new WcsTaskMonitor()
                                        {
                                            TaskNo = carTaskNext.TaskNo,
                                            PlcName = modDevice.Text,
                                            Status = TaskStatusEnum.Complete,
                                            InteractiveMsg = $"写入指令730:工位是{modDeviceConver.StationNum}"
                                        };
                                        _db.Insertable(taskMonitor2).ExecuteCommand();
                                    }
                                    modConn.Close();
                                }
                                #endregion
                            }
                            //清除小车空闲时间
                            var carTimeClear = _db.Queryable<WcsCarTime>().First(m=>m.IsDelete == false && m.CarIp == modDevice.PlcIdIP);
                            if (carTimeClear!= null)
@@ -484,6 +631,7 @@
                            {
                                TaskNo = carTaskNext.TaskNo,
                                PlcName = modDevice.Text,
                                Status = TaskStatusEnum.Complete,
                                InteractiveMsg = $"向穿梭车下发任务{carTaskNext.TaskNo}"
                            };
                            _db.Insertable(taskMonitor).ExecuteCommand();
@@ -558,14 +706,38 @@
        var ledText = "";
        switch (modDevice.Value.ToString())
        {
            case "120": //空闲,AGV可放货
                {
                    var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.Status == TaskStatusEnum.Doing && m.IsComple == "1");
                    if (task != null)
                    {
                        //没有出库业务
                        var res = new HttpService().GenAgvContinueTask(task.TaskNo).Result;
                        if (res.code == "0")
                        {
                            var modTaskMonitor = new WcsTaskMonitor()
                            {
                                TaskNo = task.TaskNo,
                                PlcId = modDevice.modPlc.Id,
                                PlcName = modDevice.modPlc.IP,
                                InteractiveMsg = "向AGV小车下发继续执行任务"
                            };
                            _db.Insertable(modTaskMonitor).ExecuteCommand();
                            //下发任务日志
                            HubUtil.PublicTask(task.Adapt<WcsTaskOutput>());
                            HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
                    }
                }
                break;
            case "320":
                {
                    // 申请密集库组
                    string strMsg = "";
                    string taskModel = "";
                    // 获取工位托盘码信息
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码");
                    var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    if (!res.IsSucceed)
                    {
@@ -618,7 +790,7 @@
                    var http = new HttpService();
                    string TaskNo = "", EndLocate = "";
                    strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, taskModel, "1", ref EndLocate, ref TaskNo);
                    strMsg = http.RequestRoadWay(palletVal, modDevice.StationNum, ref EndLocate, ref TaskNo);
                    if (!strMsg.Contains("-1"))
                    {
                        // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
@@ -693,7 +865,7 @@
            case "330":
                {
                    // 获取工位托盘码信息
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码");
                    var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    if (!res.IsSucceed)
                    {
@@ -719,7 +891,7 @@
                    }
                    // 获取四项车取货工位
                    string endLocatVlue = PLCCommon.RoadwayToStationNum(modTask.EndRoadway, modDevice.StationNum);
                    string endLocatVlue = PLCCommon.RoadwayToStationNum(modTask.EndRoadway, modDevice.StationNum.PadLeft(3,'0'));
@@ -731,7 +903,7 @@
                    var modPosTaskType = modDevice.listStation.FirstOrDefault(s => s.Text == "任务类型");
                    var taskTypeStr = (int)modTask.TaskType;
                    listResult.Add(plcConn.SetPlcDBValue(modPosTaskType.PosType, modDevice.DbNumber, modPosTaskType.PlcPos, taskTypeStr.ToString()));
                    var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘码");
                    var modPosPalletNo = modDevice.listStation.FirstOrDefault(s => s.Text == "托盘条码");
                    listResult.Add(plcConn.SetPlcDBValue(modPosPalletNo.PosType, modDevice.DbNumber, modPosPalletNo.PlcPos, modTask.PalletNo));
                    // 起始工位、目的工位
                    var modPosStrLocat = modDevice.listStation.FirstOrDefault(s => s.Text == "起始工位");
@@ -782,25 +954,25 @@
                {
                    // 申请储位 更新入库任务(储位地址) 630
                    var strMsg = "";
                    var taskModel = "";
                    //// 根据工位号获取巷道号
                    //var roadway = PLCCommon.GetRoadwayByStation(modDevice.StationNum);
                    //if (roadway == "")
                    //{
                    //    break;
                    //}
                    // 获取工位任务号信息
                    var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号");
                    var (resTask, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos);
                    if (!resTask.IsSucceed)
                    {
                        break;
                    }
                    // 获取工位托盘码信息
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码");
                    var (res, palletVal) = plcConn.GetPlcDBValue(PLCDataTypeEnum.String, modDevice.DbNumber, modPosPallet.PlcPos);
                    if (!res.IsSucceed)
                    {
                        break;
                    }
                    var http = new HttpService();
                    string TaskNo = "";
                    // 向WMS申请储位信息
                    strMsg = http.RequestLocate(palletVal, modDevice.StationNum, taskModel, "roadway", ref TaskNo);
                    strMsg = new HttpService().RequestLocate(palletVal, taskVal,ref TaskNo);
                    if (!strMsg.Contains("-1"))
                    {
@@ -1007,20 +1179,28 @@
                    {
                        var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号");
                        var (res, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos);
                        var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                        var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码");
                        var (res2, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos);
                        var modPosStarStationNum = modDevice.listStation.FirstOrDefault(m => m.Text == "起始工位");
                        var (res3, starVal) = plcConn.GetPlcDBValue(modPosStarStationNum.PosType, modDevice.DbNumber, modPosStarStationNum.PlcPos);
                        int taskNoVal = Convert.ToInt32(taskVal);
                        var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskId == taskNoVal);
                        if (taskInfo == null)
                        {
                            Log.Error(string.Format("输送线430:未找到对应的任务。"));
                            break;
                        }
                        // 插入任务明细 
                        var modInsertTaskMonitor = new WcsTaskMonitor()
                        {
                            TaskNo = taskVal,
                            TaskNo = taskInfo.TaskNo,
                            PlcId = modDevice.Id,
                            PlcName = modDevice.Text,
                            InteractiveMsg = $"写入指令430:托盘到达{modDevice.StationNum}工位",
                            PalletNo = palletVal,
                            Status = TaskStatusEnum.Complete,
                            StartLocat = starVal,
                            StartLocat = Convert.ToString(starVal),
                            EndLocat = modDevice.StationNum,
                        };
@@ -1030,8 +1210,6 @@
                        // 通知任务界面任务已存在更新 请更新界面
                        HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                        var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == modInsertTaskMonitor.TaskNo);
                        modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.EndLocate).Select(s => s.LedIP).First();
                        // led显示内容
@@ -1057,19 +1235,22 @@
            case "440":
                {
                    #region 拣选完成,托盘离开工位
                    // 写入450
                    var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "450");
                    if (ret.IsSucceed)
                    {
                        var modPosTask = modDevice.listStation.FirstOrDefault(m => m.Text == "任务号");
                        var (res, taskVal) = plcConn.GetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos);
                        var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘码");
                    var modPosPallet = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码");
                        var (res2, palletVal) = plcConn.GetPlcDBValue(modPosPallet.PosType, modDevice.DbNumber, modPosPallet.PlcPos);
                        var modPosStarStationNum = modDevice.listStation.FirstOrDefault(m => m.Text == "起始工位");
                        var (res3, starVal) = plcConn.GetPlcDBValue(modPosStarStationNum.PosType, modDevice.DbNumber, modPosStarStationNum.PlcPos);
                        string tasknoVal = taskVal.ToString();
                        var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.TaskNo == tasknoVal && m.IsDelete == false);
                    // 写入450
                    var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "450");
                    if (ret.IsSucceed)
                    {
                        int tasknoVal = Convert.ToInt32(taskVal);
                        var modTask = _db.Queryable<WcsTask>().First(m => m.Status == TaskStatusEnum.Doing && m.IsDelete == false && m.TaskId == tasknoVal);
                        if (modTask == null)
                        {
                            Log.Error(string.Format("输送线440:未找到对应的任务。"));
@@ -1078,7 +1259,7 @@
                        // 改变任务状态
                        modTask.Status = TaskStatusEnum.Complete;
                        modTask.FinishDate = DateTime.Now;
                        modTask.Levels = 999;
                        //modTask.Levels = 999;
                        _db.Updateable(modTask).ExecuteCommand();
                        HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                        // 插入任务明细 
@@ -1095,24 +1276,24 @@
                        };
                        if (modTask.Origin == "WMS")
                        {
                            // 反馈WMS
                            var requestMode = new TaskRequestWMS()
                            {
                                TaskNo = modTask.TaskNo + modTask.EndLocate,
                                PalletNo = modTask.PalletNo,
                                TaskType = ((int)TaskTypeEnum.Out).ToString(),
                                TaskStatus = ((int)TaskStatusEnum.Complete).ToString()
                            };
                            HttpService httpService = new HttpService();
                            var modResponseTask = httpService.RequestTask(requestMode).Result;
                            if (modResponseTask.StatusCode == 0)
                            {
                                modInsertTaskMonitor.InteractiveMsg += ",返回给WMS任务完成";
                            }
                            else
                            {
                                Log.Error(string.Format("任务反馈失败:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg));
                            }
                            //// 反馈WMS
                            //var requestMode = new TaskRequestWMS()
                            //{
                            //    TaskNo = modTask.TaskNo + modTask.EndLocate,
                            //    PalletNo = modTask.PalletNo,
                            //    TaskType = ((int)TaskTypeEnum.Out).ToString(),
                            //    TaskStatus = ((int)TaskStatusEnum.Complete).ToString()
                            //};
                            //HttpService httpService = new HttpService();
                            //var modResponseTask = httpService.RequestTask(requestMode).Result;
                            //if (modResponseTask.StatusCode == 0)
                            //{
                            //    modInsertTaskMonitor.InteractiveMsg += ",返回给WMS任务完成";
                            //}
                            //else
                            //{
                            //    Log.Error(string.Format("任务反馈失败:StatusCode:{0};Msg:{1}", modResponseTask.StatusCode, modResponseTask.Msg));
                            //}
                        }
                        // 插入交互日志
@@ -1146,37 +1327,57 @@
    private static void AGV(WcsDeviceDto modDevice)
    {
        
        //这里找出来AGV待执行的任务、按照优先级下发一个任务给AGV
        var listTask = _db.Queryable<WcsTask>().Where(s => (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing) && s.Type == PLCTypeEnum.AGV).OrderBy(s => s.Levels).ToList();
        if (listTask.Count == 0)
        //这里找出来AGV待执行的任务、按照优先级、创建时间下发一个任务给AGV
        var modTask = _db.Queryable<WcsTask>().Where(s => s.Status == TaskStatusEnum.Wait && s.Type == PLCTypeEnum.AGV).OrderBy(s => new { s.Levels ,s.CreateTime}).First();
        if (modTask == null)
        {
            return;
        }
        
        foreach (var modTask in listTask)
        {
            if (_db.Queryable<WcsTask>().Any(s => s.EndLocate == modTask.EndLocate && s.IsDelete == false && s.Status == TaskStatusEnum.Doing && s.Type == PLCTypeEnum.AGV ))
            {
                continue; // 有目的位置一致且正在执行的任务
            return; // 有目的位置一致且正在执行的任务
            }
            
            //下发AGV任务
            AgvTaskInput input = new AgvTaskInput()
        var taskTypeModel = AGVStorageUtil.GetTaskModle(modTask.StartLocate, modTask.EndLocate,out string type1,out string type2, out string jiebo);
        if (string.IsNullOrWhiteSpace(taskTypeModel))
            {
                ReqCode = modTask.Id.ToString(),
                TaskCode = modTask.TaskNo,
                CtnrCode = modTask.PalletNo,
                PositionCodePath = new List<PositionCodePathItem>()
            Console.WriteLine("获取AGV任务模板失败:请核实任务起始目标储位是否正确");
            return;
        }
        AgvTaskSend taskModel = new AgvTaskSend();
        taskModel.robotTaskCode = modTask.TaskNo;
        taskModel.taskType = taskTypeModel;
        if (jiebo == "")
            {
                new PositionCodePathItem(){ PositionCode = modTask.StartLocate },
                new PositionCodePathItem(){ PositionCode = modTask.EndLocate }
            taskModel.targetRoute = new List<targetRoute>()
            {
                new targetRoute(){seq = 0,type = type1,code = modTask.StartLocate},
                new targetRoute(){seq = 1,type = type2,code = modTask.EndLocate}
            };
        }
        else
        {
            taskModel.targetRoute = new List<targetRoute>()
            {
                new targetRoute(){seq = 0,type = type1,code = modTask.StartLocate},
                new targetRoute(){seq = 1,type = "ZONE",code = jiebo},
                new targetRoute(){seq = 2,type = type2,code = modTask.EndLocate}
            };
        }
        taskModel.extra = new extra()
        {
            carrierInfo = new List<carrierInfo>()
            {
                new carrierInfo(){ carrierType = "TP",carrierCode = modTask.PalletNo}
            }
            };
            input.TaskTyp = "1" + modTask.StartLocate.Substring(0, 1) + modTask.EndLocate.Substring(0, 1);
            var response = new HttpService().GenAgvSchedulingTask(input).Result;
        var response = new HttpService().GenAgvSendTask(taskModel).Result;
            if (response.code == "0")
            {
                AGVStatus = true;
                modTask.Status = TaskStatusEnum.Doing;
                _db.Updateable(modTask).ExecuteCommand();
                var modTaskMonitor = new WcsTaskMonitor()
@@ -1192,10 +1393,10 @@
                HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
            }
            Console.WriteLine(response.ToJson());
            return;
        }
        //Console.WriteLine(response.ToJson());
        Thread.Sleep(3000);
        return;
    }
    /// <summary>
@@ -1240,6 +1441,11 @@
    private static void Test(WcsDeviceDto modDevice)
    {
        var ledText = $"申请入库失败\n\n";
        ledText += $"托盘号:T2300001\n";
        ledText += $"入库任务已锁定,请解锁后重试!\n";
        LedDisplay("10.26.254.31", ledText);
        //卷帘门2申请打开
        //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1152", "10");
        //卷帘门2申请关闭
@@ -1251,7 +1457,7 @@
        //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1154", "30");
        //C口AGV放托盘完成申请入库
        var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1156", "100");
        //var result = modDevice.PLCUtil.SetPlcDBValue(PLCDataTypeEnum.Short, "DB1000", "1156", "100");
        ////写死测试读string
        //var (res, val) = modDevice.PLCUtil.GetPlcDBValue(PLCDataTypeEnum.String, "DB100", "64");
Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
@@ -53,6 +53,7 @@
    private static List<ModbusUtil> listModbusUtil = new List<ModbusUtil>();
    public static List<ModbusUtil> modbusUtilConn
    {
        get { return listModbusUtil; }
@@ -87,6 +88,7 @@
        boDrumReversal = _sysConfigService.GetConfigValue<bool>("sys_DrumReversal").Result;
        boOutLock = _sysConfigService.GetConfigValue<bool>("sys_BoOutLock").Result;
        boEnterLock = _sysConfigService.GetConfigValue<bool>("sys_BoEnterLock").Result;
    }
    /// <summary>
    /// 初始化PLC连接
@@ -210,15 +212,6 @@
                                        var (result, value) = modPlcUtil.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos);
                                        if (result.IsSucceed)
                                        {
                                            ////如果是穿梭车,这里发送心跳
                                            //if (modPlc.Type == PLCTypeEnum.ShuttleCar)
                                            //{
                                            //    var modHeart = listPlcPosition.Where(s => s.DeviceId == modDevice.Id && s.Text == "心跳").FirstOrDefault();
                                            //    if (modHeart != null)
                                            //    {
                                            //        modPlcUtil.SetPlcDBValue(modHeart.PosType, modHeart.PlcPos, "1");
                                            //    }
                                            //}
                                            //无流程跳出
                                            if (Convert.ToInt32(value) == 0)
                                                continue;
@@ -377,16 +370,89 @@
                }
                try
                {
                    // 获取密集库未执行任务 根据创建时间排序
                    var waitTask = _db.Queryable<WcsTask>().Where(s => s.IsDelete == false && s.Status == TaskStatusEnum.Wait && s.Type == PLCTypeEnum.ShuttleCar && string.IsNullOrWhiteSpace(s.StartLocate) && string.IsNullOrWhiteSpace(s.EndLocate)).OrderBy(s => new {s.Levels, s.CreateTime}).First();
                    var waitTask = _db.Queryable<WcsTask>().Where(s => s.IsDelete == false && s.Status == TaskStatusEnum.Wait && s.Type == PLCTypeEnum.ShuttleCar).OrderBy(s => new {s.Levels, s.CreateTime}).First();
                    if (waitTask == null)
                    {
                        continue;
                    }
                    var starLocate = "";
                    var endLocate = "";
                    var taskceng = 0;
                    //01010101: 01排 01列 01层 01深度-此项目不做判断
                    var taskpai = int.Parse(waitTask.StartLocate.Substring(0, 2));
                    var tasklie = int.Parse(waitTask.StartLocate.Substring(2, 2));
                    var taskceng = int.Parse(waitTask.StartLocate.Substring(4, 2));
                    if (waitTask.TaskType == TaskTypeEnum.In )
                    {
                        //入库任务起始巷道就是起始工位
                        if (string.IsNullOrWhiteSpace(waitTask.StartRoadway) || string.IsNullOrWhiteSpace(waitTask.EndLocate))
                        {
                            continue;
                        }
                        taskceng = int.Parse(waitTask.StartRoadway.Substring(4, 2));
                        starLocate = waitTask.StartRoadway;
                        endLocate = waitTask.EndLocate;
                    }
                    else if (waitTask.TaskType == TaskTypeEnum.Out)
                    {
                        taskceng = int.Parse(waitTask.StartLocate.Substring(4, 2));
                        starLocate = waitTask.StartLocate;
                        endLocate = waitTask.EndRoadway;
                        #region 添加输送线与任务验证
                        var text = "";
                        var devStation = "";
                        var carcon = new carConverModel();
                        if (carcon.conveyorBei.Keys.Contains(endLocate))
                        {
                            text = "输送线北";
                            devStation = carcon.conveyorBei[endLocate];
                        }
                        else if (carcon.conveyorNan.Keys.Contains(endLocate))
                        {
                            text = "输送线南";
                            devStation = carcon.conveyorNan[endLocate];
                        }
                        if (text != "")
                        {
                            var modPlc = PLCTaskAction.plcs.FirstOrDefault(s => s.Text == text);
                            var modConn = new PLCUtil(modPlc);
                            var modDevice = PLCTaskAction.plcDevices.First(s => s.StationNum == devStation);
                            var (plcResult, palletVal) = modConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos);
                            if (!plcResult.IsSucceed || Convert.ToInt32(palletVal) != 720)
                            {
                                continue;//放货工位没有读取成功或不是空闲
                            }
                            modConn.Close();
                            var gongwei = carcon.conveyorRuKu[endLocate];
                            //判断任务
                            var convarTask = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.StartLocate == gongwei && m.Type == PLCTypeEnum.ConveyorLine);
                            if (convarTask != null)
                            {
                                continue;//放货工位有任务
                            }
                        }
                        #endregion
                    }
                    else if (waitTask.TaskType == TaskTypeEnum.Move)
                    {
                        taskceng = int.Parse(waitTask.StartLocate.Substring(4, 2));
                        starLocate = waitTask.StartLocate;
                        endLocate = waitTask.EndLocate;
                    }
                    else
                    {
                        continue;
                    }
                    
                    #region 获取当前任务所在层所有空闲小车
@@ -444,7 +510,7 @@
                                        {
                                            var carVal = ((int)valuex).ToString().PadLeft(2, '0') + ((int)valuey).ToString().PadLeft(2, '0') + ((int)valuez).ToString().PadLeft(2, '0');
                                            //小车到取货储位路径  
                                            var d = FourWayCarUtil.GetCarPath(carVal, waitTask.StartLocate);
                                            var d = FourWayCarUtil.GetCarPath(carVal, starLocate);
                                            kXCarList.Add(new CarInfo()
                                            {
                                                CarPlcIp = modbusUtil.PlcIP,
@@ -487,7 +553,7 @@
                        //判断小车位置是否与任务的起始储位相同,不相同:获取小车到取货储位路径
                        var carLocate = assignCar.X.ToString().PadLeft(2, '0')+assignCar.Y.ToString().PadLeft(2, '0')+ assignCar.Z.ToString().PadLeft(2, '0');
                        //获取小车去取货储位任务路径
                        var data1 = FourWayCarUtil.GetCarPath(carLocate, waitTask.StartLocate);
                        var data1 = FourWayCarUtil.GetCarPath(carLocate, starLocate);
                        var datas1 = FourWayCarUtil.GetCarPathUp(data1, 0);
                        if (datas1 == null)
                        {
@@ -512,7 +578,7 @@
                        typeStr2 = 0;
                    }
                    //获取小车去放货储位任务路径
                    var data2 = FourWayCarUtil.GetCarPath(waitTask.StartLocate, waitTask.EndLocate, typeStr);
                    var data2 = FourWayCarUtil.GetCarPath(starLocate, endLocate, typeStr);
                    var datas2 = FourWayCarUtil.GetCarPathUp(data2, typeStr2);
                    
                    if (datas2 == null) 
Admin.NET/WCS.Application/Service/WcsTask/WcsTaskService.cs
@@ -238,6 +238,16 @@
                    modTask.IsSuccess = TaskSuccessEnum.Fail;
                    modTask.CancelDate = DateTime.Now;//取消时间
                }
                //如果是四向车任务
                if (modTask.Type == PLCTypeEnum.ShuttleCar)
                {
                    var carTaskList = _db.Queryable<WcsCarTasks>().Where(m => m.Status <= TaskStatusEnum.Doing && m.IsDelete == false).ToList();
                    foreach (var carTask in carTaskList)
                    {
                        carTask.Status = input.Status;
                    }
                    await _wcsTaskRep.Context.Updateable(carTaskList).ExecuteCommandAsync();
                }
                modTask.Status = input.Status;
                modTask.Levels = 999;
                await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Status, s.IsSuccess, s.FinishDate, s.CancelDate, s.UpdateTime, s.UpdateUserId, s.UpdateUserName }).ExecuteCommandAsync();
Admin.NET/WCS.Application/Util/AGVStorageUtil.cs
@@ -15,290 +15,60 @@
    private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
    private static readonly SysCacheService sysCacheService = App.GetRequiredService<SysCacheService>();
    private static readonly SysConfigService _sysConfigService = App.GetRequiredService<SysConfigService>();
    private static List<string[]> listStorage = new List<string[]>();
    private static string[] listPallet = new[] { "cache_Z53", "cache_Z52", "cache_Z51" };
    static AGVStorageUtil()
    {
        listStorage.Add(new[] { "cache_Z11", "cache_Z12", "cache_Z13" });
        listStorage.Add(new[] { "cache_Z21", "cache_Z22", "cache_Z23" });
        listStorage.Add(new[] { "cache_Z31", "cache_Z32", "cache_Z33" });
        listStorage.Add(new[] { "cache_Z41", "cache_Z42", "cache_Z43" });
    }
    /// <summary>
    /// 获取成品数量
    /// </summary>
    /// <returns></returns>
    public static int ProductCount()
    {
        int i = 0;
        foreach (var item in listStorage)
        {
            foreach (var mod in item.Reverse())
            {
                var value = _sysConfigService.GetConfigValue<bool>(mod).Result;
                if (value)
                    i++;
            }
        }
        return i;
    }
    /// <summary>
    /// 获取成品要入的储位
    /// </summary>
    /// <returns></returns>
    public static string GetProductInStorage(string TaskNo = "")
    {
        List<string> listResult = new List<string>();
        foreach (var item in listStorage)
        {
            List<string> listItem = new List<string>();
            foreach (var mod in item.Reverse())
            {
                var value = _sysConfigService.GetConfigValue<bool>(mod).Result;
                if (!value)
                    listItem.Add(mod.Split('_')[1]);
                else
                    break;
            }
            listResult.AddRange(listItem.AsEnumerable().Reverse());
        }
        //检查是否有正在入的任务
        foreach (var result in listResult)
        {
            if (!_db.Queryable<WcsTask>().Where(s => s.Type == PLCTypeEnum.AGV && s.Status <= TaskStatusEnum.Doing && s.EndLocate == result && s.TaskNo != TaskNo).Any())
                return result;
        }
        return "";
        //Log.Error("无可入的储位");
        //throw Oops.Bah("无可入的储位");
    }
    /// <summary>
    /// 获取成品要出的储位
    /// </summary>
    /// <returns></returns>
    public static string GetProductOutStorage()
    {
        foreach (var item in listStorage.AsEnumerable().Reverse())
        {
            foreach (var mod in item.Reverse())
            {
                var value = _sysConfigService.GetConfigValue<bool>(mod).Result;
                if (value)
                    return mod.Split('_')[1];
            }
        }
        return "";
        //Log.Error("无可出的储位");
        //throw Oops.Bah("无可出的储位");
    }
    /// <summary>
    /// 获取托盘要入的储位
    /// </summary>
    /// <returns></returns>
    public static string GetPalletInStorage(string TaskNo = "")
    {
        List<string> listResult = new List<string>();
        foreach (var item in listPallet)
        {
            var value = _sysConfigService.GetConfigValue<bool>(item).Result;
            if (!value)
                listResult.Add(item.Split('_')[1]);
            else
                break;
        }
        //检查是否有正在入的任务
        foreach (var result in listResult.AsEnumerable().Reverse())
        {
            if (!_db.Queryable<WcsTask>().Where(s => s.Type == PLCTypeEnum.AGV && s.Status <= TaskStatusEnum.Doing && s.EndLocate == result && s.TaskNo != TaskNo).Any())
                return result;
        }
        return "";
        //Log.Error("无可入的储位");
        //throw Oops.Bah("无可入的储位");
    }
    /// <summary>
    /// 获取托盘要出的储位
    /// </summary>
    /// <returns></returns>
    public static string GetPalletOutStorage()
    {
        foreach (var item in listPallet)
        {
            var value = _sysConfigService.GetConfigValue<bool>(item).Result;
            if (value)
                return item.Split('_')[1];
        }
        return "";
        //Log.Error("无可出的储位");
        //throw Oops.Bah("无可出的储位");
    }
    #region 属性
    public static string GetTaskModle(string straLocate,string endLocate,out string type1,out string type2,out string jiebo)
    {
        type1 = "";
        type2 = "";
        jiebo = "";
        var locate1 = _db.Queryable<WcsStorageLocat>().First(m => m.IsDelete == false && m.LocatNo == straLocate);
        var locate2 = _db.Queryable<WcsStorageLocat>().First(m => m.IsDelete == false && m.LocatNo == endLocate);
        if (locate1 == null || locate2 == null)
        {
            return "";
        }
        switch (locate1.WareHouseNo)
        {
            case "W02":
                type1 = "SITE";
                break;
            case "W04":
                type1 = "STORAGE";
                break;
            default:
                break;
        }
    public static bool Z11
        switch (locate2.WareHouseNo)
    {
        get
            case "W02":
                type2 = "SITE";
                break;
            case "W04":
                type2 = "STORAGE";
                break;
            default:
                break;
        }
        var Area1002 = new List<string>() { "",""};//1002车间区域
        var Area1003 = new List<string>() { "",""};//1003车间区域
        if (Area1002.Contains(locate2.AreaNo))
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z11").Result;
            jiebo = "1JB";//接驳位
        }
        set
        if (Area1003.Contains(locate2.AreaNo))
        {
            _sysConfigService.UpdateConfigValue("cache_Z11", value);
            jiebo = "2JB";
        }
    }
    public static bool Z12
        if (type1 == "" || type2 == "")
    {
        get
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z12").Result;
            return "";
        }
        set
        {
            _sysConfigService.UpdateConfigValue("cache_Z12", value);
        return "CJ1";
        }
    }
    public static bool Z13
    {
        get
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z13").Result;
        }
        set
        {
            _sysConfigService.UpdateConfigValue("cache_Z13", value);
        }
    }
    public static bool Z21
    {
        get
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z21").Result;
        }
        set
        {
            _sysConfigService.UpdateConfigValue("cache_Z21", value);
        }
    }
    public static bool Z22
    {
        get
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z22").Result;
        }
        set
        {
            _sysConfigService.UpdateConfigValue("cache_Z22", value);
        }
    }
    public static bool Z23
    {
        get
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z23").Result;
        }
        set
        {
            _sysConfigService.UpdateConfigValue("cache_Z23", value);
        }
    }
    public static bool Z31
    {
        get
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z31").Result;
        }
        set
        {
            _sysConfigService.UpdateConfigValue("cache_Z31", value);
        }
    }
    public static bool Z32
    {
        get
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z32").Result;
        }
        set
        {
            _sysConfigService.UpdateConfigValue("cache_Z32", value);
        }
    }
    public static bool Z33
    {
        get
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z33").Result;
        }
        set
        {
            _sysConfigService.UpdateConfigValue("cache_Z33", value);
        }
    }
    public static bool Z41
    {
        get
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z41").Result;
        }
        set
        {
            _sysConfigService.UpdateConfigValue("cache_Z41", value);
        }
    }
    public static bool Z42
    {
        get
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z42").Result;
        }
        set
        {
            _sysConfigService.UpdateConfigValue("cache_Z42", value);
        }
    }
    public static bool Z43
    {
        get
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z43").Result;
        }
        set
        {
            _sysConfigService.UpdateConfigValue("cache_Z43", value);
        }
    }
    public static bool Z51
    {
        get
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z51").Result;
        }
        set
        {
            _sysConfigService.UpdateConfigValue("cache_Z51", value);
        }
    }
    public static bool Z52
    {
        get
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z52").Result;
        }
        set
        {
            _sysConfigService.UpdateConfigValue("cache_Z52", value);
        }
    }
    public static bool Z53
    {
        get
        {
            return _sysConfigService.GetConfigValue<bool>("cache_Z53").Result;
        }
        set
        {
            _sysConfigService.UpdateConfigValue("cache_Z53", value);
        }
    }
    #endregion
}
Admin.NET/WCS.Application/Util/HttpService.cs
@@ -3,8 +3,11 @@
using Furion.Logging;
using Furion.RemoteRequest.Extensions;
using Newtonsoft.Json;
using System.Net.Http.Headers;
using System.Reflection.PortableExecutable;
using System.Text;
using WCS.Application.Entity;
using WCS.Application.Util;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.ComponentTCBBatchCreateContainerServiceVersionResponse.Types;
namespace WCS.Application;
@@ -13,10 +16,25 @@
    private dynamic Urls;
    private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
    private static Dictionary<string, string> dicConverCar = new Dictionary<string, string>();
    public HttpService()
    {
        var _sysConfigService = App.GetService<SysConfigService>();
        Urls = _sysConfigService.GetSystemInfo().Result;
        dicConverCar = new Dictionary<string, string>
        {
            {"013","190601"},
            {"014","191201"},
            {"015","190602"},
            {"016","191202"},
            {"002","030401"},
            {"006","030402"},
            {"003","030601"},
            {"007","030602"},
            {"005","031201"},
            {"008","031202"},
        };
    }
@@ -25,15 +43,13 @@
    /// </summary>
    /// <param name="palletNo"></param>
    /// <param name="startLocat"></param>
    /// <param name="taskModel"></param>
    /// <param name="ceng"></param>
    /// <param name="endLocat"></param>
    /// <param name="taskNo"></param>
    /// <returns></returns>
    public string RequestRoadWay(string palletNo, string startLocat, string taskModel, string ceng, ref string endLocat, ref string taskNo)
    public string RequestRoadWay(string palletNo, string startLocat, ref string endLocat, ref string taskNo)
    {
        string returnStr = "";
        var stationNum = startLocat.PadLeft(3, '0');
        var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo);
@@ -42,12 +58,11 @@
            var model = new RequestAsnTask()
            {
                PalletNo = palletNo,
                HouseNo = "W01",
                TaskModel = taskModel
                HouseNo = "W01"
            };
            string url = Urls.WMSAddress + ":" + Urls.WMSPort;
            var result = (url + "/api/DownAPi/RequestRoadWay").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result;
            var result = (url + "/api/DownAPi/RequestMiJiRoadWay").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result;
            Log.Information("调用WMS接口反馈任务接口" + result.ToJson());
            if (result.Success == 0)
            {
@@ -56,6 +71,7 @@
                {
                    TaskType = TaskTypeEnum.In,
                    Status = TaskStatusEnum.Wait,
                    Type = PLCTypeEnum.ConveyorLine,
                    Origin = "WMS",
                    StartLocate = startLocat,
                    PalletNo = palletNo,
@@ -65,6 +81,8 @@
                    EndRoadway = result.TaskList.EndRoadway
                };
                var endLocat2 = PLCCommon.RoadwayToStationNum(taskAdd.EndRoadway, stationNum);
                taskAdd.StartRoadway = dicConverCar[endLocat2];
                _db.Insertable(taskAdd).ExecuteCommand();
                endLocat = result.TaskList.EndRoadway;
                taskNo = result.TaskList.TaskNo;
@@ -84,134 +102,45 @@
            taskNo = task.TaskNo;
        }
        endLocat = PLCCommon.RoadwayToStationNum(endLocat, ceng);
        endLocat = PLCCommon.RoadwayToStationNum(endLocat, stationNum);
        return returnStr;
    }
    /// <summary>
    /// 调用WMS接口自动码垛绑定信息返回巷道口
    /// </summary>
    /// <returns></returns>
    public string BindRequestRoadWay(string orderNo, string palletNo, decimal qty, string type, string skuNo, string lotNo, string lotText, string supplierLot, List<WcsBoxInfo> detail,
        string startLocat, string taskModel, string ceng, ref string endLocat, ref string taskNo)
    {
        string returnStr = "";
        var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing) && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo);
        if (task == null)
        {
            var model = new BoxPalletBindVm()
            {
                OrderCode = "",//暂无上游系统编号
                AsnNo = orderNo,
                AsnDetailNo = 0,//暂无入库单明细编号,WMS根据物料批次查找
                PalletNo = palletNo,
                Qty = qty,
                Type = type,
                SkuNo = skuNo,
                LotNo = lotNo,
                LotText = lotText,
                SupplierLot = supplierLot,
                Detail = detail
            };
            string url = Urls.WMSAddress + ":" + Urls.WMSPort;
            var result = (url + "/api/DownAPi/BindRequestRoadWay").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result;
            Log.Information("调用WMS接口反馈任务接口" + result.ToJson());
            if (result.Success == 0)
            {
                var taskAdd = new WcsTask()
                {
                    TaskType = TaskTypeEnum.In,
                    Status = TaskStatusEnum.Wait,
                    Origin = "WMS",
                    StartLocate = startLocat,
                    PalletNo = palletNo,
                    TaskNo = result.TaskList.TaskNo,
                    EndLocate = result.TaskList.EndLocate,
                    EndRoadway = result.TaskList.EndRoadway
                };
                _db.Insertable(taskAdd).ExecuteCommand();
                endLocat = result.TaskList.EndRoadway;
                returnStr = result.TaskList.EndLocate;
            }
            else
            {
                returnStr = "-1:" + result.Message;
                return returnStr;
            }
        }
        else
        {
            returnStr = task.EndLocate;
            endLocat = task.EndRoadway;
            taskNo = task.TaskNo;
        }
        endLocat = PLCCommon.RoadwayToStationNum(endLocat, ceng);
        return returnStr;
    }
    /// <summary>
    /// 调用WMS接口申请储位接口
    /// </summary>
    /// <param name="palletNo"></param>
    /// <param name="startLocat"></param>
    /// <param name="taskModel"></param>
    /// <param name="starRoadWay"></param>
    /// <param name="taskId"></param>
    /// <param name="taskNo"></param>
    /// <returns></returns>
    public string RequestLocate(string palletNo, string startLocat, string taskModel, string starRoadWay, ref string taskNo)
    public string RequestLocate(string palletNo, int taskId,ref string taskNo)
    {
        string returnStr = "";
        var task = _db.Queryable<WcsTask>().First(m => m.IsDelete == false
        && (m.Status == TaskStatusEnum.Wait || m.Status == TaskStatusEnum.Doing)
        && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo && !string.IsNullOrWhiteSpace(m.EndLocate));
        && m.TaskType == TaskTypeEnum.In && m.PalletNo == palletNo && m.TaskId == taskId);
        if (task == null)
        if (task != null)
        {
            var model = new RequestAsnTask()
            {
                PalletNo = palletNo,
                HouseNo = "W01",
                RoadWayNo = starRoadWay,
                TaskModel = taskModel
                RoadWayNo = task.EndRoadway,
            };
            string url = Urls.WMSAddress + ":" + Urls.WMSPort;
            var result = (url + "/api/DownAPi/RequestLocation").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result;
            var result = (url + "/api/DownAPi/RequestMiJiLocation").SetBody(model, "application/json", Encoding.UTF8).PostAsAsync<ResponseTasks>().Result;
            Log.Information("调用WMS申请储位接口反馈任务接口" + result.ToJson());
            if (result.Success == 0)
            {
                var taskUp = _db.Queryable<WcsTask>().First(m => m.IsDelete == false && m.TaskNo == result.TaskList.TaskNo);
                if (taskUp == null)
                {
                    var taskAdd = new WcsTask()
                    {
                        TaskNo = result.TaskList.TaskNo,
                        TaskType = TaskTypeEnum.In,
                        Status = TaskStatusEnum.Wait,
                        //IsSuccess =TaskSuccessEnum.Success,
                        Origin = "WMS",
                        StartLocate = startLocat,
                        PalletNo = palletNo,
                        EndLocate = result.TaskList.EndLocate,
                        EndRoadway = result.TaskList.EndRoadway
                    };
                    _db.Insertable(taskAdd).ExecuteCommand();
                    HubUtil.PublicTask(taskAdd.Adapt<WcsTaskOutput>());
                }
                else
                {
                    taskUp.EndRoadway = result.TaskList.EndRoadway;
                    taskUp.EndLocate = result.TaskList.EndLocate;
                    _db.Updateable(taskUp).ExecuteCommand();
                    HubUtil.PublicTask(taskUp.Adapt<WcsTaskOutput>());
                }
                task.Status = TaskStatusEnum.Wait;
                task.Type = PLCTypeEnum.ShuttleCar;
                task.EndLocate = result.TaskList.EndLocate;
                _db.Updateable(task).ExecuteCommand();
                HubUtil.PublicTask(task.Adapt<WcsTaskOutput>());
                returnStr = result.TaskList.EndLocate;
                taskNo = result.TaskList.TaskNo;
@@ -224,8 +153,7 @@
        }
        else
        {
            returnStr = task.EndLocate;
            taskNo = task.TaskNo;
            returnStr = "-1:没有找到任务";
        }
        return returnStr;
@@ -394,15 +322,76 @@
    /// </summary>
    /// <param name="mod"></param>
    /// <returns></returns>
    public async Task<AgvResponse> GenAgvSchedulingTask(AgvTaskInput mod)
    public async Task<ResponseAgvDto> GenAgvSendTask(AgvTaskSend mod)
    {
        string url = Urls.RCSAddress + ":" + Urls.RCSPort;
        var result = await (url + "/rcms/services/rest/hikRpcService/genAgvSchedulingTask").SetBody(mod, "application/json", Encoding.UTF8).PostAsAsync<AgvResponse>();
        string url = Urls.RCSAddress + "/rcs/rtas/api/robot/controller/task/submit";
        var requestId = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
        var dic = new Dictionary<string, string>()
        {
            {"X-lr-request-id",requestId },
            {"X-lr-version","4.2" },
        };
        var result = await url.SetHeaders(dic).SetBody(mod, "application/json", Encoding.UTF8).PostAsAsync<ResponseAgvDto>();
        Log.Information("调用AGV小车接口下发任务" + result.ToJson());
        return result;
    }
    /// <summary>
    /// 调用AGV小车接口继续执行任务
    /// </summary>
    /// <param name="taskNo">任务号</param>
    /// <returns></returns>
    public async Task<ResponseAgvDto> GenAgvContinueTask(string taskNo)
    {
        string url = Urls.RCSAddress + "/rcs/rtas/api/robot/controller/task/continue";
        var requestId = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
        var dic = new Dictionary<string, object>()
        {
            {"X-lr-request-id","123456879" },
            {"X-lr-version","4.2" },
        };
        var mod = new
        {
            robotTaskCode = taskNo
        };
        var result = await url.SetHeaders(dic).SetBody(mod, "application/json", Encoding.UTF8).PostAsAsync<ResponseAgvDto>();
        Log.Information("调用AGV小车接口继续执行任务" + result.ToJson());
        return null;
    }
    /// <summary>
    /// 调用AGV小车接口 载具(托盘)与站点(储位)解绑定接口
    /// </summary>
    /// <param name="palletNo">托盘号</param>
    /// <param name="locateNo">储位号</param>
    /// <returns></returns>
    public async Task<ResponseAgvDto> GenAgvUnbind(string palletNo,string locateNo)
    {
        string url = Urls.RCSAddress + "/rcs/rtas/api/robot/controller/carrier/unbind";
        var requestId = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
        var dic = new Dictionary<string, string>()
        {
            {"X-lr-request-id",requestId },
            {"X-lr-version","4.2" },
        };
        var mod = new
        {
            carrierCode = palletNo,
            siteCode = locateNo
        };
        var result = await url.SetHeaders(dic).SetBody(mod, "application/json", Encoding.UTF8).PostAsAsync<ResponseAgvDto>();
        Log.Information("调用AGV小车接口继续执行任务" + result.ToJson());
        return result;
    }
    /// <summary>
    /// 调用AGV小车接口反馈开门成功
    /// </summary>
    /// <param name="mod"></param>