陈勇
2026-03-10 fc9cba5f058089887aa7061d2e6b4006b9e04a9a
ÏîÄ¿´úÂë/WMS/WMSServer/WIDESEA_StorageTaskServices/AutoTask/AspNetCoreSchedule.cs
@@ -1,7 +1,9 @@
using Masuit.Tools;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.Const;
using WIDESEA_DTO.WMS;
using WIDESEA_IServices;
@@ -13,36 +15,27 @@
{
    public class MyBackgroundService : IHostedService, IDisposable
    {
        private readonly ILogger<MyBackgroundService> _logger;
        private readonly IDt_PalletStockInfoRepository _palletStockInfoRepository;
        private readonly IDt_AreaInfoRepository _areaInfoRepository; //区域
        private readonly IDt_TaskRepository _taskRepository;
        private readonly IDt_StationManagerRepository _stationManagerRepository;
        private readonly ISys_ConfigService _configService;
        private readonly ILocationInfoRepository _locationRepository;
        private readonly IVV_StockInfoRepository _VVStockInfoRepository;
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IDt_MESLockInfoRepository _MESLockInfoRepository;
        private ILogger<MyBackgroundService> _logger;
        private IDt_PalletStockInfoRepository _palletStockInfoRepository;
        private IDt_AreaInfoRepository _areaInfoRepository; //区域
        private IDt_TaskRepository _taskRepository;
        private IDt_StationManagerRepository _stationManagerRepository;
        private ISys_ConfigService _configService;
        private ILocationInfoRepository _locationRepository;
        private IVV_StockInfoRepository _VVStockInfoRepository;
        private IUnitOfWorkManage _unitOfWorkManage;
        private IDt_MESLockInfoRepository _MESLockInfoRepository;
        private Timer _timer;
        public MyBackgroundService(ILogger<MyBackgroundService> logger, ILocationInfoRepository locationRepository, IDt_AreaInfoRepository areaInfoRepository, IDt_TaskRepository taskRepository, IDt_StationManagerRepository stationManagerRepository, ISys_ConfigService configService, IDt_PalletStockInfoRepository palletStockInfoRepository, IVV_StockInfoRepository VV_StockInfoRepository, IUnitOfWorkManage unitOfWorkManage, IDt_MESLockInfoRepository MESLockInfoRepository)
        public MyBackgroundService(/*ILogger<MyBackgroundService> logger, ILocationInfoRepository locationRepository, IDt_AreaInfoRepository areaInfoRepository, IDt_TaskRepository taskRepository, IDt_StationManagerRepository stationManagerRepository, ISys_ConfigService configService, IDt_PalletStockInfoRepository palletStockInfoRepository, IVV_StockInfoRepository VV_StockInfoRepository, IUnitOfWorkManage unitOfWorkManage, IDt_MESLockInfoRepository MESLockInfoRepository*/)
        {
            _logger = logger;
            _locationRepository = locationRepository;
            _areaInfoRepository = areaInfoRepository;
            _taskRepository = taskRepository;
            _stationManagerRepository = stationManagerRepository;
            _configService = configService;
            _palletStockInfoRepository = palletStockInfoRepository;
            _VVStockInfoRepository = VV_StockInfoRepository;
            _unitOfWorkManage = unitOfWorkManage;
            _MESLockInfoRepository = MESLockInfoRepository;
        }
        public Task StartAsync(CancellationToken cancellationToken)
        {
            _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromMinutes(5));
            //_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(15));
            return Task.CompletedTask;
        }
@@ -50,6 +43,17 @@
        {
            try
            {
                IServiceScope scope = App.RootServices.CreateScope();
                _logger = scope.ServiceProvider.GetService<ILogger<MyBackgroundService>>();
                _locationRepository = scope.ServiceProvider.GetService<ILocationInfoRepository>();
                _areaInfoRepository = scope.ServiceProvider.GetService<IDt_AreaInfoRepository>();
                _taskRepository = scope.ServiceProvider.GetService<IDt_TaskRepository>();
                _stationManagerRepository = scope.ServiceProvider.GetService<IDt_StationManagerRepository>();
                _configService = scope.ServiceProvider.GetService<ISys_ConfigService>();
                _palletStockInfoRepository = scope.ServiceProvider.GetService<IDt_PalletStockInfoRepository>();
                _VVStockInfoRepository = scope.ServiceProvider.GetService<IVV_StockInfoRepository>();
                _unitOfWorkManage = scope.ServiceProvider.GetService<IUnitOfWorkManage>();
                _MESLockInfoRepository = scope.ServiceProvider.GetService<IDt_MESLockInfoRepository>();
                //var area = _areaInfoRepository.QueryFirst(x => x.AreaCode == "GWSC1");
                //if (area == null) { return; }
@@ -69,107 +73,198 @@
                if (lockInfo.Where(x => x.LockStatue == 1).Count() > 10) return;
                if (lockInfo.Count == 0) return;
                var lockCar = lockInfo.Where(x => x.LockStatue == 0).First();
                foreach (var item in lockInfo)
                var lockCar = lockInfo.Where(x => x.LockStatue == 0).FirstOrDefault();
                if (lockCar == null) return;
                var hasTask = _taskRepository.QueryFirst(x => x.PalletCode == lockCar.CarBodyInfo.PalletCode);
                if (hasTask != null)
                {
                    var hasTask = _taskRepository.QueryFirst(x => x.PalletCode == item.CarBodyInfo.PalletCode);
                    if (hasTask != null)
                    {
                        Console.WriteLine("已存在出库任务");
                        continue;
                    }
                    List<Dt_StationManager> stationLists = null;
                    if (item.CarBodyInfo.CarType == 1)
                    {
                        stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == item.TCLine && x.stationType == 2 && x.stationStatus == "1" && x.stationArea == "3");
                    }
                    else if (item.CarBodyInfo.CarType == 2)
                    {
                        stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == item.TCLine && x.stationType == 2 && x.stationStatus == "1" && x.stationArea == "4");
                    }
                    //else if (item.CarBodyInfo.CarType == 3)
                    //{
                    //    stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == item.TCLine && x.stationType == 7 && x.stationStatus == "1" && x.stationArea == "3");
                    //}
                    var stock = _VVStockInfoRepository.QueryFirst(x => x.carBodyID == item.carBodyID);
                    var lockStock = _palletStockInfoRepository.QueryFirst(x => x.carBodyID == item.carBodyID);
                    var location = _locationRepository.QueryFirst(x => x.LocationCode == stock.LocationCode);
                    location.LocationStatus = (int)LocationEnum.InStockDisable;
                    item.LockStatue = 1;
                    lockStock.TaskStatus = 1;
                    if (stationLists == null || stationLists.Count == 0) throw new Exception("出库站台未配置或未启用");
                    Dt_StationManager Outstation = null;
                    //if (stationLists.Count > 1)
                    //{
                    //    var Outtask = BaseDal.QueryData(x => x.Roadway == stationLists.FirstOrDefault().Roadway && x.TaskType == (int)TaskTypeEnum.Outbound).OrderByDescending(x => x.CreateDate).FirstOrDefault();
                    //    if (Outtask != null) Outstation = stationLists.Where(x => x.stationChildCode != task.NextAddress && x.stationChildCode != Outtask.CurrentAddress).FirstOrDefault();
                    //    else Outstation = stationLists.FirstOrDefault();
                    //}
                    //else
                    //{
                    Outstation = stationLists.FirstOrDefault();
                    //}
                    //var stationInfo = stationInfos.FirstOrDefault();
                    // åˆ›å»ºå¹¶æ·»åŠ ä»»åŠ¡åˆ°æ•°æ®åº“
                    hasTask = new Dt_Task
                    {
                        Grade = 1,
                        Roadway = Outstation.Roadway,
                        TargetAddress = "RB043",
                        Dispatchertime = DateTime.Now,
                        NextAddress = Outstation.stationChildCode,
                        OrderNo = null,
                        PalletCode = stock.PalletCode,
                        PVI = stock.PVI,
                        SourceAddress = stock.LocationCode,
                        CurrentAddress = stock.LocationCode,
                        TaskState = (int)TaskOutStatusEnum.OutNew,
                        TaskType = (int)TaskOutboundTypeEnum.Outbound,
                        TaskNum = _taskRepository.GetTaskNo().Result,
                        Creater = "System",
                        CreateDate = DateTime.Now,
                        TaskId = 0,
                    };
                    // åˆ›å»ºä»»åŠ¡ä¼ è¾“ç”¨çš„DTO对象
                    var taskDTO = CreateTaskDTO(hasTask);
                    // èŽ·å–WMS IP地址用于发送任务请求
                    var wmsIpAddress = GetWCSIpReceiveTask();
                    if (wmsIpAddress == null)
                    {
                        throw new InvalidOperationException("WMS IP æœªé…ç½®");
                    }
                    var tasks = new List<WMSTaskDTO>() { taskDTO };
                    // å‘送任务请求到WMS
                    var result = HttpHelper.PostAsync(wmsIpAddress, tasks.ToJsonString()).Result;
                    WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result);
                    if (content.Status)
                    {
                        _unitOfWorkManage.BeginTran();
                        // æ·»åŠ ä»»åŠ¡åˆ°æ•°æ®åº“
                        _taskRepository.AddData(hasTask);
                        // æ›´æ–°åº“位位置状态为不可用
                        _locationRepository.UpdateData(location);
                        _MESLockInfoRepository.UpdateData(item);
                        _palletStockInfoRepository.UpdateData(lockStock);
                        _unitOfWorkManage.CommitTran();
                    }
                    Console.WriteLine("已存在出库任务");
                    return;
                }
                List<Dt_StationManager> stationLists = null;
                if (lockCar.CarBodyInfo.CarType == 1)
                {
                    stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == lockCar.TCLine && x.stationType == 2 && x.stationStatus == "1" && x.stationArea == "3");
                }
                else if (lockCar.CarBodyInfo.CarType == 2)
                {
                    stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == lockCar.TCLine && x.stationType == 2 && x.stationStatus == "1" && x.stationArea == "4");
                }
                //else if (item.CarBodyInfo.CarType == 3)
                //{
                //    stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == item.TCLine && x.stationType == 7 && x.stationStatus == "1" && x.stationArea == "3");
                //}
                var stock = _VVStockInfoRepository.QueryFirst(x => x.carBodyID == lockCar.carBodyID);
                var lockStock = _palletStockInfoRepository.QueryFirst(x => x.carBodyID == lockCar.carBodyID);
                var location = _locationRepository.QueryFirst(x => x.LocationCode == stock.LocationCode);
                location.LocationStatus = (int)LocationEnum.InStockDisable;
                lockCar.LockStatue = 1;
                lockStock.TaskStatus = 1;
                if (stationLists == null || stationLists.Count == 0) throw new Exception("出库站台未配置或未启用");
                Dt_StationManager Outstation = null;
                //if (stationLists.Count > 1)
                //{
                //    var Outtask = BaseDal.QueryData(x => x.Roadway == stationLists.FirstOrDefault().Roadway && x.TaskType == (int)TaskTypeEnum.Outbound).OrderByDescending(x => x.CreateDate).FirstOrDefault();
                //    if (Outtask != null) Outstation = stationLists.Where(x => x.stationChildCode != task.NextAddress && x.stationChildCode != Outtask.CurrentAddress).FirstOrDefault();
                //    else Outstation = stationLists.FirstOrDefault();
                //}
                //else
                //{
                Outstation = stationLists.FirstOrDefault();
                //}
                //var stationInfo = stationInfos.FirstOrDefault();
                // åˆ›å»ºå¹¶æ·»åŠ ä»»åŠ¡åˆ°æ•°æ®åº“
                hasTask = new Dt_Task
                {
                    Grade = 1,
                    Roadway = Outstation.Roadway,
                    TargetAddress = "RB043",
                    Dispatchertime = DateTime.Now,
                    NextAddress = Outstation.stationChildCode,
                    OrderNo = null,
                    PalletCode = stock.PalletCode,
                    PVI = stock.PVI,
                    SourceAddress = stock.LocationCode,
                    CurrentAddress = stock.LocationCode,
                    TaskState = (int)TaskOutStatusEnum.OutNew,
                    TaskType = (int)TaskOutboundTypeEnum.Outbound,
                    TaskNum = _taskRepository.GetTaskNo().Result,
                    Creater = "System",
                    CreateDate = DateTime.Now,
                    TaskId = 0,
                };
                // åˆ›å»ºä»»åŠ¡ä¼ è¾“ç”¨çš„DTO对象
                var taskDTO = CreateTaskDTO(hasTask);
                // èŽ·å–WMS IP地址用于发送任务请求
                var wmsIpAddress = GetWCSIpReceiveTask();
                if (wmsIpAddress == null)
                {
                    throw new InvalidOperationException("WMS IP æœªé…ç½®");
                }
                var tasks = new List<WMSTaskDTO>() { taskDTO };
                // å‘送任务请求到WMS
                var result = HttpHelper.PostAsync(wmsIpAddress, tasks.ToJsonString()).Result;
                WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result);
                if (content.Status)
                {
                    _unitOfWorkManage.BeginTran();
                    // æ·»åŠ ä»»åŠ¡åˆ°æ•°æ®åº“
                    _taskRepository.AddData(hasTask);
                    // æ›´æ–°åº“位位置状态为不可用
                    _locationRepository.UpdateData(location);
                    _MESLockInfoRepository.UpdateData(lockCar);
                    _palletStockInfoRepository.UpdateData(lockStock);
                    _unitOfWorkManage.CommitTran();
                }
                //foreach (var item in lockInfo)
                //{
                //    var hasTask = _taskRepository.QueryFirst(x => x.PalletCode == item.CarBodyInfo.PalletCode);
                //    if (hasTask != null)
                //    {
                //        Console.WriteLine("已存在出库任务");
                //        continue;
                //    }
                //    List<Dt_StationManager> stationLists = null;
                //    if (item.CarBodyInfo.CarType == 1)
                //    {
                //        stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == item.TCLine && x.stationType == 2 && x.stationStatus == "1" && x.stationArea == "3");
                //    }
                //    else if (item.CarBodyInfo.CarType == 2)
                //    {
                //        stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == item.TCLine && x.stationType == 2 && x.stationStatus == "1" && x.stationArea == "4");
                //    }
                //    //else if (item.CarBodyInfo.CarType == 3)
                //    //{
                //    //    stationLists = _stationManagerRepository.QueryData(x => x.RoadwayNo == item.TCLine && x.stationType == 7 && x.stationStatus == "1" && x.stationArea == "3");
                //    //}
                //    var stock = _VVStockInfoRepository.QueryFirst(x => x.carBodyID == item.carBodyID);
                //    var lockStock = _palletStockInfoRepository.QueryFirst(x => x.carBodyID == item.carBodyID);
                //    var location = _locationRepository.QueryFirst(x => x.LocationCode == stock.LocationCode);
                //    location.LocationStatus = (int)LocationEnum.InStockDisable;
                //    item.LockStatue = 1;
                //    lockStock.TaskStatus = 1;
                //    if (stationLists == null || stationLists.Count == 0) throw new Exception("出库站台未配置或未启用");
                //    Dt_StationManager Outstation = null;
                //    //if (stationLists.Count > 1)
                //    //{
                //    //    var Outtask = BaseDal.QueryData(x => x.Roadway == stationLists.FirstOrDefault().Roadway && x.TaskType == (int)TaskTypeEnum.Outbound).OrderByDescending(x => x.CreateDate).FirstOrDefault();
                //    //    if (Outtask != null) Outstation = stationLists.Where(x => x.stationChildCode != task.NextAddress && x.stationChildCode != Outtask.CurrentAddress).FirstOrDefault();
                //    //    else Outstation = stationLists.FirstOrDefault();
                //    //}
                //    //else
                //    //{
                //    Outstation = stationLists.FirstOrDefault();
                //    //}
                //    //var stationInfo = stationInfos.FirstOrDefault();
                //    // åˆ›å»ºå¹¶æ·»åŠ ä»»åŠ¡åˆ°æ•°æ®åº“
                //    hasTask = new Dt_Task
                //    {
                //        Grade = 1,
                //        Roadway = Outstation.Roadway,
                //        TargetAddress = "RB043",
                //        Dispatchertime = DateTime.Now,
                //        NextAddress = Outstation.stationChildCode,
                //        OrderNo = null,
                //        PalletCode = stock.PalletCode,
                //        PVI = stock.PVI,
                //        SourceAddress = stock.LocationCode,
                //        CurrentAddress = stock.LocationCode,
                //        TaskState = (int)TaskOutStatusEnum.OutNew,
                //        TaskType = (int)TaskOutboundTypeEnum.Outbound,
                //        TaskNum = _taskRepository.GetTaskNo().Result,
                //        Creater = "System",
                //        CreateDate = DateTime.Now,
                //        TaskId = 0,
                //    };
                //    // åˆ›å»ºä»»åŠ¡ä¼ è¾“ç”¨çš„DTO对象
                //    var taskDTO = CreateTaskDTO(hasTask);
                //    // èŽ·å–WMS IP地址用于发送任务请求
                //    var wmsIpAddress = GetWCSIpReceiveTask();
                //    if (wmsIpAddress == null)
                //    {
                //        throw new InvalidOperationException("WMS IP æœªé…ç½®");
                //    }
                //    var tasks = new List<WMSTaskDTO>() { taskDTO };
                //    // å‘送任务请求到WMS
                //    var result = HttpHelper.PostAsync(wmsIpAddress, tasks.ToJsonString()).Result;
                //    WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result);
                //    if (content.Status)
                //    {
                //        _unitOfWorkManage.BeginTran();
                //        // æ·»åŠ ä»»åŠ¡åˆ°æ•°æ®åº“
                //        _taskRepository.AddData(hasTask);
                //        // æ›´æ–°åº“位位置状态为不可用
                //        _locationRepository.UpdateData(location);
                //        _MESLockInfoRepository.UpdateData(item);
                //        _palletStockInfoRepository.UpdateData(lockStock);
                //        _unitOfWorkManage.CommitTran();
                //    }
                //}
            }
            catch (Exception ex)
            {
                ConsoleHelper.WriteErrorLine($",错误信息:" + ex.Message);
                ConsoleHelper.WriteErrorLine($"拉动锁车出车错误信息:" + ex.Message);
            }
            ConsoleHelper.WriteSuccessLine($":" + DateTime.Now.ToString());
            ConsoleHelper.WriteSuccessLine($"拉动锁车:" + DateTime.Now.ToString());
        }
        public Task StopAsync(CancellationToken cancellationToken)