xf 2 هفته پیش
والد
کامیت
07ab2e7387

+ 1 - 0
src/Hotline.Api/Controllers/Bi/BiOrderController.cs

@@ -23,6 +23,7 @@ using Hotline.Share.Dtos.Bi;
 using Hotline.Share.Dtos.Bigscreen;
 using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Dtos.Order.OrderDelay;
 using Hotline.Share.Enums.CallCenter;
 using Hotline.Share.Enums.FlowEngine;
 using Hotline.Share.Enums.Order;

+ 2 - 1
src/Hotline.Api/Controllers/OrderApi/OrderDelayController.cs

@@ -37,7 +37,8 @@ public class OrderDelayController : BaseController
     /// <summary>
     /// 延期审核
     /// </summary>
-    public Task ReviewAsync(OrderDelayReviewRequest request) =>
+    [HttpPost("review")]
+    public Task ReviewAsync([FromBody]OrderDelayReviewRequest request) =>
         _orderDelayApplication.ReviewAsync(request, HttpContext.RequestAborted);
 
 

+ 32 - 3
src/Hotline.Api/Controllers/TestController.cs

@@ -64,6 +64,7 @@ using NETCore.Encrypt;
 using NETCore.Encrypt.Internal;
 using SqlSugar;
 using System.Text;
+using Hotline.BatchTask;
 using XC.RSAUtil;
 using XF.Domain.Authentications;
 using XF.Domain.Cache;
@@ -75,6 +76,9 @@ using XF.Domain.Repository;
 using Order = Hotline.Orders.Order;
 using OrderDto = Hotline.Share.Dtos.Order.OrderDto;
 using Hotline.Schedulings;
+using Hotline.Share.Dtos.BatchTask;
+using Hotline.Share.Enums.BatchTask;
+using Hotline.Application.OrderApp.OrderVisitApp;
 
 namespace Hotline.Api.Controllers;
 
@@ -138,6 +142,7 @@ public class TestController : BaseController
     private readonly IRepository<OrderSecondaryHandling> _orderSecondaryHandlingRepository;
     private readonly IRepository<Message> _messageRepository; 
     private readonly IRepository<Scheduling> _schedulingRepository;
+    private readonly IApptaskDomainService _apptaskDomainService;
 
 
     public TestController(
@@ -196,9 +201,9 @@ public class TestController : BaseController
         IRepository<OrderVisit> orderVisitRepository,
         IServiceProvider serviceProvider,
         IRepository<OrderSecondaryHandling> orderSecondaryHandlingRepository,
-        IRepository<Message> messageRepository
-,
-        IRepository<Scheduling> schedulingRepository)
+        IRepository<Message> messageRepository,
+        IRepository<Scheduling> schedulingRepository,
+        IApptaskDomainService apptaskDomainService)
     {
         _logger = logger;
         _options = options;
@@ -253,6 +258,7 @@ public class TestController : BaseController
         _orderSecondaryHandlingRepository = orderSecondaryHandlingRepository;
         _messageRepository = messageRepository;
         _schedulingRepository = schedulingRepository;
+        _apptaskDomainService = apptaskDomainService;
     }
     /// <summary>
     /// 测试
@@ -1602,5 +1608,28 @@ public class TestController : BaseController
 
         return $"共计: {total}, 成功:{successed}";
     }
+
+    [AllowAnonymous]
+    [HttpGet("addapptask")]
+    public async Task AddAppTask()
+    {
+        await _apptaskDomainService.AddAsync(new AddApptaskRequest
+        {
+            TaskType = ETaskType.VoiceVisit,
+            TryLimit = 5,
+            ApptaskItems = new List<AddApptaskItemRequest>
+            {
+                new AddApptaskItemRequest
+                {
+                    BusinessId = Ulid.NewUlid().ToString(),
+                    TaskParams = new VoiceVisitRequest
+                    {
+                        PhoneNo = "15881089499",
+                        VisitId = Ulid.NewUlid().ToString()
+                    }
+                }
+            }
+        }, HttpContext.RequestAborted);
+    }
 }
 

+ 20 - 13
src/Hotline.Api/StartupHelper.cs

@@ -260,7 +260,7 @@ namespace Hotline.Api
             return services;
         }
 
-        public static IServiceCollection RegisterJob(this IServiceCollection services,AppConfiguration appConfiguration )
+        public static IServiceCollection RegisterJob(this IServiceCollection services, AppConfiguration appConfiguration)
         {
             services.AddQuartz(d =>
             {
@@ -269,8 +269,15 @@ namespace Hotline.Api
                 d.InterruptJobsOnShutdownWithWait = true;
                 d.MaxBatchSize = 3;
 
-                //load send order job
-                
+                var apptaskJob = new JobKey(nameof(ApptaskJob));
+                d.AddJob<ApptaskJob>(apptaskJob);
+                d.AddTrigger(t => t
+                    .WithIdentity("apptask-trigger")
+                    .ForJob(apptaskJob)
+                    .StartNow()
+                    .WithCronSchedule("0/3 * * * * ?")
+                );
+
 
                 //即将超期和超期短信
                 //var autoSendOverTimeSmsKey = new JobKey(nameof(SendOverTimeSmsJob), "send overtime order task");
@@ -282,7 +289,7 @@ namespace Hotline.Api
                 //    .WithCronSchedule("0 30 09,14 * * ?"));
 
                 var autoSendOrderKey = new JobKey(nameof(SendOrderJob), "send order task");
-				switch (appConfiguration.AppScope)
+                switch (appConfiguration.AppScope)
                 {
                     //智能化任务
                     case AppDefaults.AppScope.YiBin:
@@ -303,15 +310,15 @@ namespace Hotline.Api
                         //);
                         break;
                     case AppDefaults.AppScope.ZiGong:
-	                    //d.AddJob<SendOrderJob>(autoSendOrderKey);
-	                    //d.AddTrigger(t => t
-		                   // .WithIdentity("task-send-order-trigger")
-		                   // .ForJob(autoSendOrderKey)
-		                   // .StartNow()
-		                   // .WithCronSchedule("0 10 9 * * ?")
-	                    //);
-						break;
-					default:
+                        //d.AddJob<SendOrderJob>(autoSendOrderKey);
+                        //d.AddTrigger(t => t
+                        // .WithIdentity("task-send-order-trigger")
+                        // .ForJob(autoSendOrderKey)
+                        // .StartNow()
+                        // .WithCronSchedule("0 10 9 * * ?")
+                        //);
+                        break;
+                    default:
                         break;
                 }
 

+ 13 - 12
src/Hotline.Api/config/appsettings.Development.json

@@ -62,14 +62,15 @@
       "Ip": "222.213.23.229"
     },
     "XingTang": {
-        //"DbConnectionString": "server=123.56.10.71;Database=callcenter_db;Uid=root;Pwd=Lhw1981!(*!"
-        //"DbConnectionString": "server=110.188.24.182;Database=callcenter_xingtang;Uid=dev;Pwd=fengwo11!!"
-        "DbConnectionString": "PORT=50143;server=110.188.24.182;Database=callcenter_db;Uid=dev;Pwd=fengwo123!@#;"
+      //"DbConnectionString": "server=123.56.10.71;Database=callcenter_db;Uid=root;Pwd=Lhw1981!(*!"
+      //"DbConnectionString": "server=110.188.24.182;Database=callcenter_xingtang;Uid=dev;Pwd=fengwo11!!"
+      "DbConnectionString": "PORT=50143;server=110.188.24.182;Database=callcenter_db;Uid=dev;Pwd=fengwo123!@#;",
+      "Address": "http://123.56.10.71:6090"
     }
   },
-    "ConnectionStrings": {
-        "Hotline": "PORT=5432;DATABASE=hotline;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;"
-    },
+  "ConnectionStrings": {
+    "Hotline": "PORT=5432;DATABASE=hotline;HOST=110.188.24.182;PASSWORD=fengwo11!!;USER ID=dev;"
+  },
   "Cache": {
     "Host": "110.188.24.182",
     "Port": 50179,
@@ -77,7 +78,7 @@
     "Database": 3 //hl:3, dev:5, test:2, demo:4
   },
   "Swagger": true,
-  "AccLog":  false,
+  "AccLog": false,
   "Cors": {
     "Origins": [ "http://localhost:8888", "http://admin.hotline.fw.com", "http://localhost:80", "http://localhost:8113" ]
   },
@@ -118,11 +119,11 @@
     "UseDashBoard": true,
     "FailedRetryCount": 5,
     "RabbitMq": {
-        "UserName": "dev",
-        "Password": "123456",
-        "HostName": "110.188.24.182",
-        "VirtualHost": "fwt-dev"
-        // "VirtualHost": "fwt-unittest"
+      "UserName": "dev",
+      "Password": "123456",
+      "HostName": "110.188.24.182",
+      "VirtualHost": "fwt-dev"
+      // "VirtualHost": "fwt-unittest"
     }
   },
   "FwClient": {

+ 6 - 5
src/Hotline.Application/Jobs/ApptaskJob.cs

@@ -3,6 +3,7 @@ using Quartz;
 using Hotline.Share.Enums.BatchTask;
 using Hotline.Share.Dtos.Order;
 using Microsoft.Extensions.DependencyInjection;
+using Hotline.Application.OrderApp.OrderVisitApp;
 
 namespace Hotline.Application.Jobs
 {
@@ -20,24 +21,24 @@ namespace Hotline.Application.Jobs
 
         public async Task Execute(IJobExecutionContext context)
         {
+            //Console.WriteLine($"执行ApptaskJob: {DateTime.Now}");
             var task = await _apptaskDomainService.GetWaitingTaskAsync(context.CancellationToken);
             if (task is null) return;
-            IApptaskExecutor executor;
             switch (task.TaskType)
             {
                 case ETaskType.Delay:
-                    executor = _serviceProvider.GetService<IApptaskExecutor<BatchDelayNextFlowDto>>();
+                    //var delayExecutor = _serviceProvider.GetService<IApptaskExecutor<BatchDelayNextFlowDto>>();
+                    //await _apptaskDomainService.ExecuteAsync(delayExecutor, task, context.CancellationToken);
                     break;
                 case ETaskType.Screen:
                     break;
                 case ETaskType.VoiceVisit:
-                    executor = _serviceProvider.GetService<IApptaskExecutor<BatchVoiceVisitDto>>();
+                    var vvExecutor = _serviceProvider.GetService<IApptaskExecutor<VoiceVisitRequest>>();
+                    await _apptaskDomainService.ExecuteAsync(vvExecutor, task, context.CancellationToken);
                     break;
                 default:
                     throw new ArgumentOutOfRangeException();
             }
-            await _apptaskDomainService.ExecuteAsync(executor, task, context.CancellationToken);
-
         }
 
         /// <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary>

+ 1 - 1
src/Hotline.Application/Mappers/OrderMapperConfigs.cs

@@ -165,7 +165,7 @@ public class OrderMapperConfigs : IRegister
             .Map(d => d.VoiceEvaluate, s => s.VoiceEvaluate)
             .Map(d => d.SeatEvaluate, s => s.SeatEvaluate);
 
-        config.ForType<OrderDelay, OrderDelayDto>()
+        config.ForType<OrderDelay, Hotline.Share.Dtos.Order.OrderDelay.OrderDelayDto>()
             //.Inherits<Order, OrderDto>()
             .Map(d => d.CurrentStepName, s => s.Workflow.ActualHandleStepName)
             .Map(d => d.ActualHandlerName, s => s.Workflow.ActualHandlerName)

+ 83 - 0
src/Hotline.Application/OrderApp/OrderVisitApp/VoiceVisitTaskExecutor.cs

@@ -0,0 +1,83 @@
+using Hotline.BatchTask;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Options;
+using XF.Domain.Dependency;
+using Hotline.CallCenter.Configs;
+
+namespace Hotline.Application.OrderApp.OrderVisitApp
+{
+    public class VoiceVisitTaskExecutor : IApptaskExecutor<VoiceVisitRequest>, IScopeDependency
+    {
+        private readonly IHttpClientFactory _httpClientFactory;
+        private readonly IOptionsSnapshot<CallCenterConfiguration> _callcenterOptions;
+
+        public VoiceVisitTaskExecutor(
+            IHttpClientFactory httpClientFactory,
+            IOptionsSnapshot<CallCenterConfiguration> callcenterOptions)
+        {
+            _httpClientFactory = httpClientFactory;
+            _callcenterOptions = callcenterOptions;
+        }
+
+        /// <summary>
+        /// 执行任务
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellation"></param>
+        /// <returns>是否成功执行</returns>
+        public async Task<ApptaskExecuteResult> ExecuteAsync(VoiceVisitRequest? request, CancellationToken cancellation)
+        {
+            Console.WriteLine($"执行vv: {DateTime.Now}");
+            if (request == null)
+                return new ApptaskExecuteResult
+                {
+                    IsSuccess = false,
+                    Message = "请求参数为空"
+                };
+
+            var baseAddress = _callcenterOptions.Value.XingTang.Address;
+            if (string.IsNullOrEmpty(baseAddress))
+                return new ApptaskExecuteResult
+                {
+                    IsSuccess = false,
+                    Message = "未配置请求地址"
+                };
+            var client = _httpClientFactory.CreateClient();
+            client.BaseAddress = new Uri(baseAddress);
+            var url = $"{baseAddress}/groupcall?content=&called1={request.PhoneNo}&called2=&called3=&called4=&called5=&caller=&customerid={request.VisitId}";
+            var result = await client.GetAsync(url, cancellation);
+            if (result.IsSuccessStatusCode)
+            {
+                return new ApptaskExecuteResult
+                {
+                    IsSuccess = true,
+                    Message = "成功"
+                };
+            }
+            else
+            {
+                return new ApptaskExecuteResult
+                {
+                    IsSuccess = false,
+                    Message = "请求失败"
+                };
+            }
+
+            return new ApptaskExecuteResult
+            {
+                IsSuccess = true,
+                Message = "成功"
+            };
+        }
+    }
+
+    public class VoiceVisitRequest
+    {
+        public string PhoneNo { get; set; }
+        public string VisitId { get; set; }
+    }
+}

+ 0 - 5
src/Hotline.Share/Dtos/Order/OrderDelay/OrderDelayDto.cs

@@ -5,11 +5,6 @@ using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.Order.OrderDelay;
 
-public class OrderDelayStepIdDto : OrderDelayDto
-{
-    public string StepId { get; set; }
-}
-
 public class OrderDelayDto
 {
     /// <summary>

+ 6 - 0
src/Hotline.Share/Dtos/Order/OrderDelay/OrderDelayStepIdDto.cs

@@ -0,0 +1,6 @@
+namespace Hotline.Share.Dtos.Order.OrderDelay;
+
+public class OrderDelayStepIdDto : OrderDelayDto
+{
+    public string StepId { get; set; }
+}

+ 4 - 4
src/Hotline/BatchTask/ApptaskDomainService.cs

@@ -50,12 +50,12 @@ public class ApptaskDomainService : IApptaskDomainService, IScopeDependency
                 BusinessId = d.BusinessId,
                 TaskType = request.TaskType,
                 TaskStatus = ETaskStatus.Waiting,
-                TaskParams = System.Text.Json.JsonSerializer.Serialize(d.TaskParams),
+                TaskParams = d.TaskParams is null ? null : System.Text.Json.JsonSerializer.Serialize(d.TaskParams),
                 TryLimit = request.TryLimit,
-                Priority = request.Priority ?? 9
+                Priority = request.Priority ?? 9,
             }).ToList()
         };
-        
+
         if (string.IsNullOrEmpty(apptask.Name))
             apptask.CreateName();
 
@@ -147,7 +147,7 @@ public class ApptaskDomainService : IApptaskDomainService, IScopeDependency
         try
         {
             TRequest request = default;
-            if (apptaskItem.TaskParams is not null)
+            if (!string.IsNullOrEmpty(apptaskItem.TaskParams))
             {
                 request = System.Text.Json.JsonSerializer.Deserialize<TRequest>(apptaskItem.TaskParams);
                 if (request is null)

+ 1 - 1
src/Hotline/BatchTask/ApptaskItem.cs

@@ -58,7 +58,7 @@ public class ApptaskItem : CreationEntity
     public string? Message { get; set; }
 
     [SugarColumn(IsEnableUpdateVersionValidation = true)]
-    public string Ver { get; set; }
+    public string Ver { get; set; } = Guid.NewGuid().ToString();
 
     [Navigate(NavigateType.OneToOne, nameof(ApptaskId))]
     public Apptask Apptask { get; set; }

+ 1 - 0
src/Hotline/CallCenter/Configs/XingTangConfiguration.cs

@@ -3,5 +3,6 @@
     public class XingTangConfiguration
     {
         public string DbConnectionString { get; set; }
+        public string Address { get; set; }
     }
 }