|
using AutoMapper;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Common.CommonEnum;
|
using WIDESEA_Common.OrderEnum;
|
using WIDESEA_Core;
|
using WIDESEA_Core.BaseRepository;
|
using WIDESEA_Core.BaseServices;
|
using WIDESEA_Core.CodeConfigEnum;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_DTO.Basic;
|
using WIDESEA_IBasicRepository;
|
using WIDESEA_ICheckRepository;
|
using WIDESEA_IInboundRepository;
|
using WIDESEA_IInboundService;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_InboundService
|
{
|
public class ReceiveOrderDetailService : ServiceBase<Dt_ReceiveOrderDetail, IReceiveOrderDetailRepository>, IReceiveOrderDetailService
|
{
|
private readonly IMapper _mapper;
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
private readonly IInboundRepository _inboundRepository;
|
private readonly IBasicRepository _basicRepository;
|
private readonly ICheckOrderRepository _checkOrderRepository;
|
|
public ReceiveOrderDetailService(IReceiveOrderDetailRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IInboundRepository inboundRepository, IBasicRepository basicRepository, ICheckOrderRepository checkOrderRepository) : base(BaseDal)
|
{
|
_mapper = mapper;
|
_unitOfWorkManage = unitOfWorkManage;
|
_inboundRepository = inboundRepository;
|
_basicRepository = basicRepository;
|
_checkOrderRepository = checkOrderRepository;
|
}
|
|
private static object _rowNoLocker = new object();
|
/// <summary>
|
/// 扫码添加收货单明细(单个)
|
/// </summary>
|
/// <param name="serNum">物料码</param>
|
/// <param name="orderNo">收货单号</param>
|
/// <returns></returns>
|
public WebResponseContent AddReceiveOrderDetail(string serNum, string orderNo)
|
{
|
try
|
{
|
Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == orderNo).Includes(x => x.Details).First();
|
if (receiveOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该收货单");
|
}
|
|
if (receiveOrder.ReceiveOrderStatus == ReceiveOrderStatusEnum.Completed.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"该单据已收货完成");
|
}
|
|
MatSerNumAnalysisModel model = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNum);
|
|
Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == model.MaterielCode);
|
if (materielInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该物料的信息");
|
}
|
//该收货单仓库是否有该物料
|
if (materielInfo.WarehouseId != receiveOrder.WarehouseId)
|
{
|
return WebResponseContent.Instance.Error($"该物料不属于该仓库");
|
}
|
Dt_PurchaseOrder purchaseOrder = _inboundRepository.PurchaseOrderRepository.Db.Queryable<Dt_PurchaseOrder>().Where(x => x.PurchaseOrderNo == model.PurchaseOrderNo).Includes(x => x.Details).First();
|
if (purchaseOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该采购单");
|
}
|
if (purchaseOrder.Details.Count == 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到该采购单明细数据");
|
}
|
if (purchaseOrder.SupplierCode != receiveOrder.SuppliersId)
|
{
|
return WebResponseContent.Instance.Error($"供应商不一致,请新建收货单");
|
}
|
if (purchaseOrder.PurchaseOrderStatus == PurchaseOrderStatusEnum.Received.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"该采购单收货已完成");
|
}
|
Dt_PurchaseOrderDetail? purchaseOrderDetail = purchaseOrder.Details.FirstOrDefault(x => x.MaterielCode == model.MaterielCode && (x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.NotReceived.ObjToInt() || x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.Receiving.ObjToInt()));
|
if (purchaseOrderDetail == null)
|
{
|
return WebResponseContent.Instance.Error($"该采购单明细收货已完成");
|
}
|
//判断是否存在对应采购明细的收货明细
|
Dt_ReceiveOrderDetail? detail = receiveOrder.Details.FirstOrDefault(x => x.PurchaseOrderNo == model.PurchaseOrderNo && x.PurchaseOrderDetailRowNo == purchaseOrderDetail.RowNo);
|
if (detail != null && detail.ReceivedQuantity == purchaseOrderDetail.PurchaseDetailQuantity)
|
{
|
return WebResponseContent.Instance.Error($"该收货单明细已收货");
|
}
|
|
lock (_rowNoLocker)
|
{
|
if (detail != null)
|
{
|
//原有收货明细增加收货数量
|
detail.ReceivedQuantity += model.Quantity;
|
purchaseOrderDetail.PurchaseDetailReceiveQty = detail.ReceivedQuantity;
|
if (purchaseOrderDetail.PurchaseDetailReceiveQty > purchaseOrderDetail.PurchaseDetailQuantity)
|
{
|
return WebResponseContent.Instance.Error($"采购单该物料数量和收货数量不一致");
|
}
|
if (purchaseOrderDetail.PurchaseDetailReceiveQty == purchaseOrderDetail.PurchaseDetailQuantity)
|
{
|
purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Received.ObjToInt();
|
}
|
else
|
{
|
purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Receiving.ObjToInt();
|
}
|
float sumQty = purchaseOrder.Details.Sum(x => x.PurchaseDetailReceiveQty)+ model.Quantity;
|
if (purchaseOrder.OrderQuantity == sumQty)
|
{
|
purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Received.ObjToInt();
|
}
|
else
|
{
|
purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Receiving.ObjToInt();
|
}
|
_unitOfWorkManage.BeginTran();
|
_inboundRepository.PurchaseOrderRepository.UpdateData(purchaseOrder);
|
BaseDal.UpdateData(detail);
|
_inboundRepository.PurchaseOrderDetailRepository.UpdateData(purchaseOrderDetail);
|
_unitOfWorkManage.CommitTran();
|
}
|
else
|
{
|
int rowNo = 0;
|
if (receiveOrder.Details.Count > 0)
|
{
|
rowNo = receiveOrder.Details.Max(x => x.RowNo);
|
}
|
Dt_ReceiveOrderDetail receiveOrderDetail = new Dt_ReceiveOrderDetail()
|
{
|
PurchaseOrderNo = model.PurchaseOrderNo,
|
ReceivedQuantity = model.Quantity,
|
MaterielCode = model.MaterielCode,
|
LotNo = model.LotNo,
|
ReceiveOrderId = receiveOrder.ReceiveOrderId,
|
PurchaseOrderDetailRowNo = purchaseOrderDetail.RowNo,
|
IfInspection = materielInfo.IsCheck.ObjToInt(),
|
CurrCode = "",
|
PriceInTax = 0,
|
TaxRate = "",
|
RowNo = rowNo + 1,
|
Unit = purchaseOrderDetail.Unit
|
};
|
if (receiveOrder.ReceiveOrderStatus == ReceiveOrderStatusEnum.NotStarted.ObjToInt())
|
{
|
receiveOrder.ReceiveOrderStatus = ReceiveOrderStatusEnum.Receiving.ObjToInt();
|
}
|
//判断采购明细数量
|
if (purchaseOrderDetail.PurchaseDetailQuantity < model.Quantity)
|
{
|
return WebResponseContent.Instance.Error($"请核对采购单该物料数量");
|
}
|
if (purchaseOrderDetail.PurchaseDetailReceiveQty > 0)
|
{
|
purchaseOrderDetail.PurchaseDetailReceiveQty += model.Quantity;
|
}
|
else
|
{
|
purchaseOrderDetail.PurchaseDetailReceiveQty = model.Quantity;
|
}
|
if (purchaseOrderDetail.PurchaseDetailReceiveQty > purchaseOrderDetail.PurchaseDetailQuantity)
|
{
|
return WebResponseContent.Instance.Error($"采购单该物料数量和收货数量不一致");
|
}
|
if (purchaseOrderDetail.PurchaseDetailQuantity == purchaseOrderDetail.PurchaseDetailReceiveQty)
|
{
|
purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Received.ObjToInt();
|
}
|
float sumQty = purchaseOrder.Details.Sum(x => x.PurchaseDetailReceiveQty) + model.Quantity;
|
_unitOfWorkManage.BeginTran();
|
BaseDal.AddData(receiveOrderDetail);
|
if (purchaseOrder.OrderQuantity == sumQty)
|
{
|
purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Received.ObjToInt();
|
_inboundRepository.PurchaseOrderRepository.UpdateData(purchaseOrder);
|
}
|
_inboundRepository.ReceiveOrderRepository.UpdateData(receiveOrder);
|
_inboundRepository.PurchaseOrderDetailRepository.UpdateData(purchaseOrderDetail);
|
#region 注释
|
//if (materielInfo.IsCheck == WhetherEnum.True)
|
//{
|
// Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail);
|
// checkOrder.ReceiveOrderNo = receiveOrder.ReceiveOrderNo;
|
// checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity;
|
// checkOrder.ScrappedQuantity = 0;
|
// checkOrder.ReturnQuantity = 0;
|
// checkOrder.DefectedQuantity = 0;
|
// _checkOrderRepository.AddData(checkOrder);
|
//}
|
#endregion
|
_unitOfWorkManage.CommitTran();
|
}
|
|
return WebResponseContent.Instance.OK();
|
}
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
public WebResponseContent ScaninnerCode(string innerCode)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
var innerCodes = innerCode.Split(',');
|
var matCode = innerCodes.FirstOrDefault(x => x.Contains("M:"));//.Replace("M:", "");
|
if (matCode == null) throw new Exception("未获取到物料码");
|
var batchNo = innerCodes.FirstOrDefault(x => x.Contains("BS:"));//.Replace("BS:", "")
|
if (batchNo == null) throw new Exception("未获取到批次号");
|
var purchaseOrderNo = innerCodes.FirstOrDefault(x => x.Contains("PO:"));//.Replace("PO:", "")
|
if (purchaseOrderNo == null) throw new Exception("未获取到采购单号");
|
var qty = innerCodes.FirstOrDefault(x => x.Contains("Q:"));
|
if (qty == null) throw new Exception("未获取到数量");
|
InnerCodeDTO innerCodeDTO = new InnerCodeDTO()
|
{
|
matCode = matCode.Replace("M:", ""),
|
batchNo = batchNo.Replace("BS:", ""),
|
purchaseOrderNo = purchaseOrderNo.Replace("PO:", ""),
|
qty = Convert.ToInt32(qty.Replace("Q:", ""))
|
};
|
content.OK("扫描成功", data: innerCodeDTO);
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
public WebResponseContent GetReceiveOrderInfos(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
string searchValue = saveModel.MainData["searchValue"].ToString();
|
string orderNo = saveModel.MainData["orderNo"].ToString();
|
Dt_ReceiveOrder receiveOrder = Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == orderNo).First();
|
if (receiveOrder == null) throw new Exception($"未找到单据编号【{orderNo}】信息");
|
List<Dt_ReceiveOrderDetail> receiveOrderDetails = new List<Dt_ReceiveOrderDetail>();
|
if (string.IsNullOrEmpty(searchValue))
|
{
|
receiveOrderDetails = Db.Queryable<Dt_ReceiveOrderDetail>().Where(x => x.ReceiveOrderId == receiveOrder.ReceiveOrderId).ToList();
|
}
|
else
|
{
|
receiveOrderDetails = Db.Queryable<Dt_ReceiveOrderDetail>().Where(x => x.ReceiveOrderId == receiveOrder.ReceiveOrderId && x.MaterielCode == searchValue).ToList();
|
}
|
|
content.OK(data: receiveOrderDetails);
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
}
|
}
|