IPC-610
2024-09-26 fdab33a6b12d09c898606f15e40178b44e174721
Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -1,4 +1,5 @@

using Dm.filter;
using DocumentFormat.OpenXml.Bibliography;
using Elastic.Clients.Elasticsearch.Tasks;
using Furion.Logging;
@@ -10,6 +11,7 @@
using System;
using System.Data;
using System.Reflection.Emit;
using WCS.Application.Entity;
using WCS.Application.Util;
namespace WCS.Application;
@@ -26,16 +28,16 @@
            switch (mod.Type)
            {
                case PLCTypeEnum.StackingMachine:
                    StackingMachine(mod);
                    StackingMachine(mod);                           // 跺机
                    break;
                case PLCTypeEnum.ConveyorLine:
                    ConveyorLine(mod);
                    ConveyorLine(mod);                              // 托盘输送线
                    break;
                case PLCTypeEnum.AGV:
                    AGV(mod);
                    AGV(mod);                                       // AGV调度
                    break;
                case PLCTypeEnum.PalletMachine:
                    PalletMachine(mod);
                case PLCTypeEnum.BoxConveyorLine:
                    BoxConveyorLine(mod);                             // 码垛机器人
                    break;
                case PLCTypeEnum.StackingRobot:
                    PalletMachine(mod);
@@ -223,13 +225,13 @@
                            if (startStationRes.IsSucceed)
                            {
                                // 根据工位号获取对应的输送线IP
                                var plcConveyorConn = PLCCommon.GetPlcIp(startStationVal.ToString());
                                PLCUtil plcConveyorConn = PLCCommon.GetPlcIp(startStationVal.ToString());
                                if (plcConveyorConn.Connected)
                                {
                                    // 向取货工位写入流程字640  取货已完成
                                    var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == startStationVal.ToString()
                                                            && m.DeviceType == DeviceTypeEnum.Business && m.IsDelete == false);
                                    var retc = plcConveyorConn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "640");
                                    var modcTaskMonitor = new WcsTaskMonitor()
                                    {
                                        TaskNo = modTask.TaskNo,
@@ -240,9 +242,21 @@
                                        StartLocat = startStationVal.ToString(),
                                        EndLocat = modTask.EndLocate                  // 目标储位地址
                                    };
                                    // 读取wcs控制字
                                    var (ress, va1s) = plcConveyorConn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos);
                                    if (va1s.ToString() == "630")
                                    {
                                        modcTaskMonitor.InteractiveMsg = string.Format("工位:{0},写入取货完成:640", startStationVal);
                                        // 插入交互日志
                                        _db.Insertable(modcTaskMonitor).ExecuteCommand();
                                    }
                                    var retc = plcConveyorConn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "640");
                                    if (!retc.IsSucceed)
                                    {
                                        modcTaskMonitor.InteractiveMsg = string.Format("输送线取货工位:{0},写入取货完成640失败等待在次写入", startStationVal);
                                        modcTaskMonitor.InteractiveMsg = string.Format("工位:{0},写入取货完成640失败", startStationVal);
                                        // 插入交互日志
                                        _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                        //下发任务日志
@@ -250,43 +264,56 @@
                                        break;
                                    }
                                    modcTaskMonitor.InteractiveMsg = string.Format("输送线取货工位:{0},写入取货完成640成功", startStationVal);
                                    // 插入交互日志
                                    _db.Insertable(modcTaskMonitor).ExecuteCommand();
                                    //下发任务日志
                                    HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                }
                                // 读取wcs控制字
                                var (resss, va1ss) = plcConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos);
                                if (va1ss.ToString() == "830")
                                {
                                    modInsertTaskMonitor.InteractiveMsg = string.Format("工位:{0}跺机取货完成写入850", startStationVal);
                                    modInsertTaskMonitor.EndLocat = modTask.EndLocate;                  // 目标储位地址
                                                                                                        // 插入交互日志
                                    _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                }
                                // 写入流程控制字
                                var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "850");
                                if (!ret.IsSucceed)
                                {
                                    modInsertTaskMonitor.InteractiveMsg = string.Format("工位:{0}跺机取货完成写入850失败,等待再次写入。", startStationVal);
                                    modInsertTaskMonitor.EndLocat = modTask.EndLocate;                  // 目标储位地址
                                                                                                        // 插入交互日志
                                    _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                    break;              // 写入失败跳出等待再次写入
                                }
                                modInsertTaskMonitor.InteractiveMsg = string.Format("输送线取货工位:{0}跺机取货完成850成功", startStationVal);
                                modInsertTaskMonitor.EndLocat = modTask.EndLocate;                  // 目标储位地址
                                                                                                    // 插入交互日志
                                _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                //下发任务日志
                                HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                            }
                        }
                        else if (modTask.TaskType == TaskTypeEnum.Out)
                        {
                            // 读取wcs控制字
                            var (resss, va1ss) = plcConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos);
                            if (va1ss.ToString() == "830")
                            {
                                // 记录任务明细
                                modInsertTaskMonitor.InteractiveMsg = string.Format("储位地址:{0}取货完成写入850", modTask.StartLocate);
                                modInsertTaskMonitor.EndLocat = endStation;                  // 放货工位
                            }
                            // 写入流程控制字
                            var ret = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "850");
                            if (!ret.IsSucceed)
                            {
                                modInsertTaskMonitor.InteractiveMsg = string.Format("储位地址:{0}取货完成写入850失败,等待再次写入。", modTask.StartLocate);
                                modInsertTaskMonitor.EndLocat = modTask.EndLocate;                  // 目标储位地址
                                                                                                    // 插入交互日志
                                _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                                break;              // 写入失败跳出等待再次写入
                            }
                            // 记录任务明细
                            modInsertTaskMonitor.InteractiveMsg = string.Format("储位地址:{0}取货完成", modTask.StartLocate);
                            modInsertTaskMonitor.EndLocat = endStation;                  // 放货工位
                            // 插入交互日志
                            _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                            //下发任务日志
                            HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        }
@@ -378,8 +405,7 @@
                                        }
                                    }
                                    // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                                    var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == modTask.TaskNo);
                                    modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.StartLocate).Select(s => s.LedIP).First();
                                    modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == modTask.StartLocate).Select(s => s.LedIP).First();
                                    // 插入交互日志
                                    _db.Insertable(modTaskMonitor).ExecuteCommand();
@@ -453,6 +479,14 @@
                                                    _db.Insertable(modcTaskMonitor).ExecuteCommand();
                                                    //下发任务日志
                                                    HubUtil.PublicTaskMonitor(modcTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                                                    // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                                                    var taskModel = _db.Queryable<WcsTask>().First(w => w.TaskNo == modTask.TaskNo);
                                                    modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskModel.StartLocate).Select(s => s.LedIP).First();
                                                    // led显示内容
                                                    LedDisplay(modDevice.LedIP, "工位:" + modDevice.StationNum, "出库中 ", "托盘号:" + modTask.PalletNo);
                                                    break;
                                                }
                                            }
@@ -817,7 +851,6 @@
            }
        }
    }
    /// <summary>
    /// 输送线业务处理
@@ -1184,8 +1217,8 @@
                    #endregion
                }
                break;
            #region 出库交互
            #region 出库交互
            case "420":
                {
                    #region 托盘到达拣选工位/出库口
@@ -1221,9 +1254,12 @@
                        // 通知任务界面任务已存在更新 请更新界面
                        HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        // led更新内容
                        //DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and  StationNum = '{EndLocat}'")[0];
                        //LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库中 " + $"储位地址:{StartLocat}", "托盘号:" + PalletNo);
                        // 根据任务号获取起始工位地址,根据起始工位地址获取LEDIP 推送到LED屏幕。
                        var taskInfo = _db.Queryable<WcsTask>().First(w => w.TaskNo == modInsertTaskMonitor.TaskNo);
                        modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == taskInfo.StartLocate).Select(s => s.LedIP).First();
                        // led显示内容
                        LedDisplay(modDevice.LedIP, "到达工位:" + modDevice.StationNum, "出库完成 " + $"储位地址:{modInsertTaskMonitor.StartLocat}", "托盘号:" + palletVal);
                    }
                    // 反馈WMS出库完成
                    //TaskReques taskReques = new TaskReques();
@@ -1247,27 +1283,61 @@
                        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);
                        if (modTask == null)
                        {
                            Log.Error(string.Format("输送线440:未找到对应的任务。"));
                            break;
                        }
                        // 改变任务状态
                        modTask.Status = TaskStatusEnum.Complete;
                        modTask.FinishDate = DateTime.Now;
                        _db.Updateable(modTask).ExecuteCommand();
                        HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                        // 插入任务明细 
                        var modInsertTaskMonitor = new WcsTaskMonitor()
                        {
                            TaskNo = taskVal,
                            TaskNo = modTask.TaskNo,
                            PlcId = modDevice.Id,
                            PlcName = modDevice.Text,
                            InteractiveMsg = $"写入指令450:{modDevice.StationNum}拣选完成,托盘离开工位",
                            PalletNo = palletVal,
                            Status = TaskStatusEnum.Complete,
                            StartLocat = starVal,
                            StartLocat = starVal.ToString(),
                            EndLocat = modDevice.StationNum,
                        };
                        if (modTask.Origin == "WMS")
                        {
                            // 反馈WMS
                            var requestMode = new TaskRequestWMS()
                            {
                                TaskNo = modTask.TaskNo,
                                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));
                            }
                        }
                        // 插入交互日志
                        _db.Insertable(modInsertTaskMonitor).ExecuteCommand();
                        // 通知任务界面任务已存在更新 请更新界面
                        HubUtil.PublicTaskMonitor(modInsertTaskMonitor.Adapt<WcsTaskMonitorOutput>());
                        // led更新内容
                        //DataRow ConveyorsRow10 = PlcInfoDt.Select($"Level = '2' and  StationNum = '{EndLocat}'")[0];
                        //LedDisplay(ConveyorsRow10["LedIP"].ToString(), "工位:" + EndLocat, "出库中 " + $"储位地址:{StartLocat}", "托盘号:" + PalletNo);
                        // led显示内容
                        modDevice.LedIP = _db.Queryable<WcsDevice>().Where(w => w.StationNum == modTask.StartLocate).Select(s => s.LedIP).First();
                        LedDisplay(modDevice.LedIP, "工位:" + modTask.StartLocate, $"拣选完成,托盘离开工位", "托盘号:" + modTask.PalletNo);
                    }
                    #endregion
                }
@@ -1275,6 +1345,20 @@
            #endregion
            case "50":
                // plc申请空托
                {
                    // 调用WMS空托出库接口,返回出库任务存入出库表
                    // 写入
                }
                break;
            case "80":
                // 空托盘跺已到位
                {
                }
                break;
            default: break;
        }
@@ -1293,7 +1377,376 @@
    /// <param name="modDevice"></param>
    private static void PalletMachine(WcsDeviceDto modDevice)
    {
        var plcConn = modDevice.PLCUtil;
        switch (modDevice.Value.ToString())
        {
            case "220":
                // 注释1
                {
                }
                break;
            case "230":
                // 注释2
                {
                }
                break;
            case "240":
                {
                }
                break;
            default: break;
        }
    }
    /// <summary>
    /// 件箱输送和码垛机器人业务处理  配置的是件箱输送
    /// </summary>
    /// <param name="modDevice"></param>
    private static async void BoxConveyorLine(WcsDeviceDto modDevice)
    {
        var plcConn = modDevice.PLCUtil;
        if (modDevice.DbNumber == "DB101")
        {
            // 主扫交互流程
            switch (modDevice.Value.ToString())
            {
                case "1":
                    // 主扫申请分道 wcs写入2
                    {
                        // 判断是否演示模式 true:演示模式   false:生产模式
                        if (PLCTaskAction.boDemo)
                        {
                            // 通道号
                            var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "通道号");
                            // 演示模式直接写入1分道
                            var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "1");
                            if (ret.IsSucceed)
                            {
                                // 写入流程控制字 2
                                var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                if (!retVal.IsSucceed)
                                {
                                    Log.Error("演示模式写入分道号失败!");
                                    break;
                                }
                            }
                        }
                        else
                        {
                            // 通道号
                            var modPosTask = modDevice.listStation.FirstOrDefault(s => s.Text == "通道号");
                            // 读取plc箱码
                            var modBoxNo = modDevice.listStation.FirstOrDefault(m => m.Text == "箱码");
                            var (res, boxNo) = plcConn.GetPlcDBValue(modBoxNo.PosType, modDevice.DbNumber, modBoxNo.PlcPos);
                            if (string.IsNullOrWhiteSpace(boxNo.ToString()))
                            {
                                // 箱码为null写入剔除通道号
                                var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0");
                                if (ret.IsSucceed)
                                {
                                    // 写入流程控制字 2
                                    var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                    if (retVal.IsSucceed)
                                    {
                                        Log.Error("箱码为null进行剔除");
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                // 根据箱码获取箱内信息
                                string boxNoVal = boxNo.ToString();
                                var boxInfo = _db.Queryable<WcsBoxInfo>().First(w => w.IsDelete == false && w.BoxNo == boxNoVal && string.IsNullOrEmpty(w.PalletNo));
                                if (boxInfo == null)
                                {
                                    // 箱信息为null写入剔除通道号
                                    var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0");
                                    if (ret.IsSucceed)
                                    {
                                        // 写入流程控制字 2
                                        var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                        if (retVal.IsSucceed)
                                        {
                                            Log.Error("箱码为null或已绑定托盘,进行剔除。");
                                            break;
                                        }
                                    }
                                }
                                // 根据箱内品种号获取码躲绑定工位及对应的分道号
                                var checkTaskInfo = _db.Queryable<WcsCheckTask>().First(w => w.SkuNo == boxInfo.SkuNo && w.SkuName == boxInfo.SkuName && w.LotNo == boxInfo.LotNo);
                                if (checkTaskInfo == null)
                                {
                                    // 绑定信息为null写入剔除通道号
                                    var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, "0");
                                    if (ret.IsSucceed)
                                    {
                                        // 写入流程控制字 2
                                        var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                        if (retVal.IsSucceed)
                                        {
                                            Log.Error("箱码未绑定分拣任务,进行剔除。");
                                            break;
                                        }
                                    }
                                }
                                else
                                {
                                    // 与plc交互写入分道号和流程控制字
                                    var ret = plcConn.SetPlcDBValue(modPosTask.PosType, modDevice.DbNumber, modPosTask.PlcPos, checkTaskInfo.RoboatNo);
                                    if (ret.IsSucceed)
                                    {
                                        // 写入流程控制字 2
                                        var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                                        if (retVal.IsSucceed)
                                        {
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                default: break;
            }
        }
        else
        {
            // 插码交互
            switch (modDevice.Value.ToString())
            {
                case "1":
                    // 托盘条码可读
                    {
                        // 获取托盘条码配置
                        var modPalletNo = modDevice.listStation.FirstOrDefault(m => m.Text == "托盘条码");
                        // 读取PLC托盘条码号
                        var (res, palletVal) = plcConn.GetPlcDBValue(modPalletNo.PosType, modDevice.DbNumber, modPalletNo.PlcPos);
                        string palletNo = palletVal.ToString();
                        if (string.IsNullOrEmpty(palletNo))
                        {
                            Log.Error(string.Format("{0},读取的托盘号为null", modDevice.Text));
                            break;
                        }
                        // 根据工位号将托盘号保存在分道表
                        var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false);
                        if (checkTaskMedel == null)
                        {
                            Log.Error(string.Format("根据码垛工位{0},获取分道失败!", modDevice.StationNum));
                            break;
                        }
                        checkTaskMedel.PalletNo = palletNo;
                        var rowCount = _db.Updateable(checkTaskMedel).ExecuteCommand();
                        if (rowCount > 0 )
                        {
                            // plc写入读取成功表示 2
                            var retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "2");
                            if (retVal.IsSucceed)
                            {
                                // liudl  此处需添加
                                // 通知分拣码垛页更新
                            }
                        }
                    }
                    break;
                case "20":
                    // 申请插码
                    {
                        // 获取托盘条码配置
                        var modAddCode = modDevice.listStation.FirstOrDefault(m => m.Text == "插码结果");
                        // 判断是否演示模式 true:演示模式   false:生产模式
                        if (PLCTaskAction.boDemo)
                        {
                            // 演示模式直接写入插码结果 1:成功
                            var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "1");
                            break;
                        }
                        else
                        {
                            // 获取箱条码
                            // 获取箱条码配置
                            var modBoxNo = modDevice.listStation.FirstOrDefault(m => m.Text == "箱条码");
                            var (res, boxVal) = plcConn.GetPlcDBValue(modBoxNo.PosType, modDevice.DbNumber, modBoxNo.PlcPos);
                            string boxNo = boxVal.ToString();
                            if (string.IsNullOrEmpty(boxNo))
                            {
                                Log.Error(string.Format("码垛工位{0},箱码为null插码失败!请人工强制结批。"), modDevice.StationNum);
                                // 写入插入结果 2:插码失败
                                var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2");
                                break;
                            }
                            // 验证箱码表是否存在此箱码
                            var boxInfo = _db.Queryable<WcsBoxInfo>().First(w => w.IsDelete == false && w.BoxNo == boxNo);
                            if (boxInfo == null)
                            {
                                Log.Error(string.Format("码垛工位{0},箱码{1}不存在!请人工强制结批。"), modDevice.StationNum,boxNo);
                                // 写入插入结果 2:插码失败
                                var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2");
                                break;
                            }
                            // 获取当前分道托盘号
                            var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false);
                            if (checkTaskMedel == null)
                            {
                                Log.Error(string.Format("根据码垛工位{0},获取分道失败!", modDevice.StationNum));
                                break;
                            }
                            string palletNo = checkTaskMedel.PalletNo;
                            if (string.IsNullOrEmpty(palletNo))
                            {
                                Log.Error(string.Format("获取码垛工位{0}上的托盘号失败!",modDevice.StationNum));
                                break;
                            }
                            // 修改插码表
                            boxInfo.PalletNo = palletNo;
                            boxInfo.UpdateTime = DateTime.Now;
                            var rowCount = _db.Updateable(boxInfo).ExecuteCommand();
                            if (rowCount > 0)
                            {
                                // 插码成功
                                var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "1");
                            }
                            else
                            {
                                // 插码失败
                                Log.Error(string.Format("箱码{0};码垛工位{1},插码失败,请强制结批"),boxNo,modDevice.StationNum);
                                var retVal = plcConn.SetPlcDBValue(modAddCode.PosType, modDevice.DbNumber, modAddCode.PlcPos, "2");
                            }
                        }
                    }
                    break;
                case "40":
                    // 请求组托,申请入库
                    {
                        // 根据工位号,获取托盘号
                        var checkTaskMedel = _db.Queryable<WcsCheckTask>().First(m => m.Port == modDevice.StationNum && m.IsDelete == false);
                        // 根据工位号获取 托盘线该工位号的配置信息
                        var numModel = PLCTaskAction.plcDevices.First(m => m.StationNum == modDevice.StationNum && m.IsDelete == false && m.DeviceType == DeviceTypeEnum.Business && m.PlcId != modDevice.PlcId);
                        var posModel = PLCTaskAction.plcPositions.First(m => m.DeviceId == numModel.Id && m.Text == "目的工位" && m.IsDelete == false);
                        if (checkTaskMedel == null)
                        {
                            Log.Error(string.Format("组托失败根据码垛工位{0},获取托盘号失败!", modDevice.StationNum));
                            // 写入交互工位目标地址
                            var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, "234");
                            if (retVal.IsSucceed)
                            {
                                // 写入组托回复流程字
                                retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50");
                            }
                            break;
                        }
                        // 码垛工位托盘号
                        string palletNo = checkTaskMedel.PalletNo;
                        // 是否演示模式
                        if (PLCTaskAction.boDemo)
                        {
                            // 直接箱wms申请巷道
                            var http = new HttpService();
                            string TaskNo = "", EndLocate = "";
                            string strMsg = http.RequestRoadWay(palletNo, modDevice.StationNum, "1", "2", ref EndLocate, ref TaskNo);
                            if (strMsg.Contains("-1"))
                            {
                                Log.Error(string.Format("申请巷道失败,码垛工位{0};原因{1}", modDevice.StationNum, strMsg));
                                break;
                            }
                            else
                            {
                                // 获取入库任务信息
                                var taskModel = _db.Queryable<WcsTask>().First(m => m.TaskNo == TaskNo && m.IsDelete == false && m.Status == TaskStatusEnum.Wait);
                                if (taskModel != null)
                                {
                                    // 获取入库取货工位
                                    string endLocatVlue = PLCCommon.RoadwayToStationNum(taskModel.EndRoadway, "2");
                                    // 写入托盘输送线码垛工位 目的工位,写入交互流程组托成功 执行入库{若需要可以写入任务号等等其他信息}
                                    var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, endLocatVlue);
                                    if (retVal.IsSucceed)
                                    {
                                        // 写入码垛交互-组托回复流程字
                                        retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50");
                                        // 将入库任务由正在执行改为正在执行
                                        taskModel.Status = TaskStatusEnum.Doing;
                                        _db.Updateable(taskModel).ExecuteCommand();
                                    }
                                }
                            }
                        }
                        else
                        {
                            // 根据托盘号,将组托信息插入boxinfolog表 并删除boxinfo表数据
                            var boxInfoList = await _db.Queryable<WcsBoxInfo>().Where(w => w.IsDelete == false && w.PalletNo == palletNo).ToListAsync();
                            if (boxInfoList.Count <= 0)
                            {
                                Log.Error(string.Format("申请巷道失败,码垛工位{0},箱码信息不存在", modDevice.StationNum));
                                // 写入交互工位目标地址
                                var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, "234");
                                if (retVal.IsSucceed)
                                {
                                    // 写入组托回复流程字
                                    retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50");
                                }
                                break;
                            }
                            string sqlStr = $"insert into WCSBoxInfoLog select * from WCSBoxInfo where IsDelete=0 and PalletNo='{palletNo}'";
                            int insertCount = _db.Ado.ExecuteCommand(sqlStr);
                            if (insertCount > 0)
                            {
                                string sqlStr2 = $"delete from WCSBoxInfo where  IsDelete=0 and PalletNo='{palletNo}'";
                                _db.Ado.ExecuteCommand(sqlStr2);
                            }
                            // 向WMS申请巷道
                            var http = new HttpService();
                            string TaskNo = "", EndLocate = "";
                            string strMsg = http.BindRequestRoadWay(checkTaskMedel.OrderNo,palletNo, checkTaskMedel.BoxCount.ToDecimal(),"0", checkTaskMedel.SkuNo, checkTaskMedel.LotNo, "","", boxInfoList,
                                modDevice.StationNum, "1", "2", ref EndLocate, ref TaskNo);
                            if (!strMsg.Contains("-1"))
                            {
                                Log.Error(string.Format("申请巷道失败,码垛工位{0};原因{1}", modDevice.StationNum, strMsg));
                                break;
                            }
                            else
                            {
                                // 获取入库任务信息
                                var taskModel = _db.Queryable<WcsTask>().First(m => m.TaskNo == TaskNo && m.IsDelete == false && m.Status == TaskStatusEnum.Wait);
                                if (taskModel != null)
                                {
                                    // 获取入库取货工位
                                    string endLocatVlue = PLCCommon.RoadwayToStationNum(taskModel.EndRoadway, "2");
                                    // 写入托盘输送线码垛工位 目的工位,写入交互流程组托成功 执行入库{若需要可以写入任务号等等其他信息}
                                    var retVal = plcConn.SetPlcDBValue(posModel.PosType, numModel.DbNumber, posModel.PlcPos, endLocatVlue);
                                    if (retVal.IsSucceed)
                                    {
                                        // 写入组托回复流程字
                                        retVal = plcConn.SetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos, "50");
                                        if (retVal.IsSucceed)
                                        {
                                            // 将入库任务由正在执行改为正在执行
                                            taskModel.Status = TaskStatusEnum.Doing;
                                            _db.Updateable(taskModel).ExecuteCommand();
                                        }
                                    }
                                }
                            }
                        }
                    }
                    break;
                default:break;
            }
        }
    }
    /// <summary>