LifePayment/LifePayment.Application.Contracts/LifePay/ILifePayService.cs
@@ -50,7 +50,7 @@ Task LifePaySuccessHandler(string orderNo, string outOrderNo); /// <summary> /// 支付成功回调处理 /// 供应商回调处理 /// </summary> /// <param name="orderNo"></param> /// <param name="acoolyOrderNo"></param> @@ -58,7 +58,7 @@ /// <param name="acoolyStatus"></param> /// <param name="payAmount"></param> /// <returns></returns> Task ACOOLYOrderNotifyHandler(string orderNo, string acoolyOrderNo, LifePayOrderStatusEnum status, ACOOLYStatusEnum acoolyStatus, decimal payAmount); Task ACOOLYOrderNotifyHandler(string orderNo, string acoolyOrderNo, LifePayOrderStatusEnum status, ACOOLYStatusEnum acoolyStatus, decimal payAmount, string refundApplyRemark); /// <summary> /// 创建生活缴费话费订单 @@ -142,6 +142,13 @@ /// </summary> /// <returns></returns> Task<List<LifePayRateListOutput>> GetRate(); /// <summary> /// 获取渠道折扣 /// </summary> /// <returns></returns> Task<ChannelRateOutput> GetChannelRate(ChannelsBaseInput input); /// <summary> /// 获取手续费费率 @@ -250,6 +257,9 @@ Task<List<LifePayOrderListTemplate>> GetLifePayOrderPageExport(QueryLifePayOrderListInput input); Task<List<LifePayRefundOrderListTemplate>> GetLifePayRefudOrderPageExport(QueryLifePayRefundOrderListInput input); Task<string> GetBillErceiptExport(string orderNo); /// <summary> LifePayment/LifePayment.Application.Contracts/LifePay/LifePayInput.cs
@@ -357,6 +357,10 @@ /// 订单状态 /// </summary> public LifePayOrderStatusEnum? LifePayOrderStatus { get; set; } /// <summary> /// 订单状态 /// </summary> public LifePayRefundStatusEnum? LifePayRefundStatus { get; set; } /// <summary> /// 用户Id LifePayment/LifePayment.Application.Contracts/LifePay/LifePayOutput.cs
@@ -176,6 +176,11 @@ public string OrderNo { get; set; } /// <summary> /// 退款订单号 /// </summary> public string RefundOrderNo { get; set; } /// <summary> /// 充值金额 /// </summary> public decimal RechargeAmount { get; set; } @@ -379,6 +384,103 @@ } public class LifePayRefundOrderListTemplate { [Name("序号")] public int SerialNumber { get; set; } [Name("手机号")] public string PhoneNumber { get; set; } public LifePayTypeEnum? LifePayType { get; set; } public LifePayOrderTypeEnum LifePayOrderType { get; set; } [Name("充值类型")] public string LifePayOrderTypeStr { get; set; } [Name("充值渠道")] public string ChannelName { get; set; } /// <summary> /// 退款申请时间 /// </summary> [Name("申请退款时间")] public string RefundApplyTimeStr { get; set; } /// <summary> /// 下单时间 /// </summary> public DateTime CreationTime { get; set; } [Name("下单时间")] public string CreationTimeStr { get; set; } [Name("退款订单号")] public string RefundOrderNo { get; set; } [Name("充值金额")] public string RechargeAmountStr { get; set; } /// <summary> /// 充值金额 /// </summary> public decimal RechargeAmount { get; set; } /// <summary> /// 实际到账金额 /// </summary> [Name("实际到账金额")] public string ActualReceivedAmount { get; set; } /// <summary> /// 实付金额 /// </summary> public decimal PayAmount { get; set; } [Name("实付金额")] public string PayAmountStr { get; set; } [Name("退款渠道")] public string LifePayTypeStr { get; set; } /// <summary> /// 退款金额 /// </summary> [Name("退款金额")] public decimal? RefundPrice { get; set; } public ACOOLYStatusEnum ACOOLYStatus { get; set; } /// <summary> /// 供应商订单状态 /// </summary> [Name("供应商订单状态")] public string ACOOLYStatusStr { get; set; } /// <summary> /// 完成时间 /// </summary> public DateTime? FinishTime { get; set; } /// <summary> /// 平台退款状态 /// </summary> [Name("平台退款状态")] public string LifePayRefundStatus { get; set; } [Name("完成时间")] public string FinishTimeStr { get; set; } } public class UserLifePayOrderOutput { public Guid Id { get; set; } @@ -457,10 +559,21 @@ public string RefundApplyRemark { get; set; } public string RefundCheckRemark { get; set; } /// <summary> /// 渠道流水号 /// </summary> public string ACOOLYOrderNo { get; set; } /// <summary> /// 平台退款状态 /// </summary> public LifePayRefundStatusEnum? LifePayRefundStatus { get; set; } /// <summary> /// 平台状态 /// </summary> public ACOOLYStatusEnum? ACOOLYStatus { get; set; } } public class LifePayOrderOutput @@ -924,4 +1037,9 @@ /// </summary> public int YesterdayActiveUsers { get; set; } } public class ChannelRateOutput { public decimal ChannlesRate { get; set; } } LifePayment/LifePayment.Application.Contracts/User/CreateBackClientUserInput.cs
@@ -1,5 +1,7 @@ using System; using LifePayment.Domain.Shared; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using ZeroD.Util; namespace LifePayment.Application.Contracts @@ -15,11 +17,16 @@ /// 手机号 /// </summary> public string PhoneNumber { get; set; } /// <summary> /// 密码 /// </summary> public string Password { get; set; } /// <summary> /// 账户 /// </summary> [RegularExpression(LifePaymentConstant.RegularExpression.UserNameEx, ErrorMessage = "账号格式不正确")] public string UserName { get; set; } public string Remark { get; set; } LifePayment/LifePayment.Application/LifePay/LifePayService.cs
@@ -152,6 +152,16 @@ } /// <summary> /// 获取渠道折扣 /// </summary> /// <returns></returns> public async Task<ChannelRateOutput> GetChannelRate(ChannelsBaseInput input) { return _lifePayChannlesRep.Where(x => x.IsDeleted == false && x.ChannlesNum == input.CheckChannelId).Select(x => new ChannelRateOutput() { ChannlesRate = x.ChannlesRate }) .FirstOrDefault(); } /// <summary> /// 获取手续费费率 /// </summary> /// <returns></returns> @@ -234,6 +244,7 @@ /// <returns></returns> public async Task<PageOutput<LifePayOrderListOutput>> GetLifePayOrderPage(QueryLifePayOrderListInput input) { var channles = await _lifePayChannlesRep.Where(x => x.ChannlesName.Contains(input.KeyWords)).Select(x => x.ChannlesNum).ToListAsync(); var result = await (from a in _channelFilter.GetChannelLifePayOrderFilter(_lifePayOrderRepository) .WhereIf(input.BeginFinishTime.HasValue, x => x.FinishTime >= input.BeginFinishTime) .WhereIf(input.EndFinishTime.HasValue, x => x.FinishTime <= input.EndFinishTime) @@ -245,7 +256,7 @@ .WhereIf(input.ACOOLYStatus.HasValue, x => x.ACOOLYStatus == input.ACOOLYStatus.Value) .WhereIf(input.LifePayOrderType.HasValue, x => x.LifePayOrderType == input.LifePayOrderType.Value) .WhereIf(input.UserId.HasValue, x => x.UserId == input.UserId.Value) .WhereIf(input.KeyWords.IsNotNullOrEmpty(), x => x.PhoneNumber.Contains(input.KeyWords) || x.OrderNo.Contains(input.KeyWords) || x.OutOrderNo.Contains(input.KeyWords) || x.ACOOLYOrderNo.Contains(input.KeyWords)) .WhereIf(input.KeyWords.IsNotNullOrEmpty(), x => x.OrderNo.Contains(input.KeyWords) || x.OutOrderNo.Contains(input.KeyWords) || x.ACOOLYOrderNo.Contains(input.KeyWords) || channles.Contains(x.ChannelId)) join b in _lifePayChannlesRep on a.ChannelId equals b.ChannlesNum into temp from b in temp.DefaultIfEmpty() select new LifePayOrderListOutput @@ -290,15 +301,14 @@ { var result = await (from a in _channelFilter.GetChannelLifePayOrderFilter(_lifePayOrderRepository) .Where(x => x.PayStatus == LifePayStatusEnum.待退款 || x.PayStatus == LifePayStatusEnum.已退款 || x.PayStatus == LifePayStatusEnum.退款中 || x.LifePayOrderStatus == LifePayOrderStatusEnum.退款待审核 || x.LifePayOrderStatus == LifePayOrderStatusEnum.已退款 || x.LifePayOrderStatus == LifePayOrderStatusEnum.退款失败 .Where(x => x.LifePayOrderStatus == LifePayOrderStatusEnum.待退款 || x.LifePayOrderStatus == LifePayOrderStatusEnum.已退款 || x.LifePayOrderStatus == LifePayOrderStatusEnum.退款中 || x.LifePayRefundStatus > LifePayRefundStatusEnum.无需退款) .WhereIf(input.BeginFinishTime.HasValue, x => x.FinishTime >= input.BeginFinishTime) .WhereIf(input.EndFinishTime.HasValue, x => x.FinishTime <= input.EndFinishTime) .WhereIf(input.BeginRefundApplyTime.HasValue, x => x.RefundApplyTime >= input.BeginRefundApplyTime) .WhereIf(input.LifePayType.HasValue, x => x.LifePayType == input.LifePayType) .WhereIf(input.EndRefundApplyTime.HasValue, x => x.RefundApplyTime <= input.EndRefundApplyTime) .WhereIf(input.LifePayOrderStatus.HasValue, x => x.LifePayOrderStatus == input.LifePayOrderStatus.Value) .WhereIf(input.LifePayRefundStatus.HasValue, x => x.LifePayRefundStatus == input.LifePayRefundStatus.Value) .WhereIf(input.ACOOLYStatus.HasValue, x => x.ACOOLYStatus == input.ACOOLYStatus.Value) .WhereIf(input.LifePayOrderType.HasValue, x => x.LifePayOrderType == input.LifePayOrderType.Value) .WhereIf(input.UserId.HasValue, x => x.UserId == input.UserId.Value) @@ -338,6 +348,44 @@ return result; } /// <summary> /// 退款订单分页 /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<List<LifePayRefundOrderListTemplate>> GetLifePayRefudOrderPageExport(QueryLifePayRefundOrderListInput input) { var result = await (await GetLifePayRefundOrderListFilter(input)).Select(x => new LifePayRefundOrderListTemplate { FinishTime = x.FinishTime, RefundPrice = x.RefundPrice, LifePayOrderType = x.LifePayOrderType, LifePayType = x.LifePayType, PayAmount = x.PayAmount, PhoneNumber = x.PhoneNumber, RefundOrderNo = x.RefundOrderNo, ChannelName = x.ChannelName }).OrderByDescending(r => r.CreationTime).ToListAsync(); var i = 0; result.ForEach(s => { s.SerialNumber = ++i; s.ACOOLYStatusStr = s.ACOOLYStatus.GetDescription(); s.LifePayOrderTypeStr = s.LifePayOrderType.GetDescription(); s.CreationTimeStr = s.CreationTime.ToString(LifePaymentConstant.DateTimeFormatStr.yyyyMMddHHmm); s.RechargeAmountStr = s.RechargeAmount.ToString("F2"); s.ActualReceivedAmount = s.ActualReceivedAmount; s.LifePayRefundStatus = s.LifePayRefundStatus.GetDescription(); s.PayAmountStr = s.PayAmount.ToString("F2"); s.LifePayTypeStr = s.LifePayType.GetDescription(); s.FinishTimeStr = !s.FinishTime.HasValue ? string.Empty : s.FinishTime.Value.ToString(LifePaymentConstant.DateTimeFormatStr.yyyyMMddHHmm); }); return result; } public async Task<LifePayOrderOutput> GetLifePayOrderDetail(string orderNo) { @@ -477,6 +525,8 @@ RefundApplyRemark = x.RefundApplyRemark, RefundTime = x.RefundTime, ACOOLYOrderNo = x.ACOOLYOrderNo, LifePayRefundStatus = x.LifePayRefundStatus, ACOOLYStatus = x.ACOOLYStatus, }) .GetPageResult(input.PageModel); } @@ -777,7 +827,7 @@ var orderInput = new CreateLifePayOrderInput { OrderNo = channle.ChannlesNum + CreateOrderNo(), LifePayOrderStatus = LifePayOrderStatusEnum.待确认, LifePayOrderStatus = LifePayOrderStatusEnum.充值中, LifePayOrderType = LifePayOrderTypeEnum.话费订单, //LifePayType = input.LifePayType, OrderParamDetailJsonStr = JsonConvert.SerializeObject(input.ProductData), @@ -826,7 +876,7 @@ var orderInput = new CreateLifePayOrderInput { OrderNo = channle.ChannlesNum + CreateOrderNo(), LifePayOrderStatus = LifePayOrderStatusEnum.待确认, LifePayOrderStatus = LifePayOrderStatusEnum.充值中, LifePayOrderType = LifePayOrderTypeEnum.电费订单, // LifePayType = input.LifePayType, OrderParamDetailJsonStr = JsonConvert.SerializeObject(input.ProductData), @@ -875,7 +925,7 @@ var orderInput = new CreateLifePayOrderInput { OrderNo = channle.ChannlesNum + CreateOrderNo(), LifePayOrderStatus = LifePayOrderStatusEnum.待确认, LifePayOrderStatus = LifePayOrderStatusEnum.充值中, LifePayOrderType = LifePayOrderTypeEnum.燃气订单, // LifePayType = input.LifePayType, OrderParamDetailJsonStr = JsonConvert.SerializeObject(input.ProductData), @@ -1188,7 +1238,7 @@ } order.LifePayRefundStatus = LifePayRefundStatusEnum.无需退款; order.LifePayOrderStatus = LifePayOrderStatusEnum.待确认; order.LifePayOrderStatus = LifePayOrderStatusEnum.充值中; //SetOrderStatus(order, result.Code); order.OutRequestNo = result.RequestNo.IsNullOrEmpty() ? null : result.RequestNo; order.ACOOLYOrderNo = result.ACOOLYOrderNo.IsNullOrEmpty() ? null : result.ACOOLYOrderNo; @@ -1196,7 +1246,7 @@ catch (Exception ex) { _logger.LogError(ex, "处理生活缴费支付成功回调时异常"); order.LifePayOrderStatus = LifePayOrderStatusEnum.已失败; order.LifePayOrderStatus = LifePayOrderStatusEnum.待退款; order.LifePayRefundStatus = LifePayRefundStatusEnum.待退款; } _logger.LogError("生活缴费订单状态:" + order.LifePayOrderStatus.ToString()); @@ -1209,30 +1259,24 @@ /// <param name="orderNo"></param> /// <param name="outOrderNo"></param> /// <returns></returns> public async Task ACOOLYOrderNotifyHandler(string orderNo, string acoolyOrderNo, LifePayOrderStatusEnum status, ACOOLYStatusEnum acoolyStatus, decimal payAmount) public async Task ACOOLYOrderNotifyHandler(string orderNo, string acoolyOrderNo, LifePayOrderStatusEnum status, ACOOLYStatusEnum acoolyStatus, decimal payAmount,string refundApplyRemark) { var order = await _lifePayOrderRepository.Where(x => x.OrderNo == orderNo).FirstOrDefaultAsync(); CheckExtensions.IfTrueThrowUserFriendlyException(order == null, "订单不存在"); if (order.LifePayOrderStatus == LifePayOrderStatusEnum.已完成) { return; } //if (order.LifePayOrderStatus == LifePayOrderStatusEnum.已完成) //{ // return; //} order.PlatformDeductionAmount = payAmount; if (acoolyOrderNo.IsNotNullOrEmpty()) { order.ACOOLYOrderNo = acoolyOrderNo; } if (order.LifePayOrderStatus == LifePayOrderStatusEnum.已完成) if (refundApplyRemark.IsNotNullOrEmpty()) { order.FinishTime = DateTime.Now; } if (order.LifePayOrderStatus == LifePayOrderStatusEnum.已失败 && order.LifePayRefundStatus != LifePayRefundStatusEnum.已退款) { order.LifePayRefundStatus = LifePayRefundStatusEnum.待退款; order.RefundApplyRemark = refundApplyRemark; } order.LifePayOrderStatus = status; @@ -1267,7 +1311,7 @@ input.RefundPrice = order.PayAmount; } if (order.LifePayOrderStatus != LifePayOrderStatusEnum.已失败 && order.PayStatus != LifePayStatusEnum.待退款 && order.LifePayOrderStatus != LifePayOrderStatusEnum.退款待审核) if (order.LifePayOrderStatus != LifePayOrderStatusEnum.待退款 || order.PayStatus != LifePayStatusEnum.已支付 || order.LifePayRefundStatus != LifePayRefundStatusEnum.待退款) { throw new UserFriendlyException("当前订单状态无法退款"); } @@ -1288,12 +1332,16 @@ order.LifePayOrderStatus = LifePayOrderStatusEnum.退款中; order.LifePayRefundStatus = LifePayRefundStatusEnum.退款中; } else if (wxRefundResult.Message == "订单已全额退款") { order.LifePayOrderStatus = LifePayOrderStatusEnum.已退款; order.LifePayRefundStatus = LifePayRefundStatusEnum.已退款; } else { order.LifePayOrderStatus = LifePayOrderStatusEnum.退款失败; order.LifePayOrderStatus = LifePayOrderStatusEnum.待退款; order.LifePayRefundStatus = LifePayRefundStatusEnum.待退款; } break; case LifePayTypeEnum.AliPay: var aliRefundResult = await AliTradeRefund(new AlipayTradeRefundRequest() { OutTradeNo = order.OrderNo, RefundAmount = Convert.ToInt32(input.RefundPrice * 100).ToString() }); @@ -1312,7 +1360,7 @@ order.RefundCheckUserId = CurrentUser.Id; order.RefundPrice = input.RefundPrice; await _lifePayOrderRepository.UpdateAsync(order); //await _lifePayOrderRepository.UpdateAsync(order); #region 记录日志 @@ -1342,17 +1390,25 @@ return; } if (order.LifePayOrderStatus != LifePayOrderStatusEnum.待确认 && order.LifePayOrderStatus != LifePayOrderStatusEnum.已失败 && order.PayStatus != LifePayStatusEnum.已支付) if (order.PayStatus == LifePayStatusEnum.已支付 && order.LifePayOrderStatus != LifePayOrderStatusEnum.已完成 && order.LifePayOrderStatus != LifePayOrderStatusEnum.待退款 && order.LifePayOrderStatus != LifePayOrderStatusEnum.已退款) { order.LifePayOrderStatus = LifePayOrderStatusEnum.待退款; order.RefundApplyRemark = input.RefundApplyRemark; order.RefundApplyTime = DateTime.Now; await _lifePayOrderRepository.UpdateAsync(order); } else if (order.LifePayOrderStatus == LifePayOrderStatusEnum.待退款 || order.LifePayRefundStatus == LifePayRefundStatusEnum.待退款 || order.LifePayOrderStatus == LifePayOrderStatusEnum.退款中 || order.LifePayRefundStatus == LifePayRefundStatusEnum.退款中 || order.LifePayOrderStatus == LifePayOrderStatusEnum.已退款 || order.LifePayRefundStatus == LifePayRefundStatusEnum.已退款) { throw new UserFriendlyException("当前订单无法重复申请退款"); } else { throw new UserFriendlyException("当前订单状态无法申请退款"); } order.LifePayOrderStatus = LifePayOrderStatusEnum.退款待审核; order.RefundApplyRemark = input.RefundApplyRemark; order.RefundApplyTime = DateTime.Now; await _lifePayOrderRepository.UpdateAsync(order); } /// <summary> @@ -1370,7 +1426,7 @@ { OutTradeNo = outTradeNo, OutRefundNo = outRefundNo, Reason = reason, //Reason = reason, Amount = new Model_WxPayDomesticRefunds_Amount { Refund = refund, @@ -1434,7 +1490,7 @@ if (input.LifePayType == LifePayOrderTypeEnum.话费订单) { var extraProperties = JsonConvert.DeserializeObject<Model_UserAccountExtraProperties>(input.ExtraProperties); if (!string.IsNullOrEmpty(extraProperties.Name)) if (!string.IsNullOrEmpty(extraProperties.Name) && extraProperties.Phone == user.PhoneNumber) { user.Name = extraProperties.Name; } @@ -1476,10 +1532,17 @@ return; } if ((order.LifePayOrderStatus == LifePayOrderStatusEnum.已失败 && order.PayStatus == LifePayStatusEnum.待退款) || order.LifePayOrderStatus == LifePayOrderStatusEnum.退款待审核 || order.LifePayOrderStatus == LifePayOrderStatusEnum.待确认) if (order.LifePayOrderStatus == LifePayOrderStatusEnum.待退款) { order.LifePayOrderStatus = LifePayOrderStatusEnum.退款失败; if (order.ACOOLYStatus == ACOOLYStatusEnum.已完成 || order.ACOOLYStatus == ACOOLYStatusEnum.部分充值成功) { order.LifePayOrderStatus = LifePayOrderStatusEnum.已完成; } else if (order.ACOOLYStatus == ACOOLYStatusEnum.充值失败) { order.LifePayOrderStatus = LifePayOrderStatusEnum.退款失败; } order.RefundCheckRemark = input.RefundCheckRemark; order.RefundCheckUserId = CurrentUser.Id; @@ -1678,7 +1741,7 @@ order.FinishTime = DateTime.Now; break; case ACOOLYConstant.Code.PROCESSING: order.LifePayOrderStatus = LifePayOrderStatusEnum.待确认; order.LifePayOrderStatus = LifePayOrderStatusEnum.充值中; break; default: break; @@ -1906,6 +1969,55 @@ return result; } private async Task<IQueryable<LifePayOrderListOutput>> GetLifePayRefundOrderListFilter(QueryLifePayRefundOrderListInput input) { var result = (from a in _channelFilter.GetChannelLifePayOrderFilter(_lifePayOrderRepository) .Where(x => x.LifePayOrderStatus == LifePayOrderStatusEnum.待退款 || x.LifePayOrderStatus == LifePayOrderStatusEnum.已退款 || x.LifePayOrderStatus == LifePayOrderStatusEnum.退款中 || x.LifePayRefundStatus > LifePayRefundStatusEnum.无需退款) .WhereIf(input.BeginFinishTime.HasValue, x => x.FinishTime >= input.BeginFinishTime) .WhereIf(input.EndFinishTime.HasValue, x => x.FinishTime <= input.EndFinishTime) .WhereIf(input.BeginRefundApplyTime.HasValue, x => x.RefundApplyTime >= input.BeginRefundApplyTime) .WhereIf(input.LifePayType.HasValue, x => x.LifePayType == input.LifePayType) .WhereIf(input.EndRefundApplyTime.HasValue, x => x.RefundApplyTime <= input.EndRefundApplyTime) .WhereIf(input.LifePayOrderStatus.HasValue, x => x.LifePayOrderStatus == input.LifePayOrderStatus.Value) .WhereIf(input.ACOOLYStatus.HasValue, x => x.ACOOLYStatus == input.ACOOLYStatus.Value) .WhereIf(input.LifePayOrderType.HasValue, x => x.LifePayOrderType == input.LifePayOrderType.Value) .WhereIf(input.UserId.HasValue, x => x.UserId == input.UserId.Value) .WhereIf(input.KeyWords.IsNotNullOrEmpty(), x => x.PhoneNumber.Contains(input.KeyWords) || x.OrderNo.Contains(input.KeyWords) || x.OutOrderNo.Contains(input.KeyWords) || x.ACOOLYOrderNo.Contains(input.KeyWords)) join b in _lifePayChannlesRep on a.ChannelId equals b.ChannlesNum into temp from b in temp.DefaultIfEmpty() select new LifePayOrderListOutput { DiscountAmount = a.DiscountAmount, FinishTime = a.FinishTime, Id = a.Id, LifePayOrderStatus = a.LifePayOrderStatus, LifePayOrderType = a.LifePayOrderType, LifePayType = a.LifePayType, OrderNo = a.OrderNo, PayAmount = a.PayAmount, PhoneNumber = a.PhoneNumber, RechargeAmount = a.RechargeAmount, UserId = a.UserId, OutOrderNo = a.OutOrderNo, PayStatus = a.PayStatus, PayTime = a.PayTime, ACOOLYOrderNo = a.ACOOLYOrderNo, RefundCredentialsImgUrl = a.RefundCredentialsImgUrl.GetOssPath(), CreationTime = a.CreationTime, RefundCheckRemark = a.RefundCheckRemark, RefundApplyRemark = a.RefundApplyRemark, RefundApplyTime = a.RefundApplyTime, RefundTime = a.RefundTime, RefundPrice = a.RefundPrice, ChannelName = b.ChannlesName, ActualRechargeAmount = a.ActualRechargeAmount, PlatformDeductionAmount = a.PlatformDeductionAmount, ACOOLYStatus = a.ACOOLYStatus, LifePayRefundStatus = a.LifePayRefundStatus, }); return result; } private IQueryable<CreateEditPayChannelsInput> GetLifePayChannlesListFilter() { return _lifePayChannlesRep.Select(x => LifePayment/LifePayment.Application/LifePay/StatisticsService.cs
@@ -47,9 +47,9 @@ var accumulatedIncome = await _lifePayOrderRepository.Where(x => x.CreationTime < today).SumAsync(x => x.ActualRechargeAmount); var ordersNumYesterday = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today).CountAsync(); var yesterdaySuccess = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.LifePayOrderStatus == LifePayOrderStatusEnum.已完成).CountAsync(); var yesterdayFail = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.LifePayOrderStatus == LifePayOrderStatusEnum.已失败).CountAsync(); var yesterdayFail = await _lifePayOrderRepository.Where(x => x.CreationTime >= today.AddDays(-1) && x.CreationTime < today && x.LifePayOrderStatus == LifePayOrderStatusEnum.退款失败).CountAsync(); var accumulatedUsers = await _lifePayUserRepository.CountAsync(); var yesterdayActiveUsers = await _lifePayUserRepository.Where(x => x.LastLoginTime >= today.AddDays(-1)).CountAsync(); var entity = new DallyStatistics() { Id = GuidGenerator.Create(), @@ -62,6 +62,7 @@ YesterdaySuccess = yesterdaySuccess, YesterdayFail = yesterdayFail, AccumulatedUsers = accumulatedUsers, YesterdayActiveUsers = yesterdayActiveUsers }; await _dallyStatisticsRepository.InsertAsync(entity); @@ -75,6 +76,7 @@ YesterdaySuccess = entity.YesterdaySuccess, YesterdayFail = entity.YesterdayFail, AccumulatedUsers = entity.AccumulatedUsers, YesterdayActiveUsers = yesterdayActiveUsers }; return topStatisticsOutput; } LifePayment/LifePayment.Application/LifePaymentServicesApplicationModuleAutoMapperProfile.cs
@@ -14,6 +14,8 @@ CreateMap<CreateLifePayOrderInput, LifePayOrder>(MemberList.None); CreateMap<CreateEditPayChannelsInput, LifePayChannles>(MemberList.None); CreateMap<CreateBackClientUserInput, CreateAccountInput>(MemberList.None); #endregion } } LifePayment/LifePayment.Application/Setting/OperateHistoryService.cs
@@ -48,7 +48,6 @@ case OperateHistoryTypeEnum.AccountManage: query = query.Where(x => x.UserId == input.TypeId && LifePaymentConstant.LogsSpecies.AccountManageOperateNameList.Contains(x.OperateName)); break; case OperateHistoryTypeEnum.LifePayChannles: query = query.Where(x => x.RelationId == input.TypeId); LifePayment/LifePayment.Domain.Shared/Enum/LifePay/LifePayEnum.cs
@@ -41,10 +41,35 @@ 退款中 = 50, } //public enum LifePayOrderStatusEnum //{ // [Description("充值中")] // 待确认 = 10, // [Description("已失败")] // 已失败 = 20, // [Description("已完成")] // 已完成 = 30, // [Description("退款待审核")] // 退款待审核 = 40, // [Description("已退款")] // 已退款 = 50, // [Description("退款失败")] // 退款失败 = 60, // [Description("退款中")] // 退款中 = 70, //} public enum LifePayOrderStatusEnum { [Description("待确认")] 待确认 = 10, [Description("充值中")] 充值中 = 10, [Description("已失败")] 已失败 = 20, @@ -52,8 +77,8 @@ [Description("已完成")] 已完成 = 30, [Description("退款待审核")] 退款待审核 = 40, [Description("待退款")] 待退款 = 40, [Description("已退款")] 已退款 = 50, @@ -64,6 +89,7 @@ [Description("退款中")] 退款中 = 70, } public enum ACOOLYStatusEnum LifePayment/LifePayment.Domain.Shared/WeChat/WxPayPostBaseModel.cs
@@ -613,11 +613,11 @@ [JsonProperty("out_refund_no")] public string OutRefundNo { get; set; } /// <summary> /// 退款原因 /// </summary> [JsonProperty("reason")] public string Reason { get; set; } ///// <summary> ///// 退款原因 ///// </summary> //[JsonProperty("reason")] //public string Reason { get; set; } /// <summary> /// 退款结果回调url @@ -721,6 +721,13 @@ [JsonProperty("amount")] public Model_WxPayRetuenDomesticRefunds_Amount Amount { get; set; } /// <summary> /// 返回信息 /// </summary> [JsonProperty("message")] public string Message { get; set; } } public class Model_WxPayRetuenDomesticRefunds_Amount: Model_WxPayDomesticRefunds_Amount LifePayment/LifePayment.Domain/LifePay/LifePayOrder.cs
@@ -81,12 +81,12 @@ public string ACOOLYOrderNo { get; set; } /// <summary> /// 订单状态 /// 平台订单状态 /// </summary> public LifePayOrderStatusEnum LifePayOrderStatus { get; set; } /// <summary> /// 平台状态 /// 供应商状态 /// </summary> public ACOOLYStatusEnum? ACOOLYStatus { get; set; } LifePayment/LifePayment.Host/LifePaymentService.HttpApi.xml
@@ -104,6 +104,12 @@ </summary> <returns></returns> </member> <member name="M:LifePayment.HttpApi.LifePayController.GetChannelRate(LifePayment.Domain.Shared.ChannelsBaseInput)"> <summary> 获取渠道折扣 </summary> <returns></returns> </member> <member name="M:LifePayment.HttpApi.LifePayController.GetPremium"> <summary> 获取手续费费率 @@ -234,6 +240,13 @@ <param name="input"></param> <returns></returns> </member> <member name="M:LifePayment.HttpApi.LifePayController.GetLifePayRefudOrderPageExport(LifePayment.Application.Contracts.QueryLifePayRefundOrderListInput)"> <summary> 导出退款订单Excel </summary> <param name="input"></param> <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
@@ -42,9 +42,9 @@ <param name="outOrderNo"></param> <returns></returns> </member> <member name="M:LifePayment.Application.Contracts.ILifePayService.ACOOLYOrderNotifyHandler(System.String,System.String,LifePayment.Domain.Shared.LifePayOrderStatusEnum,LifePayment.Domain.Shared.ACOOLYStatusEnum,System.Decimal)"> <member name="M:LifePayment.Application.Contracts.ILifePayService.ACOOLYOrderNotifyHandler(System.String,System.String,LifePayment.Domain.Shared.LifePayOrderStatusEnum,LifePayment.Domain.Shared.ACOOLYStatusEnum,System.Decimal,System.String)"> <summary> 支付成功回调处理 供应商回调处理 </summary> <param name="orderNo"></param> <param name="acoolyOrderNo"></param> @@ -127,6 +127,12 @@ <member name="M:LifePayment.Application.Contracts.ILifePayService.GetRate"> <summary> 获取折扣 </summary> <returns></returns> </member> <member name="M:LifePayment.Application.Contracts.ILifePayService.GetChannelRate(LifePayment.Domain.Shared.ChannelsBaseInput)"> <summary> 获取渠道折扣 </summary> <returns></returns> </member> @@ -520,6 +526,11 @@ 订单状态 </summary> </member> <member name="P:LifePayment.Application.Contracts.QueryLifePayRefundOrderListInput.LifePayRefundStatus"> <summary> 订单状态 </summary> </member> <member name="P:LifePayment.Application.Contracts.QueryLifePayRefundOrderListInput.UserId"> <summary> 用户Id @@ -725,6 +736,11 @@ 订单号 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.RefundOrderNo"> <summary> 退款订单号 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderListOutput.RechargeAmount"> <summary> 充值金额 @@ -865,6 +881,51 @@ 完成时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayRefundOrderListTemplate.RefundApplyTimeStr"> <summary> 退款申请时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayRefundOrderListTemplate.CreationTime"> <summary> 下单时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayRefundOrderListTemplate.RechargeAmount"> <summary> 充值金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayRefundOrderListTemplate.ActualReceivedAmount"> <summary> 实际到账金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayRefundOrderListTemplate.PayAmount"> <summary> 实付金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayRefundOrderListTemplate.RefundPrice"> <summary> 退款金额 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayRefundOrderListTemplate.ACOOLYStatusStr"> <summary> 供应商订单状态 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayRefundOrderListTemplate.FinishTime"> <summary> 完成时间 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayRefundOrderListTemplate.LifePayRefundStatus"> <summary> 平台退款状态 </summary> </member> <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.LifePayType"> <summary> 生活缴费支付类型 @@ -938,6 +999,16 @@ <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.ACOOLYOrderNo"> <summary> 渠道流水号 </summary> </member> <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.LifePayRefundStatus"> <summary> 平台退款状态 </summary> </member> <member name="P:LifePayment.Application.Contracts.UserLifePayOrderOutput.ACOOLYStatus"> <summary> 平台状态 </summary> </member> <member name="P:LifePayment.Application.Contracts.LifePayOrderOutput.UserPhoneNumber"> @@ -1980,6 +2051,11 @@ 手机号 </summary> </member> <member name="P:LifePayment.Application.Contracts.CreateBackClientUserInput.Password"> <summary> 密码 </summary> </member> <member name="P:LifePayment.Application.Contracts.CreateBackClientUserInput.UserName"> <summary> 账户 LifePayment/LifePayment.HttpApi/LifePay/ACOOLYNotifyController.cs
@@ -52,10 +52,11 @@ } var baseInfo = JsonConvert.DeserializeObject<ACOOLYRequestBaseResponse>(body); var orderNo = string.Empty; LifePayOrderStatusEnum status = LifePayOrderStatusEnum.已失败; LifePayOrderStatusEnum status = LifePayOrderStatusEnum.待退款; ACOOLYStatusEnum acoolyStatus = ACOOLYStatusEnum.充值失败; var acoolyOrderNo = string.Empty; decimal payAmount = 0; string refundApplyRemark = string.Empty; _logger.LogError("ACOOLY回调通处理类型:" + baseInfo.Service); _logger.LogError("ACOOLY回调内容:" + body); switch (baseInfo.Service) @@ -70,7 +71,7 @@ if (!confirmElectricOrderResponse.Success || (confirmElectricOrderResponse.Code != ACOOLYConstant.Code.SUCCESS && confirmElectricOrderResponse.Code != ACOOLYConstant.Code.PROCESSING)) { status = LifePayOrderStatusEnum.已失败; status = LifePayOrderStatusEnum.待退款; acoolyStatus = ACOOLYStatusEnum.充值失败; } else @@ -82,14 +83,15 @@ else if (confirmElectricOrderResponse.ElectricChargeOrder.Status == ACOOLYConstant.Status.充值中) { status = LifePayOrderStatusEnum.待确认; status = LifePayOrderStatusEnum.充值中; acoolyStatus = ACOOLYStatusEnum.充值中; } else if (confirmElectricOrderResponse.ElectricChargeOrder.Status == ACOOLYConstant.Status.充值失败) { status = LifePayOrderStatusEnum.已失败; status = LifePayOrderStatusEnum.待退款; acoolyStatus = ACOOLYStatusEnum.充值失败; refundApplyRemark = "供应商充值失败"; } else if (confirmElectricOrderResponse.ElectricChargeOrder.Status == ACOOLYConstant.Status.退款中) @@ -106,7 +108,7 @@ else if (confirmElectricOrderResponse.ElectricChargeOrder.Status == ACOOLYConstant.Status.失败关闭) { status = LifePayOrderStatusEnum.已失败; status = LifePayOrderStatusEnum.待退款; acoolyStatus = ACOOLYStatusEnum.充值失败; } break; @@ -119,7 +121,7 @@ if (!confirmPhoneOrderResponse.Success || (confirmPhoneOrderResponse.Code != ACOOLYConstant.Code.SUCCESS && confirmPhoneOrderResponse.Code != ACOOLYConstant.Code.PROCESSING)) { status = LifePayOrderStatusEnum.已失败; status = LifePayOrderStatusEnum.待退款; acoolyStatus = ACOOLYStatusEnum.充值失败; } else @@ -133,13 +135,13 @@ if (confirmPhoneOrderResponse.PhoneChargeOrder.Status == ACOOLYConstant.Status.充值中) { status = LifePayOrderStatusEnum.待确认; status = LifePayOrderStatusEnum.充值中; acoolyStatus = ACOOLYStatusEnum.充值中; } else if (confirmPhoneOrderResponse.PhoneChargeOrder.Status == ACOOLYConstant.Status.充值失败) { status = LifePayOrderStatusEnum.已失败; status = LifePayOrderStatusEnum.待退款; acoolyStatus = ACOOLYStatusEnum.充值失败; } else @@ -157,7 +159,7 @@ else if (confirmPhoneOrderResponse.PhoneChargeOrder.Status == ACOOLYConstant.Status.失败关闭) { status = LifePayOrderStatusEnum.已失败; status = LifePayOrderStatusEnum.待退款; acoolyStatus = ACOOLYStatusEnum.充值失败; } break; @@ -170,7 +172,7 @@ if (!confirmGasOrderResponse.Success || (confirmGasOrderResponse.Code != ACOOLYConstant.Code.SUCCESS && confirmGasOrderResponse.Code != ACOOLYConstant.Code.PROCESSING)) { status = LifePayOrderStatusEnum.已失败; status = LifePayOrderStatusEnum.待退款; acoolyStatus = ACOOLYStatusEnum.充值失败; } else @@ -184,13 +186,13 @@ if (confirmGasOrderResponse.GasChargeOrder.Status == ACOOLYConstant.Status.充值中) { status = LifePayOrderStatusEnum.待确认; status = LifePayOrderStatusEnum.待退款; acoolyStatus = ACOOLYStatusEnum.充值中; } else if (confirmGasOrderResponse.GasChargeOrder.Status == ACOOLYConstant.Status.充值失败) { status = LifePayOrderStatusEnum.已失败; status = LifePayOrderStatusEnum.待退款; acoolyStatus = ACOOLYStatusEnum.充值失败; } else @@ -208,7 +210,7 @@ else if (confirmGasOrderResponse.GasChargeOrder.Status == ACOOLYConstant.Status.失败关闭) { status = LifePayOrderStatusEnum.已失败; status = LifePayOrderStatusEnum.待退款; acoolyStatus = ACOOLYStatusEnum.充值失败; } break; @@ -216,7 +218,7 @@ throw new UserFriendlyException("ACOOLY回调通处理类型不存在"); } await _lifePayService.ACOOLYOrderNotifyHandler(orderNo, acoolyOrderNo, status, acoolyStatus, payAmount); await _lifePayService.ACOOLYOrderNotifyHandler(orderNo, acoolyOrderNo, status, acoolyStatus, payAmount, refundApplyRemark); } } } LifePayment/LifePayment.HttpApi/LifePay/LifePayController.cs
@@ -150,6 +150,17 @@ } /// <summary> /// 获取渠道折扣 /// </summary> /// <returns></returns> [HttpPost] [AllowAnonymous] public async Task<ChannelRateOutput> GetChannelRate(ChannelsBaseInput input) { return await _lifePayService.GetChannelRate(input); } /// <summary> /// 获取手续费费率 /// </summary> /// <returns></returns> @@ -376,6 +387,24 @@ return Json(default); } /// <summary> /// 导出退款订单Excel /// </summary> /// <param name="input"></param> /// <returns></returns> [HttpPost] public async Task<ActionResult> GetLifePayRefudOrderPageExport(QueryLifePayRefundOrderListInput input) { var data = await _lifePayService.GetLifePayRefudOrderPageExport(input); if (data.Any()) { var bytes = ExcelHelper.ListToByteForExcel(data, "xlsx"); return File(bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "退款管理" + ".xlsx"); } return Json(default); } [HttpGet] public async Task<string> GetBillErceiptExport(string orderNo) {