DOVER-GLOBAL\11047086 7 mesi fa
parent
commit
a3b069b231

+ 14 - 4
FuelCloud/Fuel.Application/Authorization/Authorization.cs

@@ -12,13 +12,23 @@ namespace Fuel.Core
 {
     public  class Authorization
     {
-        private  static IUserService _userService;
+        private   IUserService _userService;
 
-        public  Authorization(IUserService userService)
+        //public  Authorization(IUserService userService)
+        //{
+        //    _userService = ServiceLocator.GetRequiredService<IUserService>();
+        //}
+        //public static  List<string> GetPermissions()
+        //{
+        //    var permissions =   _userService.GetUserPermissions();
+        //    return permissions;
+        //}
+        public Authorization(IUserService userService)
         {
-            _userService = ServiceLocator.GetRequiredService<IUserService>();
+            _userService = userService;
         }
-        public static List<string> GetPermissions()
+
+        public List<string> GetPermissions()
         {
             var permissions = _userService.GetUserPermissions();
             return permissions;

+ 1 - 1
FuelCloud/Fuel.Application/Authorization/PermissionHandler.cs

@@ -37,7 +37,7 @@ namespace Fuel.Application.Authorization
            // var userId = userIdClaim.Value;
             int userId = int.TryParse(userIdClaim.Value, out int number) ? number : 0;
             // 查询用户的权限列表
-            var permissions = await _userService.GetUserPermissions(userId);
+            var permissions =   _userService.GetUserPermissions(userId);
 
             // 检查用户是否有足够的权限
             if (permissions.Contains(requirement.Permission))

+ 4 - 0
FuelCloud/Fuel.Application/Service/ITransactionsService.cs

@@ -17,5 +17,9 @@ namespace Fuel.Application.Service
         Task<ServiceResponse> CommitPayment(int trxId, string AuthCode);
         Task<ServiceResponse> GetMiniProgramTransactionsUnpaidAsync(TransactionsInput input);
         Task<ServiceResponse> GetMiniProgramTransactionsPaidAsync(TransactionsInput input);
+        Task<ServiceResponse> RefundTrx(int trxId,
+            double longitude,
+            double latitude);
+        Task<ServiceResponse> Redeem(int trxId, decimal OriginalQty);
     }
 }

+ 91 - 1
FuelCloud/Fuel.Application/Service/TransactionsService.cs

@@ -7,6 +7,7 @@ using Fuel.Core.Models;
 using System.Net;
 using Fuel.Payment.Service.Pay;
 using DFS.Core.Abstractions.View;
+using Fuel.Core;
 
 
 namespace Fuel.Application.Service
@@ -102,7 +103,7 @@ namespace Fuel.Application.Service
         /// 小程序查询未支付订单
         /// </summary>
         /// <returns></returns>
-        public async Task<ServiceResponse> GetMiniProgramTransactionsUnpaidAsync(TransactionsInput input) 
+        public async Task<ServiceResponse> GetMiniProgramTransactionsUnpaidAsync(TransactionsInput input)
         {
             string Buid = _httpContextAccessor.HttpContext.Request.Headers["Buid"].FirstOrDefault();
             Guid guid = Guid.Parse(Buid);
@@ -184,6 +185,95 @@ namespace Fuel.Application.Service
             Expression body = Expression.AndAlso(expr1.Body, Expression.Invoke(expr2, param));
             return Expression.Lambda<Func<T, bool>>(body, param);
         }
+        /// <summary>
+        /// 退款
+        /// </summary>
+        /// <param name="input"></param>
+        /// <returns></returns>
+        public async Task<ServiceResponse> RefundTrx(int trxId,
+            double longitude,
+            double latitude)
+        {
+            string Buid = _httpContextAccessor.HttpContext.Request.Headers["Buid"].FirstOrDefault();
+            Guid guid = Guid.Parse(Buid);
+            var businessunitinfo = _entityHelper.GetEntitiesAsync<businessunitinfo>(_ => _.Buid == guid).Result.FirstOrDefault();
+            if (businessunitinfo == null)
+            {
+                return ServiceResponse.Error(HttpStatusCode.NotAcceptable, "站点为空");
+            }
+            string[] parts = businessunitinfo.GpsCoordinates.Split(',');
+            if (parts.Length == 2 &&
+           double.TryParse(parts[0], out double latitude2) &&
+           double.TryParse(parts[1], out double longitude2))
+            {
+
+            }
+            else
+            {
+                return ServiceResponse.Error(HttpStatusCode.NotAcceptable, "站点经纬度获取失败");
+            }
+            //计算调用方和油站的距离,超过距离判定为恶意请求
+            double distance = DistanceCalculator.CalculateDistance(longitude, latitude, longitude2, latitude2);
+            if (distance > 5)
+            {
+                return ServiceResponse.Error(HttpStatusCode.NotAcceptable, "该请求大于油站地址5公里");
+            }
+
+            var trx = _entityHelper.GetEntitiesAsync<transactions>(_ => _.Id == trxId).Result.FirstOrDefault();
+            if (trx == null)
+            {
+                return ServiceResponse.Error(HttpStatusCode.NotAcceptable, "未查询到订单!");
+            }
+            else if (trx.OrderStatus == transactionsORDERSTATUS.FullyRefunded)
+            {
+                return ServiceResponse.Error(HttpStatusCode.NotAcceptable, "该订单已退款");
+            }
+            else if (trx.OrderStatus == transactionsORDERSTATUS.PartiallyRefunded)
+            {
+                return ServiceResponse.Error(HttpStatusCode.NotAcceptable, "该订单已部分退款");
+            }
+            else if (trx.OrderStatus == transactionsORDERSTATUS.Unpaid)
+            {
+                return ServiceResponse.Error(HttpStatusCode.NotAcceptable, "该订单未支付");
+            }
+            else if (trx.OrderStatus == transactionsORDERSTATUS.Unpaid)
+            {
+                return ServiceResponse.Error(HttpStatusCode.NotAcceptable, "该订单未支付");
+            }
+            //获取单价
+            decimal? ProductPrice = _entityHelper.GetEntitiesAsync<product>(_ => _.Id == trx.ProductId).Result.FirstOrDefault().ProductPrice;
+            if (ProductPrice == null)
+            {
+                return ServiceResponse.Error(HttpStatusCode.NotAcceptable, "单价获取失败");
+            }
+            //计算退款金额
+            decimal RefundAmount = (decimal)((trx.Qty - trx.OriginalQty) * ProductPrice.Value);
+            if (RefundAmount <= 0.0M)
+            {
+                return ServiceResponse.Error(HttpStatusCode.NotAcceptable, "该笔单无需退款");
+            }
+            //退款
+            var serviceResult = await _payService.ReturnProcess(RefundAmount, trx.TransactionNumber);
+            Payment.Core.Models.ElectronicOrderProcessResultModel payResult = (Payment.Core.Models.ElectronicOrderProcessResultModel)serviceResult.Data;
+            if (!serviceResult.IsSuccessful() || payResult.ResultCode == "PAY_ERROR")
+            {
+                return ServiceResponse.Error(HttpStatusCode.NotAcceptable, "退款失败");
+            }
 
+            trx.RefundAmount = RefundAmount;
+            _entityHelper.UpdateAsync(trx);
+            return ServiceResponse.Ok(trx);
+        }
+        public async Task<ServiceResponse> Redeem(int trxId, decimal OriginalQty)
+        {
+            var trx = _entityHelper.GetEntitiesAsync<transactions>(_ => _.Id == trxId).Result.FirstOrDefault();
+            if (trx == null)
+            {
+                return ServiceResponse.Error(HttpStatusCode.NotAcceptable, "未查询到订单!");
+            }
+            trx.OriginalQty = OriginalQty;
+            _entityHelper.UpdateAsync(trx);
+            return ServiceResponse.Ok(trx);
+        }
     }
 }

+ 8 - 8
FuelCloud/Fuel.Application/Service/UserService.cs

@@ -24,21 +24,21 @@ namespace Fuel.Application.Service
         /// </summary>
         /// <param name="userId">1 超级管理员</param>
         /// <returns></returns>
-        public async Task<IEnumerable<string>> GetUserPermissions(int userId = 1)
+        public List<string> GetUserPermissions(int userId = 1)
         {
-              var Permission =  _fsql.Select<users, AdUserRole,AdRolePermission,AdPermission>()
-    .LeftJoin((a, b, c,d) => a.Id == b.UserId)
-    .LeftJoin((a, b, c, d) => b.RoleId == c.RoleId)
-    .LeftJoin((a, b, c, d) => c.PermissionId == d.Id)
-    .Where((a, b, c, d) => a.Id == userId)
-    .ToList((a, b, c, d) => new { d });
+            var Permission = _fsql.Select<users, AdUserRole, AdRolePermission, AdPermission>()
+  .LeftJoin((a, b, c, d) => a.Id == b.UserId)
+  .LeftJoin((a, b, c, d) => b.RoleId == c.RoleId)
+  .LeftJoin((a, b, c, d) => c.PermissionId == d.Id)
+  .Where((a, b, c, d) => a.Id == userId)
+  .ToList((a, b, c, d) => new { d });
             var permissionList = new List<string>();
             foreach (var permission in Permission)
             {
                 permissionList.Add(permission.d.Code);
             }
             return permissionList;
-        });
+
         }
     }
 }

+ 28 - 0
FuelCloud/src/Fuel.Payment.Server/Controllers/TransactionsController.cs

@@ -81,5 +81,33 @@ namespace Fuel.PaymentServer.Controllers
             var serviceResult = await _transactionsService.CommitPayment(trxId, AuthCode);
             return Ok(serviceResult);
         }
+
+        /// <summary>
+        /// 退款、退余额
+        /// </summary>
+        /// <param name="trxId">订单id</param>
+        /// <param name="longitude">经度</param>
+        /// <param name="latitude">纬度</param>
+        /// <returns></returns>
+        [Route("Refund")]
+        [HttpPost]
+        public async Task<IActionResult> RefundTrx(int trxId, double longitude,double latitude)
+        {
+            var serviceResult = await _transactionsService.RefundTrx( trxId,  longitude,  latitude);
+            return Ok(serviceResult);
+        }
+        /// <summary>
+        /// 核销
+        /// </summary>
+        /// <param name="trxId"></param>
+        /// <param name="OriginalQty">实际加油升数</param>
+        /// <returns></returns>
+        [Route("Redeem")]
+        [HttpPost]
+        public async Task<IActionResult> Redeem(int trxId,decimal OriginalQty)
+        {
+            var serviceResult = await _transactionsService.Redeem(trxId, OriginalQty);
+            return Ok(serviceResult);
+        }
     }
 }

+ 18 - 6
FuelCloud/src/Fuel.Payment.Server/Program.cs

@@ -19,6 +19,7 @@ using Microsoft.Extensions.Logging;
 using Fuel.Core;
 using Microsoft.AspNetCore.Authorization;
 using Fuel.Application.Authorization;
+using Microsoft.Extensions.DependencyInjection;
 
 var builder = WebApplication.CreateBuilder(args);
 builder.Services.AddScoped<IPayService, PayService>();
@@ -55,13 +56,24 @@ builder.Services.UseRedisClient(redisOptions);
 // 动态添加基于权限的策略
 void AddPermissionPolicies(AuthorizationOptions options)
 {
-    // 获取权限点
-    var permissions = Authorization.GetPermissions();
-
-    foreach (var permission in permissions)
+    //var permissions = Authorization.GetPermissions();
+
+    //foreach (var permission in permissions)
+    //{
+    //    options.AddPolicy($"Permission_{permission}", policy =>
+    //        policy.Requirements.Add(new PermissionRequirement(permission)));
+    //}
+    using (var scope = builder.Services.BuildServiceProvider().CreateScope())
     {
-        options.AddPolicy($"Permission_{permission}", policy =>
-            policy.Requirements.Add(new PermissionRequirement(permission)));
+        var userService = scope.ServiceProvider.GetRequiredService<IUserService>();
+        var authorization = new Authorization(userService);
+        var permissions = authorization.GetPermissions();
+
+        foreach (var permission in permissions)
+        {
+            options.AddPolicy($"Permission_{permission}", policy =>
+                policy.Requirements.Add(new PermissionRequirement(permission)));
+        }
     }
 }
 

+ 1 - 1
FuelCloud/src/Fuel.Payment.Service/Pay/IPayService.cs

@@ -11,6 +11,6 @@ namespace Fuel.Payment.Service.Pay
     public interface IPayService
     {
         Task<ServiceResponse> PerformElectronicProcess(string AuthCode, decimal payDueAmount, string Channel = "ALL_IN_SCAN", string preCreatedBillNumber = "");
-            
+        Task<ServiceResponse> ReturnProcess(decimal payDueAmount, string Channel = "ALL_IN_SCAN", string preCreatedBillNumber = "");
     }
 }

+ 34 - 0
FuelCloud/src/Fuel.Payment.Service/Pay/PayService.cs

@@ -51,6 +51,40 @@ namespace Fuel.Payment.Service.Pay
             //var Result = await eProcessor.PaymentResult(genericResponseAlipay, eOrder).ConfigureAwait(false);
             return new ServiceResponse { StatusCode = HttpStatusCode.OK, Data = genericResponseAlipay.ProcessResults.Last() };
         }
+        /// <summary>
+        /// 支付处理
+        /// </summary>
+        /// <param name="AuthCode"></param>
+        /// <returns></returns>
+        public async Task<ServiceResponse> ReturnProcess(
+            decimal payDueAmount,
+            string Channel = "ALL_IN_SCAN",
+            string preCreatedBillNumber = "")
+        {
+            if (string.IsNullOrEmpty(preCreatedBillNumber))
+            {
+                preCreatedBillNumber = SequenceNumber.Next();
+            }
+            ElectronicOrderModel eOrder = new ElectronicOrderModel
+            {
+                Channel = Channel,
+                IsRefund = false,
+                AuthCode = "",
+                BillNumber = preCreatedBillNumber,
+                NetAmount = payDueAmount,
+                Title = "Wayne Payment",
+                FuelOrderDetails = new List<FuelOrderDetailModel>(),
+                OperatorId = "001",
+                SiteId = "66668888",
+                Config = ""
+            };
+            var eProcessor = AsyncPaymentProcessorFactory.Default.Get(eOrder);
+            //var payConfig = await eProcessor.Initialize(eOrder).ConfigureAwait(false);
+            //eOrder.Config = payConfig.electronicOrderModel?.Config;
+            var genericResponseAlipay = await eProcessor.Return(eOrder).ConfigureAwait(false);
+            //var Result = await eProcessor.PaymentResult(genericResponseAlipay, eOrder).ConfigureAwait(false);
+            return new ServiceResponse { StatusCode = HttpStatusCode.OK, Data = genericResponseAlipay.ProcessResults.Last() };
+        }
         private string GetPaymentChannelByPaymentId(PaymentID paymentID)
         {
             var channel = String.Empty;

+ 42 - 0
FuelCloud/src/FuelServer.Core/DistanceCalculator.cs

@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Fuel.Core
+{
+    public class DistanceCalculator
+    {
+        // 地球半径(单位:公里)
+        private const double EarthRadiusKm = 6371.0;
+
+        /// <summary>
+        /// 使用Haversine公式计算两点之间的距离。
+        /// </summary>
+        /// <param name="lat1">第一个点的纬度。</param>
+        /// <param name="lon1">第一个点的经度。</param>
+        /// <param name="lat2">第二个点的纬度。</param>
+        /// <param name="lon2">第二个点的经度。</param>
+        /// <returns>两点之间的距离(单位:公里)。</returns>
+        public static double CalculateDistance(double lat1, double lon1, double lat2, double lon2)
+        {
+            var lat1Rad = DegreesToRadians(lat1);
+            var lat2Rad = DegreesToRadians(lat2);
+            var deltaLat = DegreesToRadians(lat2 - lat1);
+            var deltaLon = DegreesToRadians(lon2 - lon1);
+
+            var a = Math.Sin(deltaLat / 2) * Math.Sin(deltaLat / 2) +
+                    Math.Cos(lat1Rad) * Math.Cos(lat2Rad) *
+                    Math.Sin(deltaLon / 2) * Math.Sin(deltaLon / 2);
+            var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
+
+            return EarthRadiusKm * c; // 返回结果为公里
+        }
+
+        private static double DegreesToRadians(double degrees)
+        {
+            return degrees * (Math.PI / 180);
+        }
+    }
+}

+ 28 - 8
FuelCloud/src/FuelServer.Core/Entity/transactions.cs

@@ -107,15 +107,20 @@ namespace FuelServer.Core.Entity
 		public string ProductName { get; set; }
 
 		/// <summary>
-		/// 升数
+		/// 升数
 		/// </summary>
 		[JsonProperty]
 		public decimal Qty { get; set; }
+        /// <summary>
+        /// 实际加油升数
+        /// </summary>
+        [JsonProperty]
+        public decimal? OriginalQty { get; set; }
 
-		/// <summary>
-		/// 退款金额
-		/// </summary>
-		[JsonProperty]
+        /// <summary>
+        /// 退款金额
+        /// </summary>
+        [JsonProperty]
 		public decimal? RefundAmount { get; set; }
 
 		/// <summary>
@@ -150,8 +155,23 @@ namespace FuelServer.Core.Entity
         /// </summary>
         [JsonProperty, Column(StringLength = 20, IsNullable = false)]
         public string ResultCode { get; set; }
+		/// <summary>
+		/// 是否授权
+		/// </summary>
+		public AuthorizationStatus authorizationStatus { get; set; }
     }
+    public enum AuthorizationStatus
+    {
+        /// <summary>
+        /// 未授权
+        /// </summary>
+        Unauthorized,
 
+        /// <summary>
+        /// 授权
+        /// </summary>
+        Authorized
+    }
     public enum transactionsORDERSTATUS
     {
         /// <summary>
@@ -167,15 +187,15 @@ namespace FuelServer.Core.Entity
         /// <summary>
         /// 订单正在支付中。
         /// </summary>
-        Paying,
+        //Paying,
 
         /// <summary>
-        /// 订单全额退款。
+        /// 订单全额退款。
         /// </summary>
         FullyRefunded,
 
         /// <summary>
-        /// 订单部分退款。
+        /// 订单部分退款。
         /// </summary>
         PartiallyRefunded,