You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
8.7 KiB
205 lines
8.7 KiB
3 months ago
|
using AutoMapper;
|
||
|
using Kean.Domain.Task.Commands;
|
||
|
using Kean.Domain.Task.Enums;
|
||
|
using Kean.Domain.Task.Events;
|
||
|
using Kean.Domain.Task.Models;
|
||
|
using Kean.Domain.Task.Repositories;
|
||
|
using Kean.Domain.Task.SharedServices.Proxies;
|
||
|
using Kean.Infrastructure.Configuration;
|
||
|
using Newtonsoft.Json.Linq;
|
||
|
using System;
|
||
|
using System.Linq;
|
||
|
using System.Threading;
|
||
|
|
||
|
namespace Kean.Domain.Task.CommandHandlers
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// 创建输送命令处理程序
|
||
|
/// </summary>
|
||
|
public sealed class BypassHithumCommandHandler : CommandHandler<BypassHithumCommand>
|
||
|
{
|
||
|
private readonly ICommandBus _commandBus; // 命令总线
|
||
|
private readonly INotification _notifications; // 总线通知
|
||
|
private readonly IMapper _mapper; // 模型映射
|
||
|
private readonly ITaskRepository _taskRepository; // 任务仓库
|
||
|
private readonly IWarehouseRepository _warehouseRepository; // 库房仓库
|
||
|
private readonly BarcodeInterpreter _barcodeInterpreter; // 条码解释器
|
||
|
private readonly BarcodeValidator _barcodeValidator; // 条码验证器
|
||
|
private readonly StockProxy _stockProxy; // 仓储域代理
|
||
|
|
||
|
/// <summary>
|
||
|
/// 依赖注入
|
||
|
/// </summary>
|
||
|
public BypassHithumCommandHandler(
|
||
|
ICommandBus commandBus,
|
||
|
INotification notifications,
|
||
|
IMapper mapper,
|
||
|
ITaskRepository taskRepository,
|
||
|
IWarehouseRepository warehouseRepository,
|
||
|
BarcodeInterpreter barcodeInterpreter,
|
||
|
BarcodeValidator barcodeValidator,
|
||
|
StockProxy stockProxy)
|
||
|
{
|
||
|
_commandBus = commandBus;
|
||
|
_notifications = notifications;
|
||
|
_mapper = mapper;
|
||
|
_taskRepository = taskRepository;
|
||
|
_warehouseRepository = warehouseRepository;
|
||
|
_barcodeInterpreter = barcodeInterpreter;
|
||
|
_barcodeValidator = barcodeValidator;
|
||
|
_stockProxy = stockProxy;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 处理程序
|
||
|
/// </summary>
|
||
|
public override async System.Threading.Tasks.Task Handle(BypassHithumCommand command, CancellationToken cancellationToken)
|
||
|
{
|
||
|
if (command.ValidationResult.IsValid)
|
||
|
{
|
||
|
// 条码格式校验
|
||
|
if (!await _barcodeValidator.Validate(command.Barcode))
|
||
|
{
|
||
|
await _commandBus.Notify(nameof(command.Barcode), "条码格式不正确", command.Barcode,
|
||
|
cancellationToken: cancellationToken);
|
||
|
return;
|
||
|
}
|
||
|
// 任务重复
|
||
|
if (await _taskRepository.HasTask(command.Barcode))
|
||
|
{
|
||
|
await _commandBus.Notify(nameof(command.Barcode), "托盘正在执行任务", command.Barcode,
|
||
|
cancellationToken: cancellationToken);
|
||
|
return;
|
||
|
}
|
||
|
var pallet = await _barcodeInterpreter.Interpret(command.Barcode);
|
||
|
// 不允许操作立库中的库存
|
||
|
var cell = await _stockProxy.GetCell(command.Barcode);
|
||
|
if (cell.HasValue && await _warehouseRepository.IsCell(cell.Value) == true)
|
||
|
{
|
||
|
await _commandBus.Notify(nameof(command.Barcode), "不允许操作立库中的库存", command.Barcode,
|
||
|
cancellationToken: cancellationToken);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// 获取操作位置
|
||
|
var original = command.Original switch
|
||
|
{
|
||
|
int i => await _warehouseRepository.GetStationById(i),
|
||
|
long i => await _warehouseRepository.GetStationById((int)i),
|
||
|
string s when s.StartsWith("name:") => await _warehouseRepository.GetStationByName(s[5..], command.Warehouse),
|
||
|
string s when s.StartsWith("device:") => await _warehouseRepository.GetStationByDevice(s[7..], command.Warehouse),
|
||
|
Station s => s,
|
||
|
_ => null
|
||
|
};
|
||
|
// 操作位置可用性
|
||
|
//if (original.AllowIn != true
|
||
|
// || original.Pallet?.Contains(pallet) == false
|
||
|
// || original.Spec?.Adaptive(command.Spec) == false)
|
||
|
//{
|
||
|
// await _commandBus.Notify(nameof(command.Original), "操作位置不正确", command.Original,
|
||
|
// cancellationToken: cancellationToken);
|
||
|
// return;
|
||
|
//}
|
||
|
//校验 托盘规则与申请位置是否匹配
|
||
|
Models.Warehouse warehouse = await _warehouseRepository.GetWarehouse(original.Warehouse);
|
||
|
if (!warehouse.Code.Contains(command.Barcode.Substring(2, 1)))
|
||
|
{
|
||
|
await _commandBus.Notify(nameof(command.Barcode), $"托盘({command.Barcode})不能进入({warehouse.Name})库房", command.Barcode,
|
||
|
cancellationToken: cancellationToken);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//获取库存信息
|
||
|
string bypassTag = await _taskRepository.GetBypassTag(command.Barcode);
|
||
|
|
||
|
string isAgv = string.Empty;
|
||
|
string slTarget = string.Empty;
|
||
|
int bypassArea = 0;
|
||
|
string postUser = string.Empty;
|
||
|
string Transaction = "Bypass";
|
||
|
|
||
|
//@=@
|
||
|
int Operator = -4;
|
||
|
string requestNo = string.Empty;
|
||
|
|
||
|
if (!string.IsNullOrEmpty(bypassTag))
|
||
|
{
|
||
|
command.Tag = bypassTag;
|
||
|
JObject jObj = JObject.Parse(bypassTag);
|
||
|
|
||
|
JToken isAgvFlg = jObj.SelectToken("isAgv");
|
||
|
if (isAgvFlg != null)
|
||
|
{
|
||
|
isAgv = jObj["isAgv"].ToString();
|
||
|
}
|
||
|
JToken slTargetFlg = jObj.SelectToken("slTarget");
|
||
|
if (slTargetFlg != null)
|
||
|
{
|
||
|
slTarget = jObj["slTarget"].ToString();
|
||
|
}
|
||
|
JToken bypassAreaFlg = jObj.SelectToken("BypassArea");
|
||
|
if (bypassAreaFlg != null)
|
||
|
{
|
||
|
bypassArea = Convert.ToInt32(jObj["BypassArea"]);
|
||
|
}
|
||
|
JToken postUserFlg = jObj.SelectToken("postUser");
|
||
|
if (postUserFlg != null)
|
||
|
{
|
||
|
postUser = jObj["postUser"].ToString();
|
||
|
}
|
||
|
JToken requestNoFlg = jObj.SelectToken("requestNo");
|
||
|
if (requestNoFlg != null)
|
||
|
{
|
||
|
requestNo = Convert.ToString(jObj["requestNo"]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
// 获取目标位置
|
||
|
var destination = await _warehouseRepository.GetStationById(29101);
|
||
|
if (destination == null)
|
||
|
{
|
||
|
await _commandBus.Notify("Destination", $"输送终点区域未知({bypassArea})", bypassArea,
|
||
|
cancellationToken: cancellationToken);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
command.Original = original.Id;
|
||
|
command.Destination = destination.Id;
|
||
|
|
||
|
// 时间戳
|
||
|
command.Timestamp ??= DateTime.Now;
|
||
|
// 切点事件
|
||
|
var event0 = _mapper.Map<BypassHithumExecutingEvent>(command);
|
||
|
event0.Original = original;
|
||
|
event0.Destination = destination;
|
||
|
await _commandBus.Trigger(event0, cancellationToken);
|
||
|
if (!_notifications.Any())
|
||
|
{
|
||
|
// 创建任务
|
||
|
var task = _mapper.Map<Models.Task>(command);
|
||
|
task.Type = TaskType.Bypass;
|
||
|
task.RequestNo = requestNo;
|
||
|
|
||
|
Output(nameof(command.Id), await _taskRepository.CreateTask(task));
|
||
|
// 成功事件
|
||
|
var event1 = _mapper.Map<BypassHithumSuccessEvent>(command);
|
||
|
event1.Original = original;
|
||
|
event1.Destination = destination;
|
||
|
await _commandBus.Trigger(event1, cancellationToken);
|
||
|
// 手动
|
||
|
if (command.Manual && !_notifications.Any())
|
||
|
{
|
||
|
await _commandBus.Execute(new CompleteCommand { Id = command.Id }, cancellationToken);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
await _commandBus.Notify(command.ValidationResult,
|
||
|
cancellationToken: cancellationToken);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|