Commit 79bd88b3 by 陶然

解决借票冲销撤销接口bug

parent 06a7a83b
......@@ -310,6 +310,153 @@ namespace Kivii.Finances
/// <summary>
/// complate!
/// 重新计算Payment的 AmountInvoice
/// 只针对Bank等根级Payment
/// </summary>
/// <param name="payment"></param>
/// <param name="conn"></param>
/// <returns></returns>
public static Payment RecalculateAmountInvoice(this Payment payment, IDbConnection conn = null)
{
payment.ThrowIfNull("要更新的付款记录不能为空!");
(payment.OffsetKvid != Guid.Empty).ThrowIfTrue("此到账已作废 无法重新计算开票金额");
(payment.Type != PaymentType.Bank && payment.Type != PaymentType.Split).ThrowIfTrue("不支持的类型");
bool useTransaction = conn == null;//是否启用事务,如果外部未传入conn,启用内部事务
if (conn == null) conn = KiviiContext.GetOpenedDbConnection<Payment>();
var amountInvoiced = conn.Scalar<Payment, decimal>(o => Sql.Sum(o.AmountInvoice), p => Sql.In(p.Type, PaymentType.Assign, PaymentType.Split) && p.ParentKvid == payment.Kvid && p.OffsetKvid == Guid.Empty);
Payment parentPayment = null;
if (payment.ParentKvid != Guid.Empty) parentPayment = conn.SingleById<Payment>(payment.ParentKvid);
IDbTransaction trans = null;//事务,如果外部来了Connection,不生成事务
if (useTransaction) trans = conn.OpenTransaction();
try
{
payment.AmountInvoice = amountInvoiced;
payment.AddOnlyProperties(o => o.AmountInvoice);
conn.UpdateOnly(payment);
if (parentPayment != null) parentPayment.RecalculateAmountSplit(conn);
trans?.Commit();
return payment;
}
catch (Exception ex)
{
trans?.Rollback();
throw ex;
}
}
/// <summary>
/// 重新计算Assign类型的AmountInvoice或AmountUsed
/// 如果是上级到账进行开票,收款登记或充值的话,存在子集Assign则需要向下更新对应的AmountInvoice和AmountUsed
/// </summary>
/// <param name="payment"></param>
/// <param name="conn"></param>
/// <returns></returns>
public static List<Payment> RecalculateAssignAmount(this Payment payment, IDbConnection conn = null)
{
payment.ThrowIfNull("要更新的付款记录不能为空!");
(payment.OffsetKvid != Guid.Empty).ThrowIfTrue("此到账已作废 无法重新计算开票金额");
(payment.Type != PaymentType.Split).ThrowIfTrue("不支持的类型");
bool useTransaction = conn == null;//是否启用事务,如果外部未传入conn,启用内部事务
if (conn == null) conn = KiviiContext.GetOpenedDbConnection<Payment>();
//查看已经拆分的项目分得的已经开票金额
var existSplits = conn.Select<Payment>(o => o.ParentKvid == payment.Kvid && o.OffsetKvid == Guid.Empty && o.Type == PaymentType.Assign);
if (existSplits.IsNullOrEmpty()) return null;
if (payment.AmountInvoice <= 0)
{
foreach (var item in existSplits)
{
if (item.AmountInvoice == 0) continue;
item.AmountInvoice = 0;
item.AddOnlyProperties(o => o.AmountInvoice);
}
}
else //如果要拆分的到账已经开过票 就要计算拆分项的开票金额
{
if (payment.AmountInvoice < payment.Amount)//到账的部分进行了开票 就需要计算拆分项的开票金额
{
var amountInvoice = payment.AmountInvoice;
foreach (var item in existSplits)
{
var currentAmount = amountInvoice > item.Amount ? item.Amount : amountInvoice;
item.AmountInvoice = currentAmount;
item.AddOnlyProperties(o => o.AmountInvoice);
amountInvoice -= currentAmount;
}
}
else
{
foreach (var item in existSplits)
{
if (item.AmountInvoice == item.Amount) continue;
item.AmountInvoice = item.Amount;
item.AddOnlyProperties(o => o.AmountInvoice);
}
}
}
if (payment.AmountUsed <= 0)
{
foreach (var item in existSplits)
{
if (item.AmountUsed == 0) continue;
item.AmountUsed = 0;
item.AddOnlyProperties(o => o.AmountUsed);
}
}
else //如果要拆分的到账已经开过票 就要计算拆分项的开票金额
{
if (payment.AmountUsed < payment.Amount)//到账的部分进行了开票 就需要计算拆分项的开票金额
{
var amountUsed = payment.AmountUsed;
foreach (var item in existSplits)
{
var currentAmount = amountUsed > item.Amount ? item.Amount : amountUsed;
item.AmountUsed = currentAmount;
item.AddOnlyProperties(o => o.AmountUsed);
amountUsed -= currentAmount;
}
}
else
{
foreach (var item in existSplits)
{
if (item.AmountUsed == item.Amount) continue;
item.AmountUsed = item.Amount;
item.AddOnlyProperties(o => o.AmountUsed);
}
}
}
var rtns = new List<Payment>();
IDbTransaction trans = null;//事务,如果外部来了Connection,不生成事务
if (useTransaction) trans = conn.OpenTransaction();
try
{
foreach (var item in existSplits)
{
if (item.OnlyProperties.IsNullOrEmpty()) continue;
conn.UpdateOnly(item);
rtns.Add(item);
}
trans?.Commit();
return rtns;
}
catch (Exception ex)
{
trans?.Rollback();
throw ex;
}
}
/// <summary>
/// complate!
/// 到账冲账,此方法不做业务判断,传过来的Payment均可Offset,除已经冲账过的
/// </summary>
/// <param name="payment"></param>
......@@ -399,35 +546,38 @@ namespace Kivii.Finances
else amountUsed = amountAssign;
}
#region 新增拆分项目
var splitPayment = new Payment();
splitPayment.PopulateWith(payment);//先从父级中拷贝所有参数
var assignPayment = new Payment();
assignPayment.PopulateWith(payment);//先从父级中拷贝所有参数
//赋值
splitPayment.Kvid = Guid.NewGuid();
splitPayment.ParentKvid = payment.Kvid;
splitPayment.RootKvid = payment.RootKvid;
splitPayment.OffsetKvid = Guid.Empty;
splitPayment.OwnerKvid = ownerKvid == null ? Guid.Empty : ownerKvid.Value;
splitPayment.OwnerName = ownerName;
assignPayment.Kvid = Guid.NewGuid();
assignPayment.ParentKvid = payment.Kvid;
assignPayment.RootKvid = payment.RootKvid;
assignPayment.OffsetKvid = Guid.Empty;
assignPayment.OwnerKvid = ownerKvid == null ? Guid.Empty : ownerKvid.Value;
assignPayment.OwnerName = ownerName;
//业务设置
splitPayment.BizId = string.Empty;
splitPayment.BizKvid = Guid.Empty;
splitPayment.BizType = string.Empty;
splitPayment.SerialNumber = payment.GetSubSerialNumber();
splitPayment.Type = PaymentType.Assign;
assignPayment.BizId = string.Empty;
assignPayment.BizKvid = Guid.Empty;
assignPayment.BizType = string.Empty;
assignPayment.SerialNumber = payment.GetSubSerialNumber();
assignPayment.Type = PaymentType.Assign;
//金额设置
splitPayment.Amount = amountAssign;
splitPayment.AmountSplited = 0;
splitPayment.AmountUsed = amountUsed;
splitPayment.AmountInvoice = amountInvoice;// payment.AmountInvoice > amountSplit ? amountSplit : payment.AmountInvoice;
assignPayment.Amount = amountAssign;
assignPayment.AmountSplited = 0;
assignPayment.AmountUsed = amountUsed;
assignPayment.AmountInvoice = amountInvoice;// payment.AmountInvoice > amountSplit ? amountSplit : payment.AmountInvoice;
//splitPayment.Summary = string.Empty;
if (!remark.IsNullOrEmpty()) splitPayment.Remark += $"[划转备注: {remark}]";
splitPayment.OperateTime = payment.OperateTime;
splitPayment.OperatorName = KiviiContext.CurrentMember.FullName;
splitPayment.OperatorKvid = KiviiContext.CurrentMember.Kvid;
if (!remark.IsNullOrEmpty()) assignPayment.Remark += $"[划转备注: {remark}]";
assignPayment.OperateTime = payment.OperateTime;
assignPayment.OperatorName = KiviiContext.CurrentMember.FullName;
assignPayment.OperatorKvid = KiviiContext.CurrentMember.Kvid;
if (assignPayment.Metadata.IsNullOrEmpty()) assignPayment.Metadata = new Dictionary<string, string>();
assignPayment.Metadata["AssignOwnerName"] = payment.OwnerName;
assignPayment.Metadata["AssignOwnerKvid"] = payment.OwnerKvid.ToString();
//splitPayment.Status = 1;
#endregion
return splitPayment;
return assignPayment;
}
/// <summary>
......@@ -571,152 +721,5 @@ namespace Kivii.Finances
return splitPayment;
}
/// <summary>
/// complate!
/// 重新计算Payment的 AmountInvoice
/// 只针对Bank等根级Payment
/// </summary>
/// <param name="payment"></param>
/// <param name="conn"></param>
/// <returns></returns>
public static Payment RecalculateAmountInvoice(this Payment payment, IDbConnection conn = null)
{
payment.ThrowIfNull("要更新的付款记录不能为空!");
(payment.OffsetKvid != Guid.Empty).ThrowIfTrue("此到账已作废 无法重新计算开票金额");
(payment.Type != PaymentType.Bank && payment.Type != PaymentType.Split).ThrowIfTrue("不支持的类型");
bool useTransaction = conn == null;//是否启用事务,如果外部未传入conn,启用内部事务
if (conn == null) conn = KiviiContext.GetOpenedDbConnection<Payment>();
var amountInvoiced = conn.Scalar<Payment, decimal>(o => Sql.Sum(o.AmountInvoice), p => Sql.In(p.Type, PaymentType.Assign, PaymentType.Split) && p.ParentKvid == payment.Kvid && p.OffsetKvid == Guid.Empty);
Payment parentPayment = null;
if (payment.ParentKvid != Guid.Empty) parentPayment = conn.SingleById<Payment>(payment.ParentKvid);
IDbTransaction trans = null;//事务,如果外部来了Connection,不生成事务
if (useTransaction) trans = conn.OpenTransaction();
try
{
payment.AmountInvoice = amountInvoiced;
payment.AddOnlyProperties(o => o.AmountInvoice);
conn.UpdateOnly(payment);
if (parentPayment != null) parentPayment.RecalculateAmountSplit(conn);
trans?.Commit();
return payment;
}
catch (Exception ex)
{
trans?.Rollback();
throw ex;
}
}
/// <summary>
/// 重新计算Assign类型的AmountInvoice或AmountUsed
/// 如果是上级到账进行开票,收款登记或充值的话,存在子集Assign则需要向下更新对应的AmountInvoice和AmountUsed
/// </summary>
/// <param name="payment"></param>
/// <param name="conn"></param>
/// <returns></returns>
public static List<Payment> RecalculateAssignAmount(this Payment payment, IDbConnection conn = null)
{
payment.ThrowIfNull("要更新的付款记录不能为空!");
(payment.OffsetKvid != Guid.Empty).ThrowIfTrue("此到账已作废 无法重新计算开票金额");
(payment.Type != PaymentType.Split).ThrowIfTrue("不支持的类型");
bool useTransaction = conn == null;//是否启用事务,如果外部未传入conn,启用内部事务
if (conn == null) conn = KiviiContext.GetOpenedDbConnection<Payment>();
//查看已经拆分的项目分得的已经开票金额
var existSplits = conn.Select<Payment>(o => o.RootKvid == payment.RootKvid && o.OffsetKvid == Guid.Empty && o.Type == PaymentType.Assign);
if (existSplits.IsNullOrEmpty()) return null;
if (payment.AmountInvoice <= 0)
{
foreach (var item in existSplits)
{
if (item.AmountInvoice == 0) continue;
item.AmountInvoice = 0;
item.AddOnlyProperties(o => o.AmountInvoice);
}
}
else //如果要拆分的到账已经开过票 就要计算拆分项的开票金额
{
if (payment.AmountInvoice < payment.Amount)//到账的部分进行了开票 就需要计算拆分项的开票金额
{
var amountInvoice = payment.AmountInvoice;
foreach (var item in existSplits)
{
var currentAmount = amountInvoice > item.Amount ? item.Amount : amountInvoice;
item.AmountInvoice = currentAmount;
item.AddOnlyProperties(o => o.AmountInvoice);
amountInvoice -= currentAmount;
}
}
else
{
foreach (var item in existSplits)
{
if (item.AmountInvoice == item.Amount) continue;
item.AmountInvoice = item.Amount;
item.AddOnlyProperties(o => o.AmountInvoice);
}
}
}
if (payment.AmountUsed <= 0)
{
foreach (var item in existSplits)
{
if (item.AmountUsed == 0) continue;
item.AmountUsed = 0;
item.AddOnlyProperties(o => o.AmountUsed);
}
}
else //如果要拆分的到账已经开过票 就要计算拆分项的开票金额
{
if (payment.AmountUsed < payment.Amount)//到账的部分进行了开票 就需要计算拆分项的开票金额
{
var amountUsed = payment.AmountUsed;
foreach (var item in existSplits)
{
var currentAmount = amountUsed > item.Amount ? item.Amount : amountUsed;
item.AmountUsed = currentAmount;
item.AddOnlyProperties(o => o.AmountUsed);
amountUsed -= currentAmount;
}
}
else
{
foreach (var item in existSplits)
{
if (item.AmountUsed == item.Amount) continue;
item.AmountUsed = item.Amount;
item.AddOnlyProperties(o => o.AmountUsed);
}
}
}
var rtns = new List<Payment>();
IDbTransaction trans = null;//事务,如果外部来了Connection,不生成事务
if (useTransaction) trans = conn.OpenTransaction();
try
{
foreach (var item in existSplits)
{
if (item.OnlyProperties.IsNullOrEmpty()) continue;
conn.UpdateOnly(item);
rtns.Add(item);
}
trans?.Commit();
return rtns;
}
catch (Exception ex)
{
trans?.Rollback();
throw ex;
}
}
}
}
......@@ -208,7 +208,9 @@ namespace Kivii.Finances.Transforms
{
foreach (var item in splitPayments)
{
if (item.OnlyProperties.Count > 0) conn.UpdateOnly(item);
if (item.OnlyProperties.Count <= 0) continue;
conn.UpdateOnly(item);
item.RecalculateAssignAmount(conn);
}
}
rtns.Results.AddRange(invoices);
......
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