Quellcode durchsuchen

Merge branch 'test' of http://110.188.24.182:10023/Fengwo/hotline into test

xf vor 4 Monaten
Ursprung
Commit
a83889e96f

+ 6 - 1
src/Hotline.Api/StartupExtensions.cs

@@ -40,6 +40,9 @@ using Microsoft.AspNetCore.ResponseCompression;
 using Senparc.Weixin.RegisterServices;
 using Senparc.Weixin.AspNet;
 using Hotline.WeChat;
+using Hotline.Orders;
+using XF.Domain.Repository.Events;
+using Hotline.Orders.DatabaseEventHandler;
 
 
 namespace Hotline.Api;
@@ -184,6 +187,8 @@ internal static class StartupExtensions
                 break;
         }
 
+        //services.AddScoped(typeof(IUpdateDatabase<>), typeof(UpdateDatabase<>));
+        services.AddScoped<IUpdateDatabaseEvent<OrderVisit>, OrderVisitEventHandler>();
 
         //sqlsugar
         services.AddSqlSugar(configuration);
@@ -256,7 +261,7 @@ internal static class StartupExtensions
         //app.UseRequestResponseLogging(app.Configuration);
         
         app.UseResponseCompression();
-        
+
         return app;
     }
 }

+ 0 - 1
src/Hotline.Application/Orders/OrderApplication.cs

@@ -1198,7 +1198,6 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         await _workflowDomainService.HandleVisitTraceAsync(visit.Id, visitor, visit.VisitTime ?? DateTime.Now, cancellationToken);
 
         var orderDto = _mapper.Map<OrderDto>(visit.Order);
-        await _publisher.PublishAsync(new UpdateOrderVisitNotify(visit.Adapt<OrderVisitNotifyDto>()), cancellationToken);
         if (first != null)
         {
             //推省上

+ 0 - 40
src/Hotline.Application/Orders/OrderVisitHandler/OrderVisitUpdateHandler.cs

@@ -1,40 +0,0 @@
-using DotNetCore.CAP;
-using Hotline.Application.Quality;
-using Hotline.Orders;
-using Hotline.Orders.Notifications;
-using Hotline.Share.Dtos.Order;
-using Hotline.Share.Enums.Order;
-using Hotline.Share.Enums.Quality;
-using Hotline.Users;
-using Mapster;
-using MediatR;
-using XF.Domain.Repository;
-
-namespace Hotline.Application.Orders.OrderVisitHandler;
-public class OrderVisitUpdateHandler : INotificationHandler<UpdateOrderVisitNotify>
-{
-    private readonly IOrderRepository _orderRepository;
-    private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
-
-    public OrderVisitUpdateHandler(IOrderRepository orderRepository, IRepository<OrderVisitDetail> orderVisitDetailRepository)
-    {
-        _orderRepository = orderRepository;
-        _orderVisitDetailRepository = orderVisitDetailRepository;
-    }
-
-    public async Task Handle(UpdateOrderVisitNotify notification, CancellationToken cancellationToken)
-    {
-        var visit = notification.orderVisit;
-
-        var orgDetail = await _orderVisitDetailRepository.Queryable()
-            .Where(m => m.VisitId == visit.Id && m.VisitTarget == EVisitTarget.Org).FirstAsync(cancellationToken);
-        var seatDetail = await _orderVisitDetailRepository.Queryable()
-            .Where(m => m.VisitId == visit.Id && m.VisitTarget == EVisitTarget.Seat).FirstAsync(cancellationToken);
-
-        await _orderRepository.Updateable()
-            .SetColumns(m => m.OrgProcessingResults == orgDetail.OrgProcessingResults)
-            .SetColumns(m => m.SeatEvaluate == seatDetail.SeatEvaluate)
-            .Where(m => m.Id == visit.OrderId)
-            .ExecuteCommandAsync(cancellationToken);
-    }
-}

+ 17 - 7
src/Hotline.Repository.SqlSugar/Extensions/SqlSugarStartupExtensions.cs

@@ -1,4 +1,5 @@
-using System.Collections;
+using System;
+using System.Collections;
 using System.ComponentModel;
 using System.ComponentModel.DataAnnotations;
 using System.Diagnostics;
@@ -9,7 +10,9 @@ using System.Text.Encodings.Web;
 using System.Text.Json;
 using System.Text.RegularExpressions;
 using System.Text.Unicode;
+using Hotline.Share.Tools;
 using Hotline.Users;
+using Microsoft.AspNetCore.Builder;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.DependencyInjection;
 using Serilog;
@@ -18,6 +21,7 @@ using XF.Domain.Entities;
 using XF.Domain.Extensions;
 using XF.Domain.Options;
 using XF.Domain.Repository;
+using XF.Domain.Repository.Events;
 using XF.Utility.SequentialId;
 
 namespace Hotline.Repository.SqlSugar.Extensions
@@ -26,6 +30,7 @@ namespace Hotline.Repository.SqlSugar.Extensions
     {
         public static void AddSqlSugar(this IServiceCollection services, IConfiguration configuration, string dbName = "Hotline")
         {
+            services.AddScoped<DatabaseEventDispatcher>();
             //多租户 new SqlSugarScope(List<ConnectionConfig>,db=>{});
 
             SqlSugarScope sqlSugar = new SqlSugarScope(new ConnectionConfig()
@@ -115,7 +120,10 @@ namespace Hotline.Repository.SqlSugar.Extensions
                     PgSqlIsAutoToLowerCodeFirst = false, // 建表建驼峰表。5.1.3.30 
                 }
             },
-                SetDbAop
+                db => 
+                {
+                    SetDbAop(db, services);
+                }
             );
 
             ISugarUnitOfWork<HotlineDbContext> context = new SugarUnitOfWork<HotlineDbContext>(sqlSugar);
@@ -204,7 +212,7 @@ namespace Hotline.Repository.SqlSugar.Extensions
 
         #region private
 
-        private static void SetDbAop(SqlSugarClient db)
+        private static void SetDbAop(SqlSugarClient db, IServiceCollection services)
         {
             /***写AOP等方法***/
             db.Aop.OnLogExecuting = (sql, pars) =>
@@ -262,13 +270,15 @@ namespace Hotline.Repository.SqlSugar.Extensions
             {
                 if (entityInfo.EntityColumnInfo.IsPrimarykey && entityInfo.OperationType == DataFilterType.UpdateByObject)
                 {
-                    var entityName = entityInfo.EntityName;
-                    Console.WriteLine(entityName);
+                    services.BuildServiceProvider()
+                    .GetService<DatabaseEventDispatcher>()?
+                    .Dispatch(entityInfo.EntityValue, entityInfo.OperationType);
                 }
                 if (entityInfo.EntityColumnInfo.IsPrimarykey && entityInfo.OperationType == DataFilterType.InsertByObject)
                 {
-                    var entityName = entityInfo.EntityName;
-                    Console.WriteLine(entityName);
+                    services.BuildServiceProvider()
+                    .GetService<DatabaseEventDispatcher>()?
+                    .Dispatch(entityInfo.EntityValue, entityInfo.OperationType);
                 }
             };
 

+ 46 - 0
src/Hotline/Orders/DatabaseEventHandler/OrderVisitEventHandler.cs

@@ -0,0 +1,46 @@
+using Hotline.Share.Enums.Order;
+using XF.Domain.Repository;
+using XF.Domain.Repository.Events;
+
+namespace Hotline.Orders.DatabaseEventHandler;
+
+/// <summary>
+/// OrderVisit 更新数据后执行事务处理
+/// 更新 order 表中的 OrgProcessingResults 和 SeatEvaluate 字段
+/// </summary>
+public class OrderVisitEventHandler : IUpdateDatabaseEvent<OrderVisit>
+{
+    private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
+    private readonly IOrderRepository _orderRepository;
+
+    public OrderVisitEventHandler(IOrderRepository orderRepository, IRepository<OrderVisitDetail> orderVisitDetailRepository)
+    {
+        _orderRepository = orderRepository;
+        _orderVisitDetailRepository = orderVisitDetailRepository;
+    }
+
+    public void OnInsert(OrderVisit entity)
+    {
+        OrderUpdate(entity);
+    }
+
+    public void OnUpdate(OrderVisit entity)
+    {
+        OrderUpdate(entity);
+    }
+
+    private void OrderUpdate(OrderVisit visit)
+    {
+        if (visit.VisitState != EVisitState.Visited) return;
+        var orgDetail = _orderVisitDetailRepository.Queryable()
+            .Where(m => m.VisitId == visit.Id && m.VisitTarget == EVisitTarget.Org).First();
+        var seatDetail = _orderVisitDetailRepository.Queryable()
+            .Where(m => m.VisitId == visit.Id && m.VisitTarget == EVisitTarget.Seat).First();
+
+        _orderRepository.Updateable()
+            .SetColumns(m => m.OrgProcessingResults == orgDetail.OrgProcessingResults)
+            .SetColumns(m => m.SeatEvaluate == seatDetail.SeatEvaluate)
+            .Where(m => m.Id == visit.OrderId)
+            .ExecuteCommand();
+    }
+}

+ 0 - 10
src/Hotline/Orders/Notifications/UpdateOrderVisitNotify.cs

@@ -1,10 +0,0 @@
-using Hotline.Share.Dtos.Order;
-using MediatR;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Hotline.Orders.Notifications;
-public record UpdateOrderVisitNotify(OrderVisitNotifyDto orderVisit) : INotification;

+ 0 - 1
src/Hotline/Orders/OrderDomainService.cs

@@ -278,7 +278,6 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         await _orderVisitDetailRepository.AddRangeAsync(visitedDetail, cancellationToken);
         await _publisher.PublishAsync(new ContingencyManagementNotify(order, order.Title, order.Content, order.ActualOpinion),
     PublishStrategy.ParallelWhenAll, cancellationToken);
-        await _publisher.PublishAsync(new UpdateOrderVisitNotify(orderVisit.Adapt<OrderVisitNotifyDto>()), cancellationToken);
 
         //handle publish trace
         var acceptor = new UserInfo(orderPublish.CreatorId, orderPublish.CreatorName,

+ 0 - 1
src/Hotline/Orders/OrderVisitDomainService.cs

@@ -176,7 +176,6 @@ public class OrderVisitDomainService : IOrderVisitDomainService, IScopeDependenc
                 await _orderVisitDetailRepository.UpdateAsync(detailSeat);
             });
 
-        await _publisher.PublishAsync(new UpdateOrderVisitNotify(orderVisit.Adapt<OrderVisitNotifyDto>()), cancellationToken: CancellationToken.None);
 
         if (orderVisit.VisitState != EVisitState.Visited) return;
         orderVisit.Order.Visited(visitSatisfactionKv.Key, visitSatisfactionKv.Value);

+ 35 - 0
src/XF.Domain.Repository/Events/DatabaseEventDispatcher.cs

@@ -0,0 +1,35 @@
+using Microsoft.Extensions.DependencyInjection;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XF.Domain.Repository.Events;
+public class DatabaseEventDispatcher
+{
+    private readonly IServiceProvider _serviceProvider;
+
+    public DatabaseEventDispatcher(IServiceProvider serviceProvider)
+    {
+        _serviceProvider = serviceProvider;
+    }
+
+    public void Dispatch<TEntity>(TEntity entity, DataFilterType operationType) where TEntity : new()
+    {
+        var targetInterface = typeof(IUpdateDatabaseEvent<>).MakeGenericType(entity.GetType());
+        var handler = _serviceProvider.GetService(targetInterface);
+        if (handler == null) return;
+
+        switch (operationType)
+        {
+            case DataFilterType.UpdateByObject:
+                targetInterface?.GetMethod("OnUpdate")?.Invoke(handler,[entity]);
+                break;
+            case DataFilterType.InsertByObject:
+                targetInterface?.GetMethod("OnInsert")?.Invoke(handler, [entity]);
+                break;
+        }
+    }
+}

+ 13 - 0
src/XF.Domain.Repository/Events/IUpdateDatabaseEvent.cs

@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace XF.Domain.Repository.Events;
+
+public interface IUpdateDatabaseEvent<TEntity> where TEntity : new()
+{
+    void OnUpdate(TEntity entity);
+    void OnInsert(TEntity entity);
+}