using AutoMapper;
|
using MailKit.Search;
|
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.Helper;
|
using WIDESEA_DTO;
|
using WIDESEA_DTO.Basic;
|
using WIDESEA_DTO.ERP;
|
using WIDESEA_External.ERPService;
|
using WIDESEA_External.Model;
|
using WIDESEA_IBasicRepository;
|
using WIDESEA_ICheckRepository;
|
using WIDESEA_IInboundRepository;
|
using WIDESEA_IInboundService;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_InboundService
|
{
|
public class ReceiveOrderService : ServiceBase<Dt_ReceiveOrder, IReceiveOrderRepository>, IReceiveOrderService
|
{
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
private readonly IMapper _mapper;
|
private readonly ICheckOrderRepository _checkOrderRepository;
|
private readonly IInboundRepository _inboundRepository;
|
private readonly IBasicRepository _basicRepository;
|
private readonly IInvokeERPService _invokeERPService;
|
|
public ReceiveOrderService(IReceiveOrderRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IMapper mapper, ICheckOrderRepository checkOrderRepository, IInboundRepository inboundRepository, IBasicRepository basicRepository, IInvokeERPService invokeERPService) : base(BaseDal)
|
{
|
_mapper = mapper;
|
_unitOfWorkManage = unitOfWorkManage;
|
_checkOrderRepository = checkOrderRepository;
|
_inboundRepository = inboundRepository;
|
_basicRepository = basicRepository;
|
_invokeERPService = invokeERPService;
|
}
|
|
public override WebResponseContent AddData(SaveModel saveModel)
|
{
|
if (saveModel.MainData.ContainsKey(nameof(Dt_ReceiveOrder.ReceiveOrderStatus).FirstLetterToLower()))
|
{
|
saveModel.MainData[nameof(Dt_ReceiveOrder.ReceiveOrderStatus).FirstLetterToLower()] = ReceiveOrderStatusEnum.NotStarted.ObjToInt();
|
}
|
else
|
{
|
saveModel.MainData.Add(nameof(Dt_ReceiveOrder.ReceiveOrderStatus).FirstLetterToLower(), ReceiveOrderStatusEnum.NotStarted.ObjToInt());
|
}
|
if (saveModel.MainData.ContainsKey(nameof(Dt_ReceiveOrder.UploadStatus).FirstLetterToLower()))
|
{
|
saveModel.MainData[nameof(Dt_ReceiveOrder.UploadStatus).FirstLetterToLower()] = WhetherEnum.False.ObjToInt();
|
}
|
else
|
{
|
saveModel.MainData.Add(nameof(Dt_ReceiveOrder.UploadStatus).FirstLetterToLower(), WhetherEnum.False.ObjToInt());
|
}
|
if (saveModel.MainData.ContainsKey(nameof(Dt_ReceiveOrder.ReceiveDate).FirstLetterToLower()))
|
{
|
saveModel.MainData[nameof(Dt_ReceiveOrder.ReceiveDate).FirstLetterToLower()] = DateTime.Now;
|
}
|
else
|
{
|
saveModel.MainData.Add(nameof(Dt_ReceiveOrder.ReceiveDate).FirstLetterToLower(), DateTime.Now);
|
}
|
|
if (saveModel.MainData.TryGetValue(nameof(Dt_ReceiveOrder.SuppliersId).FirstLetterToLower(), out object? suppliersId) && suppliersId != null && !string.IsNullOrEmpty(suppliersId.ToString()))
|
{
|
Dt_ReceiveOrder receiveOrder = BaseDal.QueryFirst(x => x.SuppliersId == suppliersId.ToString() && x.WarehouseId == Convert.ToInt32(saveModel.MainData[nameof(Dt_ReceiveOrder.WarehouseId).FirstLetterToLower()]));
|
if (receiveOrder != null && receiveOrder.ReceiveOrderStatus != ReceiveOrderStatusEnum.Completed.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error("该供应商有未完成的收货单");
|
}
|
}
|
|
return base.AddData(saveModel);
|
}
|
/// <summary>
|
/// 收货完成并回传ERP
|
/// </summary>
|
/// <param name="orderId"></param>
|
/// <returns></returns>
|
public WebResponseContent FeedbackReceiveOrder(int orderId)
|
{
|
try
|
{
|
Dt_ReceiveOrder receiveOrder = BaseDal.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderId == orderId).Includes(x => x.Details).First();
|
if (receiveOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到收货单");
|
}
|
if (receiveOrder.ReceiveOrderStatus == ReceiveOrderStatusEnum.Completed.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"收货单已完成");
|
}
|
if (receiveOrder.Details == null || receiveOrder.Details.Count == 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到收货单明细");
|
}
|
|
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == receiveOrder.WarehouseId);
|
if (warehouse == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到仓库信息");
|
}
|
|
List<RecevieOrderDetailModel> recevieOrderDetails = new List<RecevieOrderDetailModel>();
|
foreach (var item in receiveOrder.Details)
|
{
|
RecevieOrderDetailModel recevieOrderDetail = new RecevieOrderDetailModel()
|
{
|
Currcode = "",
|
IfInspection = item.IfInspection,
|
Lotno = item.LotNo,
|
MaterialsId = item.MaterielCode,
|
PriceInTax = 0,
|
PurchaseOrderCode = item.PurchaseOrderNo,
|
PurchaseOrderSerno = item.PurchaseOrderDetailRowNo,
|
QtyRecieved = item.ReceivedQuantity.ObjToInt(),
|
Serno = item.RowNo,
|
Supplotno = "",
|
Taxrate = "",
|
|
};
|
recevieOrderDetails.Add(recevieOrderDetail);
|
}
|
|
ERPReceiveModel receiveModel = new ERPReceiveModel()
|
{
|
Code = receiveOrder.ReceiveOrderNo,
|
DeliveryCode = receiveOrder.DeliveryCode,
|
CustomerId = receiveOrder.CustomerId,
|
CreatorId = receiveOrder.Creater,
|
EntDate = receiveOrder.CreateDate.ToString("yyyy-MM-dd HH:mm:ss"),
|
ReceiveDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
SuppliersId = receiveOrder.SuppliersId,
|
Type = Enum.GetName(typeof(ReceiveOrderTypeEnum), receiveOrder.ReceiveOrderType) ?? throw new Exception($"采购单类型错误"),
|
UniqueTag = receiveOrder.ReceiveOrderId.ToString(),
|
WarehouseCode = warehouse.WarehouseCode,
|
Way = 1,
|
Details = recevieOrderDetails
|
};
|
|
//更新收货单信息
|
receiveOrder.ReceiveOrderStatus = ReceiveOrderStatusEnum.Completed.ObjToInt();
|
receiveOrder.UploadStatus = WhetherEnum.True.ObjToInt();
|
BaseDal.UpdateData(receiveOrder);
|
//创建入库单
|
CreateInboundOrder(orderId);
|
//收货推送至ERP 测试注释
|
_invokeERPService.InvokeMatReceiveApi(receiveModel);
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
public WebResponseContent GetReceiveOrders(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
int pageNo = saveModel.MainData["pageNo"].ObjToInt();
|
int warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
|
string orderNo = saveModel.MainData["orderNo"].ToString();
|
List<Dt_ReceiveOrder> dt_ReceiveOrders = new List<Dt_ReceiveOrder>();
|
if (string.IsNullOrEmpty(orderNo))
|
{
|
dt_ReceiveOrders = Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderStatus < ReceiveOrderStatusEnum.Completed.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5);
|
}
|
else
|
{
|
dt_ReceiveOrders = Db.Queryable<Dt_ReceiveOrder>().Where(x => (x.ReceiveOrderNo.Contains(orderNo) || x.SuppliersId.Contains(orderNo)) && x.ReceiveOrderStatus < ReceiveOrderStatusEnum.Completed.ObjToInt() && x.WarehouseId == warehouseId).ToPageList(pageNo, 5);
|
}
|
|
content.OK(data: dt_ReceiveOrders);
|
}
|
catch (Exception)
|
{
|
|
throw;
|
}
|
return content;
|
}
|
/// <summary>
|
/// 创建入库单
|
/// </summary>
|
/// <param name="receiveOrderId">收货单编号</param>
|
/// <returns></returns>
|
public WebResponseContent CreateInboundOrder(int receiveOrderId)
|
{
|
try
|
{
|
Dt_ReceiveOrder receiveOrder = Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderId == receiveOrderId).Includes(x => x.Details).First();
|
if (receiveOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该收货单信息");
|
}
|
if (receiveOrder.Details == null || receiveOrder.Details.Count() <= 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到该收货单明细信息");
|
}
|
if (receiveOrder.ReceiveOrderStatus != ReceiveOrderStatusEnum.Completed.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"该收货单未完成");
|
}
|
#region 注释
|
//List<Dt_CheckOrder> checkOrders = _checkOrderRepository.QueryData(x => x.ReceiveOrderNo == receiveOrder.ReceiveOrderNo);
|
//if (checkOrders.FirstOrDefault(x => x.CheckOrderStatus == CheckOrderStatusEnum.NotCheck.ObjToInt()) != null)
|
//{
|
// return WebResponseContent.Instance.Error($"该收货单未质检完成");
|
//}
|
|
//if (checkOrders.FirstOrDefault(x => x.AuditStatus != AuditStatusEnum.Agree.ObjToInt()) != null)
|
//{
|
// return WebResponseContent.Instance.Error($"该收货单质检结果审批未完成");
|
//}
|
#endregion
|
|
Dt_InboundOrder inboundOrder = new Dt_InboundOrder()
|
{
|
UpperOrderNo = receiveOrder.ReceiveOrderNo,
|
CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(),
|
OrderStatus = InOrderStatusEnum.未开始.ObjToInt(),
|
OrderType = InOrderTypeEnum.Purchase.ObjToInt(),
|
WarehouseId = receiveOrder.WarehouseId,
|
SupplierId = receiveOrder.SuppliersId,
|
Details = new List<Dt_InboundOrderDetail>()
|
};
|
|
foreach (var item in receiveOrder.Details)
|
{
|
float quantity = item.ReceivedQuantity;
|
#region 注释
|
//if (item.IfInspection == WhetherEnum.True.ObjToInt())
|
//{
|
// Dt_CheckOrder? checkOrder = checkOrders.FirstOrDefault(x => x.ReceiveOrderNo == receiveOrder.ReceiveOrderNo && x.ReceiveDetailRowNo == item.RowNo);
|
// if (checkOrder == null)
|
// {
|
// return WebResponseContent.Instance.Error($"质检单数据错误");
|
// }
|
// quantity = checkOrder.QualifiedQuantity.GetValueOrDefault() + checkOrder.DefectedQuantity.GetValueOrDefault();
|
//}
|
#endregion
|
Dt_InboundOrderDetail detail = new Dt_InboundOrderDetail()
|
{
|
MaterielCode = item.MaterielCode,
|
OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(),
|
OrderQuantity = quantity,
|
OverInQuantity = 0,
|
ReceiptQuantity = 0,
|
RowNo = item.RowNo,
|
Unit = item.Unit,
|
BatchNo = item.LotNo
|
};
|
inboundOrder.Details.Add(detail);
|
}
|
|
_inboundRepository.InboundOrderRepository.Db.InsertNav(inboundOrder).Include(x => x.Details).ExecuteCommand();
|
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
public WebResponseContent ReceiveAllOrder(int purchaseOrderId, string lotNo)
|
{
|
try
|
{
|
Dt_PurchaseOrder purchaseOrder = Db.Queryable<Dt_PurchaseOrder>().Where(x => x.Id == purchaseOrderId).Includes(x => x.Details).First();
|
if (purchaseOrder == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该采购单");
|
}
|
if (purchaseOrder.Details.Count == 0)
|
{
|
return WebResponseContent.Instance.Error($"未找到采购单明细信息");
|
}
|
if (purchaseOrder.PurchaseOrderStatus == PurchaseOrderStatusEnum.Received.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"已收货完成");
|
}
|
if (purchaseOrder.Details.FirstOrDefault(x => x.PurchaseDetailStatus == PurchaseOrderStatusEnum.NotReceived.ObjToInt()) == null)
|
{
|
return WebResponseContent.Instance.Error($"已收货完成");
|
}
|
List<Dt_CheckOrder> checkOrders = new List<Dt_CheckOrder>();
|
List<Dt_MaterielInfo> materielInfos = new List<Dt_MaterielInfo>();
|
List<Dt_ReceiveOrderDetail> receiveOrderDetails = new List<Dt_ReceiveOrderDetail>();
|
Dt_ReceiveOrder receiveOrder = BaseDal.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.SuppliersId == purchaseOrder.SupplierCode && x.ReceiveOrderStatus != ReceiveOrderStatusEnum.Completed.ObjToInt()).Includes(x => x.Details).First();
|
if (receiveOrder == null)
|
{
|
int rowNo = 0;
|
foreach (var item in purchaseOrder.Details)
|
{
|
Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode);
|
if (materielInfo == null)
|
{
|
materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == item.MaterielCode);
|
if (materielInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该物料的信息");
|
}
|
materielInfos.Add(materielInfo);
|
}
|
Dt_ReceiveOrderDetail receiveOrderDetail = new Dt_ReceiveOrderDetail()
|
{
|
PurchaseOrderNo = purchaseOrder.PurchaseOrderNo,
|
ReceivedQuantity = item.PurchaseDetailQuantity,
|
MaterielCode = item.MaterielCode,
|
LotNo = lotNo,
|
PurchaseOrderDetailRowNo = item.RowNo,
|
IfInspection = materielInfo.IsCheck.ObjToInt(),
|
CurrCode = "",
|
PriceInTax = 0,
|
TaxRate = "",
|
RowNo = rowNo + 1,
|
Unit = item.Unit
|
};
|
rowNo += 1;
|
receiveOrderDetails.Add(receiveOrderDetail);
|
#region 注释
|
//if (materielInfo.IsCheck == WhetherEnum.True)
|
//{
|
// Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail);
|
// checkOrder.CheckOrderNo = "TestCheckNo21";//测试
|
// checkOrder.ReceiveOrderNo = "";
|
// checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity;
|
// checkOrder.ScrappedQuantity = 0;
|
// checkOrder.ReturnQuantity = 0;
|
// checkOrder.DefectedQuantity = 0;
|
// checkOrder.ReceiveDetailRowNo = rowNo;
|
// checkOrder.UploadStatus = CheckUploadEnum.UploadNo.ObjToInt();
|
// checkOrders.Add(checkOrder);
|
//}
|
#endregion
|
}
|
receiveOrder = new Dt_ReceiveOrder()
|
{
|
ReceiveOrderStatus = ReceiveOrderStatusEnum.Receiving.ObjToInt(),
|
CustomerId = "",
|
DeliveryCode = "/",
|
ReceiveDate = DateTime.Now,
|
ReceiveOrderType = ReceiveOrderTypeEnum.PO.ObjToInt(),
|
SuppliersId = purchaseOrder.SupplierCode,
|
WarehouseId = purchaseOrder.Details.FirstOrDefault()?.WarehouseId ?? 0,
|
UploadStatus = WhetherEnum.False.ObjToInt(),
|
Details = receiveOrderDetails
|
};
|
}
|
else
|
{
|
int rowNo = receiveOrder.Details.Count > 0 ? receiveOrder.Details.Max(x => x.RowNo) : 0;
|
|
foreach (var item in purchaseOrder.Details)
|
{
|
Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterielCode);
|
if (materielInfo == null)
|
{
|
materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == item.MaterielCode);
|
if (materielInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到该物料的信息");
|
}
|
materielInfos.Add(materielInfo);
|
}
|
Dt_ReceiveOrderDetail receiveOrderDetail = new Dt_ReceiveOrderDetail()
|
{
|
PurchaseOrderNo = purchaseOrder.PurchaseOrderNo,
|
ReceivedQuantity = item.PurchaseDetailQuantity,
|
MaterielCode = item.MaterielCode,
|
LotNo = lotNo,
|
ReceiveOrderId = receiveOrder.ReceiveOrderId,
|
PurchaseOrderDetailRowNo = item.RowNo,
|
IfInspection = materielInfo.IsCheck.ObjToInt(),
|
CurrCode = "",
|
PriceInTax = 0,
|
TaxRate = "",
|
RowNo = rowNo + 1,
|
Unit = item.Unit,
|
|
};
|
rowNo += 1;
|
receiveOrderDetails.Add(receiveOrderDetail);
|
|
//if (materielInfo.IsCheck == WhetherEnum.True)
|
//{
|
// Dt_CheckOrder checkOrder = _mapper.Map<Dt_CheckOrder>(receiveOrderDetail);
|
// checkOrder.CheckOrderNo = "Test-CheckNo1";//测试
|
// checkOrder.QualifiedQuantity = receiveOrderDetail.ReceivedQuantity;
|
// checkOrder.ScrappedQuantity = 0;
|
// checkOrder.ReceiveOrderNo = receiveOrder.ReceiveOrderNo;
|
// checkOrder.ReturnQuantity = 0;
|
// checkOrder.DefectedQuantity = 0;
|
// checkOrder.ReceiveDetailRowNo = rowNo;
|
// checkOrder.UploadStatus = CheckUploadEnum.UploadNo.ObjToInt();
|
// checkOrders.Add(checkOrder);
|
//}
|
}
|
}
|
|
purchaseOrder.Details.ForEach(x => x.PurchaseDetailStatus = PurchaseOrderStatusEnum.Received.ObjToInt());
|
purchaseOrder.PurchaseOrderStatus = PurchaseOrderStatusEnum.Received.ObjToInt();
|
|
_unitOfWorkManage.BeginTran();
|
if (receiveOrder.ReceiveOrderId > 0)
|
{
|
Db.Insertable(receiveOrderDetails).ExecuteCommand();
|
}
|
else
|
{
|
Db.InsertNav(receiveOrder).Include(x => x.Details).ExecuteCommand();
|
checkOrders.ForEach(x => x.ReceiveOrderNo = receiveOrder.ReceiveOrderNo);
|
}
|
//if (checkOrders.Count > 0)
|
//{
|
// _checkOrderRepository.AddData(checkOrders);
|
//}
|
_inboundRepository.PurchaseOrderRepository.UpdateData(purchaseOrder);
|
_inboundRepository.PurchaseOrderDetailRepository.UpdateData(purchaseOrder.Details);
|
_unitOfWorkManage.CommitTran();
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
}
|
}
|