using AutoMapper;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Common.MaterielEnum;
|
using WIDESEA_Common.OrderEnum;
|
using WIDESEA_Common.WareHouseEnum;
|
using WIDESEA_Core;
|
using WIDESEA_Core.BaseServices;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_DTO.ERP;
|
using WIDESEA_IBasicRepository;
|
using WIDESEA_IOutboundRepository;
|
using WIDESEA_IOutboundService;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_OutboundService
|
{
|
public class ProDeliveryOrderService : ServiceBase<Dt_ProDeliveryOrder, IProDeliveryOrderRepository>, IProDeliveryOrderService
|
{
|
public IProDeliveryOrderRepository Repository => BaseDal;
|
private readonly IBasicRepository _basicRepository;
|
private readonly IMapper _mapper;
|
private readonly IProDeliveryOrderDetailRepository _proDeliveryOrderDetailRepository;
|
public ProDeliveryOrderService(IProDeliveryOrderRepository BaseDal, IBasicRepository basicRepository, IMapper mapper, IProDeliveryOrderDetailRepository proDeliveryOrderDetailRepository) : base(BaseDal)
|
{
|
_basicRepository = basicRepository;
|
_mapper = mapper;
|
_proDeliveryOrderDetailRepository = proDeliveryOrderDetailRepository;
|
}
|
/// <summary>
|
/// 接收ERP成品销售出库信息
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent ReceiveProDeliveryOrder(ERPProDeliveryDTO eRPProDeliveryDTO)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
if (eRPProDeliveryDTO == null)
|
{
|
return content.Error("销售出库信息不能为空");
|
}
|
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == eRPProDeliveryDTO.WarehouseCode);
|
if (warehouse == null)
|
{
|
return content.Error($"仓库信息不存在{eRPProDeliveryDTO.WarehouseCode}");
|
}
|
//获取所有物料
|
List<Dt_MaterielInfo> materielInfos = _basicRepository.MaterielInfoRepository.QueryData(x => x.WarehouseId == warehouse.WarehouseId && x.MaterielInvOrgId == MaterielInvOrgEnum.新厂.ObjToInt());
|
|
//获取所有客户
|
List<Dt_CustomerInfo> customerInfos = _basicRepository.CustomerInfoRepository.QueryData();
|
|
//判断是否存在物料
|
DeliveryDetailItem? deliveryDetailItem = eRPProDeliveryDTO.DeliveryDetail.FirstOrDefault(x => !materielInfos.Select(x => x.MaterielCode).Contains(x.MaterialCode));
|
if (deliveryDetailItem != null)
|
{
|
return content.Error($"物料信息{deliveryDetailItem.MaterialCode}不存在");
|
}
|
|
//判断是否存在客户
|
DeliveryDetailItem? deliveryDetailCustom = eRPProDeliveryDTO.DeliveryDetail.FirstOrDefault(x => !customerInfos.Select(x => x.CustomerCode).Contains(x.Customer));
|
|
if (deliveryDetailCustom != null)
|
{
|
return content.Error($"客户信息{deliveryDetailCustom.Customer}不存在");
|
}
|
|
//获取所有销售出库信息
|
List<Dt_ProDeliveryOrder> proDeliveryOrdersOld = BaseDal.Db.Queryable<Dt_ProDeliveryOrder>().Includes(x => x.Details).ToList();
|
|
if (eRPProDeliveryDTO.OperateType == 1)
|
{
|
//判断重复插入
|
Dt_ProDeliveryOrder? proDeliveryOrderOld = proDeliveryOrdersOld.FirstOrDefault(x => x.DeliveryCode == eRPProDeliveryDTO.DeliveryCode);
|
if (proDeliveryOrderOld != null)
|
{
|
return content.Error($"销售出库单号{proDeliveryOrderOld.DeliveryCode}信息已存在");
|
}
|
List<Dt_ProDeliveryOrderDetail> proDeliveryOrderDetails = eRPProDeliveryDTO.DeliveryDetail.Select(x => _mapper.Map<Dt_ProDeliveryOrderDetail>(x)).ToList();
|
Dt_ProDeliveryOrder proDeliveryOrderAdd = _mapper.Map<Dt_ProDeliveryOrder>(eRPProDeliveryDTO);
|
proDeliveryOrderDetails.ForEach(x =>
|
{
|
Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(t => t.MaterielCode == x.MaterialCode);
|
x.MaterielName = materielInfo?.MaterielName;
|
x.Unit = materielInfo?.MaterielUnit;
|
});
|
proDeliveryOrderAdd.Details = proDeliveryOrderDetails;
|
proDeliveryOrderAdd.WarehouseId = warehouse.WarehouseId;
|
//新增
|
BaseDal.Db.InsertNav(proDeliveryOrderAdd).Include(x => x.Details).ExecuteCommand();
|
|
}
|
else if (eRPProDeliveryDTO.OperateType == 2)
|
{
|
//判断是否存在
|
Dt_ProDeliveryOrder? proDeliveryOrderOld = proDeliveryOrdersOld.FirstOrDefault(x => x.DeliveryCode == eRPProDeliveryDTO.DeliveryCode);
|
if (proDeliveryOrderOld == null)
|
{
|
return content.Error($"销售出库单号{eRPProDeliveryDTO.DeliveryCode}信息不存在");
|
}
|
if (proDeliveryOrderOld.ProDeliveryStatus != OutOrderStatusEnum.未开始.ObjToInt())
|
{
|
return content.Error($"销售出库单号{proDeliveryOrderOld.DeliveryCode}状态为{(OutOrderStatusEnum)proDeliveryOrderOld.ProDeliveryStatus}");
|
}
|
List<Dt_ProDeliveryOrderDetail> proDeliveryOrderDetails = eRPProDeliveryDTO.DeliveryDetail.Select(x => _mapper.Map<Dt_ProDeliveryOrderDetail>(x)).ToList();
|
Dt_ProDeliveryOrder proDeliveryOrder = _mapper.Map<Dt_ProDeliveryOrder>(eRPProDeliveryDTO);
|
proDeliveryOrder.Id = proDeliveryOrderOld.Id;
|
proDeliveryOrderDetails.ForEach(x =>
|
{
|
Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(t => t.MaterielCode == x.MaterialCode);
|
x.MaterielName = materielInfo?.MaterielName;
|
x.Unit = materielInfo?.MaterielUnit;
|
});
|
proDeliveryOrder.Details = proDeliveryOrderDetails;
|
proDeliveryOrder.WarehouseId = warehouse.WarehouseId;
|
//更新
|
BaseDal.Db.UpdateNav(proDeliveryOrder).Include(x => x.Details).ExecuteCommand();
|
}
|
else if (eRPProDeliveryDTO.OperateType == 3)
|
{
|
//判断是否存在
|
Dt_ProDeliveryOrder? proDeliveryOrderOld = proDeliveryOrdersOld.FirstOrDefault(x => x.DeliveryCode == eRPProDeliveryDTO.DeliveryCode);
|
if (proDeliveryOrderOld == null)
|
{
|
return content.Error($"销售出库单号{eRPProDeliveryDTO.DeliveryCode}信息不存在");
|
}
|
if (proDeliveryOrderOld.ProDeliveryStatus != OutOrderStatusEnum.未开始.ObjToInt())
|
{
|
return content.Error($"销售出库单号{proDeliveryOrderOld.DeliveryCode}状态为{(OutOrderStatusEnum)proDeliveryOrderOld.ProDeliveryStatus}");
|
}
|
//删除
|
BaseDal.Db.DeleteNav(proDeliveryOrderOld).Include(x => x.Details).ExecuteCommand();
|
}
|
else
|
{
|
return content.Error("未找到操作类型");
|
}
|
//更新数据
|
return content.OK("接收成功");
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// ERP成品销售出库分配库存
|
/// </summary>
|
public (List<Dt_ProStockInfo>, List<Dt_ProDeliveryOrder>, List<Dt_ProDeliveryOrderDetail>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) AssignProStockOutbound(List<Dt_ProDeliveryOrder> proDeliveryOrders,List<Dt_ProDeliveryOrderDetail> deliveryOrderDetails)
|
{
|
List<Dt_ProStockInfo> outStocks = new List<Dt_ProStockInfo>();
|
|
//出库详情
|
List<Dt_OutStockLockInfo> outStockLockInfos = new List<Dt_OutStockLockInfo>();
|
//货位存储
|
List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
|
|
//foreach (var item in )
|
//{
|
|
//}
|
|
//foreach (var item in deliveryOrderDetails)
|
//{
|
// decimal needQuantity = item.ReqQuantity;
|
// //获取可用库存
|
// List<Dt_ProStockInfo> stockInfos = _stockService.ProStockInfoService.GetUseableStocks(item.MaterialCode, WarehouseEnum.LLDCP.ObjToInt()).Where(x => !outStocks.Select(x => x.PalletCode).Contains(x.PalletCode)).ToList();
|
// if (!stockInfos.Any())
|
// {
|
// continue;
|
// }
|
// //分配实际库存
|
// List<Dt_ProStockInfo> autoAssignStocks = _stockService.ProStockInfoService.GetOutboundStocks(stockInfos, needQuantity);
|
// //添加库存分配
|
// outStocks.AddRange(autoAssignStocks);
|
// //订单数量
|
// decimal orderQuantity = item.ReqQuantity;
|
// bool assignStop = true;
|
// while (assignStop)
|
// {
|
// //出库订单明细已分配数量
|
// decimal detailAssignQuantity = outStockLockInfos.Where(x => x.OrderDetailId == item.OutDetailId).Sum(x => x.AssignQuantity);
|
|
// decimal orderDetailNeedQuantity = item.ReqQuantity - detailAssignQuantity;
|
|
// decimal useStockLength = autoAssignStocks[0].proStockInfoDetails
|
// .Sum(x => x.StockQty);
|
// if (orderDetailNeedQuantity > useStockLength)
|
// {
|
|
// //生成详情
|
// Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(item, autoAssignStocks[0], useStockLength);
|
// outStockLockInfos.Add(outStockLockInfo);
|
// item.AssignTotalUsage += useStockLength;
|
// autoAssignStocks.Remove(autoAssignStocks[0]);
|
// }
|
// else
|
// {
|
// //生成详情
|
// Dt_OutStockLockInfo outStockLockInfo = _outStockLockInfoService.GetOutStockLockInfo(item, autoAssignStocks[0], orderDetailNeedQuantity);
|
// outStockLockInfos.Add(outStockLockInfo);
|
// item.AssignTotalUsage = orderQuantity;
|
// autoAssignStocks.Remove(autoAssignStocks[0]);
|
// assignStop = false;
|
// }
|
// }
|
// item.OutMESOrderStatus = OutOrderStatusEnum.出库中.ObjToInt();
|
// locationInfos.AddRange(_basicRepository.LocationInfoRepository.GetLocationInfos(outStocks.Select(x => x.LocationCode).ToList()));
|
//}
|
|
return (outStocks, proDeliveryOrders, deliveryOrderDetails, outStockLockInfos, locationInfos);
|
}
|
}
|
}
|