Commit fed5068e by 陶然

Payment新增Assign类型

parent f19140a5
......@@ -236,6 +236,11 @@ namespace Kivii.Finances.Entities
Split,
/// <summary>
/// 拆分后分配,用于内部拆分后指派分配到其他部门,此类型的父级是Split,同时此类型职能与Split相同,可用于收款登记和转账
/// </summary>
Assign,
/// <summary>
/// 非业务使用
/// </summary>
UnBiz,
......
......@@ -38,7 +38,7 @@ namespace Kivii.Finances
{
payments.ThrowIfNullOrEmpty("要关联的Payments不能为空!");
invoices.ThrowIfNullOrEmpty("要关联的Invoices不能为空!");
(payments.Exists(o => o.Type != PaymentType.Bank && o.Type != PaymentType.AliPay && o.Type != PaymentType.Cash && o.Type != PaymentType.Pos && o.Type != PaymentType.Split && o.Type != PaymentType.WeChat)).ThrowIfTrue("请选择正确收款进行关联");
(payments.Exists(o => o.Type != PaymentType.Bank && o.Type != PaymentType.AliPay && o.Type != PaymentType.Cash && o.Type != PaymentType.Pos && o.Type != PaymentType.Split && o.Type != PaymentType.Assign && o.Type != PaymentType.WeChat)).ThrowIfTrue("请选择正确收款进行关联");
var payedTime = payments.Max(o => o.OperateTime);
var rtns = new List<Invoice>();
......
......@@ -24,7 +24,7 @@ namespace Kivii.Finances
payment.ThrowIfNull("未传入到账信息!");
accountPayee.ThrowIfNull("未传入指定收款账户!");
(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.Assign && 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);
if (amountSettlement <= 0) throw new Exception("当前结算已无需付款登记!");
if (amount <= 0 || amount > amountSettlement) amount = amountSettlement;
......
......@@ -227,9 +227,18 @@ namespace Kivii.Finances
{
conn = KiviiContext.GetOpenedDbConnection<Payment>();
}
//var amountInvoiced = conn.Scalar<Payment, decimal>(o => Sql.Sum(o.AmountInvoice), p => p.ParentKvid == payment.Kvid && p.OffsetKvid == Guid.Empty);
var amountUsed = conn.Scalar<Payment, decimal>(o => Sql.Sum(o.AmountUsed), p => p.ParentKvid == payment.Kvid && p.OffsetKvid == Guid.Empty);
decimal amountUsed = 0;
if (payment.Type == PaymentType.Split)//拆分类型 要统计使用金额就跳过子集assgin,因为此类型也可能存在子集 所以把他们合并起来一起查
{
var queryAssign = conn.From<Payment>();
queryAssign.Where(o => o.ParentKvid == payment.Kvid && o.OffsetKvid == Guid.Empty && o.Type == PaymentType.Assign);
queryAssign.Select(o => o.Kvid);
var assignKvids = conn.Select<Guid>(queryAssign);
if (assignKvids.IsNullOrEmpty()) assignKvids = new List<Guid>();
assignKvids.Add(payment.Kvid);
amountUsed = conn.Scalar<Payment, decimal>(o => Sql.Sum(o.AmountUsed), p => p.Type != PaymentType.Assign && Sql.In(p.ParentKvid, assignKvids) && p.OffsetKvid == Guid.Empty);
}
else amountUsed = conn.Scalar<Payment, decimal>(o => Sql.Sum(o.AmountUsed), p => 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,不生成事务
......@@ -265,7 +274,7 @@ namespace Kivii.Finances
public static Payment RecalculateAmountSplit(this Payment payment, IDbConnection conn = null)
{
payment.ThrowIfNull("要更新的付款记录不能为空!");
(payment.Type != PaymentType.Bank).ThrowIfTrue("不支持的类型");
(payment.Type != PaymentType.Bank && payment.Type != PaymentType.Split).ThrowIfTrue("不支持的类型");
bool useTransaction = conn == null;//是否启用事务,如果外部未传入conn,启用内部事务
if (conn == null)
{
......@@ -273,7 +282,7 @@ namespace Kivii.Finances
}
//var amountInvoiced = conn.Scalar<Payment, decimal>(o => Sql.Sum(o.AmountInvoice), p => p.ParentKvid == payment.Kvid && p.OffsetKvid == Guid.Empty);
var amountSplit = conn.Scalar<Payment, decimal>(o => Sql.Sum(o.Amount), p => p.ParentKvid == payment.Kvid && p.OffsetKvid == Guid.Empty);
var amountSplit = conn.Scalar<Payment, decimal>(o => Sql.Sum(o.Amount), p => p.ParentKvid == payment.Kvid && Sql.In(p.Type, PaymentType.Assign, PaymentType.Split) && p.OffsetKvid == Guid.Empty);
Payment parentPayment = null;
if (payment.ParentKvid != Guid.Empty) parentPayment = conn.SingleById<Payment>(payment.ParentKvid);
IDbTransaction trans = null;//事务,如果外部来了Connection,不生成事务
......@@ -337,6 +346,92 @@ namespace Kivii.Finances
/// <summary>
/// complate!
/// 到账划转,并且更新原payment.AmountSplit字段
/// </summary>
/// <param name="payment"></param>
/// <param name="amountAssign"></param>
/// <param name="ownerKvid"></param>
/// <param name="ownerName"></param>
/// <returns></returns>
public static Payment BizAssign(this Payment payment, decimal amountAssign, string remark = null, Guid? ownerKvid = null, string ownerName = null, IDbConnection conn = null)
{
payment.ThrowIfNull($"传入payment参数为空");
if (payment.Type != PaymentType.Split) throw new Exception("请选择正确类型!");
if (payment.OffsetKvid != Guid.Empty) throw new Exception("已冲销收款不可划转!");
(amountAssign <= 0).ThrowIfTrue("金额不能为小于0。");
if (payment.AmountSplited == payment.Amount) throw new Exception("无剩余收款可划转!");
if (payment.AmountSplited + amountAssign > payment.Amount) throw new Exception("划转金额超出范围!");
if (payment.OwnerKvid == ownerKvid) throw new Exception("不可划转至同部门!");
decimal amountInvoice = 0;
decimal amountUsed = 0;
if (payment.AmountInvoice > 0 || payment.AmountUsed > 0)//如果要拆分的到账已经开过票 就要计算拆分项的开票金额
{
if (conn == null) conn = KiviiContext.GetOpenedDbConnection<Payment>();
//查看已经拆分的项目分得的已经开票金额
var existSplits = conn.Select<Payment>(o => o.RootKvid == payment.RootKvid && o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.Assign));
if (payment.AmountInvoice < payment.Amount)//到账的部分进行了开票 就需要计算拆分项的开票金额
{
if (!existSplits.IsNullOrEmpty())
{
//剩余的开票金额
var remainAmountInvoice = payment.AmountInvoice - existSplits.Sum(o => o.AmountInvoice);
if (remainAmountInvoice > 0) amountInvoice = remainAmountInvoice > amountAssign ? amountAssign : remainAmountInvoice;
}
else
{
amountInvoice = payment.AmountInvoice > amountAssign ? amountAssign : payment.AmountInvoice;
}
}
else amountInvoice = amountAssign;//否则直接记录拆分项完全开票
if (payment.AmountUsed < payment.Amount)
{
if (!existSplits.IsNullOrEmpty())
{
//剩余的开票金额
var remainAmountUsed = payment.AmountUsed - existSplits.Sum(o => o.AmountUsed);
if (remainAmountUsed > 0) amountUsed = remainAmountUsed > amountAssign ? amountAssign : remainAmountUsed;
}
else
{
amountUsed = payment.AmountUsed > amountAssign ? amountAssign : payment.AmountUsed;
}
}
else amountUsed = amountAssign;
}
#region 新增拆分项目
var splitPayment = new Payment();
splitPayment.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;
//业务设置
splitPayment.BizId = string.Empty;
splitPayment.BizKvid = Guid.Empty;
splitPayment.BizType = string.Empty;
splitPayment.SerialNumber = payment.GetSubSerialNumber();
splitPayment.Type = PaymentType.Assign;
//金额设置
splitPayment.Amount = amountAssign;
splitPayment.AmountSplited = 0;
splitPayment.AmountUsed = amountUsed;
splitPayment.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;
//splitPayment.Status = 1;
#endregion
return splitPayment;
}
/// <summary>
/// complate!
/// 到账拆分,并且更新原payment.AmountSplit字段
/// </summary>
/// <param name="payment"></param>
......@@ -488,11 +583,14 @@ namespace Kivii.Finances
{
payment.ThrowIfNull("要更新的付款记录不能为空!");
(payment.OffsetKvid != Guid.Empty).ThrowIfTrue("此到账已作废 无法重新计算开票金额");
(payment.Type != PaymentType.Bank).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 => p.Type == PaymentType.Split && p.ParentKvid == payment.Kvid && p.OffsetKvid == Guid.Empty);
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
......@@ -500,6 +598,7 @@ namespace Kivii.Finances
payment.AmountInvoice = amountInvoiced;
payment.AddOnlyProperties(o => o.AmountInvoice);
conn.UpdateOnly(payment);
if (parentPayment != null) parentPayment.RecalculateAmountSplit(conn);
trans?.Commit();
return payment;
}
......@@ -509,5 +608,115 @@ namespace Kivii.Finances
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;
}
}
}
}
......@@ -278,7 +278,7 @@ namespace Kivii.Finances.Transforms
var existPayments = conn.SelectByIds<Payment>(Payments.ConvertAll(o => o.Kvid));
existPayments.ThrowIfNullOrEmpty("未找到指定的到账信息!");
(existPayments.Count != Payments.Count).ThrowIfTrue("指定的到账信息与查询到的到账信息不匹配!");
existPayments.Exists(o => o.Type != PaymentType.Bank && o.Type != PaymentType.AliPay && o.Type != PaymentType.Cash && o.Type != PaymentType.Pos && o.Type != PaymentType.Split && o.Type != PaymentType.WeChat).ThrowIfTrue("存在不正确的到账类型");
existPayments.Exists(o => o.Type != PaymentType.Bank && o.Type != PaymentType.AliPay && o.Type != PaymentType.Cash && o.Type != PaymentType.Pos && o.Type != PaymentType.Split && o.Type != PaymentType.Assign && o.Type != PaymentType.WeChat).ThrowIfTrue("存在不正确的到账类型");
foreach (var item in existPayments)
{
var payment = Payments.FirstOrDefault(o => o.Kvid == item.Kvid);
......@@ -376,8 +376,8 @@ namespace Kivii.Finances.Transforms
{
var correlatedInvoices = insertInvoices.Correlating(preCorrelatingPayments);
insertInvoices.AddRange(correlatedInvoices);
var currentRootKvids = preCorrelatingPayments.Where(o => o.Type == PaymentType.Split).ToList().ConvertAll(p => p.RootKvid);
if (!currentRootKvids.IsNullOrEmpty()) parentPayments = conn.Select<Payment>(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Kvid, currentRootKvids));
var currentParentKvids = preCorrelatingPayments.Where(o => o.Type == PaymentType.Split || o.Type == PaymentType.Assign).ToList().ConvertAll(p => p.ParentKvid);
if (!currentParentKvids.IsNullOrEmpty()) parentPayments = conn.Select<Payment>(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Kvid, currentParentKvids));
}
var rtns = new RestfulUpdateResponse<Invoice>();
rtns.Results = new List<Invoice>();
......
......@@ -97,11 +97,34 @@ namespace Kivii.Finances.Transforms
var paymentKvidsDistinct = PaymentKvids.Distinct().ToList();
var payments = conn.Select<Payment>(o => Sql.In(o.Kvid, paymentKvidsDistinct));
(payments.Count <= 0 || payments.Count != paymentKvidsDistinct.Count).ThrowIfTrue("收款信息与所选项目不一致!");
(payments.Exists(o => o.Type != PaymentType.Bank && o.Type != PaymentType.Split && o.Type != PaymentType.AliPay && o.Type != PaymentType.Pos && o.Type != PaymentType.WeChat && o.Type != PaymentType.Cash)).ThrowIfTrue("请选择正确的收款信息进行申请!");
(payments.Exists(o => o.Type != PaymentType.Bank && o.Type != PaymentType.Assign && o.Type != PaymentType.Split && o.Type != PaymentType.AliPay && o.Type != PaymentType.Pos && o.Type != PaymentType.WeChat && o.Type != PaymentType.Cash)).ThrowIfTrue("请选择正确的收款信息进行申请!");
(payments.Exists(o => o.Amount <= o.AmountInvoice)).ThrowIfTrue("存在已开票的到账!无法重复申请!");
if (Item.Amount != payments.Sum(o => o.Amount - o.AmountInvoice)) throw new Exception("申请金额与所选到账金额不一致!");
(conn.Exists<InvoiceApply>(o => o.OperateType == InvoiceApplyType.Related && o.OffsetKvid == Guid.Empty && Sql.In(o.BizKvid, payments.ConvertAll(p => p.Kvid)))).ThrowIfTrue("已有申请开票中的到账!");
foreach (var item in payments)
{
if (item.Type == PaymentType.Split)
{
if (payments.Exists(o => o.ParentKvid == item.Kvid && o.Type == PaymentType.Assign)) throw new Exception("存在同一笔流水重复选择!");
}
if (item.Type == PaymentType.Assign)
{
if (payments.Exists(o => o.Kvid == item.ParentKvid && o.Type == PaymentType.Split)) throw new Exception("存在同一笔流水重复选择!");
}
}
var paymentKvids = payments.ConvertAll(o => o.Kvid);
var splitPayments = payments.Where(o => o.Type == PaymentType.Split).ToList();
if (!splitPayments.IsNullOrEmpty())//如果是Split申请开票则要查查看子集Assgin是否也有正在申请中的,不然申请时可能重复申请开票
{
var existAssignPayments = conn.Select<Payment>(o => o.OffsetKvid == Guid.Empty && o.Type == PaymentType.Assign && Sql.In(o.ParentKvid, splitPayments.ConvertAll(p => p.Kvid)));
if (!existAssignPayments.IsNullOrEmpty()) paymentKvids.AddRange(existAssignPayments.ConvertAll(p => p.Kvid));
}
var assginPayments = payments.Where(o => o.Type == PaymentType.Assign).ToList();
if (!assginPayments.IsNullOrEmpty())//如果是Split申请开票则要查查看子集Assgin是否也有正在申请中的,不然申请时可能重复申请开票
{
var existSplitPayments = conn.Select<Payment>(o => o.OffsetKvid == Guid.Empty && o.Type == PaymentType.Split && Sql.In(o.Kvid, assginPayments.ConvertAll(p => p.ParentKvid)));
if (!existSplitPayments.IsNullOrEmpty()) paymentKvids.AddRange(existSplitPayments.ConvertAll(p => p.Kvid));
}
(conn.Exists<InvoiceApply>(o => o.OperateType == InvoiceApplyType.Related && o.OffsetKvid == Guid.Empty && Sql.In(o.BizKvid, paymentKvids))).ThrowIfTrue("已有申请开票中的到账!");
//(conn.Exists<Invoice>(o => o.OffsetKvid == Guid.Empty && Sql.In(o.BizKvid, payments.ConvertAll(p => p.RootKvid)))).ThrowIfTrue("已有开票的到账!");
var trans = conn.OpenTransaction();
......
......@@ -72,7 +72,7 @@ namespace Kivii.Finances.Transforms
var payment = conn.SingleById<Payment>(payingMethod.Kvid);
payment.ThrowIfNull("所选付款数据不存在!");
(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.Assign && payment.Type != PaymentType.Pos && payment.Type != PaymentType.Cash && payment.Type != PaymentType.AliPay && payment.Type != PaymentType.WeChat) throw new Exception("请选择正确的付款方式!");
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}");
......@@ -95,6 +95,7 @@ namespace Kivii.Finances.Transforms
accountDetail.Insert(conn);
payment.RecalculateAmountUsed(conn);//重新统计到账的使用情况
if (payment.Type == PaymentType.Split) payment.RecalculateAssignAmount(conn);
#region 同步更新泛型Settlement表中数据
foreach (var item in settlements)
{
......@@ -262,10 +263,20 @@ namespace Kivii.Finances.Transforms
payments = conn.SelectByIds<Payment>(paymentKvids);
payments.ThrowIfNullOrEmpty("未找到所选付款数据!");
payments.Exists(o => o.Currency != currency).ThrowIfTrue("存在不相符的货币单位!");
if (payments.Exists(o => o.Type != PaymentType.Split && o.Type != PaymentType.Pos && o.Type != PaymentType.Cash && o.Type != PaymentType.AliPay && o.Type != PaymentType.WeChat)) throw new Exception("请选择正确的付款方式!");
if (payments.Exists(o => o.Type != PaymentType.Split && o.Type != PaymentType.Assign && o.Type != PaymentType.Pos && o.Type != PaymentType.Cash && o.Type != PaymentType.AliPay && o.Type != PaymentType.WeChat)) throw new Exception("请选择正确的付款方式!");
if (payments.Exists(o => (o.Amount - o.AmountUsed) <= 0)) throw new Exception($"所选付款方式余额不足!");
//if (payments.Exists(o => (o.AmountInvoice != o.Amount))) throw new Exception($"所选付款尚未开票!");
foreach (var item in payments)
{
if (item.Type == PaymentType.Split)
{
if (payments.Exists(o => o.ParentKvid == item.Kvid && o.Type == PaymentType.Assign)) throw new Exception("存在同一笔流水重复选择!");
}
if (item.Type == PaymentType.Assign)
{
if (payments.Exists(o => o.Kvid == item.ParentKvid && o.Type == PaymentType.Split)) throw new Exception("存在同一笔流水重复选择!");
}
}
}
List<Account> accounts = null;
if (!accountKvids.IsNullOrEmpty())
......@@ -351,6 +362,7 @@ namespace Kivii.Finances.Transforms
foreach (var item in payments)
{
item.RecalculateAmountUsed(conn);
if (item.Type == PaymentType.Split) item.RecalculateAssignAmount(conn);
}
#region 同步更新泛型Settlement表中数据
foreach (var item in settlements)
......
......@@ -39,7 +39,7 @@ namespace Kivii.Finances.Transforms
var payment = conn.SingleById<Payment>(PaymentKvid);
if (payment == null) throw new Exception("不存在的收款信息!");
if (payment.OffsetKvid != Guid.Empty) throw new Exception("此收款已冲账!");
if (payment.Type != PaymentType.UnBiz && payment.Type != PaymentType.Refund && payment.Type != PaymentType.Split && payment.Type != PaymentType.Cash && payment.Type != PaymentType.AliPay && payment.Type != PaymentType.WeChat && payment.Type != PaymentType.Pos) throw new Exception("不支持收款充值操作类型!");
if (payment.Type != PaymentType.UnBiz && payment.Type != PaymentType.Refund && payment.Type != PaymentType.Split && payment.Type != PaymentType.Assign && payment.Type != PaymentType.Cash && payment.Type != PaymentType.AliPay && payment.Type != PaymentType.WeChat && payment.Type != PaymentType.Pos) throw new Exception("不支持收款充值操作类型!");
if (payment.Amount - payment.AmountUsed < Amount) throw new Exception($"此到账可使用金额不足,仅剩:{payment.Amount - payment.AmountUsed}元");
var accountPayee = conn.SingleById<Account>(AccountKvid);
......@@ -90,6 +90,7 @@ namespace Kivii.Finances.Transforms
rtns.Results.Add(transfer);
accountDetails.ForEach(o => o.Insert(conn));
payment.RecalculateAmountUsed(conn);//重新计算AmountUsed!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if (payment.Type == PaymentType.Split) payment.RecalculateAssignAmount(conn);
//if (parentPayment != null) conn.UpdateOnly(parentPayment);
foreach (var item in pays)
{
......
......@@ -11,7 +11,7 @@ namespace Kivii.Finances.Transforms
{
public enum OwnerType
{
Unsupport=0,
Unsupport = 0,
Department = 1,
Organization = 2,
Member = 3
......@@ -27,7 +27,7 @@ namespace Kivii.Finances.Transforms
[ApiMember(Description = "认领类型,默认为Department,Organization,Member")]
public OwnerType OwnerType { get; set; } = OwnerType.Department;
public Guid OwnerKvid { get; set; }
public Guid OwnerKvid { get; set; }
public string OwnerName { get; set; }
......@@ -336,6 +336,7 @@ namespace Kivii.Finances.Transforms
if (payments.Exists(o => o.Type != PaymentType.Split)) throw new Exception("非银行到账不可以认领!");
if (payments.Exists(o => o.OffsetKvid != Guid.Empty)) throw new Exception("已冲销收款不可撤销认领!");
(conn.Exists<InvoiceApply>(o => o.OperateType == InvoiceApplyType.Related && o.OffsetKvid == Guid.Empty && o.AmountInvoice != o.Amount && Sql.In(o.BizKvid, payments.ConvertAll(p => p.Kvid)))).ThrowIfTrue("存在申请开票中的到账,暂无法撤销认领!");
(conn.Exists<Payment>(o => o.OffsetKvid == Guid.Empty && o.Type == PaymentType.Assign && Sql.In(o.ParentKvid, payments.ConvertAll(p => p.Kvid)))).ThrowIfTrue("认领金额存在已经划转,请先撤销划转以继续!");
var rtns = new RestfulExecutionResponse<Payment>();
rtns.Results = new List<Payment>();
//if (payments.Exists(o => o.AmountUsed > 0)) throw new Exception("存在到账已使用,不可撤销认领!");
......@@ -373,7 +374,7 @@ namespace Kivii.Finances.Transforms
{
var parent = parents.FirstOrDefault(o => o.Kvid == split.ParentKvid);
if (parent == null) continue;
var offset = split.Offset($"认领撤销:{Remark}");
offsets.Add(offset);
splitOffsets.Add(split);
......@@ -495,7 +496,7 @@ namespace Kivii.Finances.Transforms
rtns.Results = new List<Payment>();
var updateLamda = conn.From<Payment>();
updateLamda = updateLamda.Update(o => new { o.OwnerKvid, o.OwnerName});
updateLamda = updateLamda.Update(o => new { o.OwnerKvid, o.OwnerName });
updateLamda = updateLamda.Where(o => Sql.In(o.Kvid, paymentKvids));
conn.UpdateOnly(new Payment { OwnerKvid = Guid.Empty, OwnerName = string.Empty }, updateLamda);
foreach (var item in payments)
......@@ -507,4 +508,275 @@ namespace Kivii.Finances.Transforms
return rtns;
}
}
[Api(Description = "认领划转")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class PaymentAssign : RestfulExecution<Payment>
{
[ApiMember(Description = "划转金额")]
public decimal Amount { get; set; }
[ApiMember(Description = "所属类型,默认为Department,Organization,Member")]
public OwnerType OwnerType { get; set; } = OwnerType.Department;
public Guid OwnerKvid { get; set; }
public string OwnerName { get; set; }
public Guid Kvid { get; set; }
public string Remark { get; set; }
public override object OnExecution(IRequest req, IResponse res)
{
if (Kvid == Guid.Empty) throw new Exception("请选择要划转的收款!");
var conn = KiviiContext.GetOpenedDbConnection<Payment>();
var payment = conn.SingleById<Payment>(Kvid);
if (payment == null) throw new Exception("收款不存在!");
if (payment.Type != PaymentType.Split) throw new Exception("请选择正确类型!");
if (payment.OffsetKvid != Guid.Empty) throw new Exception("已冲销收款不可划转!");
if (Amount <= 0) throw new Exception("金额不能为小于0!");
if (payment.AmountSplited == payment.Amount) throw new Exception("无剩余收款可划转!");
if (payment.AmountSplited + Amount > payment.Amount) throw new Exception("划转金额超出范围!");
var amountAssign = conn.Scalar<Payment, decimal>(o => Sql.Sum(o.Amount), p => p.ParentKvid == payment.Kvid && p.Type == PaymentType.Assign && p.OffsetKvid == Guid.Empty);
if (amountAssign + Amount > payment.Amount) throw new Exception("划转金额超出范围!");
var ownerKvid = Guid.Empty;
var ownerName = string.Empty;
switch (OwnerType)
{
case OwnerType.Organization:
{
ownerKvid = KiviiContext.CurrentMember.OrganizationKvid;
ownerName = KiviiContext.CurrentMember.OrganizationName;
break;
}
case OwnerType.Member:
{
ownerKvid = KiviiContext.CurrentMember.Kvid;
ownerName = KiviiContext.CurrentMember.FullName;
break;
}
default:
{
ownerKvid = KiviiContext.CurrentMember.DepartmentKvid;
ownerName = KiviiContext.CurrentMember.DepartmentName;
break;
}
}
if (OwnerKvid != Guid.Empty)
{
ownerKvid = OwnerKvid;
ownerName = OwnerName;
}
if (payment.OwnerKvid == ownerKvid) throw new Exception("不可划转至同部门!");
var assign = payment.BizAssign(Amount, Remark, ownerKvid, ownerName, conn);
var rtns = new RestfulExecutionResponse<Payment>();
rtns.Results = new List<Payment>();
//开启事务进行数据库操作
var trans = conn.OpenTransaction();
try
{
if (assign != null)
{
conn.Insert(assign);
rtns.Results.Add(assign);
}
payment.RecalculateAmountSplit(conn);
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
throw ex;
}
return rtns;
}
}
[Api(Description = "认领批量划转")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class PaymentMultiAssign : RestfulExecution<Payment>
{
[ApiMember(Description = "所属类型,默认为Department,Organization,Member")]
public OwnerType OwnerType { get; set; } = OwnerType.Department;
public Guid OwnerKvid { get; set; }
public string OwnerName { get; set; }
public List<Guid> Kvids { get; set; }
public string Remark { get; set; }
public override object OnExecution(IRequest req, IResponse res)
{
if (Kvids.IsNullOrEmpty()) throw new Exception("请选择要划转的收款!");
var conn = KiviiContext.GetOpenedDbConnection<Payment>();
var payments = conn.SelectByIds<Payment>(Kvids);
if (payments == null) throw new Exception("收款不存在!");
if (payments.Exists(o => o.Type != PaymentType.Split)) throw new Exception("请选择正确类型!");
if (payments.Exists(o => o.OffsetKvid != Guid.Empty)) throw new Exception("已冲销收款不可划转!");
if (payments.Exists(o => o.AmountSplited >= o.Amount)) throw new Exception("无剩余收款可划转!");
var ownerKvid = Guid.Empty;
var ownerName = string.Empty;
switch (OwnerType)
{
case OwnerType.Department:
{
ownerKvid = KiviiContext.CurrentMember.DepartmentKvid;
ownerName = KiviiContext.CurrentMember.DepartmentName;
break;
}
case OwnerType.Organization:
{
ownerKvid = KiviiContext.CurrentMember.OrganizationKvid;
ownerName = KiviiContext.CurrentMember.OrganizationName;
break;
}
case OwnerType.Member:
{
ownerKvid = KiviiContext.CurrentMember.Kvid;
ownerName = KiviiContext.CurrentMember.FullName;
break;
}
}
if (OwnerKvid != Guid.Empty)
{
ownerKvid = OwnerKvid;
ownerName = OwnerName;
}
if (payments.Exists(o => o.OwnerKvid == ownerKvid)) throw new Exception("不可划转至同部门!");
var spliteds = new List<Payment>();
var assigns = new List<Payment>();
foreach (var payment in payments)
{
var amount = payment.Amount - payment.AmountSplited;
if (amount <= 0) continue;
var assignPayment = payment.BizAssign(amount, Remark, ownerKvid, ownerName, conn);
assigns.Add(assignPayment);
spliteds.Add(payment);
}
var rtns = new RestfulExecutionResponse<Payment>();
rtns.Results = new List<Payment>();
#region 启用缓存,将当前人创建批次数据存入,处理完毕或者接口报错后清除,确保不会重复创建
var cache = KiviiContext.GetCacheClient();
var cacheKey = KiviiContext.GetUrnKey($"{this.GetType().FullName}_Request_{KiviiContext.CurrentMember.FullName}_{KiviiContext.CurrentMember.Kvid}");
var cacheValue = cache.Get<List<string>>(cacheKey);
if (!cacheValue.IsNullOrEmpty())
{
throw new Exception($"当前正在处理中,剩余{cacheValue.Count}条,请稍后再试!");
}
var caches = new List<string>();
caches.AddRange(assigns.ConvertAll(o => o.SerialNumber));
cache.Set(cacheKey, caches, TimeSpan.FromMinutes(5));
#endregion
//开启事务进行数据库操作
var trans = conn.OpenTransaction();
try
{
foreach (var assign in assigns)
{
conn.Insert(assign);
rtns.Results.Add(assign);
caches.Remove(assign.SerialNumber);
cache.Replace(cacheKey, caches);
}
foreach (var item in spliteds)
{
item.RecalculateAmountSplit(conn);
}
trans.Commit();
cache.Remove(cacheKey);
}
catch (Exception ex)
{
trans.Rollback();
cache.Remove(cacheKey);
throw ex;
}
return rtns;
}
}
[Api(Description = "划转撤销")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class PaymentAssignCancel : RestfulExecution<Payment>
{
public List<Guid> Kvids { get; set; }
public string Remark { get; set; }
public override object OnExecution(IRequest req, IResponse res)
{
if (Kvids.IsNullOrEmpty()) throw new Exception("请选择要撤销划转的收款!");
var conn = KiviiContext.GetOpenedDbConnection<Payment>();
var payments = conn.SelectByIds<Payment>(Kvids);
if (payments == null) throw new Exception("收款不存在!");
if (payments.Exists(o => o.Type != PaymentType.Assign)) throw new Exception("请选择正确类型!");
if (payments.Exists(o => o.OffsetKvid != Guid.Empty)) throw new Exception("已冲销收款不可撤销划转!");
(conn.Exists<InvoiceApply>(o => o.OperateType == InvoiceApplyType.Related && o.OffsetKvid == Guid.Empty && o.AmountInvoice != o.Amount && Sql.In(o.BizKvid, payments.ConvertAll(p => p.Kvid)))).ThrowIfTrue("存在申请开票中的到账,暂无法撤销认领!");
conn.Exists<Payment>(o => o.OffsetKvid == Guid.Empty && o.Amount > 0 && Sql.In(o.Type, PaymentType.Transfer, PaymentType.DynamicPay) && Sql.In(o.ParentKvid, payments.ConvertAll(p => p.Kvid))).ThrowIfTrue("存在已收款登记或账户充值的划转!");
var rtns = new RestfulExecutionResponse<Payment>();
rtns.Results = new List<Payment>();
var parentKvids = payments.ConvertAll(o => o.ParentKvid).Distinct().ToList();
var parentSplits = conn.SelectByIds<Payment>(parentKvids);
var parentUpdates = new List<Payment>();
var assignOffsets = new List<Payment>();
var offsets = new List<Payment>();
foreach (var assignPayment in payments)
{
var parentSplit = parentSplits.FirstOrDefault(o => o.Kvid == assignPayment.ParentKvid);
if (parentSplit == null) continue;
var offset = assignPayment.Offset($"划转撤销:{Remark}");
offsets.Add(offset);
assignOffsets.Add(assignPayment);
parentUpdates.Add(parentSplit);
}
var trans = conn.OpenTransaction();
try
{
foreach (var item in assignOffsets)
{
conn.UpdateOnly(item);
rtns.Results.Add(item);
}
foreach (var item in offsets)
{
conn.Insert(item);
}
foreach (var item in parentUpdates)
{
item.RecalculateAmountSplit(conn);
}
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
throw ex;
}
return rtns;
}
}
}
......@@ -3,6 +3,7 @@ using Kivii.Linq;
using Kivii.Web;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
......@@ -55,7 +56,7 @@ namespace Kivii.Finances.Transforms
var sqlExpress = autoQuery.CreateQuery(Request, conn, request, dynamicParams);
sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.AliPay, PaymentType.WeChat, PaymentType.Bank, PaymentType.Cash, PaymentType.Pos));
if (OwnerType == OwnerType.Organization) sqlExpress.And(o => o.OwnerKvid == KiviiContext.CurrentMember.OrganizationKvid || o.OwnerKvid == Guid.Empty);
if (OwnerType == OwnerType.Department) sqlExpress.And(o => Sql.In(o.OwnerKvid,KiviiContext.CurrentMember.DepartmentKvids) || o.OwnerKvid == Guid.Empty);
if (OwnerType == OwnerType.Department) sqlExpress.And(o => Sql.In(o.OwnerKvid, KiviiContext.CurrentMember.DepartmentKvids) || o.OwnerKvid == Guid.Empty);
if (OwnerType == OwnerType.Member) sqlExpress.And(o => o.OwnerKvid == KiviiContext.CurrentMember.Kvid || o.OwnerKvid == Guid.Empty);
if (IsSplit != null)
{
......@@ -112,7 +113,7 @@ namespace Kivii.Finances.Transforms
var request = new RestfulQuery<Payment>();
request = request.PopulateWith(this);
var sqlExpress = autoQuery.CreateQuery(Request, conn, request, dynamicParams);
sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.AliPay, PaymentType.WeChat, PaymentType.Split, PaymentType.Cash, PaymentType.Pos));
sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.AliPay, PaymentType.WeChat, PaymentType.Split, PaymentType.Assign, PaymentType.Cash, PaymentType.Pos));
sqlExpress.And(o => o.AmountUsed == 0 || o.AmountUsed < o.Amount);
var queryAccount = conn.From<Account>();
queryAccount.Where(o => o.OrganizationKvid == KiviiContext.CurrentMember.OrganizationKvid && Sql.In(o.Type, AccountType.Balance, AccountType.Cash, AccountType.Pos));
......@@ -158,7 +159,7 @@ namespace Kivii.Finances.Transforms
var request = new RestfulQuery<Payment>();
request = request.PopulateWith(this);
var sqlExpress = autoQuery.CreateQuery(Request, conn, request, dynamicParams);
sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.AliPay, PaymentType.WeChat, PaymentType.Cash, PaymentType.Pos, PaymentType.Split));
sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.AliPay, PaymentType.WeChat, PaymentType.Cash, PaymentType.Pos, PaymentType.Assign, PaymentType.Split));
sqlExpress.And(o => o.AmountInvoice <= 0 || o.AmountInvoice < o.Amount);
var queryInvoiceApplyRelations = conn.From<InvoiceApply>();
......@@ -203,7 +204,7 @@ namespace Kivii.Finances.Transforms
var request = new RestfulQuery<Payment>();
request = request.PopulateWith(this);
var sqlExpress = autoQuery.CreateQuery(Request, conn, request, dynamicParams);
sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.AliPay, PaymentType.WeChat, PaymentType.Split, PaymentType.Cash, PaymentType.Pos) && o.AmountInvoice < o.Amount);
sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.AliPay, PaymentType.WeChat, PaymentType.Split, PaymentType.Assign, PaymentType.Cash, PaymentType.Pos) && o.AmountInvoice < o.Amount);
var queryAccount = conn.From<Account>();
queryAccount.Where(o => o.OrganizationKvid == KiviiContext.CurrentMember.OrganizationKvid && Sql.In(o.Type, AccountType.Balance, AccountType.Cash, AccountType.Pos));
......@@ -279,6 +280,8 @@ namespace Kivii.Finances.Transforms
public OwnerType OwnerType { get; set; } = OwnerType.Unsupport;
public bool? IsBiz { get; set; }//Split,Pos,Cash,WeChat..
public bool? IsAssign { get; set; }//是否被划转
public override object OnExecution(IRequest req, IResponse res)
{
var conn = KiviiContext.GetOpenedDbConnection<Payment>();
......@@ -291,9 +294,14 @@ namespace Kivii.Finances.Transforms
if (OwnerType == OwnerType.Organization) sqlExpress.And(o => o.OwnerKvid == KiviiContext.CurrentMember.OrganizationKvid || o.OwnerKvid == Guid.Empty);
if (OwnerType == OwnerType.Department) sqlExpress.And(o => Sql.In(o.OwnerKvid, KiviiContext.CurrentMember.DepartmentKvids) || o.OwnerKvid == Guid.Empty);
if (OwnerType == OwnerType.Member) sqlExpress.And(o => o.OwnerKvid == KiviiContext.CurrentMember.Kvid || o.OwnerKvid == Guid.Empty);
if (IsBiz == null) sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.WeChat, PaymentType.Cash, PaymentType.AliPay, PaymentType.Pos, PaymentType.Split, PaymentType.Refund, PaymentType.UnBiz));
else if (IsBiz.Value) sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.WeChat, PaymentType.Cash, PaymentType.AliPay, PaymentType.Pos, PaymentType.Split));
if (IsBiz == null) sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.WeChat, PaymentType.Cash, PaymentType.AliPay, PaymentType.Pos, PaymentType.Split, PaymentType.Assign, PaymentType.Refund, PaymentType.UnBiz));
else if (IsBiz.Value) sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.WeChat, PaymentType.Cash, PaymentType.AliPay, PaymentType.Pos, PaymentType.Split, PaymentType.Assign));
else sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.Refund, PaymentType.UnBiz));
if (IsAssign != null)
{
if (IsAssign.Value) sqlExpress.And(o => o.AmountSplited > 0 && o.Type != PaymentType.Assign);
else sqlExpress.And(o => o.AmountSplited == 0 && o.Type != PaymentType.Assign);
}
var rtns = autoQuery.Execute(Request, conn, request, sqlExpress);
return rtns;
}
......@@ -322,6 +330,9 @@ namespace Kivii.Finances.Transforms
#endregion
public Guid CurrentKvid { get; set; }
public bool IncludeAssign { get; set; }//查看当前使用情况时是否要包含当前项目子项的使用情况(如果存在的话)
public override object OnExecution(IRequest req, IResponse res)
{
var conn = KiviiContext.GetOpenedDbConnection<Payment>();
......@@ -332,8 +343,20 @@ namespace Kivii.Finances.Transforms
request = request.PopulateWith(this);
var sqlExpress = autoQuery.CreateQuery(Request, conn, request, dynamicParams);
sqlExpress.Where(o => Sql.In(o.Type, PaymentType.Transfer, PaymentType.DynamicPay));
if (IncludeAssign && CurrentKvid != Guid.Empty)
{
var queryAssign = conn.From<Payment>();
queryAssign.Where(o => o.ParentKvid == CurrentKvid && o.OffsetKvid == Guid.Empty && o.Type == PaymentType.Assign);
queryAssign.Select(o => o.Kvid);
var kvids = conn.Select<Guid>(queryAssign);
if (kvids.IsNullOrEmpty()) kvids = new List<Guid>();
kvids.Add(CurrentKvid);
sqlExpress.And(o => Sql.In(o.ParentKvid, kvids));
}
var rtns = autoQuery.Execute(Request, conn, request, sqlExpress);
return rtns;
}
}
}
......@@ -26,7 +26,7 @@ namespace Kivii.Finances.Transforms
var settlements = connF.Select<Settlement>(o => Sql.In(o.Kvid, Kvids));
(settlements.Count != Kvids.Count).ThrowIfTrue("所选结算和查询结果不一致!");
settlements.Exists(o => o.OffsetKvid != Guid.Empty).ThrowIfTrue("存在已作废结算,无法重复作废");
settlements.Exists(o => o.AmountPayment <= 0).ThrowIfTrue("作废错误:作废的结算中包含未收款的结算!");
//settlements.Exists(o => o.AmountPayment <= 0).ThrowIfTrue("作废错误:作废的结算中包含未收款的结算!");
var policyRecords = connF.Select<PolicyRecord>(o => Sql.In(o.SettlementKvid, Kvids));
//connF.Exists<Settlement>(o => o.AmountPayment != o.Amount && Sql.In(o.Kvid, Kvids)).ThrowIfTrue("作废错误:作废的结算中包含未收款的结算!");
////如果泛型类型不是Settlement本身就需要判断
......
......@@ -97,6 +97,7 @@ namespace Kivii.Finances.Transforms
public DateTime EndTime { get; set; }
public bool IsOperated { get; set; }//如果True则查询OperateTime否则默认CreateTime
//public bool IsTest { get; set; }
public override object OnExecution(IRequest req, IResponse res)
......@@ -119,7 +120,8 @@ namespace Kivii.Finances.Transforms
var sqlExpress = conn.From<Payment>();
sqlExpress.Where(o => o.OffsetKvid == Guid.Empty && Sql.In(o.Type, PaymentType.WeChat, PaymentType.Cash, PaymentType.AliPay, PaymentType.Pos, PaymentType.Split));
sqlExpress.And(o => o.CreateTime >= beginTime && o.CreateTime < endTime);
if (IsOperated) sqlExpress.And(o => o.OperateTime >= beginTime && o.OperateTime < endTime);
else sqlExpress.And(o => o.CreateTime >= beginTime && o.CreateTime < endTime);
if (!OwnerKvids.IsNullOrEmpty()) sqlExpress.And(o => Sql.In(o.OwnerKvid, OwnerKvids));
sqlExpress.And(o => (Sql.In(o.PayerAccountKvid, queryAccount)));
sqlExpress.OrderBy(o => o.OwnerName);
......
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