Commit 6d1a150c by 陶然

优化

parent 03d600ee
......@@ -77,7 +77,7 @@ namespace Kivii.Finances.Transforms
item.Type = "Debit";
}
}
rtns.Results = rtns.Results.OrderBy(o => o.Type).ToList();
//rtns.Results = rtns.Results.OrderBy(o => o.Type).ToList();
}
}
return rtns;
......
......@@ -209,6 +209,7 @@ namespace Kivii.Finances.Transforms
foreach (var item in allAcceptPayments)
{
conn.Insert(item);
item.RemoveAllOnlyProperties();
rtns.Results.Add(item);
}
}
......
......@@ -288,6 +288,76 @@ namespace Kivii.Finances.Transforms
return rtns;
}
}
[Api(Description = "账户统计")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class AccountStatistic : RestfulExecution<Account>
{
public Guid OwnerKvid { get; set; }
public DateTime BeginTime { get; set; }
public DateTime EndTime { get; set; }
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<Account>();
var queryKvids = conn.From<Account>();
queryKvids.Where(o => o.Type == AccountType.Deposit);
if (OwnerKvid != Guid.Empty) queryKvids.And(o => o.OwnerKvid == OwnerKvid);
queryKvids.Select(o => o.Kvid);
var sqlExpress = conn.From<Account>();
sqlExpress.Where(o => o.Type == AccountType.Deposit);
if (OwnerKvid != Guid.Empty) sqlExpress.And(o => o.OwnerKvid == OwnerKvid);
var results = conn.Select(sqlExpress);
var rtns = new StatisticResponse<Analysis>();
if (results.IsNullOrEmpty()) return rtns;
rtns.Results = new List<Analysis>();
var queryDetails = conn.From<AccountDetail>();
queryDetails.Where(o => Sql.In(o.AccountKvid, queryKvids));
queryDetails.And(o => o.CreateTime >= BeginTime && o.CreateTime < EndTime);
var allDetails = conn.Select(queryDetails);
if (OwnerKvid != Guid.Empty)
{
foreach (var item in results)
{
var details = allDetails.Where(o => o.AccountKvid == item.Kvid).ToList();
var rtn = new Analysis();
rtn.Summary = item.Name;
rtn.Amount = item.Amount;
rtn.AmountPayment = details.Where(o => o.PayeeAccountKvid == item.Kvid).Sum(o => o.AmountPayment);
rtn.AmountUsed = details.Where(o => o.PayerAccountKvid == item.Kvid).Sum(o => o.AmountPayment);
rtns.Results.Add(rtn);
}
}
else
{
var group = results.GroupBy(o => o.OwnerKvid);
foreach (var kv in group)
{
var details = allDetails.Where(o => kv.ToList().ConvertAll(p => p.Kvid).Contains(o.AccountKvid)).ToList();
var rtn = new Analysis();
rtn.Summary = kv.FirstOrDefault().OwnerName;
rtn.Quantity = kv.Count();
rtn.Amount = kv.Sum(o => o.Amount);
rtn.AmountPayment = details.Where(o => kv.ToList().ConvertAll(p => p.Kvid).Contains(o.PayeeAccountKvid)).Sum(o => o.AmountPayment);
rtn.AmountUsed = details.Where(o => kv.ToList().ConvertAll(p => p.Kvid).Contains(o.PayerAccountKvid)).Sum(o => o.AmountPayment);
rtns.Results.Add(rtn);
}
}
return rtns;
}
}
#endregion
#region 分析
......@@ -608,6 +678,87 @@ namespace Kivii.Finances.Transforms
return rtns;
}
}
[Api(Description = "发票分析")]
[RequiresAnyRole(SystemRoles.Everyone)]
public class InvoiceAnalysis : RestfulExecution<Invoice>
{
public Guid? OwnerKvid { get; set; }
public AnalysisType Type { get; set; } = AnalysisType.Depart;//按时间分析,否则按部门分析
public DateTime BeginTime { get; set; }
public DateTime EndTime { get; set; }
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<Invoice>();
var sqlExpress = conn.From<Invoice>();
sqlExpress.Where(o => o.RootKvid == o.Kvid && o.Type != "Relation");
sqlExpress.And(o => (o.OperateTime >= BeginTime && o.OperateTime < EndTime));
if (OwnerKvid != null) sqlExpress.And(o => o.OwnerKvid == OwnerKvid.Value);
sqlExpress.OrderBy(o => o.OwnerName);
sqlExpress.Select(o => new { o.OwnerKvid, o.OwnerName, o.OffsetKvid, o.Amount, o.AmountPayment, o.AmountUsed, o.OperateTime, o.CreateTime, o.Type });
var results = conn.Select(sqlExpress);
var rtns = new StatisticResponse<Analysis>();
if (results.IsNullOrEmpty()) return rtns;
rtns.Results = new List<Analysis>();
foreach (var item in results)
{
item.Summary = item.OperateTime.ToString("yyyy-MM");
}
if (Type == AnalysisType.Depart)
{
var group = results.GroupBy(o => o.OwnerKvid);
foreach (var kv in group)
{
var rtn = new Analysis();
rtn.Summary = kv.FirstOrDefault().OwnerName;
if (kv.Key == Guid.Empty) rtn.Summary = "无部门信息发票";
rtn.Amount = kv.Where(o => o.Amount > 0).Sum(o => o.Amount);
rtn.Quantity = kv.Where(o => o.Amount > 0).Count();
rtn.AmountPayment = kv.Where(o => o.Amount > 0).Sum(o => o.AmountPayment);
rtn.QuantityPayment = kv.Where(o => o.Amount > 0 && o.AmountPayment == o.Amount).Count();
rtn.AmountUnpaid = kv.Where(o => o.Amount > 0).Sum(o => o.Amount - o.AmountPayment);
rtn.QuantityUnpaid = kv.Where(o => o.Amount > 0 && o.AmountPayment < o.Amount).Count();
rtn.AmountOffset = kv.Where(o => o.Amount <= 0).Sum(o => o.Amount);
rtn.QuantityOffset = kv.Where(o => o.Amount <= 0).Count();
rtns.Results.Add(rtn);
}
}
else
{
var group = results.GroupBy(o => o.Summary);
foreach (var kv in group)
{
var rtn = new Analysis();
rtn.Summary = kv.Key;
rtn.Amount = kv.Where(o => o.Amount > 0).Sum(o => o.Amount);
rtn.Quantity = kv.Where(o => o.Amount > 0).Count();
rtn.AmountPayment = kv.Where(o => o.Amount > 0).Sum(o => o.AmountPayment);
rtn.QuantityPayment = kv.Where(o => o.Amount > 0 && o.AmountPayment == o.Amount).Count();
rtn.AmountUnpaid = kv.Where(o => o.Amount > 0).Sum(o => o.Amount - o.AmountPayment);
rtn.QuantityUnpaid = kv.Where(o => o.Amount > 0 && o.AmountPayment < o.Amount).Count();
rtn.AmountOffset = kv.Where(o => o.Amount <= 0).Sum(o => o.Amount);
rtn.QuantityOffset = kv.Where(o => o.Amount <= 0).Count();
rtns.Results.Add(rtn);
}
}
return rtns;
}
}
#endregion
#region Group
......
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