|
using AutoMapper;
|
using Newtonsoft.Json;
|
using System;
|
using System.Collections.Generic;
|
using System.Globalization;
|
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;
|
using WIDESEA_DTO.Basic;
|
using WIDESEA_DTO.QMS;
|
using WIDESEA_External.Model;
|
using WIDESEA_External.QMSService;
|
using WIDESEA_IBasicRepository;
|
using WIDESEA_ICheckRepository;
|
using WIDESEA_IInboundRepository;
|
using WIDESEA_IInboundService;
|
using WIDESEA_IStockRepository;
|
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;
|
private readonly IStockRepository _stockRepository;
|
private readonly ISupplierInfoRepository _supplierInfoRepository;
|
private readonly IInvokeQMSService _invokeQMSService;
|
|
public ReceiveOrderDetailService(IReceiveOrderDetailRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IInboundRepository inboundRepository, IBasicRepository basicRepository, ICheckOrderRepository checkOrderRepository, IStockRepository stockRepository,ISupplierInfoRepository supplierInfoRepository,IInvokeQMSService invokeQMSService) : base(BaseDal)
|
{
|
_mapper = mapper;
|
_unitOfWorkManage = unitOfWorkManage;
|
_inboundRepository = inboundRepository;
|
_basicRepository = basicRepository;
|
_checkOrderRepository = checkOrderRepository;
|
_stockRepository = stockRepository;
|
_supplierInfoRepository = supplierInfoRepository;
|
_invokeQMSService = invokeQMSService;
|
}
|
|
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($"该单据已收货完成");
|
}
|
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == receiveOrder.WarehouseId);
|
MatSerNumAnalysisModel model = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNum);
|
Dt_SupplierInfo supplierInfo = _supplierInfoRepository.QueryFirst(x => x.SupplierCode == receiveOrder.SuppliersId);
|
//收货增加批次卡控
|
//查询收货明细是否有存在同一个批次
|
Dt_ReceiveOrderDetail receiveOrderDetailOld = _inboundRepository.ReceiveOrderDetailRepository.QueryFirst(x => x.LotNo == model.LotNo && x.MaterielCode == model.MaterielCode);
|
Dt_ReceiveOrder? receiveOrderOld = null;
|
if (receiveOrderDetailOld!=null)
|
{
|
receiveOrderOld = _inboundRepository.ReceiveOrderRepository.QueryFirst(x => x.ReceiveOrderId == receiveOrderDetailOld.ReceiveOrderId);
|
}
|
if (receiveOrderDetailOld!=null && receiveOrderOld?.WarehouseId== receiveOrder.WarehouseId)
|
{
|
return WebResponseContent.Instance.Error($"收货单号{receiveOrderOld.ReceiveOrderNo}中批次{model.LotNo}已存在");
|
}
|
//查询库存批次是否有存在同一个批次
|
Dt_StockInfoDetail stockInfoDetail = _stockRepository.StockInfoDetailRepository.QueryFirst(x => x.BatchNo == model.LotNo && x.MaterielCode == model.MaterielCode);
|
Dt_StockInfo? stockInfo = null;
|
if (stockInfoDetail!=null)
|
{
|
stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.Id == stockInfoDetail.Id);
|
}
|
if (stockInfoDetail!=null && stockInfo?.WarehouseId==receiveOrder.WarehouseId)
|
{
|
return WebResponseContent.Instance.Error($"库存{stockInfo.PalletCode}中批次{model.LotNo}已存在");
|
}
|
if (model!=null)
|
{
|
string format = "yyyy-MM-dd"; // 目标格式
|
DateTime parsedDate;
|
// 解析验证格式
|
bool isValidEffDate = DateTime.TryParseExact(
|
model.EffectiveDate,
|
format,
|
CultureInfo.InvariantCulture,
|
DateTimeStyles.None,
|
out parsedDate
|
);
|
bool isValidProDate = DateTime.TryParseExact(
|
model.ProductionDate,
|
format,
|
CultureInfo.InvariantCulture,
|
DateTimeStyles.None,
|
out parsedDate
|
);
|
|
if (!isValidEffDate || !isValidProDate)
|
{
|
return WebResponseContent.Instance.Error("格式无效或日期不合法");
|
}
|
}
|
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($"该物料不属于该仓库");
|
}
|
//无采购单进行收货
|
if (receiveOrder.ReceiveOrderType != ReceiveOrderTypeEnum.PO.ObjToInt())
|
{
|
//获取具体批次及物料
|
Dt_ReceiveOrderDetail? detailNoPo = receiveOrder.Details.FirstOrDefault(x => x.LotNo == model.LotNo && x.MaterielCode == model.MaterielCode);
|
lock (_rowNoLocker)
|
{
|
if (detailNoPo != null)
|
{
|
//原有收货明细增加收货数量
|
detailNoPo.ReceivedQuantity += model.Quantity;
|
_unitOfWorkManage.BeginTran();
|
BaseDal.UpdateData(detailNoPo);
|
_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,
|
MaterielName = materielInfo.MaterielName,
|
MaterielSpec = materielInfo.MaterielSpec,
|
ReceiveOrderId = receiveOrder.ReceiveOrderId,
|
PurchaseOrderDetailRowNo = rowNo + 1,
|
IfInspection = materielInfo.IsCheck.ObjToInt(),
|
CurrCode = "",
|
PriceInTax = 0,
|
TaxRate = "",
|
RowNo = rowNo + 1,
|
Unit = materielInfo.MaterielUnit
|
};
|
if (receiveOrder.ReceiveOrderStatus == ReceiveOrderStatusEnum.NotStarted.ObjToInt())
|
{
|
receiveOrder.ReceiveOrderStatus = ReceiveOrderStatusEnum.Receiving.ObjToInt();
|
}
|
_unitOfWorkManage.BeginTran();
|
_inboundRepository.ReceiveOrderDetailRepository.AddData(receiveOrderDetail);
|
_inboundRepository.ReceiveOrderRepository.UpdateData(receiveOrder);
|
#region 注释
|
if (materielInfo.IsCheck == WhetherEnum.True)
|
{
|
Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail);
|
checkOrder.ReceiveOrderNo = receiveOrder.ReceiveOrderNo;
|
checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity;
|
checkOrder.ReceiveDetailRowNo = receiveOrderDetail.RowNo;
|
checkOrder.ScrappedQuantity = 0;
|
checkOrder.ReturnQuantity = 0;
|
checkOrder.DefectedQuantity = 0;
|
_checkOrderRepository.AddData(checkOrder);
|
}
|
#endregion
|
_unitOfWorkManage.CommitTran();
|
}
|
return WebResponseContent.Instance.OK();
|
}
|
}
|
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.Where(x => x.MaterielCode == model.MaterielCode && (x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.NotReceived.ObjToInt() || x.PurchaseDetailStatus == PurchaseOrderDetailStatusEnum.Receiving.ObjToInt())).OrderBy(x=>x.Id).FirstOrDefault();
|
if (purchaseOrderDetail == null)
|
{
|
return WebResponseContent.Instance.Error($"该采购单明细收货已完成");
|
}
|
//判断该采购单明细是否已存在明细
|
List<Dt_ReceiveOrderDetail> details = receiveOrder.Details.Where(x => x.PurchaseOrderNo == model.PurchaseOrderNo && x.PurchaseOrderDetailRowNo == purchaseOrderDetail.RowNo && x.MaterielCode == model.MaterielCode).ToList();
|
if (details.Count >0 && details.Sum(x=>x.ReceivedQuantity) == purchaseOrderDetail.PurchaseDetailQuantity)
|
{
|
return WebResponseContent.Instance.Error($"该收货单明细已收货");
|
}
|
//获取具体批次及物料
|
Dt_ReceiveOrderDetail? detail = details.FirstOrDefault(x => x.LotNo == model.LotNo && x.MaterielCode==model.MaterielCode);
|
lock (_rowNoLocker)
|
{
|
if (detail != null)
|
{
|
//原有收货明细增加收货数量
|
detail.ReceivedQuantity += model.Quantity;
|
purchaseOrderDetail.PurchaseDetailReceiveQty += model.Quantity;
|
if (purchaseOrderDetail.PurchaseDetailReceiveQty > purchaseOrderDetail.PurchaseDetailQuantity)
|
{
|
return WebResponseContent.Instance.Error($"采购单行号{purchaseOrderDetail.RowNo}物料{purchaseOrderDetail.MaterielCode}数量溢出:{purchaseOrderDetail.PurchaseDetailReceiveQty - purchaseOrderDetail.PurchaseDetailQuantity}");
|
}
|
if (purchaseOrderDetail.PurchaseDetailReceiveQty == purchaseOrderDetail.PurchaseDetailQuantity)
|
{
|
purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Received.ObjToInt();
|
}
|
else
|
{
|
purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Receiving.ObjToInt();
|
}
|
float sumQty = purchaseOrder.Details.Sum(x => x.PurchaseDetailReceiveQty);
|
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,
|
MaterielName=materielInfo.MaterielName,
|
MaterielSpec=materielInfo.MaterielSpec,
|
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($"采购单行号{purchaseOrderDetail.RowNo}物料{purchaseOrderDetail.MaterielCode}数量溢出:{purchaseOrderDetail.PurchaseDetailReceiveQty - purchaseOrderDetail.PurchaseDetailQuantity}");
|
}
|
if (purchaseOrderDetail.PurchaseDetailQuantity == purchaseOrderDetail.PurchaseDetailReceiveQty)
|
{
|
purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Received.ObjToInt();
|
}
|
else
|
{
|
purchaseOrderDetail.PurchaseDetailStatus = PurchaseOrderDetailStatusEnum.Receiving.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);
|
}
|
if(purchaseOrder.PurchaseOrderStatus== PurchaseOrderStatusEnum.NotReceived.ObjToInt())
|
{
|
purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Receiving.ObjToInt();
|
_inboundRepository.PurchaseOrderRepository.UpdateData(purchaseOrder);
|
}
|
_inboundRepository.ReceiveOrderRepository.UpdateData(receiveOrder);
|
_inboundRepository.PurchaseOrderDetailRepository.UpdateData(purchaseOrderDetail);
|
if (materielInfo.IsCheck == WhetherEnum.True)
|
{
|
Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail);
|
checkOrder.ReceiveOrderNo = receiveOrder.ReceiveOrderNo;
|
checkOrder.Result = CheckAcceptEnum.NotCheckAccept.ToString();
|
checkOrder.QualifiedQuantity = 0;
|
checkOrder.ReceiveDetailRowNo = receiveOrderDetail.RowNo;
|
checkOrder.WarehouseId = receiveOrder.WarehouseId;
|
checkOrder.ScrappedQuantity = 0;
|
checkOrder.MaterielSpec = materielInfo.MaterielSpec;
|
checkOrder.ReturnQuantity = 0;
|
checkOrder.DefectedQuantity = 0;
|
int id = _checkOrderRepository.AddData(checkOrder);
|
QMSReceiveCheckModel qMSReceiveCheck = new QMSReceiveCheckModel()
|
{
|
UniqueTag = id.ToString(),
|
EntryNumber = receiveOrder.ReceiveOrderNo,
|
MaterialCode = receiveOrderDetail.MaterielCode,
|
MaterialName = receiveOrderDetail.MaterielName,
|
Quantity = (decimal)receiveOrderDetail.ReceivedQuantity,
|
SupplierCode = receiveOrder.SuppliersId,
|
SupplierName = supplierInfo.SupplierName,
|
BatchNumber = receiveOrderDetail.LotNo,
|
DeliveryNumber = receiveOrder.DeliveryCode,
|
PurchaseNumber = receiveOrderDetail.PurchaseOrderNo,
|
RowNumber = receiveOrderDetail.RowNo,
|
WarehouseCode = warehouse.WarehouseCode,
|
ReceiptDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
Remark = " "
|
};
|
string response = _invokeQMSService.InvokeReceiveCheckApi(qMSReceiveCheck);
|
MesResponseContent mesResponseContent = response.DeserializeObject<MesResponseContent>();
|
if (!mesResponseContent.BSucc)
|
{
|
throw new Exception(mesResponseContent.StrMsg);
|
}
|
ReceiveResultDTO? receiveResult = JsonConvert.DeserializeObject<ReceiveResultDTO>(mesResponseContent.Content.ToString());
|
if (receiveResult == null)
|
{
|
throw new Exception("接收QMS结果失败");
|
}
|
Dt_CheckOrder _CheckOrder = _checkOrderRepository.QueryFirst(x => x.CheckOrderId == id);
|
_CheckOrder.CheckOrderNo = receiveResult.InspectionNumber;
|
_checkOrderRepository.UpdateData(_CheckOrder);
|
}
|
_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;
|
}
|
}
|
}
|