using AutoMapper;
|
using Castle.Core.Resource;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Common.OrderEnum;
|
using WIDESEA_Common.StockEnum;
|
using WIDESEA_Common.WareHouseEnum;
|
using WIDESEA_Core;
|
using WIDESEA_Core.BaseRepository;
|
using WIDESEA_Core.BaseServices;
|
using WIDESEA_Core.CodeConfigEnum;
|
using WIDESEA_Core.Enums;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_DTO.ERP;
|
using WIDESEA_External.ERPService;
|
using WIDESEA_External.Model;
|
using WIDESEA_IBasicRepository;
|
using WIDESEA_IBasicService;
|
using WIDESEA_IOutboundRepository;
|
using WIDESEA_IOutboundService;
|
using WIDESEA_IRecordService;
|
using WIDESEA_IStockRepository;
|
using WIDESEA_IStockService;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_OutboundService
|
{
|
public partial class ProOutOrderService : ServiceBase<Dt_ProOutOrder, IProOutOrderRepository>, IProOutOrderService
|
{
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
private readonly IBasicRepository _basicRepository;
|
private readonly IMapper _mapper;
|
private readonly IStockRepository _stockRepository;
|
private readonly IOutboundRepository _outboundRepository;
|
private readonly IOutboundOrderService _outboundOrderService;
|
private readonly IInvokeERPService _invokeERPService;
|
|
public IProOutOrderRepository Repository => BaseDal;
|
|
public ProOutOrderService(IProOutOrderRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IBasicRepository basicRepository, IMapper mapper, IStockRepository stockRepository, IOutboundRepository outboundRepository, IOutboundOrderService outboundOrderService,IInvokeERPService invokeERPService) : base(BaseDal)
|
{
|
_unitOfWorkManage = unitOfWorkManage;
|
_basicRepository = basicRepository;
|
_mapper = mapper;
|
_stockRepository = stockRepository;
|
_outboundRepository = outboundRepository;
|
_outboundOrderService = outboundOrderService;
|
_invokeERPService = invokeERPService;
|
}
|
/// <summary>
|
/// 接收ERP成品出库单
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent ProductDeliveryOrder(ErpProOutOrderDTO outOrderDTO)
|
{
|
try
|
{
|
return outOrderDTO.Way switch
|
{
|
1 => AddDeliveryOrder(outOrderDTO),
|
2 => UpdateDeliveryOrder(outOrderDTO),
|
3 => DeleteDeliveryOrder(outOrderDTO),
|
_ => WebResponseContent.Instance.Error($"操作类型不存在,Way:{outOrderDTO.Way}"),
|
};
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
/// <summary>
|
/// 新增成品出库单
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent AddDeliveryOrder(ErpProOutOrderDTO outOrderDTO)
|
{
|
WebResponseContent content=new WebResponseContent();
|
try
|
{
|
if (BaseDal.QueryFirst(x => x.ProOutOrderNo == outOrderDTO.OrderNo) != null)
|
{
|
return content.Error($"出库单号{outOrderDTO.OrderNo}已存在!");
|
}
|
Dt_Warehouse warehouse=null;
|
List<Dt_CustomerInfo> customerInfos = _basicRepository.CustomerInfoRepository.QueryData();
|
if (outOrderDTO.OType==1 && string.IsNullOrEmpty(outOrderDTO.WaType))
|
{
|
warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseCode==WarehouseEnum.HA71.ToString());
|
}
|
else if (outOrderDTO.OType==2)
|
{
|
warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
|
}
|
List<Dt_ProOutOrderDetail> proOutOrderDetails = new List<Dt_ProOutOrderDetail>();
|
foreach (var item in outOrderDTO.OrderDetails)
|
{
|
//判断客户是否存在
|
Dt_CustomerInfo? customerInfo = customerInfos.Where(x=>x.Code== item.Customer).FirstOrDefault();
|
if (customerInfo==null)
|
{
|
return content.Error($"客户{item.Customer}不存在!");
|
}
|
proOutOrderDetails.Add(_mapper.Map<Dt_ProOutOrderDetail>(item));
|
}
|
Dt_ProOutOrder proOutOrder= new Dt_ProOutOrder()
|
{
|
ProOutOrderNo= outOrderDTO.OrderNo,
|
WarehouseId= warehouse.WarehouseId,
|
ProOrderType= outOrderDTO.OType,
|
ProOrderStatus=OutOrderStatusEnum.未开始.ObjToInt(),
|
PlantShipDate= outOrderDTO.PlantShipDate.ObjToDate(),
|
Remark= outOrderDTO.Note,
|
Details= proOutOrderDetails
|
};
|
Db.InsertNav(proOutOrder).Include(x => x.Details).ExecuteCommand();
|
content.OK("成功");
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 更新成品出库单
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent UpdateDeliveryOrder(ErpProOutOrderDTO outOrderDTO)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 删除成品出库单
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent DeleteDeliveryOrder(ErpProOutOrderDTO outOrderDTO)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 成品出待发货区(平库)+同步ERP出库
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent OutProductPK(string[] OutPKCodes,string ProOutNo)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
if (OutPKCodes.IsNullOrEmpty())
|
{
|
return content.Error("不能为空");
|
}
|
Dt_ProOutOrder proOutOrder = _outboundRepository.ProOutOrderRepository.Db.Queryable<Dt_ProOutOrder>().Where(x => x.ProOutOrderNo == ProOutNo).Includes(x => x.Details).First();
|
if (proOutOrder == null)
|
{
|
return content.Error($"出库单{ProOutNo}不存在");
|
}
|
if (proOutOrder.ProOrderStatus==OutOrderStatusEnum.出库完成.ObjToInt())
|
{
|
return content.Error($"出库单{ProOutNo}已完成");
|
}
|
string? userName = App.User.UserName;//GSWMS
|
//获取所有外箱的数据
|
List<Dt_ProStockInfo> AllproStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>()
|
.Where(x => OutPKCodes.Contains(x.PalletCode) && x.StockStatus == StockStatusEmun.平库入库完成.ObjToInt())
|
.Includes(x => x.proStockInfoDetails).ToList();
|
List<Dt_ProStockInfo> proStockInfos = new List<Dt_ProStockInfo>();
|
List<Dt_ProStockInfoDetail> proStockInfoDetails=new List<Dt_ProStockInfoDetail>();
|
List<Dt_Warehouse> warehouses = _basicRepository.WarehouseRepository.QueryData(x => x.WarehouseType == WarehouseTypEnum.成品.ToString());
|
foreach (var item in OutPKCodes)
|
{
|
//获取库存
|
Dt_ProStockInfo? proStockInfo = AllproStockInfos.Where(x => x.PalletCode == item).FirstOrDefault();
|
if (proStockInfo == null)
|
{
|
return content.Error($"未找到{item}库存");
|
}
|
Dt_Warehouse? dt_Warehouse = warehouses.Where(x=>x.WarehouseId== proStockInfo.WarehouseId).FirstOrDefault();
|
if (dt_Warehouse==null)
|
{
|
return content.Error($"外箱号{item},不属于成品仓");
|
}
|
if (proStockInfo.ShipmentOrder!= proOutOrder.ProOutOrderNo)
|
{
|
return content.Error($"外箱号{item},不属于出库订单{proOutOrder.ProOutOrderNo}");
|
}
|
proStockInfos.Add(proStockInfo);
|
proStockInfoDetails.AddRange(proStockInfo.proStockInfoDetails);
|
}
|
|
if (proOutOrder.Details.Sum(x=>x.LockQtyPcs-x.OverQtyPcs)< proStockInfoDetails.Sum(x=>x.StockPcsQty))
|
{
|
return content.Error($"出库数量{proStockInfoDetails.Sum(x => x.StockPcsQty)}>所剩订单数量{proOutOrder.Details.Sum(x => x.LockQtyPcs - x.OverQtyPcs)}");
|
}
|
List<StockOutItemsItem> stockOutItems = new List<StockOutItemsItem>();
|
List<Dt_ProOutOrderDetail> proOutOrderDetails = proOutOrder.Details.Where(x=> proStockInfoDetails.Select(x=>x.SaleOrder).Contains(x.SaleOrder) && proStockInfoDetails.Select(x=>x.ProductCode).Contains(x.PCode) && proStockInfoDetails.Select(x => x.ProductVersion).Contains(x.PVer)).ToList();
|
if (proOutOrderDetails==null || proOutOrderDetails.Count<=0)
|
{
|
return content.Error("对应出库订单明细为空");
|
}
|
foreach (var item in proStockInfoDetails)
|
{
|
//获取对应明细处理出库数据
|
Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrderDetails.Where(x => x.SaleOrder == item.SaleOrder && x.PVer == item.ProductVersion && x.PCode == item.ProductCode).FirstOrDefault();
|
if (proOutOrderDetail==null)
|
{
|
return content.Error("未找到对应出库订单明细");
|
}
|
proOutOrderDetail.OverQtyPcs += item.StockPcsQty;
|
if (proOutOrderDetail.OverQtyPcs> proOutOrderDetail.QtyPcs)
|
{
|
return content.Error($"出库订单明细行{proOutOrderDetail.RowId},溢出{proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs}");
|
}
|
if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
|
{
|
proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
|
}
|
StockOutItemsItem outItemsItem = new StockOutItemsItem()
|
{
|
PartNum=item.ProductCode,
|
Rev=item.ProductVersion,
|
SoNumber=item.SaleOrder,
|
BatchNumber=item.BagNo,
|
QtyPcs=item.StockPcsQty,
|
QtySet=item.SETQty
|
};
|
stockOutItems.Add(outItemsItem);
|
}
|
int OldOverCount = proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
|
int AddOverCount = proOutOrderDetails.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
|
if (proOutOrder.Details.Count== (OldOverCount + AddOverCount))
|
{
|
proOutOrder.ProOrderStatus = OutOrderStatusEnum.出库完成.ObjToInt();
|
}
|
Dt_Warehouse warehouse = warehouses.Where(x => x.WarehouseId == proOutOrder.WarehouseId).FirstOrDefault();
|
//处理库存数据和上传ERP
|
_unitOfWorkManage.BeginTran();
|
_stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfos, OperateTypeEnum.自动完成);
|
_stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfoDetails, OperateTypeEnum.自动完成);
|
_outboundRepository.ProOutOrderDetailRepository.UpdateData(proOutOrderDetails);
|
BaseDal.UpdateData(proOutOrder);
|
//成品库存记录变动待加入
|
ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel()
|
{
|
Way = 1,
|
StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)),
|
ConfirmedUserNo=userName,
|
AssignUserNo=userName,
|
WarehouseCode=warehouse.WarehouseCode,
|
ShipDate=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
DeliverplanCode=proOutOrder.ProOutOrderNo,
|
Remark=proOutOrder.Remark,
|
StockOutItems= stockOutItems
|
};
|
string response = _invokeERPService.InvokeProOutApi(proOutOrderModel);
|
ErpRequestContent erpRequestContent= response.DeserializeObject<ErpRequestContent>();
|
if (erpRequestContent.res==1)
|
{
|
_unitOfWorkManage.CommitTran();
|
content.OK();
|
}
|
else
|
{
|
throw new Exception(erpRequestContent.Data);
|
}
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
}
|
}
|