|
|
@ -140,11 +140,11 @@ namespace DS.WMS.Core.Settlement.Method
|
|
|
|
{
|
|
|
|
{
|
|
|
|
detail.Currency = settlement.Currency;
|
|
|
|
detail.Currency = settlement.Currency;
|
|
|
|
|
|
|
|
|
|
|
|
var doc = request.Documents.Find(x => x.Id == detail.ApplicationId);
|
|
|
|
var doc = request.Documents.Find(x => x.Id == detail.RefId);
|
|
|
|
if (doc == null)
|
|
|
|
if (doc == null)
|
|
|
|
return DataResult<TEntity>.Failed("结算单据与费用明细不一致");
|
|
|
|
return DataResult<TEntity>.Failed("结算单据与费用明细不一致");
|
|
|
|
|
|
|
|
|
|
|
|
var exchange = doc.ExchangeRates?.Find(x => x.Currency == settlement.Currency);
|
|
|
|
var exchange = doc.ExchangeRates?.Find(x => x.Currency == detail.OriginalCurrency);
|
|
|
|
if (exchange == null)
|
|
|
|
if (exchange == null)
|
|
|
|
return DataResult<TEntity>.Failed($"未传入结算币别 {settlement.Currency} 与费用原币别 {detail.OriginalCurrency} 之间的汇率信息");
|
|
|
|
return DataResult<TEntity>.Failed($"未传入结算币别 {settlement.Currency} 与费用原币别 {detail.OriginalCurrency} 之间的汇率信息");
|
|
|
|
|
|
|
|
|
|
|
@ -250,14 +250,14 @@ namespace DS.WMS.Core.Settlement.Method
|
|
|
|
details1.Where(x => x.RefId == doc.Id).OrderBy(x => x.ApplyAmount) :
|
|
|
|
details1.Where(x => x.RefId == doc.Id).OrderBy(x => x.ApplyAmount) :
|
|
|
|
details1.Where(x => x.BusinessId == doc.Id && x.BusinessType == doc.BusinessType && x.CustomerName == doc.CustomerName).OrderBy(x => x.ApplyAmount);
|
|
|
|
details1.Where(x => x.BusinessId == doc.Id && x.BusinessType == doc.BusinessType && x.CustomerName == doc.CustomerName).OrderBy(x => x.ApplyAmount);
|
|
|
|
|
|
|
|
|
|
|
|
var rmbDetails = details2.Where(x => x.Currency == FeeCurrency.RMB_CODE);
|
|
|
|
var rmbDetails = details2.Where(x => x.OriginalCurrency == FeeCurrency.RMB_CODE);
|
|
|
|
var totalRMB = rmbDetails.Sum(x => x.ApplyAmount);
|
|
|
|
var totalRMB = rmbDetails.Sum(x => x.OriginalAmount);
|
|
|
|
doc.SettlementRMB ??= totalRMB;
|
|
|
|
doc.SettlementRMB ??= totalRMB;
|
|
|
|
|
|
|
|
|
|
|
|
if (doc.SettlementRMB > totalRMB)
|
|
|
|
if (doc.SettlementRMB > totalRMB)
|
|
|
|
return DataResult<TEntity>.Failed("人民币结算金额不能大于剩余人民币金额");
|
|
|
|
return DataResult<TEntity>.Failed("人民币结算金额不能大于剩余人民币金额");
|
|
|
|
|
|
|
|
|
|
|
|
if (totalRMB < doc.SettlementRMB)
|
|
|
|
if (doc.SettlementRMB < totalRMB)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var rest = totalRMB - doc.SettlementRMB.GetValueOrDefault();
|
|
|
|
var rest = totalRMB - doc.SettlementRMB.GetValueOrDefault();
|
|
|
|
foreach (var detail in rmbDetails)
|
|
|
|
foreach (var detail in rmbDetails)
|
|
|
@ -265,19 +265,29 @@ namespace DS.WMS.Core.Settlement.Method
|
|
|
|
if (rest == 0)
|
|
|
|
if (rest == 0)
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
detail.ApplyAmount = detail.ApplyAmount - rest;
|
|
|
|
detail.OriginalAmount = detail.OriginalAmount - rest;
|
|
|
|
rest = detail.ApplyAmount - rest;
|
|
|
|
if (detail.OriginalCurrency == settlement.Currency)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
detail.ApplyAmount = detail.OriginalAmount;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var er = doc.ExchangeRates.Find(x => x.Currency == detail.OriginalCurrency);
|
|
|
|
|
|
|
|
detail.ApplyAmount = detail.OriginalAmount * er?.ExchangeRate ?? 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rest = detail.OriginalAmount - rest;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var usdDetails = details2.Where(x => x.Currency == FeeCurrency.USD_CODE);
|
|
|
|
var usdDetails = details2.Where(x => x.OriginalCurrency == FeeCurrency.USD_CODE);
|
|
|
|
var totalUSD = usdDetails.Sum(x => x.ApplyAmount);
|
|
|
|
var totalUSD = usdDetails.Sum(x => x.OriginalAmount);
|
|
|
|
doc.SettlementUSD ??= totalUSD;
|
|
|
|
doc.SettlementUSD ??= totalUSD;
|
|
|
|
|
|
|
|
|
|
|
|
if (doc.SettlementUSD > totalUSD)
|
|
|
|
if (doc.SettlementUSD > totalUSD)
|
|
|
|
return DataResult<TEntity>.Failed("美元结算金额不能大于剩余美元金额");
|
|
|
|
return DataResult<TEntity>.Failed("美元结算金额不能大于剩余美元金额");
|
|
|
|
|
|
|
|
|
|
|
|
if (totalUSD < doc.SettlementUSD)
|
|
|
|
if (doc.SettlementUSD < totalUSD)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var rest = totalUSD - doc.SettlementUSD.GetValueOrDefault();
|
|
|
|
var rest = totalUSD - doc.SettlementUSD.GetValueOrDefault();
|
|
|
|
foreach (var detail in usdDetails)
|
|
|
|
foreach (var detail in usdDetails)
|
|
|
@ -285,19 +295,28 @@ namespace DS.WMS.Core.Settlement.Method
|
|
|
|
if (rest == 0)
|
|
|
|
if (rest == 0)
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
detail.ApplyAmount = detail.ApplyAmount - rest;
|
|
|
|
detail.OriginalAmount = detail.OriginalAmount - rest;
|
|
|
|
rest = detail.ApplyAmount - rest;
|
|
|
|
if (detail.OriginalCurrency == settlement.Currency)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
detail.ApplyAmount = detail.OriginalAmount;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var er = doc.ExchangeRates.Find(x => x.Currency == detail.OriginalCurrency);
|
|
|
|
|
|
|
|
detail.ApplyAmount = detail.OriginalAmount * er?.ExchangeRate ?? 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
rest = detail.OriginalAmount - rest;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var otherDetails = details2.Where(x => x.Currency != FeeCurrency.RMB_CODE && x.Currency != FeeCurrency.USD_CODE);
|
|
|
|
var otherDetails = details2.Where(x => x.OriginalCurrency != FeeCurrency.RMB_CODE && x.Currency != FeeCurrency.USD_CODE);
|
|
|
|
var total = rmbDetails.Sum(x => x.ApplyAmount);
|
|
|
|
var total = otherDetails.Sum(x => x.OriginalAmount);
|
|
|
|
doc.SettlementOther ??= total;
|
|
|
|
doc.SettlementOther ??= total;
|
|
|
|
|
|
|
|
|
|
|
|
if (doc.SettlementOther > total)
|
|
|
|
if (doc.SettlementOther > total)
|
|
|
|
return DataResult<TEntity>.Failed("其他结算金额不能大于剩余其他金额");
|
|
|
|
return DataResult<TEntity>.Failed("其他结算金额不能大于剩余其他金额");
|
|
|
|
|
|
|
|
|
|
|
|
if (total < doc.SettlementOther)
|
|
|
|
if (doc.SettlementOther < total)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
var rest = total - doc.SettlementOther.GetValueOrDefault();
|
|
|
|
var rest = total - doc.SettlementOther.GetValueOrDefault();
|
|
|
|
foreach (var detail in otherDetails)
|
|
|
|
foreach (var detail in otherDetails)
|
|
|
@ -305,8 +324,17 @@ namespace DS.WMS.Core.Settlement.Method
|
|
|
|
if (rest == 0)
|
|
|
|
if (rest == 0)
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
detail.ApplyAmount = detail.ApplyAmount - rest;
|
|
|
|
detail.OriginalAmount = detail.OriginalAmount - rest;
|
|
|
|
rest = detail.ApplyAmount - rest;
|
|
|
|
if (detail.OriginalCurrency == settlement.Currency)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
detail.ApplyAmount = detail.OriginalAmount;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
var er = doc.ExchangeRates.Find(x => x.Currency == detail.OriginalCurrency);
|
|
|
|
|
|
|
|
detail.ApplyAmount = detail.OriginalAmount * er?.ExchangeRate ?? 1;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
rest = detail.OriginalAmount - rest;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|