using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Common.OrderEnum;
|
using WIDESEA_Common.StockEnum;
|
using WIDESEA_Core;
|
using WIDESEA_Core.BaseRepository;
|
using WIDESEA_Core.BaseServices;
|
using WIDESEA_Core.Enums;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_IApprovalRepository;
|
using WIDESEA_ICheckRepository;
|
using WIDESEA_ICheckService;
|
using WIDESEA_IInboundRepository;
|
using WIDESEA_IOutboundRepository;
|
using WIDESEA_IStockRepository;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_CheckService
|
{
|
public class CheckOrderResultService : ServiceBase<Dt_CheckOrderResult, ICheckOrderResultRepository>, ICheckOrderResultService
|
{
|
private readonly ICheckOrderRepository _checkOrderRepository;
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
private readonly IReceiveOrderRepository _receiveOrderRepository;
|
private readonly ICheckOrderService _checkOrderService;
|
private readonly IPurchaseOrderRepository _purchaseOrderRepository;
|
private readonly IPurchaseOrderDetailRepository _purchaseOrderDetailRepository;
|
private readonly IOutboundRepository _outboundRepository;
|
private readonly IStockRepository _stockRepository;
|
public CheckOrderResultService(ICheckOrderResultRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, ICheckOrderRepository checkOrderRepository, IReceiveOrderRepository receiveOrderRepository, ICheckOrderService checkOrderService, IPurchaseOrderRepository purchaseOrderRepository, IPurchaseOrderDetailRepository purchaseOrderDetailRepository, IOutboundRepository outboundRepository, IStockRepository stockRepository) : base(BaseDal)
|
{
|
_checkOrderRepository = checkOrderRepository;
|
_unitOfWorkManage = unitOfWorkManage;
|
_receiveOrderRepository = receiveOrderRepository;
|
_checkOrderService = checkOrderService;
|
_purchaseOrderRepository = purchaseOrderRepository;
|
_purchaseOrderDetailRepository = purchaseOrderDetailRepository;
|
_outboundRepository = outboundRepository;
|
_stockRepository = stockRepository;
|
}
|
|
/// <summary>
|
/// 提交质检结果
|
/// </summary>
|
/// <param name="checkOrderId">质检单主键</param>
|
/// <param name="checkResult">质检结果对象</param>
|
/// <param name="IsAccept">是否接受</param>
|
/// <returns></returns>
|
public WebResponseContent CommitCheckResult(int checkOrderId,Dt_CheckOrderResult checkResult,int IsAccept=0)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Dt_CheckOrder checkOrder = _checkOrderRepository.QueryFirst(x => x.CheckOrderId == checkOrderId);
|
//获取质检单对应的收货单
|
if (checkOrder == null)
|
{
|
return content.Error($"未找到该质检单");
|
}
|
Dt_ReceiveOrder receiveOrder = _receiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == checkOrder.ReceiveOrderNo).Includes(x => x.Details).First();
|
if (receiveOrder.ReceiveOrderStatus!=ReceiveOrderStatusEnum.Completed.ObjToInt())
|
{
|
return content.Error($"{receiveOrder.ReceiveOrderNo}收货单未完成无法质检");
|
}
|
if (checkOrder.CheckOrderStatus == CheckOrderStatusEnum.Checked.ObjToInt())
|
{
|
return content.Error($"该单据已经检验完成");
|
}
|
Dt_CheckOrderResult? checkOrderResult = null;
|
Dt_PurchaseOrder? purchaseOrder = null;
|
Dt_PurchaseOrderDetail? purchaseOrderDetail= null;
|
if (checkResult.CheckOrderId!=0)
|
{
|
if (checkResult.Quantity < 0 || checkResult.Quantity > checkOrder.ReceivedQuantity || checkOrder.ReceivedQuantity - checkOrder.ReturnQuantity < checkResult.Quantity)
|
{
|
return content.Error($"数量超出");
|
}
|
if (checkResult.Result == CheckResultEnum.Return.ToString())//退货
|
{
|
checkOrder.DefectedNote = checkResult.Note;
|
checkOrder.ReturnQuantity += checkResult.Quantity;
|
}
|
else
|
{
|
return content.Error($"未找到缺陷类型");
|
}
|
checkOrderResult = new Dt_CheckOrderResult()
|
{
|
Quantity = checkResult.Quantity,
|
CheckOrderId = checkOrderId,
|
DefectCode = checkResult.DefectCode,
|
Result = checkResult.Result,
|
Note = checkResult.Note,
|
SampleCount=checkResult.SampleCount,
|
};
|
//获取对应采购单
|
Dt_ReceiveOrderDetail receiveOrderDetail = receiveOrder.Details.First(x => x.RowNo == checkOrder.ReceiveDetailRowNo);
|
purchaseOrder = _purchaseOrderRepository.Db.Queryable<Dt_PurchaseOrder>().Where(x => x.PurchaseOrderNo == receiveOrderDetail.PurchaseOrderNo).Includes(x => x.Details).Where(x => x.Details.Any(v => v.RowNo == receiveOrderDetail.PurchaseOrderDetailRowNo)).First();
|
if (purchaseOrder == null)
|
{
|
return content.Error("未找到对应收货采购单");
|
}
|
purchaseOrderDetail = purchaseOrder.Details.FirstOrDefault();
|
if (purchaseOrderDetail==null)
|
{
|
return content.Error("未找到退货对应的采购单明细");
|
}
|
purchaseOrderDetail.PurchaseDetailReceiveQty -= checkResult.Quantity;
|
}
|
if (IsAccept==CheckAcceptEnum.Accept.ObjToInt())
|
{
|
checkOrder.Result = CheckAcceptEnum.Accept.ToString();
|
}
|
else if (IsAccept == CheckAcceptEnum.UnAccept.ObjToInt())
|
{
|
checkOrder.Result = CheckAcceptEnum.UnAccept.ToString();
|
}
|
else
|
{
|
return content.Error("未找到检验类型");
|
}
|
checkOrder.CheckOrderStatus = CheckOrderStatusEnum.Checked.ObjToInt();
|
if (checkOrderResult!=null)
|
{
|
checkOrder.QualifiedQuantity = checkOrder.ReceivedQuantity - checkOrderResult.Quantity;
|
}
|
else
|
{
|
checkOrder.QualifiedQuantity = checkOrder.ReceivedQuantity;
|
}
|
checkOrder.CheckUserName = App.User.UserName;
|
_unitOfWorkManage.BeginTran();
|
|
if (checkOrderResult!=null && purchaseOrder!=null && purchaseOrderDetail!=null)
|
{
|
BaseDal.AddData(checkOrderResult);
|
if (purchaseOrder.PurchaseOrderStatus>=PurchaseOrderStatusEnum.Received.ObjToInt())
|
{
|
purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Receiving.ObjToInt();
|
_purchaseOrderRepository.UpdateData(purchaseOrder);
|
}
|
if (purchaseOrderDetail.PurchaseDetailStatus== PurchaseOrderDetailStatusEnum.Received.ObjToInt())
|
{
|
purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Receiving.ObjToInt();
|
}
|
_purchaseOrderDetailRepository.UpdateData(purchaseOrderDetail);
|
}
|
//ERP上报
|
WebResponseContent responseContent= _checkOrderService.FeedbackCheckResult(checkOrder, checkOrderResult!=null? new List<Dt_CheckOrderResult> { checkOrderResult }:new List<Dt_CheckOrderResult>());
|
if (!responseContent.Status)
|
{
|
throw new Exception(responseContent.Message);
|
}
|
checkOrder.UploadStatus = CheckUploadEnum.UploadOk.ObjToInt();
|
_checkOrderRepository.UpdateData(checkOrder);
|
_unitOfWorkManage.CommitTran();
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return content.Error($"{ex.Message}");
|
}
|
return content;
|
}
|
/// <summary>
|
/// 提交送检确认结果
|
/// </summary>
|
/// <param name="checkOrderId"></param>
|
/// <param name="checkResult"></param>
|
/// <param name="IsAccept"></param>
|
/// <returns></returns>
|
public WebResponseContent CommitInspectResult(int checkOrderId, Dt_CheckOrderResult checkResult, int IsAccept = 0)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Dt_CheckOrder checkOrder = _checkOrderRepository.QueryFirst(x => x.CheckOrderId == checkOrderId);
|
//获取质检单对应的收货单
|
if (checkOrder == null)
|
{
|
return content.Error($"未找到该质检单");
|
}
|
Dt_OutboundOrder outboundOrder = _outboundRepository.OutboundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == checkOrder.ReceiveOrderNo).Includes(x => x.Details).First();
|
if (outboundOrder.OrderStatus != OutOrderStatusEnum.出库完成.ObjToInt())
|
{
|
return content.Error($"{outboundOrder.OrderNo}送检单出库未完成无法质检");
|
}
|
if (checkOrder.CheckOrderStatus == CheckOrderStatusEnum.Checked.ObjToInt())
|
{
|
return content.Error($"该单据已经检验完成");
|
}
|
Dt_CheckOrderResult? checkOrderResult = null;
|
//获取库存
|
Dt_OutStockLockInfo outStockLockInfo = _outboundRepository.OutboundStockLockInfoRepository.QueryFirst(x => x.Id == checkOrder.ReceiveDetailRowNo) ?? throw new Exception("未找到送检单详情");
|
Dt_StockInfo? stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>()
|
.Where(x => x.PalletCode == outStockLockInfo.PalletCode && x.StockStatus == StockStatusEmun.送检完成.ObjToInt()).Includes(x => x.Details).First() ?? throw new Exception("未找到送检单对应库存数据");
|
List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
|
List<Dt_StockInfoDetail> DelStockDetails =new List<Dt_StockInfoDetail>();
|
if (checkResult.CheckOrderId != 0)
|
{
|
if (checkResult.Quantity < 0 || checkResult.Quantity > checkOrder.ReceivedQuantity)
|
{
|
return content.Error($"数量超出");
|
}
|
//判断检验结果
|
if (checkResult.Result == InspectResultEnum.Return.ToString())
|
{
|
checkOrder.DefectedNote = checkResult.Note;
|
checkOrder.ReturnQuantity += checkResult.Quantity;
|
}
|
else if(checkResult.Result == InspectResultEnum.Defect.ToString())
|
{
|
checkOrder.DefectedNote = checkResult.Note;
|
checkOrder.DefectedQuantity += checkResult.Quantity;
|
}
|
else if (checkResult.Result == InspectResultEnum.Scrapped.ToString())
|
{
|
checkOrder.DefectedNote = checkResult.Note;
|
checkOrder.ScrappedQuantity += checkResult.Quantity;
|
}
|
else
|
{
|
return content.Error($"未找到缺陷类型");
|
}
|
checkOrderResult = new Dt_CheckOrderResult()
|
{
|
Quantity = checkResult.Quantity,
|
CheckOrderId = checkOrderId,
|
DefectCode = checkResult.DefectCode,
|
Result = checkResult.Result,
|
Note = checkResult.Note,
|
SampleCount = checkResult.SampleCount,
|
};
|
if (Math.Round(checkResult.Quantity,2) == Math.Round(stockInfoDetails.Sum(x=>x.StockQuantity),2))
|
{
|
DelStockDetails = stockInfo.Details;
|
}
|
else
|
{
|
foreach (var item in stockInfo.Details)
|
{
|
if (checkResult.Quantity == 0)
|
{
|
break;
|
}
|
else if(checkResult.Quantity< item.StockQuantity)
|
{
|
item.StockQuantity -= checkResult.Quantity;
|
item.OutboundQuantity = 0;
|
checkResult.Quantity = 0;
|
stockInfoDetails.Add(item);
|
}
|
else if (checkResult.Quantity >= item.StockQuantity)
|
{
|
checkResult.Quantity = (float)Math.Round((checkResult.Quantity-item.StockQuantity), 2);
|
DelStockDetails.Add(item);
|
}
|
}
|
}
|
|
}
|
if (IsAccept == InspectAcceptEnum.Accept.ObjToInt())
|
{
|
checkOrder.Result = InspectAcceptEnum.Accept.ToString();
|
}
|
else if (IsAccept == InspectAcceptEnum.UnAccept.ObjToInt())
|
{
|
checkOrder.Result = InspectAcceptEnum.UnAccept.ToString();
|
}
|
else if (IsAccept == InspectAcceptEnum.DefectAccept.ObjToInt())
|
{
|
checkOrder.Result = InspectAcceptEnum.DefectAccept.ToString();
|
}
|
else
|
{
|
return content.Error("未找到检验类型");
|
}
|
checkOrder.CheckOrderStatus = CheckOrderStatusEnum.Checked.ObjToInt();
|
if (checkOrderResult != null)
|
{
|
checkOrder.QualifiedQuantity = checkOrder.ReceivedQuantity - checkOrderResult.Quantity;
|
}
|
else
|
{
|
checkOrder.QualifiedQuantity = checkOrder.ReceivedQuantity;
|
}
|
checkOrder.CheckUserName = App.User.UserName;
|
List<Dt_StockInfoDetail> initialStockDetails = stockInfo.Details.Where(x=> !(stockInfoDetails.Select(v=>v.Id).ToList()).Contains(x.Id)).ToList();
|
_unitOfWorkManage.BeginTran();
|
|
if (checkOrderResult != null)
|
{
|
BaseDal.AddData(checkOrderResult);
|
}
|
//清除库存数量
|
if (stockInfoDetails.Count>0)
|
{
|
_stockRepository.StockInfoDetailRepository.UpdateData(stockInfoDetails);
|
}
|
if (initialStockDetails.Count>0)
|
{
|
initialStockDetails.ForEach(x =>
|
{
|
x.OutboundQuantity = 0;
|
});
|
_stockRepository.StockInfoDetailRepository.UpdateData(initialStockDetails);
|
}
|
if (DelStockDetails.Count>0)
|
{
|
_stockRepository.StockInfoDetailRepository.DeleteAndMoveIntoHty(DelStockDetails, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
|
}
|
if (DelStockDetails.Count==stockInfo.Details.Count)
|
{
|
_stockRepository.StockInfoRepository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
|
}
|
//ERP上报
|
WebResponseContent responseContent = _checkOrderService.FeedbackInspectResult(checkOrder, checkOrderResult != null ? new List<Dt_CheckOrderResult> { checkOrderResult } : new List<Dt_CheckOrderResult>());
|
if (!responseContent.Status)
|
{
|
throw new Exception(responseContent.Message);
|
}
|
checkOrder.UploadStatus = CheckUploadEnum.UploadOk.ObjToInt();
|
_checkOrderRepository.UpdateData(checkOrder);
|
_unitOfWorkManage.CommitTran();
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return content.Error($"{ex.Message}");
|
}
|
return content;
|
}
|
/// <summary>
|
/// 获取检验信息
|
/// </summary>
|
public WebResponseContent GetCheckResultInfo(int checkId)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Dt_CheckOrderResult checkOrderResult = BaseDal.QueryFirst(x => x.CheckOrderId == checkId);
|
content.OK("成功", checkOrderResult);
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
}
|
}
|