Commit 02452643 by 陶然

事务添加判断

parent d2923001
......@@ -4,3 +4,5 @@
/Src/obj/Debug
/Src/bin/Debug
/.vs
/Src/obj/Release
......@@ -80,6 +80,7 @@ namespace Kivii.Finances
relationInvoice.AmountUntaxed = Math.Round(relationInvoice.Amount / (1 + relationInvoice.TaxRate), 2);
//税额
relationInvoice.AmountTax = relationInvoice.Amount - relationInvoice.AmountUntaxed;
relationInvoice.Summary = payment.PayerName;
rtns.Add(relationInvoice);
#endregion
......
using Kivii.Finances.Entities;
using Kivii.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Kivii.Finances
{
......@@ -58,7 +55,8 @@ namespace Kivii.Finances
rtns.AmountSplited = 0;
rtns.AmountUsed = amount;
rtns.Summary = "收款登记";
rtns.OperateTime = DateTime.Now;
rtns.OperateTime = payment.OperateTime;
//rtns.OperateTime = DateTime.Now;
rtns.OperatorName = KiviiContext.CurrentMember.FullName;
rtns.OperatorKvid = KiviiContext.CurrentMember.Kvid;
rtns.Currency = payment.Currency;
......@@ -104,7 +102,8 @@ namespace Kivii.Finances
pay.ToKvid = accountPayee.Kvid;
pay.ToType = PayType.Account;
pay.Type = "DynamicPay";
pay.PayedTime = DateTime.Now;
pay.Summary = settlement.Type;
pay.PayedTime = rtns.OperateTime;
pay.Amount = currentAmount;
pay.AmountPayment = currentAmount;
pay.AmountDiscount = 0;
......@@ -117,6 +116,13 @@ namespace Kivii.Finances
settlement.AmountPayment += currentAmount;
settlement.AddOnlyProperties(o => o.AmountPayment);
settlement.PayedTime = rtns.OperateTime;
settlement.AddOnlyProperties(o => o.PayedTime);
if (settlement.Metadata.IsNullOrEmpty()) settlement.Metadata = new Dictionary<string, string>();
settlement.Metadata["PayedType"] = typeof(Payment).FullName;
settlement.Metadata["PayedName"] = payment.PayerName;
settlement.Metadata["PayedSerialNumber"] = payment.SerialNumber;
settlement.AddOnlyProperties(o => o.Metadata);
amount -= currentAmount;
}
......@@ -210,6 +216,7 @@ namespace Kivii.Finances
pay.ToKvid = accountPayee.Kvid;
pay.ToType = PayType.Account;
pay.Type = "DynamicPay";
pay.Summary = settlement.Type;
pay.PayedTime = DateTime.Now;
pay.Amount = currentAmount;
if (accountPayer.Type == AccountType.Discount)//要是 折扣账户 则记录到AmountDiscount
......@@ -231,6 +238,13 @@ namespace Kivii.Finances
settlement.AmountPayment += currentAmount;
settlement.AddOnlyProperties(o => o.AmountPayment);
settlement.PayedTime = DateTime.Now;
settlement.AddOnlyProperties(o => o.PayedTime);
if (settlement.Metadata.IsNullOrEmpty()) settlement.Metadata = new Dictionary<string, string>();
settlement.Metadata["PayedType"] = typeof(Account).FullName;
settlement.Metadata["PayedName"] = accountPayer.Name;
settlement.Metadata["PayedSerialNumber"] = accountPayer.SerialNumber;
settlement.AddOnlyProperties(o => o.Metadata);
amount -= currentAmount;
}
......
......@@ -31,14 +31,14 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Kivii.Common.V4.5, Version=5.6.2022.4060, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Kivii.Common.5.6.2022.4060\lib\net45\Kivii.Common.V4.5.dll</HintPath>
<Reference Include="Kivii.Common.V4.5, Version=5.6.2022.4110, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Kivii.Common.5.6.2022.4110\lib\net45\Kivii.Common.V4.5.dll</HintPath>
</Reference>
<Reference Include="Kivii.Core.V4.5, Version=5.6.2022.4050, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Kivii.Core.5.6.2022.4050\lib\net45\Kivii.Core.V4.5.dll</HintPath>
<Reference Include="Kivii.Core.V4.5, Version=5.6.2022.4110, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Kivii.Core.5.6.2022.4110\lib\net45\Kivii.Core.V4.5.dll</HintPath>
</Reference>
<Reference Include="Kivii.Linq.V4.5, Version=5.6.2022.4100, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Kivii.Linq.5.6.2022.4100\lib\net45\Kivii.Linq.V4.5.dll</HintPath>
<Reference Include="Kivii.Linq.V4.5, Version=5.6.2022.4120, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Kivii.Linq.5.6.2022.4120\lib\net45\Kivii.Linq.V4.5.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
......
......@@ -26,13 +26,17 @@ namespace Kivii.Finances.Transforms
//if (Item.Type == AccountType.WeChat && dbConnection.Exists<Account>(o => o.OwnerKvid == Item.OwnerKvid && o.Type == AccountType.WeChat && o.OrganizationKvid == KiviiContext.CurrentMember.OrganizationKvid)) throw new Exception("当前组织已存在微信账户!");
//if (Item.Type == AccountType.AliPay && dbConnection.Exists<Account>(o => o.OwnerKvid == Item.OwnerKvid && o.Type == AccountType.AliPay && o.OrganizationKvid == KiviiContext.CurrentMember.OrganizationKvid)) throw new Exception("当前组织已存在支付宝账户!");
//if (Item.Type == AccountType.Bank && dbConnection.Exists<Account>(o => o.OwnerKvid == Item.OwnerKvid && o.Type == AccountType.Bank && o.OrganizationKvid == KiviiContext.CurrentMember.OrganizationKvid)) throw new Exception("当前组织已存在银行账户!");
if (dbConnection is LinqConnection && (dbConnection as LinqConnection).DbTransaction == null)
{
_trans = dbConnection.OpenTransaction();
}
return base.OnPreRestfulCreate(req, res, dbConnection, rtns);
}
public override bool OnPostRestfulCreate(IRequest req, IResponse res, IDbConnection dbConnection, IRestfulCreateResponse<Account> rtns)
{
try
{
//新建开户记录
var accountDetail = new AccountDetail();
accountDetail.AccountKvid = Item.Kvid;
......@@ -59,9 +63,19 @@ namespace Kivii.Finances.Transforms
accountDetail.Remark = "开户";
dbConnection.Insert(accountDetail);
_trans.Commit();
_trans?.Commit();
return base.OnPostRestfulCreate(req, res, dbConnection, rtns);
}
catch (Exception ex)
{
_trans?.Rollback();
throw ex;
}
finally
{
_trans?.Dispose();
}
}
}
[Api(Description = "账户查询")]
......
......@@ -121,16 +121,16 @@ namespace Kivii.Finances.Transforms
}
[RequiresAnyRole(SystemRoles.Everyone)]
public class BillDelete: RestfulDelete<Bill>
public class BillDelete : RestfulDelete<Bill>
{
IDbTransaction _trans = null;
public override bool OnPreRestfulDelete(IRequest req, IResponse res, IDbConnection dbConnection, IRestfulDeleteResponse<Bill> rtns)
{
dbConnection.Exists<Bill>(o => Sql.In(o.Kvid, Kvids) && o.AmountPayment == o.Amount).ThrowIfTrue("此账单已归档付款登记,无法删除");
//if (dbConnection is LinqConnection && (dbConnection as LinqConnection).DbTransaction == null)
//{
if (dbConnection is LinqConnection && (dbConnection as LinqConnection).DbTransaction == null)
{
_trans = dbConnection.OpenTransaction();
//}
}
return base.OnPreRestfulDelete(req, res, dbConnection, rtns);
}
......@@ -142,13 +142,17 @@ namespace Kivii.Finances.Transforms
dbConnection.UpdateOnly<BillDetail>(new BillDetail { Status = -1 }, deleteBillDetails);
_trans?.Commit();
return base.OnPostRestfulDelete(req, res, dbConnection, rtns);
}
catch (Exception ex)
{
_trans?.Rollback();
throw ex;
}
return base.OnPostRestfulDelete(req, res, dbConnection, rtns);
finally
{
_trans?.Dispose();
}
}
}
......
......@@ -145,7 +145,8 @@ namespace Kivii.Finances.Transforms
(Payments.Sum(o => o.Amount) != Items.Sum(o => o.Amount)).ThrowIfTrue("到账开票金额和发票金额不一致!");
}
var conn = KiviiContext.GetOpenedDbConnection<Invoice>();
(conn.Exists<Invoice>(o => Sql.In(o.SerialNumber, Items.ConvertAll(p => p.SerialNumber)))).ThrowIfTrue("存在重复录入的发票信息");
var exists = conn.Select<Invoice>(o => Sql.In(o.SerialNumber, Items.ConvertAll(p => p.SerialNumber)));
//(conn.Exists<Invoice>(o => Sql.In(o.SerialNumber, Items.ConvertAll(p => p.SerialNumber)))).ThrowIfTrue("存在重复录入的发票信息");
List<Payment> preCorrelatingPayments = new List<Payment>();
List<Payment> parentPayments = new List<Payment>();//也要更新父级的AmountInvoice
......@@ -177,6 +178,8 @@ namespace Kivii.Finances.Transforms
var category = preCorrelatingPayments.IsNullOrEmpty() ? InvoiceApplyType.Debit : InvoiceApplyType.Payment;
foreach (var info in Items)
{
//重复的发票
if (!exists.IsNullOrEmpty() && exists.Exists(o => o.SerialNumber == info.SerialNumber)) continue;
#region 开票成功的情况处理
var invoiceKvid = Guid.NewGuid();
var invoice = new Invoice();
......
......@@ -366,16 +366,36 @@ namespace Kivii.Finances.Transforms
{
var connE = KiviiContext.GetOpenedDbConnection<EntitySettlement<T>>();
#region 合并数据库连接,并启用事务
IDbTransaction tranE = null;
if (connE.ConnectionString == conn.ConnectionString)
IDbTransaction tranE = null, tranF = null;
//if (connE.ConnectionString == connR.ConnectionString)//现在的连接会自动取缓存
if (connE == conn)
{
//两个连接是同一个,缓存生效,不做任何操作
}
else if (connE.ConnectionString == conn.ConnectionString)//连接对象不同,但连接字符串是一样的,因为在本环节中,连接没有被污染,可以关了一个连接
{
connE.Close();
connE = conn;
}
else
if ((connE is LinqConnection) && (connE as LinqConnection).Transaction == null)
{
tranE = connE.OpenTransaction();
}
if ((conn is LinqConnection) && (conn as LinqConnection).Transaction == null)
{
tranF = conn.OpenTransaction();
}
//#region 合并数据库连接,并启用事务
//IDbTransaction tranE = null;
//if (connE.ConnectionString == conn.ConnectionString)
//{
// connE.Close();
// connE = conn;
//}
//else
//{
// tranE = connE.OpenTransaction();
//}
#endregion
var instance = Activator.CreateInstance(typeof(T)) as IEntityHasPayment;
foreach (var item in settlements)
......
......@@ -162,19 +162,40 @@ namespace Kivii.Finances.Transforms
rtns.Results = new List<Settlement>();
var connE = KiviiContext.GetOpenedDbConnection<G>();
#region 合并数据库连接,并启用事务
IDbTransaction tranE = null, tranF = null;
if (connE.ConnectionString == connF.ConnectionString)
//if (connE.ConnectionString == connR.ConnectionString)//现在的连接会自动取缓存
if (connE == connF)
{
connF.Close();
connF = connE;
tranE = connE.OpenTransaction();
//两个连接是同一个,缓存生效,不做任何操作
}
else
else if (connE.ConnectionString == connF.ConnectionString)//连接对象不同,但连接字符串是一样的,因为在本环节中,连接没有被污染,可以关了一个连接
{
connE.Close();
connE = connF;
}
if ((connE is LinqConnection) && (connE as LinqConnection).Transaction == null)
{
tranE = connE.OpenTransaction();
}
if ((connF is LinqConnection) && (connF as LinqConnection).Transaction == null)
{
tranF = connF.OpenTransaction();
}
//#region 合并数据库连接,并启用事务
//IDbTransaction tranE = null, tranF = null;
//if (connE.ConnectionString == connF.ConnectionString)
//{
// connF.Close();
// connF = connE;
// tranE = connE.OpenTransaction();
//}
//else
//{
// tranE = connE.OpenTransaction();
// tranF = connF.OpenTransaction();
//}
#endregion
try
{
......
......@@ -47,17 +47,37 @@ namespace Kivii.Finances.Transforms
#region 合并数据库连接,并启用事务
IDbTransaction tranE = null, tranF = null;
if (connE.ConnectionString == connF.ConnectionString)
//if (connE.ConnectionString == connR.ConnectionString)//现在的连接会自动取缓存
if (connE == connF)
{
connF.Close();
connF = connE;
tranE = connE.OpenTransaction();
//两个连接是同一个,缓存生效,不做任何操作
}
else
else if (connE.ConnectionString == connF.ConnectionString)//连接对象不同,但连接字符串是一样的,因为在本环节中,连接没有被污染,可以关了一个连接
{
connE.Close();
connE = connF;
}
if ((connE is LinqConnection) && (connE as LinqConnection).Transaction == null)
{
tranE = connE.OpenTransaction();
}
if ((connF is LinqConnection) && (connF as LinqConnection).Transaction == null)
{
tranF = connF.OpenTransaction();
}
//#region 合并数据库连接,并启用事务
//IDbTransaction tranE = null, tranF = null;
//if (connE.ConnectionString == connF.ConnectionString)
//{
// connF.Close();
// connF = connE;
// tranE = connE.OpenTransaction();
//}
//else
//{
// tranE = connE.OpenTransaction();
// tranF = connF.OpenTransaction();
//}
#endregion
try
......@@ -157,17 +177,37 @@ namespace Kivii.Finances.Transforms
#region 合并数据库连接,并启用事务
IDbTransaction tranE = null, tranF = null;
if (connE.ConnectionString == connF.ConnectionString)
//if (connE.ConnectionString == connR.ConnectionString)//现在的连接会自动取缓存
if (connE == connF)
{
connF.Close();
connF = connE;
tranE = connE.OpenTransaction();
//两个连接是同一个,缓存生效,不做任何操作
}
else
else if (connE.ConnectionString == connF.ConnectionString)//连接对象不同,但连接字符串是一样的,因为在本环节中,连接没有被污染,可以关了一个连接
{
connE.Close();
connE = connF;
}
if ((connE is LinqConnection) && (connE as LinqConnection).Transaction == null)
{
tranE = connE.OpenTransaction();
}
if ((connF is LinqConnection) && (connF as LinqConnection).Transaction == null)
{
tranF = connF.OpenTransaction();
}
//#region 合并数据库连接,并启用事务
//IDbTransaction tranE = null, tranF = null;
//if (connE.ConnectionString == connF.ConnectionString)
//{
// connF.Close();
// connF = connE;
// tranE = connE.OpenTransaction();
//}
//else
//{
// tranE = connE.OpenTransaction();
// tranF = connF.OpenTransaction();
//}
#endregion
try
......@@ -175,7 +215,7 @@ namespace Kivii.Finances.Transforms
foreach (var item in Items)
{
if (item.OnlyProperties.IsNullOrEmpty()) continue;
item.OnlyProperties.RemoveAll(o => o != "Remark" && o != "Summary");
item.OnlyProperties.RemoveAll(o => o != "Remark" && o != "Summary" && o != "Category");
if (item.OnlyProperties.IsNullOrEmpty()) continue;
connF.UpdateOnly(item);
rtns.Results.Add(item);
......@@ -348,19 +388,40 @@ namespace Kivii.Finances.Transforms
var rtns = new RestfulDeleteResponse<Settlement>();
rtns.Results = new List<Guid>();
#region 合并数据库连接,并启用事务
IDbTransaction tranE = null, tranF = null;
if (connE.ConnectionString == connF.ConnectionString)
//if (connE.ConnectionString == connR.ConnectionString)//现在的连接会自动取缓存
if (connE == connF)
{
connF.Close();
connF = connE;
tranE = connE.OpenTransaction();
//两个连接是同一个,缓存生效,不做任何操作
}
else
else if (connE.ConnectionString == connF.ConnectionString)//连接对象不同,但连接字符串是一样的,因为在本环节中,连接没有被污染,可以关了一个连接
{
connE.Close();
connE = connF;
}
if ((connE is LinqConnection) && (connE as LinqConnection).Transaction == null)
{
tranE = connE.OpenTransaction();
}
if ((connF is LinqConnection) && (connF as LinqConnection).Transaction == null)
{
tranF = connF.OpenTransaction();
}
//#region 合并数据库连接,并启用事务
//IDbTransaction tranE = null, tranF = null;
//if (connE.ConnectionString == connF.ConnectionString)
//{
// connF.Close();
// connF = connE;
// tranE = connE.OpenTransaction();
//}
//else
//{
// tranE = connE.OpenTransaction();
// tranF = connF.OpenTransaction();
//}
#endregion
try
{
......@@ -541,19 +602,40 @@ namespace Kivii.Finances.Transforms
var rtns = new RestfulQueryResponse<Settlement>();
rtns.Results = new List<Settlement>();
#region 合并数据库连接,并启用事务
IDbTransaction tranG = null, tranFins = null;
if (connG.ConnectionString == connFins.ConnectionString)
//if (connE.ConnectionString == connR.ConnectionString)//现在的连接会自动取缓存
if (connG == connFins)
{
connFins.Close();
connFins = connG;
tranG = connG.OpenTransaction();
//两个连接是同一个,缓存生效,不做任何操作
}
else
else if (connG.ConnectionString == connFins.ConnectionString)//连接对象不同,但连接字符串是一样的,因为在本环节中,连接没有被污染,可以关了一个连接
{
connG.Close();
connG = connFins;
}
if ((connG is LinqConnection) && (connG as LinqConnection).Transaction == null)
{
tranG = connG.OpenTransaction();
}
if ((connFins is LinqConnection) && (connFins as LinqConnection).Transaction == null)
{
tranFins = connFins.OpenTransaction();
}
//#region 合并数据库连接,并启用事务
//IDbTransaction tranG = null, tranFins = null;
//if (connG.ConnectionString == connFins.ConnectionString)
//{
// connFins.Close();
// connFins = connG;
// tranG = connG.OpenTransaction();
//}
//else
//{
// tranG = connG.OpenTransaction();
// tranFins = connFins.OpenTransaction();
//}
#endregion
try
......
......@@ -33,9 +33,11 @@ namespace Kivii.Finances.Transforms
{
Depart=0,//部门
Month,//月份
Type//类型
Type,//类型
Payer//付款单位
}
#region 明细统计
[Api(Description = "发票统计")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class InvoiceStatistic : RestfulExecution<Invoice>
......@@ -273,7 +275,9 @@ namespace Kivii.Finances.Transforms
return rtns;
}
}
#endregion
#region 分析
[Api(Description = "到账认领分析")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class PaymentSplitAnalysis : RestfulExecution<Payment>
......@@ -543,4 +547,112 @@ namespace Kivii.Finances.Transforms
return rtns;
}
}
#endregion
#region Group
[Api(Description = "结算统计Group")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class SettlementStatisticGroup : RestfulExecution<Settlement>
{
#region QueryArgs
public virtual int? Skip { get; set; }
public virtual int? Take { get; set; }
public virtual string OrderBy { get; set; }
public string OrderByDesc { get; set; }
public virtual string Include { get; set; }
public virtual string Fields { get; set; }
public string QueryKeys { get; set; }
public string QueryValues { get; set; }
#endregion
public DateTime BeginTime { get; set; }
public DateTime EndTime { get; set; }
public AnalysisType GroupType { get; set; } = AnalysisType.Depart;//按时间,部门,类型分析
public override object OnExecution(IRequest req, IResponse res)
{
int monthDay = DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
if (BeginTime == DateTime.MinValue) BeginTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
if (EndTime == DateTime.MinValue) EndTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, monthDay);
BeginTime = DateTime.Parse(BeginTime.ToString("yyyy-MM-dd"));
EndTime = DateTime.Parse(EndTime.ToString("yyyy-MM-dd"));
if (EndTime < BeginTime) throw new Exception("查询结束日期不可小于开始日期!");
var conn = KiviiContext.GetOpenedDbConnection<Settlement>();
var dynamicParams = Request.GetRequestParams();
var autoQuery = Request.TryResolve<IAutoQueryDb>();
autoQuery.IncludeTotal = true;
var request = new RestfulQuery<Settlement>();
request = request.PopulateWith(this);
var sqlExpress = autoQuery.CreateQuery(Request, conn, request, dynamicParams);
sqlExpress.Where(o => o.OperateTime >= BeginTime && o.OperateTime < EndTime);
sqlExpress.Select(o => new { o.OwnerKvid, o.OwnerName, o.PayerKvid, o.PayerName, o.Type, o.Category, o.AmountPlan, o.Amount, o.AmountPayment, o.OperateTime, o.CreateTime });
var results = conn.Select(sqlExpress);
var rtns = new StatisticResponse<Settlement>();
if (results.IsNullOrEmpty()) return rtns;
rtns.Results = new List<Settlement>();
foreach (var item in results)
{
item.Summary = item.CreateTime.ToString("yyyy-MM");
}
if (GroupType == AnalysisType.Depart)
{
var group = results.GroupBy(o => o.OwnerName);
foreach (var kv in group)
{
var rtn = new Settlement();
rtn.Summary = kv.Key;
rtn.Amount = kv.Sum(o => o.Amount);
rtn.AmountPayment = kv.Sum(o => o.AmountPayment);
rtn.AmountPlan = kv.Sum(o => o.AmountPlan);
rtn.Status = kv.Count();
rtns.Results.Add(rtn);
}
}
else if (GroupType == AnalysisType.Payer)
{
var group = results.GroupBy(o => o.PayerName);
foreach (var kv in group)
{
var rtn = new Settlement();
rtn.Summary = kv.Key;
rtn.Amount = kv.Sum(o => o.Amount);
rtn.AmountPayment = kv.Sum(o => o.AmountPayment);
rtn.AmountPlan = kv.Sum(o => o.AmountPlan);
rtn.Status = kv.Count();
rtns.Results.Add(rtn);
}
}
else
{
var group = results.GroupBy(o => o.Summary);
foreach (var kv in group)
{
var rtn = new Settlement();
rtn.Summary = kv.Key;
rtn.Amount = kv.Sum(o => o.Amount);
rtn.AmountPayment = kv.Sum(o => o.AmountPayment);
rtn.AmountPlan = kv.Sum(o => o.AmountPlan);
rtn.Status = kv.Count();
rtns.Results.Add(rtn);
}
}
return rtns;
}
}
#endregion
}
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Kivii.Common" version="5.6.2022.4060" targetFramework="net45" />
<package id="Kivii.Core" version="5.6.2022.4050" targetFramework="net45" />
<package id="Kivii.Linq" version="5.6.2022.4100" targetFramework="net45" />
<package id="Kivii.Common" version="5.6.2022.4110" targetFramework="net45" />
<package id="Kivii.Core" version="5.6.2022.4110" targetFramework="net45" />
<package id="Kivii.Linq" version="5.6.2022.4120" targetFramework="net45" />
</packages>
\ No newline at end of file
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