LifePayment/LifePayment.Application.Contracts/LifePay/ILifePayOrderService.cs
@@ -12,11 +12,16 @@ { Task<PageOutput<LifePayRechargeReceiptsListOutput>> GetLifePayRechargeReceiptsPage(LifePayRechargeReceiptsPageInput input); Task<PageOutput<LifePayExpensesReceiptsListOutput>> GetLifePayExpensesReceiptsPage(LifePayExpensesReceiptsPageInput input); Task<PageOutput<LifePayChannlesRakeListOutput>> GetLifePayChannlesRakePage(LifePayChannlesRakePageInput input); Task AddUpdatePayRechargeReceipts(AddUpdatePayRechargeReceiptsInput input); Task<PageOutput<LifePayExpensesReceiptsListOutput>> GetLifePayExpensesReceiptsPage(LifePayExpensesReceiptsPageInput input); Task AddLifePayExpensesReceipts(AddLifePayExpensesReceiptsInput input); Task GetAllLifePayExpensesReceipts(); Task GetAllChannlesRake(); } LifePayment/LifePayment.Application.Contracts/LifePay/LifePayInput.cs
@@ -736,4 +736,38 @@ public decimal Amount { get; set; } public string ExpensesReceiptsOrder { get; set; } } } public class LifePayChannlesRakePageInput : ChannelsBaseInput { /// <summary> /// 查询条件 /// </summary> public string? KeyWord { get; set; } /// <summary> /// 渠道号 /// </summary> public string? ChannelId { get; set; } /// <summary> /// 起始下单时间 /// </summary> public DateTime? CreationTimeBegin { get; set; } /// <summary> /// 结束下单时间 /// </summary> public DateTime? CreationTimeEnd { get; set; } /// <summary> /// 起始结算时间 /// </summary> public DateTime? FinishTimeBegin { get; set; } /// <summary> /// 终止结算时间 /// </summary> public DateTime? FinishTimeEnd { get; set; } } LifePayment/LifePayment.Application.Contracts/LifePay/LifePayOutput.cs
@@ -1232,6 +1232,14 @@ public decimal RealIncome { get; set; } } public class LifePayLifePayChannlesRakeStatistics { /// <summary> /// 合计佣金 /// </summary> public decimal TotalRakePrice { get; set; } } public class ReceiptsListOutPut { /// <summary> @@ -1240,4 +1248,54 @@ public DateTime CreationTime { get; set; } public decimal Amount { get; set; } } public class LifePayChannlesRakeListOutput { /// <summary> /// 编号 /// </summary> public Guid Id { get; set; } /// <summary> /// 平台订单号 /// </summary> public string OrderNo { get; set; } /// <summary> /// 成交金额 /// </summary> public decimal PayAmount { get; set; } /// <summary> /// 渠道佣金比例 /// </summary> public decimal ChannlesRakeRate { get; set; } /// <summary> /// 佣金 /// </summary> public decimal ChannlesRakePrice { get; set; } /// <summary> /// 结算时间 /// </summary> public DateTime FinishTime { get; set; } /// <summary> /// 下单时间 /// </summary> public DateTime CreationTime { set; get; } /// <summary> /// 拓展属性 /// </summary> public string ExtraProperties { get; set; } /// <summary> /// 下单渠道 /// </summary> public string ChannelId { get; set; } } LifePayment/LifePayment.Application/LifePay/LifePayOrderService.cs
@@ -21,6 +21,7 @@ { private readonly IRepository<LifePayRechargeReceipts, Guid> _lifePayRechargeReceiptsRepository; private readonly IRepository<LifePayExpensesReceipts, Guid> _lifePayExpensesReceiptsRepository; private readonly IRepository<LifePayChannlesRake, Guid> _lifePayChannlesRakeRepository; private readonly IRepository<LifePayOrder, Guid> _lifePayOrderRepository; private readonly IAliPayApi _aliPayApi; private readonly IWxPayApi _wxPayApi; @@ -28,17 +29,20 @@ public LifePayOrderService( IRepository<LifePayRechargeReceipts, Guid> lifePayRechargeReceiptsRepository, IRepository<LifePayExpensesReceipts, Guid> lifePayExpensesReceiptsRepository, IRepository<LifePayChannlesRake, Guid> lifePayChannlesRakeRepository, IRepository<LifePayOrder, Guid> lifePayOrderRepository, IAliPayApi aliPayApi, IWxPayApi wxPayApi) { _lifePayRechargeReceiptsRepository = lifePayRechargeReceiptsRepository; _lifePayExpensesReceiptsRepository = lifePayExpensesReceiptsRepository; _lifePayChannlesRakeRepository = lifePayChannlesRakeRepository; _lifePayOrderRepository = lifePayOrderRepository; _aliPayApi = aliPayApi; _wxPayApi = wxPayApi; } #region 查询 /// <summary> /// 获取充值流水 /// </summary> @@ -66,42 +70,6 @@ objectData.TotalRechargeAmount = total; list.ObjectData = objectData; return list; } /// <summary> /// 编辑充值流水 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task AddUpdatePayRechargeReceipts(AddUpdatePayRechargeReceiptsInput input) { CheckExtensions.IfTrueThrowUserFriendlyException(input.OrderNo == null, "请输入业务订单号"); CheckExtensions.IfTrueThrowUserFriendlyException(input.RechargeAmount <= 0, "充值金额应大于0"); CheckExtensions.IfTrueThrowUserFriendlyException(input.Voucher == null, "请提交充值凭证"); var repeat = await _lifePayRechargeReceiptsRepository.Where(x => x.IsDeleted == false && x.OrderNo == input.OrderNo).FirstOrDefaultAsync(); CheckExtensions.IfTrueThrowUserFriendlyException(repeat != null && repeat.Id != input.Id, "业务订单号重复"); if (input.Id.HasValue) { var payRechargeReceipts = await _lifePayRechargeReceiptsRepository.Where(x => x.IsDeleted == false && x.Id == input.Id.Value).FirstOrDefaultAsync(); payRechargeReceipts.OrderNo = input.OrderNo; payRechargeReceipts.RechargeAmount = input.RechargeAmount; payRechargeReceipts.Remark = input.Remark; payRechargeReceipts.Voucher = input.Voucher; } else { LifePayRechargeReceipts payRechargeReceipts = new LifePayRechargeReceipts() { Id = Guid.NewGuid(), OrderNo = input.OrderNo, RechargeAmount = input.RechargeAmount, Remark = input.Remark, Voucher = input.Voucher, }; await _lifePayRechargeReceiptsRepository.InsertAsync(payRechargeReceipts); } } /// <summary> @@ -141,6 +109,82 @@ return list; } /// <summary> /// 获取渠道分佣 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<PageOutput<LifePayChannlesRakeListOutput>> GetLifePayChannlesRakePage(LifePayChannlesRakePageInput input) { var list = await _lifePayChannlesRakeRepository.Where(x => x.IsDeleted == false) .WhereIf(input.ChannelId != null, x => x.ChannelId == input.ChannelId) .WhereIf(input.CreationTimeBegin.HasValue, x => x.CreationTime >= input.CreationTimeBegin) .WhereIf(input.CreationTimeEnd.HasValue, x => x.CreationTime <= input.CreationTimeEnd) .WhereIf(input.FinishTimeBegin.HasValue, x => x.FinishTime >= input.FinishTimeBegin) .WhereIf(input.FinishTimeEnd.HasValue, x => x.FinishTime <= input.FinishTimeEnd) .Select(x => new LifePayChannlesRakeListOutput() { Id = x.Id, OrderNo = x.OrderNo, PayAmount = x.PayAmount, ChannlesRakeRate = x.ChannlesRakeRate, ChannlesRakePrice = x.ChannlesRakePrice, ChannelId = x.ChannelId, FinishTime = x.FinishTime, CreationTime = x.CreationTime, }) .GetPageResult(input.PageModel); var totalRakePrice = await _lifePayChannlesRakeRepository.Where(x => x.IsDeleted == false).SumAsync(x => x.ChannlesRakePrice); LifePayLifePayChannlesRakeStatistics objectData = new LifePayLifePayChannlesRakeStatistics(); objectData.TotalRakePrice = totalRakePrice; list.ObjectData = objectData; return list; } #endregion /// <summary> /// 编辑充值流水 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task AddUpdatePayRechargeReceipts(AddUpdatePayRechargeReceiptsInput input) { CheckExtensions.IfTrueThrowUserFriendlyException(input.OrderNo == null, "请输入业务订单号"); CheckExtensions.IfTrueThrowUserFriendlyException(input.RechargeAmount <= 0, "充值金额应大于0"); CheckExtensions.IfTrueThrowUserFriendlyException(input.Voucher == null, "请提交充值凭证"); var repeat = await _lifePayRechargeReceiptsRepository.Where(x => x.IsDeleted == false && x.OrderNo == input.OrderNo).FirstOrDefaultAsync(); CheckExtensions.IfTrueThrowUserFriendlyException(repeat != null && repeat.Id != input.Id, "业务订单号重复"); if (input.Id.HasValue) { var payRechargeReceipts = await _lifePayRechargeReceiptsRepository.Where(x => x.IsDeleted == false && x.Id == input.Id.Value).FirstOrDefaultAsync(); payRechargeReceipts.OrderNo = input.OrderNo; payRechargeReceipts.RechargeAmount = input.RechargeAmount; payRechargeReceipts.Remark = input.Remark; payRechargeReceipts.Voucher = input.Voucher; } else { LifePayRechargeReceipts payRechargeReceipts = new LifePayRechargeReceipts() { Id = Guid.NewGuid(), OrderNo = input.OrderNo, RechargeAmount = input.RechargeAmount, Remark = input.Remark, Voucher = input.Voucher, }; await _lifePayRechargeReceiptsRepository.InsertAsync(payRechargeReceipts); } } /// <summary> /// 插入收支流水 /// </summary> @@ -256,10 +300,33 @@ await AddLifePayExpensesReceipts(input); } } } } public async Task GetAllChannlesRake() { var orderlist = await _lifePayOrderRepository.Where(x => x.IsDeleted == false && x.PayStatus == LifePayStatusEnum.已支付 && x.LifePayOrderStatus == LifePayOrderStatusEnum.已完成).ToListAsync(); foreach (var item in orderlist) { /// 毛利 var grossProfit = item.RechargeAmount * (item.ChannleRate - item.PlatformRate) / 100; /// 渠道佣金 ((充值面额 * 渠道折扣比例)-(充值面额 * 平台折扣比例))* 佣金比例 var channlesRakePrice = grossProfit * (item.ChannlesRakeRate) / 100; if (channlesRakePrice.HasValue) { LifePayChannlesRake lifePayChannlesRake = new LifePayChannlesRake() { OrderNo = item.OrderNo, PayAmount = item.PayAmount.Value, ChannlesRakeRate = item.ChannlesRakeRate.Value, ChannlesRakePrice = channlesRakePrice.Value, FinishTime = item.FinishTime.Value, ChannelId = item.ChannelId, }; await _lifePayChannlesRakeRepository.InsertAsync(lifePayChannlesRake); } } } } } LifePayment/LifePayment.Application/LifePay/StatisticsService.cs
@@ -44,34 +44,34 @@ { var today = DateTime.Now.Date; var statistics = await _dallyStatisticsRepository.Where(x => x.CreationTime.Date == today) .WhereIf(string.IsNullOrWhiteSpace(channleId), x => x.Channel == channleId) .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId) .FirstOrDefaultAsync(); if (statistics == null) { /// 累计收款:统计平台账户下订单创建时间在昨天及之前收到的【用户支付成功的金额-退款给用户的金额】; var accumulatedReceipts = await _lifePayOrderRepository.Where(x => x.CreationTime < today && x.PayStatus != LifePayStatusEnum.未支付) .WhereIf(string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).SumAsync(x => x.PayAmount) - await _lifePayOrderRepository.Where(x => x.CreationTime < today && x.LifePayRefundStatus == LifePayRefundStatusEnum.已退款).SumAsync(x => (x.RefundPrice ?? 0)); .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).SumAsync(x => x.PayAmount) - await _lifePayOrderRepository.Where(x => x.CreationTime < today && x.LifePayRefundStatus == LifePayRefundStatusEnum.已退款).SumAsync(x => (x.RefundPrice ?? 0)); /// 昨日收款:统计平台账户下订单创建时间在昨天收到的【用户支付成功的金额-退款给用户的金额】; var receiptsYesterday = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.PayStatus == LifePayStatusEnum.已支付) .WhereIf(string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).SumAsync(x => x.PayAmount) - await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.LifePayRefundStatus == LifePayRefundStatusEnum.已退款).SumAsync(x => (x.RefundPrice ?? 0)); .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).SumAsync(x => x.PayAmount) - await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.LifePayRefundStatus == LifePayRefundStatusEnum.已退款).SumAsync(x => (x.RefundPrice ?? 0)); /// 累计收入:统计平台账户下订单状态为“已完成”且订单创建时间在昨天及之前收到的【用户实付金额-平台扣款金额-部分退款金额】; var accumulatedIncome = await _lifePayOrderRepository.Where(x => x.CreationTime < today && x.LifePayOrderStatus == LifePayOrderStatusEnum.已完成) .WhereIf(string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).SumAsync(x => x.PayAmount - (x.PlatformDeductionAmount ?? 0) - (x.RefundPrice ?? 0)); .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).SumAsync(x => x.PayAmount - (x.PlatformDeductionAmount ?? 0) - (x.RefundPrice ?? 0)); /// 累计下单:统计平台中订单下单时间在昨天及之前时间的订单记录; var accumulatedOrders = await _lifePayOrderRepository.Where(x => x.CreationTime < today).WhereIf(string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).CountAsync(); var accumulatedOrders = await _lifePayOrderRepository.Where(x => x.CreationTime < today).WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).CountAsync(); /// 昨日下单:统计平台中订单下单时间在昨天的订单记录; var ordersNumYesterday = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today) .WhereIf(string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).CountAsync(); .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).CountAsync(); /// 昨日成功:统计平台中订单状态为“已完成/部分充值成功”且订单下单时间在昨天的订单记录; var yesterdaySuccess = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.LifePayOrderStatus == LifePayOrderStatusEnum.已完成) .WhereIf(string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).CountAsync(); /// 昨日失败:统计平台中订单状态为“充值失败/已退款”且订单下单时间在昨天的订单记录; var yesterdayFail = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.LifePayOrderStatus == LifePayOrderStatusEnum.已退款) .WhereIf(string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).CountAsync(); .WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.ChannelId == channleId).CountAsync(); /// 累计用户 var accumulatedUsers = await _lifePayUserRepository.WhereIf(string.IsNullOrWhiteSpace(channleId), x => x.CreationChannleNum == channleId).CountAsync(); var accumulatedUsers = await _lifePayUserRepository.WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.CreationChannleNum == channleId).CountAsync(); /// 昨日活跃用户 var yesterdayActiveUsers = await _lifePayUserRepository.WhereIf(string.IsNullOrWhiteSpace(channleId), x => x.CreationChannleNum == channleId).Where(x => x.LastLoginTime >= today.AddDays(-1)).CountAsync(); var yesterdayActiveUsers = await _lifePayUserRepository.WhereIf(!string.IsNullOrWhiteSpace(channleId), x => x.CreationChannleNum == channleId).Where(x => x.LastLoginTime >= today.AddDays(-1)).CountAsync(); var entity = new DallyStatistics() { @@ -87,7 +87,7 @@ YesterdayFail = yesterdayFail, AccumulatedUsers = accumulatedUsers, YesterdayActiveUsers = yesterdayActiveUsers, Channel = channleId ChannelId = channleId }; await _dallyStatisticsRepository.InsertAsync(entity); LifePayment/LifePayment.Domain/LifePay/DallyStatistics.cs
@@ -66,5 +66,5 @@ /// <summary> /// 统计渠道 /// </summary> public string Channel { get; set; } public string ChannelId { get; set; } } LifePayment/LifePayment.Domain/LifePay/LifePayChannlesRake.cs
New file @@ -0,0 +1,57 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp; using LifePayment.Domain.Shared; namespace LifePayment.Domain.LifePay { /// <summary> /// 分佣 /// </summary> public class LifePayChannlesRake : FullAuditedEntity<Guid>, IDataUserFilter { public LifePayChannlesRake() { } /// <summary> /// 平台订单号 /// </summary> public string OrderNo { get; set; } /// <summary> /// 成交金额 /// </summary> public decimal PayAmount { get; set; } /// <summary> /// 渠道佣金比例 /// </summary> public decimal ChannlesRakeRate { get; set; } /// <summary> /// 佣金 /// </summary> public decimal ChannlesRakePrice { get; set; } /// <summary> /// 结算时间 /// </summary> public DateTime FinishTime { get; set; } /// <summary> /// 拓展属性 /// </summary> public string ExtraProperties { get; set; } /// <summary> /// 下单渠道 /// </summary> public string ChannelId { get; set; } } } LifePayment/LifePayment.EntityFrameworkCore/LifePaymentServicesDbContext.cs
@@ -29,6 +29,8 @@ public virtual DbSet<LifePayExpensesReceipts> LifePayExpensesReceipts { get; set; } public virtual DbSet<LifePayChannlesRake> LifePayChannlesRake { get; set; } public virtual DbSet<Area> Area { get; set; } public virtual DbSet<User> Users { get; set; } LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml
@@ -267,6 +267,13 @@ <param name="input"></param> <returns></returns> </member> <member name="M:LifePayment.HttpApi.LifePayController.GetLifePayChannlesRakePage(LifePayment.Application.Contracts.LifePayChannlesRakePageInput)"> <summary> 获取渠道分佣分页列表 </summary> <param name="input"></param> <returns></returns> </member> <member name="M:LifePayment.HttpApi.LifePayController.GetLifePayExpensesReceiptsPage(LifePayment.Application.Contracts.LifePayExpensesReceiptsPageInput)"> <summary> 获取收支流水分页数据 @@ -308,6 +315,12 @@ </summary> <returns></returns> </member> <member name="M:LifePayment.HttpApi.LifePayController.GetAllChannlesRake"> <summary> 同步订单 </summary> <returns></returns> </member> <member name="M:LifePayment.HttpApi.LifePayController.CreateLifePayPhoneOrder(LifePayment.Application.Contracts.CreateLifePayOrderInput{LifePayment.Application.Contracts.LifePhoneData})"> <summary> 创建生活缴费话费订单 LifePayment/LifePayment.Host/LifePaymentServices.Application.Contracts.xml
@@ -836,6 +836,36 @@ 交易金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakePageInput.KeyWord"> <summary> 查询条件 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakePageInput.ChannelId"> <summary> 渠道号 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakePageInput.CreationTimeBegin"> <summary> 起始下单时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakePageInput.CreationTimeEnd"> <summary> 结束下单时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakePageInput.FinishTimeBegin"> <summary> 起始结算时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakePageInput.FinishTimeEnd"> <summary> 终止结算时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayIntroInfoInput.LifePayType"> <summary> 生活缴费类型 @@ -1781,11 +1811,61 @@ 实际收入 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayLifePayChannlesRakeStatistics.TotalRakePrice"> <summary> 合计佣金 </summary> </member> <member name="P:LifePayment.Application.Contracts.ReceiptsListOutPut.CreationTime"> <summary> 创建时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakeListOutput.Id"> <summary> 编号 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakeListOutput.OrderNo"> <summary> 平台订单号 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakeListOutput.PayAmount"> <summary> 成交金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakeListOutput.ChannlesRakeRate"> <summary> 渠道佣金比例 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakeListOutput.ChannlesRakePrice"> <summary> 佣金 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakeListOutput.FinishTime"> <summary> 结算时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakeListOutput.CreationTime"> <summary> 下单时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakeListOutput.ExtraProperties"> <summary> 拓展属性 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayChannlesRakeListOutput.ChannelId"> <summary> 下单渠道 </summary> </member> <member name="P:LifePayment.Application.Contracts.RecordOperateHistoryEto.RelationId"> <summary> 关联关系ID LifePayment/LifePayment.HttpApi/LifePay/LifePayController.cs
@@ -443,6 +443,17 @@ } /// <summary> /// 获取渠道分佣分页列表 /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpPost] public async Task<PageOutput<LifePayChannlesRakeListOutput>> GetLifePayChannlesRakePage(LifePayChannlesRakePageInput input) { return await _lifePayOrderService.GetLifePayChannlesRakePage(input); } /// <summary> /// 获取收支流水分页数据 /// </summary> /// <param name="input"></param> @@ -539,7 +550,17 @@ await _lifePayOrderService.GetAllLifePayExpensesReceipts(); } /// <summary> /// 同步订单 /// </summary> /// <returns></returns> [HttpGet] [AllowAnonymous] public async Task GetAllChannlesRake() { await _lifePayOrderService.GetAllChannlesRake(); } #endregion