using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Transactions; using AutoMapper; using GxPress.Common.AppOptions; using GxPress.Common.Exceptions; using GxPress.Common.Page; using GxPress.Common.Tools; using GxPress.Entity; using GxPress.Repository.Interface; using GxPress.Request.Finance; using GxPress.Result.Finance; using GxPress.Result.HumanAffairs; using Microsoft.Extensions.Options; using Datory; namespace GxPress.Repository.Implement { /// /// 财务数据 /// public class FinanceRepository : IFinanceRepository { private readonly Repository _repository; public FinanceRepository(IOptionsMonitor dbOptionsAccessor, IMapper mapper) { var databaseType = StringUtils.ToEnum(dbOptionsAccessor.CurrentValue.DatabaseType, DatabaseType.MySql); var database = new Database(databaseType, dbOptionsAccessor.CurrentValue.ConnectionString); _repository = new Repository(database); } public IDatabase Database => _repository.Database; public string TableName => _repository.TableName; public List TableColumns => _repository.TableColumns; /// /// 添加财务数据 /// /// /// public async Task InsertAsync(IEnumerable finances) { try { using (TransactionScope transactionScope = new TransactionScope()) { foreach (var finance in finances) { await _repository.InsertAsync(finance); } transactionScope.Complete(); } } catch (Exception e) { throw new BusinessException(e.Message); } return true; } /// /// 分页显示 /// /// public async Task> GetPageListAsync(PageParameter request) { var result = new PagedList { Items = await _repository.GetAllAsync(Q.ForPage(request.Page, request.PerPage)), Total = await _repository.CountAsync() }; return result; } /// /// 获取财务图像 /// /// /// public async Task GetFinanceChartAsync(FinanceRequest request) { var result = new FinanceResult(); //获取当前时间 DateTime dt = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd")); DateTime dtNow = DateTime.Now; //当前星期几 int weekNow = Convert.ToInt32(DateTime.Now.DayOfWeek); result.HumanAffairsChartDataResult = new List(); //上月 var a = await _repository.GetAllAsync(Q.Where(nameof(Finance.FinanceType), request.DataType) .WhereDate(nameof(Finance.EnteringDateTime), "<=", dt.AddDays(-dt.Day)) .WhereDate(nameof(Finance.EnteringDateTime), ">=", dt.AddDays(-dt.Day).AddMonths(1))); //本月 var b = await _repository.GetAllAsync(Q.Where(nameof(Finance.FinanceType), request.DataType) .WhereDate(nameof(Finance.EnteringDateTime), "<=", dtNow) .WhereDate(nameof(Finance.EnteringDateTime), ">=", dt.AddDays(-dt.Day))); //今天 var c = await _repository.GetAllAsync(Q.Where(nameof(Finance.FinanceType), request.DataType) .WhereDate(nameof(Finance.EnteringDateTime), "<=", dtNow) .WhereDate(nameof(Finance.EnteringDateTime), ">=", dt)); //同比增长 result.ComparedMonthAmount = b.Sum(n => n.Amount) - a.Sum(n => n.Amount); if (request.DateType == 1) //今天收入 result.ToDayIncome = c.Sum(n => n.Amount); else if (request.DateType == 2) { var weekDt = dt; //本周 if (dtNow.DayOfWeek.GetHashCode() == 0) weekDt = dt.AddDays(-7); else weekDt = dt.AddDays(-dtNow.DayOfWeek.GetHashCode()); c = await _repository.GetAllAsync(Q.Where(nameof(Finance.FinanceType), request.DataType) .WhereDate(nameof(Finance.EnteringDateTime), "<=", dtNow) .WhereDate(nameof(Finance.EnteringDateTime), ">=", weekDt)); //本周收入 result.ToDayIncome = c.Sum(n => n.Amount); } //月 else if (request.DateType == 3) { var mouthDt = dt; mouthDt = dt.AddDays(-dt.Day); c = await _repository.GetAllAsync(Q.Where(nameof(Finance.FinanceType), request.DataType) .WhereDate(nameof(Finance.EnteringDateTime), "<=", dtNow) .WhereDate(nameof(Finance.EnteringDateTime), ">=", mouthDt)); //本月收入 result.ToDayIncome = c.Sum(n => n.Amount); } else if (request.DateType == 4) { var yearDt = dt; yearDt = dt.AddMonths(-dt.Month).AddDays(-dt.Day); c = await _repository.GetAllAsync(Q.Where(nameof(Finance.FinanceType), request.DataType) .WhereDate(nameof(Finance.EnteringDateTime), "<=", dtNow) .WhereDate(nameof(Finance.EnteringDateTime), ">=", yearDt)); //本年收入 result.ToDayIncome = c.Sum(n => n.Amount); } //计算周 if (request.DateType == 2) { var beginDat = dt; for (int i = 1; i <= 7; i++) { var week = (i - 1) * -7; var endDay = beginDat.AddDays(-weekNow + week + 1); var query = Q.NewQuery(); var humanAffairsWeekList = await _repository.GetAllAsync(query.Where(nameof(Finance.FinanceType), request.DataType) .WhereDate(nameof(Finance.EnteringDateTime), "<=", beginDat) .WhereDate(nameof(Finance.EnteringDateTime), ">=", endDay)); var humanAffairsChartData = new HumanAffairsChartData { NavigationNumber = i, ResultParameter = humanAffairsWeekList.Sum(n => n.Amount) }; result.HumanAffairsChartDataResult.Add(humanAffairsChartData); beginDat = endDay; } } //天数 if (request.DateType == 1) { var beginDat = dt; for (int i = 1; i <= 7; i++) { var endDay = beginDat.AddDays(-i); var query = Q.NewQuery(); var humanAffairsDayList = await _repository.GetAllAsync(query.Where(nameof(Finance.FinanceType), request.DataType) .WhereDate(nameof(HumanAffairs.EnteringDateTime), "<=", beginDat) .WhereDate(nameof(HumanAffairs.EnteringDateTime), ">=", endDay)); var humanAffairsChartData = new HumanAffairsChartData { NavigationNumber = i, ResultParameter = humanAffairsDayList.Sum(n => n.Amount) }; result.HumanAffairsChartDataResult.Add(humanAffairsChartData); beginDat = endDay; } } //月 if (request.DateType == 3) { var beginDat = dt; for (int i = 1; i <= 7; i++) { var days = beginDat.Day; var endDay = dt.AddDays(-days).AddMonths(-i); var query = Q.NewQuery(); var humanAffairsMonthList = await _repository.GetAllAsync(query.Where(nameof(Finance.FinanceType), request.DataType) .WhereDate(nameof(HumanAffairs.EnteringDateTime), "<=", beginDat) .WhereDate(nameof(HumanAffairs.EnteringDateTime), ">=", endDay)); var humanAffairsChartData = new HumanAffairsChartData { NavigationNumber = i, ResultParameter = humanAffairsMonthList.Sum(n => n.Amount) }; result.HumanAffairsChartDataResult.Add(humanAffairsChartData); beginDat = endDay; } } //年 if (request.DateType == 4) { var beginDat = dt; for (int i = 1; i <= 7; i++) { var days = beginDat.DayOfYear; var endDay = dt.AddDays(-days).AddYears(-i); var query = Q.NewQuery(); var humanAffairsYearList = await _repository.GetAllAsync(query.Where(nameof(Finance.FinanceType), request.DataType) .WhereDate(nameof(HumanAffairs.EnteringDateTime), "<=", beginDat) .WhereDate(nameof(HumanAffairs.EnteringDateTime), ">=", endDay)); var humanAffairsChartData = new HumanAffairsChartData { NavigationNumber = i, ResultParameter = humanAffairsYearList.Sum(n => n.Amount) }; result.HumanAffairsChartDataResult.Add(humanAffairsChartData); beginDat = endDay; } } return result; } } }