using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using Newtonsoft.Json;
|
using WIDESEA_Core;
|
using WIDESEA_Core.BaseRepository;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_Core.HttpContextUser;
|
using WIDESEA_Core.Util;
|
using WIDESEA_DTO.Base;
|
using WIDESEA_DTO.ReturnMES;
|
using WIDESEA_IBasicService;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_BasicService.MESOperation
|
{
|
public class FeedbackMesService : IFeedbackMesService
|
{
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
private readonly HttpClientHelper _httpClientHelper;
|
private readonly IRepository<Dt_OutboundOrder> _outboundOrderRepository;
|
private readonly IBasicService _basicService;
|
|
public FeedbackMesService(IUnitOfWorkManage unitOfWorkManage, HttpClientHelper httpClientHelper, IRepository<Dt_OutboundOrder> outboundOrderRepository, IBasicService basicService)
|
{
|
_unitOfWorkManage = unitOfWorkManage;
|
_httpClientHelper = httpClientHelper;
|
_outboundOrderRepository = outboundOrderRepository;
|
_basicService = basicService;
|
}
|
|
public void MaterialOutboundFeedback(string orderNo)
|
{
|
try
|
{
|
Dt_OutboundOrder outboundOrder = _outboundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == orderNo).Includes(x => x.Details).First();
|
if (outboundOrder == null)
|
{
|
// todo 记录日志:未找到对应的出库单
|
|
return;
|
}
|
|
MaterialOutboundReturnDTO? returnDTO = BuildOutboundFeedbackData(outboundOrder);
|
if (returnDTO != null)
|
{
|
string apiUrl = "";
|
|
HttpResponseResult<MesResponseDTO> httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, returnDTO.Serialize());
|
|
bool isSuccess = httpResponseResult.IsSuccess && httpResponseResult.Data != null && httpResponseResult.Data.Code == "200";
|
string message = "";
|
if (!isSuccess)
|
{
|
if (httpResponseResult.IsSuccess)
|
{
|
message = $"MES接口返回错误,HTTP代码:{httpResponseResult.StatusCode},信息:{httpResponseResult.ErrorMessage}";
|
}
|
else if (httpResponseResult.Data.Code != "200")
|
{
|
message = $"调用MES接口失败,代码:{httpResponseResult.Data.Code},信息:{httpResponseResult.Data.Message}";
|
}
|
}
|
|
Dt_MesReturnRecord mesReturnRecord = new Dt_MesReturnRecord()
|
{
|
ApiUrl = apiUrl,
|
InterfaceType = 1,
|
OrderId = outboundOrder.Id,
|
OrderNo = outboundOrder.OrderNo,
|
OrderType = outboundOrder.OrderType,
|
RequestCode = returnDTO.ReqCode,
|
RequestData = returnDTO.Serialize(),
|
FailureReason = message,
|
LastReturnTime = DateTime.Now,
|
HttpStatusCode = httpResponseResult.StatusCode.ObjToInt(),
|
ResponseData = httpResponseResult.Content,
|
ReturnType = 0,
|
ReturnCount = 1,
|
ReturnStatus = httpResponseResult.IsSuccess ? 1 : 2,
|
SuccessTime = httpResponseResult.IsSuccess ? DateTime.Now : null
|
};
|
|
_unitOfWorkManage.BeginTran();
|
_unitOfWorkManage.Db.Insertable(mesReturnRecord).ExecuteCommand();
|
List<string> lineNos = returnDTO.Details.Select(x => x.LineNo).ToList();
|
|
List<Dt_OutboundOrderDetail> outboundOrderDetails = outboundOrder.Details.Where(x => lineNos.Contains(x.lineNo)).ToList();
|
outboundOrderDetails.ForEach(x =>
|
{
|
if (x.OverOutQuantity == x.OrderQuantity - x.MoveQty)
|
{
|
x.ReturnToMESStatus = isSuccess ? 1 : 2;
|
}
|
else
|
{
|
x.ReturnToMESStatus = isSuccess ? 3 : 4;
|
}
|
x.CurrentDeliveryQty = 0;
|
x.ReturnJsonData = "";
|
});
|
|
_outboundOrderRepository.Db.Updateable(outboundOrderDetails).ExecuteCommand();
|
|
_unitOfWorkManage.CommitTran();
|
}
|
}
|
catch (Exception ex)
|
{
|
throw new Exception(ex.Message);
|
}
|
|
}
|
|
public MaterialOutboundReturnDTO? BuildOutboundFeedbackData(Dt_OutboundOrder outboundOrder)
|
{
|
try
|
{
|
List<Dt_OutboundOrderDetail> details = outboundOrder.Details;
|
|
List<MaterialOutboundDetail> returnDetails = new List<MaterialOutboundDetail>();
|
|
foreach (var detail in details)
|
{
|
List<Barcodes>? barcodes = JsonConvert.DeserializeObject<List<Barcodes>>(detail.ReturnJsonData);
|
if (barcodes != null && barcodes.Any())
|
{
|
UnitConvertResultDTO currentResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.CurrentDeliveryQty);
|
UnitConvertResultDTO totalResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.OrderQuantity);
|
|
returnDetails.Add(new MaterialOutboundDetail
|
{
|
Barcodes = barcodes,
|
CurrentDeliveryQty = currentResult.ToQuantity,
|
LineNo = detail.lineNo,
|
MaterialCode = detail.MaterielCode,
|
Qty = totalResult.ToQuantity,
|
WarehouseCode = detail.WarehouseCode,
|
Unit = detail.BarcodeUnit
|
});
|
}
|
}
|
|
MaterialOutboundReturnDTO outboundReturnDTO = new MaterialOutboundReturnDTO()
|
{
|
Business_type = outboundOrder.BusinessType,
|
Details = returnDetails,
|
DocumentsNO = "",
|
FactoryArea = outboundOrder.FactoryArea,
|
OperationType = 1,
|
Operator = App.User.UserName,
|
OrderNo = outboundOrder.OrderNo,
|
Status = 1
|
};
|
|
return outboundReturnDTO;
|
|
}
|
catch (Exception ex)
|
{
|
return null;
|
}
|
}
|
}
|
}
|