wangxinhui
4 天以前 9ec715d2deb18a269dd49c48da91a36632d08c81
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_CheckService/CheckOrderResultService.cs
@@ -4,12 +4,18 @@
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
@@ -17,66 +23,323 @@
    public class CheckOrderResultService : ServiceBase<Dt_CheckOrderResult, ICheckOrderResultRepository>, ICheckOrderResultService
    {
        private readonly ICheckOrderRepository _checkOrderRepository;
        public CheckOrderResultService(ICheckOrderResultRepository BaseDal, ICheckOrderRepository checkOrderRepository) : base(BaseDal)
        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;
        }
        public WebResponseContent CommitCheckResult(int checkOrderId, Dt_CheckOrderResult checkResult)
        /// <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 WebResponseContent.Instance.Error($"未找到该质检单");
                    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 WebResponseContent.Instance.Error($"该单据已经检验完成");
                    return content.Error($"该单据已经检验完成");
                }
                if (checkResult.Quantity < 0 || checkResult.Quantity > checkOrder.ReceivedQuantity || checkOrder.ReceivedQuantity - checkOrder.ScrappedQuantity - checkOrder.DefectedQuantity - checkOrder.ReturnQuantity < checkResult.Quantity)
                Dt_CheckOrderResult? checkOrderResult = null;
                Dt_PurchaseOrder? purchaseOrder = null;
                Dt_PurchaseOrderDetail? purchaseOrderDetail= null;
                if (checkResult.CheckOrderId!=0)
                {
                    return WebResponseContent.Instance.Error($"数量输入错误");
                    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 (checkResult.Result == CheckResultEnum.Defect.ToString())//特采
                if (IsAccept==CheckAcceptEnum.Accept.ObjToInt())
                {
                    checkOrder.DefectedNote = checkResult.Note;
                    checkOrder.DefectedQuantity += checkResult.Quantity;
                    checkOrder.QualifiedQuantity -= checkResult.Quantity;
                    checkOrder.Result = CheckAcceptEnum.Accept.ToString();
                }
                else if (checkResult.Result == CheckResultEnum.Return.ToString())//退货
                else if (IsAccept == CheckAcceptEnum.UnAccept.ObjToInt())
                {
                    checkOrder.DefectedNote = checkResult.Note;
                    checkOrder.ReturnQuantity += checkResult.Quantity;
                    checkOrder.QualifiedQuantity -= checkResult.Quantity;
                    checkOrder.Result = CheckAcceptEnum.UnAccept.ToString();
                }
                else if (checkResult.Result == CheckResultEnum.Scrapped.ToString())//报废
                else
                {
                    checkOrder.DefectedNote = checkResult.Note;
                    checkOrder.ScrappedQuantity += checkResult.Quantity;
                    checkOrder.QualifiedQuantity -= checkResult.Quantity;
                    return content.Error("未找到检验类型");
                }
                checkOrder.CheckOrderStatus = CheckOrderStatusEnum.Checked.ObjToInt();
                Dt_CheckOrderResult checkOrderResult = new Dt_CheckOrderResult()
                if (checkOrderResult!=null)
                {
                    Quantity = checkResult.Quantity,
                    CheckOrderId = checkOrderId,
                    DefectCode = checkResult.DefectCode,
                    Result = checkResult.Result,
                    Note = checkResult.Note
                };
                    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);
                BaseDal.AddData(checkOrderResult);
                return WebResponseContent.Instance.OK();
                _unitOfWorkManage.CommitTran();
                content.OK();
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error($"{ex.Message}");
                _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)
                            {
                                checkResult.Quantity = 0;
                                item.StockQuantity -= checkResult.Quantity;
                                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;
                _unitOfWorkManage.BeginTran();
                if (checkOrderResult != null)
                {
                    BaseDal.AddData(checkOrderResult);
                }
                //清除库存数量
                if (stockInfoDetails.Count>0)
                {
                    _stockRepository.StockInfoDetailRepository.UpdateData(stockInfoDetails);
                }
                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;
        }
    }
}