Commit 79bd88b3 by 陶然

解决借票冲销撤销接口bug

parent 06a7a83b
...@@ -310,6 +310,153 @@ namespace Kivii.Finances ...@@ -310,6 +310,153 @@ namespace Kivii.Finances
/// <summary> /// <summary>
/// complate! /// 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,除已经冲账过的 /// 到账冲账,此方法不做业务判断,传过来的Payment均可Offset,除已经冲账过的
/// </summary> /// </summary>
/// <param name="payment"></param> /// <param name="payment"></param>
...@@ -399,35 +546,38 @@ namespace Kivii.Finances ...@@ -399,35 +546,38 @@ namespace Kivii.Finances
else amountUsed = amountAssign; else amountUsed = amountAssign;
} }
#region 新增拆分项目 #region 新增拆分项目
var splitPayment = new Payment(); var assignPayment = new Payment();
splitPayment.PopulateWith(payment);//先从父级中拷贝所有参数 assignPayment.PopulateWith(payment);//先从父级中拷贝所有参数
//赋值 //赋值
splitPayment.Kvid = Guid.NewGuid(); assignPayment.Kvid = Guid.NewGuid();
splitPayment.ParentKvid = payment.Kvid; assignPayment.ParentKvid = payment.Kvid;
splitPayment.RootKvid = payment.RootKvid; assignPayment.RootKvid = payment.RootKvid;
splitPayment.OffsetKvid = Guid.Empty; assignPayment.OffsetKvid = Guid.Empty;
splitPayment.OwnerKvid = ownerKvid == null ? Guid.Empty : ownerKvid.Value; assignPayment.OwnerKvid = ownerKvid == null ? Guid.Empty : ownerKvid.Value;
splitPayment.OwnerName = ownerName; assignPayment.OwnerName = ownerName;
//业务设置 //业务设置
splitPayment.BizId = string.Empty; assignPayment.BizId = string.Empty;
splitPayment.BizKvid = Guid.Empty; assignPayment.BizKvid = Guid.Empty;
splitPayment.BizType = string.Empty; assignPayment.BizType = string.Empty;
splitPayment.SerialNumber = payment.GetSubSerialNumber(); assignPayment.SerialNumber = payment.GetSubSerialNumber();
splitPayment.Type = PaymentType.Assign; assignPayment.Type = PaymentType.Assign;
//金额设置 //金额设置
splitPayment.Amount = amountAssign; assignPayment.Amount = amountAssign;
splitPayment.AmountSplited = 0; assignPayment.AmountSplited = 0;
splitPayment.AmountUsed = amountUsed; assignPayment.AmountUsed = amountUsed;
splitPayment.AmountInvoice = amountInvoice;// payment.AmountInvoice > amountSplit ? amountSplit : payment.AmountInvoice; assignPayment.AmountInvoice = amountInvoice;// payment.AmountInvoice > amountSplit ? amountSplit : payment.AmountInvoice;
//splitPayment.Summary = string.Empty; //splitPayment.Summary = string.Empty;
if (!remark.IsNullOrEmpty()) splitPayment.Remark += $"[划转备注: {remark}]"; if (!remark.IsNullOrEmpty()) assignPayment.Remark += $"[划转备注: {remark}]";
splitPayment.OperateTime = payment.OperateTime; assignPayment.OperateTime = payment.OperateTime;
splitPayment.OperatorName = KiviiContext.CurrentMember.FullName; assignPayment.OperatorName = KiviiContext.CurrentMember.FullName;
splitPayment.OperatorKvid = KiviiContext.CurrentMember.Kvid; 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; //splitPayment.Status = 1;
#endregion #endregion
return splitPayment; return assignPayment;
} }
/// <summary> /// <summary>
...@@ -571,152 +721,5 @@ namespace Kivii.Finances ...@@ -571,152 +721,5 @@ namespace Kivii.Finances
return splitPayment; 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 ...@@ -208,7 +208,9 @@ namespace Kivii.Finances.Transforms
{ {
foreach (var item in splitPayments) 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); 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