using AutoMapper;
|
using Castle.Core.Resource;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading;
|
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_DTO.Outbound;
|
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 async Task<WebResponseContent> ProductDeliveryOrder(ErpProOutOrderDTO outOrderDTO)
|
{
|
try
|
{
|
return outOrderDTO.Way switch
|
{
|
1 => await Task.FromResult(AddDeliveryOrder(outOrderDTO)),
|
2 => await Task.FromResult(UpdateDeliveryOrder(outOrderDTO)),
|
3 => await Task.FromResult(DeleteDeliveryOrder(outOrderDTO)),
|
_ => await Task.FromResult(WebResponseContent.Instance.Error($"操作类型不存在,Way:{outOrderDTO.Way}")),
|
};
|
}
|
catch (Exception ex)
|
{
|
return await Task.FromResult(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>();
|
Dictionary<string,string> keyValuePairs =new Dictionary<string, string>();
|
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}不存在!");
|
}
|
Dt_ProOutOrderDetail proOutOrderDetail = _mapper.Map<Dt_ProOutOrderDetail>(item);
|
if (!string.IsNullOrEmpty(item.SaleOrder))
|
{
|
if (keyValuePairs!=null && keyValuePairs.ContainsKey(item.SaleOrder))
|
{
|
proOutOrderDetail.EndCustomer = keyValuePairs[item.SaleOrder];
|
}
|
else
|
{
|
string request = _invokeERPService.InvokeProSaleCustomer(item.SaleOrder);
|
ErpSaleCustomResponseContent responseContent=request.DeserializeObject<ErpSaleCustomResponseContent>();
|
if (responseContent.Code!=200)
|
{
|
return content.Error($"订单{item.SaleOrder}终端客户获取失败!");
|
}
|
//判断终端客户是否存在
|
Dt_CustomerInfo? customerInfoEnd = customerInfos.Where(x => x.Code == responseContent.Data[0].Endcustomer).FirstOrDefault();
|
if (customerInfoEnd == null)
|
{
|
return content.Error($"终端客户{responseContent.Data[0].Endcustomer}不存在!");
|
}
|
proOutOrderDetail.EndCustomer = responseContent.Data[0].Endcustomer;
|
keyValuePairs.Add(item.SaleOrder, responseContent.Data[0].Endcustomer);
|
}
|
}
|
proOutOrderDetail.QtyPcs += proOutOrderDetail.SpareQty;
|
proOutOrderDetails.Add(proOutOrderDetail);
|
}
|
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
|
{
|
Dt_ProOutOrder proOutOrder = _outboundRepository.ProOutOrderRepository.Db.Queryable<Dt_ProOutOrder>().Where(x => x.ProOutOrderNo == outOrderDTO.OrderNo).Includes(x => x.Details).First();
|
if (proOutOrder==null)
|
{
|
return content.Error($"未找到出库单{outOrderDTO.OrderNo}");
|
}
|
if (proOutOrder.ProOrderStatus==OutOrderStatusEnum.出库完成.ObjToInt() || proOutOrder.ProOrderStatus == OutOrderStatusEnum.出库中.ObjToInt())
|
{
|
return content.Error("出库单执行中");
|
}
|
_unitOfWorkManage.BeginTran();
|
_outboundRepository.ProOutOrderRepository.DeleteData(proOutOrder);
|
_outboundRepository.ProOutOrderDetailRepository.DeleteData(proOutOrder.Details);
|
_unitOfWorkManage.CommitTran();
|
content.OK("成功");
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 销售指派
|
/// </summary>
|
/// <returns></returns>
|
public async Task<WebResponseContent> ProductSpecifyVer(ErpProductSpecifyVerDTO erpProductSpecifyVerDTO)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseCode==erpProductSpecifyVerDTO.WaType);
|
if (warehouse == null)
|
return await Task.FromResult(content.Error($"未找到{erpProductSpecifyVerDTO.WaType}仓库信息"));
|
//查询可指派库存
|
List<Dt_ProStockInfo> proStockInfos = Db.Queryable<Dt_ProStockInfo>().Where(x => x.ProStockAttribute == ProStockAttributeEnum.成品.ObjToInt())
|
.Includes(x => x.proStockInfoDetails)
|
.Where(x => x.proStockInfoDetails
|
.Any(v =>
|
v.SaleOrder == erpProductSpecifyVerDTO.OrderNo
|
&& v.ProductCode == erpProductSpecifyVerDTO.PCode
|
&& v.ProductVersion == erpProductSpecifyVerDTO.PVer
|
&& v.LotNumber == erpProductSpecifyVerDTO.PLot
|
&& v.DateCode == erpProductSpecifyVerDTO.DateCode
|
&& (v.SpecifyVer==null||v.SpecifyVer=="")
|
))
|
.ToList();
|
List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
|
List<Dt_ProStockInfoDetail> specifyVerDetails = new List<Dt_ProStockInfoDetail>();
|
if (proStockInfos==null)
|
return await Task.FromResult(content.Error("可指派库存不存在"));
|
proStockInfos = proStockInfos.OrderBy(x => x.proStockInfoDetails.FirstOrDefault()?.DateCode).ThenBy(x => x.CreateDate).ThenBy(x => x.proStockInfoDetails.Sum(x => x.StockPcsQty)).ToList();
|
foreach (var item in proStockInfos)
|
{
|
proStockInfoDetails.AddRange(item.proStockInfoDetails);
|
}
|
if (proStockInfoDetails.Sum(x=>x.StockPcsQty)< erpProductSpecifyVerDTO.QtyPcs)
|
return await Task.FromResult(content.Error($"可指派库存数量不足,可用:{proStockInfoDetails.Sum(x => x.StockPcsQty)}"));
|
float overQty = 0;
|
foreach (var item in proStockInfoDetails)
|
{
|
specifyVerDetails.Add(item);
|
overQty += item.StockPcsQty;
|
//已满足获取数量不再更改
|
if (overQty>= erpProductSpecifyVerDTO.QtyPcs)
|
{
|
break;
|
}
|
}
|
specifyVerDetails.ForEach(x =>
|
{
|
x.SpecifyVer = erpProductSpecifyVerDTO.Ver;
|
});
|
_unitOfWorkManage.BeginTran();
|
_stockRepository.ProStockInfoDetailRepository.UpdateData(specifyVerDetails);
|
_unitOfWorkManage.CommitTran();
|
content.OK("指派成功");
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return await Task.FromResult(content);
|
}
|
/// <summary>
|
/// 成品出待发货区(平库)+同步ERP出库(绑定了出库单库存)
|
/// </summary>
|
/// <returns></returns>
|
public WebResponseContent OutProductPK(SaveModel saveModel, string ProOutNo)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
List<string> OutPKCodes = saveModel.DelKeys.Select(x => x.ToString()).ToList();
|
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.ShipmentOrder == proOutOrder.ProOutOrderNo && x.StockStatus == StockStatusEmun.平库入库完成.ObjToInt())
|
.Includes(x => x.proStockInfoDetails).ToList();
|
if (AllproStockInfos.Count<=0)
|
{
|
return content.Error($"出库单{ProOutNo}已无绑定库存");
|
}
|
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.ProductCode).Contains(x.PCode) && proStockInfoDetails.Select(x => x.ProductVersion).Contains(x.PVer)).ToList();
|
if (proOutOrderDetails==null || proOutOrderDetails.Count<=0)
|
{
|
return content.Error("对应出库订单明细为空");
|
}
|
int OldOverCount = proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
|
List<Dt_ProOutOrderDetail> newProDetails=new List<Dt_ProOutOrderDetail>();
|
foreach (var item in proStockInfoDetails)
|
{
|
//获取对应明细处理出库数据
|
Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrderDetails.Where(x => x.Id==item.OutDetailId && x.PVer == item.ProductVersion && x.PCode == item.ProductCode).FirstOrDefault();
|
if (proOutOrderDetail==null)
|
{
|
return content.Error("未找到对应出库订单明细");
|
}
|
proOutOrderDetail.OverQtyPcs += item.StockPcsQty;
|
item.OutboundQuantity = item.StockPcsQty;
|
item.OutSETQty = item.SETQty;
|
if (proOutOrderDetail.OverQtyPcs> proOutOrderDetail.QtyPcs)
|
{
|
return content.Error($"出库订单明细行{proOutOrderDetail.RowId},溢出{proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs}");
|
}
|
if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
|
{
|
proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
|
newProDetails.Add(proOutOrderDetail);
|
}
|
|
}
|
|
int AddOverCount = newProDetails.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
|
if (proOutOrder.Details.Count == (AddOverCount + OldOverCount))
|
{
|
proOutOrder.ProOrderStatus = OutOrderStatusEnum.出库完成.ObjToInt();
|
//获取所有已扫码待发货的库存
|
List<Dt_ProStockInfo> AllOutStocks = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>()
|
.Where(x => x.ShipmentOrder== ProOutNo && x.StockStatus == StockStatusEmun.平库待发货.ObjToInt())
|
.Includes(x => x.proStockInfoDetails).ToList();
|
AllOutStocks.ForEach(x =>
|
{
|
proStockInfoDetails.AddRange(x.proStockInfoDetails);
|
});
|
proStockInfos.AddRange(AllOutStocks);
|
foreach (var item in proStockInfoDetails)
|
{
|
StockOutItemsItem outItemsItem = new StockOutItemsItem()
|
{
|
PartNum = item.ProductCode,
|
Rev = item.ProductVersion,
|
SoNumber = item.OutDetailSaleNo,
|
BatchNumber = item.BagNo,
|
QtyPcs = item.OutboundQuantity,
|
QtySet = item.OutSETQty
|
};
|
stockOutItems.Add(outItemsItem);
|
}
|
}
|
_unitOfWorkManage.BeginTran();
|
Dt_Warehouse warehouse = warehouses.Where(x => x.WarehouseId == proOutOrder.WarehouseId).FirstOrDefault();
|
//处理库存数据和上传ERP
|
if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.出库完成.ObjToInt())
|
{
|
//成品库存记录变动待加入
|
ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel()
|
{
|
Way = 1,
|
StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)),
|
ConfirmedUserNo = App.User.UserName,
|
AssignUserNo = App.User.UserName,
|
WarehouseCode = warehouse.WarehouseCode,
|
ShipDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
DeliverplanCode = proOutOrder.ProOutOrderNo,
|
Remark = proOutOrder.Remark,
|
StockOutItems = stockOutItems
|
};
|
_stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfos, OperateTypeEnum.自动完成);
|
_stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfoDetails, OperateTypeEnum.自动完成);
|
//WebResponseContent contentSaveInfos = SaveOutProPKInfos(proStockInfos);
|
//if (!contentSaveInfos.Status)
|
//{
|
// throw new Exception(contentSaveInfos.Message);
|
//};
|
string response = _invokeERPService.InvokeProOutApi(proOutOrderModel);
|
ErpRequestContent erpRequestContent = response.DeserializeObject<ErpRequestContent>();
|
if (erpRequestContent.res != 1)
|
{
|
throw new Exception("同步ERP失败,错误信息:" + erpRequestContent.Data);
|
}
|
}
|
else
|
{
|
proStockInfos.ForEach(x =>
|
{
|
x.StockStatus = StockStatusEmun.平库待发货.ObjToInt();
|
});
|
proStockInfoDetails.ForEach(x =>
|
{
|
x.ProOutDetailStatus = StockStatusEmun.平库待发货.ObjToInt();
|
});
|
_stockRepository.ProStockInfoRepository.UpdateData(proStockInfos);
|
_stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails);
|
}
|
_outboundRepository.ProOutOrderDetailRepository.UpdateData(proOutOrderDetails);
|
BaseDal.UpdateData(proOutOrder);
|
_unitOfWorkManage.CommitTran();
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 获取出库所有的外内包明细
|
/// </summary>
|
/// <param name="proStockInfos"></param>
|
/// <returns></returns>
|
public WebResponseContent SaveOutProPKInfos(List<Dt_ProStockInfo> proStockInfos)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
List<Dt_OutProPKStockInfo> outProPKStockInfos = new List<Dt_OutProPKStockInfo>();
|
foreach (var fromItem in proStockInfos)
|
{
|
foreach (var lordItem in fromItem.proStockInfoDetails)
|
{
|
Dt_OutProPKStockInfo outProPKStockInfo = new Dt_OutProPKStockInfo()
|
{
|
PCode = lordItem.ProductCode,
|
PVer=lordItem.ProductVersion,
|
PLot=lordItem.ProductVersion,
|
DateCode=lordItem.DateCode,
|
StockId=fromItem.Id,
|
OriginalQuantity=lordItem.StockPcsQty,
|
AssignQuantity=lordItem.StockPcsQty,
|
PalletCode=fromItem.PalletCode,
|
Unit="PCS"
|
};
|
outProPKStockInfos.Add(outProPKStockInfo);
|
}
|
}
|
Db.InsertNav(outProPKStockInfos).Include(x=>x).ExecuteCommand();
|
content.OK();
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
//根据内包出库
|
public WebResponseContent BagProductPK(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
var outOrder = saveModel.MainData["proOutNo"].ToString();
|
var outBags = saveModel.DelKeys.Select(x => x.ToString()).ToList();
|
if (outBags.Count<=0)
|
{
|
return content.Error("内包信息获取失败");
|
}
|
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 成品出待发货区(平库)+同步ERP出库(未绑定出库单库存)
|
/// </summary>
|
/// <returns></returns>
|
//public WebResponseContent OutProductNoPK(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}库存");
|
// }
|
// if (proStockInfo.ShipmentOrder!=null)
|
// {
|
// return content.Error($"外箱号{item}为出库单{proStockInfo.ShipmentOrder}指定库存!");
|
// }
|
// Dt_Warehouse? dt_Warehouse = warehouses.Where(x => x.WarehouseId == proStockInfo.WarehouseId).FirstOrDefault();
|
// if (dt_Warehouse == null)
|
// {
|
// return content.Error($"外箱号{item},不属于成品仓");
|
// }
|
// proStockInfos.Add(proStockInfo);
|
// proStockInfoDetails.AddRange(proStockInfo.proStockInfoDetails);
|
// }
|
|
// if (proOutOrder.Details.Sum(x => x.QtyPcs - x.OverQtyPcs) < proStockInfoDetails.Sum(x => x.StockPcsQty))
|
// {
|
// return content.Error($"出库数量{proStockInfoDetails.Sum(x => x.StockPcsQty)}>所剩订单数量{proOutOrder.Details.Sum(x => x.QtyPcs - 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("对应出库订单明细为空");
|
// }
|
// int OldOverCount = proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
|
// 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;
|
// item.OutboundQuantity = item.StockPcsQty;
|
// item.OutSETQty = item.SETQty;
|
// if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
|
// {
|
// return content.Error($"出库订单明细行{proOutOrderDetail.RowId},溢出{proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs}");
|
// }
|
// if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
|
// {
|
// proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
|
// }
|
|
// }
|
// proStockInfos.ForEach(x =>
|
// {
|
// x.StockStatus = StockStatusEmun.平库待发货.ObjToInt();
|
// });
|
// proStockInfoDetails.ForEach(x =>
|
// {
|
// x.ProOutDetailStatus = StockStatusEmun.平库待发货.ObjToInt();
|
// });
|
// int AddOverCount = proOutOrderDetails.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count();
|
// if (proOutOrder.Details.Count == (AddOverCount + OldOverCount))
|
// {
|
// proOutOrder.ProOrderStatus = OutOrderStatusEnum.出库完成.ObjToInt();
|
// //获取所有已扫码待发货的库存
|
// List<Dt_ProStockInfo> AllOutStocks = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>()
|
// .Where(x => x.ShipmentOrder == ProOutNo && x.StockStatus == StockStatusEmun.平库待发货.ObjToInt())
|
// .Includes(x => x.proStockInfoDetails).ToList();
|
// AllOutStocks.ForEach(x =>
|
// {
|
// proStockInfoDetails.AddRange(x.proStockInfoDetails);
|
// });
|
// proStockInfos.AddRange(AllOutStocks);
|
// foreach (var item in proStockInfoDetails)
|
// {
|
// StockOutItemsItem outItemsItem = new StockOutItemsItem()
|
// {
|
// PartNum = item.ProductCode,
|
// Rev = item.ProductVersion,
|
// SoNumber = item.SaleOrder,
|
// BatchNumber = item.BagNo,
|
// QtyPcs = item.OutboundQuantity,
|
// QtySet = item.OutSETQty
|
// };
|
// stockOutItems.Add(outItemsItem);
|
// }
|
// }
|
// Dt_Warehouse warehouse = warehouses.Where(x => x.WarehouseId == proOutOrder.WarehouseId).FirstOrDefault();
|
// _unitOfWorkManage.BeginTran();
|
// //处理库存数据和上传ERP
|
// if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.出库完成.ObjToInt())
|
// {
|
// //成品库存记录变动待加入
|
// ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel()
|
// {
|
// Way = 1,
|
// StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)),
|
// ConfirmedUserNo = App.User.UserName,
|
// AssignUserNo = App.User.UserName,
|
// WarehouseCode = warehouse.WarehouseCode,
|
// ShipDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
// DeliverplanCode = proOutOrder.ProOutOrderNo,
|
// Remark = proOutOrder.Remark,
|
// StockOutItems = stockOutItems
|
// };
|
// _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfos, OperateTypeEnum.自动完成);
|
// _stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(proStockInfoDetails, OperateTypeEnum.自动完成);
|
// string response = _invokeERPService.InvokeProOutApi(proOutOrderModel);
|
// ErpRequestContent erpRequestContent = response.DeserializeObject<ErpRequestContent>();
|
// if (erpRequestContent.res != 1)
|
// {
|
// throw new Exception("同步ERP失败,错误信息:" + erpRequestContent.Data);
|
// }
|
// }
|
// else
|
// {
|
// _stockRepository.ProStockInfoRepository.UpdateData(proStockInfos);
|
// _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails);
|
// }
|
// _outboundRepository.ProOutOrderDetailRepository.UpdateData(proOutOrderDetails);
|
// BaseDal.UpdateData(proOutOrder);
|
// _unitOfWorkManage.CommitTran();
|
// content.OK();
|
// }
|
// catch (Exception ex)
|
// {
|
// content.Error(ex.Message);
|
// }
|
// return content;
|
//}
|
/// <summary>
|
/// PDA获取出库单据
|
/// </summary>
|
/// <param name="saveModel"></param>
|
/// <returns></returns>
|
public WebResponseContent GetProOutOrders(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_ProOutOrder> proOutOrders = new List<Dt_ProOutOrder>();
|
if (string.IsNullOrEmpty(orderNo))
|
{
|
proOutOrders = Db.Queryable<Dt_ProOutOrder>().Where(x => x.ProOrderStatus <= OutOrderStatusEnum.出库中.ObjToInt() && x.WarehouseId == warehouseId).Includes(x=>x.Details).OrderByDescending(x => x.Id).ToPageList(pageNo, 5);
|
}
|
else
|
{
|
proOutOrders = Db.Queryable<Dt_ProOutOrder>().Where(x => (x.ProOutOrderNo.Contains(orderNo) || x.ProOutOrderNo.Contains(orderNo)) && x.ProOrderStatus <= OutOrderStatusEnum.出库中.ObjToInt() && x.WarehouseId == warehouseId).OrderByDescending(x => x.Id).Includes(x => x.Details).ToPageList(pageNo, 5);
|
}
|
|
content.OK(data: proOutOrders);
|
}
|
catch (Exception)
|
{
|
|
throw;
|
}
|
return content;
|
}
|
/// <summary>
|
/// 获取扫码获取订单明细信息
|
/// </summary>
|
public WebResponseContent GetOrderDetails(int keyId)
|
{
|
WebResponseContent content=new WebResponseContent();
|
try
|
{
|
//获取出库单号
|
Dt_ProOutOrder proOutOrder = BaseDal.QueryFirst(x => x.Id == keyId);
|
if (proOutOrder == null)
|
{
|
return content.Error($"未找到出库单{proOutOrder.ProOutOrderNo}");
|
}
|
//获取明细
|
List<Dt_ProOutOrderDetail> proOutOrderDetails = _outboundRepository.ProOutOrderDetailRepository.QueryData(x => x.ProOrderId == keyId).OrderBy(x => x.ProOrderDetailStatus).ThenBy(x => x.Id).ToList();
|
content.OK("成功", new { proOutOrderDetails });
|
}
|
catch (Exception ex)
|
{
|
content.Error(ex.Message);
|
}
|
return content;
|
}
|
/// <summary>
|
/// 查询ERP订单扣除库存数量
|
/// </summary>
|
public WebResponseContent OutProErpSync(string outProOrderNo)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
//根据出库单号获取该出库订单的ERP出库库存信息
|
Dt_ProOutOrder proOutOrder = BaseDal.Db.Queryable<Dt_ProOutOrder>().Where(x=>x.ProOutOrderNo== outProOrderNo).Includes(x => x.Details).First();
|
if (proOutOrder==null)
|
{
|
return content.Error($"未找到成品出库订单{outProOrderNo}");
|
}
|
if (proOutOrder.ProOrderStatus>=OutOrderStatusEnum.出库完成.ObjToInt())
|
{
|
return content.Error($"出库订单已完成或关闭");
|
}
|
//调用erp出库订单库存查询接口
|
string response = _invokeERPService.InvokeOutProErpSync(outProOrderNo);
|
ErpOutProSyncResponseContent erpOutProSyncResponse= response.DeserializeObject<ErpOutProSyncResponseContent>();
|
if (erpOutProSyncResponse.Code!=200)
|
{
|
return content.Error($"ERP出库订单查询接口调用失败,错误信息:{erpOutProSyncResponse.Msg}");
|
}
|
List<OutProStock> outProStocks = erpOutProSyncResponse.Data;
|
if (outProStocks.Count<=0 || outProStocks==null)
|
{
|
return content.Error($"成品出库订单{outProOrderNo}ERP当前未有出库库存信息");
|
}
|
// 验证所有出库单号是否一致
|
OutProStock? outExist = outProStocks.FirstOrDefault(x => x.ShippingNumber != outProOrderNo);
|
if (outExist != null)
|
{
|
return content.Error($"ERP返回了出库订单{outExist.ShippingNumber}库存信息");
|
}
|
//获取平库库区
|
Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
|
if (warehouse==null)
|
{
|
return content.Error("未找到库区信息");
|
}
|
var productCodes = outProStocks.Select(x => x.Partnum).Distinct().ToList();
|
//获取所有平库库存
|
List<Dt_ProStockInfoDetail> proStockInfoDetails = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo, Dt_ProStockInfoDetail>((master, detail) => master.Id == detail.ProStockId)
|
.Where((master, detail) => master.WarehouseId == warehouse.WarehouseId && productCodes.Contains(detail.ProductCode))
|
.Select((master, detail) => detail)
|
.ToList();
|
proStockInfoDetails = proStockInfoDetails.OrderBy(x => x.DateCode).ThenBy(x => x.CreateDate).ToList();
|
|
List<Dt_ProStockInfo> delProStockInfos = new List<Dt_ProStockInfo>();
|
List<Dt_ProStockInfoDetail> delStockInfoDetails = new List<Dt_ProStockInfoDetail>();
|
foreach (var item in outProStocks)
|
{
|
|
//获取库存
|
List<Dt_ProStockInfoDetail> outStocks = proStockInfoDetails.Where(x=>x.ProductCode==item.Partnum).ToList();
|
if (outStocks.Count==0 || outStocks==null)
|
{
|
return content.Error($"{item.Partnum}产品型号库存不存在");
|
}
|
foreach (var itemOut in outStocks)
|
{
|
if (item.Quantity==0)
|
{
|
break;
|
}
|
Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.SaleOrder == item.SoNumber && x.PCode == item.Partnum) ?? throw new Exception($"出库单{proOutOrder.ProOutOrderNo}未找到销售订单{item.SoNumber}明细,请检查");
|
if (item.Quantity >= itemOut.StockPcsQty)
|
{
|
//更新出库明细单数量
|
proOutOrderDetail.OverQtyPcs += itemOut.StockPcsQty;
|
item.Quantity -= (int)itemOut.StockPcsQty;
|
delStockInfoDetails.Add(itemOut);
|
proStockInfoDetails.Remove(itemOut);
|
if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
|
{
|
return content.Error($"出库单{proOutOrder.ProOutOrderNo}销售订单{item.SoNumber}数量溢出{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}");
|
}
|
if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
|
{
|
proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
|
}
|
if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
|
{
|
proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
|
}
|
}
|
else if (item.Quantity < itemOut.StockPcsQty)
|
{
|
|
//更新出库明细单数量
|
proOutOrderDetail.OverQtyPcs += item.Quantity;
|
item.Quantity -= item.Quantity;
|
float Range = itemOut.StockPcsQty / itemOut.SETQty;
|
itemOut.SETQty = item.Quantity / Range;
|
itemOut.StockPcsQty -= item.Quantity;
|
if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
|
{
|
return content.Error($"出库单{proOutOrder.ProOutOrderNo}销售订单{item.SoNumber}数量溢出{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}");
|
}
|
if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
|
{
|
proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
|
}
|
if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
|
{
|
proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
|
}
|
}
|
}
|
}
|
if (proOutOrder.Details.Count == proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count())
|
{
|
proOutOrder.ProOrderStatus = OutOrderStatusEnum.出库完成.ObjToInt();
|
}
|
else
|
{
|
Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.ProOrderDetailStatus <= OrderDetailStatusEnum.Over.ObjToInt());
|
return content.Error($"{proOutOrderDetail?.SaleOrder}销售订单数量需出{proOutOrderDetail?.QtyPcs},可出{proOutOrderDetail?.OverQtyPcs}");
|
}
|
//更新数据
|
_unitOfWorkManage.BeginTran();
|
if (delStockInfoDetails.Count > 0)
|
{
|
_stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delStockInfoDetails, OperateTypeEnum.自动删除);
|
}
|
_stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails);
|
BaseDal.UpdateData(proOutOrder);
|
_outboundRepository.ProOutOrderDetailRepository.UpdateData(proOutOrder.Details);
|
_unitOfWorkManage.CommitTran();
|
return content.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return content.Error(ex.Message);
|
}
|
}
|
/// <summary>
|
/// 出库单扫码同步ERP
|
/// </summary>
|
/// <returns></returns>
|
public async Task<WebResponseContent> OutProScanCodeSync(SaveModel saveModel)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
string? ProOutNo = saveModel.MainData["outProOrderNo"].ToString();
|
var Codes = saveModel.DelKeys.Select(x=>x.ToString().Trim()).ToList();
|
if (Codes.Count<=0)
|
{
|
return await Task.FromResult(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 await Task.FromResult(content.Error($"出库单{ProOutNo}不存在"));
|
}
|
if (proOutOrder.ProOrderStatus >= OutOrderStatusEnum.出库完成.ObjToInt())
|
{
|
return await Task.FromResult(content.Error($"出库单{ProOutNo}已完成或关闭"));
|
}
|
string? userName = App.User.UserName;//GSWMS
|
List<OutProInfoDTO> outProInfos= new List<OutProInfoDTO>();
|
foreach (var item in Codes)
|
{
|
string[] proInfoInputs = item.Split(',');
|
if (proInfoInputs.Length!=5)
|
{
|
return await Task.FromResult(content.Error($"外包{item}扫描不全"));
|
}
|
OutProInfoDTO outProInfo=new OutProInfoDTO()
|
{
|
ProductCode= proInfoInputs[1],
|
OutQtys = proInfoInputs[4].ObjToInt()
|
};
|
outProInfos.Add(outProInfo);
|
}
|
//获取平库库区
|
Dt_Warehouse warehouse = await _basicRepository.WarehouseRepository.QueryFirstAsync(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
|
if (warehouse == null)
|
{
|
return await Task.FromResult(content.Error("未找到库区信息"));
|
}
|
//获取所有平库的数据
|
List<Dt_ProStockInfo> AllproStockInfos = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>()
|
.Where(x => x.WarehouseId == warehouse.WarehouseId)
|
.Includes(x => x.proStockInfoDetails).ToList();
|
List<Dt_ProStockInfo> proStockInfos = new List<Dt_ProStockInfo>();
|
List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
|
foreach (var item in AllproStockInfos)
|
{
|
proStockInfoDetails.AddRange(item.proStockInfoDetails);
|
}
|
proStockInfoDetails = proStockInfoDetails.OrderBy(x => x.DateCode).ThenBy(x => x.CreateDate).ThenBy(x=>x.StockPcsQty).ToList();
|
List<Dt_Warehouse> warehouses = await _basicRepository.WarehouseRepository.QueryDataAsync(x => x.WarehouseType == WarehouseTypEnum.成品.ToString());
|
//将其分组
|
outProInfos = outProInfos.GroupBy(x => x.ProductCode).Select(x=>new OutProInfoDTO()
|
{
|
ProductCode=x.Key,
|
OutQtys=x.Sum(x=>x.OutQtys)
|
}).ToList();
|
List<Dt_ProStockInfoDetail> UpStockInfoDetails = new List<Dt_ProStockInfoDetail>();
|
foreach (var item in outProInfos)
|
{
|
//获取库存
|
List<Dt_ProStockInfoDetail> outStocks = proStockInfoDetails.Where(x => x.ProductCode == item.ProductCode && x.OutProNo == null).ToList();
|
if (outStocks.Count <= 0 || outProInfos==null)
|
{
|
return await Task.FromResult(content.Error($"未找到产品{item.ProductCode}库存"));
|
}
|
foreach (var outStock in outStocks)
|
{
|
//如果扣减为0跳出逻辑
|
if (item.OutQtys == 0)
|
{
|
break;
|
}
|
//判断出库数量是否大于或等于库存数量
|
if (item.OutQtys >= outStock.StockPcsQty)
|
{
|
Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.PCode == item.ProductCode && x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt());
|
//判断是否存在同一型号两条明细
|
if (proOutOrderDetail == null)
|
{
|
return await Task.FromResult(content.Error($"出库单{proOutOrder.ProOutOrderNo}未找到产品{item.ProductCode}明细,请检查"));
|
}
|
List<Dt_ProOutOrderDetail>? outOrderDetails = proOutOrder.Details.Where(x => x.PCode == item.ProductCode && x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt() && x.Id != proOutOrderDetail.Id).ToList();
|
float BeyondQtys = proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs;
|
//更新出库明细单数量
|
proOutOrderDetail.OverQtyPcs += outStock.StockPcsQty;
|
|
//是否超出
|
if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
|
{
|
if (outOrderDetails.Count>=1)
|
{
|
proOutOrderDetail.OverQtyPcs -= outStock.StockPcsQty;
|
proOutOrderDetail.OverQtyPcs += BeyondQtys;
|
outStock.OutboundQuantity = BeyondQtys;
|
outStock.OutDetailSaleNo = proOutOrderDetail.SaleOrder;
|
outStock.OutProNo = proOutOrder.ProOutOrderNo;
|
float Range = outStock.StockPcsQty / outStock.SETQty;
|
if (outStock.OutboundQuantity== outStock.StockPcsQty)
|
{
|
outStock.OutSETQty = outStock.SETQty;
|
outStock.AssignDel = 1;
|
}
|
else
|
{
|
outStock.OutSETQty = outStock.OutboundQuantity / Range;
|
}
|
item.OutQtys -= (int)BeyondQtys;
|
UpStockInfoDetails.Add(outStock);
|
proStockInfoDetails.Remove(outStock);
|
}
|
else
|
{
|
return await Task.FromResult(content.Error($"出库单{proOutOrder.ProOutOrderNo}行号{proOutOrderDetail.RowId}产品型号{item.ProductCode}数量溢出{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}"));
|
}
|
}
|
else
|
{
|
outStock.OutboundQuantity = outStock.StockPcsQty;
|
outStock.OutDetailSaleNo = proOutOrderDetail.SaleOrder;
|
outStock.OutProNo = proOutOrder.ProOutOrderNo;
|
outStock.OutSETQty = outStock.SETQty;
|
outStock.AssignDel = 1;
|
item.OutQtys -= (int)outStock.StockPcsQty;
|
UpStockInfoDetails.Add(outStock);
|
proStockInfoDetails.Remove(outStock);
|
}
|
if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
|
{
|
proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
|
}
|
if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
|
{
|
proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
|
}
|
}
|
else if (item.OutQtys < outStock.StockPcsQty) //剩余数量小于
|
{
|
Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.PCode == item.ProductCode && x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt());
|
if (proOutOrderDetail == null)
|
{
|
return await Task.FromResult(content.Error($"出库单{proOutOrder.ProOutOrderNo}未找到产品{item.ProductCode}明细,请检查"));
|
}
|
List<Dt_ProOutOrderDetail>? outOrderDetails = proOutOrder.Details.Where(x => x.PCode == item.ProductCode && x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt() && x.Id != proOutOrderDetail.Id).ToList();
|
//更新出库明细单数量
|
float BeyondQtys = proOutOrderDetail.QtyPcs - proOutOrderDetail.OverQtyPcs;
|
proOutOrderDetail.OverQtyPcs += item.OutQtys;
|
|
//是否超出
|
if (proOutOrderDetail.OverQtyPcs > proOutOrderDetail.QtyPcs)
|
{
|
if (outOrderDetails.Count >= 1)
|
{
|
proOutOrderDetail.OverQtyPcs -= outStock.StockPcsQty;
|
proOutOrderDetail.OverQtyPcs += BeyondQtys;
|
outStock.OutDetailSaleNo = proOutOrderDetail.SaleOrder;
|
outStock.OutProNo = proOutOrder.ProOutOrderNo;
|
outStock.OutboundQuantity = BeyondQtys;
|
float Range = outStock.StockPcsQty / outStock.SETQty;
|
outStock.OutSETQty = outStock.OutboundQuantity / Range;
|
item.OutQtys -= (int)BeyondQtys;
|
UpStockInfoDetails.Add(outStock);
|
proStockInfoDetails.Remove(outStock);
|
}
|
else
|
{
|
return await Task.FromResult(content.Error($"出库单{proOutOrder.ProOutOrderNo}行号{proOutOrderDetail.RowId}产品型号{item.ProductCode}数量溢出{proOutOrderDetail.OverQtyPcs - proOutOrderDetail.QtyPcs}"));
|
}
|
}
|
else
|
{
|
outStock.OutDetailSaleNo = proOutOrderDetail.SaleOrder;
|
outStock.OutProNo = proOutOrder.ProOutOrderNo;
|
outStock.OutboundQuantity = item.OutQtys;
|
float Range = outStock.StockPcsQty / outStock.SETQty;
|
outStock.OutSETQty = outStock.OutboundQuantity / Range;
|
item.OutQtys -= item.OutQtys;
|
UpStockInfoDetails.Add(outStock);
|
proStockInfoDetails.Remove(outStock);
|
}
|
if (proOutOrderDetail.ProOrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
|
{
|
proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Outbound.ObjToInt();
|
}
|
if (proOutOrderDetail.OverQtyPcs == proOutOrderDetail.QtyPcs)
|
{
|
proOutOrderDetail.ProOrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
|
}
|
}
|
}
|
}
|
if (proOutOrder.Details.Count == proOutOrder.Details.Where(x => x.ProOrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count())
|
{
|
proOutOrder.ProOrderStatus = OutOrderStatusEnum.出库完成.ObjToInt();
|
}
|
else
|
{
|
Dt_ProOutOrderDetail? proOutOrderDetail = proOutOrder.Details.FirstOrDefault(x => x.ProOrderDetailStatus < OrderDetailStatusEnum.Over.ObjToInt());
|
return await Task.FromResult(content.Error($"{proOutOrderDetail?.SaleOrder}销售订单数量需出{proOutOrderDetail?.QtyPcs},可出{proOutOrderDetail?.OverQtyPcs}"));
|
}
|
List<StockOutItemsItem> stockOutItems = new List<StockOutItemsItem>();
|
if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.出库完成.ObjToInt())
|
{
|
//获取所有已扫码待发货的库存
|
List<Dt_ProStockInfoDetail> assOutStocks = _stockRepository.ProStockInfoDetailRepository.Db.Queryable<Dt_ProStockInfoDetail>()
|
.Where(x => x.OutProNo == ProOutNo).ToList();
|
UpStockInfoDetails.AddRange(assOutStocks);
|
foreach (var item in UpStockInfoDetails)
|
{
|
StockOutItemsItem outItemsItem = new StockOutItemsItem()
|
{
|
PartNum = item.ProductCode,
|
Rev = item.ProductVersion,
|
SoNumber = item.OutDetailSaleNo,
|
BatchNumber = item.ProductCode,
|
QtyPcs = item.OutboundQuantity,
|
QtySet = item.OutSETQty
|
};
|
stockOutItems.Add(outItemsItem);
|
}
|
}
|
Dt_Warehouse warehouseOut = warehouses.Where(x => x.WarehouseId == proOutOrder.WarehouseId).FirstOrDefault();
|
_unitOfWorkManage.BeginTran();
|
//处理库存数据和上传ERP
|
if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.出库完成.ObjToInt())
|
{
|
//成品库存记录变动待加入
|
ERPProOutOrderModel proOutOrderModel = new ERPProOutOrderModel()
|
{
|
Way = 1,
|
StockOutCode = _outboundOrderService.CreateCodeByRule(nameof(RuleCodeEnum.ProOutCOdeRule)),
|
ConfirmedUserNo = App.User.UserName,
|
AssignUserNo = App.User.UserName,
|
WarehouseCode = warehouseOut.WarehouseCode,
|
ShipDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
DeliverplanCode = proOutOrder.ProOutOrderNo,
|
Remark = proOutOrder.Remark,
|
StockOutItems = stockOutItems
|
};
|
//获取删除库存
|
List<Dt_ProStockInfoDetail> delDetails = UpStockInfoDetails.Where(x=>x.AssignDel==1).ToList();
|
List<Dt_ProStockInfoDetail> UpDetails = UpStockInfoDetails.Where(x => x.AssignDel != 1).ToList();
|
//更新数据
|
UpDetails.ForEach(x =>
|
{
|
x.StockPcsQty -= x.OutboundQuantity;
|
x.SETQty -= x.OutSETQty;
|
x.OutDetailId = 0;
|
x.OutDetailSaleNo = null;
|
x.OutProNo = null;
|
});
|
_stockRepository.ProStockInfoDetailRepository.DeleteAndMoveIntoHty(delDetails, OperateTypeEnum.自动完成);
|
await _stockRepository.ProStockInfoDetailRepository.UpdateDataAsync(UpDetails);
|
//同步ERP
|
string response = _invokeERPService.InvokeProOutApi(proOutOrderModel);
|
ErpRequestContent erpRequestContent = response.DeserializeObject<ErpRequestContent>();
|
if (erpRequestContent.res != 1)
|
{
|
throw new Exception("同步ERP失败,错误信息:" + erpRequestContent.Data);
|
}
|
}
|
else
|
{
|
await _stockRepository.ProStockInfoDetailRepository.UpdateDataAsync(UpStockInfoDetails);
|
}
|
await _outboundRepository.ProOutOrderDetailRepository.UpdateDataAsync(proOutOrder.Details);
|
await BaseDal.UpdateDataAsync(proOutOrder);
|
_unitOfWorkManage.CommitTran();
|
return await Task.FromResult(content.OK());
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return await Task.FromResult(content.Error(ex.Message));
|
}
|
}
|
}
|
}
|