using Masuit.Tools;
|
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.Logging;
|
using Quartz;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Core.Const;
|
using WIDESEA_DTO.WMS;
|
using WIDESEA_IServices;
|
using WIDESEAWCS_BasicInfoRepository;
|
using WIDESEAWCS_Model.Models;
|
|
namespace WIDESEA_StorageTaskServices
|
{
|
[DisallowConcurrentExecution]
|
public class BackgroundJob : IJob
|
{
|
private ILogger<BackgroundJob> _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;
|
|
public BackgroundJob(ILogger<BackgroundJob> logger, IDt_PalletStockInfoRepository palletStockInfoRepository, IDt_AreaInfoRepository areaInfoRepository, IDt_TaskRepository taskRepository, IDt_StationManagerRepository stationManagerRepository, ISys_ConfigService configService, ILocationInfoRepository locationRepository, IVV_StockInfoRepository vVStockInfoRepository, IUnitOfWorkManage unitOfWorkManage, IDt_MESLockInfoRepository mESLockInfoRepository)
|
{
|
_logger = logger;
|
_palletStockInfoRepository = palletStockInfoRepository;
|
_areaInfoRepository = areaInfoRepository;
|
_taskRepository = taskRepository;
|
_stationManagerRepository = stationManagerRepository;
|
_configService = configService;
|
_locationRepository = locationRepository;
|
_VVStockInfoRepository = vVStockInfoRepository;
|
_unitOfWorkManage = unitOfWorkManage;
|
_MESLockInfoRepository = mESLockInfoRepository;
|
}
|
|
public Task Execute(IJobExecutionContext context)
|
{
|
try
|
{
|
//总装不生产 则停止拉动出库
|
var area = _areaInfoRepository.QueryFirst(x => x.AreaCode == "5");
|
if (area.AreaStatus != 1l) { return Task.CompletedTask; }
|
|
var lockInfo = _palletStockInfoRepository.Db.Queryable<Dt_MESLockInfo>()
|
//.Where(x => x.LockStatue == 0)
|
.Includes(x => x.CarBodyInfo)
|
.OrderBy(x => x.sequenceNo) // 排序
|
.ToList(); // 获取第一个元素
|
|
if (lockInfo.Where(x => x.LockStatue == 1).Count() > 10) return Task.CompletedTask;
|
if (lockInfo.Count == 0) return Task.CompletedTask;
|
|
var lockCar = lockInfo.Where(x => x.LockStatue == 0).FirstOrDefault();
|
if (lockCar == null) return Task.CompletedTask;
|
var hasTask = _taskRepository.QueryFirst(x => x.PalletCode == lockCar.CarBodyInfo.PalletCode);
|
if (hasTask != null)
|
{
|
Console.WriteLine("已存在出库任务");
|
return Task.CompletedTask;
|
}
|
|
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 = 3,
|
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,
|
CarType = stock.CarType,
|
};
|
|
// 创建任务传输用的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();
|
}
|
|
#region 集合
|
//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();
|
// }
|
//}
|
#endregion
|
}
|
catch (Exception ex)
|
{
|
ConsoleHelper.WriteErrorLine($"拉动锁车出车错误信息:" + ex.Message);
|
}
|
finally
|
{
|
ConsoleHelper.WriteSuccessLine($"拉动锁车:" + DateTime.Now.ToString());
|
}
|
|
return Task.CompletedTask;
|
}
|
|
/// <summary>
|
/// 创建任务DTO
|
/// </summary>
|
private WMSTaskDTO CreateTaskDTO(Dt_Task task)
|
{
|
return new WMSTaskDTO
|
{
|
TaskNum = task.TaskNum.Value,
|
Grade = task.Grade.Value,
|
PalletCode = task.PalletCode,
|
RoadWay = task.Roadway,
|
SourceAddress = task.SourceAddress,
|
TargetAddress = task.TargetAddress,
|
TaskState = task.TaskState.Value,
|
Id = 0,
|
TaskType = task.TaskType,
|
pvi = task.PVI,
|
NextAddress = task.NextAddress,
|
CarType = task.CarType
|
};
|
}
|
|
private string GetWCSIpReceiveTask()
|
{
|
var configs = _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
|
var wmsBase = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.WCSIPAddress)?.ConfigValue;
|
var ipAddress = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.ReceiveTask)?.ConfigValue;
|
if (wmsBase == null || ipAddress == null)
|
{
|
return null;
|
}
|
return wmsBase + ipAddress;
|
}
|
}
|
}
|