xby-y
7 天以前 b3ff80e45d24a821ca0731983b1546b48570cdf1
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs
@@ -1,20 +1,16 @@
using Microsoft.AspNetCore.Routing;
using Quartz;
using Quartz;
using SqlSugar;
using System.Net;
using System.Threading.Tasks;
using WIDESEA_Comm.Http;
using WIDESEAWCS_Common;
using WIDESEAWCS_Common.Helper;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.ConveyorLine.Enum;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Repository;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_Tasks.ConveyorLineJob;
@@ -32,9 +28,11 @@
        private readonly IRouterService _routerService;
        private readonly IRepository<Dt_Task> _taskRepository;
        private readonly IRepository<Dt_StationManger> _stationMangerRepository;
        public CommonConveyorLineJob(ICacheService cacheService, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRepository<Dt_StationManger> stationMangerRepository, IRepository<Dt_Task> taskRepository, IRouterRepository routerRepository, IRouterService routerService)
        private readonly ITaskHtyService _taskHtyService;
        public CommonConveyorLineJob(ICacheService cacheService, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRepository<Dt_StationManger> stationMangerRepository, IRepository<Dt_Task> taskRepository, IRouterRepository routerRepository, IRouterService routerService, ITaskHtyService taskHtyService)
        {
            _cacheService = cacheService;
            _taskService = taskService;
@@ -43,14 +41,15 @@
            _routerService = routerService;
            _stationMangerRepository = stationMangerRepository;
            _taskRepository = taskRepository;
            _taskHtyService = taskHtyService;
        }
        public Task Execute(IJobExecutionContext context)
        {
            bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
            if (flag && value != null)
            {
                OtherDevice device = (OtherDevice)value;
                OtherDevice  device = (OtherDevice)value;
                List<string> deviceStations = device.DeviceProDTOs.Select(x => x.DeviceChildCode).Distinct().ToList();//获取设备下的站台
                List<Dt_StationManger> stationMangers = _stationMangerRepository.QueryData(x => x.StationDeviceCode == device.DeviceCode); //获取设备下的站台
                try
@@ -58,44 +57,53 @@
                    foreach (var item in stationMangers.Where(x => deviceStations.Contains(x.StationCode))) //循环设备下的站台
                    {
                        DeviceProDTO? deviceProRead = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(R_ConveyorLineDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); //输送线读取的全部协议
                        DeviceProDTO? deviceProWrite = device.DeviceProDTOs.Where(x => x.DeviceChildCode == item.StationCode && x.DeviceProParamType == nameof(W_ConveyorLineDB)).OrderBy(x => x.DeviceProOffset).FirstOrDefault(); //输送线写入的全部协议
                        if (deviceProRead != null && deviceProWrite != null) //读取写入的协议判断是否为null
                        {
                            R_ConveyorLineInfo conveyorLineInfoRead = device.Communicator.ReadCustomer<R_ConveyorLineInfo>(deviceProRead.DeviceProAddress); //读取协议
                            W_ConveyorLineInfo conveyorLineInfoWrite = device.Communicator.ReadCustomer<W_ConveyorLineInfo>(deviceProWrite.DeviceProAddress); //写入协议
                            if (conveyorLineInfoRead == null || conveyorLineInfoWrite == null)
                            {
                                continue;
                            }
                            R_ConveyorLineStatus conveyorLineStatus = conveyorLineInfoRead.Status.ByteToBoolObject<R_ConveyorLineStatus>(); //获取设备状态
                            ConveyorLineSignal conveyorLineSignalRead = conveyorLineInfoRead.Signal.ByteToBoolObject<ConveyorLineSignal>(); //获取设备信号
                            bool ACK = device.GetValue<W_ConveyorLineDB, bool>(W_ConveyorLineDB.ACK, item.StationCode); //获取ACK确认信息
                            bool STB = device.GetValue<W_ConveyorLineDB, bool>(W_ConveyorLineDB.STB, item.StationCode); //获取STB请求信息
                            //ConveyorLineSignal conveyorLineSignalWrite = conveyorLineInfoWrite.Signal.ByteToBoolObject<ConveyorLineSignal>();
                            //出库站台
                                                                                                                        //ConveyorLineSignal conveyorLineSignalWrite = conveyorLineInfoWrite.Signal.ByteToBoolObject<ConveyorLineSignal>();
                                                                                                                        //出库站台
                            if (item.StationType == StationTypeEnum.StationType_OnlyOutbound.ObjToInt())  //2007交互口进入
                            {
                                //WriteLog.Write_Log("2楼出库2007交互流程,堆垛机完成出库任务完成", $"{item.StationType}库流程", $"与2007进行交互,站台编号:{item.StationCode}",item.StationType);
                                // å‡ºåº“
                                if (conveyorLineSignalRead.STB && !conveyorLineSignalRead.ACK && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !STB && !ACK)//2楼出库
                                {
                                    if (!string.IsNullOrEmpty(conveyorLineInfoRead.Barcode))
                                    {
                                        Dt_Task dt_Ta = _taskService.GetOutTaskInfo2(conveyorLineInfoRead.Barcode);
                                        WriteLog.Write_Log("2楼出库流程", $"{item.StationCode}出库流程", $"获取2楼出库任务,托盘条码:{dt_Ta.PalletCode}", dt_Ta);
                                        if (dt_Ta != null)
                                        {
                                        {
                                         WriteLog.Write_Log("2出库流程", $"{item.StationCode}出库流程",$"获取出库任务成功开始向plc写入命令,托盘条码:taskno:{dt_Ta.TaskNum}------endpos:{dt_Ta.OutboundPlatform}--------stb:{ACK}");
                                            device.SetValue(W_ConveyorLineDB.TaskNo, dt_Ta.TaskNum, item.StationCode);
                                            bool endpos = device.SetValue(W_ConveyorLineDB.EndPos, dt_Ta.OutboundPlatform, item.StationCode);
                                            device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                            WriteLog.Write_Log("2楼出库流程", $"{item.StationCode}出库流程", $"开始删除任务,托盘条码:{dt_Ta.PalletCode}");
                                            //删除任务
                                            _taskRepository.DeleteData(dt_Ta);
                                            _taskHtyService.AddTaskHistory(dt_Ta, "自动完成");
                                        }
                                    }
                                }
@@ -107,16 +115,22 @@
                            //出入库站台
                            else if (item.StationType == StationTypeEnum.StationType_InboundAndOutbound.ObjToInt())
                            {
                                //输送线完成修改成输送线完成状态待堆垛机执行任务
                                if (conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !ACK)
                                {
                                    if (!string.IsNullOrEmpty(conveyorLineInfoRead.Barcode))
                                    Dt_Task dt_Task = _taskService.GetTaskIninfo(conveyorLineInfoRead.Barcode);
                                    WriteLog.Write_Log("1-2-3-4-5入库流程", $"{item.StationCode}入库流程", $"获取入库任务,托盘条码:{dt_Task.PalletCode}", dt_Task);
                                    if (!string.IsNullOrEmpty(conveyorLineInfoRead.Barcode)&& dt_Task !=null)
                                    {
                                        bool ack = device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                        bool taskno = device.SetValue(W_ConveyorLineDB.TaskNo,1, item.StationCode);
                                        WriteLog.Write_Log("1-3-4-5出入库流程", $"{item.StationCode}出库流程", $"获取出库任务成功开始向plc写入命令,托盘条码:{dt_Task.PalletCode},taskno:{taskno}------ack:{ack}");
                                        WebResponseContent contentweb = _taskService.UpdateTaskIninfo(conveyorLineInfoRead.Barcode,item.StationCode); //根据条码跟设备编号去查询并修改任务
                                        WriteLog.Write_Log("1-3-4-5出入库流程", $"{item.StationCode}入库流程", $"向plc写入成功开始修改任务,托盘条码:{dt_Task.PalletCode},修改任务是否成功{contentweb.Status}");
                                        if (contentweb.Status)
                                        {
                                            device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                            device.SetValue(W_ConveyorLineDB.TaskNo,1, item.StationCode);
                                        }
                                    }
                                }
@@ -136,11 +150,11 @@
                                            if (deviceProRead != null)
                                            {
                                                R_ConveyorLineInfo conveyorLineInfoRead2 = device.Communicator.ReadCustomer<R_ConveyorLineInfo>(deviceProRead.DeviceProAddress);
                                                ConveyorLineSignal conveyorLineSignalRead2 = conveyorLineInfoRead2.Signal.ByteToBoolObject<ConveyorLineSignal>();
                                                R_ConveyorLineStatus conveyorLineStatus2 = conveyorLineInfoRead2.Status.ByteToBoolObject<R_ConveyorLineStatus>();
                                                if (!conveyorLineSignalRead2.STB && !conveyorLineSignalRead2.ACK && conveyorLineStatus.Online && conveyorLineStatus2.Free && !conveyorLineStatus2.Goods && !conveyorLineStatus2.Alarm && !STB && !ACK)//判断出库口是否空闲
                                                {
                                                    Dt_StationManger? stationManger = stationMangers.FirstOrDefault(x => x.StationCode == item.StationCode);
@@ -155,53 +169,87 @@
                                        }
                                    }
                                }*/
                                Dt_Task dt_Tas = _taskService.GetOutTaskInfo(item.StationCode);  //获取出库任务
                                if (dt_Tas != null)
                                {
                                    WriteLog.Write_Log("1-3-4-5出库流程", $"{item.StationCode}出库流程", $"获取出库任务,托盘条码:{dt_Tas.PalletCode}", new
                                    {
                                        å–反conveyorLineSignalReadSTB = !conveyorLineSignalRead.STB,
                                        å–反conveyorLineSignalReadACK = !conveyorLineSignalRead.ACK,
                                        è”机conveyorLineStatusOnline = conveyorLineStatus.Online,
                                        æœ‰æ— è´§conveyorLineStatusGoods = conveyorLineStatus.Goods,
                                        æ•…障或正常取反conveyorLineStatusAlarm = !conveyorLineStatus.Alarm,
                                        å–反本地STB = !STB,
                                        å–反本地ACK = !ACK
                                    });
                                }
                                else if (!conveyorLineSignalRead.STB && !conveyorLineSignalRead.ACK && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !STB && !ACK)//其他楼层出库
                                {
                                    
                                    Dt_Task dt_Ta = _taskService.GetOutTaskInfo(item.StationCode);  //获取出库任务
                                    WriteLog.Write_Log("1-3-4-5出库流程",$"{item.StationCode}出库流程",$"获取出库任务,托盘条码:{dt_Ta.PalletCode}",dt_Ta);
                                    if (dt_Ta != null)
                                    {
                                        device.SetValue(W_ConveyorLineDB.TaskNo, dt_Ta.TaskNum, item.StationCode);
                                        device.SetValue(W_ConveyorLineDB.EndPos, dt_Ta.OutboundPlatform, item.StationCode);
                                        device.SetValue(W_ConveyorLineDB.STB, true, item.StationCode);
                                        //堆垛机任务完成下一地址改成输送线下一地址,设备编号改成输送线
                                        _taskService.UpdateTaskStatusToNext(dt_Ta.TaskNum);
                                        bool taskno = device.SetValue(W_ConveyorLineDB.TaskNo, dt_Ta.TaskNum, item.StationCode);
                                        bool endpos = device.SetValue(W_ConveyorLineDB.EndPos, dt_Ta.OutboundPlatform, item.StationCode);
                                        bool stb = device.SetValue(W_ConveyorLineDB.STB, true, item.StationCode);
                                        WriteLog.Write_Log("1-3-4-5出库流程", $"{item.StationCode}出库流程",$"获取出库任务成功开始向plc写入命令,托盘条码:{dt_Ta.PalletCode},taskno:{taskno}------endpos:{endpos}--------stb:{stb}");
                                        if (dt_Ta.TargetAddress !="2021" && dt_Ta.TargetAddress != "2020")
                                        {
                                            //删除任务
                                            _taskRepository.DeleteData(dt_Ta);
                                        if (taskno && endpos && stb)
                                            {
                                            //堆垛机任务完成下一地址改成输送线下一地址,设备编号改成输送线
                                            WebResponseContent webResponse = _taskService.UpdateTaskStatusToNext(dt_Ta.TaskNum);
                                             WriteLog.Write_Log("1-3-4-5出库流程",$"{item.StationCode}出库流程",$"向plc写入成功开始修改任务,托盘条码:{dt_Ta.PalletCode},修改任务是否成功{webResponse.Status}");
                                            if (webResponse.Status)
                                            {
                                                if (dt_Ta.TargetAddress != "2021" && dt_Ta.TargetAddress != "2020")
                                                {
                                                    //删除任务
                                                    bool res = _taskRepository.DeleteData(dt_Ta);
                                                    WriteLog.Write_Log("1-3-4-5出库流程", $"{item.StationCode}出库流程",$"修改任务成功开始删除任务,托盘条码:{dt_Ta.PalletCode},删除任务是否成功{res}");
                                                    if (res)
                                                    {
                                                    _taskHtyService.AddTaskHistory(dt_Ta, "自动完成");
                                                    }
                                                }
                                            }
                                        }
                                        
                                    }
                                }
                                else if (!conveyorLineSignalRead.STB && conveyorLineSignalRead.ACK && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && STB && !ACK)
                                {
                                    device.SetValue(W_ConveyorLineDB.STB, false, item.StationCode);
                                }//清楚确认信号
                            }
                            //入库站台
                            else if (item.StationType == StationTypeEnum.StationType_OnlyInbound.ObjToInt()) //2014交互口
                            {
                            {
                                if (conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && !ACK)
                                {
                                    if (conveyorLineInfoRead.TaskNo == 0 && !string.IsNullOrEmpty(conveyorLineInfoRead.Barcode))//采购入库
                                    Dt_Task dt_Task = _taskService.GetTaskIninfo(conveyorLineInfoRead.Barcode);
                                    WriteLog.Write_Log("2楼入库流程", $"{item.StationCode}入库流程", $"托盘条码:{dt_Task.PalletCode},任务{dt_Task}");
                                    if (conveyorLineInfoRead.TaskNo == 0 && !string.IsNullOrEmpty(conveyorLineInfoRead.Barcode)&& dt_Task != null)//采购入库
                                    {
                                        Dt_Task dt_Ta = _taskService.GetTaskIninfo(conveyorLineInfoRead.Barcode); //通过条码去查询任务
                                        if(dt_Ta != null)
                                        if (dt_Ta != null)
                                        {
                                            device.SetValue(W_ConveyorLineDB.EndPos, dt_Ta.SourceAddress, item.StationCode);
                                            device.SetValue(W_ConveyorLineDB.TaskNo, dt_Ta.TaskNum, item.StationCode);
                                            device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                            bool endpos = device.SetValue(W_ConveyorLineDB.EndPos, dt_Ta.SourceAddress, item.StationCode);
                                            bool taskno = device.SetValue(W_ConveyorLineDB.TaskNo, dt_Ta.TaskNum, item.StationCode);
                                            bool ack = device.SetValue(W_ConveyorLineDB.ACK, true, item.StationCode);
                                            WriteLog.Write_Log("2楼入库流程", $"{item.StationCode}入库流程", $"获取入库任务成功开始向plc写入命令,托盘条码:{dt_Ta.PalletCode},taskno:{taskno}------endpos:{endpos}--------ack:{ack}");
                                        }
                                       
                                    }
                                }
                                if (!conveyorLineSignalRead.STB && conveyorLineStatus.Online && conveyorLineStatus.Goods && !conveyorLineStatus.Alarm && ACK)
                                {
@@ -210,18 +258,38 @@
                            }
                            }
                        }
                    }
                catch (Exception ex)
                {
                    //throw;
                }
            }
            return Task.CompletedTask;
        }
        //获取拣选状态有无货状态
        public static bool GetPick()
        {
            //bool IsOccupied2008 = device.GetValue<W_ConveyorLineDB, bool>(W_ConveyorLineDB.IsOccupied, "2008");
            //bool IsOccupied2009 = device.GetValue<W_ConveyorLineDB, bool>(W_ConveyorLineDB.IsOccupied, "2009");
            //bool IsOccupied2015 = device.GetValue<W_ConveyorLineDB, bool>(W_ConveyorLineDB.IsOccupied, "2015");
            //bool IsOccupied2016 = device.GetValue<W_ConveyorLineDB, bool>(W_ConveyorLineDB.IsOccupied, "2016");
            ////判断是否成立
            //if (IsOccupied2008&&IsOccupied2009&&IsOccupied2015&&IsOccupied2016)
            //{
            //    return false;
            //}
            //else
            //{
            //    return true;
            //}
            return true;
        }
    }
}
}