山东雷驰
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.

374 lines
16 KiB

3 months ago
using AutoMapper;
using Kean.Domain.Stock.Commands;
using Kean.Domain.Stock.Models;
using Kean.Domain.Stock.Repositories;
using Kean.Domain.Stock.SharedServices.Proxies;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Kean.Domain.Stock.CommandHandlers
{
/// <summary>
/// 命令处理程序
/// </summary>
public sealed class PreScanInboundCommandHandler : CommandHandler<PreScanInboundCommand>
{
private readonly ICommandBus _commandBus; // 命令总线
private readonly INotification _notifications; // 总线通知
private readonly IMapper _mapper; // 模型映射
private readonly Kean.Infrastructure.Configuration.BarcodeInterpreter _barcodeInterpreter; // 条码解释器
private readonly IStockRepository _stockRepository; // 存储仓库
private readonly MaterialProxy _materialProxy; // 物料服务
private readonly IWarehouseRepository _warehouseRepository; // 库房仓库
/// <summary>
/// 依赖注入
/// </summary>
public PreScanInboundCommandHandler(
ICommandBus commandBus,
INotification notifications,
IMapper mapper,
Kean.Infrastructure.Configuration.BarcodeInterpreter barcodeInterpreter,
MaterialProxy materialProxy,
IWarehouseRepository warehouseRepository,
IStockRepository stockRepository)
{
_commandBus = commandBus;
_notifications = notifications;
_mapper = mapper;
_barcodeInterpreter = barcodeInterpreter;
_materialProxy = materialProxy;
_warehouseRepository = warehouseRepository;
_stockRepository = stockRepository;
}
/// <summary>
/// 处理程序
/// </summary>
public override async Task Handle(PreScanInboundCommand command, CancellationToken cancellationToken)
{
if (command.ValidationResult.IsValid)
{
string operation = "";
ScanInboundCommand scanInboundCommand = new ScanInboundCommand();
scanInboundCommand.Operator = command.Operator;
scanInboundCommand.RequestNo = command.RequestNo;
scanInboundCommand.Barcode = command.Barcode;
scanInboundCommand.Full = (command.Batchs.Count() == 2);
scanInboundCommand.Destination = Convert.ToInt32(command.Source);
scanInboundCommand.Tag = command.Tag;
List<StockLine> lines = new List<StockLine>();
if (command.Batchs.Count() == 0)
{
if (!string.IsNullOrEmpty(command.Tag))
{
JObject jObj = JObject.Parse(command.Tag);
JToken bypassArea = jObj.SelectToken("BypassArea");
if (bypassArea != null)
{
StockLine line = new StockLine();
line.Quantity = 1;
//本地库存 1-本地 2-联机
line.IsLocal = "1";
//line.Supplier = "ok";
line.Enabled = true;
if (command.Barcode.StartsWith("W1JPB"))
{
line.Material = 19;
}
else
{
line.Material = 18;
}
line.Bill = System.DateTime.Now.ToString("yyyyMMddHHmmss");
lines.Add(line);
operation = "scanInbound";
}
else
{
await _commandBus.Notify("batchs", $"产品信息不能为空。", "batchs", cancellationToken: cancellationToken);
return;
}
}
else
{
await _commandBus.Notify("batchs", $"产品信息不能为空", "batchs", cancellationToken: cancellationToken);
return;
}
}
else
{
operation = "scanInbound";
string goodsCode = "";
string batch = "";
string orderNo = "";
foreach (Batch b in command.Batchs)
{
if (string.IsNullOrEmpty(b.serialno))
{
await _commandBus.Notify(nameof(b.serialno), $"膜卷码({b.serialno})不能为空", b.serialno, cancellationToken: cancellationToken);
break;
}
var sGoods = await _materialProxy.GetMaterial(null, b.materialCode, false);
Models.Material goods = JsonConvert.DeserializeObject<Models.Material>(sGoods);
if (goods == null)
{
//@=@ 固定值 goodsClass
int category = 0;
try
{
if (b.serialno.Substring(2, 3) == "AMQ")
{
category = 3;
}
if (b.serialno.Substring(2, 3) == "CMQ")
{
category = 2;
}
}
catch { }
if (category == 0)
{
if (b.materialName.Contains("阴"))
{
category = 2;
}
else if (b.materialName.Contains("阳"))
{
category = 3;
}
}
if (category == 0)
{
if (command.Barcode.StartsWith("W1JPB"))
{
category = 3;
}
if (command.Barcode.StartsWith("W1JPA"))
{
category = 2;
}
}
if (category == 0)
{
await _commandBus.Notify("materialCode", $"物料编码({b.materialCode}),无法解析。", b.materialCode, cancellationToken: cancellationToken);
return;
}
//新建主物料信息
await this._materialProxy.CreateGoods(category, "1", b.materialCode, $"{b.materialCode}{b.materialName}");
sGoods = await _materialProxy.GetMaterial(null, b.materialCode, false);
goods = JsonConvert.DeserializeObject<Models.Material>(sGoods);
if (goods == null)
{
await _commandBus.Notify("materialCode", $"物料编码({b.materialCode}),无法解析。", b.materialCode, cancellationToken: cancellationToken);
return;
}
}
if (string.IsNullOrEmpty(goodsCode))
{
goodsCode = goods.Code;
}
else if (goodsCode!=goods.Code)
{
await _commandBus.Notify(nameof(b.serialno), $"膜卷物料不相同,不能放到一个托盘。{goodsCode}-{goods.Code}", b.serialno, cancellationToken: cancellationToken);
break;
}
if (string.IsNullOrEmpty(batch))
{
batch = b.serialno.Split('-')[0];
}
//else if (batch != sfc.Split('-')[0])
//{
// await _commandBus.Notify(nameof(sfc), $"膜卷批次码不相同,不能放到一个托盘。{batch}-{sfc.Split('-')[0]}", sfc, cancellationToken: cancellationToken);
// break;
//}
//if (string.IsNullOrEmpty(orderNo))
//{
// orderNo = b.workOrderNo;
//}
//else if (orderNo != b.workOrderNo)
//{
// await _commandBus.Notify(nameof(orderNo), $"膜卷的工单号不相同,不能放到一个托盘。{orderNo}-{b.workOrderNo}", orderNo, cancellationToken: cancellationToken);
// break;
//}
StockLine line = new StockLine();
line.Quantity = 1;
//本地库存 1-本地 2-联机
line.IsLocal = "2";
//line.Supplier = "unupload";
line.Enabled = true;
line.Postuser = command.Postuser;
line.Remark = command.Remark;
line.Material = goods.Id;
//line.IsWms = production.data.is_WMS;
line.Bill = b.serialno;
line.Batch = b.serialno.Split('-')[0];
line.MesUnit = b.unit;
line.QualifiedNum = b.quantity;
try
{
Convert.ToDecimal(b.quantity);
}
catch
{
await _commandBus.Notify(nameof(b.quantity), $"EA数量({b.quantity})不对,请检查", b.quantity, cancellationToken: cancellationToken);
break;
}
line.WorkorderNo = b.workOrderNo;
try
{
line.ManufacturingDate = Convert.ToDateTime(b.productDate);
}
catch
{
await _commandBus.Notify(nameof(b.productDate), $"生产时间值({b.productDate})不对,请检查", b.productDate, cancellationToken: cancellationToken);
break;
}
line.IsAgv = b.qualityState;
if (b.materialType == "0")
{
line.QualityState = "ok";
}
else if (b.materialType == "1")
{
line.QualityState = "check";
}
else if (b.materialType == "2")
{
line.QualityState = "ng";
}
else
{
line.QualityState = b.materialType;
}
//else if (b.materialType == "N1")
//{
// line.QualityState = "N1";
//}
//else if (b.materialType == "N2")
//{
// line.QualityState = "N2";
//}
//else if (b.materialType == "N3")
//{
// line.QualityState = "N3";
//}
//else if (b.materialType == "N4")
//{
// line.QualityState = "N4";
//}
//else if (b.materialType == "N5")
//{
// line.QualityState = "N5";
//}
//else if (b.materialType == "N6")
//{
// line.QualityState = "N6";
//}
//else if (b.materialType == "N7")
//{
// line.QualityState = "N7";
//}
//else
//{
// await _commandBus.Notify(nameof(b.materialType), $"物料类型({b.materialType})未定义,请检查", b.materialType, cancellationToken: cancellationToken);
// break;
//}
line.LineCode = b.productBatchNo;
line.LineName = b.sapBatchNo;
line.UploadNum = JsonConvert.SerializeObject(new
{
mouldNo = b.mouldNo,
maturity = b.maturity,
expDate = b.expDate
});
if (System.DateTime.Now.AddDays(-6) > line.ManufacturingDate.Value)
{
if (!string.IsNullOrEmpty(command.Tag))
{
JObject jObj = JObject.Parse(command.Tag);
JToken bypassArea = jObj.SelectToken("BypassArea");
if (bypassArea != null)
{
}
else
{
await _commandBus.Notify(nameof(b.productDate), $"生产日期({b.productDate})超期(大于6天),不能自动入库。请联系生产管理者。", b.productDate, cancellationToken: cancellationToken);
break;
}
}
else
{
await _commandBus.Notify(nameof(b.productDate), $"生产日期({b.productDate})超期(大于6天),不能自动入库。请联系生产管理者。", b.productDate, cancellationToken: cancellationToken);
break;
}
}
lines.Add(line);
}
}
if (!_notifications.Any())
{
scanInboundCommand.Lines = lines;
switch (operation)
{
case "palletIn":
var palletInCommand = _mapper.Map<PalletInCommand>(scanInboundCommand);
await _commandBus.Execute(palletInCommand, cancellationToken);
Output(nameof(command.Source), palletInCommand.Tag);
break;
case "scanInbound":
await _commandBus.Execute(scanInboundCommand, cancellationToken);
Output(nameof(command.Source), scanInboundCommand.Tag);
break;
}
}
}
else
{
await _commandBus.Notify(command.ValidationResult,
cancellationToken: cancellationToken);
}
}
}
}