#region << 版 本 注 释 >>
|
/*----------------------------------------------------------------
|
* 命名空间:WIDESEA_TaskInfoService
|
* 创建者:胡童庆
|
* 创建时间:2024/8/2 16:13:36
|
* 版本:V1.0.0
|
* 描述:
|
*
|
* ----------------------------------------------------------------
|
* 修改人:
|
* 修改时间:
|
* 版本:V1.0.1
|
* 修改说明:
|
*
|
*----------------------------------------------------------------*/
|
#endregion << 版 本 注 释 >>
|
|
using AutoMapper;
|
using MailKit.Search;
|
using Microsoft.Extensions.Logging;
|
using Newtonsoft.Json;
|
using Org.BouncyCastle.Asn1.Ocsp;
|
using Org.BouncyCastle.Asn1.Pkcs;
|
using SqlSugar;
|
using System.Reflection;
|
using System.Reflection.Emit;
|
using System.Threading.Tasks;
|
using System.Xml.Linq;
|
using WIDESEA_Common.CommonEnum;
|
using WIDESEA_Common.LocationEnum;
|
using WIDESEA_Common.OrderEnum;
|
using WIDESEA_Common.StockEnum;
|
using WIDESEA_Common.TaskEnum;
|
using WIDESEA_Common.WareHouseEnum;
|
using WIDESEA_Core;
|
using WIDESEA_Core.BaseRepository;
|
using WIDESEA_Core.BaseServices;
|
using WIDESEA_Core.Enums;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_DTO.Basic;
|
using WIDESEA_DTO.Inbound;
|
using WIDESEA_DTO.Task;
|
using WIDESEA_IBasicService;
|
using WIDESEA_IInboundService;
|
using WIDESEA_IOutboundService;
|
using WIDESEA_IRecordService;
|
using WIDESEA_IStockService;
|
using WIDESEA_ITaskInfoService;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_TaskInfoService
|
{
|
public partial class TaskService : ServiceBase<Dt_Task, IRepository<Dt_Task>>, ITaskService
|
{
|
private readonly ILogger<TaskService> _logger;
|
private readonly IMapper _mapper;
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
|
private readonly IRepository<Dt_StockInfo> _stockRepository;
|
private readonly ILocationInfoService _locationInfoService;
|
private readonly IInboundOrderService _inboundOrderService;
|
private readonly IInboundOrderDetailService _inboundOrderDetailService;
|
|
private readonly IOutboundOrderService _outboundOrderService;
|
private readonly IOutboundOrderDetailService _outboundOrderDetailService;
|
|
private readonly ILocationStatusChangeRecordService _locationStatusChangeRecordService;
|
private readonly IESSApiService _eSSApiService;
|
private readonly IStockService _stockService;
|
private readonly IRecordService _recordService;
|
|
private readonly IInvokeMESService _invokeMESService;
|
public IRepository<Dt_Task> Repository => BaseDal;
|
|
private Dictionary<string, SqlSugar.OrderByType> _taskOrderBy = new()
|
{
|
{nameof(Dt_Task.Grade),SqlSugar.OrderByType.Desc },
|
{nameof(Dt_Task.CreateDate),SqlSugar.OrderByType.Asc},
|
};
|
|
private Dictionary<string, string> stations = new Dictionary<string, string>
|
{
|
{"3-5","3-9" },
|
{"2-5","2-9" },
|
{"1-11","1-1" },
|
};
|
|
public List<int> TaskTypes => typeof(TaskTypeEnum).GetEnumIndexList();
|
|
public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList();
|
|
public TaskService(IRepository<Dt_Task> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_StockInfo> stockRepository, ILocationInfoService locationInfoService, IInboundOrderService inboundOrderService, ILocationStatusChangeRecordService locationStatusChangeRecordService, IESSApiService eSSApiService, ILogger<TaskService> logger, IStockService stockService, IRecordService recordService, IInboundOrderDetailService inboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutboundOrderDetailService outboundOrderDetailService, IInvokeMESService invokeMESService) : base(BaseDal)
|
{
|
_mapper = mapper;
|
_unitOfWorkManage = unitOfWorkManage;
|
_stockRepository = stockRepository;
|
_locationInfoService = locationInfoService;
|
_inboundOrderService = inboundOrderService;
|
_locationStatusChangeRecordService = locationStatusChangeRecordService;
|
_eSSApiService = eSSApiService;
|
_logger = logger;
|
_stockService = stockService;
|
_recordService = recordService;
|
_inboundOrderDetailService = inboundOrderDetailService;
|
_outboundOrderService = outboundOrderService;
|
_outboundOrderDetailService = outboundOrderDetailService;
|
_invokeMESService = invokeMESService;
|
}
|
|
/// <summary>
|
///
|
/// </summary>
|
/// <param name="taskNum"></param>
|
/// <returns></returns>
|
public async Task<WebResponseContent> TaskCompleted(string taskNum)
|
{
|
try
|
{
|
Dt_Task task;
|
if (int.TryParse(taskNum, out var newTaskNum))
|
{
|
task = BaseDal.QueryFirst(x => x.TaskNum == newTaskNum);
|
if (task == null)
|
{
|
return WebResponseContent.Instance.Error("未找到任务信息");
|
}
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error("未找到任务信息");
|
}
|
|
MethodInfo? methodInfo = GetType().GetMethod(((TaskTypeEnum)task.TaskType) + "TaskCompleted");
|
if (methodInfo != null)
|
{
|
WebResponseContent? responseContent = (WebResponseContent?)methodInfo.Invoke(this, new object[] { task });
|
if (responseContent != null)
|
{
|
return responseContent;
|
}
|
}
|
return WebResponseContent.Instance.Error("未找到任务类型对应业务处理逻辑");
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
/// <summary>
|
/// 入库完成
|
/// </summary>
|
/// <param name="task"></param>
|
/// <returns></returns>
|
public WebResponseContent InboundTaskCompleted(Dt_Task task)
|
{
|
decimal beforeQuantity = 0;
|
|
//查库存
|
Dt_StockInfo stockInfo = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == task.PalletCode && x.WarehouseId == task.WarehouseId).First();
|
if (stockInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到托盘对应的组盘信息");
|
}
|
if (stockInfo.Details.Count == 0 && stockInfo.PalletType != PalletTypeEnum.Empty.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"未找到该托盘库存明细信息");
|
}
|
//查货位
|
Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
|
if (locationInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到对应的终点货位信息");
|
}
|
|
var ordernos = stockInfo.Details.GroupBy(x => x.OrderNo).Select(o => o.Key).ToList();
|
var inboundOrders = _inboundOrderService.Repository.Db.Queryable<Dt_InboundOrder>().Where(x => ordernos.Contains(x.InboundOrderNo)).Includes(x => x.Details).ToList();
|
Dt_InboundOrderDetail? inboundOrderDetail = null;
|
|
foreach (var inboundOrder in inboundOrders)
|
{
|
//标准入库流程查找入库单据
|
if (inboundOrder != null && stockInfo.StockStatus == StockStatusEmun.入库确认.ObjToInt())
|
{
|
foreach (var item in stockInfo.Details.Where(x => x.OrderNo == inboundOrder.InboundOrderNo).ToList())
|
{
|
var inbounddetail = inboundOrder.Details.Where(x => x.lineNo == item.InboundOrderRowNo && x.Barcode == item.Barcode).FirstOrDefault();
|
if (inbounddetail != null)
|
{
|
inbounddetail.OverInQuantity += item.StockQuantity;
|
if (inbounddetail.OverInQuantity == inbounddetail.OrderQuantity)
|
{
|
inbounddetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
|
}
|
else if (inbounddetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
|
{
|
inbounddetail.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt();
|
}
|
_inboundOrderDetailService.UpdateData(inbounddetail);
|
}
|
}
|
if (inboundOrder.Details.Count == inboundOrder.Details.Where(x => x.OrderQuantity == x.OverInQuantity).Count())
|
{
|
inboundOrder.OrderStatus = InOrderStatusEnum.入库完成.ObjToInt();
|
}
|
else if (inboundOrder.OrderStatus == InOrderStatusEnum.未开始.ObjToInt())
|
{
|
inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt();
|
}
|
_inboundOrderService.UpdateData(inboundOrder);
|
}
|
}
|
stockInfo.LocationCode = task.TargetAddress;
|
stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
|
stockInfo.Details.ForEach(x =>
|
{
|
x.Status = StockStatusEmun.入库完成.ObjToInt();
|
});
|
_stockService.StockInfoService.Repository.UpdateData(stockInfo);
|
_stockService.StockInfoDetailService.Repository.UpdateData(stockInfo.Details);
|
|
beforeQuantity = stockInfo.Details.Where(x => x.Id != 0).Sum(x => x.StockQuantity);
|
|
int beforeStatus = locationInfo.LocationStatus;
|
if (stockInfo.PalletType == PalletTypeEnum.Empty.ObjToInt())
|
{
|
locationInfo.LocationStatus = LocationStatusEnum.Pallet.ObjToInt();
|
}
|
else
|
{
|
locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
|
}
|
_locationInfoService.Repository.UpdateData(locationInfo);
|
|
task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
|
|
BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
|
|
_locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum);
|
|
_recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) + beforeQuantity, WIDESEA_Common.StockEnum.StockChangeType.MaterielGroup);
|
try
|
{
|
foreach (var inboundOrder in inboundOrders)
|
{
|
if (inboundOrder != null && inboundOrder.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt())
|
{
|
var feedmodel = new FeedbackInboundRequestModel
|
{
|
reqCode = Guid.NewGuid().ToString(),
|
reqTime = DateTime.Now.ToString(),
|
business_type = inboundOrder.BusinessType,
|
factoryArea = inboundOrder.FactoryArea,
|
operationType = 1,
|
orderNo = inboundOrder.UpperOrderNo,
|
status = inboundOrder.OrderStatus,
|
details = new List<FeedbackInboundDetailsModel>()
|
|
};
|
|
var groupedData = inboundOrder.Details.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.lineNo, item.BarcodeUnit, item.WarehouseCode})
|
.Select(group => new FeedbackInboundDetailsModel
|
{
|
materialCode = group.Key.MaterielCode,
|
supplyCode = group.Key.SupplyCode,
|
batchNo = group.Key.BatchNo,
|
lineNo = group.Key.lineNo,
|
warehouseCode = group.Key.WarehouseCode,
|
unit= group.Key.BarcodeUnit,
|
barcodes = group.Select(row => new FeedbackBarcodesModel
|
{
|
barcode = row.Barcode,
|
qty = row.BarcodeQty
|
}).ToList()
|
}).ToList();
|
feedmodel.details = groupedData;
|
|
_invokeMESService.FeedbackInbound(feedmodel);
|
}
|
|
}
|
}
|
catch (Exception ex) {
|
_logger.LogInformation("InboundTaskCompleted 回写MES失败: " + ex.Message);
|
}
|
|
return WebResponseContent.Instance.OK();
|
}
|
|
|
public async Task<WebResponseContent> InEmptyTaskCompleted(Dt_Task task)
|
{
|
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
|
Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
|
if (locationInfo == null)
|
{
|
return content.Error($"未找到对应的终点货位信息");
|
}
|
Dt_StockInfo stockInfo = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == task.PalletCode && x.WarehouseId == task.WarehouseId).First();
|
if (stockInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到托盘对应的组盘信息");
|
}
|
|
if (!string.IsNullOrEmpty(stockInfo.LocationCode))
|
{
|
return WebResponseContent.Instance.Error($"该托盘已绑定货位");
|
}
|
if (locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"货位状态不正确");
|
}
|
|
|
var beforelocationStatus = locationInfo.LocationStatus;
|
locationInfo.LocationStatus = LocationStatusEnum.Pallet.ObjToInt();
|
_locationInfoService.Repository.UpdateData(locationInfo);
|
|
stockInfo.LocationCode = locationInfo.LocationCode;
|
stockInfo.PalletCode = task.PalletCode;
|
stockInfo.LocationCode = task.TargetAddress;
|
stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt();
|
_stockRepository.UpdateData(stockInfo);
|
|
task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
|
BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? WIDESEA_Core.Enums.OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
|
|
_locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforelocationStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum);
|
|
|
|
return content;
|
}
|
catch (Exception ex)
|
{
|
return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message));
|
}
|
}
|
|
|
|
public async Task<WebResponseContent> OutEmptyTaskCompleted(Dt_Task task)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Dt_StockInfo stockInfo = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == task.PalletCode && x.WarehouseId == task.WarehouseId).First();
|
if (stockInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到托盘对应的库存信息");
|
}
|
Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
|
|
if (locationInfo == null)
|
{
|
return content.Error($"未找到对应的终点货位信息");
|
}
|
|
_stockRepository.Db.Deleteable(stockInfo);
|
|
int beforeStatus = locationInfo.LocationStatus;
|
|
locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
|
|
_locationInfoService.Repository.UpdateData(locationInfo);
|
|
|
task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
|
BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
|
_stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
|
|
_locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum);
|
|
return WebResponseContent.Instance.OK();
|
|
}
|
catch (Exception ex)
|
{
|
return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message));
|
}
|
}
|
|
}
|
}
|