Commit 65f88acb by 陶然

优化

parent 53d42be3
...@@ -21,7 +21,7 @@ namespace Kivii.Finances ...@@ -21,7 +21,7 @@ namespace Kivii.Finances
/// <param name="accountDetail">生成的账户明细清单</param> /// <param name="accountDetail">生成的账户明细清单</param>
/// <param name="amount">指定的费用,若不指定金额则默认全部</param> /// <param name="amount">指定的费用,若不指定金额则默认全部</param>
/// <returns>生成用于收款登记的到账子项</returns> /// <returns>生成用于收款登记的到账子项</returns>
public static Payment Paying(this List<Settlement> settlements, Payment payment, Account accountPayee, out List<Pay> pays, out AccountDetail accountDetail, decimal amount = 0) public static Payment Paying(this List<Settlement> settlements, Payment payment, Account accountPayee, out List<Pay> pays, out AccountDetail accountDetail, decimal amount = 0, string remark = null)
{ {
settlements.ThrowIfNullOrEmpty("未传入结算信息!"); settlements.ThrowIfNullOrEmpty("未传入结算信息!");
payment.ThrowIfNull("未传入到账信息!"); payment.ThrowIfNull("未传入到账信息!");
...@@ -29,6 +29,7 @@ namespace Kivii.Finances ...@@ -29,6 +29,7 @@ namespace Kivii.Finances
(settlements.Exists(o => o.Currency != payment.Currency || o.Currency != accountPayee.Currency)).ThrowIfTrue("存在不相符的货币单位!"); (settlements.Exists(o => o.Currency != payment.Currency || o.Currency != accountPayee.Currency)).ThrowIfTrue("存在不相符的货币单位!");
if (payment.Type != PaymentType.Split && payment.Type != PaymentType.Pos && payment.Type != PaymentType.Cash && payment.Type != PaymentType.AliPay && payment.Type != PaymentType.WeChat) throw new Exception("请选择正确的付款方式!"); if (payment.Type != PaymentType.Split && payment.Type != PaymentType.Pos && payment.Type != PaymentType.Cash && payment.Type != PaymentType.AliPay && payment.Type != PaymentType.WeChat) throw new Exception("请选择正确的付款方式!");
var amountSettlement = settlements.Sum(o => o.Amount - o.AmountPayment); var amountSettlement = settlements.Sum(o => o.Amount - o.AmountPayment);
if (amountSettlement <= 0) throw new Exception("当前结算已无需付款登记!");
if (amount <= 0 || amount > amountSettlement) amount = amountSettlement; if (amount <= 0 || amount > amountSettlement) amount = amountSettlement;
(payment.Amount - payment.AmountUsed < amount).ThrowIfTrue($"付款编号[{payment.SerialNumber}]余额不足!可用余额:{ payment.Amount - payment.AmountUsed}"); (payment.Amount - payment.AmountUsed < amount).ThrowIfTrue($"付款编号[{payment.SerialNumber}]余额不足!可用余额:{ payment.Amount - payment.AmountUsed}");
...@@ -78,6 +79,7 @@ namespace Kivii.Finances ...@@ -78,6 +79,7 @@ namespace Kivii.Finances
accountDetail.PayeeAccountSerialNumber = accountPayee.SerialNumber; accountDetail.PayeeAccountSerialNumber = accountPayee.SerialNumber;
accountDetail.AmountPayment = amount; accountDetail.AmountPayment = amount;
accountDetail.Summary = "收款登记"; accountDetail.Summary = "收款登记";
accountDetail.Remark = remark;
#endregion #endregion
pays = new List<Pay>(); pays = new List<Pay>();
...@@ -85,7 +87,7 @@ namespace Kivii.Finances ...@@ -85,7 +87,7 @@ namespace Kivii.Finances
{ {
if (settlement.AmountPayment >= settlement.Amount) continue; if (settlement.AmountPayment >= settlement.Amount) continue;
if (amount <= 0) continue; if (amount <= 0) continue;
var currentAmount = amount <= (settlement.Amount - settlement.AmountPayment) ? amount : (settlement.Amount - settlement.AmountPayment); var currentAmount = (amount <= (settlement.Amount - settlement.AmountPayment) ? amount : (settlement.Amount - settlement.AmountPayment));
var pay = new Pay(); var pay = new Pay();
pay.BizId = settlement.SerialNumber; pay.BizId = settlement.SerialNumber;
...@@ -110,6 +112,7 @@ namespace Kivii.Finances ...@@ -110,6 +112,7 @@ namespace Kivii.Finances
pay.OperateTime = DateTime.Now; pay.OperateTime = DateTime.Now;
pay.OperatorName = KiviiContext.CurrentMember.FullName; pay.OperatorName = KiviiContext.CurrentMember.FullName;
pay.OperatorKvid = KiviiContext.CurrentMember.Kvid; pay.OperatorKvid = KiviiContext.CurrentMember.Kvid;
pay.Remark = remark;
pays.Add(pay); pays.Add(pay);
settlement.AmountPayment += currentAmount; settlement.AmountPayment += currentAmount;
...@@ -130,7 +133,7 @@ namespace Kivii.Finances ...@@ -130,7 +133,7 @@ namespace Kivii.Finances
/// <param name="pays">生成的pay清单,Biz记录结算信息</param> /// <param name="pays">生成的pay清单,Biz记录结算信息</param>
/// <param name="amount">指定的费用,若不指定金额则默认全部</param> /// <param name="amount">指定的费用,若不指定金额则默认全部</param>
/// <returns>生成的账户明细清单</returns> /// <returns>生成的账户明细清单</returns>
public static List<AccountDetail> Paying(this List<Settlement> settlements, Account accountPayer, Account accountPayee, out List<Pay> pays, decimal amount = 0) public static List<AccountDetail> Paying(this List<Settlement> settlements, Account accountPayer, Account accountPayee, out List<Pay> pays, decimal amount = 0, string remark = null)
{ {
settlements.ThrowIfNullOrEmpty("未传入结算信息!"); settlements.ThrowIfNullOrEmpty("未传入结算信息!");
accountPayer.ThrowIfNull("未传入指定付款账户!"); accountPayer.ThrowIfNull("未传入指定付款账户!");
...@@ -138,6 +141,7 @@ namespace Kivii.Finances ...@@ -138,6 +141,7 @@ namespace Kivii.Finances
(settlements.Exists(o => o.Currency != accountPayer.Currency || o.Currency != accountPayee.Currency)).ThrowIfTrue("存在不相符的货币单位!"); (settlements.Exists(o => o.Currency != accountPayer.Currency || o.Currency != accountPayee.Currency)).ThrowIfTrue("存在不相符的货币单位!");
(accountPayer.Type != AccountType.Deposit && accountPayer.Type != AccountType.Discount).ThrowIfTrue("请选择正确的付款账户!"); (accountPayer.Type != AccountType.Deposit && accountPayer.Type != AccountType.Discount).ThrowIfTrue("请选择正确的付款账户!");
var amountSettlement = settlements.Sum(o => o.Amount - o.AmountPayment); var amountSettlement = settlements.Sum(o => o.Amount - o.AmountPayment);
if (amountSettlement <= 0) throw new Exception("当前结算已无需付款登记!");
if (amount <= 0 || amount > amountSettlement) amount = amountSettlement; if (amount <= 0 || amount > amountSettlement) amount = amountSettlement;
(accountPayer.Amount + accountPayer.CreditLine < amount).ThrowIfTrue($"账户[{accountPayer.Name}]余额不足!可用余额:{accountPayer.Amount + accountPayer.CreditLine}"); (accountPayer.Amount + accountPayer.CreditLine < amount).ThrowIfTrue($"账户[{accountPayer.Name}]余额不足!可用余额:{accountPayer.Amount + accountPayer.CreditLine}");
...@@ -160,6 +164,7 @@ namespace Kivii.Finances ...@@ -160,6 +164,7 @@ namespace Kivii.Finances
payeeDetail.PayeeAccountSerialNumber = accountPayee.SerialNumber; payeeDetail.PayeeAccountSerialNumber = accountPayee.SerialNumber;
payeeDetail.AmountPayment = amount; payeeDetail.AmountPayment = amount;
payeeDetail.Summary = "收款登记"; payeeDetail.Summary = "收款登记";
payeeDetail.Remark = remark;
rtns.Add(payeeDetail); rtns.Add(payeeDetail);
var payerDetail = new AccountDetail(); var payerDetail = new AccountDetail();
...@@ -179,6 +184,7 @@ namespace Kivii.Finances ...@@ -179,6 +184,7 @@ namespace Kivii.Finances
payerDetail.PayeeAccountSerialNumber = accountPayee.SerialNumber; payerDetail.PayeeAccountSerialNumber = accountPayee.SerialNumber;
payerDetail.AmountPayment = amount; payerDetail.AmountPayment = amount;
payerDetail.Summary = "收款登记"; payerDetail.Summary = "收款登记";
payerDetail.Remark = remark;
rtns.Add(payerDetail); rtns.Add(payerDetail);
#endregion #endregion
...@@ -220,6 +226,7 @@ namespace Kivii.Finances ...@@ -220,6 +226,7 @@ namespace Kivii.Finances
pay.OperateTime = DateTime.Now; pay.OperateTime = DateTime.Now;
pay.OperatorName = KiviiContext.CurrentMember.FullName; pay.OperatorName = KiviiContext.CurrentMember.FullName;
pay.OperatorKvid = KiviiContext.CurrentMember.Kvid; pay.OperatorKvid = KiviiContext.CurrentMember.Kvid;
pay.Remark = remark;
pays.Add(pay); pays.Add(pay);
settlement.AmountPayment += currentAmount; settlement.AmountPayment += currentAmount;
......
...@@ -33,14 +33,15 @@ namespace Kivii.Finances.Transforms ...@@ -33,14 +33,15 @@ namespace Kivii.Finances.Transforms
settlements.ThrowIfNullOrEmpty("未找到结算单!"); settlements.ThrowIfNullOrEmpty("未找到结算单!");
if (settlements.Count != SettlementKvids.Count) throw new Exception("所选结算项与实际结算项不符合!"); if (settlements.Count != SettlementKvids.Count) throw new Exception("所选结算项与实际结算项不符合!");
if (settlements.Exists(o => o.OffsetKvid != Guid.Empty)) throw new Exception("所选结算项存在已作废项!"); if (settlements.Exists(o => o.OffsetKvid != Guid.Empty)) throw new Exception("所选结算项存在已作废项!");
if (settlements.Exists(o => o.AmountPayment == o.Amount)) throw new Exception("所选结算项存在已付款登记!"); if (settlements.Exists(o => o.AmountPayment >= o.Amount)) throw new Exception("所选结算项存在已付款登记!");
(settlements.ConvertAll(o => o.Currency).Distinct().ToList().Count != 1).ThrowIfTrue("存在不相符的货币单位!"); (settlements.ConvertAll(o => o.Currency).Distinct().ToList().Count != 1).ThrowIfTrue("存在不相符的货币单位!");
var currency = settlements.ConvertAll(o => o.Currency).Distinct().ToList()[0]; var currency = settlements.ConvertAll(o => o.Currency).Distinct().ToList()[0];
(currency == CurrencyUnit.Unsupported).ThrowIfTrue("不支持的货币单位!"); (currency == CurrencyUnit.Unsupported).ThrowIfTrue("不支持的货币单位!");
var amountSettlement = settlements.Sum(o => o.Amount); var amountSettlement = settlements.Sum(o => o.Amount);
var amountSettlementPlan = settlements.Sum(o => o.AmountPlan); var amountSettlementPlan = settlements.Sum(o => o.AmountPlan);
(amountMethod != amountSettlement).ThrowIfTrue("所选结算总金额与付款总金额不等!"); var amountPayed = settlements.Sum(o => o.AmountPayment);
(amountMethod > amountSettlement - amountPayed).ThrowIfTrue("所选结算总金额大于所需金额!");
var rtns = new RestfulExecutionResponse<Pay>(); var rtns = new RestfulExecutionResponse<Pay>();
rtns.Results = new List<Pay>(); rtns.Results = new List<Pay>();
...@@ -57,9 +58,13 @@ namespace Kivii.Finances.Transforms ...@@ -57,9 +58,13 @@ namespace Kivii.Finances.Transforms
payment.ThrowIfNull("所选付款数据不存在!"); payment.ThrowIfNull("所选付款数据不存在!");
(payment.Currency != currency).ThrowIfTrue("存在不相符的货币单位!"); (payment.Currency != currency).ThrowIfTrue("存在不相符的货币单位!");
if (payment.Type != PaymentType.Split && payment.Type != PaymentType.Pos && payment.Type != PaymentType.Cash && payment.Type != PaymentType.AliPay && payment.Type != PaymentType.WeChat) throw new Exception("请选择正确的付款方式!"); if (payment.Type != PaymentType.Split && payment.Type != PaymentType.Pos && payment.Type != PaymentType.Cash && payment.Type != PaymentType.AliPay && payment.Type != PaymentType.WeChat) throw new Exception("请选择正确的付款方式!");
if (payment.Amount - payment.AmountUsed < amountSettlement) throw new Exception($"所选付款方式余额不足,可用余额:{payment.Amount - payment.AmountUsed}"); var amount = amountSettlement - amountPayed;
if (payment.Amount - payment.AmountUsed < amount) amount = payment.Amount - payment.AmountUsed;
(payingMethod.Amount > 0 && payingMethod.Amount > payment.Amount - payment.AmountUsed).ThrowIfTrue($"所选付款方式余额不足,可用余额:{payment.Amount - payment.AmountUsed}");
if (payingMethod.Amount > 0 && payingMethod.Amount < amount) amount = payingMethod.Amount;//外部指定分摊多少钱就按照指定的费用进行分摊 否则就按照能使用的最大金额进行分摊
//if (payment.Amount - payment.AmountUsed < amountSettlement) throw new Exception($"所选付款方式余额不足,可用余额:{payment.Amount - payment.AmountUsed}");
//(payment.AmountInvoice != payment.Amount).ThrowIfTrue("所选到账尚未开票,请先开票后再分摊!"); //(payment.AmountInvoice != payment.Amount).ThrowIfTrue("所选到账尚未开票,请先开票后再分摊!");
var dynamicPayPayment = settlements.Paying(payment, accountBiz, out var pays, out var accountDetail); var dynamicPayPayment = settlements.Paying(payment, accountBiz, out var pays, out var accountDetail, amount);
var trans = conn.OpenTransaction(); var trans = conn.OpenTransaction();
List<IDbTransaction> subTrans = new List<IDbTransaction>(); List<IDbTransaction> subTrans = new List<IDbTransaction>();
...@@ -112,8 +117,12 @@ namespace Kivii.Finances.Transforms ...@@ -112,8 +117,12 @@ namespace Kivii.Finances.Transforms
account.ThrowIfNull("未找到所选账户!"); account.ThrowIfNull("未找到所选账户!");
(account.Currency != currency).ThrowIfTrue("存在不相符的货币单位!"); (account.Currency != currency).ThrowIfTrue("存在不相符的货币单位!");
(account.Type != AccountType.Deposit).ThrowIfTrue("请选择正确的客户存款账户!"); (account.Type != AccountType.Deposit).ThrowIfTrue("请选择正确的客户存款账户!");
(account.Amount + account.CreditLine < amountSettlement).ThrowIfTrue($"所选付款方式余额不足,可用余额:{account.Amount + account.CreditLine}"); var amount = amountSettlement - amountPayed;
var accountDetails = settlements.Paying(account, accountBiz, out var pays); if (account.Amount + account.CreditLine < amount) amount = account.Amount + account.CreditLine;
(payingMethod.Amount > 0 && payingMethod.Amount > account.Amount + account.CreditLine).ThrowIfTrue($"所选付款方式余额不足,可用余额:{account.Amount + account.CreditLine}");
if (payingMethod.Amount > 0 && payingMethod.Amount < amount) amount = payingMethod.Amount;//外部指定分摊多少钱就按照指定的费用进行分摊 否则就按照能使用的最大金额进行分摊
//(account.Amount + account.CreditLine < amountSettlement).ThrowIfTrue($"所选付款方式余额不足,可用余额:{account.Amount + account.CreditLine}");
var accountDetails = settlements.Paying(account, accountBiz, out var pays, amount);
var trans = conn.OpenTransaction(); var trans = conn.OpenTransaction();
List<IDbTransaction> subTrans = new List<IDbTransaction>(); List<IDbTransaction> subTrans = new List<IDbTransaction>();
...@@ -164,7 +173,9 @@ namespace Kivii.Finances.Transforms ...@@ -164,7 +173,9 @@ namespace Kivii.Finances.Transforms
(discountAccount.Currency != currency).ThrowIfTrue("存在不相符的货币单位!"); (discountAccount.Currency != currency).ThrowIfTrue("存在不相符的货币单位!");
(discountAccount.Type != AccountType.Discount).ThrowIfTrue("请选择正确的折扣账户!"); (discountAccount.Type != AccountType.Discount).ThrowIfTrue("请选择正确的折扣账户!");
(discountAccount.OwnerKvid != KiviiContext.CurrentMember.DepartmentKvid).ThrowIfTrue("存在非本部门的折扣账户!"); (discountAccount.OwnerKvid != KiviiContext.CurrentMember.DepartmentKvid).ThrowIfTrue("存在非本部门的折扣账户!");
var accountDetails = settlements.Paying(discountAccount, accountBiz, out var pays); var amount = amountSettlement - amountPayed;
if (payingMethod.Amount > 0 && payingMethod.Amount < amount) amount = payingMethod.Amount;//外部指定分摊多少钱就按照指定的费用进行分摊 否则就按照能使用的最大金额进行分摊
var accountDetails = settlements.Paying(discountAccount, accountBiz, out var pays, amount, payingMethod.Remark);
var trans = conn.OpenTransaction(); var trans = conn.OpenTransaction();
List<IDbTransaction> subTrans = new List<IDbTransaction>(); List<IDbTransaction> subTrans = new List<IDbTransaction>();
...@@ -258,6 +269,8 @@ namespace Kivii.Finances.Transforms ...@@ -258,6 +269,8 @@ namespace Kivii.Finances.Transforms
{ {
var payingMethod = PayingMethods.FirstOrDefault(o => o.Kvid == item.Kvid); var payingMethod = PayingMethods.FirstOrDefault(o => o.Kvid == item.Kvid);
if (payingMethod == null) continue; if (payingMethod == null) continue;
(payingMethod.Amount <= 0).ThrowIfTrue("组合付款缺少当前方式指定金额!");
(payingMethod.Amount > item.Amount - item.AmountUsed).ThrowIfTrue($"所选付款方式余额不足,可用余额:{item.Amount - item.AmountUsed}");
var dynamicPayPayment = settlements.Paying(item, accountBiz, out var pays, out var accountDetail, payingMethod.Amount); var dynamicPayPayment = settlements.Paying(item, accountBiz, out var pays, out var accountDetail, payingMethod.Amount);
allPays.AddRange(pays); allPays.AddRange(pays);
dynamicSplitPayments.Add(dynamicPayPayment); dynamicSplitPayments.Add(dynamicPayPayment);
...@@ -270,6 +283,8 @@ namespace Kivii.Finances.Transforms ...@@ -270,6 +283,8 @@ namespace Kivii.Finances.Transforms
{ {
var payingMethod = PayingMethods.FirstOrDefault(o => o.Kvid == item.Kvid); var payingMethod = PayingMethods.FirstOrDefault(o => o.Kvid == item.Kvid);
if (payingMethod == null) continue; if (payingMethod == null) continue;
(payingMethod.Amount <= 0).ThrowIfTrue("组合付款缺少当前方式指定金额!");
(payingMethod.Amount > item.Amount + item.CreditLine).ThrowIfTrue($"所选付款方式余额不足,可用余额:{item.Amount + item.CreditLine}");
var accountDetails = settlements.Paying(item, accountBiz, out var pays, payingMethod.Amount); var accountDetails = settlements.Paying(item, accountBiz, out var pays, payingMethod.Amount);
allPays.AddRange(pays); allPays.AddRange(pays);
allAccountDetails.AddRange(accountDetails); allAccountDetails.AddRange(accountDetails);
...@@ -281,6 +296,7 @@ namespace Kivii.Finances.Transforms ...@@ -281,6 +296,7 @@ namespace Kivii.Finances.Transforms
{ {
var payingMethod = PayingMethods.FirstOrDefault(o => o.Kvid == item.Kvid); var payingMethod = PayingMethods.FirstOrDefault(o => o.Kvid == item.Kvid);
if (payingMethod == null) continue; if (payingMethod == null) continue;
(payingMethod.Amount <= 0).ThrowIfTrue("组合付款缺少当前方式指定金额!");
var accountDetails = settlements.Paying(item, accountBiz, out var pays, payingMethod.Amount); var accountDetails = settlements.Paying(item, accountBiz, out var pays, payingMethod.Amount);
allPays.AddRange(pays); allPays.AddRange(pays);
allAccountDetails.AddRange(accountDetails); allAccountDetails.AddRange(accountDetails);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment